《最新C--实验报告剖析.doc》由会员分享,可在线阅读,更多相关《最新C--实验报告剖析.doc(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC-实验报告剖析C-实验报告剖析实验1-1 过程化编程【实验目的】理解、掌握过程化编程程序设计思想。【实验内容】1. 程序填空,练习类、对象、继承的定义和实现方法。2. 根据程序运行结果,补充完整程序。【实验要求】我们在进行英语阅读的时候,会发现一个有趣的现象:有些字串是左右对称的,如madam。我们把这种字串称为symmetry text 即“对称文”。现在有若干航
2、字串,每一行可以由数字、标点符号、空格符以及英文字符(包括大小写)组成。要你帮忙编程判断是否是对称文,否则,就不能最大限度地发现有趣现象了。输入说明每个字串为一行,每行结束以回车符为标志,可能有上百上千行业说不定。当字串为“000000”时,输入结束。英文字符不区分大小写,即Madam亦为对称文。不要忘了“”也是互为对称的。输出说明如果是对称文,则输出“Symmetry”,否则输出“Not symmetry”。每个结论占一行。图 1 symmetry.in图 2 symmetry.out【程序代码】#include#includeusing namespace std;bool isMatch
3、(string s);int main() string s;while (1) cin s;if (pare(000000) = 0) break;if (isMatch(s) cout Symmetry endl;else cout Not symmetry endl;return 0;bool isMatch(string s) int len = s.length();for (int i = 0; i= a&si = A&slen - i - 1 = A&si = a&slen - i - 1 = z) if (si != (slen - i - 1 - (a - A) return
4、 false;else if (si = &slen - i - 1 = ) continue;else if (si = ) continue;else if (si = &slen - i - 1 = ) continue;else if (si = (&slen - i - 1 = ) continue;else if (si != slen - i - 1) return false;return true;【运行结果】图 3 实验一运行结果实验1-2 面向对象编程技术(1)【实验目的】理解面向对象的的程序设计思想。【实验内容】定义一个时间类Time,能提供和设置由时、分、秒组成的时间
5、,并编出应用程序,要求包括定义时间对象,设置时间,输出该对象提供的时间。并请将类定义作为界面,用多文件结构实现之。【程序代码】/Time.h#includeclass Timepublic:int h;int m;int s;void inputT();void changeT();void outputT(); /Time.cpp#include Time.h#includevoid Time:inputT()begin:int a, b, c;std:cout a b c;if (c 60 | c 0)std:cout 60 | b 0)std:cout 24 | a 0)std:cout
6、 Wrong time!Please set again!n;goto begin;else if (a = 24)if (b!=0 | c!=0)std:cout Wrong time!Please set again!n;goto begin;elseh = a;m = b;s = c;elseh = a;m = b;s = c;void Time:changeT()char p;std:cout p;if (p = n | p = N)std:cout Thank you for your using!n ;elsebegin1:int a, b, c;std:cout a b c;if
7、 (c 60 | c 0)std:cout 60 | b 0)std:cout 24 | a 0)std:cout Wrong time!Please set again!n ;goto begin1;else if (a = 24)if (b != 0 | c != 0)std:cout Wrong time!Please set again!n;goto begin1;else h = a;m = b;s = c;elseh = a;m = b;s = c;void Time:outputT()std:cout Output time(H:M:S)n h : m : s;/testmain
8、.cpp#include Time.h#includevoid main(void)Time time1;time1.inputT();time1.outputT();time1.changeT();time1.outputT();【运行结果】图 4 实验二运行结果实验3 面向对象程序设计(2)【实验要求】改写程序f0815.cpp,使之含有构造函数,拷贝构造函数和析构函数。并对主函数和矩阵向量的乘法也进行改写。对于第91和92行,合并成“multiply(ve,ma).display();”使之不会产生内存泄漏。【实验程序】/实验三/改写f0815.cpp#include#include#i
9、ncludeusing namespace std;class Vectorint* v;/指向一个数组,表示向量int sz;public:int size() return sz; Vector(int);Vector(const Vector& s);int& operator(int);void display();Vector();Vector:Vector(int s)sz = s;if (s = 0)cerr bad Vector size.n;exit(1);v = new ints;Vector:Vector(const Vector& s)int i;sz = s.sz;v
10、 = new intsz;for (i = 0; isz; i+)vi = s.vi;Vector:Vector()delete v;int& Vector:operator(int i)/引用返回的目的是返回值可以做左值if (i= sz)cerr Vector index out of rang.n;exit(1);return vi;void Vector:display()int i;for (i = 0; isz; +i)cout vi ;cout n;class Matrixint* m;int szl, szr;public:Matrix(int, int);Matrix(con
11、st Matrix& m);Matrix();int sizeL() return szl; int sizeR() return szr; int& elem(int, int);Matrix:Matrix(int i, int j)szl = i; szr = j;if (i = 0 | j = 0)cerr bad Matrix size.n;exit(1);m = new inti*j;Matrix:Matrix(const Matrix& s)int i, j;szl = s.szl;szr = s.szr;m = new intszl*szr;for (i = 0; iszl; i
12、+)for (j = 0; jszr; j+)mi*szr + j = s.mi*szr + j;Matrix:Matrix()delete m;int& Matrix:elem(int i, int j)/引用返回值的目的是可以做左值if (i0 | szl = i | j0 | szr = j)cerr Matrix index out of range.n;exit(1);return mi*szr + j;Vector multiply(Matrix& m, Vector& v)/矩阵乘向量int i, j;Matrix me(m);Vector va(v);if (m.sizeR()
13、 != v.size()cerr bad multiply Matrix with vector.n;exit(1);Vector r(m.sizeL();/创建一个存放结果的空向量for (i = 0; ime.sizeL(); i+)ri = 0;for (j = 0; j x y;Matrix ma(x, y);for (i = 0; ix; +i)for (j = 0; j ma.elem(i, j);in x;Vector ve(x);for (i = 0; i vei;Matrix me(ma);Vector va(ve);multiply(ma, ve).display();【实
14、验结果】图 5 实验三运行结果实验4 面向对象程序设计(3)【实验要求】请在程序f0904.cpp中的日期类的基础上,实现一个可以进行加天数操作获得另一个日期,以及进行日期减日期操作获得相隔天数的日期类,并进行应用程序设计:创建2015.8.21和2008.8.8两个日期,并计算中间相隔的天数,前者加上300天会是什么日子呢?【实验程序】一、头文件部分#pragma once/class Date with year-month-day version#include#includeusing namespace std;class Date int year, month, day;Date
15、(int n = 1) i2ymd(n);int ymd2i()const;void i2ymd(int n);static const int tians;public:Date(const string& s);Date(int y,int m,int d):year(y),month(m),day(d) Date operator+ (int n)const return Date(ymd2i() + n);Date& operator+=(int n) i2ymd(ymd2i() + n);return *this;Date& operator+() return *this += 1
16、;int operator-(Date& d)const return ymd2i() - d.ymd2i();bool isLeapYear()const return!(year % 4) & (year % 100) | !(year % 400);friend ostream& operator(ostream& o, const Date& d);二、函数定义/Date.cpp/Class Date with year-month-day Version#includeDate.h#include#include#includeusing namespace std;const in
17、t Date:tians = 0,31,59,90,120,151,181,212,243,273,304,334 ;const int Y400 = 146097;/number of days of 400 yearsconst int Y100 = 36524;/number of days of 100 yearsconst int Y4 = 1461;/number of days of 4 yearsDate:Date(const string& s) year = atoi(s.substr(0, 4).c_str();month = atoi(s.substr(5, 2).c_
18、str();day = atoi(s.substr(8, 2).c_str();void Date:i2ymd(int absDay) year = absDay / Y400 * 400;int y = absDay%Y400;/被400年除得的天数if (y = Y400 - 1) month = 12, day = 30;return;year += y / Y100 * 100;y %= Y100;year += y / Y4 * 4;y%=Y4;if (y = Y4 - 1) month = 12, day = 30;return;year += y / 365;y %= 365;i
19、f (y = 0) month = 12, day = 31;return;year+;bool leap = isLeapYear();for (month = 1; monthtiansmonth + (month = 2 & leap); month+);day = y - tiansmonth - 1;int Date:ymd2i()const int yearDay = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;return yearDay + tiansmonth - 1 + (i
20、sLeapYear() & month 2) + day;ostream& operator(ostream& o, const Date& d) return o setfill(0) setw(4) d.year - setw(2) d.month - setw(2) d.day setfill( );三、testmain/testmain.cpp/using Date class#includeDate.h#includeusing namespace std;int main() Date d1(2005, 8, 21);Date d2(2008, 8, 8);cout 2005.8.
21、21与2008.8,8中间相隔的天数是: d2 - d1 n;cout 2005.8.21加上300天是: d1 + 300 n;【程序结果】实验5 面向对象程序设计(4)【实验要求】在上题Date类的基础上,继承一个WDate类,它包含了星期几信息,因而,显示日期的成员要做修改,应同时显示星期几。另外,还要增加获得星期几的成员。想一想,类中数据成员置年、月、日好呢,还是绝对天数好呢?进而进行应用程序设计:创建2005.8.21和2008.8.8两个日期,分别显示这两个日期。【实验程序】一、头文件Date.h#pragma once/Date.h/class Date with year-mo
22、nth-day version#include#includeusing namespace std;class Date int year, month, day;static const int tians;protected:Date(int n = 1) i2ymd(n);int ymd2i( )const;void i2ymd(int n);public:Date(const string& s );Date(int y, int m, int d) :year(y), month(m), day(d) Date operator+(int n)const return Date(y
23、md2i() + n);Date& operator+=(int n) i2ymd(ymd2i() + n);return *this;Date& operator+() return *this += 1;int operator-(Date& d)const return ymd2i() - d.ymd2i();bool isLeapYear()const return !(year % 4) & (year % 100) | !(year % 400);friend ostream& operator(ostream& o, const Date& d);二、头文件WDate.h#pra
24、gma once/WDate.h#includeDate.h#include#includeusing namespace std;class WDate :public Date protected:WDate(int n = 1) :Date(n) WDate(const Date& d) :Date(d) public:WDate(const string& s) :Date(s) WDate(int y, int m, int d) :Date(y, m, d) WDate operator+(int n) const return Date:operator+(n); WDate&
25、operator+=(int n) Date:operator+=(n); return *this; WDate& operator+() return *this += 1;int getWeekDay() return ymd2i() % 7; /0:Sunday,1:Monday,etc.int operator-(WDate& wd)const return ymd2i() - wd.ymd2i(); friend ostream& operator(ostream& o, const WDate& wd);三、Date.cpp/Date.cpp/Class Date with ye
26、ar-month-day Version#includeDate.h#include#include#includeusing namespace std;const int Date:tians = 0,31,59,90,120,151,181,212,243,273,304,334 ;const int Y400 = 146097;/number of days of 400 yearsconst int Y100 = 36524;/number of days of 100 yearsconst int Y4 = 1461;/number of days of 4 yearsDate:D
27、ate(const string& s) year = atoi(s.substr(0, 4).c_str();month = atoi(s.substr(5, 2).c_str();day = atoi(s.substr(8, 2).c_str();void Date:i2ymd(int absDay) year = absDay / Y400 * 400;int y = absDay%Y400;/被400年除得的天数if (y = Y400 - 1) month = 12, day = 30;return;year += y / Y100 * 100;y %= Y100;year += y
28、 / Y4 * 4;y %= Y4;if (y = Y4 - 1) month = 12, day = 30;return;year += y / 365;y %= 365;if (y = 0) month = 12, day = 31;return;year+;bool leap = isLeapYear();for (month = 1; monthtiansmonth + (month = 2 & leap); month+);day = y - tiansmonth - 1;int Date:ymd2i()const int yearDay = (year - 1) * 365 + (
29、year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;return yearDay + tiansmonth - 1 + (isLeapYear() & month 2) + day;ostream& operator(ostream& o, const Date& d) return o setfill(0) setw(4) d.year - setw(2) d.month - setw(2) d.day setfill( );四、WDate.cpp/WDate.cpp/Class WDate with year-month-day Vers
30、ion#includeWDate.h#includeusing namespace std;ostream& operator(ostream& o, const WDate& wd) switch(wd.ymd2i() % 7) case 0: return o Sun. Date(wd);case 1: return o Mon. Date(wd);case 2: return o Tue. Date(wd);case 3: return o Wed. Date(wd);case 4: return o Thr. Date(wd);case 5: return o Fri. Date(wd
31、);case 6: return o Sat. Date(wd);五、testmain.cpp/testmain.cpp/using WDate class#include WDate.h#include using namespace std;int main() WDate d1(2005,8,21);WDate d2(2008,8,8);cout d1 n;cout d2 n;【实验结果】学生实验 心得通过这次实验,我也着实又感受了一次编程的乐趣,从中也学到了不少知识。虽然都说“程序=数据结构+算法”,但我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次C+的实验。我感受最深的一点是:以前用C语言编程,只注重如何编写函数能够完成所需要的功能,没有明确的战术,只是单纯凭借意识和简单的语句来堆砌出一段程序,只要能完成任务就行。但现在感觉完全不同,在编写程序之前,自己能够综合考虑各种因素,首选自己需要的数据结构,然后选定一种或几种存储结构来具体决定后面的函数的主要风格。最后在编写每一个函数之前,可以仔细斟酌对比,挑选出最适合当前状况的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了。这样无形中就提高了自己编写的程序的质量。学生(签名): 2016年04月13 日指导教师评语成绩评定:指导教师(签名): 年 月 日-
限制150内