我目前正在尝试学习C,在网上找到的练习使我创建了一个函数,该函数返回数组中最小值的索引。这是我的功能:
int return_index_of_minimum(int A[10], int i, int j){
int minimum_value = A[i];
int index_to_return = 0;
for (int index = i; index < j; index++){
if (A[index] < minimum_value){
minimum_value = A[index];
index_to_return = index;
}
}
return index_to_return;
}
i和j是函数应查找的下限和上限数字。例如,如果i为4并且j为8,则意味着该函数将返回索引4和8之间的最小值的索引。
这是我的主要功能:
#include <stdio.h>
int main(){
int numbers[10];
int user_input = 0;
for (int i = 0; i < 10; i++){
printf("Please enter a number: ");
scanf_s("%d", &user_input);
numbers[i] = user_input;
}
for (int i = 0; i < 10; i++){
int index_of_min_value = return_index_of_minimum(numbers, i, 10);
int old_num = numbers[index_of_min_value];
int new_num = numbers[i];
numbers[index_of_min_value] = new_num;
new_array[i] = old_num;
}
for (int i = 0; i < 10; i++){
printf("%d\n", new_array[i]);
}
}
用户首先输入一堆数字,然后用用户的值填充数组。这个想法是用来return_index_of_minimum
返回数组中最小项的索引,然后numbers[0]
使用for循环将其设置为等于,然后是numbers[1]
,然后依次类推。old_num
是数组中最低的数字,位于其先前的索引处。在这里,我尝试将最小值与处的值交换。numbers[i]
但是,当我完成对整个数组的排序并打印出来时,我看到了10(当用户随机输入1-10的值时)在索引0处,然后其余数字按顺序排列。有人看到这里有什么问题吗?
解决方法:
int return_index_of_minimum(int A[10], int i, int j){
int minimum_value = A[i];
int index_to_return = i;
...
}
不幸的是,这段代码没有对无效参数的保护,但是否则,这就是您一直在寻找的答案。
原因在调用中index_of_minimum(a, 9, 10)
:循环仅对执行一次迭代index = 9
,并且由于最小值已初始化为value a[9]
,因此index_to_return
由于条件检查而未更新。
这是一种没有相同问题的不同方法:
int return_index_of_minimum(int A[10], int i, int j){
/* assuming i < j */
int minimum_value = A[i];
int index_to_return = i; /* First element is a candidate */
for (int index = i + 1; index < j; index++){
/* Iterate from second element */
if (A[index] < minimum_value){
minimum_value = A[index];
index_to_return = index;
}
}
return index_to_return;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句