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


#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char a[20]; bool v,t; v=true; t=false; cin>>a; for (int i=0; a[i]!='\0'; i++){ // Ако дадения символ е точка и досега не е имало точка ИЛИ ако е цифра всичко е ОК иначе прекъсваме цикъла if (!(((a[i]=='.') && (!t)) || ((a[i]<'9') && (a[i]>'0')))){ v=false; break; } if ((a[i]=='.') && !(t)) t=true; } if (v) cout<<"Vyvedeniq niz E validno realno 4islo"<<endl; else cout<<"Vyvedeniq niz NE E validno realno 4islo"<<endl; system("PAUSE"); return EXIT_SUCCESS; }#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char ch[20],c; bool validno,tochka; validno=true; tochka=false;//promenliva za proverka dali e sre6tana to4ka do sega cin.getline(ch,20,'\n');//vyvejdane na niza c=ch[0]; if ((c=='+')||(c=='-')||(c=='.')||((c>='0')&&(c<='9'))) //proverka dali pyrviq simvol otgovarq na uslovieto { if (c=='.') tochka=true;//proverka dali e to4ka for (int i=1; ch[i]!='\0'; i++){ c=ch[i]; if (!(((c>='0')&&(c<='9'))||((c=='.')&&(!(tochka))))) { validno=false; break; } if (c=='.') tochka=true; }} else validno=false; if (validno) cout<<"Validno realno chislo e"<<endl; else cout<<"Ne e validno realno chislo"<<endl; system("PAUSE"); return EXIT_SUCCESS; }#include <cstdlib> #include <iostream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { char ch[20],c; bool validno,tochka; int br=0,t=0,znak=1; double chislo=0; validno=true; tochka=false;//promenliva za proverka dali e sre6tana to4ka do sega cin.getline(ch,20,'\n');//vyvejdane na niza c=ch[0]; if ((c=='+')||(c=='-')||(c=='.')||((c>='0')&&(c<='9'))) //proverka dali pyrviq simvol otgovarq na uslovieto { if (c=='.') tochka=true;//proverka dali e to4ka for (int i=1; ch[i]!='\0'; i++){ c=ch[i]; if (!(((c>='0')&&(c<='9'))||((c=='.')&&(!(tochka))))) { validno=false; break; } if (c=='.') tochka=true; }} else validno=false; if (validno) { if (ch[0]=='-') znak=-1; //opredelqne dali pyrviq znak dali e - if ((!(ch[0]=='.'))&&(!(ch[0]=='-'))&&((c>='0')&&(c<='9'))) chislo=ch[0]-48; //ako ne e minus i to4ka i e cifra se izpolzva za obrazuvaneto for (int i=1; ch[i]!='\0'; i++)//obrazuva se ostanalata 4ast ot chisloto { c=ch[i]; br++; if (c=='.')//ako se sre6tne to4ka se zapametqva kyde se namira { t=br; continue; } chislo=chislo*10+(c-48);//obrazuva se chisloto } chislo=chislo*(pow(10,t-br));//postavq se to4ka ako ima takava cout<<znak*chislo<<" e validno realno chislo"<<endl;//izvejda se podhodq6to syob6tenie s izpolzvan znak } else cout<<"Ne e validno realno chislo"<<endl; system("PAUSE"); return EXIT_SUCCESS; }И трите решения са верни, браво! Макса, не правиш проверка за знак на числото. Денис, направил си и преобразуването към число, супер! Ако искаш да е още по-оптимално, може докато проверяваш дали е валидно да образуваш и стойността му. И взимането на всяка цифра може да става и с c-‘0’ вместо c-48 – по-обяснително е.
Денис, ето как бих решил задачата аз (базирано на твоя код):
char ch[20]; bool validno,tochka; validno=false; // флаг дали числото дотук е валидно tochka=false; // флаг дали сме срещнали десетична точка cin.getline(ch,20,'\n'); int i=0; double chislo=0, drob=0.1; if ((ch[i]=='+')||(ch[i]=='-')) i++; // има знак, ОК while(ch[i]) { if (ch[i]=='.') // ако срещнем точка... if (tochka) { // ако е имало досега, не е ОК validno=false; break; } else tochka=true; // намерихме точката, супер else if ((ch[i]>='0')&&(ch[i]<='9')) { // при цифра - образуваме числото validno=true; // щом има поне една цифра е ОК if (tochka) { chislo+= drob*(ch[i]-'0'); drob/=10; } else chislo=chislo*10 + (ch[i]-'0'); } else { // ако не е цифра - невалидно е validno=false; break; } i++; } validno=validno&&tochka; // за да е реално число, трябва да има и точка if (validno) // отпечатваме какво сме открили { if (ch[0]=='-') chislo=-chislo; cout<<chislo<<" e validno realno chislo\n"; } else cout<<"Ne e validno realno chislo\n";