提问人:tukhsanov 提问时间:11/17/2023 最后编辑:Vlad from Moscowtukhsanov 更新时间:11/18/2023 访问量:112
数组 “double array[var];”
Arrays "double array[var];"
问:
我给出了一个这样的任务:数组 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;
}
答:
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++)
如果至少大于,因为不能大于任何正数。j
1
0
循环应如下所示
for (int i = 0; i < j; i++)
和
for (int i = 0; i < j and S[i] != 0; i++)
{
P += S[i];
}
变量应具有类型,并且必须由零初始化P
double
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 < j
i >= j-1
建议如下:
- 不要以大写字母开头的变量标识符,更喜欢小写字母(强烈推荐);
- 更喜欢使用有效名称,( 比 、 更可取
sum
P
array
S
); - 如果可能的话,组织代码,以便通过紧密相连的指令进行计算(initialaze/declare 就在计算它之前);
sum
- 首选重要消息 ( 更可取
"How many doubles you need?"
"j:"
) - 不愿使用
using namespace std
; i
, ...通常用于循环控制,更喜欢或重复一个“大小”。j
n
length
代码:
#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;
n
std::cin >>n;
n
n
0赞
Jean-Baptiste Yunès
11/17/2023
@evg校正size_type用于矢量长度。
1赞
tbxfreeware
11/18/2023
我会声明一个类型别名:,然后将其用作变量的类型,并在两个循环中用作循环控制变量的类型。using size_type = std::vector<double>::size_type;
n
i
0赞
Jean-Baptiste Yunès
11/18/2023
@tbxfreeware完成,谢谢。
评论
P
double S[j] = {};
double S[j] = {};
是一个 VLA,不是标准 C++ 的一部分。添加将停止代码编译。-pedantic-errors
0
std::vector
std::vector