od zehyo » 22. 9. 2006 20:22
Zdar.
Ja byl taky na tom zapoctu...byl jsem ten druhy, ktery to odevzdal, a dostal to. Muzu rict, ze se mi ta uloha nejdrive zdala jednoducha, ale kdyz rekl, ze ten strom jak presne musi byt pospojovany, tak jsem se trochu lekl.
Nicmene se musi rict, ze byl ochotny pomoci kazdemu, komu neco neslo (nevedel jak nato, neco se mu zacyklilo, nejaky pointer se ztratil, atd.)
A jak kolega rikal, o case to nebylo...myslim, ze 10 hodim by mohlo stacit.
Ta uspesnost byla asi proto takova, ze slo o treti kolo, a sli tam ty mene nadany...
Asi po hodine se napriklad zaclo resit, ze nekdko neumel kopirovat string (tj. nepouzil strcpy/strdup, ale hodil string1=string2, a divil se, ze se mu to prepisovalo najednou..)
Taky byly problemy u nekoho s rekurzi, ze jak ji napsat.
Jo, a jinak toto nebyl posledni termin. Bude jeste jeden tusim 26. 09.
Tady je moje reseni...jak jsem upraoval ten vypis, tak se to tak trochu sprasilo....
Kód: Vybrat vše
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct uzel
{
struct uzel *left;
struct uzel *right;
char *slovo;
};
char konecek[128];
int delka_konecku = 0;
void vypis(struct uzel *koren, int konec,int dalsi)
{
char *konecek2;
int a,b,c,d;
int nestaci = 1;
if (koren->slovo==NULL)
{
a=pocti(koren)-1;
konecek[a]='|';
vypis(koren->left,2,dalsi);
konecek[dalsi]=' ';
konecek[a]='/';
vypis(koren->right,1,a);
konecek[a]=' ';
}
else
{
printf("%s ",koren->slovo);
konecek2=strdup(konecek);
d=0;
while (nestaci)
{
nestaci=0;
while (konecek2[d]!='/' && konecek2[d]!='|')
{
if (konecek2[d]==' ')
konecek2[d]='-';
d++;
}
if (konecek2[d]=='|')
{
konecek2[d]='+';
nestaci=1;
}
}
konecek2[delka_konecku]='\0';
printf("%s
",konecek2+strlen(koren->slovo)+1);
free(konecek2);
}
};
int pocti(struct uzel *aktuzel)
{
int vysledek = 0;
int vysledek2 = 0;
if (aktuzel->slovo==NULL)
{
vysledek=pocti(aktuzel->left)+1;
vysledek2=pocti(aktuzel->right)+1;
if (vysledek2>vysledek)
vysledek=vysledek2;
}
else
vysledek=strlen(aktuzel->slovo)+1;
return(vysledek);
}
main(int argc, char **argv)
{
FILE *strom;
FILE *slova;
char soubor_slov[128];
int pocet_slov = 0;
int pocet_uzlu = 0;
int i,a,b;
struct uzel *koren = NULL;
struct uzel *aktual = NULL;
struct uzel **uzly = NULL;
char buffer[256];
if (argc==1)
{
printf("malo arg.
");
return(1);
}
if (!(strom = fopen (argv[1],"rb")))
{
printf("<<%s>> Soubor neex.
",argv[1]);
return(1);
}
fscanf(strom,"%s",&soubor_slov);
if (!(slova=fopen(soubor_slov,"rb")))
{
printf("<<%s>> Soubor neex.
",soubor_slov);
return(1);
}
fscanf(strom,"%d %d
",&pocet_slov,&pocet_uzlu);
uzly=(struct uzel **)malloc(sizeof(struct uzel *)*(pocet_slov+pocet_uzlu));
for(i=0;i<pocet_slov;i++)
{
aktual=uzly[i];
aktual=(struct uzel *)malloc(sizeof(struct uzel));
(aktual->slovo)=(char *)malloc(sizeof(char)*256);
fscanf(slova,"%s",&buffer[0]);
strcpy((aktual->slovo),&buffer[0]);
aktual->left=NULL;
aktual->right=NULL;
uzly[i]=aktual;
}
fclose(slova);
for(i=0;i<pocet_uzlu;i++)
{
fscanf(strom,"%d %d
",&a,&b);
uzly[pocet_slov+i]=(struct uzel *)malloc(sizeof(struct uzel));
uzly[pocet_slov+i]->left=uzly[a-1];
uzly[pocet_slov+i]->right=uzly[b-1];
uzly[pocet_slov+i]->slovo=NULL;
}
koren=uzly[pocet_slov+i-1];
//-----vypis-----//
for (i=0;i<127;i++)
konecek[i]=' ';
konecek[127]='\0';
delka_konecku=pocti(koren);
konecek[delka_konecku]='/';
konecek[delka_konecku+1]='\0';
vypis(koren,2,pocti(koren));
printf("
");
}
Zdar.
Ja byl taky na tom zapoctu...byl jsem ten druhy, ktery to odevzdal, a dostal to. Muzu rict, ze se mi ta uloha nejdrive zdala jednoducha, ale kdyz rekl, ze ten strom jak presne musi byt pospojovany, tak jsem se trochu lekl.
Nicmene se musi rict, ze byl ochotny pomoci kazdemu, komu neco neslo (nevedel jak nato, neco se mu zacyklilo, nejaky pointer se ztratil, atd.)
A jak kolega rikal, o case to nebylo...myslim, ze 10 hodim by mohlo stacit.
Ta uspesnost byla asi proto takova, ze slo o treti kolo, a sli tam ty mene nadany...
Asi po hodine se napriklad zaclo resit, ze nekdko neumel kopirovat string (tj. nepouzil strcpy/strdup, ale hodil string1=string2, a divil se, ze se mu to prepisovalo najednou..)
Taky byly problemy u nekoho s rekurzi, ze jak ji napsat.
Jo, a jinak toto nebyl posledni termin. Bude jeste jeden tusim 26. 09.
Tady je moje reseni...jak jsem upraoval ten vypis, tak se to tak trochu sprasilo....
[code]#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct uzel
{
struct uzel *left;
struct uzel *right;
char *slovo;
};
char konecek[128];
int delka_konecku = 0;
void vypis(struct uzel *koren, int konec,int dalsi)
{
char *konecek2;
int a,b,c,d;
int nestaci = 1;
if (koren->slovo==NULL)
{
a=pocti(koren)-1;
konecek[a]='|';
vypis(koren->left,2,dalsi);
konecek[dalsi]=' ';
konecek[a]='/';
vypis(koren->right,1,a);
konecek[a]=' ';
}
else
{
printf("%s ",koren->slovo);
konecek2=strdup(konecek);
d=0;
while (nestaci)
{
nestaci=0;
while (konecek2[d]!='/' && konecek2[d]!='|')
{
if (konecek2[d]==' ')
konecek2[d]='-';
d++;
}
if (konecek2[d]=='|')
{
konecek2[d]='+';
nestaci=1;
}
}
konecek2[delka_konecku]='\0';
printf("%s
",konecek2+strlen(koren->slovo)+1);
free(konecek2);
}
};
int pocti(struct uzel *aktuzel)
{
int vysledek = 0;
int vysledek2 = 0;
if (aktuzel->slovo==NULL)
{
vysledek=pocti(aktuzel->left)+1;
vysledek2=pocti(aktuzel->right)+1;
if (vysledek2>vysledek)
vysledek=vysledek2;
}
else
vysledek=strlen(aktuzel->slovo)+1;
return(vysledek);
}
main(int argc, char **argv)
{
FILE *strom;
FILE *slova;
char soubor_slov[128];
int pocet_slov = 0;
int pocet_uzlu = 0;
int i,a,b;
struct uzel *koren = NULL;
struct uzel *aktual = NULL;
struct uzel **uzly = NULL;
char buffer[256];
if (argc==1)
{
printf("malo arg.
");
return(1);
}
if (!(strom = fopen (argv[1],"rb")))
{
printf("<<%s>> Soubor neex.
",argv[1]);
return(1);
}
fscanf(strom,"%s",&soubor_slov);
if (!(slova=fopen(soubor_slov,"rb")))
{
printf("<<%s>> Soubor neex.
",soubor_slov);
return(1);
}
fscanf(strom,"%d %d
",&pocet_slov,&pocet_uzlu);
uzly=(struct uzel **)malloc(sizeof(struct uzel *)*(pocet_slov+pocet_uzlu));
for(i=0;i<pocet_slov;i++)
{
aktual=uzly[i];
aktual=(struct uzel *)malloc(sizeof(struct uzel));
(aktual->slovo)=(char *)malloc(sizeof(char)*256);
fscanf(slova,"%s",&buffer[0]);
strcpy((aktual->slovo),&buffer[0]);
aktual->left=NULL;
aktual->right=NULL;
uzly[i]=aktual;
}
fclose(slova);
for(i=0;i<pocet_uzlu;i++)
{
fscanf(strom,"%d %d
",&a,&b);
uzly[pocet_slov+i]=(struct uzel *)malloc(sizeof(struct uzel));
uzly[pocet_slov+i]->left=uzly[a-1];
uzly[pocet_slov+i]->right=uzly[b-1];
uzly[pocet_slov+i]->slovo=NULL;
}
koren=uzly[pocet_slov+i-1];
//-----vypis-----//
for (i=0;i<127;i++)
konecek[i]=' ';
konecek[127]='\0';
delka_konecku=pocti(koren);
konecek[delka_konecku]='/';
konecek[delka_konecku+1]='\0';
vypis(koren,2,pocti(koren));
printf("
");
}[/code]