2019吉大软件C++课设——模拟即时通信系统

吉林大学大三学生 东北师范大学附属中学OJ jinxi20111 2019.08.28

首先第一点,如果你是来学习和提问的,直走请进,如果你还没有仔细阅读完并感受到难度,我的建议是多阅读两遍,或者先动手写一点,有助于理解。

但如果是想来抄现成的代码,手机左上↖,电脑右上↗不送,因为这里么得代码,只有少数伪代码用来改进你的程序


课设目的:面向对象,C++编程思想,类层次,继承,多态,结构清晰&风格良好

咱一个一个解决

面向对象,和面向过程相对应。一个比较经典的例子是两个人围棋对弈,一个面向过程的程序,主要分析两个人下棋时下在哪里,借此来进行分析。而面向对象则是对下棋的双方,下棋的环境进行分析。而我们在使用面向对象思想的时候,不可避免的要使用类这个概念。但是在面向过程的程序当中,我们更喜欢使用结构体多一些。

C++编程思想,因为学弟学妹接触的语言不多,就算是接触过JAVA和html5的,也会发现他们的历史当中都有C语言的身影,所以我们现在所谓的编程思想,都是建立在使用C语言的基础上的。现在我们接触的C++并没有跳出这个坑,所以这里不必在意。

类的层次,即我们不能将所有的类都单独用一个Class列出来。我想举一个例子,我们在看小说/剧/番的时候(尤其是美剧日漫),我们并不会清晰的记得每个人的名字,但是却能很清楚的记得大多数人之间的关系。这就是类的层次。如:这个人是李现在剧里面的女友。我们可能不会记得她叫什么,但只要有这层关系在,你只需要记住李现,就能轻易地拽出和他有关系的人。所谓层次,其实就是上下级的关系,也是关系的一种。不必畏难怕麻烦,回头去找之前是怎么写的,还有回头DEBUG,比你多写一句话困难多了。

继承,这里的继承,就是(你想笑死我好继承我的蚂蚁花呗 )的继承。但我觉得继承不准确,应该叫遗传。即子类拥有父类的特征,但是子类并不是和父类完全一致。

多态,一个类函数,有多种不同用法,有不同的参数和不同的返回值。你家扫帚就是多态的,扫地的时候参数是你和地板,返回值是地的状态由dirty变成了clean,但是用来打你的时候参数就是你和你妈了,返回值是你的状态A从naughty变成了docile(温顺的),状态B由fearless变成了闹太套 (笑)

结构清晰&风格良好
结构清晰:类按顺序和关系写
风格良好:程序前后有逻辑,程序本身有缩进,变量名规范。

变量名的问题我在另一篇博客里说过,我稍微写一下。
循环变量 i,j,k,l
数组名称:a,b,具有实际意义的缩写
字符:c
临时变量:t 或者在t的后面加上类型变量名,如tc1,代表第一个临时字符变量
布尔值 flag
字符串 s
数字中间值 num ans h h代表总和,

——
经历了上面这些之后,我建议你去接一杯水,休息一下。

我也去泡杯茶。我女票在茶博会上给我买的~茶博会就在长春农博园旁边,有兴趣可以(翘课)去看看。(课是真特么多

休息好了就继续吧

设计题目还是很有意思的,很贴近生活:模拟即时通信系统

看完题目描述,唔,高端

再看用户基本信息,好嘛,傻了

共享ID???独立ID???绑定???咋实现啊?

这里我先跟大家聊聊这个共享ID的事情。

共享ID我是头一批感受到的人。那个时候还是人人网先开通的这个功能吧,就是可以用QQ号登录人人网。那个时候感觉特别神奇,QQ是把人人网收购了么?后来有越来越多的网站都开通了QQ账号直接登录的功能之后,我才意识到这其实只是一个所谓的绿色通道,它在后台其实还是给你注册了一个账号。只不过这个账号的登录权限放在了QQ验证中了。

所以共享ID怎么写呢? 我的建议是写一个人类。不是人类,是“”类。这个人呢,可以有QQ+微信,微信+微博,或只有QQ,不关键。关键在于,只要不相互关联,你不把QQ,微博,微信关联起来,你就是三个独立的用户,腾讯认为这是三个不同的人。

现在定义一个人的类,它会具有:QQ的ID,微信的ID,三个产品是否开通的flag值。QQ昵称,QQ出生日期,Q龄,微信昵称,微信出生日期,微龄。

为啥QQ和微信的出生日期要分开写,因为如果你只有QQ的话,就应该把出生日期存在QQ的类里面,而不该去动微信里面的。那为什么不写一个公用的?因为怕老师查……查那种注册QQ和微信然后绑定,结果出生日期不一致那种恶心的需要判断情况……当然你觉得还ok的话可以自己尝试写一写,其实不难,就是多了跳出条件这件事我有•难受就不写了。

QQ和微信相互独立,所以我的类会改成:QQID,微信ID,flag,继承类QQ,继承类微信。
这样,层次!层次就出来了!微信下的用户,QQ下的用户,一下就体现出来了。

ID为啥还写在外面?我喜欢用结构体存信息,用ID可以直接找到我想要的。就这么简单。
student[ID].flagQQ,我一下就知道了ID对应用户是否开通了QQ,方便吧!

用户基本信息就这些,好友管理有丶意思。好友的解决方式有很多,我就简单说一下我的做法。因为课设本身数据量很小,我使用的方式是建立矩阵,用(1,3)=True的方式代表1的好友中有3。反向的(3,1)=True代表的是1是3的好友。这种方式相比较于直接记录数对,查找简单,使用方便,最大的问题是统计关系数量的时候需要遍历时间代价很大,存储的空间代价也很大。但就是一个大二的课设而已,有100个数据就不错了,所以矩阵是最好的几种方法之一。建立矩阵的方式是用二维布尔数组,初始化为False,数字对应ID,就完成了。

添加删除就是改bool值,没啥难的

单向好友就检查(i,j),(j,i)是否一致就完事了

共同好友的话,可以把二维bool数组变成二维的结构体数组
或者直接用两个数组判断就ok了。当然,这里建议新开一个程序写个函数单独测试。毕竟难度还是有的。

好友管理完事了,群管理咋整?

建一个类?NONONO,我推荐二维数组。为什么还是二维数组?怎么存?

第i行第j列,代表ID为j的人在群ID为i的群中。

这里是群ID,不是群名称。这个ID如果你想有前缀什么的,比如551709XX之类的,就把XX那里作为数组行数,如55170913(我),如果我在1001群里,那么就把13,1这一点改成true就ok了

那挨T的操作怎么办呢?我的建议是用返回值为T人者和被T者的二元组(结构体)的函数来解决。难度不大,挨T就是删除嘛。

查询,就是遍历一遍,谁在群里一目了然。

加入退出就是添加删除。想存储时间,就单独存一个事务表。这个事务表为什么存在?我们想要把每个人的加入删除存给每一个人自己的话,势必会有空间受限的问题。C++并不能动态分配内存,所以固定长度和无限的事务一定会发生冲突。解决方法1,用一个总体的事务表来表示。存储如(1001群3号退出,2019年8月28日12点)这样完整的一条消息,所有人的消息都按时间顺序存在一个表里面。这样的话查询操作就会变得特别简单。解决方法2,不管。

对,不管。

你自己定的数据,自己不超标就完事了呗。一个人给他留10个存事件的数组,就完事了。最好的办法是用循环队列的方式来存,有兴趣的,我下几篇博客可能会写,可以关注下。

申请加入?事务表

推荐加入?事务表

临时讨论组?约等于新群,

群主?每个人的类下面记录一下有特权的群,特权是什么等级就ok了。

特权等级?用一维数组存,a[i]=x,代表在ID为I的群里,你的特权为x。x=1平民,x=2管理员,x=3创建者就完事了。

群类型转变就是一个int标识的问题。注意在修改的过程中,如果是微信变QQ还好,但QQ变微信就得去掉所有管理员。

那么展示功能的时候有什么技巧?

注意用循环的嵌套来进行菜单的跳出。switch—case语句也比较合理。跳出用break也好,用flag+while循环也好,用着舒服就行。个人推荐flag+while循环,逻辑清楚不易出错。

关于事务表的写法,我个人喜欢用结构体去存,事务类型,事务相关人物A,相关人物B,事务时间。这个也有人直接用一个01数列去存,然后换算成对应的int,也算是一个比较装逼 的办法

剩下是一些悄悄话

多个功能的展示,要事先想好顺序和测试数据,尽量别让老师插手。展示的过程也要想好,是展示你的矩阵,你的结果都没问题,千万不要就显示一个“修改成功”,这个超傻。直接输出修改后的结果可以大量的避免麻烦,减少debug时间和BUG数量。

写程序,别傻乎乎的在一个程序里测试。分开板块,分别测试,通过了再放到一起!!!

多个人写程序,最忌讳的就是你负责输入,我负责处理,他负责输出。因为这些都有严格的先后顺序,非常耽误时间。你周一有事,于是周二写完给我了,但我周二有事,周三给他,他又没时间,拖到周五。效率低下,容易引起矛盾。

比较好的办法是,在一起实验课的时候,先决定好main函数中的变量,避免在自己的函数中发生冲突。剩下的分成所谓好友功能,群功能,展示功能这样平行的分块,各司其职,容易管理,效率卓越。

C++是后面学习不可或缺的一部分,多联系代码肯定有益无害。有不会的题和概念请私信,评论几乎不看。thx,See U.

吉林大学大三学生 东北师范大学附属中学OJ jinxi20111 2019.08.28

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值