目录
前言:
开新专栏了,讲解100道基础语法编程题
用c语言讲解
目的是复习c语言中的基础语法,为单片机中的c语言代码分析做铺垫
专栏链接:
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;
}