一、输出缓存
例题:输出”HelloWorld”十次,每次输出后暂停500毫秒。
#include
#include
int main()
{
for (int i = 0; i <= 10; i++)
{
printf(“helloworld%d “,i);
Sleep(500);
}
return 0;
}
在windows系统上,我们使用windows.h头文件中提供的Sleep函数,每次输出后休眠500毫秒。
//linux系统
#include
#include
int main()
{for(int i=0;i<10;i++)
{printf(“HelloWorld%d”,i);
usleep(1000*500);//使用usleep函数休眠500毫秒}
return 0;}
而在linux系统上,休眠5000毫秒,打印出所有HelloWorld
这是因为在windows系统下,使用printf后,数据被写入到输出缓存区。随后,立即刷新缓存区。
在linux系统下,使用printf后,数据被写入到输出缓存区。后续的printf会在缓存区积累数据,直到程序结束才刷新缓存区。
行缓存:一行结束后必须刷新缓存;
完全缓存:等到缓存区被填满,才刷新缓存。
所以只要Linux系统printf的%d后面加上\n就会实现目标
阻塞
#include
int main()
{
char c1,c2;
c1=getchar();
putchar(c1);
getchar();//用于吸收’\n’,不然\n会被c2吸收,从而c2将不会在输入
c2=getchar();
putchar(c2);
return 0;
}
程序运行到第一个getchar,由于输入缓存区没有数据,getchar进入阻塞状态,等待用户输入。在输入’A’并按回车后,”A\n”进入了输入缓存区。
第一个getchar获取了字符’A’,解除阻塞状态,继续执行。接着用putchar打印c1。
执行到第二个getchar时,由于输入缓存区仍有字符’\n’,第二个getchar将不进入阻塞状态,直接读取缓存区中的’\n’,并继续执行。
2.不带缓存的输入函数
getch函数
#include
#include
int main()
{
while (1)
{
char c;
c=_getch();//输入后,使用putchar打印在控制台上,_为vs的一种要求
putchar(c);
if(c==’q’)
break;
}
return 0;
}
输入”1234567890q”,程序立刻显示”1234567890q”并退出。
getche函数
与getch函数类似,不过它会自己将输入的字符打印在控制台上。getche函数相当于无缓存有回显的getchar。
#include
#include
int main()
{
while (1)
{
char c;
c=_getche();//输入后,使用putchar打印在控制台上
if(c==’q’)
break;
}
return 0;
}
输出结果与getch相同
请注意这两个函数需要包含头文件conio.h才可以被使用。
二、函数
可以把函数看做一个盒子,这个盒子有如下几个特性:1.开始执行时,函数可以被输入一些值2.执行过程中,函数可以做一些事情3.执行完成后,函数可以返回一些值1.函数定义函数的写法公式:函数返回值类型 函数名(函数输入参数值){做点什么事情return函数返回值;}被花括号包括的被称为函数体,注意函数体一定要被花括号包括且不可省略。花括号上面的函数名、函数参数及返回值被称作函数头。例题:定义一个加法函数int add(int a,int b)//不能写成int a,b{return a+b;}2.函数的调用#includeint add(int a,int b){return a+b;}int main(){int result;result=add(2,3);//函数调用printf(“%d”,result);return 0;}main被称作主调函数,add被称作被调函数。在main中,将2,3两个参数传入了add函数,并调用add函数。在add函数头中,标明了函数的返回值类型为int,说明这个函数被调用后将返回一个int类型的结果。所以,我们使用int类型的result变量存放add函数的返回值。3.为什么要用函数例题:求一个三角形面积先用代码写一遍#include#include//sqrt需要包含math.hint main(){//输入a,b,c double a,b,c,p,s;scanf(“%lf%lf%lf”,&a,&b,&c);//是否能构成三角形if(a+b>c&&a+c>b&&b+c>a){printf(“It’s atriangle\n”);}else{//无法构成三角形,程序结束。printf(“Notatriangle\n”);return 0;}//求三角形的面积p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));//海伦公式//输出结果printf(“s=%f”,s);return 0;}再使用函数#include#include//sqrt需要包含math.hdouble area Of Triangle(double a,double b,double c){double p,s;//求三角形的面积p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));return s;}int isTriangle(double a,double b,double c){//是否能构成三角形if(a+b>c&&a+c>b&&b+c>a){return 1;}return0;}int main(){//输入a,b,cdouble a,b,c;scanf(“%lf%lf%lf”,&a,&b,&c);//是否能构成三角形if(isTriangle(a,b,c)==0){printf(“Not a triangle\n”);return 0;}//求三角形的面积double s;s=area Of Triangle(a,b,c);printf(“area of triangle is %f”,s);return 0;}优点是在主函数中可以反复调用4.形参与实参相互独立#includeint main(){int a,b;//形参int temp;a=1;b=2;//实参printf(“a=%d b=%d\n”,a,b);//交换a,b变量temp=a;a=b;b=temp;printf(“a=%d b=%d\n”,a,b);return 0;}结果为a=1 b=2a=2 b=1那么,如果将交换的代码写到函数里面呢?#includevoid swap(int a,int b){int temp=a;a=b;b=temp;}int main(){int a,b;int temp;a=1;b=2;printf(“a=%d b=%d\n”,a,b);//交换a,b变量swap(a,b);printf(“a=%d b=%d\n”,a,b);return 0;}结果为a=1 b=2a=1 b=2,可以看到失败了虽然主函数中的变量a,b与函数中的形式参数a,b变量名相同。但是,它们却是相互独立的变量。调用swap函数并传参时,是将主函数中变量a,b的值,传递给形式参数a,b5.不同函数内的变量相互独立#includevoid func(){int a;a=100;printf(“a in func %d\n”,a);}int main(){int a=0;printf(“a in main %d\n”,a);func();printf(“a in main %d\n”,a);return0;}
结果为a in main 0
a in func 100
a in main 0
main函数中声明了一个变量a,并初始化为0。func函数中也声明了一个变量,并赋值为100。从结果中可以看出,这两个变量虽然变量名相同,但是却是两个互相独立的变量
所以函数内声明的变量为局部变量,不同函数内的局部变量相互独立。