0 编程练习
基础不牢靠,回头来补课。小白这个系列主要是为了重新打基础,为一些常见的易错编程练习题提供记录。其间若有错误,欢迎指出,轻喷勿骂。毕竟小白确实是基础不牢靠。
1 题目
自定义函数之整数处理。
题目描述
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数;①输入10个数;②进行处理;③输出10个数。
输入格式
10个整数
输出格式
整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)
样例输入
2 1 3 4 5 6 7 8 10 9
样例输出
1 2 3 4 5 6 7 8 9 10
2 易错点
看到这个题,感觉很容易,无非就是
-> 读数
-> 找到数组中最小值的编号
-> 找到数组中最大值的编号
-> 交换最小值与首位数
-> 交换最大值与末位数
-> 打印
那么代码如下:
#include<iostream>
using namespace std;
void swap(long * a, long* b)
{
long temp;
temp = *a;
*a = *b;
*b = temp;
return;
}
void readArray(long *num)
{
for (int i = 0; i < 10; ++i)
{
cin >> num[i];
}
}
void processArray(long *num)
{
int indMin = 0, indMax = 0;
for (int i = 1; i < 10; ++i)
{
if(num[i] < num[indMin])
indMin = i;
if(num[i] > num[indMax])
indMax = i;
}
swap(&num[0], &num[indMin]);
swap(&num[9], &num[indMax]);
}
void printArray(long *num)
{
for (int i = 0; i < 10; ++i)
{
cout << num[i] << " ";
}
}
int main()
{
long num[10];
readArray(&num[0]);
processArray(&num[0]);
printArray(&num[0]);
return 0;
}
轻松加愉快?
测试一下。
测试1
2 1 3 4 5 6 7 8 10 9
1 2 3 4 5 6 7 8 9 10
测试2
10 2 3 4 5 6 7 8 1 9
9 2 3 4 5 6 7 8 10 1
出错了!原因在哪儿?
我们仔细看下,对于测试2,找到的最小位置是8,最大位置是0,先交换了最小值和首位数,变成:
1 2 3 4 5 6 7 8 10 9
再交换了位置8和末位,变成
9 2 3 4 5 6 7 8 10 1
这里出错的原因是,早早地确定了最大和最小值的位置,但是交换是分成两步在走的。第一次交换,有可能会破坏确定的最大值的位置。
那么如何修改也呼之欲出了:
需要在首次交换之后再重新确定最大值的位置,即
-> 读数
-> 找到数组中最小值的编号
-> 交换最小值与首位数
-> 找到数组中最大值的编号
-> 交换最大值与末位数
-> 打印
3 正解
#include<iostream>
using namespace std;
void swap(long * a, long* b)
{
long temp;
temp = *a;
*a = *b;
*b = temp;
return;
}
void readArray(long *num)
{
for (int i = 0; i < 10; ++i)
{
cin >> num[i];
}
}
void processArray(long *num)
{
int indMin = 0, indMax = 0;
for (int i = 1; i < 10; ++i)
{
if(num[i] < num[indMin])
indMin = i;
}
swap(&num[0], &num[indMin]);
for (int i = 1; i < 10; ++i)
{
if(num[i] > num[indMax])
indMax = i;
}
swap(&num[9], &num[indMax]);
}
void printArray(long *num)
{
for (int i = 0; i < 10; ++i)
{
cout << num[i] << " ";
}
}
int main()
{
long num[10];
readArray(&num[0]);
processArray(&num[0]);
printArray(&num[0]);
return 0;
}