menu

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