Помогите разобраться в ошибке кода

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by VERte][, 2 Jul 2007.

  1. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Решил ввиде тренировки написать калькулятор (т.к. только начал самостоятельно изучать С++), но на последних страничках компилятор на меня начал ругаться...

    Вот код:
    Code:
    //калькулятор
    #include<iostream>
    #include<cmath>
    
    using namespace std;
    const double PI(3.14159);
    int main()
    {
       do
      {
        double x,y,z;
        char vibor,znak,func,ex;
      cout<<"Чтобы произвести стандартные действия(+,-,/,*) с двумя числами введите 'a'"<<endl<<"Чтобы вычислить тригонометрические выражения или корень из числа введите 'b'"<<endl;
    cin >>vibor;
    cout <<endl;
     if (vibor=='a')
    {
         cout <<"Введите выражение с двумя числами используя (+,-,/,*): "<<endl;
         cin >>x,znak,y;
       if (znak=='+')
        cout <<x<<"+"<<y<<"="<<x+y;
       if (znak=='-')
        cout <<x<<"-"<<y<<"="<<x-y;
       if (znak=='*')
        cout <<x<<"*"<<y<<"="<<x*y;
       if ((znak=='/') && (y!=0))
        cout <<x<<"*"<<y<<"="<<x*y;
       if ((znak=='/') && (y==0))
        cout<<"Деление на 0 - недопустимая операция";
    }
     if (vibor=='b') 
    {
         cout <<"Введите тригонометрическое выражение (sin,cos,tg,ctg,asin,acos,atg) или выражение с корнем (sqr): "<<endl;
         cin >>func,z;
         cout <<endl;
      if (func=='sin')
        { 
    	 z=PI*z/180;
    	 cout<<"sin"<<z<<"="<<sin(z);
        }
      if (func=='cos')
        { 
    	 z=PI*z/180;
    	 cout<<"cos"<<z<<"="<<cos(z);
        }
      if (func=='tg')
        { 
    	 z=PI*z/180;
    	 cout<<"tg"<<z<<"="<<tan(z);
        }
      if (func=='ctg')
        { 
    	 z=PI*z/180;
    	 cout<<"ctg"<<z<<"="<<1/tan(z);
        }
      if (func=='asin')
         cout<<"arcsin"<<z<<"="<<asin(z)*180/PI;
      if (func=='acos')
         cout<<"arccos"<<z<<"="<<acos(z)*180/PI;
      if (func=='atg')
         cout<<"arctg"<<z<<"="<<atan(z)*180/PI;
      //if ((f=='tg') && (n==)
    }
     cout<<endl<<"Чтобы повторить вычисления нажмите 'r' или любую другую клавишу чтобы выйти (reset нажимать не надо): ";
     cin>>ex;
         } while (ex=='r');
    return 0;
    }
    строчка
    Code:
     } while (ex=='r');
    помечена, в ней ошибка, вот что пишет компилятор:
    В чём может быть ошибка, я ведь вроде обозначил переменную ex в char???
     
    3 people like this.
  2. NetMan

    NetMan Elder - Старейшина

    Joined:
    9 Feb 2004
    Messages:
    121
    Likes Received:
    37
    Reputations:
    34
    Ошибка из-за области действия идентификатора ex.
    Сделай вот так:
    Code:
    .......................................
    int main()
    {
       char ex;   // вот так
       do
      {
        double x,y,z;
        char vibor,znak,func;
    .......................................
     
    1 person likes this.
  3. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    ААа всё понял) спасибо большое, действительно, я же его обозначил какбы после использования (цикл как раз его и использует), а надо до)
    +1)

    Осталось математичускую часть доработать в функциях)))
     
    #3 VERte][, 2 Jul 2007
    Last edited: 2 Jul 2007
  4. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    еще у тебя должны быть проблемы с этим с подобным местом if (func=='atg') здесь ты сравниваешь char со строкой но сравниваются только в итоге сравниваются только переменная func и первый элемент 'atg' т е 'a' тебе нужно хранить использовать массив char типа char func[4] и сравнивать if(!strcmp(func,"atg") и тд
     
    1 person likes this.
  5. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    О спасибо, но пока я наверно лучше сделаю с одной буковкой, т.к. до этого места в учебнике я ещё пока е дошёл, а оно наверно будет (учебник Уолтера Савича)
     
  6. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Ещё такой вопросик к знающим: для тригонометрических функций какая размерность углов? градусы, радианы или ещё какая мера??? (а то что-то ни в градусах ни в радианах не получается правильно)
     
  7. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Всё разобрался там действительно радианы
    перевод из градусов в радианы: радиан=градус*pi/180, где Pi=3.14159
     
  8. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Вот вроде закончил:
    Code:
    #include<iostream>
    #include<cmath>
    
    using namespace std;
    const double PI(3.14159);
    int main()
    {
       double x,y;
       char vibor, znak, ex;
       do
      {
    cout <<"Viberite 'a' ili 'b': ";
    cin >>vibor;
    cout <<endl;
     if (vibor=='a')
    {
         cout <<"Vvedite dva 4isla i (+,-,/,*,^): ";
         cin >>x;
         cin >>znak;
         cin>>y;
         cout <<endl;
       if (znak=='+')
        cout <<x<<"+"<<y<<"="<<x+y;
       if (znak=='^')
        cout <<x<<"^"<<y<<"="<<pow(x,y);
       if (znak=='-')
        cout <<x<<"-"<<y<<"="<<x-y;
       if (znak=='*')
        cout <<x<<"*"<<y<<"="<<x*y;
       if ((znak=='/') && (y!=0))
        cout <<x<<"*"<<y<<"="<<x/y;
       if ((znak=='/') && (y==0))
        cout <<"Delenie na 0 - jopa";
    }
     if (vibor=='b')
    {
         cout.setf(ios::fixed);
         cout.setf(ios::showpoint);
         cout.precision(2);
         cout <<"(s-(sin),c-(cos),t-(tg),g-(ctg),a-(arcsin),o-(arccos),r-(arctg)) i (q-(sqrt)): ";
         cin >>znak;
         cin>>x;
         cout <<endl;
      if (znak=='s')
        {
         x=PI*x/180;
         cout<<"sin"<<x<<"="<<sin(x);
        }
      if (znak=='c')
        {
    	 x=PI*x/180;
    	 cout<<"cos"<<x<<"="<<cos(x);
        }
      if (znak=='t')
        {
    	 x=PI*x/180;
    	 cout<<"tg"<<x<<"="<<tan(x);
        }
      if (znak=='g')
        {
    	 x=PI*x/180;
    	 cout<<"ctg"<<x<<"="<<1/tan(x);
        }
      if (znak=='a')
         cout<<"arcsin"<<x<<"="<<asin(x)*180/PI;
      if (znak=='o')
         cout<<"arccos"<<x<<"="<<acos(x)*180/PI;
      if (znak=='r')
         cout<<"arctg"<<x<<"="<<atan(x)*180/PI;
      if ((znak=='q') && (x>=0))
        cout<<"sqrt"<<x<<"="<<sqrt(x);
      if ((znak=='q') && (x<0))
        cout<<"Jopa";
    }
     cout<<endl<<"Povtorit' - 'k', vixod - any key: ";
     cin>> ex;
    
     } while (ex=='k');
    return 0;
    }
    
    но всё же надо сделать как говорил da_ff для удобства, кто-нибудь может написать подробно параметры для записи строки в переменную?
     
  9. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    т.е в моей проге (где максимальная длина строки arccos тобишь 6 символов) надо написать
    char func[6] ?
     
  10. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Ну я ж ток начал изучать, вот щас придумываю прогу чтоб функции использовать (самое главное: мне надо привыкнуть к синтаксису, поэтому и приходится писать проги, т.к. изучаю сам и нет учителей которые давали бы задания на уроках, чтоб запоминалось лучше)
     
  11. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    У меня есть отличная книга: программиравание на С++, Уолтер Савич, ток она очень большая, пока читаю всё по порядку)