06:缓冲区、一维数组

来源:互联网 发布:h.323端口号 编辑:程序博客网 时间:2024/05/21 05:42

|   缓冲区

在不同速度的设备之间传递数据需要使用缓冲区。

scanf函数工作时需要使用一个叫做输入缓冲区的缓冲区。

用户在键盘上输入的内容首先进入缓冲区,程序从输入缓冲区里获得数字。先进入缓冲区里的数字必须首先处理。

如果用户输入的格式和程序要求的不一致,则会导致从这个数据开始的所有数组都无法处理。

可以使用下面2条语句,把输入缓冲区里的错误的数据丢弃:

       scanf(“*[^\n]”); //把缓冲区第一个换行字符前的内容丢弃。

       scanf(“%*c”);     //把换行字符丢弃。

printf函数使用了输出缓冲区。输出缓冲区里的内容在如下四种情况下,才会显示:

       ① 如果输出缓冲区里有‘\n’换行字符,则它前面所有内容显示在屏幕上;

       ② 程序结束后,所打印的内容会显示在屏幕上;

       ③ 当输出缓冲区被充满的时候,里面的内容会显示在屏幕上;

       ④ 在程序中使用fflush(stdout);语句可以把输出缓冲区里的内容显示在屏幕上。


l   数组

可以用来代表内存中一组连续的同类型的存储区。

数组也需要先声明,再使用。

因为变量名可以当数用,所以在声明数组的时候可以直接用变量名作为下标,即

       数组名[变量名]        arr[num]       声明时为: int  arr[num];

声明数组的时候需要提供类型名称数组名称,除此之外还需要一个存储区个数

       数组名[下标]    arr[5]

       int arr[5] ={1,2,3,4,5};  //声明整型数组arr,包含5个存储区,即元素个数

数组一旦存在,则里面包含的存储区个数不可改变。

数组一般不可以作为整体使用,通常一次只能使用其中一个存储区。

数组中每个存储区都有一个编号,叫做数组的下标(或索引)。

下标的范围从0开始到元素个数减1为止,超过范围的下标不可以使用(即不能越界)。

下标就可以用来表示数组中的存储区。

可以使用for循环依次处理数组中每个存储区(元素),在这个循环里循环变量依次代表元素的下标。

数组应该初始化:

       ① 数组初始化的时候应该把初始化的数据写在大括号{}里面,不同数字之间用逗号,分开;

       ② 计算机把所有初始化数据按照从前到后的顺序依次初始化数组中的每个元素;

       ③ 如果初始化数据多于元素个数,则多余的数据会自动忽略;

       ④ 如果初始化数据少于元素个数,则后面元素自动被初始化成0;

       ⑤ 如果初始化数据和元素个数一致的时候,则可以省略数组声明中的个数,如 int arr[] = {1,2,3};

数组长度是元素的个数,不是整体所占的字节数。

数组名称不可以代表任何存储区。

数组名称代表的是第一个存储区的地址数据。

可以对数组名称进行sizeof计算,结果是数组中所有存储区所包含的字节个数的总和。即

       sizeof(数组名)   或   sizeof(数组名[0])

练习:把身份证里前17个号码分别和这17个数字相乘(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2),把所有乘积求和然后对11取余,用这个余数作为编号从下面11个数字中挑出丢应数字(1,0,X,9,8,7,6,5,4,3,2),这个数字就是身份证最后一个数位上的数字。(即让用户逐个输入17个数字,最后打印出身份证第18位数)

 

#include <stdio.h>int main(){int arr[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};int code[] = {1,0,10,9,8,7,6,5,4,3,2};//10代表的是大写X,即有些身份证最后一位Xint card[17] = {};int num = 0,sum = 0;for(num = 0;num < 17;num++){printf("请在每行逐个输入身份证号上的1位数字:");scanf("%d",&card[num]);}for(num = 0;num < 17;num++){sum += card[num] * arr[num];}if(code[sum % 11] == 10)printf("你的身份证最后1位校验码是X。\n");elseprintf("你的身份证最后1位校验码是%d。\n",code[sum % 11]);return 0;}

练习:编写程序从键盘上得到一个非负数,统计出每个数字在各数位上出现的次数,并打印结果到屏幕上。

#include <stdio.h>int main(){int i = 0;int arr[10] = {};printf("请输入一个数字:");scanf("%d",&i);do{arr[i % 10]++;i /= 10;}while(i);for(i = 0;i < 10;i++)printf("每个位数出现次数为:%d\n",arr[i]);return 0;}


【数组】
数组可以代表内存里一组连续的同类型存储区
数组也需要先声明后使用
数组声明语句中需要包括类型名称/数组名称/数组包含的存储区个数
数组一旦存在则里面包含的存储区个数不可以改变
通常不会把数组当作整体来使用,一次只使用其中的某个存储区
数组里每个存储区有一个编号,这个编号叫做数组的[下标]
第一个下标的存储区是0,向后依次递增
下标的有效范围从0开始到存储区个数-1为止,超过范围的下标不能使用
可以在一个for循环里依次处理数组中每个存储区
这个循环里可以让循环变量代表每个存储区的下标
数组应该初始化
初始化数组的时候需要提供多个初始化数据,1个数据用来初始化1个存储区
所有初始化数据应该写在一对大括号里面,相邻数据之间用逗号分开
如果初始化数据个数比存储区个数多,系统会把多余的数据丢弃
如果初始化数据个数比存储区个数少,系统会把后面的存储区初始化为0
如果初始化数据个数与存储区个数一样,可以省略数组声明中的存储区个数

【练习】
编写程序从键盘得到多个整数,数量不超过5个;
把他们按照反序显示在屏幕上;
再计算所有整数的和并显示在屏幕上。
<思想>
用户输入数字数量,然后输入数字,累加求和,倒序打印
/*代码*/

#include <stdio.h>int main(){    int i = 0, num = 0, sum = 0;    printf("想要输入的数字数量:");    scanf("%d", &i);    int arr[i];    for(num = 0; num < i; num++){        printf("请输入数字:");        scanf("%d", &arr[num]);        sum += arr[num];    }       for(num = i-1; num >= 0; num--){        printf("%d ", arr[num]);    }       printf("\n");    printf("求和结果为:%d\n", sum);    return 0;}



0 0
原创粉丝点击