当前位置: 首页 > 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);//获得idid=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);//获得idid=semget(key,num,IPC_CREAT|0666);//初始化for(int i=0;i<num;i++){//遍历所有下标 初始化为指定值 index2semctl(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] 信号量 为1m[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;
}

效果


http://www.mrgr.cn/news/91940.html

相关文章:

  • 个人环境配置--安装记录
  • 虚拟机从零实现机器人控制
  • 深入理解设计模式之解释器模式
  • Java Web开发实战与项目——开发一个在线论坛系统
  • 一个解析cyber record文件的python示例脚本
  • 分布式事务-本地消息表学习与落地方案
  • python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理
  • Swiper插件的运用和学习
  • 蓝桥与力扣刷题(蓝桥 交换瓶子)
  • C++17中std::chrono::duration和std::chrono::time_point的舍入函数
  • DPVS-1:编译安装DPVS (ubuntu22.04)
  • 23. AI-大语言模型-DeepSeek简介
  • 安全运维,等保测试常见解决问题。
  • DeepSeek与ChatGPT:会取代搜索引擎和人工客服的人工智能革命
  • 二级公共基础之数据结构与算法篇(七)排序技术
  • 如何在 SpringBoot 项目使用 Redis 的 Pipeline 功能
  • Java File 类
  • GCC头文件搜索顺序详解
  • OpenBMC:BmcWeb实例化App
  • 【Linux】HTTP:Cookie 和 Session 详解