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

本文详细解析了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

本文章已经生成可运行项目
2018年软件学院C++计目的: 1、熟悉利用面向对象的方法以及C++的编程思想来完成系统计; 2、锻炼学生在计的过程中,建立清晰的类层次,应用继承和多态等面向对象的编程思想; 3、通过本计,加深对面向对象程序程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,深刻体会面向对象的编程思想,掌握使用面向对象程序计语言C++,学会编写结构清晰、风格良好的C++语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。 计题目:模拟即时通信系统实现 一、题目描述 基于社交的即时通信是腾*公司的主要业务,先后有QQ、微信、微博等服务,可能还将继续推出微商、微唱、微走、微笑等产品。这些软件既可以独立提供服务,又互相辉映关联。腾*公司希望对各系统进行整合形成统一的立体社交软件平台。现请完成该平台的计并实现。要求如下: 1、用户基本信息: 号码ID,昵称,出生时间,T龄(号码申请时间)、所在地、好友列表、群列表。 微博与QQ共享ID,微信采用独立ID,但是可以与QQ号码绑定对应。其他微X产品也分为这两种情况。 2、好友管理 (1)实现各功能好友信息的添加、修改、删除、查询的功能。 (2)可以查询微X之间各自共同好友。如微信可以添加QQ推荐好友。 3、群管理 (1)定每个微X功能已有1001、1002、1003、1004、1005、1006等群号。 (2)加入群、退出群、挨T、查询群成员等。 (3)不同微X之间群的理念不同,比如:QQ群可以申请加入,而微信群则只能推荐加入;QQ群允许置临时讨论组(子群),微信群则不允许;QQ群有以群主为核心的管理员制度,而微信群仅有群主为特权账号。 4、开通管理 用户可以选择自己开通该平台的N个微X服务。 5、登录管理 各微X之间只要有一个服务登录,则其它服务简单确认后视为自动登录。 6、功能展示要求(main函数) (1)计约定。开通服务情况、群成员信息和好友信息可以预先保存到文件中,在系统启动时将这些信息加载到内存中; (2)一个服务登录后,本人开通的其它所有服务均进入开通状态。 (3)服务之间可以依据本人开通的任意另外一个服务的好友添加好友。 (4)展示一个服务当前群的特色功能;在群成员数据不受伤害的前提下,动态变换为其他类型群的管理特色。 (5)实现QQ的点对点的TCP通信的收发功能。(选做)提示: a)需要加载ws2_32.lib静态库,打开头文件winsock.h。 b)百度IP地址、端口等概念; c)百度socket编程,关注bind、listen、accept、connect、send、receive等函数用法。 二、技术层次要求及说明 1、基本层次。 完成上述功能要求,所采用技术不限,比如采用纯面向过程思想实现; 2、支持对象层次。 正确完成了类的切割,利用对象技术实现。 (1)容器类主要包括:例如,微X成员管理。 (2)其它主要类包括:例如,微X信息、群信息、好友信息。 3、抽象、封装层次 采用了继承或者组合实现复用,对数据成员提供了必要的接口保护; (1)抽象出了基础类,并被其它功能复用; (2)如好友维护、群信息维护等操作均应该提供接口形式; 4、面向对象层次 支持多态功能,支持依据计原则的优化。 好友管理、群管理等; 5、优化提高层次 (1)提供简便菜单,以1、2等数字区分几类功能,并允许返回菜单; (2)I/O操作支持。基本功能中,已有定信息,在初始化时候可以固化在程序代码中,也可以存放在文件中,每次容器实例化时读入,析构时写回文件中,以实现断电保存。 (3)可扩展性支持,需要考虑群、好友等与主要服务之间的关系; (4)灵活性支持。群的管理模式动态可变; (5)程序有必要的注释; (6)可以采用UML工具画出简单类图 (7)为防止不诚信行为,要求类的计均以独立文件存在,且所有的类名称后面应有自己的姓名缩写,如张三计的QQ信息类名称:TencentZhS。 三、计步骤(参考 ): 在清楚上述系统功能要处理是什么的基础上,考虑用如下方式来计 1、确定所需的类及其相互间的关系。 (1)要从问题中归纳出一个概念或实体,从这些概念或实体出发建立相应的类。 (2)尽量使类小而简单,以使其看起来容易理解。 (3)充分利用封装以增加类的可靠性,以便使用时保证更加可靠。 (4)通过继承建立类族,以方便使用多态性。 2、确定每个类的实现。 (1)考虑类的对象应该如何构造和析构。 (2)考虑类的成员函数的建立。 (3)综合考虑各个类在命名和功能方面有哪些共性。 3、细化有关的类,描述他们之间的相互关系,即类关系和对象关系。 4、描述本系统的界面,通过分别定义成员的不同属性,为抽象和实现提供分离的接口。 四、计工具 1、计工具:建议使用.net 系列中的C++ 编译器,但不局限于此。 2、不提倡使用MFC和可视化开发技术。 五、计报告 (报告的具体格式附后) 六、考核方式 1、在计结束前的最后一天检查程序并接受质疑。 2、检查程序前须提交计报告(按提交报告的先后顺序检查程序)。 七、考核标准: 参照5个技术层次划分。 八、计后作业(不考核) 引入可视化计,在本计基础上实现可视化QQ即时通信功能,包括: 多人聊天;聊天记录查询。需要涉及知识如下: 1、网络通信编程; 2、可视化编程; 3、多线程编程; 4、数据库编程;
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值