c语言按任意键退出程序中自己设计的函数变量参数应该是什么,任意的符号吗

3.2数据的表现形式及其运算
3.2.1 常量和变量
1)整型常量
2)实型常量.1.十进制小数形式,由数字和小数点组成.2.指数形式
3)字符常量.1.普通字符,用单撇号括起来的一个字符.2.转义字符.
一个单撇号(')
具有此八进制码的字符
一个双撇号(&)
输出此字符
一个问号(?)
输出此字符
一个反斜线(\)
输出此字符
警告(alert)
产生声音或视觉信号
退格(backspace)
将当前位置后退一个字符
换页(form feed)
将当前位置移到下一页的开头
将当前位置移到下一行的开头
回车(carriage return)
将当前位置移到本行的开头
水平制表符
将当前位置移到下一个tab位置
垂直制表符
将当前位置移到下一个垂直制表对齐点
\o,\oo或\ooo
其中o代表一个八进制数字
与该八进制码对应的ASCII符
与该八进制码对应的字符
\xh[h···]
其中h代表一个十六进制数字
与该十六进制码对应的ASCII符
与该十六进制码对应的字符
4)字符串常量.用双撇号把若干字符括起来,字符串常量是双撇号中的全部字符(不包括双撇号本身).单撇号内只能包含一个字符,双撇号内可以包含一个字符串.(这个地方和JS不同,JS用单双都可以)
5)符号常量.用#define指令,指定用一个符号名称代表一个常量.
#define PI 3.1416
//注意行末没有分号
经过以上的指定,本文件从此行开始所有PI都代表3.1416.在对程序进制编译前,预处理器先对PI进行处理,把所有的PI全部置换为3.1416.
在预编译后,符号常量已全部变成字面常量(3.14159).
使用符号常量的好处:含义清楚,在需要改变时&一改全改&.
注意:要区别符号常量和变量,不要把符号常量误认为变量.符号常量不占内存,只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋以新值.为与变量名相区别,习惯上符号常量用大写表示.
变量代表一个有名字的,具有特定属性的一个存储单元.它用来存放数据,也就是存放变量的值.在程序运行期间,变量的值是可以改变的.
变量必须先定义,后使用.
在定义时指定该变量的名字和类型.一个变量应该有一个名字,以便引用.请注意区别变量各和变量值这两个不同的概念.变量名实际上是以一个名字代表的一个存储地址.在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址.从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据.
const int a=<span style="color: #;
表示a被定义为一个整形变量,指定其值为3,而且在变量存在期间其值不能改变.
常变量与常量的异同:常变量具有变量的基本属性:有类型,占存储单元,只是不允许改变其值.可以说,常变量是有名字的不变量,而变量是没有名字的不变量.有名字就便于在程序中被引用.
在计算机高级语言中,用来对变量,符号常量名,函数,数组,类型等命名的有效字符序列统称为标识符.标识符就是一个对象的名字.
C语言规定标识符只能由字母,数字和下划线3种字符组成,且第1个字符必须为字母或下划线.
一般变量名用小写,增加可读性,大小写是不同的字符.
3.2.2 数据类型
所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式.不同的类型分配不同的长度和存储形式.
基本类型和枚举类型变量的值都是数值,统称为算术类型.
算数类型和指针类型统称为纯量类型,因为其变量的值是以数字来表示的.
枚举类型是程序中用户定义的整数类型.
数组类型和结构体类型统称为组合类型,共用体类型不属性组合类型,因为在同一时间内只有一个成员具有值.
函数类型用来定义函数,描述一个函数的接口,包括函数返回值的数据类型和参数的类型.
不同类型的数据在内存中占用的存储单元长度是不同的.
3.2.3 整型数据
1.整型数据的分类
1)基本整型(int型)
编译系统分配给int数据2个字节或4个字节.在存储单元的存储方式是:用 整数的补码形式存放.一个正数的补码是此数的二进制形式,一个负数的补码是:先将它绝对值写成二进制形式,然后对其后面所有各十进位接位取反,再加1.
在存放整数的存储单元中,最左边一位是用来表示符号的,如果该位为0,表示数值是正,如果该位为1,表示数值为负.
2)短整型(short int)
类型名为short或short int.如用Visual C++ 6.0,编译系统分配给int数据4个字节,短整型2个字节.
3)长整型(long int)
类型名为long int 或long.如用Visual C++ 6.0,编译系统分配给long数据4个字节.
4)双长整型(long long int)
类型名为long long int或long long.一般分配8个字节,新增类型,许多C编译系统尚未实现.
C标准没有具体规定各种类型数据所占用存储单元的长度,这是由各编译系统自行决定的.
sizeof(short)&=sizeof(int)&=sizeof(long)&=sizeof(long long)
sizeof是测量类型或变量长度的运算符.
2.整型变量的符号属性
有些数据的范围常常只有正值,可以将变量定义为&无符号&类型,在前面加上修饰符unsigned,表示指定该变量为&无符号整数类型&.如果加上修改符signed,则是&有符号类型&.
如果既未指定为signed也未指定为unsigned,默认为&有符号类型&.
1)只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加.
2)对无符号整型数据用&%u&格式输出.%u表示用无符号十进制数的格式输出.
在将一个变量定义为无符号 整型后,不应向它赋予一个负值,否则会得到错误的结果.
3.2.4 字符型数据
1.字符和字符代码
并不是任意写一个字符,程序都能识别,只能使用系统字符集中字符,大数系统采用ASCII字符集.
各种字符集的甘醇集都包括127个字符,包括:字母(大写,小字英文字母),数字0~9,专门符号29个:! & #&#160; & ' ( ) * + ,&#160; - · / : ; & = & ? [ \ ] ^ _ { | } ~, 空格符:空格,水平制表符(tab),垂直制表符,换行,换页(form feed).不能显示的字符:空(null)字符(以'\0'表示),警告(以'\a’表示),退格(以’\b’表示),回车(以'\r'表示)等.
所有127个字符都可以用7个二进位表示,所以在C中,指定用1个字节(8位)存储一个字符.此时,字节中的第1位置为0.
注意:字符'1'和整数1是不同的概念,字符'1'只是代表一个形状为'1'的符号,在需要时按原样输出,在内存中ASCII码形式存储,占1个字节.而整数1是以整数存储方式(二进制补码方式)存储的,占2个字节或4个字节.
2.字符变量
字符变量是用类型符char定义的字符变量.
#include &stdio.h&
#include &stdlib.h&
int main()
char c='?';
printf(&%d %c\n&,c,c);
return <span style="color: #;
输出63 ?,'?'的ASCII代码是63,系统把整数63赋给变量c.c是字符变量,实质上是一个字节的整形变量,由于它常用来存放字符,所以称为字符变量.可以把0~127之间的整数赋给一个字符变量.在输出字符变量的值时,可以选择以十进制整数形式输出,或以字符形式输出.
3.2.5 浮点型数据
浮点型数据是用来表示具有小数点的实数的.在C语言中,实数是以指数形式存放在存储单元中的.一个实数表示为指数可以有不上一种形式.由于小数点位置可以浮动,所以实数的指数形式称为浮点数.
规范化指数形式:小数点前为0,小数点后第1位不为0.
浮点数类型包括:float(单精度浮点型),double(双精度浮点型),long double(长双精度浮点型).
1)float型.分配4个字节,数值以规范化的二进制数指数形式存放在存储单元中.在存储时,系统将实型数据分成小数部分和指数部分两个部分分别存放.float型数据能得到6位有效数字.
2)double型.分配8个字节.可以得到15位有效数字.
3)long double型.不同编译系统对其分配不同.
3.2.6 怎么确定常量的类型
从常量的表示形式即可以判定其类型.对于字符常量很简单,只要看到由单撇号括起来的单个字符或转义字符就是字符常量.
整型常量.不带小数点的数值是整型常量,但应注意其有效范围.
在一个整数的末尾加大写字母L或小写字母l,表示它是长整型(long int).
浮点型常量.凡以小数形式或指数形式出现的实数,是浮点型常量,在内存中都以指数形式存储.C编译系统把浮点型常量都按双精度处理,分配8个字节.
可以在常量的末尾加专用字符,强制指定常量的类型.
注意:要区分类型和变量.
每个变量都属于一个确定的类型,类型是变量的一个重要的属性.变量是占用存储单元的,是具体存在的实体,在其占用的存储单元中可以存储数据.而类型是变量的共性,是抽象的,不占用存储单元,不能用来存储数据.
3.2.7 运算符和表达式
1.基本的算术运算符:+(正号运算符,单目运算符) –(负号运算符,单目运算符) * / % +(加) -(减)
两个实数相除的结果是双精度实数,两个整数相除的结果是整数.如果除数或被除数有一个值为负值,则舍入方法不固定.
%运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数.
除%以外的运算符的操作数都可以是任何算术类型.
2.自增,自减运算符
注意:自增运算符(++)和自减(--)只能用于变量,而不能用于常量或表达式.常量的值不能改变.
自增(减)运算符常用于循环语句中,使循环变量自动加1;也用于指针变量,使指针指向下一个地址.
3.算术表达式和运算符的优先级与结合性
在表达式求值时,先按运算符的优先级别顺序执行,级别相同按&结合方向&处理,算法运算符的结合方法都是&自左至右&.赋值运算符按从右到左的顺序.
4.不同类型数据间的混合运算
如果一个运算符的两侧的数据类型不同,则先自动进行类型转换,使二者具有同一种类型,然后进行运算.
1)+,-,*,/运算中有一个数为float或double型,系统会将所有float型数据都先转换成double型,结果是double.
2)如果int型与float型或double型数据进行运算,先把int型和float型数据转换成double型,然后进行运算,结果是double型.
3)字符(char)型数据与整型数据进行运行,就是把字符的ASCII代码与整型数据进行运算.字符数据可以直接与整型数据进行运算.如果字符型数据与实型数据进行运算,则将字符的ASCII代码转换为double型数据,然后进行运算.
以上转换为系统自动完成.
例3.3 给定一个大写字母,用小写字母输出.下面是把大写A用小写输出
#include &stdio.h&
#include &stdlib.h&
int main()
char c1,c2;
c2=c1+<span style="color: #;
printf(&%c\n&,c2);
printf(&%d\n&,c2);
return <span style="color: #;
一个字符数据既可以以字符形式输出,也可以以整数形式输出.
5.强制类型转换运算符
可以利用强制类型转换运算符将一个表达式转换成所需的类型
(int)(x+y)
(float)(5%3)
其一般形式为: (类型名)(表达式)
在强制类型转换时,得到一个所需类型的中间数据,而原来变量的类型未发生变化.
1)算术运算符( + – * / % ++ -- )
2)关系运算符( & & == &= &= != )
3)逻辑运算符( ! && || )
4)位运算符( && && ~ | ∧&#160; &)
5)赋值运算符(=及其扩展的赋值运算符)
6)条件运算符(?:)
7)逗号运算符(,)
8)指针运算符(*和&)
9)求字节数运算符(sizeof)
10)强制类型转换运算符((类型))
11)成员运算符(. - &)
12)下标运算符([ ])
13)其他(如函数调用运算符())
一个函数包含声明部分和执行部分,执行部分是由语句组成的,执行相应的操作.一个C语句经过编译后产生若干条机器指令,声明部分不是语句,它不产生机器指令,只是对有关数据的声明.
C语句分为以下5类:
1)控制语句.C中9种控制语句:if()…else…,for()…,while()…,do…while(),continue(结束本次循环语句),break(中止执行switch或循环语句),switch(多分支选择语句),return(从函数返回语句),goto(转向语句,在结构化程序中基本不用goto语句)
2)函数调用语句.函数调用语句由一个函数调用加一个分号构成.
3)表达式语句.表达式语句由一个表达式加一个分号构成.
一个表达式的最后加一个分号就成了一个语句.一个语句必须在最后加一个分号,分号是语句中不可缺少的组成部分,而不是两个语句间的分隔符号.
4)空语句.只有一个分号,什么也不做.可以用来作为流程的转向点(流程从程序其他地方转到此语句处),也可用来作为循环语句中的循环体(循环体是空语句,表示循环体什么也不做).
5)复合语句.可以用{}把一些语句和声明括起来成为复合语句(又称语句块).可以在复合语句是包含声明部分,习惯放在语句块开关位置.复合语句中最后一个语句中最后的分号不能忽略不写.
3.3.2 最基本的语句-赋值语句
例3.4 给出三角形的三边长,求三角形面积
下面给三边赋值,求面积
#include &stdio.h&
#include &stdlib.h&
#include &math.h&
int main()
double a,b,c,s,
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(&a=%f\tb=%f\tc=%f\n&,a,b,c);
printf(&area=%f\n&,area);
sqrt函数是求平方根的函数,由于要调用数学函数库中的函数,有程序开头加上一条#include指令,把头文件&math.h&包含到程序中来.
'\t’是转义字符,使输出位置跳到下一个tab位置.
凡在程序中要用到数学函数库中的函数,都应当&包含&math.h头文件.
1.赋值运算符.2.复合的赋值运算符.3.赋值表达式.
由赋值运算符将一个变量和一个表达式连接起来的式子称为&赋值表达式&.它的一般形式为 变量 赋值运算符 表达式
对赋值表达式求解的过程是:先求赋值运算符右侧的&表达式&的值,然后赋给运算符左侧的变量.赋值运算符左侧应该是一个可修改的值.变量可以作为左值,而算术表达式就不能作为左值,常量也不能作为左值,因为常量不能被赋值.
赋值表达式中的&表达式”又可以是一个赋值表达式.
赋值表达式不能作为左值.
赋值表达式也可以出现在输出语句,循环语句等中.
4.赋值过程中的类型转换
如果赋值运算符两侧的类型一致,则直接进行赋值,如果不一致,但都是算术类型时,在赋值时要进行类型转换.类型转换由系统自动进行,转换规则为:
1)将浮点型数据赋给整形变量时,先对浮点数取整,然后赋值给整形变量.
2)将整型数据赋给单,双精度变量时,数值不变,但以浮点数形式存储到变量中.
3)将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到float变量的4个字节中.就注意双精度数值的大小不能超出float型变量的数值范围.
将一个float型数据赋给double变量时,数值不变,在内存中以8个字节存储,有效位数扩展到15位.
4)字符型数据赋给整形变量时,将字符的ASCII代码赋给整形变量.
5)将一个占字节多的整形数据赋给一个占字节少的整形变量或字符变量时,只将其低字节原封不动地送到被赋值的变量(即发生&截断&).
要避免把占字节多的整型数据向占字节少的整型变量赋值,因为赋值后数值可能发生失真.
实型数据之间以及整型与实型之间的赋值,是先转换(类型)后赋值.
5.赋值表达式和赋值语句
赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号.在一个表达式中可以包含一个或多个赋值表达式,但绝不能包含赋值语句.
6.变量赋初值
可以用赋值语句对变量赋值,也可以在定义变量进对变量赋以初值.
可以用赋值语句对变量赋值,也可以在定义变量时对变量赋以初值.也可以使被定义的变量的一部分赋初值.
如果对几个变量赋予同一个初值,应写成 int a=3,b=3,c=3;而不能写成int a=b=c=3;
一般变量初始化不是在编译阶段完成的(只有在静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句.
3.4 数据的输入输出
#include &stdio.h&
#include &stdlib.h&
#include &math.h&
int main()
double a,b,c,disc,x1,x2,p,q;
scanf(&%lf%lf%lf&,&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;x2=p-q;
printf(&x1=%7.2f\nx2=%7.2f\n&,x1,x2);
&a表示变量a在内存中的地址.该scanf函数表示从终端输入的3个数据分别送到地址为&a,&b,&c的存储单元,也就是赋给变量a,b,c.双撇号内用%lf格式声明,表示输入的是双精度型实数.
输入数据时两个数之间用空格分开,如果用其他符号(如逗号)会出错.
在printf函数中,在格式符f的前面加了&7.2&,表示在输出x1,x2时,指定数据占7列,其中小数占2列.
3.4.2 有关数据输入输出的概念
没有输出的程序是没有意义的.
所谓输入输出是以计算机主机为主体而言 的.C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的.
在使用系统库函数时,要在程序文件的开头用预处理指令#include把有关头文件放在本程序中,如#include &stdio.h& 用预编译指令#include的目的是将所需要的&头文件&包括到用户源文件中.在头文件 中包含了所需调用的函数的有关信息.在使用标准输入输出库函数时,要用到&stdio.h&头文件中提供的信息.
stdio是standard input & output(标准输入输出)的缩写,文件后缀中&h&是header的缩写.
#include指令都放在程序文件的开头,因此这类文件称为头文件.
#include &stdio.h& 或 #include “stdio.h”
用尖括号形式时,编译系统从存放C编译系统的子目录中去找所包含的文件,这称为标准方式.如果用双撇号形式,在编译时,编译系统先在用户的当前目录(一般是用户存放源程序文件的子目录)中要包含的文件,若找不到,再按标准方式查找.
注意:应养成这样的习惯:只要在本程序文件中使用标准输入输出库函数时,一律加上#include&stdio.h&指令.
3.4.3 用printf函数输出数据
1.printf函数的一般格式
printf(格式控制,输出表列)
1)&格式控制&是用双撇号括起来的一个字符串,&格式字符串&,它包括:格式声明(由&%&和格式字符组成(如%d,%f),格式声明问题由&%&开始)和普通字符(需要原样输出的字符).
2)&输出表列&是程序需要输出的一些数据,可以是常量,变量或表达式.
printf(参数1,参数2,参数3,...,参数n)
参数1是格式控制字符串,参数2~参数n是需要输出的数据.执行printf函数时,将参数2~参数n按参数1所指定的格式进行输出.参数1是必须有的,参数2~n是可选的.
2.格式字符
1)d格式符.用来输出一个有符号的十进制整数.可以在格式声明中指定输出数据的域宽(所占的列数),如用&%5d&,指定输出数据占5列,输出的数据显示在此5列区域的右侧.
2)C格式符.用来输出一个字符.也可以指定域宽.
3)s格式符.用来输出一个字符串.
4)f格式符.用来输出实数(包括单,双精度,长双精度),以小数形式输出.基本型, 用%f. 指定数据宽度和小数位数,用%m.nf, 输出的数据向左对齐,用%-m.nf
注意:在用%f输出时要注意数据本身能提供的有效数字,如float型数据的存储单元只能保证6位有效数字.double型数据能保证15位有效数字.不要以为计算机输出的所有数字都是绝对精确有效的.
5)e格式符.用格式声明%e指定以指数形式输出实数.
还有i格式符,o格式符(以八进制整数形式输出),x格式符(以十六进制数形式输出整数),u格式符,g格式符.
格式声明的一般形式可以表示为:
% 附加字符 格式字符
除X,E,G外,其他格式字符必须用小写字母.
如果想输出字符&%&,应该在&格式控制字符串&中用连接两个&%&表示.
3.4.4 用scanf函数输入数据
一般格式: scanf(格式控制,地址表列)
格式声明也是以%开始,以一个格式字符结束,中间可以插入附加的字符.
应注意的问题:&格式控制&后面应当是变量地址,而不是变量名.
如果在&格式控制字符串&中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符字符.
3.4.5 字符数据的输入输出
1.用putchar函数输出一个字符
格式:putchar(c)
例3.8 先后输出BOY三个字符
#include &stdio.h&
#include &stdlib.h&
int main()
char a='B',b='O',c='Y';
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
下面结果与上面一样
#include &stdio.h&
#include &stdlib.h&
int main()
int a=66,b=79,c=89;
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
putchar函数是输出字符的函数,它输出的是字符而不能输出整数.
putchar(c)中的c可以是字符常量,整型常量,字符变量或整型变量.
2.用getchar函数输入一个字符
格式:getchar()
getchar函数没有参数,它的作用是从计算机终端输入一个字符,即计算机获得一个字符.getchar函数只能接收一个字符,如果想输入多个字符就要用多个getchar函数.
例3.9 从键盘输入BOY3个字符,然后把它们输出到屏幕.
#include &stdio.h&
#include &stdlib.h&
int main()
char a,b,c;
a=getchar();
b=getchar();
c=getchar();
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
1.假如我国国民生产总值的年增长率为10%,计算10年我国国民生产总值与现在相比增长多少百分比.
计算机公式为: ,r为年增长率,n为年数,p为与现在相比的倍数.
#include &stdio.h&
#include &stdlib.h&
#include &math.h&
int main()
float p,r,n;
r=<span style="color: #.1;
n=<span style="color: #;
p=pow(<span style="color: #+r,n);
printf(&p=%f\n&,p);
return <span style="color: #;
6.请编程序将&China&译成密码,密码规则是:用原来的字母后面第4个字母代替原来的字母.
#include &stdio.h&
#include &stdlib.h&
int main()
char c1='C',c2='h',c3='i',c4='n',c5='a';
printf(&password is %c%c%c%c%c\n&,c1,c2,c3,c4,c5);
阅读(...) 评论()C语言程序中什么是函数
C语言程序中什么是函数
学习啦【百科知识】 编辑:思行
  C语言的函数问题是困扰很多学者的问题的,c程序中什么是函数呢?那么下面一起来看看学习啦小编为大家精心推荐的c程序中什么是函数,希望能够对您有所帮助。
  C语言读书笔记--函数
  先来看看函数的一般形式,尝试写一个加法的函数:
  思路是这样的:首先得有头文件,头文件之后就得写主函数,主函数的内部应该就是加法的过程,我们将所有加法的语句都拿出来组成一个函数。代码如下:
  #include &stdio.h&
  int add(int a, int b);
  int main()
  int result = add(3,5);
  printf(&sum is %d\n&, result);
  return 0;
  int add(int a, int b)
  sum = a+b;
  这是一个最简单的函数,描述了一个加法函数的定义和调用的过程。
  int add(int a, int b) 成为函数的首部。
  有了首部之后,就得考虑一件事情,将首部复制之后,加上一个分号,粘贴在主函数之前,作为函数的原型声明。试想,我们在主函数里边是不是要先定义变量result才能使用result?那么函数的道理也是一样的,当程序运行到主函数中语句&int result = add(3,5);&的时候,如果向上没有寻找到add()的定义,那么编译器一定就会报错。所以要不然添加函数的原型声明,要不然就将函数的定义直接写在主函数之前。
  函数首部int add(int a, int b)中的第一个int,即add之前的这个int称为函数的类型。表明这个函数将要返回一个整数类型的值。这个类型可以是C语言中任何被允许的数据类型,包括void,意为无返回值类型,即这个函数不需要返回任何的值。
  函数首部int add(int a, int b)中的add称为函数的名字,简称函数名。
  函数首部int add(int a, int b)中int a和int b称为函数的形式参数。这里形式参数理论上可以有无穷多个,当然,现实情况下3-5个就已经算是很多了;形式参数中,即使a和b都是int类型的,也要分别定义才行;形式参数可以在函数中直接使用,无须再次定义;形式参数是用来告诉调用者,你应该给我传递来什么样子的数据,我好利用你给我的数据在函数中进行计算。
  int add(int a, int b){}中的{}就是函数体的内容了。函数需要进行的所有的操作都要放在这对大括号中。想必大家也看到了函数体中最后有一条语句是return,这条语句起到的作用就是返回函数计算的结果,在这个程序中就是将加法的结果返回给主函数。需要注意的是,函数的类型和返回值的类型必须严格一致!
  函数的定义到此为止,接下来讲讲函数的调用方式。只要定义好函数,通过函数名(实际参数1,实际参数2,实际参数n)这种方式就可以调用函数了。例如主函数中的&int result = add(3,5);&,就是调用了add函数。这里,3和5称为实际参数,即你究竟想让函数帮你计算哪两个数的加法结果,你就在这个括号里边写哪几个数字。必须要严格遵守的规定:实际参数和形式参数必须一一对应,数量应该相同,类型也保持一致。
  理解了这几点之后,一个基本的函数就已经可以写出来了。接下来来个题目尝试一下:
  输入精度e,使用公式求&的近似值,精确到最后一项的绝对值小于e。公式:&=1-1/3+1/5-1/7+...
  代码:
  //首先得有头文件
  #include &stdio.h&
  #include &math.h& //后边要使用到fabs绝对值函数
  //然后就是主函数了
  int main(void)
  double pi, //定义所需变量
  double f_pi(double e); //原型声明。函数名只要符合命名规则即可 //因为要求小于e,所以也将这个e传递过去
  printf(&enter e: &); //输入的提示
  scanf(&%lf&, &e); // double类型的e对应%lf,记住不要缺少&
  printf(&pi=%lf\n&, f_pi(e) ); // 函数返回的是个double类型的值,直接输出
  return 0;
  double f_pi(double e) //函数首部,形参和实参一定要对应,可以重名
  int denominator,
  double item,
  //请注意&先定义,然后赋初值再使用&的好习惯!!!
  flag = 1; //负责变换正负符号的变量
  denominator = 1; //分母初值为1,第一项的1为1/1
  item=1.0; //存放每一项的值
  sum=0;
  while(fabs(item)&=e) //满足条件就循环
  item=flag*1.0/ //计算每一项的值。flag控制符号
  //1.0必须写出小数位,否则整项就变成一个整型值
  sum+= //累加
  flag = - //符号正负切换
  denominator = denominator + 2;//分母递增
   //sum的类型和函数的类型必须一致
  函数的定义和调用其实并不难理解,相信很多人困扰在参数的传递上,接下来总结一下函数参数传递的几种方式:
  正常的参数调用,例如int、float、double等一一对应的传递。
  无参数,也无返回值。例如下列代码就只是为了输出一些语句。这种做法在语法上是被允许的,但是并不推荐这么写。
  void printf()
  printf(&hello world!&);
  3. 参数是数组的名字。我们知道数组的名字是个地址,那么如果实参是数组名的话,我们可以将形参设置成指针,指向实参传递过来的数组的首地址。
  4. 参数是指针。如果实参是指针,那么形参肯定也得是指针。保持类型一致即可,然后在函数内部再对指针进行操作。
  5. 参数是结构体。如果实参是结构体,一般来说我们使用结构体指针来做形参比较合适。
  还是在此分割一下吧,说了这么多,可能很多人在问问什么函数定义这么麻烦,还要定义函数,直接都写在main函数中多方便?
  C语言是一个过程化的语言,C语言中的主函数其实是用来主导程序的进程和数据的流动方向的。如果将主函数写的过于复杂,我们阅读程序的结构就会非常的费力。
  C语言中函数回调
  什么是回调函数?
  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
  为什么要使用回调函数?
  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。
  如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
  回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。
  下面是自己写的一个简单的回调函数,相比其他的那些复杂的代码,这个更容易理解:
  #include&stdio.h&
  #include&stdlib.h&
  void perfect(int n)
  int i=1;
  int count=0;
  for(i=1;i&n;i++)
  if(0==n%i)
  count+=i;
  if(count==n)
  printf(&%d是完数\n&,n);
  else printf(&%d不是完数\n&,n);
  void myCallback(void (*perfect)(int ),int n)
  perfect(n);
  int main()
  printf(&请输入一个正整数\n&);
  scanf(&%d&,&n);
  myCallback(perfect,n);
  return 0;
  C语言中的刷新和定位函数
  一.fflush
  1.fflush的原型如下:
  intfflush(FILE *stream);
  2.当需要立即把输出缓冲区的数据进行物理写入时,应该使用这个函数。例如调用fflush函数保证调试信息实际打印出来,而不是保存在缓冲区中直到以后才打印。
  二.定位函数
  1.在正常情况下,数据以线性的方式写入,这意味着后面写入的数据在文件中的位置是在以前所有写入数据的后面。C同时支持随机访问I/O,也就是以任意顺序访问文件的不同位置。随机访问是通过在读取或写入前,先定位到文件中需要的位置来实现的。
  2.定位函数原型:
  1&long ftell(FILE*stream);
  2&intfseek(FILE *steam,long offset,intfrom);
  3.ftell函数返回流的当前位置。即:下一个读取或写入将要开始的位置距离文件起始位置的偏移量。该函数允许保存一个文件的当前位置。
  1&在二进制流中,这个值就是当前位置距离文件起始位置之间的字节数。
  2&在文本流中,这个值表示一个位置,但它并不一定准确地表示当前位置和文件起始位置之间的字符数,因为有些系统将对行末字符进行翻译转换。但是,ftell函数返回的值总是可以用于fseek函数中,作为一个距离文件起始位置的偏移量。
  4.fseek函数允许你一个流中定位。这个函数将改变下一个读取或写入操作的位置。它的第 1个参数是需要改变的流。它的第2和第3个参数标识文件中需要定位的位置。
  1&试图定位到一个文件的起始位置之前是一个错误。定位到文件尾并进行写入将扩展这个文件。定位到文件尾之后并进行读取将导致返回一条&到达文件尾&的信息。
  2&在二进制流中,从SEEK_END进行定位可能不被支持,所以应该避免。
  3&在文本流中,如果from是SEEK_CUR或SEEK_END,offset必须是零。如果from是SEEK_SET,offset必须是一个从同一个流中以前调用ftell所返回的值。
  5.用fseek改变一个流的位置会带来三个副作用。
  1&首先,行末指示字符被清除。
  2&其次,如果在fseek之前使用ungetc把一个字符返回到流中,那么这个被退回的字符会被丢弃,因为在定位操作以后,它不再是&下一个字符&。
  3&最后,定位允许你从写入模式切换到读取模式,或者回到打开的流以便更新。
  看了&c程序中什么是函数&的人还看了:
本文已影响 人
[C语言程序中什么是函数]相关的文章
看过本文的人还看了
2233人看了觉得好
6322人看了觉得好
716人看了觉得好
【百科知识】图文推荐
Copyright & 2006 -
All Rights Reserved
学习啦 版权所有

我要回帖

更多关于 c语言在任意位置输出 的文章

 

随机推荐