![](/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.