C语言程序设计案例操作和分析以课后习题为例.docx

上传人:b****7 文档编号:11095509 上传时间:2023-02-25 格式:DOCX 页数:25 大小:290.25KB
下载 相关 举报
C语言程序设计案例操作和分析以课后习题为例.docx_第1页
第1页 / 共25页
C语言程序设计案例操作和分析以课后习题为例.docx_第2页
第2页 / 共25页
C语言程序设计案例操作和分析以课后习题为例.docx_第3页
第3页 / 共25页
C语言程序设计案例操作和分析以课后习题为例.docx_第4页
第4页 / 共25页
C语言程序设计案例操作和分析以课后习题为例.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

C语言程序设计案例操作和分析以课后习题为例.docx

《C语言程序设计案例操作和分析以课后习题为例.docx》由会员分享,可在线阅读,更多相关《C语言程序设计案例操作和分析以课后习题为例.docx(25页珍藏版)》请在冰豆网上搜索。

C语言程序设计案例操作和分析以课后习题为例.docx

C语言程序设计案例操作和分析以课后习题为例

C语言程序设计案例操作和分析

——以课后习题为例

一引言

(一)研究的缘起

1第四章主要讲的是选择结果程序设计,前面第3章介绍了顺序结构程序设计。

在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的。

实际上,在很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作作选择其一。

这是选择结构要解决的问题。

2选择结构在进行程序处理的时候,就需要运用到选择语句。

同时也需要各种运算符、关系表达式以及它们之间的优先次序。

(二)本文的研究思路、方法及意义

1对于按逆序输出位数及每位数字问题,,输出它的位数就需要用到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+200000*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

输入字符串

根据strlen和streev函数输出结果

程序结束

图1.1

(二)公司奖金计算问题

2企业发放的奖金根据利润提成。

利润I低于或等于100000元时,奖金可提10%;利润高于100000元,低于200000元(100000

高于200000元的部分按5%提成;4000001000000时,超过1000000元的部分按1%提成。

从键盘输入当月利润I,求应发奖金总数。

要求:

(1)用if语句编程序;

(2)用switch语句编程序。

(1)算法分析:

根据利润的不同来计算相应的奖金,则需要用到条件语句if或switch,定义6个变量i、bonus、bon1、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

输出奖金值,程序结束

图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;x2,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的值,即建筑物的高度

程序结束

图1.3

三实验过程分析

(一)数据和函数说明

1按逆序输出位数及每位数字问题

(1)编写程序:

#include

#include

intmain()

{

charnum[1000];

scanf("%s",num);

printf("你输入的是%d位数,逆序数是%s",strlen(num),strrev(num));

return0;

运行结果;

(2)程序分析:

程序第2行用了头文件#include,是因为下面运用了strlen和strrev函数。

程序第5行是对输入数字的限定,输入的数字不能大于1000,即输入的数字不多于5位。

输出函数运行之后的值,程序结束。

2公司奖金计算问题

(1)编写程序

用If语句编写的程序:

#include"stdio.h"

voidmain()

{

longi;

floatbonus,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",&i);

if(i<=100000)

bonus=i*0.1;

elseif(i<=200000)

bonus=bon1+(i-100000)*0.075;

elseif(i<=400000)

bonus=bon2+(i-200000)*0.05;

elseif(i<=600000)

bonus=bon4+(i-400000)*0.03;

elseif(i<=1000000)

bonus=bon6+(i-600000)*0.015;

else

bonus=bon10+(i-1000000)*0.01;

printf("奖金是%10.2f\n",bonus);

}

用switch语句编写的程序:

#include

intmain()

{

inti;

doublebonus,bon1,bon2,bon4,bon6,bon10;

intbranch;

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("%d",&i);

branch=i/100000;

if(branch>10)branch=10;

switch(branch)

{case0:

bonus=i*0.1;break;

case1:

bonus=bon1+(i-100000)*0.075;break;

case2:

case3:

bonus=bon2+(i-200000)*0.05;break;

case4:

case5:

bonus=bon4+(i-400000)*0.03;break;

case6:

case7:

case8:

case9:

bonus=bon6+(i-600000)*0.015;break;

case10:

bonus=bon10+(i-100000)*0.01;

}

printf("奖金是%10.2f\n",bonus);

return0;

}

(2)程序分析:

1>用if语句编写的程序:

程序第4行定义长整型变量i,程序第5行定义实型变量bonus,bon1,bon2,bon4,bon6,bon10。

程序第6,7,8,9,10行分别计算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条件语句,当i<=100000时,bonus=i*0.1;当1000001000000时,bonus=bon10+(i-1000000)*0.01。

程序第25行输出奖金额,%10.2f表示输出奖金的数据最小宽度为10位,小数部分输出2位或截取的字符个数是2个。

光标换行,程序结束。

2>用switch编写的程序

程序第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表示输出奖金的数据最小宽度为10位,小数部分输出2位或截取的字符个数是2个。

光标换行,程序结束。

3利用坐标求高度问题

(1)编写程序

#include

intmain()

{

inth_45=10;

floatx1_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",&x_45,&y_45);

d1_45=(x_45-x4_45)*(x_45-x4_45)+(y_45-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_45>1&&d2_45>1&&d3_45>1&&d4_45>1)h_45=0;

printf("该点高度为%d\n",h_45);

return0;

}

(2)程序分析:

程序第4行定义变量h,同时给h赋值为10。

程序第5行定义变量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。

光标换行,程序结束。

(二)实验工具

VisualC++6.0

(三)调试过程

1按逆序输出位数及每位数字问题

1>显示程序没有语句和逻辑上的错误,如图1.4

图1.4

2>运行程序,输入一个数6314,输出了它是4位数,并且还输出它的逆序数1436,如图1.5

图1.5

2公司奖金计算问题

(1)用if语句编写的程序:

1>程序显示没有语言和逻辑错误,如图1.6

图1.6

2>第一次运行结果,输入的利润为5000元,输出的奖金为500元,如图1.7

图1.7

2>第二次运行结果,输入的利润值为150000元,输出的奖金为13750元,如图1.8

图1.8

4>第三次运行结果,输入的利润值为300000元时,输出的奖金则为22500元,如图1.9

图1.9

5>第四次运行结果,输入的利润值为2000000元,输出的奖金为49500元,如图2.0

图2.0

(2)用switch语句编写的程序

1>显示程序没有语句或逻辑上的错误,如图2.1

图2.1

2>第一次运行结果,输入利润值5000,输出的奖金为500元,如图2.2

图2.2

3>第二次运行结果,输入200000的利润值,输出的奖金是17500元,如图2.3

图2.3

4>第三次运行结果,输入500000元的利润值,输出的奖金为30500元,如图2.4

图2.4

3利用坐标求高度问题

1>显示程序没有语句或逻辑上的错误,如图2.5

图2.5

2>输入坐标(2,3),输出的高度为10,如图2.6

图2.6

 

3>输入坐标(0,0),输出的高度为0,如图2.7

图2.7

5>输入坐标(-1,-4),输出的高度为0,如图2.8

图2.8

四结果与讨论

(一)程序代码

1按逆序输出位数及每位数字问题

#include

#include

intmain()

{

charnum[1000];

scanf("%s",num);

printf("你输入的是%d位数,逆序数是%s",strlen(num),strrev(num));

return0;

2公司奖金计算问题

(1)if语句程序

#include"stdio.h"

voidmain()

{

longi;

floatbonus,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",&i);

if(i<=100000)

bonus=i*0.1;

elseif(i<=200000)

bonus=bon1+(i-100000)*0.075;

elseif(i<=400000)

bonus=bon2+(i-200000)*0.05;

elseif(i<=600000)

bonus=bon4+(i-400000)*0.03;

elseif(i<=1000000)

bonus=bon6+(i-600000)*0.015;

else

bonus=bon10+(i-1000000)*0.01;

printf("奖金是%10.2f\n",bonus);

}

(2)switch语句

#include

intmain()

{

inti;

doublebonus,bon1,bon2,bon4,bon6,bon10;

intbranch;

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("%d",&i);

branch=i/100000;

if(branch>10)branch=10;

switch(branch)

{case0:

bonus=i*0.1;break;

case1:

bonus=bon1+(i-100000)*0.075;break;

case2:

case3:

bonus=bon2+(i-200000)*0.05;break;

case4:

case5:

bonus=bon4+(i-400000)*0.03;break;

case6:

case7:

case8:

case9:

bonus=bon6+(i-600000)*0.015;break;

case10:

bonus=bon10+(i-100000)*0.01;

}

printf("奖金是%10.2f\n",bonus);

return0;

}

3利用坐标求高度问题

#include

intmain()

{

inth_45=10;

floatx1_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",&x_45,&y_45);

d1_45=(x_45-x4_45)*(x_45-x4_45)+(y_45-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_45>1&&d2_45>1&&d3_45>1&&d4_45>1)h_45=0;

printf("该点高度为%d\n",h_45);

return0;

}

(二)分析与讨论

1if语句用来实现两个分支的选择结构,switch语句实现多分支的选择结构。

if语句的一般形式为:

if(表达式)语句1

[else语句2]

最常用的还有以下三种形式:

1>if(表达式)语句1(没有else子句部分)

2>if(表达式)(有else子句部分)

语句1

Else

语句2

3>if(表达式1)语句1(在else部分又嵌套了多层的if语句)

Elseif(表达式2)语句2

Elseif(表达式3)语句3

..

..

..

Elseif(表达式m)语句m

Else语句m+1

说明:

1>语句1、语句2、语句3…语句m等是if语句中的“内嵌语句”每个内嵌语句的末尾都应当有分号。

2>if语句无论写在几行上,都是一个整体,属于同一个语句。

2关系运算符及次序:

在C语言中,比较符(比较运算符)称为关系运算符。

(1)6种关系运算符:

1)<(小于)

2)<=(小于或等于)

3)>(大于)

4)>=(大于或等于)

5)==(等于等于)

6)!

=(不等于)

(2)关于优先次序:

1>前4种关系运算符(<,<=,>,>=)的优先级别相同,后2种也相同。

前4种高于后两种。

例如“>”优先于“==”。

而“>”与“<”优先级相同。

2>关系运算符的优先级低于算数运算符。

3>关系运算符的优先级高于赋值运算符。

3关系表达式.用关系运算符将两个数值或数值表达式连接起来的式子,称关系表达式.

关系表达式的值是一个逻辑值,即"真"或"假".例如,关系表达式”5==3”的值为”假”,”5>=3”的值为“真”。

在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”。

关系表达式“a>b”的值为“真”,表达式的值为1.

关系表达式“(a>b)==c”的值为“真”,表达式的值为1.

关系表达式“b+c

3“&&”是逻辑运算符中的“逻辑与”,a&&b,如果a和b都为真,否则为假。

“!

”是逻辑运算符中的“逻辑非”,!

a为真,如果a为真,则!

a为假。

4条件运算符。

(1)条件运算符由两个符号(?

和:

)组成,必须一起使用。

要求有三个操作对象,称为三目(元)运算符,它是C语言中唯一的一个三目运算符。

(2)条件运算符的一般形式为:

表达式1?

表达式2:

表达式3.

(三)研究结论

1为了方便程序阅读,要把表达式用()括号括起来。

2f格式字符。

用来输出实数(包括单、双精度、长双精度),以小数形式输出,有几种用法:

(1)基本型,用%f。

实数中的整数部分全部输出,小数部分输出6位。

(2)指定数据宽度和小数位数,用%m.nf。

输出数据占m列,其中包括n位小数。

一个双精度数只能保证15位有效数字的精确度,即使指定小数位数为50,也不能保证输出的50位都是有效数字。

(3)输出的数据向左对齐,用%-m.nf。

在m.n的前面加一个负号,其作用与%m.nf形式作用基本相同,但当数据不超过m时,数据向左靠,右端补空格。

3sterev()是函数反转字符串,原型:

exturnchar*strrev(char*s),此函数的功能是把字符串s的所有字符顺序颠倒过来(不包括空字符(NULL))。

五改进建议

运用相应的函数可以使程序变得更为简单,如本篇文章中的按逆序输出位数及每位数字问题,如果不运用函数,运用算术的方法来编程的话,程序如下:

#include

#include

intmain()

{

intnum,indiv,ten,hundred,thousand,ten_thousand,place;

printf("请输入一个整数(0-99999):

");

scanf("%d",&num);

if(num>9999)

place=5;

elseif(num>999)

place=4;

elseif

(num>99)

place=3;

elseif(num>9)

place=2;

elseplace=1;

printf("位数:

%d\n",place);

printf("每位数字为:

");

ten

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1