Programować każdy może (2)
Nie wiem czy jeszcze dziś potrafię, bo nie mam stosownego narzędzia - ale mam dowód, że kiedyś potrafiłem.#include "stdio.h" #include "alloc.h" #define MAXWORD 20 #define LETTER 'a' #define DIGIT '0' struct tnode { char *word; int count; struct tnode *left; struct tnode *right; }; main() { struct tnode *root, *tree(); char word[MAXWORD]; int t; root = NULL; while ((t = getword(word, MAXWORD)) != EOF ) if (t == LETTER) root = tree(root, word); treeprint(root); } struct tnode *tree(p, w) struct tnode *p; char *w; { struct tnode *talloc(); char *strsave(); int count; if (p == NULL) { p = talloc(); p->word = strsave(w); p->count = 1; p->left = p->right = NULL; } else if ((count = strcmp(w, p->word)) == 0 ) p->count++; else if (count<0) p->left = tree(p->left, w); else p->right = tree(p->right, w); return (p); } treeprint(p) struct tnode *p; { if (p != NULL) { treeprint(p->left); printf("%4d %s\n", p->count, p->word); treeprint(p->right); } } getword(w, lim) char *w; int lim; { int c, t; if (type(c = *w++ = gc()) != LETTER) { *w = '\0'; return (c); } while (--lim > 0) { t = type( c = *w++ = gc()); if ( t != LETTER && t != DIGIT) { ungc(c); break; } } *(w-1) = '\0'; return (LETTER); } int znak = EOF; gc() { int c; if (znak != EOF) { c = znak; znak = EOF; return(c); } else return(getchar()); } ungc(c) int c; { znak = c; } struct tnode *talloc() { return((struct tnode *) malloc(sizeof(struct tnode))); } char *strsave(w) char *w; { char *p; p = malloc(MAXWORD); strcpy (p, w); return(p); } type(c) int(c); { if (c>='a' && c<='z' || c>='A' && c<='Z') return(LETTER); else if (c>='0' && c<='9') return(DIGIT); else return(c); }
Kategorie: zawodowe, _blog
Słowa kluczowe: programowanie, język c
Komentarze: (2)
adam@kormoran, December 23, 2010 18:27 Skomentuj komentarz
Wooow, ale stare C. Kiedys wyszperalem kod z takim zapisem (w nawiasach same nazwy argumentow f-ji, bez typow) i pokazywalem znajomym programistom -- byli zdziwieni, ze tak mozna :)
Kompiluje sie poprawnie, zmienilem tylko alloc.h na malloc.h:
adam@lh /tmp $ gcc --version
gcc (4.3.4 p1.0, pie-10.1.5) 4.3.4
adam@lh /tmp $ gcc -o a.exe a.c
a.c: In function 'strsave':
a.c:103: warning: incompatible implicit declaration of built-in function 'strcpy'
adam@lh /tmp $ ./a.exe < a.exe
1 B
1 ELF
1 GLIBC
1 GNU
2 H
2 P
1 Q
1 R
2 d
1 e
1 getchar
1 gmon
1 i
1 ld
1 lib64
2 libc
1 linux
1 main
1 malloc
3 p
1 printf
2 so
2 start
1 strcmp
1 strcpy
3 td
1 u
1 x86
anonim, December 24, 2010 14:03 Skomentuj komentarz
Coś sobie przypominam. To służy do liczenia słów? Ale liczenie robione jest jakimś cwanym grafem, który coś tam dzieli połówkowo.
Chyba w jakieś badania leksykalne się bawiłem. Może zamiast przepuszczać przez niego exe'a spróbuj przepchać przez niego jakiś artykuł albo od razu jakąś księgę Nowego Testamentu (bo chyba po to to pisałem).
A za skompilowanie tego serdecznie dziękuję.
W.