C++易错编程练习题(1)

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
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

再交换了位置0和末位,变成

9 2 3 4 5 6 7 8 10 1

这里出错的原因是,早早地确定了最大和最小值的位置,但是交换是分成两步在走的。第一次交换,有可能会破坏确定的最大值的位置。
那么如何修改也呼之欲出了:
需要在首次交换之后再重新确定最大值的位置,即

-> 读数
-> 找到数组中最小值的编号
-> 交换最小值与首位数
-> 找到数组中最大值的编号
-> 交换最大值与末位数
-> 打印

3 正解

#include
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;
}

C++易错编程练习题(1)_第1张图片

你可能感兴趣的:(VS,C++,c++,算法,数据结构)