c++实践报告.docx
《c++实践报告.docx》由会员分享,可在线阅读,更多相关《c++实践报告.docx(15页珍藏版)》请在冰豆网上搜索。
![c++实践报告.docx](https://file1.bdocx.com/fileroot1/2022-11/16/ac341471-9363-41ef-804a-de887831a44b/ac341471-9363-41ef-804a-de887831a44b1.gif)
c++实践报告
中南大学
《C++课程设计》设计报告
题目C++课程设计报告
学生姓名
学号
专业班级数学类1104班
指导老师刘新儒
数学与统计学院
2012年7月
题目
一、实验目的、内容
目的:
1、使学生能够熟练地掌握C++语言的基本规则。
2、熟练掌握面向对象的程序设计技巧,如类的实现、创建类的实例、实现类的继承。
3、掌握各种面向对象的程序设计技术,如多态性的实现、运算符的重载、使用C++标准库等。
4、学会分析错误并改正错误。
内容:
第一类:
42.输入某年某月某日,判断这一天是这一年的第几天。
47.一个5位数,判断它是不是回文数。
即12321是回文数,个位与万位相同,十位与千位相同。
第二类:
文件类题目
1.统计一源程序语句数、行数、字符数、类及函数的个数。
第三类:
综合类题目
1.有理数运算
问题描述
有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而就为无理数。
在C++中,并没有预先定义有理数,需要时可以定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。
对有理数的各种操作都可以用重载运算符来实现。
基本要求
定义并实现一个有理数类,通过重载运算符+、-、*、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。
写一个优化函数,它的作用是使有理数约去公分母,也即是使保存的有理数分子和分母之间没有公约数(除去1以外)。
此外,还要定义一个将有理数转换为实数的函数,再加上构造函数和有理数输出函数。
测试数据
在应用程序中,创建若干有理数对象,通过带参数的构造函数使得各有理数对象值各不相同,然后分别进行各类运算,输出运算结果,检验其正确性。
实现提示
设有两个有理数a/b和c/d,则有:
(1)有理数相加分子=a*d+b*c;分母=b*d
(2)有理数相减分子=a*d-b*c;分母=b*d
(3)有理数相乘分子=a*c;分母=b*d
(4)有理数相除分子=a*d;分母=b*c
优化函数在创建有理数对象时应执行,在执行其它各种运算之后也需执行它,这样可保证所存储的有理数随时都是最优的。
对于判断两个有理数是否相等,由于在对有理数进行各种运算后都对其进行优化,所以判定两个有理数是否相等只需判定它们两个的分子和分母分别相等即可。
选做内容
重载插入(<<)和提取(>>)运算符,使得对有理数可以直接输入输出。
设有理数输入格式为:
整数1整数2//整数1为分子,整数2为分母
有理数输出格式为:
分子/分母
二、实验程序设计及结构
需求分析:
查看已文件中内容句数、行数、类、字符数。
实现+、-、*、/对有理数的重载,扩展在实际中的运用。
三、设计过程
见附件。
在C++实践过程中,这些题目涉及了很多我们没有掌握甚至是没有学过的知识,在完成这些题的过程中我使用了最基本的类,循环,选择等结构,也自学并且掌握使用了链表和文件流,总的说来,这次C++实践不仅巩固了我所学的知识,并且锻炼我的自学能力,让我自己能有一个平台去自学并摸索C++的使用,增强了我的分析以及逻辑能力,让我有了自主编写C++程序的能力,让我受益匪浅。
四、设计的特点和结果
包括实验处理结果和设计心得。
指出实验结果运行的操作系统和平台,运行结果。
总结:
在C++实践过程中,这些题目涉及了很多我们没有掌握甚至是没有学过的知识,在完成这些题的过程中我使用了最基本的类,循环,选择等结构,也自学并且掌握使用了链表和文件流,总的说来,这次C++实践不仅巩固了我所学的知识,并且锻炼我的自学能力,让我自己能有一个平台去自学并摸索C++的使用,增强了我的分析以及逻辑能力,让我有了自主编写C++程序的能力,让我受益匪浅。
操作系统和平台:
VC2005运行环境
运行结果:
见附录
参考文献
[1]、作者名:
刘卫国杨长兴李小兰蔡旭辉书名【C++程序设计实践教程(第二版)】【C++程序设计(第二版)】出版机构:
中国水利水电出版社出版时间2012年1月
[2]、作者名:
陈志泊王春玲孟伟文献名【面向对象的程序设计语言C++(第二版)】出版机构:
人民邮电出版社出版时间:
2007年8月
附录
自己做的主要实验源代码
第一类:
#include
usingnamespacestd;
voidmain()
{
cout<<"请输入年月日"<intn,y,r,s=0;
cin>>n>>y>>r;
if(n%4==0&&n%100!
=0||n%400==0)
switch(y-1)
{case11:
s+=30;
case10:
s+=31;
case9:
s+=30;
case8:
s+=31;
case7:
s+=31;
case6:
s+=30;
case5:
s+=31;
case4:
s+=30;
case3:
s+=31;
case2:
s+=29;
case1:
s+=31;
case0:
s+=r;}
else
switch(y-1)
{case11:
s+=30;
case10:
s+=31;
case9:
s+=30;
case8:
s+=31;
case7:
s+=31;
case6:
s+=30;
case5:
s+=31;
case4:
s+=30;
case3:
s+=31;
case2:
s+=28;
case1:
s+=31;
case0:
s+=r;}
cout<}
设计过程:
闰年366天,非闰年365天,分别找出闰年和非闰年。
闰年二月有29天,非闰年二月有28天。
输入年月日,先确定是否为闰年,再确定月份,最后把前面几个月的天数加起来,再加上当月天数就得出结果。
#include
usingnamespacestd;
voidmain()
{
inti,j,k;
cout<<"请输入一个五位数"<cin>>i;
j=i/1000;k=i%100;
if(i/10000==i%10&&j%10==k/10)
cout<
else
cout<
}
分别求出五位数的万位、个位和千位、十位,如果万位与个位、千位与十位分别相等,则为回文数,否则不为回文数。
第二类:
输文件路径时注意\号要用引导符;
5.源代码
头文件:
stat_file_num.h
#ifndef__STAT_FILE_NUM_H__
#define__STAT_FILE_NUM_H__
//统计一源程序语句数、行数、字符数、类及函数的个数(statisticfilenumber--类的名字是随意编的)
classstat_file_num{
private:
intYuju,Hang,Zifu;//语句数、行数、字符数
intClasses,Funs;//类及函数的个数
ifstreamFile;
/*---辅助数据成员----*/
intflag,
funsjuge,//括号计数器(用int数,模拟栈)
tine,//计数:
函数外尖括号<>的配对(尖括号内的class不是声明类的关键字,要排除)
chuan,//识别:
1表示当前字符cur是在字符串内;0cur在字符串外
zf;//识别:
1表示当前字符cur是在字符内;0cur在字符外
protected:
//辅助函数
voidfunsCount(char&cur);
voidCross(char&cur);
public:
stat_file_num(constchar*FileName);
~stat_file_num();
voidstat_num();
voidOutput();
};
stat_file_num:
:
stat_file_num(constchar*FileName)
//构造函数
{
File.open(FileName,ios:
:
in);//连接文件流到文件
if(File.fail())
{
cout<<"打开失败\n";exit
(1);
}
Classes=Funs=Yuju=Hang=Zifu=0;//初始化数据
flag=funsjuge=tine=chuan=zf=0;//辅助数据成员初始化
}
stat_file_num:
:
~stat_file_num()
//析构函数
{
File.close();
}
voidstat_file_num:
:
Output()
//功能:
输出结果
{
cout<<"\n源代码中共有:
\n";
cout<<"---"<cout<<"---"<cout<<"---"<cout<<"---"<cout<<"---"<}
voidstat_file_num:
:
funsCount(char&cur)
//功能:
统计函数及类的个数
{//--------------------------------------------------------------
if(flag==0&&cur=='<')//识别函数体外的尖括号<>
tine--;
if(flag==0&&cur=='>')
tine++;
//---------------------------------------------------------------
if(chuan==0&&zf==0&&cur=='"')//识别字符串(识别字符外的“”)
chuan=1;//"第一次出现表示字符串开始
elseif(chuan==1&&zf==0&&cur=='"')
chuan=0;//"第二次出现表示字符串结束
//----------------------------------------------------------------
if(zf==0&&chuan==0&&cur=='\'')//识别字符串(识别字符串外的‘’)
zf=1;//'第一次出现表示字符串开始
elseif(zf==1&&chuan==0&&cur=='\'')
zf=0;//'第二次出现表示字符串结束
//----------------------------------------------------------------
if(cur=='c'&&flag==0&&tine==0)
{
File.putback(cur);//把字符放回重新读取...
charkeyword[6];
File.read(keyword,5);//读取五个字符检测是否为class
keyword[5]='\0';
if(strcmp(keyword,"class")