[ 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 | 2
NapísalOffline : 28.11.2012 19:20 | GProf

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 | 0
NapísalOffline : 29.11.2012 0:05 | GProf

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"
 [ Príspevkov: 2 ] 


GProf




© 2005 - 2024 PCforum, edited by JanoF