1.从键盘得到数据的时候用户输入的数据,首先进入输入缓冲区,然后程序从输入缓冲区里获得数字。
先进入输入缓冲区的数据必须首先处理。
如果先输入缓冲区的数据无法处理,程序就会得不到后进入输入缓冲区的数据。
例子:
输出结果分析:输入一个带小数点的数字,计算机将不会知道怎么处理,就会出现错误
使用以下两条固定语句可以删除输入缓冲区里的无效数据。
2.scanf("%*[^\n]"); //删除输入缓冲区里第一个'\n'字符前面的所有内容
scanf("%*c"); //删除输入缓冲区的里的第一个字符
修改后例子:
输出结果:
3.printf标准函数把要显示的内容放在输出缓冲区里,计算机在合适的时候把输出缓冲区里的内容显示在屏幕上。
例子:
输出结果:没有输出
以下四种情况下输出缓冲区里的内容会显示在屏幕上:
(1)如果输出缓冲区里包含换行字符,则换行字符前面的部分会显示在屏幕上。
例子:
输出结果:正常输出1
(2)如果程序结束了,则它放在输出缓冲区的内容会显示在屏幕上。
例子:
输出结果:正常输出1
(3)如果输出缓冲区被充满了,则它里面的内容会显示在屏幕上。
例子:
输出结果:屏幕上输出了很多个1
(4)在程序里使用fflush(stdout);可以强制把输出缓冲区里的内容显示在屏幕上。
例子:
输出结果:成功输出1
注意: scanf和fflush(stdout);函数一样会强制把输出缓冲区的内容显示在屏幕上。
4.数组可以用来代表内存里一组连续的同类型存储区。
这些存储区叫做数组的元素。
数组也需要先声明然后才能使用。
声明数组的时候除了要提供类型名称和数组名称以外,还需要提供一个整数表示数组里的存储区个数。
数组一旦存在它里面包含的存储区个数就不可以改变了。
例子:
数组通常不会作为整体使用,一般一次只使用其中的某个存储区。
数组里每个存储区有一个编号,不同存储区的编号不同。这个编号叫做数组的下标。
数组里第一个存储区的下标是0,向后依次递增。
最大下标=存储区个数-1
超过范围的下标不可以使用。
数组名称和下标一起可以用来表示数组里的存储区。
例子:
可以在for循环里依次处理数组里的所有存储区。
这个循环的循环变量应该依次代表数组里的所有有效下标。
例子:
初始化数组的时候可以提供多个初始化数据,它们应该写在一对大括号中间,相邻初始化数据之间用逗号分开。
初始化数组的时候如果初始化数据的个数比存储区的个数多,就会把多余的初始化数据忽略。
例子:
输出数组的结果:0 1 2 3 4
初始化数组的时候如果初始化数据的个数比存储区的个数少,就会把后面存储区初始化为0
例子:
输出数组的结果:0 1 2 0 0
初始化数组的时候如果初始化数据的个数和数组里存储区的个数一样多,就可以省略数组声明里的存储区个数。
例子:
练习:
#include <stdio.h>
int main(){
int array[5]={0},num=0,num1=0;
printf("请输入数字个数:");
scanf("%d",&num);
printf("请输入数字:");
for(int i=0;i<num;i++)
{
scanf("%d",&array[i]);
}
for(int j=num-1;j>=0;j--)
{
printf("%d ",array[j]);
}
printf("\n");
for(int s=0;s<num;s++)
{
num1+=array[s];
}
printf("求和结果为:%d\n",num1);
return 0;
}
运行结果:
练习:
方法一:这个方法不完整,因为一组彩票号码不能有相同的两个数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(0));
int array[6]={0},num=0,num1=0;
for(int i=0;i<7;i++)
{
array[i]=rand()%36+1;
}
for(int j=0;j<7;j++)
{
printf("%d ",array[j]);
}
printf("\n");
return 0;
}
完善后的程序,先把随机数赋值到num变量里,然后后面开始检查随机数是与前面的数依次比较,判断是否有相同的数出现num==array[i],如果出现就退出循环,也将不进行数组赋值 array[sub] = num;,所以不会出现相同的数,直到数组的下标sub为6时循环停止。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(0));
int array[6]={0},num=0,sub=0,i=0;
do{
num = rand()%36+1;
for(i=0;i<=sub-1;i++){//把新数字和以前得到的所有数字依次作对比
if(num==array[i]){
break;
}
}
if( i == sub){
array[sub] = num;
sub++;
}
}while(sub<7);
for(int j=0;j<7;j++)
{
printf("%d ",array[j]);
}
printf("\n");
return 0;
}
练习:彩票进阶板,让购买彩票的人输入他购买的彩票号,计算他买中了多少个号码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(0));
int array[6]={0},num=0,i=0,sub=0;
do{
num=rand()%36+1;//先将随机数赋值到num变量里
//把新出的数字和之前的数字进行比较,变量sub相当于数组array的下标
for(i=0;i<=sub-1;i++){
if(num == array[i]){
break;
}
}
if(i == sub){
array[sub] = num;
sub++;
}
}while(sub<7);
for(int e=0;e<7;e++)
{
printf("%d ",array[e]);
}
printf("\n");
int array1[6]={0},ans=0;
printf("请输入你的彩票号码:");
for(int s=0;s<7;s++)
{
scanf("%d",&array1[s]);
}
for(int j=0;j<7;j++){
for(int a=0;a<7;a++){
if(array[j]==array1[a]){
ans++;
break;
}
}
}
printf("你中了%d个号码\n",ans);
return 0;
}
运行结果:
5. 数组名称不可以用来代表存储区
数组名称可以代表数组里第一个存储区的地址
例子:
输出结果:
数组名称不可以被赋值
可以对数组名称进行sizeof计算,结果是数组里所有存储区的总大小。
例子:
输出结果:20(一个int类型是4字节,5个就是20字节)
C99规范里允许使用变长数组
声明变长数组的时候使用变量表示数组里的存储区的个数。
例子:
如果多次运行这个程序,则每次变长数组里包含的存储区个数都可能不同。
在某一次运行程序的过程中变长数组里包含的存储区个数不会改变。
变长数组不可以初始化。
例子:
运行结果:每次编译程序都可以改变数组的个数
6.声明一维数组时只需要用一个整数,表示数组里的存储区个数。
多维数组不仅可以表示多个存储区,还可以对它们进行分组。(分组可以多次进行)
7.二维数组是最常见的多维数组,它只能表示存储区的一次分组情况。
声明二维数组的时候需要提供两个整数,第一个整数表示分组个数,第二个整数表示分组里的存储区个数。
二维数组通常也不能作为整体使用,一般一次只能使用某个存储区。
表示二维数组里存储区的时候需要提供两个下标,前一个下标表示分组编号(组下标),后一个下标表示分组里的存储区编号(组内下标)
组内下标的有效范围从0开始到分组里存储区个数减一为止。
例子:
例子:输出二维数组:
#include <stdio.h>
int main(){
int array[3][2]={1,2,3,4,5,6};
for(int i=0;i<3;i++)
{
for(int j=0;j<2;j++)
{
printf("%d ",array[i][j]);
}
printf("\n");
}
return 0;
}
输出结果:
可以把二维数组当作一维数组进行初始化。
也可以在初始化二维数组的时候对初始化数据进行分组,每组初始化数据用来初始化一组存储区。
例子:
运行结果:
如果可以根据初始化数据个数计算出分组个数就可以省略二维数组声明里的分组个数。
例子:
输出结果: