[编程题]17、数据的交换输出

目录

前言:

1、题目展示:

2、问题分析:

3、最终代码展示:


前言:

开新专栏了,讲解100道基础语法编程题

用c语言讲解

目的是复习c语言中的基础语法,为单片机中的c语言代码分析做铺垫

专栏链接:

c语言基础语法编程题_1zero10的博客-优快云博客

1、题目展示:

2、问题分析:

首先本题最关键的点就在于怎么找到最小值,然后与a[0]互换位置输出

下面我们一起来分析一下代码

完整代码展示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    while (scanf("%d", &n) == 1) {

        if (n == 0) {
            break;
        }
        int* a = (int*)malloc(n * sizeof(int));
        for (int i = 0;i < n;++i) {
            scanf("%d", &a[i]);
        }
        int min = 0;
        for (int j = 0;j < n;++j) {
            if (a[j] < a[min]) {
                min = j;
            }
        }
        if (min != 0) {
            int tmp;
            tmp = a[0], a[0] = a[min], a[min] = tmp;
        }

        for (int k = 0; k < n; ++k) {
            printf(k == 0 ? "%d" : " %d", a[k]); // 控制空格格式 
        }
        printf("\n");
        free(a);
        a = NULL;
    }
    return 0;
}

6-14行,

1、为了达到分组输入的目的,

每一组第一个数是n,表示这个数后面跟着n个数

所以先用while语句输入n

然后用for语句循环n次输入后面的n个数

2、如果n=0则不执行,用if语句,且要break出来

3、关注变量定义的位置

第6行定义n,第7行才能输入n

第11行开辟动态内存空间准备存n个数,第12,13,14行才能够通过for循环循环n

次输入n个数

15-24行

1、达到找到最小值并且与第一个数交换的目的

2、找最小值

我们一般找最小值都是直接定义min=a[0]

这里有所变化,原因是为了一会儿变量交换好表达

在15-20行,先定义min=0

通过for循环循环n次,每次判断a[i]是否小于a[min],如果小于,就把 i 赋值给min

循环n次以后a[min]存的就是最小值了,但min不一定还是0

在20-25行,通过变量交换,把a[min]的值交换给数组的首元素a[0]

26-29行,控制输出格式,利用for循环+条件判断语句

如果k=0,即如果是数组的首元素那么直接输出这个数,如果不是数组的首元素就输出空格+这个数

然后for循环结束之后,输出一个换行,便于下一组数据的输入输出

30-31行

在前面malloc函数分配动态内存之后释放内存,由此a也变成了悬空指针

因此要标记成空指针

3、最终代码展示:

 

int main() {
    int n;
    while (scanf("%d", &n) == 1) {
        if (n == 0) {
            break;
        }
        int* a = (int*)malloc(n * sizeof(int));
        for (int i = 0;i < n;++i) {
            scanf("%d", &a[i]);
        }
        int min = 0;
        for (int j = 0;j < n;++j) {
            if (a[j] < a[min]) {
                min = j;
            }
        }
        if (min != 0) {
            int tmp;
            tmp = a[0], a[0] = a[min], a[min] = tmp;
        }

        for (int k = 0; k < n; ++k) {
            printf(k == 0 ? "%d" : " %d", a[k]); // 控制空格格式 
        }
        printf("\n");
        free(a);
        a = NULL;
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值