《用C语言编写程序45》由会员分享,可在线阅读,更多相关《用C语言编写程序45(67页珍藏版)》请在金锄头文库上搜索。
1、Chap 2 用用C语言编写程序语言编写程序 2.1 在屏幕上显示在屏幕上显示 Hello World!2.2 求华氏温度求华氏温度 100F 对应的摄氏温度对应的摄氏温度2.3 计算分段函数计算分段函数2.4 输出华氏输出华氏摄氏温度转换表摄氏温度转换表2.5 生成乘方表与阶乘表生成乘方表与阶乘表 本章要点本章要点n怎样编写程序,在屏幕上显示一些信息?怎样编写程序,在屏幕上显示一些信息?n怎样编写程序,实现简单的数据处理,例如怎样编写程序,实现简单的数据处理,例如将华氏温度转换为摄氏温度?将华氏温度转换为摄氏温度?n怎样使用怎样使用 if 语句计算分段函数?语句计算分段函数?n怎样用怎样用
2、for 语句求语句求 1+2+100?n如何定义和调用函数生成一张乘方表?如何定义和调用函数生成一张乘方表?2.1 在屏幕上显示在屏幕上显示Hello World! 例例2-1 在屏幕上显示一个短句在屏幕上显示一个短句:Hello World!2.1 在屏幕上显示在屏幕上显示Hello World!/* 显示显示“Hello World! */ 注释文本注释文本 # include int main(void) 主函数主函数 printf(“Hello World! n); 语句结束语句结束 return 0; 输出函数输出函数 换行符换行符1.任何程序都有主函数任何程序都有主函数2.程序由假
3、设干语句组程序由假设干语句组成成3.语句由;结束语句由;结束2.1 在屏幕上显示一些信息在屏幕上显示一些信息例例2-2 在屏幕上显示在屏幕上显示:Programming is fun!And Programming in C is even more fun!# include 编译预处理命令编译预处理命令int main(void) printf(Programming is fun! n); printf(And Programming in C is even more fun! n); return 0; 2.2 求华氏温度求华氏温度 100F 对应的摄对应的摄氏温度氏温度 摄氏温度摄
4、氏温度 C=(5/9)(F-32)2.2.1 程序解析程序解析2.2.2 常量、变量和数据类型常量、变量和数据类型2.2.3 算术运算和赋值运算算术运算和赋值运算2.2.4 格式化输出函数格式化输出函数printf2.2.1 程序解析程序解析例例2-3 求华氏温度求华氏温度 100F 对应的摄氏温度。对应的摄氏温度。摄氏温度摄氏温度 C=(5/9)(F-32) #include int main(void) int celsius, fahr; 变量定义变量定义 fahr = 100; 变量使用变量使用 celsius = 5 * (fahr - 32) / 9; printf(fahr =
5、%d, celsius = %dn, fahr, celsius);输出结果输出结果 return 0;输出输出: :fahr =100, celsius = 372.2.2 常量、变量和数据类型常量、变量和数据类型int celsius, fahr; celsius = 5 * (fahr - 32) / 9;数据数据常量:在程序运行过程中,其值不能被改变常量:在程序运行过程中,其值不能被改变 变量:在程序运行过程中,其值可以被改变变量:在程序运行过程中,其值可以被改变 数据类型数据类型常量:常量:5 和和 9是整型常量整数是整型常量整数变量:在定义时指定变量:在定义时指定变量的定义变量的定
6、义变量定义的一般形式:变量定义的一般形式:类型名类型名 变量名表;变量名表;例如:例如:int celsius, fahr; 定义整型变量定义整型变量float x; 定义单精度浮点型变量定义单精度浮点型变量double area, length; 定义双精度浮点型变量定义双精度浮点型变量double型数据比型数据比float精度高,取值范围大精度高,取值范围大 变量名:小写字母;见名知义变量名:小写字母;见名知义变量的定义变量的定义n定义变量时要指定变量名和数据类型定义变量时要指定变量名和数据类型类型名类型名 变量名表;变量名表;int celsius, fahr; float x;doub
7、le area, length;n变量名代表内存中的一个存储单元变量名代表内存中的一个存储单元存放该变量的值存放该变量的值n该存储单元的大小由变量的数据类型决定该存储单元的大小由变量的数据类型决定nC语言中的变量代表保存数据的存储单元语言中的变量代表保存数据的存储单元n数学中的变量代表未知数数学中的变量代表未知数 x = x+1变量的定义与使用变量的定义与使用变量必须先变量必须先定义定义,后,后使用使用。#include int main(void) int celsius, fahr; fahr = 100; celsius = 5 * (fahr - 32) / 9; printf(fah
8、r = %d, celsius = %dn, fahr, celsius); return 0;一个变量名只能定义一次一个变量名只能定义一次变量一般都定义在程序的头上变量一般都定义在程序的头上不能定义在程序的中间或后面不能定义在程序的中间或后面应该先赋值,后引用应该先赋值,后引用2.2.3 算术运算和赋值运算算术运算和赋值运算fahr = 100; celsius = 5 * (fahr - 32) / 9; 1、算术运算、算术运算双目算术运算符:双目算术运算符:+ - * / %算术表达式:用算术运算符将运算对象连接起来算术表达式:用算术运算符将运算对象连接起来的符合的符合C语言语法规那么的
9、式子语言语法规那么的式子 数学式:数学式:(5/9)(F-32) C表达式:表达式:5 * (fahr - 32) / 9 或者:或者:数学式:数学式:s(s-a)(s-b)(s-c)C表达式:表达式:算术运算算术运算双目算术运算符:双目算术运算符:+ - * / %算术表达式:用算术运算符将运算对象连接起算术表达式:用算术运算符将运算对象连接起来的符合来的符合C语言语法规那么的式子语言语法规那么的式子 注意注意/ 整数除整数,得整数整数除整数,得整数如:如:1/2 0,9/4 2 ?5 * (fahr - 32) / 9 和和 5 / 9 * (fahr - 32) 等价吗等价吗% 针对整型
10、数据针对整型数据如:如: 565,941,10040双目运算符两侧操作数的类型要相同双目运算符两侧操作数的类型要相同赋值运算赋值运算n赋值运算符赋值运算符 =n赋值表达式:用赋值表达式:用 = 将一个将一个变量变量和一个和一个表达表达式式连接起来的式子连接起来的式子 变量变量 表达式表达式例如:例如:fahr = 100; celsius = 5 * (fahr - 32) / 9; 计算赋值运算符右侧计算赋值运算符右侧表达式表达式的值的值将赋值运算符右侧将赋值运算符右侧表达式表达式的值赋给左侧的的值赋给左侧的变量变量的左边必须是一个变量的左边必须是一个变量2.2.4 格式化输出函数格式化输出
11、函数printf数据输出:格式化输出函数数据输出:格式化输出函数 printf #include printf(Hello World! n);printf(fahr = %d, celsius = %dn, fahr, celsius);printf(格式控制字符串格式控制字符串, 输出参数输出参数1, , 输出参数输出参数n);用双引号括起来,表示输出的格式要输出的数据printf格式控制字符串格式控制字符串printf(Hello World! n); printf(fahr = %d, celsius = %dn, fahr, celsius);printf(Hin, fahr);格式
12、控制字符串格式控制字符串:普通字符:原样输出普通字符:原样输出格式控制说明格式控制说明:按指定的格式输出数据按指定的格式输出数据,%与数据类型有关与数据类型有关nint型型 :%dnfloat double型:型:%fprintf(fahr = %d, celsius = %dn, fahr, celsius);输出输出: :fahr =100, celsius = 372.3 计算分段函数计算分段函数 2.3.1 程序解析程序解析2.3.2 关系运算关系运算2.3.3 if-else语句语句2.3.4 格式化输入函数格式化输入函数scanf2.3.5 常用数学库函数常用数学库函数2.3.1
13、程序解析程序解析例例2-4 分段计算水费分段计算水费要解决的问题:要解决的问题:输入输入计算分段函数计算分段函数输出,并保存输出,并保存2位小数位小数 求求ex2.3.1 程序解析求分段函数程序解析求分段函数 #include int main(void) double x, y; printf(Enter x (x=0):n); /* 输入提示输入提示 */ scanf(%lf, &x); /* 调用调用scanf函数输入数据函数输入数据 */ if(x =0):9.5f(9.500000)=12.67Enter x (x=0):15f(15.000000)=20.00数据必须输入吗?数据必
14、须输入吗?Enter x (x=0):21.3f(21.300000)=42.752.3.2 关系运算关系运算x = 15比较比较 x 和和 15 的大小的大小比较的结果:真比较的结果:真 假假当当 x 取值取值9.5时,时, x = 15的结果是:?的结果是:?当当 x 取值取值21.3时,时, x = 15的结果是:?的结果是:? 关系运算关系运算 比较运算,比较两个操作数比较运算,比较两个操作数关系运算符关系运算符x y x y x = y x != y关系表达式:用关系运算符将关系表达式:用关系运算符将2个表达式连接起来的式子。个表达式连接起来的式子。如:如:x = 1区分区分= 和和
15、=运用关系表达式运用关系表达式表示比较的数学式表示比较的数学式 C关系表达式关系表达式x10x10x10x = 10x = 10x != 10x = 10用关系表达式描述条件用关系表达式描述条件判断判断 x 是否为负数是否为负数x 0判断判断 x 是否不为零是否不为零x != 02.3.3 if - else语句语句if (表达式表达式) 语句语句1else 语句语句2if(x = 15) y = 4 * x / 3; else y = 2.5 * x - 10.5;语句语句1表达式表达式语句语句2真真假假计算二分段函数计算二分段函数 if (表达式表达式) 语句语句1else 语句语句2if
16、(x != 0) y = 1/x;else y = 0;源程序源程序#include int main(void) double x, y; printf(Enter x:n); scanf(%lf, &x); if(x != 0) y = 1/x; else y = 0; printf(f(%.2f) = %.1fn, x, y); return 0;#include /*例例2-4 */int main(void) double x, y; printf(Enter x (x=0):n); scanf(%lf, &x); if(x = 15) y = 4 * x / 3; else y =
17、 2.5 * x - 10.5; printf(f(%f) = %.2fn, x, y); return 0;运行结果运行结果#include int main(void) double x, y; printf(Enter x:n); scanf(%lf, &x); if(x != 0) y = 1/x; else y = 0; printf(f(%.2f) = %.1fn, x, y); return 0;input x:2.5f(2.50)=0.4input x:0f(0.00)=0.0软件测试的根本思想软件测试的根本思想 软件测试软件测试精心设计一批精心设计一批测试用例测试用例 输入数
18、据,预期输出结果输入数据,预期输出结果 ,然后分,然后分别用这些测试用例运行程序,看程序的实际运行结果与预别用这些测试用例运行程序,看程序的实际运行结果与预期输出结果是否一致。期输出结果是否一致。input x:2.5f(2.50)=0.4input x:0f(0.00)=0.0if(x != 0) y = 1/x;else y = 0;if(x =0):9.5f(9.500000)=12.67Enter x (x=0):15f(15.000000)=20.00Enter x (x=0):21.3f(21.300000)=42.752.3.4 格式化输入函数格式化输入函数scanf数据输入:格
19、式化输入函数数据输入:格式化输入函数 scanf #include scanf(%lf, &x);scanf(格式控制字符串格式控制字符串, 输入参数输入参数1, , 输入参数输入参数n);用双引号括起来,表示输入的格式用双引号括起来,表示输入的格式变量地址变量地址scanf格式控制字符串格式控制字符串格式控制字符串格式控制字符串:格式控制说明格式控制说明: 按指定的格式输入数据按指定的格式输入数据, %与数据类型有关与数据类型有关nint型型 :%dnfloat型:型:%fndouble型:型:%lf普通字符:原样输入普通字符:原样输入例如:例如:scanf(%lf, &x);输入输入: :
20、 9.5scanf(x=%lf, &x);输入输入: x=9.5尽量不要出现普通字符尽量不要出现普通字符改进例改进例2-3的程序的程序例例2-3 求华氏温度求华氏温度 100F 对应的摄氏温度。对应的摄氏温度。摄氏温度摄氏温度 C=(5/9)(F-32) #include int main(void) int celsius, fahr; fahr = 100; celsius = 5 * (fahr - 32) / 9; printf(fahr = %d, celsius = %dn, fahr, celsius); return 0;scanf(%d, &fahr);printf(“Ent
21、er fahr: n);Enter fahr:100fahr =100, celsius = 372.3.5 常用数学库函数常用数学库函数n库函数库函数nC语言处理系统提供事先编好的函数,供用户语言处理系统提供事先编好的函数,供用户在编程时调用。在编程时调用。scanf(), printf(), exp()n在相应的系统文件头文件中定义一些必在相应的系统文件头文件中定义一些必需的信息。需的信息。n#include命令命令n用户调用库函数时,将相应的头文件包含到用户调用库函数时,将相应的头文件包含到源程序中。源程序中。n例如例如n调用调用scanf, printf,需要,需要 #include
22、n调用调用sqrt,需要,需要 #include 常用数学库函数常用数学库函数n平方根函数平方根函数 sqrt(x) n绝对值函数绝对值函数 fabs(x)nfabs(-3.56) 的值为的值为3.56n幂函数幂函数 pow(x, n) :xnnpow(1.1, 2) 的值为的值为1.21即即1.12n指数函数指数函数 exp(x):exnexp(2.3) 的值为的值为e2.3n以以e为底的对数函数为底的对数函数 log(x):ln xnlog(123.45) 的值为的值为4.815836n以以10为底的对数函数为底的对数函数 log10(x):log10xnlog10(123.45) 的值为
23、的值为2.091491。 例例2-5 计算存款的本息计算存款的本息输入存款金额输入存款金额 money、存期、存期 year 和年利率和年利率 rate,根据公式计算存款到期时的本息合计,根据公式计算存款到期时的本息合计sum税前,输出时保存税前,输出时保存2位小数。位小数。sum = money ( 1 + rate)yearsum = money * pow(1 + rate), year)例例2-5 程序程序# include # include int main(void) int money, year; double rate, sum; printf(“Enter money:)
24、; scanf(%d, &money); printf(“Enter year: ); scanf(%d, &year); printf(“Enter rate:); scanf(%lf, &rate); sum = money * pow(1 + rate), year); printf(sum = %.2f, sum); return 0;Enter money: 1000Enter year: 3Enter rate: 0.025sum = 1076.89scanf(%d%d%lf, &money, &year, &rate);调用调用scanf函数输入多个数据函数输入多个数据scanf
25、(%d%d%lf, &money, &year, &rate); 输入:输入:1000 3 0.025nscanf需要多个输入参数和多个格式控制说明需要多个输入参数和多个格式控制说明输入参数的类型、个数和位置要与格式控制说明一一输入参数的类型、个数和位置要与格式控制说明一一对应对应 ? scanf(%d%lf%d , &money, &year, &rate);n程序运行时,输入的多个数据之间必须有间隔。程序运行时,输入的多个数据之间必须有间隔。scanf(%d%lf%d , &money, &rate , &year);如何输入?如何输入?输入参数、格式控制说明、输入数据输入参数、格式控制说
26、明、输入数据2.4 输出华氏摄氏温度转换表输出华氏摄氏温度转换表2.4.1 程序解析程序解析2.4.2 for语句语句2.4.3 指定次数的循环程序设计指定次数的循环程序设计2.4.1 程序解析程序解析例例2-6输输入入2个个整整数数lower和和 upper,输输出出一一张张华华氏氏摄摄氏氏温温度度转转换换表表,华华氏氏温温度度的的取取值值范范围是围是lower, upper,每次增加,每次增加1F。 fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.72.4.1 程序解析程序解析-温度转换表温度转换表#include int ma
27、in(void) int fahr, lower, upper; double celsius; printf(Enter lower:); scanf(%d, &lower); printf(Enter upper:); scanf(%d, &upper); printf(fahr celsiusn);/ 温度重复转换:华氏温度从温度重复转换:华氏温度从lower开始,到开始,到upper结束,每次增加结束,每次增加1F for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32); printf(%
28、d %6.1fn, fahr, celsius); return 0; fahr = fahr+1Enter lower: 30Enter upper: 35fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7例例2-8中中for语句的流程语句的流程for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32); printf(%d %6.1fn, fahr, celsius); fahr = fahr+2输出?输出?Enter lower: 3
29、0Enter upper: 35fahr celsius 30 -1.1 31 -0.6 32 0.0 33 0.6 34 1.1 35 1.7for(表达式表达式1;表达式表达式2;表达式表达式3) 循环体语句循环体语句实现实现C语句的重复执行语句的重复执行2.4.2 for语句循环语句语句循环语句3个表达式、循环体语句个表达式、循环体语句!书写顺序和执行顺序不同书写顺序和执行顺序不同!表达式表达式1只执行一次只执行一次循循环环(控控制制)变变量量:for语语句句中中,通通过过改改变变或或判判断断某某个个变量的值来控制循环的执行变量的值来控制循环的执行for (fahr = lower; f
30、ahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); for语句中的循环变量语句中的循环变量赋初值赋初值判断其值判断其值改变其值改变其值for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); 表达式表达式1:给循环变量赋初值,给循环变量赋初值,指定循环的起点。指定循环的起点。fahr = lo
31、wer表达式表达式2:给出循环的条件,决定循环的继续或结束。给出循环的条件,决定循环的继续或结束。fahr = upper表表达达式式3:设设置置循循环环的的步步长长,改改变变循循环环变变量量的的值值,从从而而可可改改变变表达式表达式2的真假性。的真假性。fahr+语句:语句:被反复执行的语句,一条语句。被反复执行的语句,一条语句。for语句的说明语句的说明for (fahr = lower; fahr = upper; fahr +) celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); for (f
32、ahr = lower ; fahr = upper; fahr = fahr + 1) celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); 复合语句复合语句 和空语句和空语句 ;for (fahr = lower ; fahr = upper; fahr = fahr + 1); celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%d %6.1fn, fahr, celsius); !不要在!不要在for语句中随意加分号语句中随意加分号求求 1+2+100抽
33、取具有共性的算式:抽取具有共性的算式:sum = sum + i sum初值为初值为0,该算式重复,该算式重复100次,次,i从从1变到变到100设设i为循环变量,那么:为循环变量,那么:指定循环起点的表达式指定循环起点的表达式1:i = 1给出循环条件的表达式给出循环条件的表达式2:i = 100设置循环步长的表达式设置循环步长的表达式3:i+循环体语句:循环体语句:sum = sum + i;for(i=1; i=100; i+)sum =sum+i;2.4.3 指定次数的循环程序设计指定次数的循环程序设计/* 计算计算1 + 2 + 3 + + 100 */#include int ma
34、in(void) int i, sum; sum = 0; /* 置累加和置累加和sum的初值为的初值为0 */ for ( i = 1; i = 100; i+ ) /* 循环重复循环重复100次次 */ sum = sum + i; /* 反复累加反复累加 */ printf( “sum = %dn, sum); /* 输出累加和输出累加和 */ return 0;源程序求源程序求 1+2+100for(i=1; i=100; i+) sum=0; sum=sum+i;sum=5050#include int main(void) int i, sum; sum = 0; for ( i
35、= 1; i = 100; i+ ) sum = sum + i; printf( “sum = %dn, sum); return 0;求求 1+1/2+1/3+ 1/100for(i=1; i=100; i+) sum=sum+1.0/i;int i;double sum;printf( “sum = %fn, sum);一般包含四个局部:一般包含四个局部:初始化:指定循环起点初始化:指定循环起点给循环变量赋初值,如给循环变量赋初值,如i = 1;进入循环之前,设置相关变量的初值,如进入循环之前,设置相关变量的初值,如sum = 0。条件控制:条件控制:只要只要i 100,循循环环结束。结
36、束。指定次数的循环程序设计指定次数的循环程序设计输入一个正整数输入一个正整数n,求前,求前n项和,即循环项和,即循环n次次#include int main(void) int i, sum; sum = 0; for ( i = 1; i = 100; i+ ) sum = sum + i; printf( “sum = %dn, sum); return 0;例例2-7 求求 1+2+3+n for(i=1; i=n; i+) sum=sum+i;printf(“Enter n:); scanf(%d, &n); Enter n: 100Sum = 5050#include int mai
37、n(void) int i, sum; printf(“Enter n: ); scanf(%d, &n); sum = 0; for ( i = 1; i = n; i+ ) sum = sum + i; printf( “sum = %dn , sum); return 0;求求1+1/2+1/3+ 1/n #include int main(void) int i; double sum; printf(“Enter n: ); scanf(%d, &n); sum = 0; for ( i = 1; i = n; i+ ) sum = sum + 1.0/i; printf( “sum
38、 = %fn, sum); return 0;求前求前n项和,即循环项和,即循环n次,每次累加次,每次累加1项。项。for (i = 1; i = n ; i+) sum = sum + item (第第i项项)item = 1.0 / (2 * i - 1)求求 1+1/3+1/5+ 的前的前n项和项和#include int main(void) int i, n; double item, sum; printf(“Enter n: ); scanf (%d, &n);sum = 0 ; for ( i = 1; i = n; i+ ) item = 1.0 / (2 * i - 1);
39、 /* 计算第计算第i项的值项的值 */ sum = sum + item ; /* 累加第累加第i项的值项的值 */ printf ( sum = %fn, sum); return 0;源程序求源程序求 1+1/3+1/5+ 求前求前n项和,即循环项和,即循环n次,每次累加次,每次累加1项。项。for (i = 1; i = n ; i+) sum = sum + item (第第i项项)item = flag * 1.0 / denominator denominator = denominator + 2flag = -flag例例2-8 求求 1-1/3+1/5- 的前的前n项和项和
40、item = flag*1.0/(2 * i - 1)#include int main(void) int denominator, flag, i, n; double item, sum; printf(“Enter n: ); scanf (%d, &n);flag=1; denominator =1;sum = 0 ; for ( i = 1; i = n; i+ ) item = flag * 1.0/ denominator; /* 计算第计算第i项的值项的值 */ sum = sum + item ; /* 累加第累加第i项的值项的值 */ flag = -flag; /* 准
41、备下一次循环准备下一次循环 */ denominator = denominator +2; printf ( sum = %fn, sum); return 0;例例2-8 源程序源程序n! = 1*2*nfor (i = 1; i = n ; i+) product = product * item (第第i项项)item=i例例2-9 求求n!product = ?#include int main(void) int i, n; double product; printf(input n: n); scanf (%d, &n) ; product=1; /* 置阶乘置阶乘produc
42、t的初值为的初值为1 */ for ( i = 1; i = n; i+ ) /* 循环重复循环重复n次,计算次,计算n! */ product = product * i ; printf ( product = %.0fn, product ); return 0;例例2-9 源程序源程序输入实数输入实数x和正整数和正整数n,计算计算xn = x * x * * xfor (i = 1; i = n ; i+) power = power * item (第第i项项)item=?求求 xn #include int main(void) int i, n; double x, power
43、; printf(“Enter x, 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);源程序求源程序求 xn 2.5 生成乘方表和阶乘表生成乘方表和阶乘表2.5.1 程序解析程序解析2.5.2 结构化程序设计思想结构化程序设计思想2.5.1 程序解析程序解析例例2-101输输入入一一个个正正整整数数n,生生成成一一张张2
44、的的乘乘方方表表,输输出出20到到2n的值,可以调用幂函数计算的值,可以调用幂函数计算2的乘方。的乘方。for (i = 0; i = n ; i+) power = pow(2, i); /*调用幂函数调用幂函数pow(2,i)计算计算2的的i次次方方*/ 输出输出power的值的值;源程序生成乘方表源程序生成乘方表#include #include int main(void) int i, n; double power; printf(Enter n:); scanf(%d, &n); for (i = 0; i = n ; i+) power = pow(2, i); /* 调用幂函
45、数调用幂函数pow(2,i)计算计算2的的i次方次方 */ printf(pow(2,%d)= %.0fn, i, power); return 0;Enter n: 4pow(2,0)= 1pow(2,1)= 2pow(2,2)= 4pow(2,3)= 8pow(2,4)= 16 例例2-102生成阶乘表生成阶乘表输输入入一一个个正正整整数数n,生生成成一一张张阶阶乘乘表表,输输出出0!到到n!的的值值。要要求求定定义义和和调调用用函函数数fact(n)计计算算n!,函数类型是,函数类型是double。 for (i = 0; i = n ; i+) power = pow(2, i); /
46、*调用幂函数调用幂函数pow(2,i)计算计算2的的i次次方方*/ 输出输出power的值的值;for (i = 0; i = n ; i+) product = fact(i); /* 调用自定义函数调用自定义函数fact(i)计算计算i! */ 输出输出product的值的值;源程序生成阶乘表源程序生成阶乘表#include double fact(int n); /* 自定义函数的声明自定义函数的声明 */int main(void) int i, n; double result; printf(Enter n:); scanf(%d, &n); for (i = 0; i = n ;
47、 i+) result = fact(i); /* 调用自定义函数调用自定义函数fact(i)计算计算i! */ printf(%d!=%.0fn, i, result); return 0;Enter n: 30!=11!=12!=23!=6double fact(int n) /* 函数首部函数首部 */ int i; double product; product = 1; for (i = 1; i = n; i+) product = product * i; return product; /* 将结果回送主函将结果回送主函数数 */2.5.2 结构化程序设计思想结构化程序设计思想
48、n结构化程序设计结构化程序设计(Structured Programming)n程序设计技术程序设计技术nC语言是结构化程序设计语言语言是结构化程序设计语言n强强调调程程序序设设计计的的风风格格和和程程序序结结构构的的标标准准化化,提提倡倡清清晰晰的的结结构构,其其根根本本思思路路是是将将一一个个复复杂杂问问题题的的求求解解过过程程划划分分为为假假设设干干阶阶段段,每每个个阶阶段段要要处处理的问题都容易被理解和处理。理的问题都容易被理解和处理。n按按自自顶顶向向下下的的方方法法对对问问题题进进行行分分析析、模模块块化化设设计和结构化编码等计和结构化编码等3个步骤。个步骤。自顶向下的分析方法自顶
49、向下的分析方法n把大的复杂的问题分解成小问题后再解决把大的复杂的问题分解成小问题后再解决n面面对对一一个个复复杂杂的的问问题题,首首先先进进行行上上层层整整体体的的分分析析,按按组组织织或或功功能能将将问问题题分分解解成成子子问问题题,如如果果子子问问题题仍仍然然十十分分复复杂杂,再再做做进进一一步步分分解解,直到处理对象相对简单,容易处理为止。直到处理对象相对简单,容易处理为止。n当当所所有有的的子子问问题题都都得得到到了了解解决决,整整个个问问题题也也就就解决了。解决了。n每每一一次次分分解解都都是是对对上上一一层层的的问问题题进进行行细细化化和和逐逐步步求求精精,最最终终形形成成一一种种
50、类类似似树树形形的的层层次次结结构构,来描述分析的结果。来描述分析的结果。学生成绩统计程序学生成绩统计程序成绩输入成绩输入数据计算数据计算数据查找数据查找输出成绩输出成绩计算学生平均分计算学生平均分计算课程平均分计算课程平均分学生成绩统计程序的层次结构图学生成绩统计程序的层次结构图 模块化设计模块化设计n将模块组织成良好的层次系统,顶层模块调用将模块组织成良好的层次系统,顶层模块调用其下层模块以实现程序的完整功能,每个下层其下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而完成程序的一模块再调用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能。个子功能,最下
51、层的模块完成最具体的功能。n遵循模块独立性的原那么,即模块之间的联系遵循模块独立性的原那么,即模块之间的联系应尽量简单。应尽量简单。n一个模块只完成一个指定的功能。一个模块只完成一个指定的功能。n模块之间只通过参数进行调用。模块之间只通过参数进行调用。n一个模块只有一个入口和一个出口。一个模块只有一个入口和一个出口。n模块内慎用全局变量。模块内慎用全局变量。结构化编码结构化编码 选用顺序、选择和循环三种控制结构,使程序具选用顺序、选择和循环三种控制结构,使程序具有良好的风格。有良好的风格。对变量、函数、常量等命名时,要见名知意,有对变量、函数、常量等命名时,要见名知意,有助于对变量含义或函数功
52、能的理解。助于对变量含义或函数功能的理解。在程序中增加必要的注释,增加程序的可读性。在程序中增加必要的注释,增加程序的可读性。程序要清晰易懂,语句构造要简单直接,一行写程序要清晰易懂,语句构造要简单直接,一行写一条语句,采用缩进格式。一条语句,采用缩进格式。程序有良好的交互性,输入有提示,输出有说明,程序有良好的交互性,输入有提示,输出有说明,并尽量采用统一整齐的格式。并尽量采用统一整齐的格式。yjV%I.P1V42R&tIu(V8a%a6S$pDnX&IK-$uLA6-ns4wv1nfY#ip4yz8wrb0FRz-&qDmV$F-F$VmDq&Wae+hf%5.FTF;6*hkif!1=x
53、Ku%=O;:P)yQE:aqv6yx2ogZR:;M)ZoDp!=Q35Y51N)XkxhSYC()F$XoGu+1$hm;qphaS-Uen3ADdDA4ofV+Ubj.st1pl(5yKt$)KI&YoEr&V9c(ebZ0=zNy+;W8a$73P)XjvfOUx#xUOevjW)O26!97V.-xLx+;X9c&a6S$oBlV$F+H&YqHv+1$hm.pof7P*Raj:vy8yv;i8P$N4b-jkgbW$oziQWy#ZvRKaqdPZG.Q.I$ThvgRYD-+I($uMB;asxaDD9wp+6xHoVZA!ZtOG4j4FOtY#zYUnGv5)ou7BB8vp
54、+7FUH0a+mp:pm+a1IVG;5$ef(b7S=YkwfNTwYXuQJ9pdPZG;R:K&WkyjU$HO+CWL8l5FLpTTqOI9qfT&L05#87W;+zOA2!eh=he#1=yLv(R23U:FWL6i0zEgIIeAt8BMu$)J=G!UkzmY)O14X41O-ZmAlV%HL+&wOD:asxaCC8un(3+tDkRUvWToIz.c.yGlQRqPKdvl#WciooibVZjubJNoPNiDv8vEjPRqQMfyo&.#ho1vv2qk&2+uFnV#C%$xTLaqcOXD+M-CVM9m7HOsWXvTOgxm#Uaf=ji)a3M$P8i;
55、vy9zw0kbS(R9gDSD4$eg-eaWlg$1+wIr#(JJ(#qHu-:Zeiki(80HWI09)kmqr:mh$1-uFnW!D*&AWPfviU&K;1U2:M(XlzkU$HL+*xPE0cuAdFFbyr8yIpW#B$#uPH5j5GOtY#zYUnGv4)nu7AA7uo-6xIqX$D&%yTLapbNVB)+J-&yRH4h1BImQQoMG7pdR%L05#87W:=APC4%hkkh%4COy-!kt9FIiHE8riYWdk;st1pj&3=wHpY%F)(CYRhwjW*M:3W30N)YmAlW%IvBdGGczs9zJqX!C$#vPH5k5GOuZ
56、!AYUnGv4)nt7AA7uo-6xIpX!C&$xSK9oaMVA(-I)&xQG3g0AHlPPnKF6ocQ!J;3Y76U.+yOA3$fiif$2ANy-.U56X2.I#Pbm5EJmONjGz:f2FOv$*G(&ySK8m7IQvZ!AYUmFu+3*lr4xx3qk%1)sCjRVwXVqKC1f1DLqWYxWSlEu=4(nu7BB8vq=8ALs#*G-(CXQfugS!H.PFZPcqaKRvZ#yWQiAo%Wchlk+c5O%Q9j:wz9Ax1lcT(R9hWad)fd#2BPA1Zbd*b6S#nzjSYC*CZTkAo$U8d)fe$4ETE.6*hki
57、f!1=xKu&P:0R+ARG1csx9Az5qjpEr%S58!85S$qEoY(KO)yQF1cxFkPQpOJcujYUagmlf9S+Wgr8FJkLJezr-4-rzfKMlKH9siYUbijdY%nygOSuVUpLD2h3FOu#%D$ZsMC:d.xEiMNlID5mbP!J;3Z87W;=AQC5*ilmj(7;FSD2#bd&a5Q-XjveNSvYXuQJaqdQ#H;Q=DWL8k3DJmPPmJD4l8MXE.R0;M)ZoDo#+O14W2:L&UhueOVy$%AYSjBp%Wbgki)a2L#M6fru4ure5LZJ18*hi+e9U#mygPUwZYuQ
58、J9pcPZF.Q.I$UiwhSZE+J-%wOD0cuAdGFczs9.AKsZ%E*%ySK9n9KTy%*FtMB;buBeHIfCw.e2GRz(NI%VlAmY)N:2V1;K&UivfPWA&*D#VnEt):!gl.pog9R)Udn3zDdDA4ofW=Ucj;su2qm)6AMv%+MK(#qGt(.Xbf+ge$3CQB2#ce(b7T!nAjSZC*CZTkAo$U8c)fd!35%gihd#0+wJt%+N;P)yPD:aqu6yx2ogZ#kt9FIiIF8sjZXfm0uv3rm)6(uIt&R34W1.I!Qco7GMpSSoLF5m9MWEQ;J&Wlzl
59、W&K;QEXNam6FMpTTqNH9pdR$K;3Y64T(vLx+;Xad*c9V*sFpZ(KNytc0EQy(NK(ZpEr%T6a%a7Uc:DMt#&F*%ySJ8m7IQv#$B#WoHw5-ou7AA7uo-5xHpW#C%!wRJ8n8KTy&(F*!uND0d.xEhLMjGB2j8MXF;T21P%tIu(.W9c*b8V*tGr!-M;:QxFjOQoNIatiX+S8e=kk+d6Q(Ueo5CHhIGbwn*1*nwbGIiHD5oeU(Q6d+kk=e8S+XitbINoQOjFxb.zIoTWwVSlFv5-qxaEFdBv.e3HSA+Q:Eawo)4+tC
60、iPSsSPjDu5+rydHIhFA2k9O#J;4#99Y1g8P%O6foq:ok*5AMv*O;O*vMA5*jo:qoe6O%O7ge2HSB+R0:P&uJw+0Zdg=he!3BPA:X9a$73O(WiudMSuXXuQKareR!I.1V20O+#pDp#+O02U0I!Rdq9JPtWWtRLctgU*N16#97V;+yNz1Zcf)eaX.(uHr!-M.O(yPE:arw8Az5qj$;&nxdJMmNKexo*0%ls7BCbzue3IUC;T32Snl-91IWI08(ijhdY;(tFoX&H=H%XoFs(.Xcg=ig*6;GVH:8(jlkg$2yLv*P
61、:0Q-zQF0bqv7zx3ohZGXL6g;wAcDB7sk$;%mvbGJiIE8rhYVcj.qr:mh$0)tEmUZB%$yUMcreQ#GQ.G#RftdOVA&*D$XpHw=3*lq3vv1ng#.%nxdKOpPNhBt=5+rzeJLkJE7pfU(Q6c-ii-c5P(Teo6DHiJHcxp)3)qzeKMlKHatjZVcjqq;lf#;*qBjRVxZXtOH6l7KTz*-H)&xRI5i3DKoSTrPKctiX-R6b)gf&70JZL5fsv5wt.h8P%O6eno.lh$1+vHqZ*I=H%XnEr&V9d)fd!2BQB2#ce(c8U$pClV!
62、E-F$WnEs*.Ychji(80IXJ2b=mp:ok)7.DRB:V67Y2.HZN8j2AFhJHdzs=7wFlRVvVSmFw7tAeJKiGB3laP!J:5#a9Y2EUH1bos3trf7O$N5d%*E%YrJz7=qw9CC9vp+6xIpW!C%!wRJ7m8JSx%*E%#tMC:bvBfJJgEy:g4ITB+P;.L)ZoEq$R47Z63Q+#nAlV$G=J)$tLA7-ot5xw2oh#.%mwcJMnNKeyp(1*nu9EFeCx0i7MYH.3Y88X1EUH1cqu4vt;iaR(R9i.su3so=9:FRB=.U44U;CTH2crw7zx2nf
63、XYhq6BEdDz2mcS*P6d=llhbW!mygOTvXWrNG5l7JTz*-I-*zTK7l6GOsWXwUPhzo$#iq5ABazu.f5KWF2Y88X1EVJ3dS10P&tJw-:Zcf+gd#1zNy+.V78Z50L&TfraIOrUTqMG6maNXEQ.O+BUK6j2CIlOPmJD4k8MWEzDfGE9vn*1*oxdILkKGatjZWdk;rs0ni$1-tEmUZB%$yTMcrdQZFPFZQdrcMTy$%BZUmEt-1$in0ss;kdWZjtaGKlLIdxo(1*nvaEGfDz2k9P!K06$cc$6:JZN7i:wAbCA5qi#b.zIoUXwWTmGw7=rydHHf0GXM8j1AFhJIeAt8#iq6BDcBw:i7N