我应该做一个函数,接受一个整数数组作为输入,然后具体通过-38或55随机修改数组中的每个值。但是,我不确定如何随机选择将数字减去-38还是增加55,以及如何执行此过程。
我尝试在函数中创建if语句,指出如果函数为偶数(array [i]%2),则减去-38,如果数字为奇数(else语句),则加55。尽管这可能行得通,但这不是回答此问题的正确方法,因为如果我想在55处加上偶数怎么办?反之亦然,如果是奇数再减去38?
#include <iostream>
using namespace std;
#include <time.h>
#include <cstdlib>
int output(int array[]){
for(int i = 0; i<5; i++){
cout << array[i] << " ";
}
}
int offset(int array[]){
for (int j = 0; j < 5; j++) {
int myrand = rand();
if (myrand % 2 == 0){
array[j] = array[j] - 38;
}
else{
array[j] = array[j] + 55;
}
}
}
int main()
{
srand(time(NULL));
int array[5] = {1, 2, 3, 4, 5};
cout << "Original: ";
output(array);
offset(array);
return 0;
}
如果数组中的值为5,则应该为10或0,以此类推,以任意数字表示。
答案 0 :(得分:0)
让我们开始吧,然后您可以从那里开始。当开始学习任何编程语言(或与此相关的任何一种语言)时,您将从构成语言的大量内容,单词是什么以及将它们组合在一起的规则开始。对于一种编程语言,即它的“语法”。每种语言都有自己的语言。您将以最少的示例开始学习语法,这些示例会利用基本类型并从那里开始。
使用已编译的语言,您还添加了如何将文件中正确语法的集合转换为机器可读的可执行文件的方法。如何将源代码编译为可执行文件。
在这一点上,您可以做的最重要的事情是与您的编译器交朋友,并听听编译器在告诉您什么。您可以通过启用编译器警告来最有效地执行此操作,以便编译器会为您指出出现问题的行(在许多情况下为行中的字符)。规则是
“始终在启用了警告的情况下进行编译,并且不接受代码 直到干净地编译而没有警告。”
要启用警告,请将-Wall -Wextra -pedantic
添加到您的gcc/clang
编译字符串中。对于 VS (在Windows上为cl.exe
),请使用/W3
。您始终可以添加其他警告,但这将提供一套完整的警告,如果您遵循该规则将节省您的调试时间。
以此为背景,让我们看看您要尝试执行的操作。首先,您已将问题标记为C ++。我在上面的注释中为您提供了一个开始位置,以确定您建议的代码中需要哪些基本头文件。 C++ Standard Library headers。检查一下,您会发现C ++提供了time.h
作为标头ctime
的实现(所有标准C标头通常都命名为c......
)。因此,在这里,根据您包含在代码中的内容,至少需要
#include <iostream>
#include <cstdlib>
#include <ctime>
虽然您可以在代码中使用5
,但是要避免对数字进行硬编码(除非所使用的标准库函数有此要求,例如C scanf
field-width 修饰符,在这种情况下不允许使用命名的常量或变量。硬编码数字使用 magic-numbers 来调用,最好避免。
在声明和初始化数组时,可以使用空的[]
(通常是不完整的类型)来声明该数组,但是由于提供了支撑初始化器,编译器使用了提供的元素可在编译时调整数组大小。然后,可以通过将sizeof array
除以sizeof (an_element)
来确定数组中的元素数量。您可以简单地取消引用数组以获得第一个元素,因此您将看到它编写如下:
int main (void) {
int array[] = {1, 2, 3, 4, 5};
int nelem = sizeof array / sizeof *array; /* number of elements */
...
现在,当将基本类型数组传递给函数时,还需要传递元素数量。为什么?当将数组作为参数传递时(实际上在任何访问中,都会受到有限的异常的影响),数组将转换为指向第一个元素的指针。如果您在将数组作为参数传递后尝试在函数中使用sizeof array / sizeof (an_element)
,则最终会得到sizeof (a_pointer) / sizeof (an_element)
,这肯定行不通。
例如,在您的output()
函数中,要与数组一起传递元素数量,您将需要:
void output (int array[], int nelem)
{
for (int i = 0; i < nelem; i++) {
cout << array[i] << " ";
}
cout << '\n';
}
对您的offset()
函数同样适用:
void offset (int array[], int nelem)
{
for (int j = 0; j < nelem; j++) {
int myrand = rand();
if (myrand % 2 == 0) {
array[j] = array[j] - 38;
}
else{
array[j] = array[j] + 55;
}
}
}
(注意:每个函数的返回值type
已更改为void
而不是int
。这两个函数都不需要提供成功/失败的指示并且都不会返回在调用函数main()
中使用的值。在每种情况下,您只是打印数组的元素,或就地更新它们的值。)
您的第一次尝试的其余部分就是在应用偏移量之前先输出数组,然后再输出。您的main()
可能是:
int main (void) {
int array[] = {1, 2, 3, 4, 5};
int nelem = sizeof array / sizeof *array; /* number of elements */
srand (time(NULL)); /* seed random number generator */
cout << "Original: "; /* output original array */
output (array, nelem);
offset (array, nelem); /* apply offset to array */
cout << "Updated : "; /* output original array */
output (array, nelem);
return 0;
}
如果将所有部分放在一起,并在启用警告的情况下进行编译,则会发现您的代码在没有警告的情况下进行编译,并生成有效的可执行文件。
使用/输出示例
$ ./bin/randaddtoarray
Original: 1 2 3 4 5
Updated : 56 57 58 -34 -33
如果多次运行它,您可能会发现您并不总是具有偶数个奇数或偶数个随机数。这就是随机数的本质。
如评论中所述,有许多方法可以开发一种随机方案来应用您的-38
或+55
。花一些时间研究不同的方法,然后尝试实施它们,看看结果如何变化。您可能希望向数组中添加5个以上的值,以便能够得出任何种类的分布结论。五个值确实不足以提供任何类型的清晰比较。
让我知道您是否还有其他问题。