Czy ten kod jest formalnie poprawny?

0

Polecenie - W pliku dane.txt znajduje się ciąg liczb zgodny ze specyfikacją wejścia. Napisz program, który wyznaczy sumę cyfr każdej z liczb i zapisze do pliku wynik.txt.

Mój kod:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    int l = 0, w = 0, ile, f;
    ifstream odczyt("dane.txt");
    ofstream zapis("wynik.txt");
    odczyt >> ile;
    f = ile;
    int dane[f];
    for (int i = 1; i <= f; i++) {
        odczyt >> dane[i];
        l = dane[i];
        while (l > 0) {
            w += l % 10;
            l /= 10;
        }
        zapis << "Suma cyfr liczby  " << dane[i] << " wynosi " << w << endl;
        w = 0;
        l = 0;
    }
    odczyt.close();
    zapis.close();
    return 0;
}
4

Nie jest, C++ nie ma VLA. Co więcej, zadanie w ogóle nie mówi o trzymaniu wszystkich liczb w pamięci jednocześnie (bo i po co).

Swoją drogą, nie trzeba wołać .close(), od tego jest RAII.

3

Formalnie może i poprawny (nie kompilowałem) nie jest. VLA to znaczy, że taka deklaracja tablicy jest formalnie błędna, choć akceptowana przez niektóre kompilatory, ale za to na pewno błędny *)
Żle używasz tablicy od 1 do równego f. Ma być od 0 oraz < f

*) plusy dodatnie i plusy ujemne ;)

1
    f = ile;
    int dane[f];
    for (int i = 1; i <= f; i++)

W tym miejscu inicjujesz tablicę jakimś f czyli jej indeksy będą z przedziału 0,f-1. A u ciebie pętla leci od 1,f czyli

l = dane[i];

Tutaj przy ostatniej iteracji wyjdą bzdury.

1

Przede wszystkim (ponownie piszę): tablica jest kompletnie zbędna. Pozbądź się jej.

1

Wystarczy tylko tyle:

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    ifstream fin("dane.txt");
    ofstream fout("wynik.txt");
    size_t count;
    fin>>count;
    while(count--)
    {
        string str;
        fin>>ws>>str;
        unsigned sum=0;
        for(int i=0;i<str.size();++i) sum+=str[i]-'0';
        fout<<"Suma cyfr liczby  "<<str<<" wynosi "<<sum<<endl;
    }
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1