Ошибка программирования на C ++: ожидаемый неквалифицированный идентификатор перед маркером "{" - PullRequest
0 голосов
/ 19 июня 2011

Я новичок в C ++, и я пытаюсь создать «калькулятор», который: добавляет два числа, вычитает два числа, умножает два числа, делит два числа, принимает синус числа, принимает косинус число, или принимает тангенс числа. Вот код:

#include <iostream>;
#include <cmath>;
#include <string>
int main () 
{}
int ask(std::string operation);
    {
        std::cout<<"Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";
        std::cin>>operation;
            if (operation="Addition") 
            {
                goto Add
                                }
    float Add(float addend1, float addend2, float answer) 
    {
    Add:
        std::cout<<"Insert the first number to be added:\n";
        std::cin>>addend1;
        std::cout << "Insert the second number to be added:\n";
        std::cin>>addend2;
        answer=addend1+addend2;
        std::cout<<addend1<<"+"<<addend2<<"="<<answer<<"\n";
        break
    }
}

Позже будет больше функций, но моя проблема в строке 7. Есть ошибка, которая говорит: ожидаемый безусловный идентификатор перед токеном "{". Я знаю, что мой отступ ужасен, но спасибо!

Ответы [ 5 ]

8 голосов
/ 19 июня 2011

В вашем коде много проблем.

Во-первых, как указывает Иван, вы пытаетесь определить функцию внутри функции (ask() внутри main()). Это не верно.

Во-вторых, goto (почему ?!) пытается перейти к метке в другой функции. Я сомневаюсь, что ваш компилятор даже допустит это, но как вы ожидаете, что это сработает? Вы пытаетесь использовать переменные, переданные вашей функции addition, которые не существуют, так как вы никогда не вызываете функцию, и стек никогда не был настроен для нее. Это плохо, не делайте этого, просто вызовите функцию правильно.

В-третьих, директива препроцессора #include заканчивается новой строкой, а не точкой с запятой. Это может привести к некоторым (относительно) трудным для отслеживания ошибок компиляции.

В-четвертых, вы по ошибке пытаетесь присвоить const char* "Addition" operation, когда вы хотели использовать оператор равенства ==. Это не сработает, потому что operation является r-значением и не может быть присвоено так. Если вы хотите изменить его, вам нужно будет объявить его как указатель, но еще раз, это не то, что вы собираетесь семантически ...

Если вы хотите сравнить строки и (по какой-то причине ...) намереваетесь использовать указатели на char, то вам следует использовать strcmp . Тем не менее, вы находитесь на земле C ++, поэтому просто используйте std:string.

Попробуйте что-то вроде этого. В любом случае, я не улучшил ваш код, просто сделал что-то, что будет компилироваться и запускаться. Я сделал несколько изменений.

Помимо избавления от нескольких синтаксических ошибок, ваша оригинальная функция Add взяла результат в качестве аргумента float. Присвоение этого изнутри функции будет только изменять копию. Вам нужно взять указатель или ссылку, если вы хотите, чтобы вызывающая сторона увидела измененное значение, но вам это вообще не нужно, поскольку вы можете просто вернуть результат.

Сравнение строк чувствительно к регистру, поэтому вы, вероятно, захотите изменить его, чтобы оно не учитывало регистр. Я предполагаю, что здесь нет локализации :). Я также не выполняю проверку ошибок на входе, поэтому имейте в виду, что он может потерпеть неудачу, если пользователь введет что-то, кроме действительного числа с плавающей запятой.

#include <iostream>
#include <string>

using namespace std;

void Ask();
float Add( float, float );

int main( size_t argc, char* argv[] )
{
    Ask();
    return 0;
}

void Ask()
{
    cout << "Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";

    string operation;
    cin >> operation;

    if( operation == "Addition" )
    {
        float first = 0, second = 0;
        cout << "enter first operand";
        cin >> first;

        cout << "enter second operand";
        cin >> second;

        cout << "The result is: " << Add( first, second );
    }
}

float Add( float first, float second ) 
{
    return first + second;
}
6 голосов
/ 19 июня 2011

С ++ не допускает вложенные функции. У вас есть функция main() и вы пытаетесь объявить функцию ask() внутри нее. И компилятор не знает, что вы хотите.

2 голосов
/ 19 июня 2011

Я прокомментировал ваш код немного, может быть, с чего вы начали:

2 голосов
/ 19 июня 2011

Сначала int спросите (), что это такое. Почему вы начинаете блок здесь. Во-вторых, у вас есть два {s и три} s из-за ask (). Я думаю, что c ++ не поддерживает функции anonymus. В-третьих, почему вы используете goto, когда у вас есть функция, просто вызовите функцию. В-четвертых, ваша дополнительная функция должна быть либо void, либо удалить ее последний параметр. Также я думаю, что вам не нужен файл string.h, если вы не используете довольно продвинутые функции, для вашей программы должно хватить массива char.

2 голосов
/ 19 июня 2011

Давайте попробуем разбить это ..
Вы не должны использовать; по директивам прекомпилятора.

#include <iostream>;
#include <cmath>;
#include <string>;

Должно быть

#include <iostream>
#include <cmath>
#include <string>

.

int main () {
    int ask (){

См. Ответ Ивана за это

char operation [20];
std::cout<<"Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";
std:cin>>operation;
if (operation="Addition"){

Вместо этого вы можете использовать std :: string , с которым гораздо легче иметь дело. Тогда вы можете написать

#include <string>

...
std::cout<<"Type Addition, Subtraction, Multiplication, Division, Sine, Cosine, or Tangent:\n";
std::string myString;
getline(cin, myString);
if (myString == "Addition"){

.

goto Addition;
}
}
    float addition(float addend1, float addend2, float answer)
{

Не уверен, что здесь происходит .. но давайте разберем дополнение к своей собственной функции

void Addition(){
    // do addition here
}

.

Addition:
std::cout<<"Insert the first number to be added:\n";
std::cin>>addend1;
std::cout << "Insert the second number to be added:\n";
std::cin>>addend2;
answer=addend1+addend2;
std::cout<<addend1<<"+"<<addend2<<"="<<answer<<"\n";
}

Не забывайте, что вы должны определить переменные

int addend1;
int addend2;
int answer;

Надеюсь, это поможет вам на этом пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...