c语言第七章课后题教学文案.docx
《c语言第七章课后题教学文案.docx》由会员分享,可在线阅读,更多相关《c语言第七章课后题教学文案.docx(18页珍藏版)》请在冰豆网上搜索。
c语言第七章课后题教学文案
c语言第七章课后题
一、第七章习题7(p184-p187),7.1-7.7全做,7.8-7.12中选做两道,要求给出程序执行结果。
7-1、
#include
intSquare(inti)
{
returni*i;
}
intmain()
{
inti=0;
i=Square(i);
for(;i<3;i++)
{
staticinti=1;
i+=Square(i);
printf("%d,",i);
}
printf("%d\n",i);
return0;
}
结果:
结果分析:
开头定义square()函数
功能:
计算一个数的平方
入口参数:
整数x
返回值:
i*i
主函数:
i=0;进入循环:
静态变量i=1;
i=i+square
(1)=2;
输出2;
循环变量i=0+1=1;
i=1<3成立
静态变量i=i+square
(2)=2+4=6;
输出6;
循环变量i=i+1=2;
I=2<3成立
静态变量(i保持原值)i=6;
i=i+square(6)=6+36=42;
输出42;
循环变量i=i+1=3;
I=3<3不成立退出循环
输出循环变量i=3
7-2、
#include
inthour,minute,second;/*定义全局变量*/
voidupdate()
{
second++;
if(second==60)
{
second=0;
minute++;
}
if(minute==60)
{
minute=0;
hour++;
}
if(hour==24)
hour=0;
}
voiddisplay()
{
printf("%d:
%d:
%d\n",hour,minute,second);
}
voiddelay()
{
intt;
for(t=0;t<100000000;t++);/*用循环体为空语句的循环实现延时*/
}
intmain()
{
inti;
second=0;
for(i=0;i<1000000;i++)
{
update();/*利用循环控制时钟运行时间*/
display();/*显示时,分,秒*/
delay();/*模一尺时间为1秒*/
}
return0;
}
结果:
自动跳出时间
7-3、
#include
/*max()函数
功能:
找两个数的最大值
入口参数:
两个整数a,b
返回值:
两数的最大值
*/
intmax(inta,intb)
{
intmax=0;
max=(a>b)?
a:
b;
returnmax;
}
voidmain()
{
intx=0;/*输入的两个数x,y*/
inty=0;
intm=0;/*m用于接收max()函数的返回值*/
printf("inputtwointegernumbers:
");
scanf("%d,%d",&x,&y);
m=max(x,y);
printf("themaxnumberis%d\n",m);
}
结果:
7-4
#include
/*LCM()函数
功能:
计算两个整数的最小公倍数
入口参数:
两整数a,b
返回值:
最小公倍数
*/
intLCM(inta,intb)
{
inti=0;/*循环变量*/
intmin=0;/*循环寻找范围的最小值*/
intmax=0;/*循环寻找范围的最大值*/
min=(a>b)?
a:
b;/*最小值为a,b中的最大值*/
max=a*b;/*最大值为a*b*/
for(i=min;i<=max;i++)
{
if(i%a==0&&i%b==0)
returni;
}
}
voidmain()
{
intx;/*键盘输入两整数x,y*/
inty;
intm;/*m用于接收LCM()函数的返回值*/
do{/*输入整数的合法数据*/
printf("输入两个正整数:
");
scanf("%d,%d",&x,&y);
}while(x<0||y<0);
m=LCM(x,y);
printf("最小公倍数为:
%d\n",m);
}
结果:
7-5、
#include
longfact(intn);
voidmain()
{
inti=0;/*循环变量*/
intn=0;/*输入的值*/
intm=0;/*接收fact()函数的返回值*/
do{
printf("inputn:
");
scanf("%d",&n);
}while(n<0);
for(i=1;i<=n;i++)
{
m=fact(i);
printf("%d!
=%ld\n",i,m);
}
}
/*fact函数
功能:
计算n!
入口参数:
n
返回值:
n!
*/
longfact(intn)
{
staticlongp=1;
p=p*n;
returnp;
}
结果:
7-6、
#include
longfact(intn);
voidmain()
{
inti=0;/*循环变量*/
intn=0;/*输入的值*/
intm=0;/*接收fact()函数的返回值*/
longs=0;/*所求最终结果*/
do{
printf("inputn:
");
scanf("%d",&n);
}while(n<0);
for(i=1;i<=n;i++)
{
m=fact(i);
s=s+m;
}
printf("1!
+2!
+...+n!
=%ld\n",s);
}
/*fact函数
功能:
计算n!
入口参数:
n
返回值:
n!
*/
longfact(intn)
{
staticlongp=1;
p=p*n;
returnp;
}
结果:
7-7、
(1)穷举法:
#include
intGcd(inta,intb);
voidmain()
{
intx=0;/*键盘键入两个数*/
inty=0;
intm=0;/*接收Gcd的返回值*/
do{
printf("输入两个正数:
");
scanf("%d,%d",&x,&y);
}while(x<0||y<0);
m=Gcd(x,y);
printf("最大公约数:
%d\n",m);
}
/*Gcd()函数
功能:
计算两数的最大公约数
入口参数:
两个正数a,b
返回值:
最大公约数
*/
intGcd(inta,intb)
{
inti=0;
intt=0;
t=(a
a:
b;/*t为a,b中的较小者*/
for(i=t;i>=1;i--)
{
if(a%i==0&&b%i==0)
returni;
}
}
结果:
(2)欧几里得算法
#include
intGcd(inta,intb);
voidmain()
{
intx=0;/*键盘键入两个数*/
inty=0;
intm=0;/*接收Gcd的返回值*/
do{
printf("输入两个正数:
");
scanf("%d,%d",&x,&y);
}while(x<0||y<0);
m=Gcd(x,y);
printf("最大公约数:
%d\n",m);
}
/*Gcd()函数
功能:
计算两数的最大公约数
入口参数:
两个正数a,b
返回值:
最大公约数
*/
intGcd(inta,intb)
{
intr=0;
r=a%b;
if(r!
=0)
{
do{
a=b;
b=r;
r=a%b;
}while(r!
=0);
}
returnb;
}
结果:
(3)递归方法:
#include
intGcd(inta,intb);
voidmain()
{
intx=0;/*键盘键入两个数*/
inty=0;
intm=0;/*接收Gcd的返回值*/
do{
printf("输入两个正数:
");
scanf("%d,%d",&x,&y);
}while(x<0||y<0);
m=Gcd(x,y);
printf("最大公约数:
%d\n",m);
}
/*Gcd()函数
功能:
计算两数的最大公约数
入口参数:
两个正数a,b
返回值:
最大公约数
*/
intGcd(inta,intb)
{
if(a==b)/*递归出口*/
returna;
else
{
if(a>b)
returnGcd(a-b,b);
else
returnGcd(b,b-a);
}
}
结果:
7-9、
#include
/*old()函数
功能:
计算第i个人的年龄
入口参数:
人数i
返回值:
年龄
*/
intold(inti)
{
if(i==1)
return10;
else
returnold(i-1)+2;
}
voidmain()
{
intx=5;/*人数为5*/
inty=0;/*接收old()函数的返回值*/
y=old(x);
printf("第五个人的年龄为:
%d\n",y);
}
结果:
7-10、
#include
voidmain()
{
intflag=0;/*设置标志变量*/
inta=0;/*百位*/
intb=0;/*十位*/
intc=0;/*个位*/
intm=0;/*代表acb*/
intn=0;/*代表bac*/
intp=0;/*代表bca*/
intq=0;/*代表cab*/
intr=0;/*代表cba*/
inti=0;/*从100~999中找abc*/
intsum=0;/*观众计算得结果*/
printf("说出你的计算结果:
");
scanf("%d",&sum);
for(i=100;i<=999;i++)
{
a=i/100;
b=i/10%10;
c=i%10;
m=a*100+c*10+b;
n=b*100+a*10+c;
p=b*100+c*10+a;
q=c*100+a*10+b;
r=c*100+b*10+a;
if((m+n+p+q+r)==sum)
{
flag=1;/*一旦找到就退出循环*/
break;
}
}
if(flag==0)/*未找到说明计算错误*/
{printf("你算错了!
");}
else
{printf("你想的数是%d%d%d\n",a,b,c);}
}
结果:
二、收集资料并整理,叙述结构化程序设计的基本思想;根据自己的编程,说说你对结构化程序设计的理解。
模块化程序设计:
1、定义:
将系统划分为若干个子系统,任务划分为若干个子任务,本质思想就是实现不同层次的数据或过程的抽象过程。
2、模块分解的基本原则
(1)、保证模块的相对独立性——高聚合、低耦合。
高聚合:
模块内部的联系越紧密越好,就是使模块的功能要相对独立和单一。
低耦合:
模块之间的联系越松越好,就是使模块之间的接口越简单越好。
(2)、模块的实现细节对外不可见——信息隐藏。
外部:
关心做什么;内部:
关心怎么做。
实质:
把不需要调用者知道的信息都封装在模块内部,是模块的实现细节对外不可见。
3、设计好模块接口
(1)、接口指罗列出一个模块的所有的与外部打交道的变量等
(2)、定义好后不要轻易改动。
(3)、在模块开头(文件的开头)进行函数声明。
4、结构化程序设计思想:
(1)、逐步求精:
将一个完整的、较复杂的问题分解成若干个相对独立的、较为简单的子问题,若这些子问题还较为复杂可再分解它们,直到能够容易的用某种高级语言表达为止。
(2)、自底向上:
先编写出基础程序段,然后再扩大、扩充和升级。
(3)、自顶向下:
先写出结构简单的、清晰的主程序来表达整个问题;在此问题中包含的复杂子问题用子程序来实现;直到每个细节都可用高级语言表达为止。
总结:
逐步求精技术-------是一种由不断的自底向上修正的所补充的自顶向下的程序设计方法。
其特点:
<1>、程序结构清晰、容易阅读、容易修改
<2>、可简化程序的正确性验证,可减少程序调试的时间和复杂度。
5、用逐步求精实现技术求解问题的步骤为:
<1>、对实际问题进行全局性分析、决策,确定数学模型。
<2>、确定程序的总体结构,将整个问题分解成若干个相对独立的子问题。
<3>、确定子问题的具体功能及其相互关系。
<4>、在抽象的基础上,将整个问题逐一精细化,直到能用确定的高级语言描述为止。
我对结构化程序设计的理解:
1、由于将复杂程序分解,对每个子程序的检查可局限于内部,结构化设计可减少错误的发生,易寻找错误。
2、可精简程序设计的复杂程度,对一个特定的功能只需局限于一个相对独立的子程序的设计。
3、结构化程序设计也是模块化程序设计的一种,增强可读性。
4、结构化设计要注意参数之间的传递,实际是以参数的传递为纽带。
三、收集资料,简要叙述C语言编码中应注意的基本编码规范。
1、代码行:
(1)、一行内只写一条语句,一行代码只定义一个变量。
容易阅读并且便于程序测试和写注释。
(2)、在定义变量时同时初始化该变量。
可避免初始化被遗忘,或者引用未初始化的变量。
2、对齐与缩进:
(1)、程序的分界符{和}一般独占一行,且位于同一列,同时与应用他们的语句左对齐,这样便于查看{和}的配对情况
(2)、采用梯形层次对应好个层次,同层次的代码在同层次的缩进层上,即位于同一层{和}之内的代码在{右边数格出左对齐。
(3)、一般用设置为4个空格的Tab键缩进。
3、空行及代码行内的空格
(1)、在每个函数定义结束后加一空行,能起到是程序布局美观、整洁和清晰的作用。
(2)、在一个函数体内,相邻的两组逻辑上紧密相关的语句块之间加空行。
(3)、关键字后加空格,用于突出关键字。
列如:
int、float等后面至少加一个空格,if、for、while等后面加一个空格
(4)、函数名后面不加空格,一般与关键字区分开
(5)、赋值、算术、关系、逻辑等运算符的前后各加一个空格,但一元运算符前后不加。
(6)、对表达式较长的for、if语句,为了紧凑,可在适当的地方去掉一些空格。
(7)、左圆括号向后紧跟,右圆括号、逗号、分号向前进跟,紧跟处不留空格。
(8)、函数参数的逗号分隔符和for中的分号后面加一个空格,可增加单行的清晰度。
4、长行拆分
如果代码行太长,则要在适当的位置进行拆分,拆分出的新行要进行适当的缩进,使排版整齐。
5、程序注释:
(1)、在重要的程序文件的首部,对程序的功能、编程者、编程日期以及其他相关信息(如:
版本号)加以注释说明
(2)、在用户自定义函数的前面,对函数接口加以说明
(3)、在一些重要的语句行的右方,如在定义一些非通用的变量、函数调用、较长的多重嵌套的语句块结束处加以说明。
(4)、在一些重要的语句块的上方,尤其是在语义转折处,对代码的功能、原理进行解释。
成绩
批阅教师
批阅日期