1、 1 C 语言程序设计案例操作和分析 以课后习题为例 一 引言 (一)研究的缘起 1第四章主要讲的是选择结果程序设计,前面第 3章介绍了顺序结构程序设计。在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的。实际上,在很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作作选择其一。这是选择结构要解决的问题。 2 选择结构在进行程序处理的时候,就需要运用到选择语句。同时也需要各种运算符、关系表达式以及它们之间的优先次序。 ( 二 ) 本文的 研究思路、方法及意义 1对于 按逆序输出位数及每位数字问题, ,输出它的位
2、数就需要用到 strlen函数 ,输出它的 逆序 数字则要用到 streev 函数 。 2 对于 公司奖金计算问题,主要根据 i属于 的不同范围 , 计算不同的奖金额。 3 对于 利用坐标求高度问题, 先确定属于圆内的点的高度都为 10, 圆外点的高度都为 0。 (三)相关理论 基础 1 用 strlen 函数输出 位数,用 streev 函数 输出它的 逆序 数字 2 计算 公司奖金计算问题, 计算 bon1=100000*0.1 的 值 计算 bon2=bon1+100000*0.075 的 值 计算 bon4=bon2+200000*0.05 的 值 计算 bon6=bon4+20000
3、0*0.03 的 值 计算 bon10=bon6+400000*0.015 的 值 3 利用坐标求高度问题 ,在 圆范围之内的坐标高度为 10, 圆外的坐标高度为 0。 二 算法分析及流程图 (一)按逆序输出位数及每位数字 问题 1 给一个不多于 5 位的正整数,要求: 1求出它是几位数; 2分别输出每一位数字; 3按逆序输出各位数字,例如 321,应输出 123。 ( 1)算法 分析: 输入 一个不 多于 5 位 的 数字 ,输出它的位数就需要用到 strlen函数 ,输出 它的 逆序 数字则要用到 streev 函数 。 ( 2) N-S图 限定 数字范围小于 1000 输入 字符串 根据
4、 strlen 和 streev 函数输出结果 程序 结束 2 图 1.1 (二)公司奖金 计算 问题 2 企业发放的奖金根据利润提成。利润 I低于或等于 100000 元时,奖金可提 10%;利润高于 100000 元,低于 200000 元( 1000001000000 时,超过 1000000 元的部分按 1%提成。从键盘输入当月利润 I,求应发奖金总数。 要求: ( 1) 用 if 语句编程序; ( 2) 用 switch 语句编程序。 ( 1) 算法分析 : 根据 利润的不同来计算相应的奖金,则需要用到 条件 语句 if或 switch, 定义 6个 变量 i、 bonus、 bon
5、1、 bon2、 bon6、 bon10, 其 中 i为 利润, bonus 及 bon1、 bon2、 bon6、 bon10 为 奖金额。 ( 2) N-S图 定义 6个 变量 i, bonus, bon1, bon2, bon6, bon10 计算 bon1=100000*0.1 的 值 计算 bon2=bon1+100000*0.075 的 值 计算 bon4=bon2+200000*0.05 的 值 计算 bon6=bon4+200000*0.03 的 值 计算 bon10=bon6+400000*0.015 的 值 根据相应 的 i的 值,计算不同 i值 对应的奖金额 bonus
6、输出 奖金值,程序结束 图 1.2 (三) 利用坐标求高度问题 3 有 4个圆塔,圆心分别为( 2,2)、( -2, 2)、( -2, -2)、( 2, -2),圆半径为 1,。这 4 个塔的高度为 10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。 ( 1) 算法 分析 : 在 以( 2, 2) , ( -2, 2) , ( -2, -2) , ( 2, -2) 为 圆心, 1 为 半径的圆上的 高度 都为 10, 其他地方的 高度 均为 0, 定义 15 个 变量x,y,x1,y1,x2,y2,x3,y3,x4,y4,d1,d2,d3,d4,h.x1,y1;x
7、2,y2;x3,y3;x4,y4分别 是 4个 圆心的坐标, d1,d2,d3,d4分别 为 所在 4个 圆 内 的点的高度 ,h 定义 为高度。 ( 2) N-S图 定义变量 h 为 高度 分别 定 义 变量 x,y,x1,y1,x2,y2,x3,y3,x4,y4,d1,d2,d3,d4 为圆心 坐标和 圆 内高度 根据 不同的坐标值,分别输出 h的 值,即建筑物的高度 3 程序 结束 图 1.3 三 实验过程分析 (一 ) 数据和函数说明 1 按逆序输出位数及每位数字 问题 (1)编写 程序: #include #include int main() char num1000; scanf
8、(“%s“,num); printf(“你输入的是 %d 位数 ,逆序数是 %s“,strlen(num),strrev(num); return 0; 运行结果 ; ( 2) 程序 分析: 程序 第 2 行 用了 头文件 #include, 是因为下面运用了 strlen 和strrev 函数 。 程序 第 5 行 是对输入数字的限定,输入的数字不能大于 1000, 即输入 的数字不多于 5位 。 输出 函数 运行之后的值,程序结束 。 2 公司奖金计算问题 ( 1) 编写程序 用 If 语句编写 的程序: #include “stdio.h“ void main() long i; flo
9、at bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(“请输入利润 i:“); scanf(“%ld“, if(i int main() int i; double bonus,bon1,bon2,bon4,bon6,bon10; int branch; bon1=100000*0.1; bon2=bon1+100000*0.075; bon
10、4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(“请输入利润 i:“); scanf(“%d“, branch=i/100000; if(branch10) branch=10; switch(branch) case 0:bonus=i*0.1;break; case 1:bonus=bon1+(i-100000)*0.075;break; case 2: case 3:bonus=bon2+(i-200000)*0.05;break; case 4: case 5:bonus=bon4+(
11、i-400000)*0.03;break; case 6: case 7: case 8: case 9:bonus=bon6+(i-600000)*0.015;break; case 10:bonus=bon10+(i-100000)*0.01; printf(“奖金是 %10.2fn“,bonus); return 0; 5 ( 2) 程序 分析: 1 用 if 语句编写 的程序: 程序 第 4 行 定 义 长 整 型 变 量 i , 程 序 第 5 行 定 义 实 型 变 量bonus,bon1,bon2,bon4,bon6,bon10。 程序 第 6 , 7 , 8 , 9 , 10
12、行 分 别 计 算bon1=100000*0.1;bon2=bon1+100000*0.075;bon4=bon2+200000*0.05;bon6=bon4+200000*0.03; bon10=bon6+400000*0.015 的 值。 程序 第 11 行 输入变量 i的 值。 程序 第 13 行 开始为 if 条件 语句, 当 i1000000 时,bonus=bon10+(i-1000000)*0.01。 程序第 25行输出奖金额 , %10.2f 表示 输出奖金的数据最小宽度为 10 位 , 小数 部分 输出 2位 或截取的字符个数是 2个 。 光标换行 ,程序结束。 2 用 sw
13、itch 编写 的程序 程序 第 4 行 定 义 变量 i, 程序第 7, 8, 9, 10, 11 行 分别计算bon1=100000*0.1;bon2=bon1+100000*0.075;bon4=bon2+200000*0.05;bon6=bon4+200000*0.03;bon10=bon6+400000*0.015 的 值。 程序第 12 行 输入变量 i 的。 在 程序第 16 行 以后的 case 后面 的语句中,最后都有一个 break 语句 ,它的作用是使流程转到 switch 语句 的末尾( 即 右 花 括号处) 。 程序 第 29 行 输出奖金, %10.2f 表示 输出
14、奖金的数据最小宽度为 10 位 , 小数部分 输出 2 位 或截取的字符个数是 2个 。 光标换行 ,程序结束。 3利用坐标求高度问题 ( 1) 编写 程序 #include int main() int h_45=10; float x1_45=2,y1_45=2,x2_45=-2,y2_45=2,x3_45=-2,y3_45=-2,x4_45=2,y4_45=-2,x_45,y_45,d1_45,d2_45,d3_45,d4_45; printf(“请输入一个点( x,y) :“); sacnf(“%f,%f“, d1_45=(x_45-x4_45)*(x_45-x4_45)+(y_45-
15、y4_45)*(y_45-y4_45); d2_45=(x_45-x1_45)*(x_45-x1_45)+(y_45-y1_45)*(y_45-y1_45); d3_45=(x_45-x2_45)*(x_45-x2_45)+(y_45-y2_45)*(y_45-y2_45); d4_45=(x_45-x3_45)*(x_45-x3_45)+(y_45-y3_45)*(y_45-y3_45); if(d1_451 printf(“该点高度为 %dn“,h_45); 6 return 0; (2)程序 分析 : 程序 第 4 行 定义变量 h,同时给 h 赋值为 10。 程序 第 5 行 定 义
16、变量 x,y,x1,y1,x2,y2,x3,y3,x4,y4,d1,d2,d3,d4, 并 给定初始值 x1,x4,y1,y2 为 2、 x2,x3,y3,y4 为 -2。 程序 第 8, 9, 10, 11 行定义 以 ( 2, 2) ( -2, 2) ( -2, -2) ( 2, -2) 为 圆心,1为 半径的 圆内 高度为 10。 程序 第 12 行 进行判断,如果坐标不在圆内,则其高度为 0; 否则高度为 10。 程序 第 13 行 输出 高度 h。 光标 换行,程序结束。 (二 ) 实验 工具 Visual C+6.0 ( 三 ) 调试 过程 1 按逆序输出位数及每位数字 问题 1
17、显示程序没有语句和逻辑上的错误,如图 1.4 图 1.4 2运行程序,输入一个数 6314,输出了它是 4位数,并且还输出它的逆序数 1436,如图 1.5 7 图 1.5 2 公司奖金计算问题 ( 1) 用 if 语句 编写的程序: 1程序显示没有语言和逻辑错误,如图 1.6 图 1.6 2第一次 运行 结果,输入的利润为 5000 元,输出的奖金为 500 元,如图 1.7 8 图 1.7 2 第二次运行结果,输入的利润值为 150000 元,输出的奖金为 13750 元,如图1.8 图 1.8 4第三次运行结果,输入的利润值为 300000 元时,输出的奖金则为 22500 元,如图 1.9 9 图 1.9 5第四次运行结果,输入的利润值为 2000000 元,输出的奖金为 49500 元,如图2.0 图 2.0 ( 2) 用 switch 语句编写的程序 1显示 程序没有语句或逻辑上的错误 , 如图 2.1 10 图 2.1 2第一次 运行结果,输入利润值 5000, 输出的奖金为 500 元 ,如图 2.2 图 2.2