课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759
【项目1-当年第几天】
定义一个函数,其参数为年、月、日的值,返回这一天为该年的第几天。要求在main函数中输入年月日,然后调用这个函数求值,并在main函数中输出结果。
【项目2-太乐了】先听故事,再编程序。
故事是这样的:话说sin和cos是一对夫妇。一天,sin去听相声了,cos在家。过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数。cos问:你是谁啊?他说:我是你的老公sin啊。cos说:你不是去听相声了吗?怎么成这幅摸样了?他说:是啊,太乐了!
用sin和cos的泰勒展开式编程序,求出sin(π/2)、sin(56°)、cos(87°)、cos(π/3),当最后一项的绝对值小于0.00001时,累加结束(求绝对值的函数也可以自定义函数myabs实现)。
下面是程序模板,请完成自定义函数的声明和定义,并将main函数中下划线部分补充完整。
#include <iostream> using namespace std; const double pi=3.1415926; int main( ) { cout<<"sin(π/2)的值为"<<mysin(pi/2)<<endl; cout<<"sin(56°)的值为"<<_____________<<endl; cout<<"cos(87°)的值为"<<mycos((87.0/180)*pi)<<endl; cout<<"cos(π/3)的值为"<<______________<<endl; return 0; } //下面定义mysin函数,求sin值 //下面定义mycos函数,求cos值 //下面定义myabs函数,求绝对值一点说明:将任意函数利用泰勒公式展开为多项式进行计算,是计算机求解数值问题的一个重要手段。高等数学中的“泰勒定理”为我们解决这一大类问题提供了理论依据与方法指导。Sin听相声“太乐”了,变成了多项式,太太cos都不认识了。高等数学、线性代数等课程为我们提供解决各种问题的基础知识,是大学中最为实用的学科,学好,必须的。
实际上,C++的数学库(#include<Cmath>)中已经提供了sin和cos函数,一般解题中我们直接调用即可,而本题要求自定义函数实现,为区别起见,分别起名为mysin和mycos。
提示:程序的输出应该为
sin(π/2)的值为1 sin(56°)的值为0.829038 cos(87°)的值为0.052336 cos(π/3)的值为0.5
【项目3-多文件程序组织】
阅读 http://blog.csdn.net/sxhelijian/article/details/15187309中《CodeBlocks中程序的多文件组织》,建立一个包含多个文件的项目,把本周项目2“太乐了”也用多文件组织起来。其中,main()函数保存在一个文件中,所有自定义函数保存到另外一个文件中,运行程序并得到正确的结果,体会在实际的工程项目中这样组织程序的好处。
【项目3扩展】将第11周“ 项目3-回文、素数”中第(4)项目要求中所做工作,用多文件组织起来。
【项目4-学习辅助软件开发】通过本题学习一些系统函数。
第一组是数学函数,需要#include<cmath>支持,包括log、log10、 pow、 pow10、 sqrt、 acos、 asin、 atan、 cos、 sin、 tan、 cosh、 sinh、 tanh、 ceil、 floor。
第二组是时间函数,需要#include<ctime>的支持。暂介绍一个函数long time(long *tloc)。调用time(0)将返回自格林威治时间1970年1月1日凌晨至现在所经过的秒数。显然,下面的代码可以用于测试一段代码运行的时间:
#include <iostream> #include<ctime> using namespace std; int main(void) { int i,ran_num=0; double t1,t2; t1=time(0); //将要测试的代码放在这里,因为计数单位为秒。 t2=time(0); cout<<"运行耗时"<<t2-t1<<"秒!"<<endl; return 0; }第三组是随机数函数,需要#include<cstdlib>支持。(1)void srand(unsigned seed)用于初始化随机数发生器,参数seed称作为“种子数”,用不同的种子数可以产生不一样的序列,故time(0)的返回值常用作种子数。(2)int rand()产生一个0到RAND_MAX(一个系统内已经定义的很大的数)的整型随机数并返回。例如,下面的程序产生10个0~5的随机数
#include <iostream> #include<ctime> #include<cstdlib> using namespace std; int main(void) { int i,ran_num; srand(time(0)); //time(0)返回值作种子 for(i=0; i<10; i++) { ran_num=rand()%6; //rand()返回值对6取余保证了随机数为0~5。 cout<<ran_num<<" "; } return 0; }任务1——猜数字游戏
随机产生一个1000内的数字,要求用户猜测这个整数。输入一个猜测想的整数,判断是否与产生的随机数相等,由屏幕显示判断结果。如果猜得不对,给出“大了”或“小了”的提示,直到猜出这个数为止。(可以再加一个要求,猜了几次才得到正确结果。)
任务2——小学生算术能力测试系统
设计一个程序,用来实现帮助小学生进行算术运算练习,它具有以下功能:提供10道加、减、乘、除四种基本算术运算的题目,每道题中的操作数是随机产生的,且操作数不超过2位数的正整数;练习者根据显示的题目输入自己的答案,程序自动判断输入的答案是否正确并显示出相应的信息。最后显示做对了几道题。
【项目5-银行系统】
这是我们要做的一个真正的项目!涉及到的技术都用过了,只不过,程序真的要长得多了。
在学习中,总是想要些成就感的。当你没有做过一些事情的时候,总是不能知道所学知识究竟能干些什么。在学习过程中,完成一个像样的项目,那是一件很酷的事情,也让我们更有激情。做好思想准备,中间可能会有些困难,但相信沉下心来还是可以完成的。
要做项目的需求最好能和大家的生活实践联系起来,我们想得到。另外,还能和我们的课程同步上。两厢结合,我们就开个银行,做个自动取款机吧。
如果没有用过自动取款机,先用你的银行卡取一次钱去吧,权当作调研。
我们首先插卡,输密码。做纯软件模拟,我们没有读卡机,好吧,认为卡已经插好了。
为了让大家一点一点地做出来,我试图分解其中的工作,我们逐渐完善,“增量式”地完成工作。你可以每做完一个任务,就发一篇博文,将这样一个成长的阶段记录下来。
任务1——搭一个框架
你的程序运行后的界面如图:
- 用const定义全局的常变量PASSWORD,作为银行卡的密码(真银行卡的密码可不是这样,它要分别记住各个帐户的密码,我们现在认为所有卡都这个密码)。
- 判断输入的密码是否正确,如果不正确,提示:“你这个笨脑瓜!”并退出程序,(注意,真银行可不敢骂人,你的银行这样写写无妨。)否则,继续下面的工作。
- 用户如图输入功能选择,根据给出的答复,用switch多分支完成下面的显示:
- a. 输入1,显示“您的余额是xxxx.xx元。”(想过瘾,用你觉得足够大的数当余额)
- b. 输入2-4的提示自编;
- c. 输入0,显示“谢谢,欢迎下次再来!”(好有礼貌)
- d. 输入不是0-4,提示“输错,不要急!”
写完程序后,请将之发布为博文(程序中的注释自己加,程序前要有,中间也来些必要的)。
任务2——引入函数改善程序结构
1、数据
仍然只支持一位用户,所以用户帐号不必存储。
要用全局变量存储:(1)用户密码(由于支持改密码功能,所以用变量,暂先用整型,声明时赋初值);(2)帐户余额(用浮点数表示,声明时赋初值)
2、在输入密码环节,实现有限次密码输入的限制,如果三次都没有输入正确,程序将直接退出,不允许用户继续操作。
查验密码功能做成一个函数。例如:
bool pass() { int 次数=0; bool 是否密码正确=false; //先假设密码不正确,以便能进入do-while循环 do{ 输入密码; 次数++; if(相符)是否密码正确=true; }while(密码不正确且尝试次数不足3次); return 是否密码正确; //上面密码正确为true,反之…… }3、main()函数的结构将如下所示,work函数用于处理业务。
main() { …… if(pass()) work(); else 输出“请到柜台办理密码查询后再来”。 return 0; }4、办理业务的函数work的结构如下:
void work() { //循环显示功能菜单:1.查询、2.取款、3.存款、4.转帐、5.改密、0.退出 //选择后办理各种业务,再显示菜单,直到选择了0。 }其中,各项业务分别编制一个函数完成。提示功能菜单(1.查询、2.取款、3.存款、4.转帐、5.改密、0.退出)后,由用户输入功能选择,用switch多分支完成对应的功能(有的功能依然只输出一句话提示即可)。图示给出建议(鼓励在合理范围内别出心裁):
- 输入1(查询),调用函数showbalance(),显示“您的余额是xxxx.xx元。”
- 输入2(取款),调用drawmoney(),完成取款。要求输入取款金额,若余额不够,提示不能取款,否则,帐户余额减少。取款后给出提示:“你的余额还有XXX.XX元”。
在实际业务中,还涉及到计算的问题。本题暂不考虑,作为拓展建议,可以在此处考虑计息。 - 输入3(存款):调用deposit(),完成存款,余额增加(过瘾吧,想存多少存多少)。存款后给出提示:“你的余额是XXX.XX元”。
- 输入4(转帐):调用transferAccounts(),完成转帐,只支持转出功能。要求输入对方帐号和转帐金额,若金额充足,完成转帐,当前帐户的余额减少,对方帐户余额增加。由于本题只有一个帐号,故对方帐户增加的操作先不做了。
- 输入5(改密):调用updatePassword()改变密码。要求先输入旧密码,对了以后才能改密。新密码要输入两次,只有两次完全相同时才可以完成修改。
- 输入0,显示“谢谢,欢迎下次再来!”退出循环,返回调用函数。
- 输入不是0-5,提示“输错了,不要急!”
任务3——将程序用多文件组织
将任务2中的代码,涉及密码、帐户的函数放在一个文件中,完成各项功能的函数放在另一个文件中,main函放也单独一个文件。