首页 > 解决方案 > 为什么有时我输入一个整数程序会将第一个输入的数字打印成十进制数?

问题描述

这是我的代码。如您所见,数据类型是浮点数,因为存在除法运算。我每次总是遇到的问题是,当用户想查看历史时,我输入的第一个数字变成了十进制数。

这是示例输出:

历史:

1.) 6*2.00263=12 2.) 3+2=5

这是代码:

#include<iostream>
using namespace std;
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
float divide(float a,float b);
int remainder(int a, int b);
void convert(int a, int b);
int main(){
    int size = 0;
    int result[size];
    float num1[size];
    float num2[size];
    char operation[size];
    char answer;
    while(true){
        cout<<"Enter two numbers: \n";
        cout<<size;
        while(!(cin>>num1[size]>>num2[size])){
            system("cls");
            cout<<"Invalid Input. PLease try again: \n";
            cin.clear();
            cin.ignore(2);
        }
    Operation:
    cout<<"Choose Operation: \n"
        <<"   +   --- Addition  \n"
        <<"   -   --- Subtraction   \n"
        <<"   *   --- Multiplication   \n"
        <<"   /   --- Division   \n"
        <<"   %   --- Remainder   \n";
    cout<<"Operation: ";
    cin>>operation[size];

    switch(operation[size]){
        case '+':
            result[size]=add(num1[size],num2[size]);
            cout<<result[size];
            break;
        case '-':
            result[size]=subtract(num1[size],num2[size]);
            break;
        case '*':
            result[size]=multiply(num1[size],num2[size]);
            break;
        case '/':
            result[size]=divide(num1[size],num2[size]);
            break;
        case '%':
            result[size]=remainder(num1[size],num2[size]);
            break;
        default:
            system("cls");
            cout<<"Please enter a valid operation.\n\n";
            goto Operation;
    }
    cout<<"Do you want to try again? (Y or N): ";
    cin>>answer;
        switch(answer){
            case 'Y':
            case 'y':
                system("cls");
                size++;
                continue;
            default:
                cout<<"Do you want to view history? ";
                cin>>answer;
                switch(answer){
                    case 'Y':
                    case 'y':
                        system("cls");
                        cout<<"History:\n\n";
                        for(int i=0;i<=size;i++){
                            cout<<i+1<<".) ";
                            cout<<num1[i]<<operation[i]<<num2[i]<<"="<<result[i];
                            cout<<endl;
                        }
                        cout<<endl;
                        cout<<"Do you want to try again? (Y or N): ";
                        cin>>answer;
                            switch(answer){
                                case 'Y':
                                case 'y':
                                    system("cls");
                                    size++;
                                    continue;
                                default:
                                    cout<<"Thank you\n";
                                    return 0;
                            }
                    default:
                        cout<<"Thanky You!\n";
                        return 0;
                }
        }   
    }
}
int add(int a, int b){
    int result;
    result=a+b;
    cout<<"The answer is: "<<result<<endl;
    return result;
    }
int subtract(int a, int b){
    int result;
    result=a-b;
    cout<<"The answer is: "<<result<<endl;
    return result;
}
int multiply(int a, int b){
    int result;
    result=a*b;
    cout<<"The answer is: "<<result<<endl;
    return result;
    }
float divide(float a, float b){
    float result;
    result=a/b;
    cout<<"The answer is: "<<result<<endl;
    return result;
}
int remainder(int a, int b){
    int result;
    result=a%b;
    cout<<"The answer is: "<<result<<endl;
    return result;
}

标签: c++

解决方案


您的代码中有几个与数组本身有关的问题。首先,在 C++ 中,定义数组时,其大小必须是编译时常数,因此:

int size = 0;
int results[size];

不是有效的 C++。大概您使用的是接受 VLA 的编译器,但这不是标准 C++,应该避免使用。你应该有size一个常数。

其次,您正在初始化大小为 0 的数组。从dcl.array/1参考数组的大小,它的值应大于零。因此,您的数组声明无效。然而,这甚至不应该编译,因为您使用的是 VLA,大概编译器也会跳过这个一致性检查。

第三,您有以下代码:

cin>>num1[size]>>num2[size]

由于num1num2都被声明为具有size它们的大小,因此您将超出范围。数组只能从0to访问size-1。这是未定义的行为。对于不同的数组,同样的问题会多次出现。
此外,在您的循环中:

for(int i=0;i<=size;i++){
    cout<<i+1<<".) ";
    cout<<num1[i]<<operation[i]<<num2[i]<<"="<<result[i];
    cout<<endl;
}

您将达到并包括size. 这又是未定义的行为。

因此,您从程序中得到的任何输出都是完全未知的。


推荐阅读