Валидно реално число

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

По желание: Да се допълни програмата, така че да преобразува низа в число и да го отпечатва.

Публикувано в 12а с етикети . Постоянна връзка.

5 Responses to Валидно реално число

  1. MAXA каза:
    #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;
    }
  2. Nate каза:
    #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;
    }
    
    
  3. Nate каза:
    #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;
    }
    
    
  4. Данаил каза:

    И трите решения са верни, браво! Макса, не правиш проверка за знак на числото. Денис, направил си и преобразуването към число, супер! Ако искаш да е още по-оптимално, може докато проверяваш дали е валидно да образуваш и стойността му. И взимането на всяка цифра може да става и с c-‘0’ вместо c-48 – по-обяснително е.

  5. Данаил каза:

    Денис, ето как бих решил задачата аз (базирано на твоя код):

        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";
    

Вашият коментар