Zabezpieczenie - pętla, jeśli wprowadzany znak nie jest liczbą

0

Witam, jestem początkującym i mam problem z częścią kodu, polegającą na zabezpieczeniu przed wpisaniem innych znaków niż liczba, szukałem w internecie rozwiązań, ale żadne z nich nie działa, za każdym razem po wpisaniu litery program odpowiada wyświetleniem kilku tysięcy wierszy, w których wszystkie wartości przyjmują 0:

Witaj
Wprowadz kolejny elemnt ciagu
d
Liczba numer 1 Jest rowna 0 a jej kwadrat wynosi 0
Wprowadz kolejny elemnt ciagu
Liczba numer 2 Jest rowna 0 a jej kwadrat wynosi 0
Wprowadz kolejny elemnt ciagu
Liczba numer 3 Jest rowna 0 a jej kwadrat wynosi 0
Wprowadz kolejny elemnt ciagu
Liczba numer 4 Jest rowna 0 a jej kwadrat wynosi 0

Czy ma ktoś może pomysł jak można to zrobić? Poniżej zamieszczam kod, fragment o którym mówię zaznaczyłem znakami ///

Program ma za zadanie wczytywać ciąg liczb rzeczywistych, dopóki nie zostanie wczytana liczba ujemna i wyświetlać dla każdej wartości numer porządkowy, wartość i kwadrat wartości.

#include <iostream>
#include <stdio.h>
#include <ctype.h>

void Wprowadzanie ();
using namespace std;
int nr;
float a, b;


void 
Wprowadzanie ()
{	
	cout << "Wprowadz kolejny elemnt ciagu\n";
	cin >> a;

	if (isalpha (a)!=0)			/// isalpha zwraca 0 jesli to nie alfabet
	{							/// 
		cout << "litera";		/// 
		a=0;					/// 
		Wprowadzanie ();		/// 
	}
	if (a<0)
	{
		cout << "Wprowadzona liczba jest ujemna, koniec programu";
		return;
	}
	if (a>=0)
	{
		nr=nr+1;
		b=a*a;	
		cout << "Liczba numer  " << nr << "  Jest rowna  " << a << "  a jej kwadrat wynosi " << b <<"\n";
		Wprowadzanie ();
	}

}


int
main ()
{
	nr=0;
	cout << "Witaj\n";
	Wprowadzanie ();
	return 0;
}
2

Co mam na "nie"

a) formatowanie.

b) rekurencję.
Wywołanie f. Wprowadzanie () wewnątrz Wprowadzanie () to jest rekurencja.
Nie używa się jej w takich przypadkach (używa się w znacząco innych)
Niewłaściwie zastosowana rekurencja czyni ideę algorytmu tak nieczytelną, że nawet nie wnikam
Przy rekurencji od razu się włazi na problem zmiennych - w każdej ramce to tak naprawdę niezależne zmienne - stosujesz lekarstwo gorsze od choroby, czyli zmienne globalne.

Napisz to tak jak pytasz w tytule -z PĘTLĄ

c)
if (isalpha (a)!=0)
cała patologia C/C++, utożsamienie bool z jakimkolwiek typem wartości.
Prawdę napisałeś, ze f. zwraca int, ale zwyczajowo i rozsądkowo się ją używa jakby była bool, czyli
if (isalpha (a))

0
andreo napisał(a):

Witam, jestem początkującym i mam problem z częścią kodu, polegającą na zabezpieczeniu przed wpisaniem innych znaków niż liczba, szukałem w internecie rozwiązań,

działa działa, sprawdź sobie debuggerem czy nie masz błędów.
https://stackoverflow.com/questions/4654636/how-to-determine-if-a-string-is-a-number-with-c

0

remove

1
std::optional<int> read_int(std::istream& input, int trials = 3)
{
	auto buffer = std::string{};
	std::getline(input, buffer);
	auto const data_end = buffer.data() + buffer.length();
	auto value = int{};
	auto [ptr, ec] = std::from_chars(buffer.data(), data_end, value);
	if (ec == std::errc{} && ptr == data_end) {
		return { value };
	}
	return --trials ? read_int(input, trials) : std::nullopt;
}
0

@ZrobieDobrze: dziękuję za poradę, przerobiłem kod, czy taki jest akceptowalny?

#include <iostream>
#include <stdio.h>

using namespace std;

int
main ()
{
  cout << "Witaj w kalkulatorze kwadratu\n";
  int nr;
  float wprowadzona, kwadrat;
  
  do
  {
  	cout << "Wprowadz kolejny elemnt ciagu\n";
  	cin >> wprowadzona;		
  	nr=nr+1;
  	kwadrat=wprowadzona*wprowadzona;	
  	cout << "Liczba numer  " << nr << "  Jest rowna  " << wprowadzona << "  a jej kwadrat wynosi " << kwadrat <<"\n";
  }
   while(wprowadzona>0);
   cout << "\n	Wczytano liczbe ujemna\n";
   cout << "	Koniec programu\n";
   return 0;
}
0

@andreo:

Ma to sens. Dobrze.
Zmienne są lokalne, podoba mi się.
Na normalnych typowych dzisiejszych procesorach, zwykle się traktuje, że nie na powodu oszczędzać na float (ok 6-7 cyfr dokładności) i używa się double (ze 12-13)

Tradycyjnie zwiększanie nr się pisze (ale tak jak jest nie jest to żaden błąd)

nr++;
0
andreo napisał(a):

@ZrobieDobrze: dziękuję za poradę, przerobiłem kod, czy taki jest akceptowalny?

I gdzie tu zabezpieczanie przed wprowadzeniem nie liczb?
Gdzie inicjalizacja nr?

#include <iostream>
#include <stdio.h>
using namespace std;

int main ()
{
  cout<<"Witaj w kalkulatorze kwadratu"<<endl;
  for(int nr=1;;)
  {
    cout<<"Wprowadz element ciagu nr "<<nr<<": ";
    double value;
    if(cin>>value)
    {
      if(cin<0) break;
      cout<<"Liczba numer "<<(nr++)<< " jest rowna "<<value<< " a jej kwadrat wynosi "<<(value*value)<<endl;
    }
    else cin.clear();
    while(cin.get()!='\n') {}
  }
  cout<<endl<<"Wczytano liczbe ujemna"<<endl<<"Koniec programu"<<endl;
  return 0;
}

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