Program odrzucający litery

0

Witam

Próbuje napisać program który ma wypisać podaną przeze mnie liczbę, ale ma zwracać wszystko co nie jest liczbą. Program na pierwszy rzut oka dla mnie jest bardzo prosty lecz nie do końca mogę sobie z nim poradzić. Napisałem coś takiego:

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{   int liczba ;
	
	cout<<"Podaj liczbe: ";
	cin>>liczba;
	if(!(cin>>liczba)) // jesli strumien jest w bledny
	do
	{
  cout<<"Niepoprawny znak. Podaj liczbe!: ";// komunikat błędu
  cin.clear(); //kasowanie flagi błędu strumienia
  cin.sync(); //kasowanie zbędnych znaków z bufora
	}
	while(!(cin>>liczba));


	
		cout<<"Podana liczba to: "<<liczba<< endl;
	
		system("pause");
		return 0;
}
 

Program działa tak prawie jak chciałem ale jeśli wpisuje liczbę to nic się nie dzieje dopiero za drugim razem działa. Gdy wpisuje pierwsze jakąś literę to wszystko jest w porządku od razu później po wpisaniu liczby wyświetla mi ją. Próbowałem już robić to przez if else, samo while ale za każdym razem to samo ;/ Może ktoś pomóc ?

1

wywal to pierwsze cin>>liczba; Albo w ogóle pomyśl i wywal tego cina razem z ifem i zamień do..while na while.

1

Ten kod nie może działać poprawnie, ponieważ kompletnie ignoruje pierwsze wprowadzenie.
Przeanalizuj sobie to:

#include <iostream>
using namespace std;
 
int main()
  {
   while(true)
     {
      cout<<"Podaj liczbe (!-koniec): ";
      ... liczba;
      if(cin>>liczba)
        {
         cout<<"Podana liczba to: "<<liczba<<endl;
        }
      else
        {
         cin.clear();
         if(cin.get()=='!') return 0;
         cout<<"Niepoprawne wprowadzenie.";
        }
      while(cin.get()!='\n'){}
     }
   return 0;
  }
0

A ja myślałem, że błąd jest w pętli i tyle się o kombinowałem ;/ Czyli po prostu teraz wpisanie liczby jest w warunku if'a ?

0

1 while(true) - to true odnosi się do poprawności wczytania cin>>liczba ?
2. nie do końca rozumiem też co tutaj się dzieje while(cin.get()!='\n'){}

W tym drugim punkcie myślałem, że wystarczy to

if(cin.get()=='!') return 0;

po usunięciu tej while(cin.get()!='\n'){} części kodu program u mnie działa tak samo (chyba, że ja nie widzę różnicy.

0
  1. możesz zamienić na while(1==1) wynikiem operacji 1==1 jest true
  2. to jest cin.sync() ale działający również pod linux'em - pobieramy kolejne znaki dopóki nie pobierzemy entera.
  3. cout<<"Podaj liczbe (!-koniec): "; - po usunięciu - if(cin.get()=='!') return 0; znika zakończenie programu po wpisaniu wykrzyknika.
0
  1. wiem, że tak można zrobić chciałem tylko się dowiedzieć czy to true to jest poprawność wpisania cin>>liczba ?
    2.dzieki !
    3.wiem, że
if(cin.get()=='!') return 0;

nie możemy usunąć chodzi mi o while(cin.get()!='\n'){

 po co jest ta część kodu ? bo po usunięciu go program dalej działa poprawnie.
0

Ad 1. Czy dobrze rozumiem że kolejnym pytaniem będzie: "Czy ten int w int main()to jest poprawność wpisania cin>>liczba ?" - nie ma nic a nic wspólnego - zwykła pętla nieskończona
Ad 3. Nie prawda, bez tego nie działa, wpisz jakieś słowo.

0

1.Nie nawet nie myślałem zadać takiego pytania. Chodzi mi po prostu o to TRUE bo nie rozumiem do czego to się odnosi i co tutaj to zmienia.
3.U mnie działa tylko komenda o źle wpisanym tekście pojawia się tyle razy ile jest liter.

Mógłbyś mi łopatologicznie wytłumaczyć te 2 części kodu bo zupełnie ich nie rozumiem
1.

 while(true) 
    while(cin.get()!='\n'){} 
0

Ad 1. Wewnątrz nawiasów while oczekuje wartość logiczną false lub truezazwyczaj zadawaną za pomocą wyrażenia np: (i<10), można podstawić samą wartość logiczną.
Ad 3. Tu nie ma co wyjaśniać, czego nie rozumiesz while? cin.get()? != ? znak \n? Kiedy ten wiersz jest to ignoruje wszystko do entera włącznie, już pisałem to jest jak cin.sync() tylko że działa zawsze i wszędzie.

0

1.Czyli jeśli w 1 było by while(false) to nie wykonywało by się to co jest pod while ?
3.Nie rozumiem w ogóle tego while, ale postaram się jeszcze na spokojnie to przeglądnąć i ogarnąć.

0

Ad 1. tak while(false) nie wykona się nigdy, zaś while(true) wykona się zawsze - dopóki się z niego nie wyskoczy za pomocą: break, return, throw, exit
Ad 3. to jest zwykły

while( PEWNE_WYRAŻENIE != PEWNA_WARTOŚĆ_STAŁA ) { /* BRAK_CZEGOKOLWIEK_WEWNĄTRZ */ }
0

Teraz już rozumiem dzięki !!

1 użytkowników online, w tym zalogowanych: 0, gości: 1