Czołem :)
Męczę się z tym oto zadaniem:
Napisz program, który pobierze od użytkownika nazwę pliku, a następnie odczyta liczby całkowite w nim zapisane i wyznaczy odpowiednio sumę oraz średnią tych liczb,
Format pliku jest następujący:
w pierwszej linii podana jest liczba danych, dla których należy obliczyć sumę i wartość średnią,
w następnych liniach dane.
W przypadku braku pliku program powinien wyświetlić komunikat Couldn't open file i zwrócić kod błędu 4. W przypadku błędnych danych w pliku wyświetlić komunikat File corrupted i zwrócić kod błędu 6.
Przykładem błędnych danych może być:
tekst
ujemna liczba liczb
mniejsza liczba liczb (względem nagłówka).
Jeżeli udało się wykonać wszystkie obliczenia to program powinien wyświetlić na ekranie, w osobnych liniach, sumę oraz wartość średnią z wczytanych liczb. Ponadto w takim przypadku program powinien zakończyć pracę z kodem błędu 0.
Przykładowa interakcja z programem - sukces (dla pliku wejściowego text.txt):
Podaj sciezke do pliku:⏎
text.txt⏎
2550⏎
2.014218⏎
Przykładowa interakcja z programem - brak pliku:
Podaj sciezke do pliku:⏎
study.txt⏎
Couldn't open file⏎
Uwaga
W programie nie wolno używać funkcji alokujacych pamięć.
W programie można zadeklarować tylko tablice na 30 znaków (do przechowywania nazw plików). Deklaracja musi wyglądać następująco: nazwa_zmiennej[31];.
W programie nie wolno używać operatora [].
Oto mój kod do niego:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char tab[31]={0};
char input[31]={0};
char *tab_i=&(*(tab+0)), *input_i=&(*(input+0));
int i;
printf("Podaj sciezke do pliku\n");
scanf(" %31[^\n]", input_i);
for(i=0; i<30; i++)
{
*(tab_i+i)=*(input_i+i);
}
FILE *f= fopen(tab_i,"rb");
if(f==NULL)
{
printf("Couldn't open file");
return 4;
}
int suma = 0;
int znak_int;
char znak;
while(fread(&znak,1,1,f) != 0)
{
if(znak>=48 && znak<=57)
{
}
else if( znak==13 || znak=='\t' || znak=='\0' || znak=='-' || znak==' ' || znak=='\n')
{
}
else
{
fclose(f);
printf("File corrupted");
return 6;
}
}
i =0;
int czy_sie_zgadza=0;
int ile_liczb=0;
fseek(f,0,SEEK_SET); // ustawiam na pozycje poczatkowa
while(fscanf(f,"%d",&znak_int)==1)
{
suma += znak_int;
if(i == 0)
{
if(suma<0)
{
fclose(f);
printf("File corrupted");
return 6;
}
suma=0;
ile_liczb=znak_int;
}
else
{
//printf("Jestem tu!");
czy_sie_zgadza++;
}
i++;
}
if(czy_sie_zgadza < ile_liczb )
{
fclose(f);
printf("File corrupted");
return 6;
}
if(suma==0 && ile_liczb==0)
{
fclose(f);
printf("File corrupted");
return 6;
}
printf("Twoja suma: %d\n",suma);
printf("Twoja srednia: %f",(float)suma/(float)ile_liczb);
fclose(f);
return 0;
}
Zauważyłem, że ot choćby dla danych z pewnego przykładowego testu:
http://pp.iis.p.lodz.pl/reports/subsp/20/2309-2309/818/532934-e93f7fecc237e153/0004sugar
podaje złe wyniki.
Widok konsoli programu -- przebieg interakcji z użytkownikiem:
Podaj sciezke do pliku⏎
sugar⏎
Twoja suma: 46787⏎
Twoja srednia: 134.445404
Program zakończony; kod błędu=0 (Ok)
Test został przerwany; Wyświetlone dane w linii 1 są nieprawidłowe, powinno być '-1761' a jest '46787'
Czemu więc wychodzą tak dziwne wyniki? Domyślacie się może o co chodzi?