1. 类的设计与实现
定义并测试日期类 Date ,实现日期的设置和输出
• 类包括私有数据成员 year, month, day;
• 公有成员函数实现以下功能:
1)设计各种构造函数,有参数与默认构造函数 (合理即可,没有硬性要求)
2)设置时间 bool set( int y, int m, int d),并对该时间的有效性进行检测
3)输出时间,按 mm/ dd / yyyy 方式打印
4)判断该日期是一年的第几天
编写一个驱动程序,对该类进行测试.
2. 含有指针成员的类的实现、理解常量成员函数
定义如下字符串类, 实现 C++字符串的存储和操作。
class myString
{
public :
myString (const char *pn = nullptr) ;
~ myString ( ) ;
myString(const myString& s); // 拷贝构造函数实现深拷贝
void set( const char *pn) ; //将字符串设置为 pn 指向的内容,注意避免越界
void set( const mySring & rStr) ; //将字符串设置为 rStr 中的内容,注意避免越界
void print( ) const;// 输出字符串整体和长度
char& get (int i) const ; // 返回字符串中的下标为 i 的字符,注意 i 的有效性
void toUpper( ); //转化为大写字符串
bool strcompare( const myString& s ); //比较字符串
private:
char *pStr ; // 指向存储字符串的空间 new char[size+1]
int size ; //包含字符的数目
} ;
int main()
{
myString s2, s1(“Hello”);
cout<< s1.get(0) <<endl; //输出 H
s2.print(); //输出“Empty string”,0
s2.set (“Hello world”);
s2.print(); //输出“Hello world”
s1.toUpper();
s1.print(); //输出 HELLO
s1.set(s2);
if( s2. strcompare(s1 ))
cout<<”字符串相同”;
else cout<<”字符串不同”;
myString s3 = s1;
if( s3. strcompare(s1 ))
cout<<”字符串相同”;
else cout<<”字符串不同”;
return 0;
}
3, 静态成员
1) 编写一个类 Node,声明一个数据成员 member 和一个静态成员 count,编写
构造函数初始化数据成员,并把静态数据成员加 1,编写析构函数把静态数据成员减
1。
2) 在 1)的基础上编写应用程序,创建 3 个对象,然后显示他们的数据成员和
静态成员,再析构每个对象,并显示他们对静态数据成员的影响。
3) 修改 2),让静态成员函数访问静态数据成员,并让静态数据成员是私有的。
4. 友元函数
设计一个类,实现两个复数的四则运算。实现加减乘除功能的函数用友元函数实现。
5. 选做
设计一个整数链表类,满足栈操作。即,总在链表首插入结点,总在链表首取出(删除)
结点。类中需有记录结点个数的数据成员。如果链表为空,而要做取出结点操作,则类必须
给出错误信息。
编写应用程序,取 100 次随机数(范围 10-200),每取到比前一个随机数大时,放入链
表中,否则,略去。然后逐个取出,求其和。
用堆分配方法逐个产生满足条件的结点,插入链表中。每当从链表中取出一个结点时,要
及时将结点删除。
求和工作不要在链表类中完成,以使该链表类具有通用性
2.1
#include <iostream>
using namespace std;
class Date{
private:
int year;
int month;
int day;
public:
bool set(int y,int m,int d);
Date();
Date(int yy,int mm,int dd){
year=yy;
month=mm;
day=dd;
};
void printTime();
void NumberDay();
};
void Date::printTime(){
printf("%02d/%02d/%04d\n", month, day, year);
};
Date::Date(){
year=0;
month=0;
day=0;
};
int isLeapYear(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
else
return 0;
};
bool Date::set(int y,int m,int d){
int flag=0;
if(y>=0&&m>=1&&m<=12) flag=m;
else{
cout<<"日期无效!"<<endl;
return false;
}
switch(flag){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(d>=1&&d<=31){
year=y;
month=m;
day=d;
}
else{
cout<<"日期无效!"<<endl;
return false;
}
break;
case 2:
if(isLeapYear(y)){
if(d>=1&&d<=29){
year=y;
month=m;
day=d;
}
else{
cout<<"日期无效!"<<endl;
return false;
}
}
else if(d>=1&&d<=28){
year=y;
month=m;
day=d;
}
else
{
cout<<"日期无效!"<<endl;
return false;
}
break;
default:
if(d>=1&&d<=30){
year=y;
month=m;
day=d;
}
else{
cout<<"日期无效!"<<endl;
return false;
}
break;
}
};
void Date::NumberDay(){
int sum=0;
int k[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)) k[2]=29;
for(int i=0;i<month;i++){
sum+=k[i];
}
sum+=day;
cout<<"是第"<< sum<<"天"<<endl;
}
int main(){
Date d;
d.printTime();
Date d2(2001,2,20);
d2.printTime();
d2.NumberDay();
d2.set(2000,2,29);
d2.printTime();
}
2.2
#include <iostream>
#include <cstring>
using namespace std;
class myString{
public :
myString (const char *pn = NULL) ;
~ myString ( ) ;
myString(const myString& s); // 拷贝构造函数实现深拷贝
void set( const char *pn) ; //将字符串设置为 pn 指向的内容,注意避免越界
void set( const myString &rStr) ; //将字符串设置为 rStr 中的内容,注意避免越界
void print( ) const;// 输出字符串整体和长度
char& get (int i) const ; // 返回字符串中的下标为 i 的字符,注意 i 的有效性
void toUpper( ); //转化为大写字符串
bool strcompare( const myString& s ); //比较字符串
private:
char *pStr ; // 指向存储字符串的空间 new char[size+1]
int size ; //包含字符的数目
};
myString::myString(const char *pn ){
if(pn==NULL){
pStr=NULL;
size=0;
}
else{
pStr=new char[strlen(pn)+1];
strcpy(pStr,pn);
size=strlen(pn)+1;
}
}
myString::~myString(){
delete [] pStr;}
void myString::print() const{
if(pStr==NULL) cout<<"Empty string"<<","<<size<<endl;
else cout<<pStr<<","<<size<<endl;
}
void myString::set(const char *pn){
if(pn==NULL){
cout<<"Empty string"<<endl;
}
else {
delete [] pStr;
pStr=new char[strlen(pn)+1];
strcpy(pStr,pn);
size=strlen(pn)+1;}
}
myString::myString(const myString& s){
if(s.pStr){
pStr=new char[strlen(s.pStr)+1];
strcpy(pStr,s.pStr);
size=s.size;
}else {
cout<<"拷贝构造失败!"<<endl;
}
}
void myString::set( const myString &rStr){
if(rStr.pStr){
pStr=new char[strlen(rStr.pStr)+1];
strcpy(pStr,rStr.pStr);
size=rStr.size;
}else {
cout<<"设置失败!"<<endl;
}
}
char & myString::get (int i) const{
if(i>=0&&i<size){
return pStr[i];
}else cout<<"i无效!"<<endl;
}
void myString::toUpper(){
for(int i=0;i<size;i++){
if(97<=pStr[i]&&pStr[i]<=122){
pStr[i]-=32;
}
}
}
bool myString::strcompare( const myString& s )//比较字符串
{
if(strcmp(pStr,s.pStr)==0) return true;
else return false;
}
int main()
{
myString s2, s1("Hello");
cout<< s1.get(0) <<endl; //输出 H
s2.print(); //输出“Empty string”,0
s2.set ("Hello world");
s2.print(); //输出“Hello world”
s1.toUpper();
s1.print(); //输出 HELLO
s1.set(s2);
if( s2. strcompare(s1 ))
cout<<"字符串相同";
else cout<<"字符串不同";
myString s3 = s1;
if( s3. strcompare(s1 ))
cout<<"字符串相同";
else cout<<"字符串不同";
return 0;
}
2.3
#include <iostream>
using namespace std;
class Node{
public:
static void print_count();
Node(int mem=0);
~Node();
void print();
private:
static int count;
int member;
};
int Node::count=0;
Node::Node(int mem){
member=mem;
count++;
}
Node::~Node(){
count--;
}
void Node::print(){
cout<<"member="<<member<<endl;
}
void Node::print_count(){
cout<<"count="<<count<<endl;
}
int main(){
Node n1(1);
Node n2(2);
Node n3(3);
n1.print();
n2.print();
n3.print();
Node::print_count();
n1.~Node();
n2.~Node();
n3.~Node();
Node::print_count();
}
2.4
#include <iostream>
using namespace std;
class cal{
private:
double m;
double n;
double a;
double b;
public:
cal(double mm=0.0,double nn=0.0);
void print();
friend void plus_(cal c1,cal c2);
friend void min(cal c1,cal c2);
friend void chen(cal c1,cal c2);
friend void chu(cal c1,cal c2);
};
void cal::print(){
if(a!=0){
if(b>0)
cout<<a<<"+"<<b<<"i"<<endl;
else if(b==0) cout<<a<<endl;
else if(b<0) cout<<a<<b<<"i"<<endl;}
else if(a==0){
if(b==0)cout<<0<<endl;
else cout<<b<<"i"<<endl;
}
}
cal::cal(double mm,double nn){
m=mm;
n=nn;
}
void plus_(cal c1,cal c2){
c1.a=c1.m+c2.m;
c1.b=c1.n+c2.n;
c1.print();
}
void min(cal c1, cal c2){
c1.a=c1.m-c2.m;
c1.b=c1.n-c2.n;
c1.print();
}
void chen(cal c1,cal c2){
c1.a=c1.m*c2.m-c1.n*c2.n;
c1.b=c1.m*c2.n+c1.n*c2.m;
c1.print();
}
void chu(cal c1,cal c2){
if(c2.m==0&&c2.n==0) cout<<"除数不能为0!"<<endl;
else {double mu =c2.m*c2.m+c2.n*c2.n;
c2.n *= -1;
c1.a = c1.m*c2.m - c1.n*c2.n;
c1.b= c1.m*c2.n + c1.n*c2.m;
c1.a/= mu;
c1.b/= mu;
c1.print();}
}
int main(){
cal c1(1,2);
cal c2(3,4);
plus_(c1,c2);
min(c1,c2);
chen(c1,c2);
chu(c1,c2);
return 0;
}
2.5
#include <iostream>
#include <ctime>
#include<cstdlib>
using namespace std;
class LinkNode
{
public:
int data; //数据域
LinkNode *link; //指向后继指针的结点
LinkNode(const int&el, LinkNode *ptr = 0){ //构造函数
data=el;
link=ptr;
}
};
class LinkStack
{
private:
LinkNode *top; //指向栈顶的指针
int size; //存放元素的个数
public:
bool empty(){
if(size==0) return true;
else return false;
}
LinkStack() //构造函数
{
top = NULL;
size = 0;
}
~LinkStack() //析构函数
{
Clear();
}
void Clear() //清空栈内容
{
while(top != NULL)
{
LinkNode *tmp = top;
top = top->link;
delete tmp;
}
size = 0;
}
bool Push(const int item) //入栈操作的链式实现
{
LinkNode *tmp = new LinkNode (item, top);
top = tmp;
size++;
return true;
}
bool Pop() //出栈操作的链式实现
{
LinkNode *tmp;
if(size == 0)
{
cout << "栈为空,不能执行出栈操作" << endl;
return false;
}
int item = top->data;
tmp = top->link;
delete top;
top = tmp;
size--;
return true;
}
int Top() //读取栈顶元素,但不删除
{
if(size == 0)
{
cout << "栈为空,不能读取栈顶元素" << endl;
return 0;
}
int item = top->data;
return item;
}
};
int main(){
srand(time(0));
int n = 100;
LinkStack l;
int x=0;
int item=0;
for (int i = 0;i<n; i++)
{
item = rand() % 191 + 10;
if(item>x){
x=item;
l.Push(x);}
}
int sum = 0;
while (!l.empty()){
sum += l.Top();
l.Pop();
}
cout << sum;
}