| | |
| Stránka: 1 z 1
| [ Príspevkov: 2 ] | |
Autor | Správa |
---|
Registrovaný: 25.11.12 Prihlásený: 28.11.12 Príspevky: 7 Témy: 2 | Napísal Najiva: 28.11.2012 19:20 | |
|
Program v C sa mi pri testoch náhodných hodnot zacyklí (prekroci sa doba behu programu t.j. 6s). Pomocou GProf mi nevypise nic, kedze v programe nemam ziadnu funkciu iba cykly a zda sa, ze Gprof analyzuje dobu vykonavania funkcii v maine. Ako mam prist na to, kde je chyba? Citácia: int main() { int *a, *b, *c, n1, n2, i, j; printf("Zadejte stupen polynomu A:\n"); if(scanf("%d", &n1)!=1) { printf("Nespravny vstup.\n") ; return 1; } if(n1<0) { printf("Nespravny vstup.\n") ; return 2; } else { if((a = (int*)malloc((n1+1)*sizeof(int)))== NULL) { printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} printf("Zadejte koeficienty polynomu A:\n"); for (i=0; i<=n1; i++) { a[i]=0; if(scanf("%d", &a[i])!=1){ printf("Nespravny vstup.\n") ; return 5; } } } printf("Zadejte stupen polynomu B:\n"); if(scanf("%d", &n2)!=1) { printf("Nespravny vstup.\n") ; return 3; } if(n2<0) { printf("Nespravny vstup.\n") ; return 4; } else { if ((b = (int*)malloc((n2+1)*sizeof(int))) == NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} printf("Zadejte koeficienty polynomu B:\n"); for (i=0; i<=n2; i++) { b[i]=0; if(scanf("%d", &b[i])!=1) { printf("Nespravny vstup.\n") ; return 6; } } } if((c = (int*)malloc((n1+n2+1)*sizeof(int)))== NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} for (j=0; j<(n1+n2+1); j++) {c[j]=0;} for (j=0; j<(n1+n2+1); j++) { for (i=0; i<=j; i++) { if ((j-i)>n2) continue; if (i>n1) break; c[j]=a[i]*b[j-i]+c[j]; } if (c[j]!=0) { if (j==0) { if (c[j]<-1 && (n1+n2-j)!=1 && (n1+n2-j)!=0) printf("%+dx<sup>%d</sup>", c[j], (n1+n2-j)); if (c[j]<-1 && (n1+n2-j)==1) printf("%+dx", c[j]); if (c[j]==-1 && (n1+n2-j)==1) printf("-x"); if (c[j]==1 && (n1+n2-j)==1) printf("x"); if (c[j]>1 && (n1+n2-j)==1) printf("%dx", c[j]); if (c[j]>1 && (n1+n2-j)!=1 && (n1+n2-j)!=0) printf("%dx<sup>%d</sup>", c[j], (n1+n2-j)); if (c[j]>1 && (n1+n2-j)==0) printf("%d", c[j]); if (c[j]<-1 && (n1+n2-j)==0) printf("%d", c[j]); if (c[j]==1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("x<sup>%d</sup>", (n1+n2-j)); if (c[j]==-1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("-x<sup>%d</sup>", (n1+n2-j)); } else { if ((c[j]<-1 || c[j]>1) && (n1+n2-j)!=1 && (n1+n2-j)!=0) printf("%+dx<sup>%d</sup>", c[j], (n1+n2-j)); if ((c[j]<-1 || c[j]>1) && (n1+n2-j)==1) printf("%+dx", c[j]); if (c[j]==-1 && (n1+n2-j)==1) printf("-x"); if (c[j]==1 && (n1+n2-j)==1) printf("x"); if (c[j]==-1 && (n1+n2-j)==0) printf("%+d", c[j]); if (c[j]==1 && (n1+n2-j)==0) printf("%+d", c[j]); if ((c[j]<-1 || c[j]>1) && (n1+n2-j)==0) printf("%+d", c[j]); if (c[j]==1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("+x<sup>%d</sup>", (n1+n2-j)); if (c[j]==-1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("-x<sup>%d</sup>", (n1+n2-j)); } } } free(a); free(b); free(c); printf("\n"); return 0; }
|
|
Registrovaný: 28.11.12 Prihlásený: 28.01.13 Príspevky: 1 Témy: 0 |
Ten výpočet jsem netestoval, ale vypadá funkčně. Začal bych zkrácením toho výpisu, máš tam strašně moc podmínek. Zkus to třeba nějak takhle: Kód: if( c[j]!=0 && j<(n1+n2) ) { if( c[j]==-1 ) printf("-"); else if( c[j]>0 && pozice!=0 ) printf("+"); if( c[j]!=1 && c[j]!=-1 )printf("%d", c[j]); printf("x"); if( (n1+n2-j)>1 ) printf("<sup>%d</sup>", (n1+n2-j)); } else if( c[j]!=0 ) { if( c[j]<0 ) printf("%d", c[j]); else if( c[j]>0 ) printf("+%d", c[j]); } pozice++;
Je k tomu potřeba deklarovat proměnnou "pozice", podle které se zjišťuje, jestli je prvek ve výpisu na prvním místě: Kód: int pozice = 0;
Jestli to nepomůže, bude potřeba nějak upravit výpočet.
_________________ CPU: Core2Duo E8400 3.0GHz @ 4.0GHz + GELID Tranquillo MB: Asus P5QC RAM: Kingston 4GB 1333MHz DDR3 GK: Sapphire HD5830 Xtreme 1GB HDD: WD Caviar Blue 250GB ZDROJ: Seasonic SS-500ET-F3 500W OS: Windows 7 Home Premium MONITOR: Acer AL1716 17" |
|
| Stránka: 1 z 1
| [ Príspevkov: 2 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|