在 c++ 中显示大小未知的 'double' 数字数组

Display an array of 'double' numbers with unknown size in c++

本文关键字:double 数组 数字 未知 c++ 显示      更新时间:2023-10-16

更新 1:我需要帮助完成本文的第二部分。我要求用户输入数字并使用零停止。但是我想显示该代码。这就是我走多远,因为当我想显示它时,它会给我不同的数字。我忽略了用户错误,假设他们第一次输入时是正确的。但我确实希望他们输入负数。

#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{
    float data;
    int count=0;
    int*arr=new int[count];
    //get amount of numbers inputted 
    cout<<"Please enter floating point data.n";
    cout<<"After the last number has been entered press 0 (zero) n";
    cin>>data;
    for (; data != 0 ; ++count)
    {
        cin>>data;
    }
    cout<<count<<endl;
    cout<<endl;
    //display back data
    cout<<"The numbers enterd are: "<<endl; 
    for(int i=0; i<count; i++)
    {
        cout<<arr[i]<<endl;
    }
    cout<<endl;
system ("pause");
return 0;
}
**

更新 2:**此代码是我正在处理的一个更大项目的一部分。我的教授永远不会看到他只关心它是否有效的代码。在这种情况下,我的代码设计不是优先事项。此外,我以前从未使用过std::vector,所以我需要另一种方法来做到这一点。但这就是我所做的,它工作得很好。我还评论了delete []arr因为如果我不这样做,我的代码将无法正常运行。

#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{ 
    double data; 
    int count=0; 
    double *arr =new double[count]; 
    //get data 
    cout<<"Please enter floating point data."<<endl; 
    cout<<"After the last number has been entered press 0 (zero)"<<endl; 
    do
    {
        cin>>arr[count]; 
        data = arr[count]; 
        count++; 
    }while(data != 0); 
    //display back data 
    cout<<"The numbers entered are: "<<endl; 
    for(int i=0; i<(count-1); i++) 
    { 
        cout<<arr[i]<<endl;
    } 

    //delete []arr;  
 system ("pause");
 return 0;
 }

给定的示例代码,

#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{
    float data;
    int count=0;
    int*arr=new int[count];
    //get amount of numbers inputted 
    cout<<"Please enter floating point data.n";
    cout<<"After the last number has been entered press 0 (zero) n";
    cin>>data;
    for (; data != 0 ; ++count)
    {
        cin>>data;
    }
    cout<<count<<endl;
    cout<<endl;
    //display back data
    cout<<"The numbers enterd are: "<<endl; 
    for(int i=0; i<count; i++)
    {
        cout<<arr[i]<<endl;
    }
    cout<<endl;
system ("pause");
return 0;
}

有很多问题:

  • 编码:无缘无故地使用float
    C 和 C++ 中的默认浮点类型为 double 。例如,文字3.14double类型,任何float值在传递给可变参数C函数时都会提升为double。仅在上下文强加要求的情况下使用float,例如 C API,或在有限的内存中存储大量值。

  • 编码:使用原始数组和new表达式。
    使用std::vector时,任务是微不足道的。一次又一次地重新发明轮子不是一个好主意。一个需要你重新发明std::vector或其最基本特征的练习应该非常清楚这方面:这不是,所以大概不需要重新发明或它是关于什么的。

  • 设计:通过特殊值向输入端发送信号。
    无法输入该值。

  • 编码:不存储数字的输入循环。
    每个数字都存储在与前一个数字相同的变量中,擦除前一个数字。将数字存储在std::vector中。例如,您可以使用push_back方法。

  • 编码:输出换行符约定不一致。
    使用 endl"n" 作为默认值。不要随意混合它们。一致性非常重要,因为阅读代码的人,假设一个称职的程序员,必须将每次偏离既定默认值视为由于某种原因。当没有理由浪费时间和精力时。

  • 工具使用:system( "pause" )是愚蠢的,适得其反的和非便携式的。
    在Visual Studio中,你似乎正在使用,只需通过Ctrl + F5运行程序。或者在 main 的最后一个右大括号上放置一个断点,并通过 F5 在调试器中运行程序。

  • 编码:return 0;是多余的。
    main是唯一具有默认返回值的函数。它在 C 和 C++ 中都有。默认值 0 表示成功,将在那里使用。


具有上述几点的示例代码,加上一些,固定的。

此代码适用于 C++11 或更高版本,因此不会直接使用 Visual C++ 2010 进行编译

我把它留给你一个练习,让你把它翻译成 C++03,这是你当前的编译器可以处理的。请考虑升级。这是一个免费工具。

#include <iostream>
#include <iomanip>              // std::setw
#include <string>               // std::(string, stod)
#include <vector>               // std::vector
using namespace std;
using Half_float = float;                       // Most often a silly choice.
using Float = double;                           // Default in C++.
using Extended_float = long double;             // Same as double in Visual C++.
auto read_line()
    -> string
{ string line; getline( cin, line ); return line; }
auto main() -> int
{
    cout << "Please enter floating point numbers like " << 3.15 << ", one per line.n";
    cout << "After the last number just press return again (i.e. a blank line).n";
    vector<Float> numbers;
    for( ;; )
    {
        cout << "#" << numbers.size() + 1 << "? ";
        string const line = read_line();
        if( line.empty() )
        {
            break;
        }
        numbers.push_back( stod( line ) );      // Here you CAN do input validation.
    }
    cout << numbers.size() << " numbers entered.n";
    cout << "n";
    cout << "The numbers entered were: n";
    for( int i = 0; i < int( numbers.size() ); ++i )
    {
        cout << setw( 3 ) << i << ": " << numbers[i] << "n";
    }
}

如果您有 C++ 11 或更高版本,请使用自动

取代

for(int i=0; i<count; i++)
{
    cout<<arr[i]<<endl;
}

for(auto v: arr){
    cout << v << endl;
}

请记住,您需要支持 C++11 的编译器才能使用 auto。

如果C++ <11,请使用 std::for_each

#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
void print(float v){
    cout << v << endl;
}

int main ()
{
    float data;
    int count=0;
    std::vector<float> arr;
    //get amount of numbers inputted
    cout<<"Please enter floating point data.n";
    cout<<"After the last number has been entered press 0 (zero) n";
    while(cin>> data && data != 0)
    {
        arr.push_back(data);
        ++count;
    }
    cout<<count<<endl;
    cout<<endl;
    //display back data
    cout<<"The numbers enterd are: "<<endl;
    std:for_each(arr.begin(), arr.end(), print);
    cout<<endl;
    system ("pause");
    return 0;
}
  • 代码将访问 arr 的越界,它有零个元素,除非您为第一个提示输入 0
  • 您根本没有将阅读的内容分配给"元素或arr"(实际上arr中不会有元素)。
  • 没有理由使用int数组来存储float数据。

您应该使用 std::vector ,它用作可变大小的数组。

#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
int main ()
{
    float data;
    int count=0;
    vector<float> arr;
    //get amount of numbers inputted 
    cout<<"Please enter floating point data.n";
    cout<<"After the last number has been entered press 0 (zero) n";
    while(cin >> data && data != 0)
    {
        arr.push_back(data);
    }
    count = arr.size();
    cout<<count<<endl;
    cout<<endl;
    //display back data
    cout<<"The numbers enterd are: "<<endl; 
    for(int i=0; i<count; i++)
    {
        cout<<arr[i]<<endl;
    }
    cout<<endl;
    return 0;
}