回到课程主页,链接:C++程序设计课程主页-2012级
本周教学内容:第2章 数据类型和表达式。
练习+上机验证
练习1:阅读、理解程序
下列程序,在准备期写出程序的运行结果。上机时运行程序,与你的预期进行对照、理解。
1.
#include <iostream> using namespace std; int main() { int a,b,c,d; a=10; b=a++; c=++a; d=10*a++; cout<<a<<","<<b<<","<<c<<","<<d<<endl; return 0; }
2.
#include <iostream> using namespace std; int main() { int a,b,c; a=25; b=025; c=0x25; cout<<a<<","<<b<<","<<c<<endl; return 0; }
3.
#include <iostream> #include<Cmath> using namespace std; int main() { int a=1, b=2,c1,c2; c1=((a+b)+abs(a-b))/2; //abs()求绝对值 a=a+b; b=a-b; a=a-b; c2=((a+b)+abs(a-b))/2; cout<<"a="<<a<<",b="<<b<<endl; cout<<"c1="<<c1<<",c2="<<c2<<endl; return 0; }
#include <iostream> using namespace std; int main() { int a=456, x,y,z; x=a/100; y=a/10-10*x; z=a%10; cout<<x<<","<<y<<","<<z<<","<<100*z+10*y+x<<endl; return 0; }
练习2:表达式求值——教材P42第5题
理解表达式求值
请写出(1)-(8)各表达式的值,并通过上机进行验证、纠错。
以(6)为例,给出下面的程序框架,供上机验证时参考:
#include <iostream.h> using namespace std; int main() { int a=3,b; //根据给出的初值,确定应该使用的数据类型 cout<<((int)(a+6.5)%2+(a=b=5))<<endl; //将要求值的表达式放在括号里,以免在运算优先级上,与<<运算符之间产生纠葛出麻烦 cout<<.a<<" "<<b<<endl; //对于求值中可能改变变量值的表达式,再观察下变量值 return 0; }
练习3:表达式求值——P42第6题
请写出(1)-(6)表达式运算后a的值,并通过上机进行验证、纠错。用于验证的程序请参考练习2.上机实战
项目1:尝试“撞错”
方法指导:主动“撞错”在学习程序设计语言的语法时,常会提到这个不行,那个不许之类的,这些东西是记不住的。实际上,也不能去记,不能用那样的学法。
主动“撞错”,也就是在程序中专门出现不允许出现的情况;但明知山有虎,偏向虎山行;告的你很清楚,这能这样干,你偏要这样干。自然,这样的程序或者在编译时,或者在运行时,总会出错。由于是主动撞错的,你有这样的思想准备,于是能够心平气和地观察这种错误发生后,究竟会有怎样的表现,理解这种要求,从而在自己编制程序时不犯这样的错误,或者当错误发生时,能“一下子”想到,至少能看懂提示的错误信息。
通过主动“撞错”,你将得到体验,并且也见识了这种错误产生后的现象。当今后编制大程序无意中出现同类错误时,你会微微一笑:“小样,见过你了。” ——在错误中成长,错误是财富;主动试错,是种境界(后半句仅限于学习程序设计,程序中的错误不会造成计算机的损坏,放心去“撞错”)。
例如,教材P29指出“如果a和b指定为实型变量,则不允许进行求余运算”,设计一个程序,其中包括
double a=4.6, b=2,c; c=a%b; //显然这种运算是非法的 cout<<c<<endl;
上机任务:深刻理解上面讲到的方法,完成下面的工作
(1)选择本章中提及的你有疑惑的语法规则,设计验证程序,通过主动撞错进行观察和理解。例如(不限以下提示,可以是你在学习中的任务疑问。学习始于自己提出问题,要主动发问。)
求余运算(%)和除运算(/)的除数均不能是0,请“撞错”观察“后果”。
对求余运算(%),教材P32讲“多数编译系统采用……”,Visual C++是怎么做的?“向零取整”是什么意思?请设计实验进行验证。
对求余运算(%),正整数、负整数之间,正整数和负整数进行求余,将程序运行结果与自己的期望结果进行对比后得到结论。
完成上机报告:针对(1)中的工作,选择其一提交博文介绍你的做法和得到的结论。
再次强调:程序必须要有注释,这是行业规矩,也是方便读者阅读,以及日后自己整理的必要工作,要习惯于这样做。另外,博文中的代码,要用“插入代码”功能,不会的看老师写的指导文档,或请教老师同学。本事是在实践中练出来的,遇到不会做的事情去逃避,永远不会有进步。忽略难者不会,信奉会者不难。其实,这样的技能,真的不难。注释也是程序的一部分,作为代码一并插入。为防止出现各种可能的意外,请在编好程序后,在VC++6.0环境中写好注释,连同代码一起插入发表博文的页面里。
下面是参考的报告格式。
上机内容:验证“……”的语法规则
上机目的:学会用“撞错”理解语法要求的方法
/* * Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 作 者: * 完成日期:2012 年 月 日 * 版 本 号:v1.0 * * 输入描述: 无 * 问题描述:设计一个包含错误的程序,验证“……”语法规则,学会“撞错”方法 * 程序输出: * 问题分析: * 算法设计: */ #include<iostream> int main() { //代码 }结果(截屏):
观察及体会:(提示的错误、自己的理解、怎样修改程序将为正确,等等。)
我的总结:
项目2:计算定期还款额度
编程序用来计算贷款的定期还款额度,比如买车的贷款。输入本金、贷款的时间长度、每年偿还的次数、贷款利率,程序就会计算出每次应该偿还的额度。计算定期还款金额的公式如下
这里rate代表利率,principal代表本金,payPerYear代表每年偿还贷款的次数,numYears代表贷款的年限。
注意设计出友好的输入输出界面。运行程序时,自拟多组输入数据,通过比较程序输出及手工计算的结果,验证程序是否正确完成计算。
提交的博文要符合要求!!博文模板在项目1给出的基础上自行修改。
如果在完成中遇到的困难,看下面的锦囊是否能帮你。
(1)计算涉及到小数的运算,需要使用浮点类型的数据来进行计算,一般常用double类型。
(2)本题要使用幂运算,C++中用pow()函数来完成求幂。result = pow ( base, exp); 得到的是base的exp次幂,其中base和exp都是double类型的数据,求值的结果也是double类型的。要调用pow()函数,必须在程序开始处写:#include<Cmath>
(3)编出这个程序的步骤
- 先定义程序中将使用到的变量:
double principal; //原始的本金 double rate; //利率,例如,0.075 …… //其他需要的变量,自己写出
注意上面在变量声明后的注释,用于描述变量的作用,这样有助于别人阅读我们的程序,也能很容易地明白各个变量的作用。这种做法值得提倡,特别是当程序变得越来越大,越来越复杂的时候。
- 输入用于计算的数值
cout << "输入本金:"; cin >> principal; …… //类似的输入,自己写出
- 设计用来计算的代码
完成计算的式子可以是:
number = rate * principal / payPerYEar; e = -(payPerYear * numYears ); b = (rage / payPerYears )+1 denom = 1 - pow(b,e); payment = number / denom;
- 最后,输出还款额
cout << "Payment is " << Payment;
项目3:求两点间距离
输入两个点的坐标,求两点之间的距离并输出。提示:(1)两点的坐标用4个变量x1,y1,x2,y2表示,输入坐标值后,按求两点间距离的公式计算出距离输出即可;(2)求距离要开平方,开平方需要调用函数sqrt()实现。例如,用sqrt(x)可以求出x的平方根。要调用sqrt()函数,必须在程序开始处写:#include<Cmath>(可以试试“撞错”,看看不加#include<Cmath>会怎样)。项目4:关于圆的计算
输入半径r和高h,计算并输出半径为r的圆的面积、周长,半径为r的球的体积、表面积,半径为r,高为h的圆柱、圆锥的体积、表面积等。要求π值用符号常量表示。项目5:字符加密
加密规则为用原来字母后面的第4个字母代替原来的字母。具体见P42第8题。