DLUT c++上机作业(实验五)

实验5 派生与继承
1、 实验目的和要求
此实验用两个单元的时间完成,是一个综合性的实验,要求编写的程序涉及到C++的许多知识点,如类的定义,动态分配内存,构造函数,派生,虚基类等。实验内容给出的是一个完整的程序,4个题目实际是类等级。同学也可以在此基础上发挥增加新的内容。
2、 实验内容:
1. 定义一个基类MyArray,基类中可以存放一组数组。
编写构造函数,析构函数及其它函数,实现动态分配内存,释放内存和数据输入输出等功能。并进行调试。
2.定义一个类averarray继承自myarray,在类中求数组的平均值,并输出。进行调试。
3.定义一个类revarray继承自 myarray, 使数组按反序存放,并输出。进行调试。
4. 定义一个类Nawarray继承自averarray和revarray。在继承过程中声明为虚基类,体会虚基类在解决二义性中的问题中的作用。调试中可以试一试不用虚基类出现的问题。

前四个归为一题。

#include<iostream>
using namespace std;


class myarray
{ 
    int *alist;
    int length;
public:
    myarray(int leng);
    ~myarray();
    int getlen();
    int *getlist();
    void input();
    void display();
};
class avearray :virtual public myarray{
    double ave;
public:
    avearray(int length) :myarray(length){}
    void display(){
        int *p = getlist();
        ave = 0;
        for (int i = 0; i < getlen(); i++)ave += *(p + i);
        ave /= getlen();
        cout << ave << endl;
    }
};
class revarray :virtual public myarray{
public:
    revarray(int len) :myarray(len){};
    void display_and_rev();
};
class nawarray :public avearray, public revarray{
public:
    nawarray(int len) :myarray(len), avearray(len), revarray(len){}
};
void revarray::display_and_rev(){
    int *temp = new int[getlen()];
    int *p = getlist();
    for (int i = getlen() - 1; i >= 0; i--){
        *(temp + getlen() - i - 1) = *(p + i);
    }
    for (int i = 0; i < getlen();i++){
        *(p + i) = *(temp + i);
    }
    for (int i = 0; i < getlen(); i++)cout << *(p + i) << " ";
    cout << endl;
}
int myarray::getlen(){
    return length;
}
int* myarray::getlist(){
    return alist;
}
myarray::myarray(int leng){
    length = leng;
    if (leng>0)
    alist = new int[leng];
}
myarray::~myarray()
{
    if (length>0)
    delete[]alist;
    else cout << "mistake" << endl;
    alist = NULL;
}
void myarray::input(){
    for (int i = 0; i < length; i++)cin >> *(alist + i);
}
void myarray:: display(){
    for (int i = 0; i < length; i++)cout << *(alist + i) << " ";
    cout << endl;
}
int main(){

    avearray ave(5);
    ave.input();
    ave.myarray::display();
    ave.display();

    revarray reve(5);
    reve.input();
    reve.display_and_rev();

    nawarray naw(5);
    naw.input();
    naw.myarray::display();
    naw.display();
    naw.display_and_rev();
}
  1. 编写一个程序,实现字符串操作:
    一个简单串类string,包含输入字符串、返回字符串长度及内容等功能;
    另有一个具有编辑功能的串类edit_string,它继承string类,在其中设置一个光标,使其能支持在光标处的插入、替换和删除等编辑功能。
#include<iostream>
#include<string.h>
using namespace std;
class String{
    char *str;
public:
    char*getstr();
    void input();
    void show();
    int getlen();
    String();
};
char* String::getstr(){
    return str;
}
void String::input(){
    cin>>str;
}
void String::show(){
    cout<<str<<endl;
}
String::String(){
    str=new char[100];
}
int String::getlen(){
    return strlen(str);
}
class edit:public String{
public:
    void insert(int x,String p);
    void remove(int x);
    void replace(int x,char c);
};
void edit::insert(int x,String p){
    char *s=getstr();//1
    char *temp=p.getstr();//2
    int slen=strlen(s);
    int plen=strlen(p.getstr());
    for(int i=slen+plen-1;i>=x+plen;i--){
        *(s+i)=*(s+i-plen);
    }
    for(int i=x;i<x+plen;i++){
        *(s+i)=*(temp+i-x);
    }
    *(s+slen+plen)='\0';

}

void edit::remove(int x){
    char *temp=getstr();
    for(int i=x;*(temp+i)!='\0';i++){
        *(temp+i)=*(temp+i+1);
    }
}
void edit::replace(int x,char c){
    char *temp=getstr();
    *(temp+x)=c;
}
int main(){


    edit s;
    s.input();
    s.show();


    String str;
    str.input();

    s.insert(1,str);
    s.show();


    char c;cin>>c;
    s.replace(1,c);
    s.show();

    s.remove(2);
    s.show();
}
  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值