Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 2 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.12
Prihlásený: 28.11.12
Príspevky: 7
Témy: 2
Príspevok NapísalOffline : 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;
}


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 28.11.12
Prihlásený: 28.01.13
Príspevky: 1
Témy: 0
Príspevok NapísalOffline : 29.11.2012 0:05

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"
Odpovedať na tému [ 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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra