![](/img/trans.png)
[英]EASY C Max Array Element program -> CANNOT find/understand the error
[英]Function in C to find max element in an array
您正在参与一个游戏,玩家在游戏中为各种已解决的谜题收集积分。 最后,得分最高的玩家获胜。 您想知道得分最高的人与其他人相差多远,才能知道您是否还有机会获胜。
请编写一个 C 程序,该程序使用 function “behind()”(您也必须编写)以帮助完成此任务。 您的程序应该首先从用户输入中读取参与游戏的玩家数量。 游戏中的玩家永远不会超过 10 人。 接下来,您的程序应该读取每个玩家的当前分数并将它们存储在一个数组中。 然后你应该调用 function behind(),作为第一个参数传递给它,数组保存玩家的分数,第二个参数是游戏中的玩家数量。 后面的 function 应该将存储在数组中的分数替换为每个玩家落后于得分最高的玩家的分数。
为了帮助你,程序的主要function已经写好了,所以你的工作就是在后面写function,它的原型也给你了。
#include <stdio.h>
void behind(int *, int);
int main(void) {
int array[10];
int N, i;
scanf("%d", &N);
for (i=0; i<N; i++) {
scanf("%d", &array[i]);
}
behind(array, N);
for (i=0; i<N; i++) {
printf("%d\n", array[i]);
}
return 0;
}
我的问题是我如何编写代码来查找数组元素的最大值,而不将最后一个元素与 memory 块之外的东西进行比较? 我有一些想法,例如:
if(array[i] > array[i+1]) {
max = array[i];
} else {
max = array[i+1];
}
但意识到一旦到达最后一个元素,它就会超出数组的范围。
“我如何编写代码来查找数组元素的最大值而不将最后一个元素与 memory 块之外的东西进行比较? ”
您只需在进入循环之前将max
设置为0
。 然后比较每次迭代时array[i]
是否大于max
。 如果是,则max
由array[i]
分配。 循环条件i < len
检查array
中是否有更多元素:
int max = 0;
for (unsigned int i = 0; i < N; i++) {
if (array[i] > max) {
max = array[i];
}
}
另一件事是,您首先有一个由 10 个元素组成的固定大小的数组
int array[10];
然后要求用户输入元素的数量:
scanf("%d", &N);
如果用户为N
输入大于11
的数字,则您在循环中访问 memory 超出了数组的边界。
在这种情况下,在scanf()
调用之后将array
声明为可变长度数组会更合适:
int N, i;
scanf("%d", &N);
int array[N];
由于永远不会超过 10 名玩家:“游戏中永远不会超过 10 名玩家” - 您也可以将固定大小的array
保留为10
元素,并在循环中分析N
的输入并要求用户重新输入如果N
不在此范围内,则为 0 到 10 之间的有效数字。 您仅将N
用于迭代,但它不会影响数组大小。
int array[10];
while (1) {
scanf("%d", &N);
if ( N >= 0 || N <= 10 ) {
break;
}
printf("Please reinput a valid number!\n");
}
旁注:
始终检查scanf()
的返回值是否存在输入错误。 这种情况经常发生,检查是一种非常好的做法,可以使您的程序更加安全。
VLA 不可移植,只能用于符合 C99 及更高版本的编译器。 为了保持可移植性和安全性,请改用动态分配的数组。
有关的:
我如何编写代码来查找数组元素的最大值而不将最后一个元素与 memory 块之外的东西进行比较?
您可以对behind()
进行编码,例如:
void behind(int *arr, int n) {
int max_value = 0;
for (int i = 0; i < n; i++)
if (arr[i] > max_value)
max_value = arr[i];
printf("Max value: %d\n", max_value);
}
您可以将array
声明为指针变量,而不是定义数组,这会很有帮助。 然后,您可以动态分配 memory ,然后像数组一样使用它,还要注意您正在尝试传递指针,因此最好从指针声明中受益。
完整的方法:
#include <stdio.h>
#include <stdlib.h> // for dynamic memory allocation
void behind(int *, int);
int main(void) {
int *array; // declaring as pointer rather than array
int N, i;
scanf("%d", &N);
if (N > 11) { // must be less than 10
printf("Must be lesser than or equal to 10!\n");
return -1;
}
// dynamically allocating the required memory
array = (int *)malloc(sizeof(int) * N);
for (i = 0; i < N; i++)
scanf("%d", &array[i]);
// here we go
behind(array, N);
for (i = 0; i < N; i++)
printf("%d\n", array[i]);
return 0;
}
void behind(int *arr, int n) {
int max_value = 0;
for (int i = 0; i < n; i++)
if (arr[i] > max_value)
max_value = arr[i];
printf("Max value: %d\n", max_value);
}
output 示例如下:
5 // ------------ INPUT
12
45
23
1
05
Max value: 45 // --- OUTPUT
12
45
23
1
5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.