数组 “double array[var];”

Arrays "double array[var];"

提问人:tukhsanov 提问时间:11/17/2023 最后编辑:Vlad from Moscowtukhsanov 更新时间:11/18/2023 访问量:112

问:

我给出了一个这样的任务:数组 S[j] ( =0,...,7) 至少有一个零元素。编写一个程序来计算此数组的元素的总和,直到值为零的第一个元素。

数组必须是双精度的。

我试过这个。但我得到 0;

/* S[j] = (  =0,…,7) massivda  bittagina bo‘lsa  ham nolga teng elementi  mavjud. 
 Ushbu massivning qiymati nolga teng bo‘lgan birinchi elementgacha bo‘lgan 
 elementlarning yig‘indisini hisoblash dasturini tuzing. Boshlang‘ich 
 ma’lumotlar: 1, 17, 2, 4, -5, 0, 7, 8. */
 
 #include <iostream>
 
 using namespace std;
 
 int main()
 {
    int j;
    cout << "j:"; cin >>j;
    
    double S[j] = {};
    int P;
    
    for (int i = 0; i >= j-1; i++)
    {
        cout << "S[" << i << "]:"; cin >> S[i];
    }
    
    for (int i = 0; i >= j; i++)
    {
        if (S[i] == 0) break;
        else P += S[i];
    }
    
    cout << P;
    return 0;
 }
C 数组 for-loop g++ double

评论

3赞 463035818_is_not_an_ai 11/17/2023
您错过了初始化,并且您的代码具有未定义的行为P
1赞 463035818_is_not_an_ai 11/17/2023
而且不是标准的 C++double S[j] = {};
3赞 NathanOliver 11/17/2023
double S[j] = {};是一个 VLA,不是标准 C++ 的一部分。添加将停止代码编译。-pedantic-errors
0赞 463035818_is_not_an_ai 11/17/2023
在输入 a 之前,您实际上不需要数组来汇总数字形式的输入0
1赞 463035818_is_not_an_ai 11/17/2023
您无法在运行时确定数组的大小。数组具有固定大小。你可以阅读更多关于,当你的老师抱怨时,你可以向他们解释,任务的要求是你需要一个动态大小的数组,最好的解决方案是std::vectorstd::vector

答:

1赞 Vlad from Moscow 11/17/2023 #1

像这样的可变长度数组

double S[j] = {};

其中不是编译时常量表达式不是标准的 C++ 功能。j

如果你想处理一个数组,那么你需要动态地分配它,就像

double *S = new int[j];

double *S = new int[j](); // to zero-initialize elements of the array

double *S = new int[j]{}; // to zero-initialize elements of the array

在程序结束时,您将需要释放数组,例如

delete [] S;

或使用标准 cintainer 。std::vector<double>

由于它们的条件,两个 for 循环都被跳过

for (int i = 0; i >= j-1; i++)

//..

for (int i = 0; i >= j; i++)

如果至少大于,因为不能大于任何正数。j10

循环应如下所示

for (int i = 0; i < j; i++)

for (int i = 0; i < j and S[i] != 0; i++)
{
    P += S[i];
}

变量应具有类型,并且必须由零初始化Pdouble

double P = 0.0;

评论

0赞 tukhsanov 11/17/2023
它有帮助。谢谢
0赞 Vlad from Moscow 11/17/2023
@tukhsanov完全没有。我们,初学者,应该互相帮助:)
1赞 Ben Voigt 11/17/2023
我们不要忘记 ,它与(世界上的哪个地方???)完美配合,并且不需要程序员记住以后释放内存。std::unique_ptr<double[]>new double[j]new int[]std::make_unique<double[]>(j)
1赞 Jean-Baptiste Yunès 11/17/2023 #2

有几个问题。

错误包括:

  • 本机阵列难以管理,并且禁止使用 VLA。更喜欢使用一些标准容器(这里vector);
  • P未初始化;
  • 循环控制是错误的,你必须测试一个“while”条件,而索引小于大小(而不是)。i < ji >= j-1

建议如下:

  • 不要以大写字母开头的变量标识符,更喜欢小写字母(强烈推荐);
  • 更喜欢使用有效名称,( 比 、 更可取sumParrayS);
  • 如果可能的话,组织代码,以便通过紧密相连的指令进行计算(initialaze/declare 就在计算它之前);sum
  • 首选重要消息 ( 更可取"How many doubles you need?""j:")
  • 不愿使用using namespace std;
  • i, ...通常用于循环控制,更喜欢或重复一个“大小”。jnlength

代码:

 #include <iostream>
 #include <vector>

 int main() {
    using size_type = std::vector<double>::size_type;
    size_type n;
    std::cout << "How many doubles? ";
    std::cin >>n;

    // fill an "array" with values from the input
    std::vector<double> array;
    for (size_type i = 0; i < n; i++) {
        double v;
        std::cout << "array[" << i << "]? ";
        std::cin >> v;
        array.push_back(v);
    }   
 
    // sum elements up to the one that is 0
    int sum=0;    
    for (size_type i = 0; i < array.size(); i++) {
        if (array[i] == 0) break;
        else sum += array[i];
    }   
    std::cout << sum;
    return 0;
 }

评论

0赞 Evg 11/17/2023
for (int i = 0; i < array.size(); i++)- 64 位平台上的符号不匹配 + 类型大小不匹配。
2赞 user4581301 11/17/2023
未来改进建议:测试所有 IO 事务后的流状态。现在有人可以为 输入“banana”,程序将失败并继续尝试使用,就好像用户输入了一个有效值一样。它失败的确切方式取决于所使用的 C++ 标准修订版。在现代 C++ 中,错误的输入将导致设置为 0。在旧版本中,值不明确。std::cin >>n;nstd::cin >>n;nn
0赞 Jean-Baptiste Yunès 11/17/2023
@evg校正size_type用于矢量长度。
1赞 tbxfreeware 11/18/2023
我会声明一个类型别名:,然后将其用作变量的类型,并在两个循环中用作循环控制变量的类型。using size_type = std::vector<double>::size_type;ni
0赞 Jean-Baptiste Yunès 11/18/2023
@tbxfreeware完成,谢谢。