[Rozdział 33] zadanie domowe
Ostatnio zmodyfikowano 2020-02-11 07:14
Seba_S Temat założony przez niniejszego użytkownika |
[Rozdział 33] zadanie domowe » 2020-02-09 18:33:57 Cześć Wszystkim, mam problem w zadaniu 33 - mianowicie kiedy stworzyłem program w którym funkcja suma przyjmowała 3 int (a,b,c) program działał tzn zakładając ze w pliku "zadania.txt" były zadeklarowane 3 liczby. plik wyglądał tak 1 1 1 2 2 2 3 3 3 program sumował mi kazda wiersz i było ok. Problem powstał kiedy chciałem stworzyć bardziej uniwersalna funkcje, tak aby program zsumował wszystko po koleji. Przegladnalem forum i wiekszosc z nas po prostu deklaruje zmienne a b c itd i programm działa jeśli w pliku zrodlowym liczby pomiędzy sa w układzie 1 1 1. Mam nadzieje ze ktoś to zrozumiem o co mi chodzi ... #include <fstream> #include <iostream> #include <string>
void suma( int a ) { int suma = 0; suma += a; std::cout << suma << std::endl; }
bool wczytajPlik( std::string nazwaPliku ) { std::ifstream plik; plik.open( nazwaPliku.c_str() ); if( !plik.good() ) return false; while( true ) { int a; plik >> a; if( plik ) { suma( a ); } else break; } return true; } int main() { if( !wczytajPlik( "zadania.txt" ) ) { std::cout << "nie udalo sie wczytac pliku" << std::endl; } }
|
|
pekfos |
» 2020-02-09 19:42:41 Jaki jest sens istnienia funkcji suma()? |
|
Seba_S Temat założony przez niniejszego użytkownika |
» 2020-02-10 07:31:40 miała dodać liczby ... |
|
pekfos |
» 2020-02-10 17:33:53 Trochę trudno by funkcja która dodaje do siebie 2 liczby była uzasadniona. Zwłaszcza że jedna z tych liczb to zawsze zero. Po prostu zsumuj liczby w pętli, ze zmienną dla sumy która istnieje przez cały proces sumowania. |
|
mizie |
Rozwiązanie » 2020-02-10 18:22:00 Twój program może wyglądać następująco:
#include <cstdlib> #include <fstream> #include <iostream>
int main() { std::ifstream plik; plik.open( "dane.txt" ); if( !plik.good() ) { std::cout << "Nie udalo sie otworzyc pliku!" << std::endl; exit( EXIT_FAILURE ); } int num { 0 }; long long sum { 0 }; while( plik >> num ) sum += num; std::cout << "Suma liczb calkowitych z pliku wynosi: " << sum << std::endl; system( "PAUSE" ); return 0; }
Kod będzie też działał jeżeli liczby całkowite będą oddzielone od siebie innymi białymi znakami takimi jak tabulacja czy znak nowego wiersza. |
|
pekfos |
» 2020-02-10 18:26:01 Po co używasz exit().. while( plik >> num && !plik.eof() )
|
Ten eof nie ma tu sensu. Jeśli po ostatniej liczbie w pliku nie będzie żadnych dodatkowych znaków, to błędnie ją odrzucisz. |
|
mizie |
» 2020-02-10 19:49:48 Odnoszę się tylko do tego konkretnego problemu i szczerze powiedziawszy nie wiem czy exit() był omawiany w kursie czy nie. Jeżeli Seba_S dojdzie do wniosku, że takie wyjście z programu mu nie odpowiada zawsze może użyć np. instrukcji return. Nie jest to chyba tutaj sednem sprawy.
Co do sprawdzenia eof() to rzeczywiście jest tak jak mówisz. Kod już zmodyfikowałem. Dzięki za cenną uwagę.
|
|
Seba_S Temat założony przez niniejszego użytkownika |
» 2020-02-11 07:14:35 ok , dziękuję bardzo za pomoc - program działa tak jak chciałem #include <iostream> #include <string> #include <fstream>
bool wczytajPlik( std::string nazwaPliku ) { std::ifstream plik; plik.open( nazwaPliku.c_str() ); if( !plik.good() ) return false; int liczby { 0 }; int suma { 0 }; while( plik >> liczby ) suma += liczby; std::cout << "suma liczb: " << suma << std::endl; return true; } int main() { if( !wczytajPlik( "zadania.txt" ) ) { std::cout << "nie udalo sie wczytac pliku" << std::endl; } }
|
|
« 1 » |