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

Pewne ćwiczenie w c++ - problem

Object Storage Arubacloud
0 głosów
273 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez sofnir Gaduła (4,690 p.)

Hej, oto treść zadania:

Napisz program obliczający średnią Twoich ocen ze świadectwa(indeksu). Program ma pobierać tak długo liczby, aż podasz liczbę zero. Program ma posiadać funkcję sprawdzającą czy podany dane są liczbami, czyli ma zapobiegać uszkodzenia strumienia wejściowego. 

#include <conio.h>
#include <iostream>
#include <cctype>

using namespace std;

int main()
{
    double ocena;
    double suma=0;
    double i=0;

    do
    {
        cin>>ocena;
        if(cin.good())
        {
            suma+=ocena;
            i++;
        }
    } while(ocena != 0);
    cout<<"twoja srednia to: "<<endl;
    cout<<suma/(i-1);

    return 0;
}

Mam taki problem, nie wiem jak sobie z tym poradzić, bo jeśli wpiszę jakąś literę to cały program stopuje. Wsumie w tręści zadania jest napisane, że program ma sprawdzać czy podane dane są liczbami, a ja mam funkcję, która sprawdza czy udało się wczytać liczbę. Bardzo proszę o pomoc :)

4 odpowiedzi

+2 głosów
odpowiedź 15 listopada 2015 przez Ehlert Ekspert (212,790 p.)

Zamiast tego warunku zrób zmienną bool. Przy każdej interacji pętli przyjmuje:

  • true kiedy wartość jest różna od zera, lub nie wczytano liczby
  • false kiedy wczytano zero

Dodatkowo if dla !cin.good() i wtedy wyświetlasz ostrzeżenie. W pętli czyść bufor. 

cin.clear();
cin.sync();

 

+1 głos
odpowiedź 15 listopada 2015 przez Radfler VIP (101,030 p.)

To może tak:

1. Zamiast sprawdzać czy ze strumieniem jest wszystko dobrze, sprawdź czy strumieniowi coś się nie stało:

if(std::cin.fail()) {
  break;
}

Przerwie to pętlę i pokaże ostateczny wynik. Jeżeli chcesz, aby strumień działał dalej, to użyj funkcji clear i sync:

if(std::cin.fail()) {
  std::cin.clear();
  std::cin.sync();
}

2. Jak dla mnie najlepiej byłoby zrobić tak:

while(std::cin >> ocena && ocena != 0) {
  // Obliczenia...
}

W warunku pętli wczytujemy ocenę, jednocześnie sprawdzając czy ze strumieniem wszystko dobrze oraz sprawdzamy czy ocena jest różna od 0.

Pozdrawiam! :D

0 głosów
odpowiedź 15 listopada 2015 przez Lewkoniov Nowicjusz (200 p.)
Z tego co kojażę pod "cin>>ocena" powinno być cin.clear() i cin.sync()

Ja tak robię i jest git :D
0 głosów
odpowiedź 15 listopada 2015 przez sofnir Gaduła (4,690 p.)
przywrócone 16 listopada 2015 przez sofnir

WItam ponownie, wasze wskazówki sporo mi pomogły, bo zapomniałem, o czyszczeniu flagi i bufora funkcjami clear() i sync(), ale to nie rozwiązywało problemu, bo gdy wpisywałem jakąś literę to program i tak przestawał działać. Działo się tak ze względu na ten warunek, że kiedy podam 0 to funkcja ma się zatrzymać. Widocznie podanie litery i użycie funkcji clear() oraz sync() zostawiało w strumieniu 0 i program się zatrzymywał ze względu na ten warunek. 

Zamieszczam poprawnie działający kod, może komuś się kiedyś przyda :)

#include <conio.h>
#include <iostream>
#include <cctype>

using namespace std;

    double ocena;
    double suma=0;
    double i=0;

int main()
{
   do
   {
       cin>>ocena;
       if(cin.good())
       {
            if(ocena == 0) break;
            suma+=ocena;
            i++;
       }
       cin.clear();
       cin.sync();
   }while(true);
   cout<<"Srednia wynosi: "<<endl;
   cout<<suma/i;

    return 0;
}

 

komentarz 16 listopada 2015 przez Ehlert Ekspert (212,790 p.)

Na tym forum na serio nie liczą się punkty. Przynajmniej dla mnie, ale po znalezieniu rozwiązania dodawanie (przez siebie) nowej odpowiedzi i wybieranie ją jako najlepszą poraz kolejny zmusza mnie do wklejenia tego 

laugh  

komentarz 16 listopada 2015 przez sofnir Gaduła (4,690 p.)
To jest kłamstwo co piszesz i chciałbym żebyś wiedział, że zrobiło mi się bardzo przykro z tego, że się ze mnie wyśmiewasz.

Podobne pytania

+1 głos
0 odpowiedzi 525 wizyt
0 głosów
1 odpowiedź 114 wizyt
pytanie zadane 4 kwietnia 2016 w C i C++ przez sapala94 Początkujący (320 p.)
0 głosów
2 odpowiedzi 278 wizyt

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...