C语言学习笔记1
C语言中对数字的排序方法有多种,但是这个程序的要求是:
将若干个浮点数进行大小排列,且最多有32767个数字,当用户在数字个数错误输入的时候提醒用户
也就是说,数字的个数和大小都是由用户输入的。
所以,不能够单纯定义成int i,j,k,n;
这样。
我想到了数组。
根据要求,要满足最多32766个数字,定义数组的方式可以这样:
double p[32766];//0-32766,共32767个数字,不过有一个作为保留
当然,需要定义几个整形变量以作为排序的依据:
int a,i,j,k;
接下来是让用户输入多少数字:
printf("how many numbers do you want to input?\n");
scanf("%d",&a);
接下来就是比较困难的一部分了:如何在用户输入错误的时候提醒用户重新输入。
这里需要使用一下while
循环,先写个型:
while(a>32766 || a<=0){
if(a>32766) {
printf("max value 32766.please retry.\n");
scanf("%d",&a);
}
if(a<=0) {
printf("value must bigger than 0.please retry.\n");
scanf("%d",&a);
}
continue;
}
然而问题来了:
如果用户输入的是字母该怎么提醒用户呢?
起先我想在scanf("%d",&a);
这行修改一下:
int check
check=scanf("%d",&a);
将check=0
添加到while
循环的条件中;
后来在linux上运行时测试发现会出现无限循环的问题。
经过大佬指点,发现linux上不会自动消除某变量的内存地址。
所以他这么修改了一下:
while(a>32766 || a<=0 || getchar()!='\n') { //getchar!='\n'的意思是判断输入的字符串不是换行符(是字符串,而不是数据)
if(getchar()!='\n') {
printf("not a number.please retry\n");
scanf("%d",&a);
}
if(a>32766) {
printf("max value 32766.please retry.\n");
scanf("%d",&a);
}
if(a<=0) {
printf("value must bigger than 0.please retry.\n");
scanf("%d",&a);
}
continue;
}
到了这里,容错任务完成了。接下来是输入数据与排序环节:
由于不清楚数据的数量,我们需要用到for
循环。
起初我的代码是这样的:
printf("input numbers:\n");
for(i=0; i<a; i++) {
scanf("%lf",&p[i]);
}
for(i=0; i<a; i++) {
for(j=i+1; j<a; j++) {//j=i+1为数组的下一个数据
if (p[i]<p[j]) {
k=p[i];
p[i]=p[j];
p[j]=k;//交换i与j
}
}
}
for(i=0; i<a; i++) {
printf("%g, ",p[i]);//使用%g防止数据小数过长
然而运行效果不尽人意:
最后一个数据与bash符号隔了一个”, “而且没有换行,有些违和感。
于是我稍微改动了下:
for(i=0; i<a-1; i++) {
printf("%g, ",p[i]);
}
printf("%g\n",p[a-1]);
将数组的最后一个数字加上换行符。
于是运行结果很好。
运行结果:
$ ./p
how many numbers do you want to input?
a
not a number.please retry
38888888
max value 32766.please retry.
0
value must bigger than 0.please retry.
5
input numbers:
7589
9352
74
8858
87
9352, 8858, 7589, 87, 74
$
源代码如下:
#include <stdio.h>
int main() {
int a,i,j,k;
double p[32767];
printf("how many numbers do you want to input?\n");
scanf("%d",&a);
while(a>32766 || a<=0 || getchar()!='\n') {
if(getchar()!='\n') {
printf("not a number.please retry\n");
scanf("%d",&a);
}
if(a>32766) {
printf("max value 32766.please retry.\n");
scanf("%d",&a);
}
if(a<=0) {
printf("value must bigger than 0.please retry. \n");
scanf("%d",&a);
}
continue;
}
printf("input numbers:\n");
for(i=0; i<a; i++) {
scanf("%lf",&p[i]);
}
for(i=0; i<a; i++) {
for(j=i+1; j<a; j++) {
if (p[i]<p[j]) {
k=p[i];
p[i]=p[j];
p[j]=k;
}
}
}
for(i=0; i<a-1; i++) {
printf("%g, ",p[i]);
}
printf("%g\n",p[a-1]);
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soloopooo的小窝!