18 grudnia 2010 (sobota), 18:17:17

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.
Skomentuj notkę

Disclaimers :-) bo w stopce coś wyglądającego mądrze można napisać. Wszystkie powyższe notatki są moim © wymysłem i jako takie związane są ze mną. Ale są też materiały obce, które tu przechowuję lub cytuje ze względu na ich dobrą jakość, na inspiracje, bądź ilustracje prezentowanego lub omawianego tematu. Jeżeli coś narusza czyjeś prawa - proszę o sygnał abym mógł czym prędzej naprawić błąd i naruszeń zaniechać.