while循环和do循环、缓冲区、一维数组

缓冲区

输入缓冲区

从键盘得到数据的时候用户输入的数据首先进入输入缓冲区,然后程序从输入缓冲区里获得数字,先进入输入缓冲区的数据必须先处理(类似排队),如果先进入输入缓冲区的数据无法处理,程序就得不到后进入输入缓冲区的数据。使用以下两条固定语句可以删除输入缓冲区里的无效数据:

scanf("%*[^\n]");	//删除输入缓冲区里第一个'\n'符前面的所有内容
scanf("%*c");		//删除输入缓冲区里第一个字符

输出缓冲区

printf标准函数把要显示的内容放在输出缓冲区里,计算机在合适的时候把输出缓冲区里的内容显示在屏幕上,以下四种情况下输出缓冲区里的内容会显示在屏幕上:

1.如果输出缓冲区里包含换行字符则换行字符前面的部分会显示在屏幕上

2.如果程序结束了则它放在输出缓冲区里的内容会显示在屏幕上

3.如果输出缓冲区被充满了则它里面的内容会显示在屏幕上

4.在程序里使用一条固定语句 fflush(stdout);可以强制把输出缓冲区里的内容显示在屏幕上(scanf函数也有这样的作用)

数组

数组可以用来代表内存里一组连续的同类型的存储区,这些存储区叫做数组的元素,数组也需要先声明然后才能使用,声明数组的时候除了需要提供类型名称和数组名称以外还需要提供一个整数表示数组里的存储区个数。

数组一旦存在它里面包含的存储区个数就不可以改变了,数组通常不可以作为整体使用,一般一次只使用其中的某个存储区,数组里每个存储区的编号不同,这个编号叫做数组的下标,数组里第一个存储区的下标是0,向后依次递增,最大下标是存储区个数减一,超过范围的下标不可以使用(类似闯红灯)

数组名称和下标一起可以用来表示数组里的存储区,可以在for循环里依次处理数组里的所有存储区 ,这个循环的循环变量应该依次代表数组里的所有有效下标,初始化数组的时候可以提供多个数据,他们应该写在一对大括号中间,相邻初始化数据之间用括号分开,初始化数组的时候如果初始化数据的个数比存储区的个数多就把多余的初始化数据忽略。

初始化数组的时候如果初始化数据的个数比存储区的个数少就把后面的存储区初始化成0,初始化数组的时候如果初始化数据的个数和数组里存储区的个数一样多就可以省略数组声明里的存储区个数。

练习:编写程序从键盘得到多个数字(数字个数不超过5个,由用户实现给定),把这些数字按照倒序显示在屏幕上,然后计算这些数字的和并把结果显示在屏幕上。

练习:编写程序得到一张彩票(彩票由7个1到36之间的整数构成),然后把彩票里的所有数字显示在屏幕上。

数组名称不可以代表存储区,数组名称可以用来代表第一个存储区的地址,数组名称不可以被赋值,可以对数组名称进行sizeof计算,结果是数组里所有存储区的总大小。C99规范里允许使用变长数组,声明变长数组的时候使用变量表示数组里的存储区个数。

变长数组

如果多次运行这个程序则每次变长数组里包含的存储区个数都可能不同。在某一次运行程序的过程中变长数组里包含的存储区个数不会改变,变长数组不可以初始化

一维数组

声明一维数组时只需要用一个整数表示数组里的存储区个数

多维数组

多维数组不仅可以表示多个存储区,还可以对他们进行分组(分组可以多次进行)。

二维数组

二维数组是最常见的多维数组,他只能表示存储区的一次分组情况,声明二维数组的时候需要提供两个整数,第一个整数表示分组个数,第二个整数表示分组里的存储区个数。二维数组通常也不能作为整体 使用,一般一次只使用其中某个存储区,表示二维数组里存储区的时候需要提供两个下标,前一个下标表示分组编号(组下标),后一个下标表示分组里的存储区编号(组内下标),组下标的有效范围从0开始到分组个数减一为止;组内下标的有效范围从0开始到分组里存储区个数减一为止。

可以把二维数组当作一维数组进行初始化,也可以在初始化二维数组的时候对初始化数据进行分组,每组初始化数据用来初始化一组存储区。如果可以根据初始化数据个数计算出分组个数就可以省略二维数组声明里的分组个数。

点击查看代码
/*
 *
 *
 *输入缓冲区管理
 *
 *
 * */
#if 0
#include<stdio.h>
int main (){
	int num = 0;
	printf("请输入一个数字:\n");
	scanf("%d",&num);
	scanf("%*[^\n]");
	scanf("%*c");
	printf("num=%d\n",num);
	printf("请输入一个数字:\n");
	scanf("%d",&num);
	printf("num=%d\n",num);
	return 0;	
}

#elif 0
/*
 *
 *输出缓冲区
 *
 *
 * */
#include<stdio.h>
int main (){
	printf("1");
	fflush(stdout);
	while (1){
	}
	return 0;
}


#elif 0

/*
 *
 *数组演示
 *
 * */
#include<stdio.h>
int main (){
	int arr[5]; 	//数组声明语句
	int num = 0;
	arr[2] = 10;
	for (num = 0;num <= 4;num ++){
		arr[num] = num;
	}
	for (num = 4;num >= 0;num --){
		printf(" %d ",arr[num]);
		}
	     printf("\n");
	return 0;
}

#elif 0
/*
 *
 *数组练习
 *
 *
 * */
#include<stdio.h>
int main (){
	int arr[5] = {0};
	int qty = 0,num = 0,sum = 0; 			//用户输入的数字个数qty <5
	printf("请输入数字个数:\n");
	scanf("%d",&qty);
	for (num = 4;num >= 0;num--){
		printf("请输入一个数字:\n");
		scanf("%d",&arr[num]);
		if (num == 5 - qty){
			//检查数组是否被填满
			break;
		}
	}
	for (num = 5 - qty;num <= 4;num++){
		printf("%d",arr[num]); 		//倒序显示用户输入的数字
	}
	printf("\n");
	for (num = 5 - qty;num <= 4;num++){
		sum += arr[num];
	}
	printf("求和结果是: %d  \n",sum);
	return 0;
}

#elif 0
/*
 *
 *得到7个1到36之间的随机数
 *将数字显示出来
 *
 * */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main (){
	int num = 0,tmp = 0,cnt = 0,num1 = 0; 			//cnt 用于记录已经得到有效数字
	int arr[7] = {0},arr1[7] = {0};
	srand(time(0));
	/*for (num = 0;num <= 6;num++){
		arr[num] = rand() % 36 + 1;
		}//含有重复的数字
		*/
	do {
			tmp = rand() % 36 + 1;
			for (num = 0;num <= cnt - 1;num++){ 		//把新数字和以前得到的所有数字依次作对比
				if (tmp == arr[num]){
					break;
				}
			}
			if (num == cnt){
				arr[cnt] = tmp;
				cnt++;
			}
	}while(cnt < 7);
	for (num = 0;num <= 6;num++){
		printf(" %d",arr[num]);
	}
	printf("\n");
	for (num = 0;num <= 6;num++){
		printf("请输入一个数字:\n");
		scanf("%d",&arr1[num]);
	}
	cnt = 0;
	for (num = 0;num <= 6;num++){
		for (num1 = 0;num1 <= 6;num1++){
			if (arr[num] == arr1[num1]){
				cnt++;
				break;
			}
		}
	}
	printf("买对的数字个数%d\n",cnt);
	return 0;
}


#elif 0

#include<stdio.h>
int main (){
	int arr[5] = {0};
	printf("arr是%p\n",arr);
	printf("arr[0]是%p\n",&arr[0]);
	printf("sizeof(arr)=%ld\n",sizeof(arr));
	return 0;
}

#elif 0
#include<stdio.h>
int main (){
	int size = 0;
	printf("请输入一个数字:");
	scanf("%d",&size);
	int arr[size]; 		//变长数组
	printf("sizeof(arr)=%ld\n",sizeof(arr));
	return 0;
}


#elif 1
/*
 *
 *
 *二维数组
 *
 * */
#include<stdio.h>
int main (){
	int arr[3][2],cnt = 0;
   //	arr[1][0] = 0;
	int row = 0, col = 0;
	for (row = 0;row <= 2;row++){
		for (col = 0;col <= 1;col++){
			arr[row][col] = cnt;
			cnt++;
		}
	}
	for (row = 0;row <= 2;row++){
		for (col = 0;col <= 1;col++){
			printf(" %d ",arr[row][col]);
		}
		printf("\n");
	}
	return 0;
}
#endif