C语言第11天,输入输出缓存和函数

一、输出缓存

例题:输出"HelloWorld"十次,每次输出后暂停500毫秒。

#include<stdio.h>
#include<windows.h>
int main()
{
for (int i = 0; i <= 10; i++)
{
printf("helloworld%d ",i);
Sleep(500);
}
return 0;
}

在windows系统上,我们使用windows.h头文件中提供的Sleep函数,每次输出后休眠500毫秒。

//linux系统

#include<stdio.h>

#include<unistd.h>

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<stdio.h>
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<stdio.h>
#include<conio.h>
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<stdio.h>
#include<conio.h>
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.函数的调用
#include<stdio.h>
int 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<stdio.h>
#include<math.h>//sqrt需要包含math.h
int 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<stdio.h>
#include<math.h>//sqrt需要包含math.h
double 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,c
double 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.形参与实参相互独立
#include<stdio.h>
int 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=2
a=2 b=1
 
那么,如果将交换的代码写到函数里面呢?
#include<stdio.h>
void 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=2
a=1 b=2,可以看到失败了
虽然主函数中的变量a,b与函数中的形式参数a,b变量名相同。但是,它们却是相互独立的变量。调用swap函数并传参时,是将主函数中变量a,b的值,传递给形式参数a,b
 
5.不同函数内的变量相互独立
#include<stdio.h>
void 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);
return 0;}

结果为a in main 0
a in func 100
a in main 0

main函数中声明了一个变量a,并初始化为0。func函数中也声明了一个变量,并赋值为100。从结果中可以看出,这两个变量虽然变量名相同,但是却是两个互相独立的变量

所以函数内声明的变量为局部变量,不同函数内的局部变量相互独立。
作者:麻木无聊原文地址:https://www.cnblogs.com/mmwl/p/16702367.html

%s 个评论

要回复文章请先登录注册