正在学C语言,做书上的练习题,用的vs2022,要找出数组最大,最小值下标,然后卡在最小值下标这了。函数SUBSCRIPT_min的返回值一直都是0,在SUBSCRIPT_min函数内用printf直接输出sub也一直是0,大概是sub = i + 1这个语句没有起效果,但不知道是为什么。
#include<stdio.h>
void MAX_array(int arr[5]);
void MIN_array(int arr[5]);
int SUBSCRIPT_min(int arr[5]);
int SUBSCRIPT_max(int arr[5]);
int main()
{
int arr[5] = { 1,2,3,4,5 };
int i,s=0;
printf_s("Enter five number,please.\n");
for (i = 0; i <5 ; i++)
{
scanf_s("%d", &arr[i]);
}
printf_s("Which number do you want,min or max?\n1)min 2)max(0 to quit)\n");
scanf_s("%d", &s);
while (s != 0)
{
switch (s)
{
case 1:MIN_array(arr);
printf_s("The subscript of the minimum is %d.\n", SUBSCRIPT_min(arr));
break;
case 2:MAX_array(arr);
break;
case 3:
default:printf_s("Error!\n");
break;
}
printf("Please enter 1 or 2.(0 to quit)\n");
scanf_s("%d", &s);
}
}
void MAX_array(int arr[5])
{
int i,max=0;
for ( i = 0; i < 4; i++)
{
if (arr[0]<arr[i+1])
{
arr[0] = arr[i + 1];
}
}
max = arr[0];
printf_s("The maximum is %d.\n", max);
}
void MIN_array(int arr[5])
{
int i, min = 0;
for (i = 0; i < 4; i++)
{
if (arr[0] > arr[i + 1])
{
arr[0] = arr[i + 1];
}
}
min = arr[0];
printf_s("The minimum is %d.\n", min);
}
int SUBSCRIPT_min(int arr[5])
{
int i, sub=0;
for (i = 0; i < 4; i++)
{
if (arr[0] > arr[i + 1])
{
arr[0] = arr[i + 1];
sub = i + 1;
}
}
return sub;
}
回答:你这边的min函数修改了原来的数组,这边给出测试结果,写的函数没啥问题,但在下标会溢出,已修改
#include<stdio.h>
void MAX_array(int arr[5]);
void MIN_array(int arr[5]);
int SUBSCRIPT_min(int arr[5]);
int SUBSCRIPT_max(int arr[5]);
int main()
{
int arr[5] = { 1,2,3,4,5 };
int i,s=0;
printf_s("Enter five number,please.\n");
for (i = 0; i <5 ; i++)
{
scanf_s("%d", &arr[i]);
}
printf_s("Which number do you want,min or max?\n1)min 2)max(0 to quit)\n");
scanf_s("%d", &s);
while (s != 0)
{
switch (s)
{
case 1:MIN_array(arr);
printf_s("The subscript of the minimum is %d.\n", SUBSCRIPT_min(arr));
break;
case 2:MAX_array(arr);
break;
case 3:
default:printf_s("Error!\n");
break;
}
printf("Please enter 1 or 2.(0 to quit)\n");
scanf_s("%d", &s);
}
}
void MAX_array(int arr[5]){
}
void MIN_array(int arr[5]){
}
/*
void MAX_array(int arr[5])
{
int i,max=0;
for ( i = 0; i < 4; i++)
{
if (arr[0]<arr[i+1])
{
arr[0] = arr[i + 1];
}
}
max = arr[0];
printf_s("The maximum is %d.\n", max);
}
void MIN_array(int arr[5])
{
int i, min = 0;
for (i = 0; i < 4; i++)
{
if (arr[0] > arr[i + 1])
{
arr[0] = arr[i + 1];
}
}
min = arr[0];
printf_s("The minimum is %d.\n", min);
}
*/
int SUBSCRIPT_min(int arr[5])
{
int i, sub=0;
for (i = 0; i < 4; i++)
{
if (arr[0] > arr[i]) //原来的i+1会溢出
{
arr[0] = arr[i];
sub = i + 1;
}
}
return sub;
}
你的IN_array(int arr[5])函数已经将arr[0]变成数组的最小值了,自然在SUBSCRIPT_min函数永远返回0了,因为第0个已经是最小值了啊
你不能在函数中去修改arr[0]值,应该重新定义一个临时变量来记录才可以的,修改如下:
#include<stdio.h>
void MAX_array(int arr[5]);
void MIN_array(int arr[5]);
int SUBSCRIPT_min(int arr[5]);
int SUBSCRIPT_max(int arr[5]);
int main()
{
int arr[5] = { 1,2,3,4,5 };
int i,s=0;
printf_s("Enter five number,please.\n");
for (i = 0; i <5 ; i++)
{
scanf_s("%d", &arr[i]);
}
printf_s("Which number do you want,min or max?\n1)min 2)max(0 to quit)\n");
scanf_s("%d", &s);
while (s != 0)
{
switch (s)
{
case 1:MIN_array(arr);
printf_s("The subscript of the minimum is %d.\n", SUBSCRIPT_min(arr));
break;
case 2:MAX_array(arr);
break;
case 3:
default:printf_s("Error!\n");
break;
}
printf("Please enter 1 or 2.(0 to quit)\n");
scanf_s("%d", &s);
}
return 0;
}
void MAX_array(int arr[5])
{
int i,max=arr[0];
for ( i = 0; i < 4; i++)
{
if (max<arr[i+1])
{
max = arr[i + 1];
}
}
printf_s("The maximum is %d.\n", max);
}
void MIN_array(int arr[5])
{
int i, min = arr[0];
for (i = 0; i < 4; i++)
{
if (min > arr[i + 1])
{
min = arr[i + 1];
}
}
printf_s("The minimum is %d.\n", min);
}
int SUBSCRIPT_min(int arr[5])
{
int i, sub=0,min = arr[0];
for (i = 0; i < 4; i++)
{
if (min > arr[i + 1])
{
min = arr[i + 1];
sub = i + 1;
}
}
return sub;
}
在调用SUBSCRIPT_min函数前,先调用了MIN_array函数,在MIN_array里对arr数组进行了比较,并把最小值赋给了arr[0]。这样在SUBSCRIPT_min中,if (arr[0] > arr[i + 1])中的条件arr[0] > arr[i + 1]始终为0,不会进入if语句中,sub=i+1亦不会执行,所以一直是0。