• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wczytaj, dodaj, uśrednij i wyświetl

42 Warsaw Coding Academy
0 głosów
239 wizyt
pytanie zadane 31 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

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?

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 466 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 848 wizyt
0 głosów
1 odpowiedź 705 wizyt
pytanie zadane 4 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...