大连理工大学C++第二次上机

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;
}
		

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值