Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Rozdział 33] zadanie domowe

Ostatnio zmodyfikowano 2020-02-11 07:14
Autor Wiadomość
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 ...


C/C++
#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;
    }
}
P-176213
pekfos
» 2020-02-09 19:42:41
Jaki jest sens istnienia funkcji suma()?
P-176215
Seba_S
Temat założony przez niniejszego użytkownika
» 2020-02-10 07:31:40
miała dodać liczby ...
P-176219
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.
P-176223
mizie
Rozwiązanie
» 2020-02-10 18:22:00
Twój program może wyglądać następująco:

C/C++
// Otwórz plik tekstowy, w którym będą znajdowały się tylko liczby całkowite, oddzielone od siebie spacjami.
// Następnie napisz program, który wczyta wszystkie liczby z pliku i wypisze sumę wszystkich liczb na standardowym wyjściu.
#include <cstdlib> // exit, EXIT_FAILURE
#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.
P-176224
pekfos
» 2020-02-10 18:26:01
C/C++
exit( EXIT_FAILURE );
Po co używasz exit()..
  • w temacie związanym z kursem, gdzie ta funkcja nie była omówiona - to nie może być oczekiwane rozwiązanie zadania
  • w programie składającym się wyłącznie z funkcji main()

C/C++
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.
P-176225
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ę.
P-176226
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

C/C++
#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;
    }
}
P-176227
« 1 »
  Strona 1 z 1