书目

C++程序设计题解与拓展(第2版)/面向新工科专业建设计算机系列教材

内容简介

本书是与c程序设计:思想与方法(慕课版第3版)(翁惠玉、俞勇编著)配套的辅助教材。本书与主教材的章安排接近相同。每一章首先结了主教材中对应章的主要内容以及重点、难点解答了主教材中的所有题。作为对主教材的补充本书在某些章后还增加了进一步拓展部分。通过对本书的学可以帮助读者进一步巩固程序设计的知识提高编程能力。本书概念清楚题丰富可作为高等院校计算机专业或其他相关专业的“程序设计”课程的配套教辅也可作为计算机专业入学试的辅导书还可作为其他专业人员的参书。

作者简介

作者于上海交通大学,获博士,现为上海交通大学计算机系副教授。长期承担程序设计和数据结构的工作,主讲acm试点班和电信学院的程序设计和数据结构课程,这两门课程分别是上海市精品课程和重量精品课程。出版过教材三本:c程序设计:思想与方法(获上海交大很好教材)、数据结构:思想与实现(获上海市很好教材并入选十二五规划教材)、计算机网络。出版过教辅两本:数据结构:题解与拓展、计算机网络300题精彩内容:第3章分支程序设计3.1知识点回顾分支程序设计可以根据不同的情况执行不同的处理过程。实现分支程序设计首先要能够区分不同的情况然后要有一个能够根据不同的情况执行不同语句的控制机制。前者由关系表达式和逻辑表达式完成后者由分支语句完成。3.1.1关系表达式和逻辑表达式关系运算符用于比较两个对象。c提供了6个关系运算符:(大于)、=(大于或等于)、==(等于)、!=(不等于)。前4个运算符的优先级相同后两个运算符的优先级相同。前4个运算符的优先级高于后两个。用关系运算符可以将两个表达式连接起来形成一个关系表达式关系表达式的格式如下:表达式关系运算符表达式参加关系运算的表达式可以是c的各类合法的表达式包括算术表达式、逻辑表达式、赋值表达式以及关系表达式本身。关系表达式的计算结果是布尔型的值:true和fale。除了关系运算符外c还定义了3个逻辑运算符即!(逻辑非)、(逻辑与)和‖(逻辑或)它们可以将关系表达式组合起来形成更加复杂的情况。由逻辑运算符连接而成的表达式称为逻辑表达式。!是一元运算符和‖是二元运算符。它们之间的优先级:!很高次之‖大力度优惠。事实上!运算是所有c运算符中优先级很高的。它们的准确意义可以用真值表来表示。给定布尔变量p和q运算、‖运算和!运算的真值表如表3?1所示。当c程序在计算exp1exp2或exp1‖exp2形式的表达式时是先计算exp1。一旦exp1的值能确定整个表达式的值时终止计算不再计算exp2这称为短路求值。短路求值的一个好处是可以减少计算量另一个好处是个条件能控制第二个条件的执行。在很多情况下复合条件的第二部分只有在部分满足某个条件时才有意义。例如要表达以下两个条件:整型变量x的值非零;x能整除y。由于表达式y%x只有在x不为0时才计算用c语言可表达这个条件测试为(x!=0)(y%x==0)而该表达式在其他语言中可能出现除0的错误。表3?1运算、‖运算和!运算的真值表pqpqp‖q!pfalefalefalefaletruefaletruefaletruetruefalefaletruefaletruetruetruetrue〖3〗c程序设计题解与拓展(第2版)第3章分支程序设计〖3〗3.1.2分支语句c提供两种分支语句:两分支语句(if)和多分支语句(witch)。if语句用于处理两分支的情况它有以下两种形式:if(条件)语句if(条件)语句1ele语句2种形式表示如果条件为真执行条件后的语句否则什么也不做;第二种形式表示条件为真时执行语句1否则执行语句2。条件为true时所执行的语句称为if语句的then子句;条件为fale时执行的语句称为ele子句。条件部分原则上应该是一个关系表达式或逻辑表达式但事实上在c的if语句中的条件可以为任意类型的表达式可以是算术表达式也可以是赋值表达式。表达式的结果为0表示fale非0表示true。语句部分可以是对应于某种情况所需要的处理语句。如果处理很简单只需要1条语句能完成则可放入此语句。如果处理相当复杂需要许多语句才能完成可以用一个程序块,即用一对大括号{}将一组语句括起来在语法上大括号及其中的语句相当于1条语句。对于一些很好简单的分支情况c语言提供了另一个更加简单的机制:“?:”运算符。这个运算符被称为问号冒号由问号冒号运算符连接起来的表达式称为条件表达式。条件表达式有3个运算数。它的一般形式如下:条件?表达式1:表达式2c程序遇到“?:”运算符时首先计算条件的值。如果条件结果为true则计算表达式1的值并将它作为整个表达式的值;如果条件结果为fale则计算表达式2的值,并将它作为整个表达式的值。当一个程序逻辑上要求根据特定条件做出真判断并执行相应动作时if语句是理想的解决方案。然而还有一些程序需要有两个以上的可选项这些选项被划分为一系列互相排斥的情况。这时可以用witch语句。witch语句的语法如下:witch(控制表达式){cae常量表达式1:语句1;cae常量表达式2:语句2;?cae常量表达式n:语句n;default:语句n1;}witch语句的主体分成许多独立的由关键字cae或default开头的语句组。一个cae关键字和紧随其后的下一个cae或default之间所有语句合称为cae子句。default关键字及其相应语句合称为default子句。witch语句的执行过程如下。先计算控制表达式的值。当控制表达式的值等于常量表达式1时执行语句1到语句n1;当控制表达式的值等于常量表达式2时执行语句2到语句n1;以此类推当控制表达式的值等于常量表达式n时执行语句n到语句n1;当控制表达式的值与任何常量表达式都不匹配时执行语句n1。default子句可以省略。当default子句被省略时如果控制表达式找不到任何可匹配的cae子句时退出witch语句。在多分支的情况中通常对每个分支的情况都有不同的处理因此希望执行完相应的cae子句后退出witch语句。这可以通过break语句实现break语句的作用是跳出当前的witch语句。将break语句作为每个cae子句的很后一个语句可以使各个分支互不干扰。这样witch语句可以写成witch(控制表达式){cae常量表达式1:语句1;break;cae常量表达式2:语句2;break;?cae常量表达式n:语句n;break;default:语句n1;}3.2题解答〖4/5〗3.2.1简答题1.写出测试下列情况的关系表达式或逻辑表达式。(1)测试整型变量n的值为0~9包含0和9。(2)测试整型变量a的值是整型变量b的值的一个因子。(3)测试字符变量ch中的值是一个数字。(4)测试整型变量a的值是奇数。(5)测试整型变量a的值是5。(6)测试整型变量a的值是7的倍数。【解】(1)n=0n(2)b%a==0(3)ch=0ch(4)a%2==1或a%2(5)a==5(6)a%7==02.设myflag声明为布尔型变量下面的if语句会有什么问题?if(myflag==true)【解】这个语句的语法和运行结果都是正确的但有冗余判断。表达式myflag==true的值与变量myflag是一样的所以只要写成if(myflag)可以。3.设a=3、b=4c=5写出下列各逻辑表达式的值。(1)abcb==c(2)a‖bcbc(3)!(ab)!c(4)(a!=b)‖(b【解】(1)abcb==c=truefale=fale(2)a‖bcbc=true‖bcbc=true(3)!(ab)!c=truefale=fale(4)(a!=b)‖(b=true‖(b=true4.用一个if语句重写下列代码。if(ch==e)c;if(ch==e)coutcounte;eleif(ch==a‖ch==a)counta;eleif(ch==i‖ch==i)counti;elecoutcaee:caee:counte;break;caea:caea:counta;break;caei:caei:counti;;break;default:cout}6.如果a=5、b=0、c=1写出下列表达式的值以及执行了表达式后变量a、b、c的值。(1)a‖(b=c)(2)bca(3)c=(a==b)(4)(a=5)‖b‖c(5)b【解】这些表达式的结果如表3?2所示。续表表3?26题序号a的值b的值c的值表达式的值(1)501true(2)501true(3)5000(4)010fale(5)501true7.修改下面的witch语句使之更简洁。witch(n){cae0:n=x;x;break;cae1:x;break;cae2:x;break;cae3:m=mn;x;n=2;break;cae4:n=2;}【解】观察上述witch语句发现cae1和cae2的处理接近相同cae0的很后一个语句与cae1相同这3个部分可以合并在一起。cae3的很后一个语句与cae4接近相同因此也可以合并在一起。很终形成的witch语句如下:witch(n){cae0:n=x;cae1:cae2:x;break;cae3:m=mn;x;cae4:n=2;}8.某程序需要判断变量x的值是否在0~10(不包括0和10)程序采用语句如下:if(0elecout【解】在c中“elecout1.从键盘输入3个整数输出其中的优选值、很小值和均值。【解】首先,将个数既作为优选值max也作为很小值min。然后,处理第二个数。将第二个数与很小值相比如果小于很小值将第二个数作为很小值。再将第二个数与优选值相比如果大于优选值将第二个数作为优选值。很后,处理第三个数处理过程与第二个数相同。现在max中保存的数是三个数中的优选值min中保存的数是三个数中的很小值。均值avg是将这3个整数相加然后除以3。这个算法的实现过程如代码清单3?1。代码清单3?1求3个整数的优选值、很小值和均值的程序includeuingnamepacetd;intmain(){doubleavg;intnum1num2num3maxmin;coutcinnum1num2num3;max=min=num1;if(num2max)max=num2;if(num2if(num3max)max=num3;if(num3avg=(num1num2num3)/3.0;coutcoutcoutreturn0;}2.编写一个程序输入一个整数判断输入的整数是奇数还是偶数。例如输入11输出为11是奇数【解】判断一个整数是奇数还是偶数可以通过检验这个整数除2后的余数。如果余数为0是偶数否则是奇数。这个简单的判断可以通过条件表达式来实现。完整的程序如代码清单3?2所示。代码清单3?2判断奇偶数的程序includeuingnamepacetd;intmain(){intnum;coutcinnum;coutreturn0;}3.输入两个二维面上的点判断哪个点离原点更近。【解】二维面上的点(xy)离原点的距离为x2y2只要对输入的两个点分别计算x2y2并比较两个值的大小。具体实现如代码清单3?3。代码清单3?3判断两个点中哪个点离原点更近includeuingnamepacetd;intmain(){doublex1x2y1y2;coutcinx1y1;coutcinx2y2;if((x1?x1y1?y1)couteleif((x1?x1y1?y1)(x2?x2y2?y2))coutelecoutreturn0;}4.有一个函数其定义如下:y=x(x2x1(1≤x3x11(x≥10)编一程序输入x输出y。【解】这个函数有3种不同的情况可以用if语句区分3种情况并针对3种情况做出不同的处理完成了这个功能。具体程序如代码清单3?4。代码清单3?4函数计算程序includeuingnamepacetd;intmain(){doublexy;coutcinx;if(xeleif(xeley=3?x11;cout}5.编写一个程序输入一个二次函数判断该抛物线开向上还是向下输出顶点坐标以及抛物线与x轴和y轴的交点坐标。【解】二次函数f(x)=ax2bxc是一条抛物线。根据二次函数的质可知:当a大于0时抛物线开向上否则开向下;顶点坐标是(b/(2a)(4?a?cb?b)/4/a);与x轴的交点是方程的两个根如果方程无根则无交点;与y轴的交点是x等于0时的y值也是c的值。据此可得代码清单3?5。代码清单3?5输出抛物线的各个特征值includeincludeuingnamepacetd;intmain(){doubleabc;coutcinabc;if(a==0){coutreturn1;}if(a0)coutelecoutcoutif(b?b4?a?celecoutcoutreturn0;}6.编写一个程序输入一个二维面上的直线方程判断该方程与x轴和y轴是否有交点输出交点坐标。【解】设直线方程为axbyc=0。如果a等于0且b不等于0方程简化为byc=0这是一条与x轴行的线所以与x轴无交点。但注意有个特例即当c等于0时该直线与x轴重叠即有无数个交点。如果a不等于0该直线与x轴的交点是y等于0时的x值即c/a。如果b等于0且a不等于0方程简化为axc=0这是一条与y轴行的线所以与y轴无交点。但注意有个特例即当c等于0时该直线与y轴重叠即有无数个交点。如果b不等于0该直线与y轴的交点是x等于0时的y值即c/b。具体程序如代码清单3?6。代码清单3?6求直线方程与x和y轴的交点includeuingnamepacetd;intmain(){doubleabc;//axbyc=0coutcinabc;if(a==0b==0){coutreturn1;}if(a==0)if(c!=0)coutelecoutelecoutif(b==0)if(c!=0)coutel

目录

—  END  —