←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

C++
Problem w napisaniu programu - prośba o pomoc

  • +
  • -
Zacco1248's Photo Zacco1248 02.11.2013

Witam uczę się języka c++ z pewnego poradnika. Mam napisać program który : 
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. 

 

No dobra mniej więcej wiem jak to zrobić. Napisałem taki oto kod: 
 

#include <iostream>
using namespace std ;

int main()

{

    cout << "Podaj liczbe = " ;
    int a;
    char sprawdzenie ;
    sprawdzenie = cin.fail();
    do
    {
        cin >> a ;
        cout << "Sprawdzenie = " << a << sprawdzenie;

    }
    while(sprawdzenie == 0);

    return 0;

    }

Nie wiem czy jest dobrze dlatego pisze tutaj, ponieważ po wpisaniu liczby całkowitej każe mi wpisać jeszcze raz i tak bez końca, a po wpisaniu litery program wariuje i wypisuje ciągle " sprawdzenie = podana liczba całkowita ". Pomoże ktoś to ogarnąć? :) Z góry dzięki

 

Quote

GT Team's Photo GT Team 02.11.2013

#include 
// jakby usunelo include to iostream
using namespace std ;

int main()

{
	char liczba;
	rep:
	cout << endl << "Podaj liczbe: ";
	cin >> liczba;
	
	if(isalpha(liczba))
	{
		cout << endl << "Wystapil blad: " << liczba << " nie jest cyfra!";
		goto rep;
	}
		
	cout << endl << "Liczba: " << liczba << " jest liczba calkowita!";
	return 0;
}
Do tego przydała by się funkcja : isalpha(string[]) czyli sprawdza czy dany ciag znakow albo znak jest litera z alphabetu
http://www.cplusplus.com/reference/cctype/
Quote

  • +
  • -
Zacco1248's Photo Zacco1248 02.11.2013

To jest dobrze tylko że to ma być z zastosowaniem pętli :)

Quote

  • +
  • -
DarkGL's Photo DarkGL 03.11.2013

Argh ! Goto ? naprawdę ?! nabierasz zdecydowanie złych nawyków , nie rozprzestrzeniaj ich jak zarazy to że Ty używasz konstrukcji niepożadanych nie znaczy że inni muszą

po za tym widze tu bardziej pole dla int nie dla chara, może zabrzmi to troche niezrozumiale ale lepsze jest podejśćie whitelisty niż blacklisty

co znaczy że

Zabezpiecz przed wczytaniem nieprawidłowej liczby

 

jaka jest nieprawidłowa ?

 

Używająć int otrzymamy automatyczne rzutowanie !

 

Więc w praktyce nigdy nie uzyskamy czegoś innego niż liczba

Quote

  • +
  • -
Zacco1248's Photo Zacco1248 03.11.2013

To co ja mam zrobić? ;P

Quote

  • +
  • -
Zacco1248's Photo Zacco1248 03.11.2013

A jakbym zrobił coś takiego? Tylko problem w tym, że bez różnicy czy wpisze cyfre czy liczbe i tak pokazuje ze wybralem dobrą. Co w tym jest źle? 
 

#include <iostream>
using namespace std ;

int main()

{
	int liczba;
	cout << "Podaj liczbe rzeczywista = ";
	cin >> liczba;
    if ( liczba > 0)

        cout << "Brawo napisales dobra liczbe ";

        else
	do
	{

    cout << "Zla liczba podaj jeszcze raz";

	} while(liczba < 0);

	return 0;
}

Dobra ogarnąłem temat można zamknąć :) 


Edited by Zacco1248, 03.11.2013 01:11.
Quote

GT Team's Photo GT Team 03.11.2013

Pozwlę się spytać DarGL w czym źle napisałem, kod jest dobrze napisany,a goto nie używam zbyt często.
Quote

  • +
  • -
sebul's Photo sebul 03.11.2013

Pozwlę się spytać DarGL w czym źle napisałem, kod jest dobrze napisany,a goto nie używam zbyt często.

To lepiej nigdy go nie używaj.
Quote

GT Team's Photo GT Team 03.11.2013

A co jest z nim nie tak ? jakoś trzeba przeskoczyć funkcję.
Quote

  • +
  • -
sebul's Photo sebul 03.11.2013

Da się to rozwiązać innym sposobem, chociażby dobrze napisaną pętlą. Gdyby nie istniał inny sposób, wtedy ewentualnie można użyć goto. A co jest złego w tym przeskakiwaniu? Tu nie chodzi o jakieś techniczne sprawy, ale o czytelność.
Quote

GT Team's Photo GT Team 03.11.2013

no to ja nie widzę problemu w czytelności, znając angielski : goto - idź do, i tam dalej to szukam funkcji, każdy ma swój gust, dzięki za odp, temat można zamknąc ( tak jak autor stwierdził )
Quote

  • +
  • -
DarkGL's Photo DarkGL 03.11.2013

Goto zaburza czytelność i przepływ kodu

 

W większych projektach jest to bardzo ważne aby o to dbać.

 

W C++ istnieje niechlubna instrukcja goto:
  goto identyfikator;
  identyfikator : instrukcja

Rzadko znajduje ona zastosowanie w ogólnym programowaniu wysokopoziomowym, lecz może być bardzo użyteczne, gdy program w C++ jest generowany przez inny program, a nie pisany bezpośrednio przez człowieka; np. instrukcje goto mogą być stosowane w parserze wygenerowanym z gramatyki przez generator parserów(wtrącenie ode mnie: jeżeli to ci nic nie mówi to to pomiń). Instrukcja goto może także być ważna w tych rzadkich przypadkach, kiedy osiągnięcie optymalnej efektywności staje się sprawą zasadniczą, np. w wewnętrznej pętli jakiegoś programu użytkowego czasu rzeczywistego.
 Jednym z kilku sensownych zastosowań goto w zwykłym kodzie jest umożliwianie wyjścia z zagnieżdżonej pętli lub instrukcji switch(break switch, która ją otacza). Na przykład

 

http://cpp0x.pl/forum/temat/?id=4213

 

Goto należy używać rozważnie i z głową

Quote

GT Team's Photo GT Team 04.11.2013

No kiedyś właśnie o tym też czytałem, ale bardzo rzadko go ogólnie używam. ;P Tak teraz jakoś użyłem goto xD pzdr

Quote