Mame za ukol udelat program v c,zadani je takove
Zadání
Napište funkci v jazyce C zjišťující počet výskytů slov. Funkce bude volána opakovaně, pro každé slovo jednou.
Odevzdávejte soubor obsahující výhradně definici jediné funkce pojmenované a deklarované dle zadání. Soubor nesmí obsahovat direktivu #include. Veškeré potřebné datové typy apod. deklarujte lokálně.
Deklarace funkce
void *Pocitej_Slova(char *, void *);
Je-li hodnota prvního argumentu NULL, označuje konec zpracovávání. V opačném případě je zde uloženo další slovo ke zpracování.
Hodnota druhého argumentu je při prvním volání funkce NULL, při kazdém následujícím volání je vždy rovna návratové hodnotě funkce z předchozího volání (nápověda: tento argument je určen pro předávání interního stavu funkce mezi jednotlivými voláními).
Návratová hodnota při posledním volání funkce je ukazatel na dvourozměrné pole takové, že v prvním řádku jsou jednotlivá slova podle abecedy a ve druhém řádku jejich četnosti. Poslední hodnotou v prvním řádku musí být NULL a ve druhém 0.
Příklad
void *p;
p=Pocitej_Slova("nazdar",NULL);
p=Pocitej_Slova("ahoj",p);
p=Pocitej_Slova("cau",p);
p=Pocitej_Slova("nazdar",p);
p=Pocitej_Slova(NULL,p);
printf("\"%s\" %d\n",((char **)(((void **)p)[0]))[2],((int *)(((void **)p)[1]))[2]);
/*
Vypise:
"nazdar" 2
*/
Naprogramoval sem to takhle:
[code]
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
void *Pocitej_Slova(char *slovo, void *data)
{ char ** p, **dt;
int i,len;
if(!slovo)return data;
if(!data)
{ data=malloc(2*sizeof(char*));
memset(data,0, 2*sizeof(char*));
}
p=(char **)data;
for(len=0; p[len];len++);
for(i=0;i<len;i+=2)
{ if(0==strcmp(p[i], slovo))
{ (*((int*)p[i+1]))++;
return data;
}
if(strcmp(slovo, p[i]) < 0)break;
}
dt=(char**)malloc((len+4)*sizeof(char*));
memset(dt,0,(len+4)*sizeof(char*));
if(i > 0) memcpy(dt,p,i*sizeof(char*));
if( i < len+2)memcpy(dt+i+2,p+i,(len+2-i)*sizeof(char*));
dt[i]=strdup(slovo);
dt[i+1]=(char*)malloc(sizeof(int));
*((int*)dt[i+1])=1;
free(data);
return dt;
}
int main(int argc, char* argv[])
{
void *p;
int i;
p=Pocitej_Slova("nazdar",NULL);
p=Pocitej_Slova("ahoj",p);
p=Pocitej_Slova("cau",p);
p=Pocitej_Slova("nazdar",p);
p=Pocitej_Slova("ahoj",p);
p=Pocitej_Slova(NULL,p);
for(i=0;((char **)p)[i];i+=2)
{
printf("\"%s\" %d\n",((char **)p)[i],*(((int **)p)[i+1]));
}
system ("PAUSE");
return 0;
}
[/code]
V dev c,se mi to normalne vyhodnoti spravne.Ale kdyz to posilam na ucitelovy stranky pres automat,kde se posila jen samostatna funkce bez int main a includ(v tom automatu se to samo na to doplni)tak se mi to nepreloyi,napise se mi protokol s timhle>
cc1: warnings being treated as errors
test.c: In function 'Pocitej_Slova':
test.c:33: warning: implicit declaration of function 'strdup'
test.c:33: warning: assignment makes pointer from integer without a cast
--- gcc-4.0 --- ! Chyba
cc1: warnings being treated as errors
test.c: In function `Pocitej_Slova':
test.c:33: warning: implicit declaration of function `strdup'
test.c:33: warning: assignment makes pointer from integer without a cast
--- gcc-2.95 --- ! Chyba
nevite prosim vas nekdo co s tim |