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

zadanie pętla do...while

VPS Starter Arubacloud
+2 głosów
777 wizyt
pytanie zadane 26 września 2019 w C i C++ przez madzia16261 Nowicjusz (160 p.)

Witacje ;) 

mam za zadanie napisać następujący program:

Napisz program obliczający sumę dowolnej liczby wprowadzonych liczb, bez pytania o liczbę tych liczb.

Kolejny dzień mi to nie idzie. Pomożecie? 

Poniżej mój program

#include <iostream>


using namespace std;

int main()
{
   int a;
   int suma = 0;
   char znak='T';
   bool stan_a;

   cout << "Podaj liczby aby je zsumowac" << endl;
   cout << "Kiedy bedziesz chcial zakonczyc wprowadzanie liczb wcisnij 'T'" << endl;

   do
   {
    cin >> a;
    cin.clear();
    stan_a=cin.fail();
    if (stan_a=1)
       {
           cout << "Podales bledna wartosc " << endl;
       }
       else
        suma=+a;
   }

   while (cin >> znak);
   cout << "Suma wynosi: " << suma << endl;
    return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 26 września 2019 przez gagyn Stary wyjadacz (11,050 p.)

Jeśli chcesz zrobić tak, że po wpisaniu znaku T, program wypisuje sumę i kończy działanie, to wczytuj z klawiatury do stringa. Następnie sprawdź czy ta zmienna ma wartość "T", jeśli tak to przerwij pętle, jeśli nie to zamień ten string na int i dodaj do sumy.

string wprowadzona_liczba;
while ( true )
{
  cin >> wprowadzona_liczba;
  if (wprowadzona_liczba == "T")
    break;

  int liczba = atoi( wprowadzona_liczba.c_str() );

  ...
}

 

komentarz 26 września 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Do konwersji można również użyć funkcji std::stoi() wprowadzonej w standardzie C++11.

komentarz 26 września 2019 przez madzia16261 Nowicjusz (160 p.)

Nie wiem czy dokładnie o to Ci chodziło, jednak przy warunku while pojawia się błąd... ": no match for 'operator==' (operand types are 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' and 'char')|
 

#include <iostream>


using namespace std;

int main()
{
   string a;
   int suma = 0;
   bool stan_a;

   cout << "Podaj liczby aby je zsumowac" << endl;
   cout << "Kiedy bedziesz chcial zakonczyc wprowadzanie liczb wcisnij 'T'" << endl;

   do
   {
    cin >> a;
   }

   while (a=='T');
   break;
   suma=+a;
   cout << "Suma wynosi: " << suma << endl;
    return 0;
}

 

komentarz 26 września 2019 przez gagyn Stary wyjadacz (11,050 p.)
Wiem, można, ale już nie chciałem wchodzić w kwestie standardów c++, ponieważ ma to małe znaczenie, więc dla uproszczenia podałem rozwiązanie, które działa we wszystkich wersjach.
1
komentarz 26 września 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Dzieje się tak dlatego, że zmienna a jest typu std::string (czyli napis), a ty porównujesz ją z pojedynczym znakiem (czyli typ char).

W języku C++ tekst zapisuje się wewnątrz cudzysłowów, natomiast pojedyncze znaki wewnątrz apostrofów.

Aby naprawić problem, po prostu zamień apostrofy na cudzysłowy przy porównaniu. smiley

komentarz 26 września 2019 przez gagyn Stary wyjadacz (11,050 p.)

Tylko, że cały czas ten program nie ma sensu:

 do
   {
    cin >> a;
   }
   while (a=='T');

czyli wczytujesz do zmiennej a z klawiatury dopóki a jest równe T, czyli jeżeli użytkownik nie wprowadzi T to przerwie pętle, a jeśli wprowadzi to będzie dalej wczytywać. Ty chcesz osiągnąć efekt odwrotny.

+1 głos
odpowiedź 26 września 2019 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Zawsze można zrobić tak. laugh

#include <iostream>

int main() {
        unsigned sum = 0;
        unsigned inputNumber;

        while (std::cin >> inputNumber) {
                sum += inputNumber;
        }

        std::cout << sum << '\n';
}

Działa to w ten sposób, że podajesz na wejściu liczby (rozdzielasz białymi znakami, czyli np. znakami nowej linii). Gdy uznasz, że wprowadziłaś wszystkie potrzebne liczby, stosujesz skrót klawiszowy, który rejestruje EOF. Na Linuksie i innych systemach bazujących na Uniksie będzie to Ctrl+D, na Windowsie -  Ctrl+Z. Dla przykładu podam output z mojej konsoli (Linux).

eryk@mint-t430s:/tmp$ ./program
1
2
3
4
5
15

Pierwsze 5 linijek, które podaję po wywołaniu programu to wejście, ostatnia to wyjście (czyli suma).

Dzięki zastosowaniu takiego podejścia, mogę zapisać dane wejściowe do pliku i wygodnie przekierować zawartość tego pliku na strumień wejściowy programu. Dla przykładu, to jest zawartość pliku dane.txt:

1
2
3
4
5
6
7
8
9
10

Teraz uruchomię mój program (istotne jest, żeby zrobić to z konsoli. Na Windowsie jest to program cmd). Dzięki przekierowaniu strumienia wejściowego, nie muszę tym razem podawać danych, staje się to zautomatyzowane.

eryk@mint-t430s:/tmp$ ./program < dane.txt
55

Zdaję sobie jednak sprawę, że tworząc prosty program dla użytkownika, wygodniej będzie kazać mu wprowadzić jakąś literkę lub tekst, który spowoduje zakończenie wpisywania liczb. Wtedy możesz posłużyć się innym rozwiązaniem. Ale jeśli potrzebujesz wczytywać w ten sposób liczby na potrzeby rozwiązania jakiegoś algorytmicznego zadania, które będzie testowane automatycznie przez sędziego (np. w serwisie SPOJ), to ten sposób będzie odpowiedni.

Pozdrawiam. smiley

komentarz 26 września 2019 przez madzia16261 Nowicjusz (160 p.)
Ok, dziękuję. Działa jak najbardziej, jednak zadanie było na pętle do...while, a przy takim rozwiązaniu nie mam warunku kończącego i właśnie z nim mam problem.
0 głosów
odpowiedź 26 września 2019 przez mokrowski Mędrzec (155,460 p.)
edycja 26 września 2019 przez mokrowski
#include <iostream>

int main() {
    std::cout << "Zakończ wprowadzając wartość nie będącą liczbą\n";
    int sum = 0;
    int value;
    do {
        std::cin >> value;
        std::cin && (sum += value);
    } while(std::cin);
    std::cout << "Suma = " << sum << '\n';
}

 

Podobne pytania

0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Ola_00 Nowicjusz (210 p.)
0 głosów
1 odpowiedź 445 wizyt
0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 9 sierpnia 2019 w C i C++ przez Pawel1452 Początkujący (380 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...