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

Co jest złego w tym kodzie?

Object Storage Arubacloud
+6 głosów
3,493 wizyt
pytanie zadane 12 kwietnia 2015 w C i C++ przez MaGie Użytkownik (800 p.)

Cześć! :)

Napisałam program z zadania: 

  • Napisz program, który wczyta liczbę, a następnie wypisze ją na ekranie. Zabezpiecz przed wczytaniem nieprawidłowej liczby. Wykorzystaj do tego celu wiedzę z jednego z poprzednich rozdziałów. Sposób działania programu: 
    1. Podaj liczbę 
    2. Jeżeli błąd, wróć do kroku 1. 
    3. Wypisz liczbę, która została podana.

Oto kod: 

#include <iostream>
/*Program: zadanie domowe nr 1 z lekcji: Pętle do ... while. */
using namespace std;
int main()
{
	double liczba;
	cout<<"Podaj liczbe:"<<endl;
	cin>>liczba;
	if(cin.fail())
	do
	{
		double liczba;
		cout<<"Podaj liczbe:"<<endl;
		cin>>liczba;
	} while(cin.good());
	
	if(cin.good())
	cout<<"Podana liczba to:"<<liczba<<endl;

	return 0;
	system("pause");
}

Wszystko się ładnie kompiluje, tylko, że program źle działa. Po:

(przykład)

Podaj liczbę: t

Podaj liczbę:

Program się zamyka, a ja chciałabym, żeby robił pętlę jak w treści zadania. Pytanie jak wyżej. 

Dziękuję za pomoc. 

7 odpowiedzi

+3 głosów
odpowiedź 12 kwietnia 2015 przez Boshi VIP (100,240 p.)
edycja 12 kwietnia 2015 przez Boshi

To jest przecież bez sensu.. po co dublować dane?

 

// wrzuciłem w kompilator, działa.


 

#include <iostream>

/*Program: zadanie domowe nr 1 z lekcji: Pętle do ... while. */

using namespace std;

int main()

{

    char liczba;

   do

{

 cout<<"Podaj liczbe:"<<endl;

    cin>>liczba;



    } while((liczba>47)&&(liczba>58));;

     

    cout<<"Podana liczba to:"<<liczba<<endl;


    return 0;

    system("pause");

}

 

komentarz 12 kwietnia 2015 przez MaGie Użytkownik (800 p.)
Okej, rozumiem kod.

Tylko to nie do końca pewnie ten kod, który ma być w tym zadaniu, bo mam użyć pętli do ... while (a ty użyłeś while), no a biblioteka string w tym kursie (bo to zadanie z kursu) jest dalej.

Ale mimo wszystko dziękuję.

:)
komentarz 12 kwietnia 2015 przez 1110200039910 Gaduła (4,630 p.)

Dobra tutaj masz już wszystko tak jak powinno być: 

 

#include <iostream>

/*Program: zadanie domowe nr 1 z lekcji: Pętle do ... while. */

using namespace std;

int main()
{
    int liczba;
    do
    {
        cout<<"Podaj liczbe:\n";
        cin.clear();
        cin.sync();
    }
    while (!(cin>>liczba));

    cout<<"Twoja liczba to: "<<liczba;
    
    return 0;
}

 

 

Nie użyłem System("Pause");

komentarz 12 kwietnia 2015 przez MaGie Użytkownik (800 p.)
Ok, dziękuję :)
komentarz 12 kwietnia 2015 przez Boshi VIP (100,240 p.)
Nawet jeśli nie użyłem do-while to chyba nie problem przerobić skoro zasada działania jest identyczna z małą różnicą. Trochę samodzielności :)
komentarz 12 kwietnia 2015 przez MaGie Użytkownik (800 p.)
Super.

Dopiero teraz miałam okazję, porównując kody, stwierdzić to, co napisałeś w komentarzu powyżej.

A forum jest od zadawania pytań, może nie raz prostych i głupich, ale nadal pytań :)

(Każdy przecież zaczynał)
+2 głosów
odpowiedź 12 kwietnia 2015 przez 1110200039910 Gaduła (4,630 p.)
Czy ten program musi wykorzystywać pętle do...while? Łatwiej byłoby użyć funkcji 'goto'
komentarz 12 kwietnia 2015 przez Boshi VIP (100,240 p.)
goto to obejście problemu- nie zalecane.
komentarz 12 kwietnia 2015 przez 1110200039910 Gaduła (4,630 p.)
Ale po co korzystać z ASCII skoro możemy w dwóch linijkach zapętlić program za pomocą 'goto'?
komentarz 12 kwietnia 2015 przez Boshi VIP (100,240 p.)
A no po to,że goto to brzydka składnia.
komentarz 12 kwietnia 2015 przez MaGie Użytkownik (800 p.)
Tak, musi.

Ale jeśli masz inną propozycję i czas, to napisz.

:)
komentarz 12 kwietnia 2015 przez daan Pasjonat (17,640 p.)
Nieumiejętne posługiwanie się instrukcją goto może powodować trudne do wykrycia błędy typu zapętlenie programu w nieskończoność i jeżeli nie jest to uzasadnione zalecia się omijanie tej instrukcji :P goto można użyć np. do wyjścia odrazu z wielu zagnieżdzonych pętli ale budowanie pętli działających jak do .. while za pomocą goto mija się z celem i drastycznie powoduje, że kod staje się mniej czytelny :)
komentarz 12 kwietnia 2015 przez Kelmac Gaduła (3,970 p.)
goto używa się tylko w asemblerze. Pobnieważ jest to brzydka funkcja któa podowuje   bałagan w kodzię i w wydajnośći sprzętowej. Dużo skoków i odkładania na stos kodu programu, skutkiem tego jest spadek wydajności i bardzo ciężie debugowanie programu.
+2 głosów
odpowiedź 12 kwietnia 2015 przez Kelmac Gaduła (3,970 p.)

skrócony zapis (dla tego wykorzystuję się pętle do_while)

 

#include <iostream>
/*Program: zadanie domowe nr 1 z lekcji: Pętle do ... while. */
using namespace std;
int main()
{
  double liczba;
    do
    {
       cin.clear();
	   cin.sync();
        cout<<"Podaj liczbe:"<<endl;
        cin>>liczba;
		
	} while(cin.fail());
     
    if(cin.good())
    cout<<"Podana liczba to:"<<liczba<<endl;

 
  system("pause");
   return 0;
}

 

komentarz 12 kwietnia 2015 przez MaGie Użytkownik (800 p.)
Dziękuję. To mi się podoba.

:)
komentarz 12 kwietnia 2015 przez adas94 Nałogowiec (29,200 p.)
Ten ostatni if jest również raczej zbędny. do.. while będzie tak długo działał, aż "cin będzie good", więc nie ma potem potrzeby sprawdzać czy "cin jest goog" ifem. Po pierwszej pętli od razu cout i też powinno śmigać.
komentarz 12 kwietnia 2015 przez Kelmac Gaduła (3,970 p.)
Faktynicze, skupiłem się na pętli :D
komentarz 25 grudnia 2017 przez Adrian Ostapkiewicz Nowicjusz (100 p.)

ja to zrobilem w ten sposob, dziala, ale nadal uwazam, ze cos zrobilem nie tak. Bylbym wdzieczny za pomoc i komentarze.

 

 

#include <iostream>
#include <limits>

using namespace std;

int main()
{
int liczba;
bool sukces;

if(liczba != sukces)
do
{
    cout << "Podaj liczbe: ";
    cin >> liczba;
    cin.clear();
    cin.ignore(numeric_limits < streamsize >::max(), '\n');
}while(liczba == sukces);
cout << "Podales liczbe: " << liczba <<endl;


    return 0;
}

 

+1 głos
odpowiedź 12 kwietnia 2015 przez Kelmac Gaduła (3,970 p.)
Wydaję mi się że błedem jest tu że najpierw zapisujesz strumień do zmiennej a potem sprawdzasz strumień.

Więc jeśli wpiszesz znak np t
to najpierw spróbuje t zapisać jako double (char do double) i tu sie wysypuje.
Dopiero potem sprawdza If'a
+1 głos
odpowiedź 12 kwietnia 2015 przez Kelmac Gaduła (3,970 p.)
W pętli nie musisz deklarować znowu zmiennej "double liczba" linia 12, ponieważ tworzy toz meinna lokalna inna niż w lini 6. ZMienna lokalna będzie usunieta po wyjściu z pętli, tak więc w lini 18 wypisujesz na ekran starą zmienną ("t"), anie tą poprawioną w pętli.
+1 głos
odpowiedź 12 kwietnia 2015 przez Kelmac Gaduła (3,970 p.)
Sprawdź swój program bez lini 12
komentarz 12 kwietnia 2015 przez MaGie Użytkownik (800 p.)
Sprawdzałam.

Nie działa.

Mam nadzieję, że to nie przez kompilator.
+1 głos
odpowiedź 12 kwietnia 2015 przez Kelmac Gaduła (3,970 p.)
//Zaminiona linia 21 z 22 oraz dopiski o czyzzczeniu bufora i synchronizacji.
//(musisz wyczyścić bufor ze złej zmiennej , bo znak zostaje  w buforze).
//Oraz zmiana warunku pętli (pętla do_while wykonuje sie póki warunek jest prawdziwy)


#include <iostream>
/*Program: zadanie domowe nr 1 z lekcji: Pętle do ... while. */
using namespace std;
int main()
{
    double liczba;
    cout<<"Podaj liczbe:"<<endl;
    cin>>liczba;
    if(cin.fail())
    do
    {
       cin.clear();
	   cin.sync();
        cout<<"Podaj liczbe:"<<endl;
        cin>>liczba;
		
    } while(!cin.good());
     
    if(cin.good())
    cout<<"Podana liczba to:"<<liczba<<endl;
 
  system("pause");
   return 0;
}

 

komentarz 12 kwietnia 2015 przez MaGie Użytkownik (800 p.)
Dziękuję!

:)
komentarz 14 stycznia 2016 przez Milek Nowicjusz (100 p.)
#include<iostream>
using namespace std;
int main()
{
    int liczba;
    do
    {
        cout << "Podaj liczbe - ";
        cin.clear(); cin.sync();
        cin >> liczba;
    } while (!liczba);
    cout << "Podales liczbe - " << liczba << endl;
    return 0;
}

Ja zrobilem w taki sposob i dziala mi na dev i borlandzie ale nie dziala niestety na VS2015.

Na VisualStudio2015 gdy wpisze litere - wyswietla w jej miejsce dlugi ciag liczb.

Niebardzo wiem jak to naprawic ale ogolnie na innych kompilatorach ten kod dziala prawidlowo.

Podobne pytania

0 głosów
2 odpowiedzi 243 wizyt
0 głosów
4 odpowiedzi 409 wizyt
pytanie zadane 6 marca 2016 w JavaScript przez BlvckFox Gaduła (4,240 p.)
0 głosów
2 odpowiedzi 292 wizyt
pytanie zadane 11 września 2018 w C i C++ przez peropero Nowicjusz (170 p.)

92,615 zapytań

141,465 odpowiedzi

319,782 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!

...