




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章 语句和函数实训语句和函数是C+最基本的语法单位。语句组成函数,函数构成程序。本章要求掌握赋值语句、条件语句、循环语句的编程技巧,学会使用函数编制程序。3.1 典型习题解答【例3.1】求下列表达式运算后x的值: int x=1,y=8; x-=x x*=3-5 x%=y/=3 x+=x%=x-=-x+【解答】 x-=x即x=x-x得x=0 x*=3-5即x*=(3-5) x=x*(-2)得x=-2 x%=y/=3即 x=x%(y=y/3) x=x%(8/3) x=x%2=1%2得 x=1 x+=x%=x-=-x+其中,x-=-x+就是x=x-(-x+),x-(-x)得2,+操作要在表达式计算完后执行。原式即 x=x+(x=x%(x=x-(-x+) x+(x=x%(x=x-(-x)得 x+(x=x%(2) =x+(x=2%2)=x+0=0最后执行+操作,得x=1。 【例3.2】 用for语句、while语句和递归函数三种方法计算n!。【解答】用for语句实现的程序为:void main() int n,f=1; cout”输入n:”n; if (n=0) for(int u=1;u=n;u+) f*=u; cout”结果是 :”fendl; else cout”这是个负数.”endl;用while语句实现的程序为:void main() int n,f=1;cout”输入n:”n;if (n=0) while (n0) f*=n;n-; cout”结果是 :”fendl; else cout”这是个负数.”endl; 用递归实现的程序为:int ff(int x) if (x=0) return 1;if (x=1) return 1;else return x*ff(x-1);void main() int n,f=1;cout”输入n:”n;if (n=0) coutff(n);else cout”这是个负数.”endl;【例3.3】用for语句求1到100中是3的倍数的数的和。【解答】若一个数x是3的倍数,则x除以3余数为0,也就是x%3=0。#include void main()int sum=0,i; for(i=1;i=100;i+) if(i%3=0) sum+=i; cout结果是:sum;运行显示,结果是:1683。【例3.4】判断正误,不正确的请说明原因。a) switch选择结构中必须有break。b) switch选择结构的default后必须有break语句。c) if (k=9) cout“好的”;d) for (int I=0;I=8;k+) cout”好的”;e) while (k=9) k-;cout”好的”;【解答】a) 对。因为每个case只是入口的标志,一旦进入某个入口,则一直会被执行下去,并非遇到下一个case就终止。b) 错。因为default都是在switch语句的最后。故其后不一定要break。c) 错。if语句当中的条件表达式不合法。d) 错。因为for语句中的循环变量不改变,故这是一个死循环。e) 错。while语句的条件语句是个值为9的赋值语句,故是死循环。 【例3.5】 编程打印如下的图形: * * * * * * * * *【解答】这个程序应该反复调试,直到满意为止,对于前3行,第i行星号前有4-i个空格,有i个星号,对于后2行,第i行星号前有i-2个空格,有6-i个星号,程序如下: #include void main() int i,j; for(i=1;i=3;i+) for(j=1;j=4-i;j+) cout ;for(j=1;j=i;j+) cout* ; coutendl; for(i=4;i=5;i+) for(j=1;j=i-2;j+) cout ;for(j=i;j=5;j+) cout* ; coutendl; 【例3.6】定义一个整型的二维数组并将各数组元素都赋初值1。【解答】可以用循环语句为数组赋值。void main() int a34; for(int j=0;j3;j+) for(int k=0;k4;k+) ajk=1;【例3.7】 分别用循环语句和递归编写两个由加法实现整数相乘的程序。【解答】若求x*y,就用y个x相加实现。(1) 用循环语句的方法实现的程序:#include int intabs(int x) /求绝对值 if (x=0) return x;else return -x;int multiply(int x,int y) /用循环语句实现 int multi=0;for(int j=1;j=y;j+)multi+=x ; return multi;void main() int x,y; cout输入两个数:xy; if(x=0)|(y=0) 结果是:0; else cout 结果是:endl; coutmultiply(intabs(x),intabs(y); 用递归的方法:#include int intabs(int x) /求绝对值 if (x=0) return x;else return -x;int multiply(int x,int y) /用递归实现 if (x=1) return y; else if (y=1) return x; else return multiply(x-1,y)+y;void main() int x,y; cout输入两个数:xy; if(x=0)|(y=0) cout 结果是:0; else cout 结果是:endl; coutmultiply(intabs(x),intabs(y); 上面的程序有条件语句的嵌套,有函数的递归调用,还有函数的传递参数。应该仔细的体会。【例3.8】一个函数可以使用多个return语句吗?【解答】可以。下面举例说明。读入一个数,判断是否正数。#include bool decide(float s) if (s0) return true;else return false;void main() float kl;cout请输入一个数: kl;if (decide(kl) cout你输入的是正数.;else couty) temp=x;else temp=y;if (ztemp) temp=z;return temp;double max(double x, double y, double z) double temp;if(xy) temp=x;else temp=y;if (ztemp) temp=z;return temp;【例3.10】 选择函数重载的理由是什么?【解答】选择函数的重载是因为具有相同功能的多个函数只要选择一个函数名,就可以表示它们,不论是编写程序的时候还是阅读修改程序的时候都可以带来方便。 【例3.11】函数的返回值的类型是由什么决定的。【解答】函数的返回值的类型是由在函数名前指定的类型决定的,函数的返回值是由retrun 语句带出来的,如果retrun语句带出来的数据的类型不和指定的类型一样,那么将会进行自动的类型的转换。【例3.12】分析下面程序的执行结果。#includevoid main() int a23 ;int j,k; for( j=0;j2;j+) for(k=0;k3;k+) ajk=(j+1)*(k+1);for( j=0;j2;j+) for( k=0;k3;k+) coutajk ; coutendl;【解答】这里主要理解2个双重循环的执行情况,都是执行2*3=6次。数组下标是从0开始的,结果是:1 2 32 4 6【例3.13】编程查找一个二维字符数组里为a的元素的个数。【解答】求二维字符数组要用2重循环,假设是3行5列的字符数组。 #includevoid readchar(char a35) int j,k;cout请输入字符到数组:endl;for(j=0;j3;j+)for(k=0;kajk;void main() char a35;int count=0,j,k;readchar(a);for(j=0;j3;j+)for(k=0;k5; k+) if(ajk=a) count+;cout有: count个a. endl;【例3.14】 函数的定义如下: n和k均为整数,试编写程序计算此函数。【解答】对于递归定义的函数,一般用递归算法编写程序。#includeint bin(int n,int k) if(nk) return 0; if(n=k) return 1;else return bin(n,k+1)*(k+1)/(n-k);void main() cout 结果是:; coutbin(8,2) endl;结果是:28【例3.15】 编程实现华氏温度和摄氏温度的互相转换,转换的公式为 (F表示华氏温度, C表示摄氏温度): 【解答】摄氏温度到华氏温度的转换公式求得:F=C*9/5+32。编程如下:#includefloat FtoC(float x) return (float)5*(x-32)/9;/第一个数5强制转换为实数float CtoF(float x) return x*9/5+32;void main() float x;coutx; cout华氏温度为:CtoF(x) endl;coutx; cout摄氏温度为:FtoC(x) endl; 程序运行结果为:输入摄氏温度:31.5华氏温度为:88.7输入华氏温度:100摄氏温度为:37.7778其中有下划线部分是用户输入的。【例3.16】编个程序,利用stdlib.h函数库的itoa 函数实现整数到字符串的转换。【解答】程序如下:#include #include int main(void) int number ; char string25; coutnumber; itoa(number, string, 10); cout整数:numberendl; cout数字字符串:stringendl; itoa(number+122, string, 10); cout整数:number+122endl; cout数字字符串:stringendl;运行结果为:请输入一个整数: 586整数:586数字字符串:586整数:708数字字符串:708【例3.17】用stdlib.h中的随机函数rand,编一个程序随机给出1100中的两个数,让练习者求出2数的和,可以求2次,对了则打印“真棒,算对了” ,否则显示“真遗憾,算错了”。【解答】使用随机函数rand需要用函数srand进行初始化,srand函数参数一般取计算机时间time(NULL),time函数在time.h头文件里。完整程序如下:#include #include#includevoid main() int i,j,sum;srand(unsigned)time( NULL ) );i=rand()%100; j=rand()%100;cout请给出两数的和:;couti + jsum;if(sum!=i+j) cout再算一次吧.endl;couti + jsum;if(sum=i+j) cout真棒!算对了.endl;else cout真遗憾,算错了.endl;运行结果为:请给出两数的和:91 + 84 = 175真棒!算对了.第二次运行:请给出两数的和:7 + 83 = 95再算一次吧.7 + 83 = 90真棒!算对了.再运行一次:请给出两数的和:32 + 27 = 56再算一次吧.32 + 27 = 58真遗憾,算错了.【例3.18】分析下面程序的执行结果。#include void main() int i=0,j=7; if(i=1) if(j=7) coutOK; else coutNOT OK;【解答】无输出。这里要注意的是在没有的情况下else总是和最近的if语句结合。【例3.19】编一个程序,最多读入10个数,读入0表示结束。将读入的非零的数放在一个数组里,按从小到大的顺序排序后输出。【解答】程序如下:#includevoid main()int a10,j=0,temp;cout输入10个整数:a0;while(jaj; /用双重循环排序if (aj=0) j-;cout排序前:endl;for(int b=0;b=j;b+) coutabendl;for(int k=1;k=0;h-) if(ahah+1)temp=ah+1;ah+1=ah;ah=temp; cout排序后:endl;for(int u=0;u=j;u+) coutauendl;【例3.20】分析下面的程序的执行结果,上机运行,检查结果与你设想的是否一致。#includevoid c(int x,int y,int z)cout正确的结果是:endl;cout x 是:xendl;cout y 是:yendl;cout z 是:zendl;void main()int m=2;c(+m, +m, +m);m=2;c(m+, m+, +m);m=2;c(m+, +m, m+);m=2;c(+m, m+, +m);【解答】执行的结果如下:正确的结果是: x 是:5 y 是:4 z 是:3正确的结果是: x 是:3 y 是:3 z 是:3正确的结果是: x 是:3 y 是:3 z 是:2正确的结果是: x 是:4 y 是:3 z 是:3当函数的参数是表达式的时候,系统会对这些表达式求值,而在VC+6.0中,对的求值的顺序是从右向左,因此:对于函数调用:c(+m, +m, +m) 它有三个参数,先求第三个参数表达式,由于+m是先自加再传值,因此将2加1变为3,同理第二个参数也是先自加再传值,传给第二个参数的值是4,对第一个参数,传的值是5。.故函数将三个参数依次输出的结果是:5,4,3。对第二个函数调用:c(m+,m+,+m) ;第三个函数参数表达式是:+m,其结果是:m先自加,变为3,再将自加的结果3传过去。前两个参数都是先传值,再自加,因此函数的输出的结果是:3,3,3。其余的函数可以依次类推。 【例3.21】 将一个代表整型数的字符串(比如”-34”)转换为一个整型的数字。【解答】字符串分为两种情况考虑,一种第一个字符是负号,一种全数字。程序如下:#include#includeint convert(char *p)int n=strlen(p);int b=0; if(p0=-) for(int m=1;m=n-1;m+)b=b*10+pm-0; b*=-1;else for(int m=0;m=n-1;m+) b=b*10+pm-0; return b;void main()char *p1=-34;coutconvert(p1)endl;char *p2=1275;coutconvert(p2)endl; 3.2职工信息处理函数实训 3.2.1实训的题目和要求有一单位,职工信息包括姓名(name)、年龄(age)、工龄(worktime)、性别(sex)和婚姻状况(marrige)、级别(grade(15级))、工资(wage)、是否在职(tired)等信息。现在要进行工资的调整,规定退休职工增加工资50元,在职的职工15级的工资分别增加20,40 ,60,80,100,编程实现上述的调整。 实训要求(1)分析要存放的信息,设计合适的数据结构。 (2) 分析要对信息进行操作,选择switch语句进行信息处理。(3)打印程序执行前后的工资状况和级别。 3.2.2 实训的参考步骤首先要定义一个表示职工信息的结构体,结构体包括了职工的姓名、年龄、工龄、性别、婚姻状况、级别、工资、是否在职等信息,职工信息建成一个以结构体为元素的数组,用循环语句处理数组中的每个职工信息,用switch语句选择修改职工工资变动情况。完整程序如下:#includestruct workerchar *name;int age;int worktime;char sex;bool marrige;int grade;int wage;bool tired;void main() worker a3=liming,60,40,m,true,5,450,true,huangzi,46,20,f,true,4,400,false,caoxue,27,3,m,false,2,330,false;coutbefore change: endl;for(int i=0;i=2;i+)coutai.wage:ai.wage;cout ai.grade:ai.grade;coutendl;for(i=0;i=2;i+)if(ai.tired=true) ai.wage+=50;else switch (ai.grade)case 1:ai.wage+=20; break;case 2:ai.wage+=40; break;case 3:ai.wage+=60; break; case 4:ai.wage+=80; break; case 5:ai.wage+=100;break; coutafter change:endl;for(i=0;i=2;i+) coutai.wage:ai.wage; coutendl;本程序打印出执行前后的工资状况和级别,验证程序是正确的。同时本例题涉及到结构体的数据结构,可借此题复习一下。 3.3 趣味取球实训 3.3.1实训的题目和要求 已知袋中有若干个白球和黑球,每次从中取出两个球。如取出的各个球为同色,则放回一个白球(袋外有足够的白球);如取出的两个球为异色,则放回一黑球。试设计取球过程的模拟程序,判断最后剩下的一个球的颜色。实训要求 用循环语句实现重复取出小球的操作。 用函数实现一次取球,由随机数决定取出小球的颜色。 选择条件语句来处理取得不同颜色的小球后的情况。 打印每次取出的两个小球的颜色。 分析程序的执行结果。 3.3.2 实训的参考步骤本实训是综合性题目,涉及到条件语句,循环语句,函数的调用。可以通过此例学习怎样通过用这些语句和函数,怎样去解决一些实际问题。看到结果是很有趣的,如果黑球的个数是奇数,那么最后剩的一个球就一定是黑球,如果黑球的个数是偶数,那么最后一个剩的球就一定是白球。根据规则,黑球和白球相遇,其结果是白球消失,黑球和黑球相遇的结果是两个黑球变成一个白球,两个黑球同时消失。这样,黑球的变化的规律只可能是:要么两个黑球同时消失,要么黑球的数目不改变。那么就可以得到结论:如果一开始黑球的个数是偶数个,那么当球还剩一个的时候,由于此时黑球的个数仍应该是偶数,显然只可能是零个了,如果一开始黑球的个数是奇数,那么当还剩一个球的时候,显然剩的这个球就是黑色的球。 通过分析,已经得到题目的结论。下面就讨论一下怎样用程序模拟取小球的过程来验正这个结论。可以想到由于取小球是一个随机的过程,那么用生成随机数的方法来模拟是比较自然的。设想每个小球都是有编号的,那么可以在小球数的范围内生成随机数,生成的是几就代表取几号球,生成的随机数等于任一个小球的编号的可能性是相等的,袋中每个小球被取到的可能性也是相等的,这样用生成的随机数代表取小球就是合理的。进一步,黑球和白球都可能被取到,怎样在生成的随机数里也作出这种区分呢?方法是:如果生成的随机数比黑球的个数小,则代表取黑球,如果生成的随机数比黑球的个数大,则代表取白球即球的编号分成两段,前后两段分别对应黑球和白球,即程序确实可以模拟了现实世界的过程。仔细体会下面的程序,看它是怎样具体模拟现实世界的过程的。#include #includevoid main()int sum;srand(unsigned)time( NULL ) );int black=0,white=0,getor,flag1,flag2;coutblack;coutwhite;sum=black+white;int sum1=sum;/每次减少一个球,故共取总球数减一次球for(int k=1;k=sum1-1;k+)cout这是: k次取球.endl;cout本次取的第一个球是: ;/用生成随机数的办法第一次取球getor=rand()%sum+1;/生成一个随机数代表小球编号sum-; if(get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通银行宿舍管理制度
- 食品厂共享设备管理制度
- 事业政府采购管理制度
- 中国缓刑假释管理制度
- 东土科技公司管理制度
- 传统零售人才管理制度
- 企业油漆仓库管理制度
- 一品两规药品管理制度
- 中国病案复印管理制度
- 会议大厅接待管理制度
- 保险公司保密管理制度
- 2025年湖北省高考地理试卷真题(含答案解析)
- 2025年重庆市中考历史真题(解析版)
- 2025年四川省成都市中考语文真题(原卷版)
- 江苏开放大学2025年春服务营销1单项选择题题库
- 2025山东“才聚齐鲁成就未来”水发集团高校毕业招聘241人笔试参考题库附带答案详解
- 2025中考数学押题预测 (广西卷)(试卷+答案详解)
- GB/T 45355-2025无压埋地排污、排水用聚乙烯(PE)管道系统
- DB32-T 186-2015建筑消防设施检测技术规程
- 国家开放大学《Photoshop图像处理》章节测试题参考答案
- DZ∕T 0214-2020 矿产地质勘查规范 铜、铅、锌、银、镍、钼(正式版)
评论
0/150
提交评论