C++程序设计实践教材
#include
int input;
cout<<\ cin>>input;
if(input%2) cout<<\ \ //如果能被 2 整除,是偶数 else }
cout<<\ \ //否则是基数
return 0;
形式中,奇数的末位为 1,偶数末位为 0。可以用整数 n 与 1 进行按位与运算:
[分析二] (可选) 判断一个数的奇偶,只需判断最后一位,在二进制表示
n&1 为非 0(真),则是奇数,为 0(假),则是偶数。
在上面程序中,将 if 判断的条件改为 n&1 即可,其它部分不用修改。
#include
int input;
cout<<\ if(n&1) cout<<\ \ //如果能被 2 整除,是偶数 cin>>input; else cout<<\ \ //否则是基数 return 0;
}
[测试数据]
345 680 -34 -23.5(有意用非整数测试)
分别用以上各数作为输入数据,测试程序,分析程序结果,并进行记录。
2. 范例:编程求一元二次方程 ax2+bx+c=0 的根。包括以下判断和结果:若 输入 a=0,给出提示;若?>0,输出两个不等实根;若?=0,输出两个相等实根; 若?<0,输出两个复数根。
[程序] 根据以上要求,编写下列源程序,请与主教材例 2.8 作对比。 #include
double a,b,c;
double delta,x1,x2; int sign;
cout << \一元二次方程 a*x*x+b*x+c=0\\n\ cout<<\输入三个系数a(a!=0), b, c:\ cin>>a>>b>>c;
cout<<\ if(a==0){
11
第一章 控制台应用程序
cout<<\二次项系数为0,不是一元二次方程\ exit(0);
delta=b*b-4*a*c; }
if(delta==0){
cout<<\方程有两个相同实根:\ cout<<\ }
if(delta>0) sign=1; else {
else sign=0;
delta=sqrt(fabs(delta)); x1=-b/(2*a); x2=delta/(2*a); if(sign){
cout<<\方程有两个不同实根:\
cout<<\ }
else{ //delta<0
cout<<\方程无实根!有两个不同复数根:\
cout<<\ } } return 0; }
3.编写程序:输入一门课程的成绩,若高于 90 分,输出\若高于
80 而低于 90,输出\ 高于 70 而低于 80,输出\ 高于 60 而低 于 70,输出\ 否则,输出\。用 if-else 嵌套和 switch 语句两 种方法实现。
[注意] if-else 嵌套使用时,注意 else 子句总与其最近的 if 配对;对数据划
分区间时,注意关系和逻辑表达式的正确书写。注意 if-else 与 switch 的区别与联 系,switch 特适合某个整型或字符型表达式的值与一组常量匹配的情况。
4. 编写程序:输入一个数,判断是否是 3 或 7 的倍数,可分四种情况输出: 1) 是 3 的倍数,但不是 7 的倍数; 2) 不是 3 的倍数,是 7 的倍数; 3) 是 3 的倍数,也是 7 的倍数;
4) 既不是 3 的倍数,也不是 7 的倍数;
实验四 循环结构程序设计
1. 循环控制语句用于实现循环程序结构,要求掌握三种循环结构 while、 一、实验目的
do-while、for 的区别与联系,如何相互转换,并能正确使用。
12
C++程序设计实践教材
2. 掌握与循环语句相关的 break 和 continue 语句的使用。
二、实验内容
1. 范例:输入正整数 n,求 n 的阶乘。
[分析] n!=1?2?3?????n,因此可以从 1 开始,由 1!乘以 2 得到 2!,再乘以 3 得到 3!??????,以此推出 n!。 [程序]
#include
int n,i;
double result=0; //result是结果 cout<<\请输入正整数:\ cin>>n; if(n<1){
cout<<\输入错误!\ return 1; }
result=1;
for(i=2;i<=n;i++) result*=i; cout< 2. 范例:输入若干字符,统计其中数字字符,白字符和其它字符的个数,输入 EOF 结束。 [分析] 要统计若干字符,需用循环反复输入,读入数据后用 switch 语句判断字 符的种类;要统计三种字符数,需定义三个用于计数的变量 nDigit,nWhite,nOther 并首先置 0;读入字符用 cin.get()函数,在这里,用 while 循环比较合适。白字符 指空格键,tab 键和回车键。EOF 表示 End of File,其值为-1,从键盘输入(ctrl+z) 即可。这里采用重载的 int cin.get()函数,它返回的是整型数,所以能返回 EOF。 [程序] #include char c; int nWhite, nOther, nDigit; nWhite = nOther = nDigit = 0; c=cin.get(); while(c!=EOF){ switch (c){ case '0': case '1': case '2' :case '3' :case '4': case '5': case '6': case '7' :case '8': case '9': 13 第一章 控制台应用程序 nDigit++; break; case ' ': case '\\n': case '\\t': nWhite++; break; default: nOther++; break; } c=cin.get(); //读入下一字符 } cout<<\ cout<<\ cout<<\ return 0; } [思考] ①如果要分别统计数字 0~9 各数字出现的次数,怎样才能有效地实现? ②如果要统计输入的一段文字中出现的行数、单词数和字符数,又如何有效实 现? ③本例采用的是什么算法? 3. 编写程序:约瑟夫(Josephus)问题:n 个人围坐成一圈,从 1 开始顺序编 号;游戏开始,从第一个人开始由 1 到 m 循环报数,报到 m 的人退出圈外, 问最后留下的那个人原来的序号。 [分析] 本题首先要定义一个数组,其元素个数为 n。n 定义为常变量,以便定义 数组。数组元素的值标识该人是否出局,1 在圈内,0 出局。值为 0 的元素不参 加报数。可用一个整型数 k 做计数器,采用倒计数,记录留下的人数。 [提示]数组是线性排列的,而人是围成圈的,用数组表示要有一种从数组尾部跳 到其头部的技巧,即下标加 1 除以 n 求余数。 4. 范例:将输入的小写字母转换为大写字母。 [提示]由 ASCII 码表可以看出,大写英文字母的 ASCII 码值在 65 至 90 之间,小写英 文字母的 ASCII 码值在 97 至 122 之间,每一个英文字母的大写和小写的 ASCII 码相差 32 (以上均为十进制)。 #include char str[100]; int i = 0; cout << \ cin.getline(str,100); do{ if (str[i]<'a'||str[i]>'z') continue; //条件可有多种写法,也可不用continue 14 C++程序设计实践教材 str[i]-= 32; }while ( str[++i]!='\\0'); cout << \ return 0; } [思考]但当用户输入一个空串,即用户开始输入时就以 Enter 键结束, string[0] 中就是表征输入串结束的'\\0'字符。由于是 do_while 循环,所以肯定 要进入循环,在循环结束前由 i++ 使 i 的值修改为 1,使得循环体完成后的判断 是对 string[1] 进行,从而跳过对 string[0] 中的串结束符'\\0'判断, 导致在这 种所谓\边界\的情况中,程序不能正确运行。怎样修改?考虑两种方法。 程序的质量指标和算法的质量指标一样,包括程序的正确性、可读性、健壮 性以及高的执行效率和低的存储空间要求。正确性是指对于各种合法的输入,即 使是苛刻的带有刁难性的输入数据也能够得到满足规格要求的结果,这其中就包 括应当能处理各种边界情况。 5. 编程:设计一个程序,输入某天是几月几日,要求算出这一天是本年的 第几天。 [分析] 要算出某天是当年的第几天,应该将当年中本月之前所有月的天数 相加,再加上本月的天数。但这里有一个闰年问题,二月是一个特殊月,如该年 是闰年,则二月有 29 天,否则,便是 28 天,所以,还必须给出年份。 [提示] 判断某年是闰年的条件是:该年号能被 4 整除但不能被 100 整除, 或者能被 400 整除的是闰年。如,1996,2000 是闰年,但 1800 不是闰年。 实验五 常用算法:枚举法 递推法 迭代法 一、实验目的 掌握常用算法:枚举法,递推法、迭代法。 二、实验内容 a 1. 编程求和:s=a+aa+aaa+?+aa?a,其中 a 是 1~9 中的一个数字。 [提示] 令各项为 b0,b1,b2,?bn 则 b0 = a b1 = b0*10+a b2 = b1*10+a? 即每一项是为前一项乘以 10 加 a,递推得到各项并求和。 2. 编程求出所有的\水仙花数\,所谓\水仙花数\是指一个三位数, 其 各位数字的立方和等于该数本身,例如 153 是一个\水仙花数\,因为 153= 3 3 1 +5 +3 。采用枚举法。 3 3. 范例:设函数 f(x)定义在区间[a,b]上,f(x)连续且满足 f(a)*F(b)<0,求 f(x) 在[a,b]上的根。采用割线法,迭代公式为: xi+1 = x i+( x i-1- x i)/(f(x i)-f(x i-1))*f(x i) 其代换规律为:首先用两端点函数值的绝对值较大者的对应点作为 x i-1,较小者 n 个 作为 x i,即如果|f(a)|<|f(b)|,则 x i-1?a,x i?b。用迭代公式得出 x i+1,f(x i+1)。 15 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C++程序设计实践样例(3)在线全文阅读。
相关推荐: