Напишете програма, която позволява да се въведе низ и отпечатва дали той е валидно реално число (валидното реално число може евентуално да започва със знак и после съдържа една или повече цифри, евентуално десетична точка и после евентуално още някакви цифри за дробната част).
По желание: Да се допълни програмата, така че да преобразува низа в число и да го отпечатва.


#include <iostream> #include <cstdlib> #include <cctype> #include <string.h> using namespace std; int valid_flstr( char *flstr){ //Prowerka za walidno realno chislo if ((flstr[0]=='-')||(isdigit(flstr[0]))){ int br=0; for (int i=1; flstr[i]!='\0'; i++) if ((flstr[i]==',')||(flstr[i]=='.')) br++; else if (!isdigit(flstr[i])) return 0; if (br>=2) return 0; else return 1; } else return 0; } double convert(const char* flstr){ //Obrushta niza w realno chislo double num=0, fact=1; int i=0,d; if (flstr[i]=='-'){ i++; fact=-1; }; for (bool point_s=false; flstr[i]; i++){ if (flstr[i]=='.'){ point_s=true; continue; } d=flstr[i]-'0'; if (point_s) fact/=10.0; num=num*10.0+(double)d; }; return num*fact; }; int main() { char flstr[15]; cin.getline(flstr, 15); if (valid_flstr(flstr)){ double num=convert(flstr); cout<<num<<endl; } else cout<<"Newaliden whodn"; system ("PAUSE"); return 0; }Това е моят вариант.
А сега мързеливият :)
#include <iostream> #include <string.h> using namespace std; int main() { char flstr[15]; cin.getline(flstr,15); float num=atof(flstr); cout<<num<<endl; system ("PAUSE"); return 0; }Много добро решение! Особено ми хареса как си реализирал преобразуването на дробната част – аз го бях измислил по-сложно, например :-) Обаче трябва да го пипнеш още малко –
приема например -. за валидно число.
А за мързеливото решение – бива (и е доста по-кратко, да), но не проверява дали е валидно реално число. Няма да може да се отличи въвеждане на 0.0 от въвеждане на невалидни числа (за разлика от първия ти вариант). В този смисъл не удовлетворява условието на задачата.