《chap2用C语言编写程序》由会员分享,可在线阅读,更多相关《chap2用C语言编写程序(78页珍藏版)》请在金锄头文库上搜索。
1、Chap2用C语言编写程序2.1在屏幕上显示HelloWorld!2.2求华氏温度100F对应的摄氏温度2.3计算分段函数2.4输出华氏摄氏温度转换表2.5计算12!/(5!7!)本章要点怎样编写程序,在屏幕上显示一些信息?怎样编写程序,实现简单的数据处理,例如将华氏温度转换为摄氏温度?怎样使用if语句计算分段函数?怎样用for语句求1+2+100?如何定义和调用函数完成上述4项工作?在使用函数的过程中,要注意哪些问题?怎样确定函数的参数?例2-1在屏幕上显示一个短句:HelloWorld!2.1在屏幕上显示HelloWorld!/*显示“HelloWorld!*/注释文本#includevo
2、idmain()主函数printf(HelloWorld!n);语句结束输出函数换行符2.1在屏幕上显示HelloWorld!1.任何程序都有主函数2.程序由假设干语句组成3.语句由 “ ;结束例2-2在屏幕上显示:Programmingisfun!AndProgramminginCisevenmorefun!#include编译预处理命令voidmain()printf(Programmingisfun!n);printf(And Programming in C is even more fun!n);2.1在屏幕上显示一些信息摄氏温度C=(5/9)(F-32)2.2.1 程序解析2.2.
3、2 常量、变量和数据类型2.2.3 算术运算和赋值运算2.2.4 格式化输出函数printf( )2.2求华氏温度100F对应的摄氏温度例2-3求华氏温度100F对应的摄氏温度。摄氏温度C=(5/9)(F-32)2.2.1程序解析#includevoidmain()intcelsius,fahr;变量定义fahr=100;变量使用celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=%dn,fahr,celsius);输出结果输出:fahr=100,celsius=372.2.2常量、变量和数据类型intcelsius,fahr;celsius=5*(fah
4、r-32)/9;数据常量:在程序运行过程中,其值不能被改变变量:在程序运行过程中,其值可以被改变数据类型常量:5和9是整型常量整数变量:在定义时指定变量的定义变量定义的一般形式:类型名类型名 变量名表;变量名表;例如:intcelsius,fahr;定义整型变量定义整型变量floatx;定义单精度浮点型变量定义单精度浮点型变量doublearea,length;定义双精度浮点型变量定义双精度浮点型变量double型数据比float精度高,取值范围大变量名:小写字母;见名知义变量的定义定义变量时要指定变量名和数据类型类型名类型名 变量名表;变量名表;intcelsius,fahr;floatx;
5、doublearea,length;变量名代表内存中的一个存储单元存放该变量的值存放该变量的值该存储单元的大小由变量的数据类型决定该存储单元的大小由变量的数据类型决定C语言中的变量代表保存数据的存储单元数学中的变量代表未知数x = x+1变量必须先定义,后使用。#includevoidmain()intcelsius,fahr;fahr=100;celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=%dn,fahr,celsius);变量的定义与使用一个变量名只能定义一次。变量一般都定义在程序的开头位置,不能定义在程序的中间或后面。应该先赋值,后引用2.2.
6、3算术运算和赋值运算1、算术运算双目算术运算符:+-*/%算术表达式:用算术运算符将运算对象连接起来的符合C语言语法规那么的式子数学式:(5/9)(F-32)C表达式:5*(fahr-32)/9或者:5/9*(fahr-32)数学式:s(s-a)(s-b)(s-c)C表达式:s*(s-a)*(s-b)*(s-c)算术运算双目算术运算符:+ - * / %算术表达式:用算术运算符将运算对象连接起来的符合C语言语法规那么的式子 注意:/ 整数除整数,得整数如:1/2 0,9/4 2 ?5 * (fahr - 32) / 9 和 5 / 9 * (fahr - 32) 等价吗% 只对整型数据如: 5
7、65,941,10040双目运算符两侧操作数的类型要相同赋值运算赋值运算符 : = =赋值表达式:用 = 将一个变量和一个表达式连接起来的式子 变量 表达式例如:fahr=100;celsius=5*(fahr-32)/9;计算赋值运算符右侧表达式的值将赋值运算符右侧表达式的值赋给左侧的变量的左边必须是一个变量2.2.4格式化输出函数printf()数据输出:格式化输出函数 printf()#includeprintf(HelloWorld!n);printf(fahr=%d,celsius=%dn,fahr,celsius);printf(格式控制字符串,输出参数1,输出参数n);用双引号括
8、起来,表示输出的格式要输出的数据printf(HelloWorld!n);printf(fahr=%d,celsius=%dn,fahr,celsius);printf(Hin,fahr);格式控制字符串:普通字符普通字符:原样输出格式控制说明格式控制说明:按指定的格式输出数据,%与数据类型有关int型:%dfloat,double型:%fprintf(fahr=%d,celsius=%dn,fahr,celsius);printf()格式控制字符串输出:fahr=100,celsius=372.3.1程序解析2.3.2关系运算2.3.3if-else语句2.3.4格式化输入函数scanf()
9、2.3.5常用数学库函数2.3.6else-if语句2.3计算分段函数例2-4输入x,求分段函数f(x)的值,保存2位小数。exx1f(x)=x2-1 x12.3.1程序解析要解决的问题:输入计算分段函数求ex输出,并保存2位小数 #include#includevoidmain()floatx,y;printf(inputx:n);/*输入提示*/scanf(%f,&x);/*调用scanf()函数输入数据 */if(x=1)/*ifelse语句*/y=exp(x); /*调用指数函数exp(x)计算ex*/elsey=x*x-1;printf(f(%f)=%.2fn,x,y);2.3.1程
10、序解析求分段函数inputx:0.5f(0.500000)=1.65inputx:2.4f(2.400000)=4.76数据必须输入吗?数据必须输入吗?2.3.2关系运算x=1比较x和1的大小比较的结果:真假当x取值0.5时,x=1的结果是:?当x取值1.5时,x=1的结果是:?关系运算比较运算,比较两个操作数关系运算符xyxyx=yx!=y关系表达式:用关系运算符将2个表达式连接起来的式子。如:x=1区分和运用关系表达式表示比较的数学式C关系表达式x10x10x10x=10x=10x!=10x=10用关系表达式描述条件判断x是否为负数x0判断x是否不为零x!=02.3.3if-else语句i
11、f(表达式)语句1else语句2if(x=1)y=exp(x);elsey=x*x-1;语句语句1表达式表达式语句语句2真真假假例2-5输入x,求分段函数f(x)的值,保存1位小数。1/xx0f(x)=0x=0例2-5求分段函数要解决的问题:输入计算分段函数 输出,并保存1位小数 if(x!=0)y=1/x;elsey=0;if(表达式)语句1else语句2#include/*例2-5*/voidmain()floatx,y;printf(inputx:n);scanf(%f,&x);if(x!=0)y=1/x;elsey=0;printf(f(%.2f)=%.1fn,x,y);例2-5程序#
12、include/*例2-4*/#includevoidmain()floatx,y;printf(inputx:n);scanf(%f,&x);if(x=1)y=exp(x);elsey=x*x-1;printf(f(%f) = %.2fn, x,y);#include/*例2-5*/voidmain()floatx,y;printf(“inputx:n);/*以上这条语句可以省略*/scanf(%f,&x);if(x!=0)y=1/x;elsey=0;printf(f(%.2f)=%.1fn,x,y);例2-5运行结果inputx:2.5f(2.50)=0.4inputx:0f(0.00)=
13、0.0软件测试精心设计一批测试用例输入数据,预期输出结果,然后分别用这些测试用例运行程序,看程序的实际运行结果与预期输出结果是否一致。软件测试的根本思想inputx:2.5f(2.50)=0.4inputx:0f(0.00)=0.0if(x!=0)y=1/x;elsey=0;if(x=1)y=exp(x);elsey=x*x-1;inputx:0.5f(0.500000)=1.65inputx:2.4f(2.400000)=4.762.3.4格式化输入函数scanf()数据输入数据输入:格式化输入函数scanf()#includescanf(%f,&x);scanf(格式控制字符串,输入参数1
14、,输入参数n);用双引号括起来,表示输入的格式变量地址格式控制字符串格式控制字符串:格式控制说明:按指定的格式输入数据,%与数据类型有关int型:%dfloat型:%fdouble型:%lf普通字符:原样输入例如:scanf(%f,&x);scanf()格式控制字符串输入: 2.5scanf(x=%f,&x);输入:x=2.5尽量不要出现普通字符例2-3求华氏温度100F对应的摄氏温度。摄氏温度C=(5/9)(F-32)#includevoidmain()intcelsius,fahr;fahr=100;celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=
15、%dn,fahr,celsius);改进例2-3的程序scanf(%d,&fahr);printf(inputfahr:n);inputfahr:100fahr=100,celsius=372.3.5常用数学库函数库函数C语言处理系统提供事先编好的函数,供用户在编程时调用。scanf(),printf(),exp()在相应的系统文件头文件中定义一些必需的信息。#include命令用户调用库函数时,将相应的头文件包含到源程序中。例如调 用 scanf(),printf(), 需 要 #include调用exp(),需要#include常用数学库函数平方根函数 sqrt(x) 绝对值函数 fabs
16、(x)fabs(-3.56) 的值为3.56幂函数 pow(x, n) :xnpow(1.1, 2) 的值为1.21即1.12指数函数 exp(x):exexp(2.3) 的值为e2.3以e为底的对数函数 log(x):ln xlog(123.45) 的值为4.815836以10为底的对数函数 log10(x):log10xlog10(123.45) 的值为2.091491。 输入存款金额money、存期year和年利率rate,根据公式计算存款到期时的本息合计sum税前,输出时保存2位小数。sum=money(1+rate)year例2-6计算存款的本息sum=money*pow(1+rat
17、e),year)#include#includevoidmain()intmoney,year;doublerate,sum;printf(inputmoney,yearandrate:n);scanf(%d%d%lf,&money,&year,&rate);sum=money*pow(1+rate),year);printf(sum=%.2f,sum);例2-6程序inputmoney,yearandrate:100030.025sum=1076.89scanf(%d%d%lf,&money,&year,&rate);输入:100030.025scanf()需要多个输入参数和多个格式控制说明
18、输入参数的类型、个数和位置要与格式控制说明一一对应?scanf(%d%lf%d,&money,&year,&rate);程序运行时,输入的多个数据之间必须有间隔。调用scanf函数输入多个数据scanf(%d%lf%d,&money,&rate,&year);如何输入?输入参数、格式控制说明、输入数据例2-7输入x,计算并输出以下分段函数f(x)的值保存2位小数x+1x1f(x)=x+21x2x+3x22.3.6elseif语句#includevoidmain()doublex,y;printf(inputx:n);scanf(%lf,&x);if(x1)y=x+1;elseif(x2)y=x
19、+2;elsey=x+3;printf(f(%.2f) = %.2fn, x,y);例2-7程序inputx:0.5f(0.50)=1.50inputx:1.2f(1.20)=3.20inputx:2f(2.00)=5.00elseif语句if(表达式1)语句1elseif(表达式2)语句2elseif(表达式n-1)语句n-1else语句nif(x1)y=x+1;elseif(x 4使用elseif语句2.4输出华氏摄氏温度转换表2.4.1程序解析2.4.2for语句2.4.3指定次数的循环程序设计2.4.1程序解析例2-8输出一张华氏摄氏温度转换表,将华氏温度从3040F之间的每一度,分别
20、转换成相应的摄氏温度并输出。fahrcelsius30-1.131-0.6320.0330.6341.1351.7362.2372.8383.3393.9404.42.4.1程序解析-温度转换表#includevoidmain()intlower,upper;doublecelsius,fahr;lower=30;upper=40;printf(fahrcelsiusn);/温度转换规那么:华氏温度从lower到upper,每次增加1Ffor(fahr=lower;fahr=upper;fahr+)celsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn
21、,fahr,celsius);fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7 36 2.2 37 2.8 38 3.3 39 3.9 40 4.4fahr=fahr+1例2-8中for语句的流程for(fahr=lower;fahr=upper;fahr+)celsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn,fahr,celsius);fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7 36 2.2 37 2.8 38 3
22、.3 39 3.9 40 4.4fahr=fahr+2输出?for(表达式1;表达式2;表达式3) 循环体语句实现C语句的重复执行2.4.2for语句-循环语句3个表达式、循环体语句!书写顺序和执行顺序不同!表达式1只执行一次循环(控制)变量:for语句中,通过改变或判断某个变量的值来控制循环的执行for(fahr=lower;fahr=upper;fahr+)celsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn,fahr,celsius);for语句中的循环变量赋初值判断其值改变其值for(fahr=lower;fahr=upper;fahr+)c
23、elsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn,fahr,celsius);表达式表达式1:给循环变量赋初值,指定循环的起点。fahr=lower表达式表达式2:给出循环的条件,决定循环的继续或结束。fahr=upper表表达达式式3:设置循环的步长,改变循环变量的值,从而可改变表达式2的真假性。fahr+语句:语句:被反复执行的语句,一条语句。for语句的说明for(fahr=lower;fahr=upper;fahr+)celsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn,fahr,celsius)
24、;for(fahr=lower;fahr=upper;fahr=fahr+1)celsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn,fahr,celsius);复合语句和空语句;for(fahr=lower;fahr=upper;fahr=fahr+1);celsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn,fahr,celsius);!不要在for语句中随意加分号抽取具有共性的算式:sum=sum+isum初值为0,该算式重复100次,i从1变到100设i为循环变量,那么:指定循环起点的表达式1:i=1给
25、出循环条件的表达式2:i=100设置循环步长的表达式3:i+循环体语句:sum=sum+i;for(i=1;i=100;i+)sum=sum+i;例2-9求1+2+100/*计算1+2+3+100*/#includevoidmain()inti,sum;sum=0;/*置累加和sum的初值为0*/for(i=1;i=100;i+)/*循环重复100次*/sum=sum+i;/*反复累加*/printf(“sum=%dn,sum);/*输出累加和*/例2-9源程序for(i=1;i=100;i+)sum=0;sum=sum+i;sum=5050#includevoidmain()inti,sum
26、;sum=0;/*置累加和sum的初值为0*/for(i=1;i=100;i+)/*循环重复100次*/sum=sum+i;/*反复累加*/printf(“sum=%dn,sum);/*输出累加和*/求1+1/2+1/3+1/100for(i=1;i=100;i+)sum=sum+1.0/i;inti;doublesum;printf(“sum=%fn,sum);应该包含四个局部例2-9:初始化:指定循环起点给循环变量赋初值,如i=1;进入循环之前,设置相关变量的初值,如sum=0。条件控制:只要i100,循环结束。2.4.3指定次数的循环程序设计输入一个正整数n,求前n项和,即循环n次#in
27、cludevoidmain()inti,sum;sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“sum=%dn,sum);求1+2+3+nfor(i=1;i=n;i+)sum=sum+i;printf(inputn:n);scanf(%d,&n);#includevoidmain()inti,sum;printf(inputn:n);scanf(%d,&n);sum=0;for(i=1;i=n;i+)sum=sum+i;printf(“sum=%dn,sum);求1+1/2+1/3+1/n#includevoidmain()inti;doublesum;pri
28、ntf(inputn:n);scanf(%d,&n);sum=0;for(i=1;i=n;i+)sum=sum+1.0/i;printf(“sum=%fn,sum);求前n项和,即循环n次,每次累加1项。for(i=1;i=n;i+)sum=sum+item(第i项)item=1.0/(2*i-1)例2-10求1+1/3+1/5+的前n项和#includevoidmain()inti,n;doubleitem,sum;printf(inputn:n);scanf(%d,&n);sum=0;for(i=1;i=n;i+)item=1.0/(2*i-1);/*计算第i项的值*/sum=sum+it
29、em;/*累加第i项的值*/printf(sum=%fn,sum);例2-10源程序求前n项和,即循环n次,每次累加1项。for(i=1;i=n;i+)sum=sum+item(第i项)item=flag*1.0/tt=t+2flag=-flag例2-11求1-1/3+1/5-的前n项和item=flag*1.0/(2*i-1)#includevoidmain()inti,n;doubleitem,sum;printf(inputn:);scanf(%d,&n);flag=1;t=1;sum=0;for(i=1;i=n;i+)item=flag*1.0/item;/*计算第i项的值*/sum=
30、sum+item;/*累加第i项的值*/flag=-flag;/*准备下一次循环*/t=t+2;printf(sum=%fn,sum);例2-11源程序#includevoidmain()inti,n;doubleproduct;printf(inputn:n);scanf(%d,&n);product=1;/*置阶乘product的初值为1*/for(i=1;i=n;i+)/*循环重复n次,计算n!*/product=product*i;printf(product=%.0fn,product);例2-12源程序#includevoidmain()inti,n;doublex,power;p
31、rintf(inputx,n:n);scanf(%lf%d,&x,&n);power=1;/*置power的初值为1*/for(i=1;i=n;i+) /*循环重复n次,计算x的n次幂*/power=power*x;printf(%0.fn,power);例2-13源程序2.5计算12!/(5!7!)2.5.1程序解析2.5.2函数的定义2.5.3函数的调用2.5.4使用函数编写程序#includedoublefact(intn); /*函数声明*/voidmain()printf(%fn,fact(12)/(fact(5)+fact(7);doublefact(intn)/*定义求n!的函数
32、*/inti;doubleresult=1;for(i=1;i=n;i+)result=result*i;returnresult;/*把结果回送主函数*/2.5.1程序解析求12!/(5!7!)函数:完成一个特定工作的独立程序模块系统函数:C语言系统提供定义,如:scanf()、printf()自定义函数:用户自己定义,如:求阶乘函数fact()C程序:1个main()0.n个函数程序调用某个函数,该函数会完成一些特定的工作,然后返回到调用它的地方。函数经过运算,得到一个明确的运算结果,并需要回送该结果。如:求阶乘函数fact要回送计算出的阶乘值。函数只是完成一系列操作步骤,不需要回送任何运
33、算结果。2.5.2函数的定义函数类型函数名(参数表)/*函数首部*/ /*函数体*/函数实现过程return表达式;返回运算结果的函数定义把函数运算的结果回送给主函数?分号函数返回值的类型doublefact(intn)inti;doubleresult=1;for(i=1;i=n;i+)result=result*i;returnresult;void函数名(参数表)/*函数首部*/*函数体*/函数实现过程return;/*可省略*/不返回结果的函数定义不返回结果#includevoidoutput1();/*函数声明*/voidmain()output1();voidoutput1()in
34、ti;for(i=0;i5;i+)/*输出5行星号*/printf(*n);例2-15输出五行*#includevoidoutput2(introw); /*函数声明*/voidmain()output2(5);输出n行*通过参数指定输出的行数,使函数的功能更灵活参数是函数运行需要具备的条件voidoutput2(introw)/*参数row给出行数*/inti;for(i=0;irow;i+)/*输出row行星号*/printf(*n);doublefact(intn)voidoutput1()voidoutput2(introw)参数表类型类型1 参数参数1,类型类型2 参数参数2,类型类
35、型n 参数参数nintx,inty,floatz参数表?intx,y,floatz#includedoubleexpon(doublex,intn);voidmain()inta;doublet,y;y=expon(3.5,4);printf(3.54=%fn,y);printf(inputt,a:n);scanf(%lf%d,&t,&a);y=expon(t,a);printf(%.2f%d=%fn,t,a,y);2.5.3函数的调用doubleexpon(doublex,intn)inti;doublepower=1.0;for(i=1;i=n;i+)power=power*x;retur
36、npower;计算机在执行程序时,从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。函数遇return或最后的大括号,返回主函数函数的调用过程函数定义时的参数被称为形式参数形参doubleexpon(doublex,intn)函数调用时的参数被称为实际参数实参expon(3.5,4)expon(t,a)实参?形参在参数传递过程中,实参把值复制给形参实参和形参一一对应,个数相同,类型一致。形参:变量实参:常量、变量或表达式函数的参数单向传递#includedoubleexpon(doublex,in
37、tn);voidmain()inta;doubley;a=4;y=expon(3.5,a);printf(a=%d,y=%fn,a,y);单向传递例如doubleexpon(doublex,intn)doublepower;for(power=1.0;n0;n-)power=power*x;returnpower;1调用语句printf(“%f,result);output2(5);通常用于void类型函数的调用2表达式调用sum=expon(t,a)+expon(3.5,4);3作函数参数printf(%fn,expon(t,a);相当于:y=expon(t,a);printf(%fn,y)
38、;函数调用的3种形式例2-17重做例2-4输入x,求分段函数f(x)的值,保存2位小数。要求定义和调用函数fun(x)实现该分段函数。ex x1f(x)=x2-1x12.4.4使用函数编写程序/*计算二分段函数*/#include#includefloatfun(floatx);voidmain()floatx,y;printf(inputx:n);scanf(%f,&x);y=fun(x);printf(f(%f)=%.2fn,x,y);例2-17源程序floatfun(floatx)floaty;if(x=1)y=exp(x);elsey=x*x-1;returny;输出一张华氏摄氏温度转
39、换表其中华氏温度的取值区间是0F,300F,温度间隔20F。要求定义和调用函数ftoc(fahr),将华氏温度C转换为摄氏温度F计算公式:C=(5/9)(F-32)。例2-18输出华氏摄氏温度转换#includevoidmain()intlower,upper;doublecelsius,fahr;lower=0;upper=300;printf(fahrcelsiusn);for(fahr=lower;fahr=upper;fahr=fahr+20)celsius=(5.0/9.0)*(fahr-32.0);printf(%3.0f%6.1fn,fahr,celsius);例2-18源程序f
40、loatftoc(doublefahr)return(5.0/9.0)*(fahr-32.0);celsius=ftoc(fahr)要求定义和调用函数total(n1,n2)计算n1+.+n2例2-19输入n1和n2,求n1+.+n2#includeinttotal(intn1,intn2);voidmain()intn1,n2;printf(inputn1,n2:n);scanf(%d%d,&n1,&n2);printf(sum=%dn,total(n1,n2);inttotal(intn1,intn2)inti,sum=0;for(i=n1;i=n2;i+)sum=sum+i;returnsum;