当前位置: 首页 > news >正文

C++ DAY3

作业

 代码

/*********************************** 声明部分 ***********************************/
class mystring
{
private:
    char* arr;      
    int len;
public:
    //构造函数
    mystring(const char* str=NULL);
    //拷贝构造
    // mystring(const mystring& str) = delete;

    ~mystring();
    // 重载=
    mystring& operator=(const mystring& index);
    // 重载+
    mystring operator+(const mystring& index);
    // 重载+=
    mystring& operator+=(const mystring& index);
    // 重载[]
    char& operator[](const int& index);
    //成员方法
    void show()const;
};

/********************************* main主函数 *********************************/
int main(int argc,const char** argv)
{
    mystring str="hello";
    mystring temp="new";
    mystring ptr="world";

    // 连续相加 测试
    ptr=str + " " + temp + " " + ptr;
    ptr.show();

    // 连续相等 测试
    ptr = str = temp;
    ptr.show();
    str.show();
    temp.show();

    // 测试 += 的效果
    str+= ( ptr + temp );
    str.show();

    // 指定修改第 i 位
    for(int i=0;i<9;i++)
    {
        str[i]='O';
    }
    str.show();

    return 0;
}

/******************************** 类的 成员方法 ********************************/
//构造函数
mystring::mystring(const char* str)
    :arr(NULL),len(0)
{
    if(str!=NULL)
    {
        len=strlen(str)+1;          //获取数据长度
        arr = new char[len];        //申请动态内存
        strcpy(arr,str);            //进行数据拷贝
    }
}
//析构函数
mystring::~mystring()
{
    if(arr!=NULL)
    {
        delete[] arr;
        arr=NULL;
    }
}
//显示
void mystring::show()
const
{
    cout << ( arr==NULL? "(null)":arr )<<endl;
}

//重载 =
mystring& mystring::operator=(const mystring& index)
{
    if(this!=&index)
    {
        //释放旧空间
        delete[] arr;
        //获取新数据长度
        len=index.len;
        //申请新空间
        arr=new char[len];
        //数据写入到新空间
        strcpy(arr,index.arr);
    }
    // 由于存在 "连续等于" 情况, a=b=c 
    // 所以 = 有返回值,返回自身
    return *this;
}
//重载 +=
mystring& mystring::operator+=(const mystring& index)
{
    //备份旧空间地址
    char* temp=arr;
    //新空间需要的大小
    len+=index.len-1;
    //申请新空间
    arr=new char[len+1];
    //数据写入到新空间
    strcpy(arr,temp);
    strcat(arr,index.arr);
    //释放旧空间
    delete[] temp;
    
    // 由于 if( index += 5 == 5){} 这种语法符合规则 
    // 说明 += 也有返回值 , 返回 += 后结果
    return *this;   
}

//重载 +
mystring mystring::operator+(const mystring& index)
{
    //计算 相加后的字符串 长度
    int newStrlen = len + index.len-1;
    //字符数组,用于存放相加后的字符串
    char newStr[newStrlen]; 
    //数据写入到数组
    strcpy(newStr,arr);
    strcat(newStr,index.arr);
    //创建类
    mystring sum = newStr;
    //返回类
    //由于生命周期不够长 , 不返回引用
    return sum;
}

//重载 []
char& mystring::operator[](const int& index)
{
    return arr[index];
}

效果

作业

测试逻辑

程序A 向指定频道 写入数据

程序B去指定频道 读取数据

代码

发送端代码

class Msg
{
private:
    long channel;       //频道号
    char buf[128];      //指向消息
    key_t key;
    int id;
public:
    Msg(const char* filename=NULL)
        :channel(-1),buf(""),key(-1),id(-1)
    {
        //如果没有传入文件名.则退出
        if(NULL==filename){return;}
        //如果文件不存在,则创建,不打开
        open(filename,O_EXCL|O_CREAT,0666);

        //生成密钥
        key=ftok(filename,1);
        //获得id
        id=msgget(key,IPC_CREAT|0666);
    }

    void send(const char* str)
    {
        
        strcpy(buf,str);
        msgsnd(id,this,strlen(buf),IPC_NOWAIT);
    }

    char* read()
    {
        memset(buf,0,128);
        msgrcv(id,this,128,channel,0);
        return buf;
    }

    // 重载[]
    Msg& operator[](const int& index)
    {
        channel=index;
        return *this;
    }
};

int main(int argc,const char** argv)
{
    Msg m("IPC");
    m[4].send("数据");
	return 0;
}

读取端代码

int main(int argc,const char** argv)
{
    Msg m("IPC");
    string str=m[4].read();
    cout<<str<<endl;
	return 0;
}

效果

作业

测试

程序A 拿走一个信号量 输出一个数据

程序B 终端有输入,则释放一个信号量

代码

【main1.c】 每次拿走一个信号量,就输出一个数据


class Sem
{
private:
    int index;     //记录信号灯集总数
    int index_op;     //将对那个下标操作
    key_t key;
    int id;
public:
    Sem(const int& num,const int& index_value)
        :key(-1),id(-1),index(num),index_op(-1)
    {
        //如果文件不存在,则创建,不打开
        open("IPC",O_EXCL|O_CREAT,0666);

        //生成密钥
        key=ftok("IPC",2);
        //获得id
        id=semget(key,num,IPC_CREAT|0666);
        //初始化
        for(int i=0;i<num;i++)
        {
            //遍历所有下标 初始化为指定值 index2
            semctl(id,i,SETVAL,index_value);
        }
    }
    //手动设置指定下标的值
    void init(const int& index)
    {
        semctl(id,index_op,SETVAL,index);
    }

    // 重载[]
    Sem& operator[](const int& index)
    {
        //说明选中第 i 个
        index_op=index;
        return *this;
    }

    //重载 +
    Sem& operator+(const int& index)
    {
        struct sembuf sop;
        sop.sem_num=index_op;		//选中下标
        sop.sem_op=index;			//解锁 index 次
        sop.sem_flg=SEM_UNDO;	    //自动销毁
        //执行依次上述设定的操作
        semop(id,&sop,1);
        return *this;
    }

    //重载 -
    Sem& operator-(const int& index)
    {
        struct sembuf sop;
        sop.sem_num=index_op;		//选中下标
        sop.sem_op=-index;			//上锁 index 次
        sop.sem_flg=SEM_UNDO;	    //自动销毁
        //执行依次上述设定的操作
        semop(id,&sop,1);
        return *this;
    }
};

int main(int argc,const char** argv)
{
    //创建信号灯集
    Sem m(5,0);
    //手动设定 [下标1] 信号量 为1
    m[1].init(1);

    string str[5]={"你","好","新","世","界"};
    for(int i=0;i<5;i++)
    {
        m[1]-1;             //拿走 [下标1] 上的一个信号量
        cout<<str[i]<<endl; //输出内容
    }

	return 0;
}

【main2.c】 终端有输入就释放一个信号量

int main(int argc,const char** argv)
{   
    while(1)
    {
        //如果从终端吃到回车
        while(getchar()!=10);
        //就释放一个信号量
        m[1]+1;
    }
	return 0;
}

效果

相关文章:

  • SMT贴片车间高效运作实战指南
  • uniapp 网络请求封装(uni.request 与 uView-Plus)
  • 《深度学习实战》第2集:卷积神经网络(CNN)与图像分类
  • BDF7与glm的对话
  • 学习笔记-沁恒第四讲-米醋
  • 校园电子地图制作:校园三维地图从 CAD 图纸到 WebGIS 服务的完整链路
  • Spring Boot 集成 T-io 实现客户端服务器通信
  • 蓝桥杯定时器实现led闪烁
  • Proser:在项目中验证功能
  • 【多模态处理篇六】【DeepSeek3D点云处理:PointNet++工业检测】
  • C++17中std::chrono::duration和std::chrono::time_point的舍入函数
  • 解决:将deepseek本地部署之后出现网络错误
  • 51单片机-串口通信编程
  • js 实现隔行幻色
  • 第五篇:DeepSeek-R1 的应用场景与未来展望
  • [特殊字符] 蓝桥杯 Java B 组 之位运算(异或性质、二进制操作)
  • Linux第十三节 — 进程状态详解
  • sklearn中的决策树-分类树:重要参数
  • reacct hook useState
  • RT-Thread+STM32L475VET6——icm20608传感器
  • 言短意长|党政主官如何塑造流量城市?
  • 中东睿评|胡塞武装已成为楔入中东各方力量之间的钉子户
  • 沪幼升小网上报名明起开始,是否参与民办摇号怎么定?
  • 实探北京楼市:“好房子”卖点十足,二手房持续回稳
  • 沙发上躺赢又如何?告别冠军绝缘体的凯恩,要开始收割荣誉了
  • 申活观察|演出场次破纪录、入境游导游档期忙,上海文旅商“热力”拉满