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.