最近深入学习了数组,在老师的教导下练习了一些程序,做这道题的时候绞尽脑汁,还是没能在规定的时间完成,后来匆匆完成,d但又不太懂就今天又看了一遍,总结分享一下,希望能够帮助和我一样对这道题感到困扰的同学。
目录
题目:
已知一个数组,找出其中最小的2个数及对应的下标,输出结果。
拿到这道题呢,我首先想的是怎样找到最小的两个数,然后想到利用数组循环以及if语句大小比较可以找到最小的两个数,还可以利用冒泡排序,但是不知道怎么找到其相应的下标。
冒泡排序:
先巩固一下冒泡排序吧!
#include<stdio.h>
#define N 10
int main()
{
int i, j, t;
int a[N];
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);//首先输入这十个数
}
printf("\n");
for(j=0;j<N-1;j++)//十个数进行九趟循环
{
for (i = 0; i < N - 1 - j; i++)//每趟循环还要进行9-j次比较
{
if (a[i] > a[i + 1])//相邻的两个数依次进行比较
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;//根据比较交换数字大小,分别赋值给相应的数组
}
}
}
for (i = 0; i < N; i++)
{
printf("%d ", a[i]);//最后再依次从小到大的顺序输出这十个数
}
printf("\n");
return 0;
}
这是整个冒泡排序的过程,10个数要进行9趟循环,每趟循环还要进行9-j次比较,最后按照从小到大的顺序输出。
根据冒泡排序找出10个数中最小的两个数:
直接在return 0;前加上输出数组前两位结果就可。顺便看到了冒泡排序结果!
结果实现如下图所示:
输出最小的两个数及其下标:
方法一:
后来探讨到可以这样找到下标
#include<stdio.h>
#define N 10
int main()
{
int a[N] = { 5,1,3,4,5,6,7,8,9,2 };
int i, m=0, n=0, t;
int min1 = a[0], min2 = a[0];
for (i = 0; i < N; i++)
{
if (min1 > a[i])
{
min1 = a[i];
m = i;
}
}
for (i = 0; i < 10; i++)
{
if (min2 > a[i] && i != m)
{
min2 = a[i];
n = i;
}
}
printf("最小值和次小值分别是:%d %d\n", min1, min2);
printf("他们对应的下标分别是:%d %d\n", m, n);
return 0;
}
先赋值两个最小值都为a[0]。然后进入for循环语句,利用if语句比较第一次循环找出最小值,同时记录此时的i值(也就是下标)。循环结束后接着第二次循环一样利用if语句进行比较找次小值及其下标,但是要保证这时候的下标i不能等于m(最小值下标),这是为了防止干扰找次小值也避免了两个最小值是相等的情况。这样就成功找到了两个最小值及其下标。但是这个程序的弊端在于直接给出了10个数而不是随机输入的。
在这里我给出的是最小值相等的情况,运行结果如下图所示:
方法二:
后来参考了同学的代码利用scanf随机输入
#include<stdio.h>
#define N 10
int main()
{
int a[N];
int i, m, n;
m = 0;
n = 0;
for (i = 0; i < N; i++)
{
scanf("%d", a[i]);
if (a[i] < a[m])
m = i;
}
for (i = 0, n = (m + 1) % 10; i < N; i++)
{
if (a[i] < a[n] && i != m)
n = i;
}
printf("最小值和次小值分别为:%d %d\n", a[m], a[n]);
printf("他们对应的下标分别为:%d %d\n", m, n);
return 0;
}
定义的变量很少,直接用a[m]和a[n]来表示最小的两位数,m、n分别表示其下表。也使用了两个for循环语句,直接在第一个循环中利用scanf输入随机值,if比较方法和方法一相同。不同的是在第二个for循环语句中下标n赋值为(m+1)%10,这样就继续了第一个循环中的大小比较,不用重复比较之前的大小。但是为什么要%10呢?我觉得这是为了防止下标m为9的情况,余10为0,然后继续开始第二轮的比较。这种方法真的很简便!
运行结果如下所示:
方法三:
根据我自己的理解也写出了scanf随机输入,以此补充
#include<stdio.h>
#define N 10
int main()
{
int a[N];
int i, m, n;
int min1, min2;
scanf("%d", &a[0]);
min1 = a[0], min2 = a[0];
for (i = 1; i < N; i++)
{
scanf("%d", &a[i]);
if (a[i] < min1)
{
min1 = a[i];
m = i;
}
}
for (i = 1; i < N; i++)
{
if (a[i] < min2 && i != m)
{
min2 = a[i];
n = i;
}
}
printf("最小值和次小值分别为:%d %d\n", min1, min2);
printf("他们对应的下标分别为:%d %d\n", m, n);
return 0;
}
首先把a[0]复制给两个最小值,然后在for循环语句中输入剩下的9个数并作比较,与第一种方法很类似。我觉得也挺好理解的。
如下图运行结果:
关于scanf随机输入求两个最小值及其下标可参考方法二和方法三,觉得哪一种方法更好理解即可参考。
以上就是我个人对这道题的理解和代码的实现,如果有错误的或者不足的地方欢迎指出,一起纠错。