PDA

View Full Version : [C]Errore relativo


The_ouroboros
13-04-2009, 16:01
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int n,i, diff;
puts("Numbers :");
scanf("%d", &n);
int res[n], res_d[n];
puts("\tGauss Formula");
for(i = 0; i < n; i++)
{
res[i] = (i*(i+1))/2;
printf("( %d ) = %d\n", i , res[i]);
}
puts("\tAsinptotic formula");
for(i = 0; i < n;i++)
{
res_d[i] = i*i/2;
printf("( %d ) = %d\n", i , res_d[i]);
}
puts("\tError");
// for(i = 0; i < n;i++)
// {
// diff = (int)(abs(res_d[i]-res[i])/res[i])*100;
// printf("( %d ) = %d\n", i , diff);
// }
return 0;
}



Il problema è il codice commentato...mi da errore di lettura/scrittura in memoria.

Ciao a tutti e buona pasquetta.

stdecden
13-04-2009, 17:23
Temo che non sia possibile, o almeno non standard dichiarare array dinamici in questo modo:
int res[n], res_d[n];

Prova con:
int *res = (int*)malloc(n * sizeof(int));
int *res_d = (int*)malloc(n * sizeof(int));
...
free(res);
free(res_d);


Comunque non so esattamente cosa causi l'errore

Volutomitra
13-04-2009, 17:34
Temo che non sia possibile, o almeno non standard dichiarare array dinamici in questo modo:
int res[n], res_d[n];

Prova con:
int *res = (int*)malloc(n * sizeof(int));
int *res_d = (int*)malloc(n * sizeof(int));
...
free(res);
free(res_d);


Comunque non so esattamente cosa causi l'errore

Inoltre, quando i = 0, res[0] = res_d[0] = 0 (sono interi) e quindi c'è uno 0/0 nel codice commentato.

The_ouroboros
13-04-2009, 18:33
Ho sistemato i cicli partendo da 1 e il malloc ma..
Ora mi da il primo 100 di errore e poi sempre 0... non riesco a capire ma sembra che l'errore sia qui


diff = (int)(abs(res_d[i]-res[i])/res[i])*100;
printf("( %d ) = %d\n", i , diff);

stdecden
13-04-2009, 19:10
Prova a scrivere:

diff = (int)((abs(res_d[i]-res[i])/(float)res[i])*100);

The_ouroboros
13-04-2009, 22:31
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void write_out(int n, FILE *file);

int main()
{
int n;
puts("Numbers: ");
FILE *file = fopen("out.txt","a+");
scanf("%d", &n);
fprintf(file,"## Difference between Gauss' formula and asimptotic formula for %d numbers ## \n", n);
if(n > 80) { puts("Error: Out of range!"); fclose(file); getchar(); return 0; }
write_out(n, file);
fclose(file);
return 0;
}

void write_out(int n, FILE *file)
{
int i, diff;

int *res = (int *)malloc(n * sizeof(int)),
*res_d = (int *)malloc(n * sizeof(int));

fprintf(file,"\tGauss Formula for %d numbers\n", n);
for(i = 1; i < n; i++)
{
res[i] = (i*(i+1))/2;
fprintf(file,"( %d ) = %d\n", i , res[i]);
}

fprintf(file,"\tAsinptotic formula for %d numbers\n", n);
for(i = 1; i < n;i++)
{
res_d[i] = i*i/2;
fprintf(file,"( %d ) = %d\n", i , res_d[i]);
}

fprintf(file,"\tError for %d numbers\n", n);
for(i = 1; i < n;i++)
{
diff = ((abs(res_d[i]-res[i])/(float)abs(res[i]))*100);
fprintf(file,"( %d ) = %d%% \n", i , diff);
}

free(res);
free(res_d);
}
// :-



Il codice finale, se servisse a qualcuno

wizard1993
14-04-2009, 10:55
Temo che non sia possibile, o almeno non standard dichiarare array dinamici in questo modo:
int res[n], res_d[n];

Prova con:
int *res = (int*)malloc(n * sizeof(int));
int *res_d = (int*)malloc(n * sizeof(int));
...
free(res);
free(res_d);


Comunque non so esattamente cosa causi l'errore

è perfettamente lecito secondo c99