手机通讯录管理系统

本文介绍了一个基于C语言的手机通讯录管理系统,使用链表数据结构实现联系人信息的增删查排等功能。系统支持模糊查找,文件操作,并解决了在实现过程中遇到的如删除、排序等问题。此外,还增加了统计不同姓氏联系人数的功能。
摘要由CSDN通过智能技术生成

大作业题目

手机通讯录管理系统

类型

信息管理系统

班  号

 

学  号

所在院系

计算机与电子通信

学  期

2021 季学期

任课教师

实验类型

综合设计型

实验目的:

  1. 掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句、算法和数据结构,以及自顶向下、逐步求精的模块化设计方法,能够设计具有一定规模的系统级C语言程序,提高系统编程能力;
  2. 针对计算相关的复杂工程问题,能够使用恰当的算法和数据结构,完成计算、统计、排序、检索、匹配等相关的软件系统的构造、测试与实现;
  3. 掌握常用的程序调试和测试方法。

实验要求:

  1. 采用自顶向下、逐步求精的模块化设计思想设计一个小型信息库管理系统,或者闯关式游戏程序。
  2. 要求解释说明采用了什么数据结构和算法,为什么选择这种数据结构或算法,系统实现过程中遇到了哪些问题,这些问题是如何解决的,还有什么问题尚未解决,今后打算从哪几个方面进行改进,本设计的亮点和难点在哪里,实验结果如何,有哪些收获和学习体会
  3. 编写程序完成以下实验大作业内容并完成实验大作业反思报告。

实验内容:

手机通讯录V3.0为例。

设计一个手机通讯录管理系统,包括联系人数据的增删查等基本操作,要求编程实现如下菜单驱动的手机通讯录管理系统:

(1)录入每个联系人的姓名电话号和姓氏首字母

(2)对联系人根据姓氏字典序排序;

(3)分别根据姓名或者电话号删除联系人

(4)分别根据姓名或者电话号查找联系人

(5)在末端插入新的联系人

(6)将联系人数据读入文件中并有读出操作

(7)统计不同姓氏首字母联系人的人数

(8)展示所有联系人的信息

(9)退出通讯录管理系统

要求程序运行后先显示如下菜单,并提示用户输入选项:

然后,根据用户输入的选项执行相应的操作。

如果你想进行下述操作,请输出操作前的序号!

1.直接新建联系人。                        

2.删除已有联系人(电话)。                 

3.删除已有联系人(姓名)。                

4.对已有联系人按姓名排序。                

5.插入新的联系人。                       

6.通过姓名查找已有联系人。(支持模糊查找)

7.通过手机号查找已有联系人。              

8.显示所有已有联系人。                    

9.将联系人信息写入文本中。                

10.从文本中读取联系人信息。               

11.统计不同姓氏联系人的数量。             

12.退出通讯录管理系统。   

请输入你的选择:

实验环境:

操作系统:Win10

集成开发环境:Codeblocks20.03

外部库:用到了外部音乐库,配置方法:codeblocks->settings->compiler->global compiler settings->linker settings->other linker options下添加-lwinmm。即可使用

lian 即为所有代码及数据所在的文件夹。

输入输出设计:

*输入要求提示:该程序在电脑上经过多次测试可以正常运行,请互评的同学仔细看一下画的流程图(谢谢),如果在互评同学运行时出现突然终止的情况,请不要惊慌,因为该程序在输入过程中比较冗杂,输入数据过程易出错,可以重新输入数据(数量和内容均可改变),再次测试。(恳请互评同学仔细阅读该条

程序输入输出数据有联系人姓名,电话号和姓氏首字母。还有文件名(可以自己新创,也可以利用已经存好的文件)。

其中姓名需要汉字输入(尽量在三个字以内),电话号最长不超过15位,姓氏首字母需要英文输入且大小写随意。

姓名与电话号都是字符数组类型,这样存储比较安全,不会因为数字过长而出错,而姓氏首字母采用了字符类型,这样在之后汇总比较中可以方便不少。

加入了对非法数据输入,文件打开失败,动态内存分配不成功等异常情况的处理。函数入口处检查了用户输入数据的有效性。

输出格式为不同联系人分行输出,这样便于使用者对比和查找。

为了用户输入信息时更方便,在每次输入不同信息的时候都会在输入前面告知需要输入的信息是什么。

系统功能实现

1.系统功能模块划分

系统进行自顶向下的模块分解,画出系统各个功能模块之间的结构图如下:

2.函数功能和外部接口设计

本系统总计设计了22个函数,每个函数的功能和接口设计如下表所示:

序号

函数名

函数功能

函数参数

函数返回值

1

AppendNode

添加联系人

struct link *head

struct link *head

2

DisplyNode

展示联系人

struct link *head

NULL

3

DeleteMemory

清理内存

struct link *head

NULL

4

DeleteNode1

删除联系人(电话)

struct link *head,char a[]

struct link *head

5

DeleteNode2

删除联系人(姓名)

struct link *head,char a[]

struct link *head

6

InsertNode

插入联系人

struct link *head,char a[],char b[],char c

struct link *head

7

SortNode

对联系人根据姓氏的字典序排序

struct link *head

NULL

5

SearchNode1

根据联系人姓名查找联系人(支持模糊查找)

struct link *head,char a[],int n

NULL

8

SearchNode2

根据联系人电话号查找联系人

struct link *head,char a[],int n

NULL

9

addlianxiren

转向添加联系人

struct link *head

struct link *head

10

deletealianxiren1

转向删除联系人(电话)

struct link *head,int *n

struct link *head

11

deletealianxiren2

转向删除联系人(姓名)

struct link *head,int *n

struct link *head

12

charulianxiren

转向插入联系人

struct link *head,int *n

struct link *head

13

menu

展示菜单

void

做出的选择

14

search1

转向根据联系人姓名查找联系人(支持模糊查找)

struct link *head,int n

NULL

15

search2

转向根据联系人电话号查找联系人

struct link *head,int n

NULL

16

getachar

清除缓存区并输入选择

void

输入的选择

17

Creatfile1

创建文件并转向将数据读入文件的函数

struct link *head,int n

NULL

18

Creatfile2

转向读取文件中数据的函数

struct link *head,int n

NULL

19

save

将数据读入文件

show(struct link *head,char *filename,int n);

int numbe

NULL

20

show

读取文件中数据

show(struct link *head,char *filename,int n);

int numbe

NULL

21

number

计算链表中的联系人个数

struct link *head

链表中联系人个数

22

huizong

统计不同姓氏联系人的数目

struct link *head,int n

NULL

各个函数之间的调用关系如下所示:

  1. 数据结构

栈或队列的链式存储结构、链表等动态数据结构

2.算法

分类统计算法

排序/查找算法

文件操作

模糊查询算法

3.程序流程图

系统总体流程图如下:

实验过程中遇到的问题及解决方法与思路:

问题1: 在加入背景音乐的时候加入-mwindows和-lwinmm后不能同时运行原本可以运行的代码。

原因:在加入外部库的时候加入了-mwindows。

解决方法:在查阅资料之后了解到加入-mwindows会默认不打开窗口运行程序,然后去掉了-mwindows。

问题2: 在链表实施删除操作时候总是无法删除最后一个数据。

原因:当时的函数编写的时候在浏览到最后一个数据时候就会退出无法完成删除。

解决方法:将链表内的第一个数据和最后一个数据单独摘出来,若待删除数据与之符合则实施单独的删除操作。

问题3:查找联系人寻求模糊查找的时候无法对汉字的联系人进行操作。

原因:strcmp函数在对汉字进行比较的时候无法正常分辨是否两个姓名完全一致。

解决方法:改用strstr函数,在找到改名字的时候返回该名字所在位置的指针。

问题4:使用strstr函数时候无法正确查找是否待查找数据已经出现。

原因:strstr函数返回值为指针,但我当时设置的flag为int类型无法正确比较。

解决方法:将flag的类型改为指针,当flag!=NULL时候进行下一步操作。

问题5:在书写统计联系人函数时候无法正确统计不同姓氏联系人的个数。

原因:新设置的结构体数组中的数据未初始化出现了乱码。

解决方法:在进行汇总数据之前,将结构体数组内容初始化。

测试用例和系统测试结果:

测试用例1:

本次测试说明该程序的第一项功能完好,录入联系人功能正常,

第八项功能,展示当前全部联系人信息也正常。而且之后的测试数据大多为该次测试的数据。

测试用例2

该次测试用例说明,该程序的第九项,第十项关于文件操作的功能正常可以使用。

测试用例3

该次测试说明该程序的第五项内容正常可以使用。

测试用例4

该次测试说明该程序的第六项,第七项功能正常,

且程序支持模糊查找,并且对输入有检查报错。

测试用例5

该次测试说明该程序的第二项,第三项功能正常,可以使用。

测试用例5

该次测试说明,该程序的第十一项功能正常,可以准确统计不同姓氏首字母的人数。

测试用例6

该次测试说明该程序的第四项功能对已有联系人排序正常可以使用。

程序的全部源代码:

1 #include<stdio.h>

2 #include<stdlib.h>

3 #include<string.h>

4 #include<windows.h>

5 #include<mmsystem.h>

6 typedef struct lianxiren  //结构体1

7 {

8     char name[80];

9     char teleno[15];

10     char xing;

11 }

12 LX;

13 struct link      //链表

14 {

15     LX data;

16     struct link *next;   

17 };

18 typedef struct ren      //结构体2

19 {

20     char xing;

21     int renshu;

22 }RENSHU;

23 struct link *AppendNode(struct link *head);

24 void DisplyNode(struct link *head);

25 void DeleteMemory(struct link *head);

26 struct link *DeleteNode1(struct link *head,char a[]);

27 struct link *DeleteNode2(struct link *head,char a[]);

28 struct link *InsertNode(struct link *head,char a[],char b[],char c);

29 void SortNode(struct link *head);

30 void SearchNode1(struct link *head,char a[],int n);

31 void SearchNode2(struct link *head,char a[],int n);

32 struct link *addlianxiren(struct link *head);

33 struct link *deletealianxiren1(struct link *head,int *n);

34 struct link *deletealianxiren2(struct link *head,int *n);

35 struct link *charulianxiren(struct link *head,int *n);

36 int menu(void);

37 void search1(struct link *head,int n);

38 void search2(struct link *head,int n);

39 char getachar(void);

40 void creatfile1(struct link *head,int n);

41 void creatfile2(struct link *head,int n);

42 void save(struct link *head,char *filename,int n);

43 void show(struct link *head,char *filename,int n);

44 int number(struct link *head);

45 void huizong(struct link *head,int n);

46 int main()

47 {

48     mciSendString("open aaa.mp3 alias mysong",NULL,0,NULL);//播放音乐

49     mciSendString("play MySong",NULL,0,NULL);

50     int ch,n;

51     struct link *head = NULL;

52     while(1)

53     {

54         ch = menu();

55         switch(ch)

56         {

57         case 1:

58             head = addlianxiren(head);

59             n = number(head);

60             break;

61         case 2:

62             head = deletealianxiren1(head,&n);

63             break;

64         case 3:

65             head = deletealianxiren2(head,&n);

66             break;

67         case 4:

68             SortNode(head);

69             break;

70         case 5:

71             head = charulianxiren(head,&n);

72             break;

73         case 6:

74             search1(head,n);

75             break;

76         case 7:

77             search2(head,n);

78             break;

79         case 8:

80             DisplyNode(head);

81             break;

82         case 9:

83             creatfile1(head,n);

84             break;

85         case 10:

86             creatfile2(head,n);

87             break;

88         case 11:

89             huizong(head,n);

90             break;

91         case 12:

92             printf("程序结束!");

93             exit(0);

94         }

95     }

96     DeleteMemory(head);

97     mciSendString("close MySong",NULL,0,NULL); //停止播放

98     return 0;

99 }

100 int menu(void)                            //显示菜单

101 {

102     system("cls") ;   //清屏

103     int yourchoice;

104     system("color E1");

105     printf("______________________________________________\n");

106     printf("||如果你想进行下述操作,请输出操作前的序号!||\n");

107     printf("||1.直接新建联系人。                        ||\n");

108     printf("||2.删除已有联系人(电话)。                  ||\n");

109     printf("||3.删除已有联系人(姓名)。                 ||\n");

110     printf("||4.对已有联系人按姓名排序。                ||\n");

111     printf("||5.插入新的联系人。                        ||\n");

112     printf("||6.通过姓名查找已有联系人。(支持模糊查找)||\n");

113     printf("||7.通过手机号查找已有联系人。              ||\n");

114     printf("||8.显示所有已有联系人。                    ||\n");

115     printf("||9.将联系人信息写入文本中。                ||\n");

116     printf("||10.从文本中读取联系人信息。               ||\n");

117     printf("||11.统计不同姓氏联系人的数量。             ||\n");

118     printf("||12.退出通讯录管理系统。                   ||\n");

119     printf("||请输入你的选择:                          ||\n");

120     printf("----------------------------------------------\n");

121     scanf("%d",&yourchoice);

122     while(yourchoice>12||yourchoice<1)  //检验输入

123     {

124         printf("输入有误!\n");

125         printf("请输入你的选择:\n");

126         getchar();

127         scanf("%d",&yourchoice);

128     }

129     return yourchoice;

130 }

131

132 struct link *addlianxiren(struct link *head)                        //跳转到添加联系人函数

133 {

134     char c;

135     printf("你想加入一个联系人吗?(Y/N)");

136     c = getachar();

137     if(c=='n'||c=='N')

138     {

139         return head;

140     }

141     while(c == 'Y'||c == 'y')

142     {

143         head = AppendNode(head);

144         printf("你想加入一个联系人吗?(Y/N)");

145         c = getachar();

146         if(c=='n'||c=='N')

147         {

148             return head;

149         }

150     }

151     DisplyNode(head);

152     return head;

153 }

154

155 struct link *deletealianxiren1(struct link *head,int *n)             //跳转到删除联系人1

156 {

157     char c;

158     printf("你想删除一个联系人吗?(Y/N)");

159     c = getachar();

160     if(c=='n'||c=='N')

161     {

162         return head;

163     }

164     while(c == 'Y'||c == 'y')

165     {

166         char a[80];

167         printf("请输入想要删除的联系人的电话:");

168         scanf("%s",a);

169         head = DeleteNode1(head,a);

170         *n = *n + 1;

171         printf("你想删除一个联系人吗?(Y/N)");

172         c = getachar();

173         if(c=='n'||c=='N')

174         {

175             return head;

176         }

177     }

178     return head;

179 }

180

181 struct link *deletealianxiren2(struct link *head,int *n)                //跳转到删除联系人2

182 {

183     char c;

184     printf("你想删除一个联系人吗?(Y/N)");

185     c = getachar();

186     if(c=='n'||c=='N')

187     {

188         return head;

189     }

190     while(c == 'Y'||c == 'y')

191     {

192         char a[80];

193         printf("请输入想要删除的联系人的姓名:");

194         scanf("%s",a);

195         head = DeleteNode2(head,a);

196         *n = *n + 1;

197         printf("你想删除一个联系人吗?(Y/N)");

198         c = getachar();

199         if(c=='n'||c=='N')

200         {

201             return head;

202         }

203     }

204     return head;

205 }

206

207 struct link *charulianxiren(struct link *head,int *n)

208 {

209     char c;

210     printf("Do you want to charu a lianxiren?(Y/N)");

211     c = getachar();

212     if(c=='n'||c=='N')

213     {

214         return head;

215     }

216     while(c == 'Y'||c == 'y')

217     {

218         char a[80],b[80],c;

219         printf("请输入想要插入的联系人的姓名和电话:\n");

220         printf("姓名:\n");

221         scanf("%s",a);

222         printf("电话:\n");

223         scanf("%s",b);

224         printf("姓氏:\n");

225         scanf(" %c",&c);

226         head = InsertNode(head,a,b,c);

227         *n = *n + 1;

228         printf("Do you want to charu a lianxiren?(Y/N)");

229         c = getachar();

230         if(c=='n'||c=='N')

231         {

232             return head;

233         }

234     }

235     return head;

236 }

237

238

239 void search1(struct link *head,int n)               //跳转到查找联系人1

240 {

241     char c;

242     char a[80];

243     printf("你想查找一个联系人吗?(Y/N)");

244     c = getachar();

245     if(c=='n'||c=='N')

246     {

247         return ;

248     }

249     while(c == 'Y'||c == 'y')

250     {

251         printf("输入查找联系人的姓名:");

252         scanf("%s",a);

253         SearchNode1(head,a,n);

254         printf("你想查找一个联系人吗?(Y/N)");

255         c = getachar();

256         if(c=='n'||c=='N')

257         {

258             return ;

259         }

260     }

261 }

262

263 void search2(struct link *head,int n)             //跳转到查找联系人2

264 {

265     char c;

266     char a[80];

267     printf("你想查找一个联系人吗?(Y/N)");

268     c = getachar();

269     if(c=='n'||c=='N')

270     {

271         return ;

272     }

273     while(c == 'Y'||c == 'y')

274     {

275         printf("输入查找联系人的电话号:");

276         scanf("%s",a);

277         SearchNode2(head,a,n);

278         printf("你想查找一个联系人吗?(Y/N)");

279         c = getachar();

280         if(c=='n'||c=='N')

281         {

282             return ;

283         }

284     }

285 }

286

287 void creatfile1(struct link *head,int n)             //跳转到将数据读入文件

288 {

289     char filename[50];

290     printf("请输入文件名称:");

291     scanf("%s", filename); //输入文件所在路径及名称

292     save(head,filename,n);

293     return ;

294 }

295

296 void creatfile2(struct link *head,int n)              //跳转到从文件中读取数据

297 {

298     char filename[50];

299     printf("请输入文件名称:");

300     scanf("%s", filename); //输入文件所在路径及名称

301     show(head,filename,n);

302     return ;

303 }

304

305 struct link *AppendNode(struct link *head)                   //添加联系人

306 {

307     struct link *p = NULL,*pr = head;

308     LX data;

309     p = (struct link*)malloc(sizeof(struct link));

310     if(p == NULL)

311     {

312         printf("内存不足!\n");

313         exit(0);

314     }

315     if(head == NULL)

316     {

317         head = p;

318     }

319     else

320     {

321         while(pr->next != NULL)

322         {

323             pr = pr->next;

324         }

325         pr->next = p;

326     }

327     printf("请输入联系人的姓名,电话和姓氏首字母:\n");

328     printf("姓名:\n");

329     scanf("%s",data.name);

330     printf("电话:\n");

331     scanf("%s",data.teleno);

332     printf("姓氏:\n");

333     scanf(" %c",&data.xing);

334     strcpy(p->data.name,data.name);

335     strcpy(p->data.teleno,data.teleno);

336     p->data.xing = data.xing;

337     p->next = NULL;

338     return head;

339 }

340

341

342 struct link *DeleteNode1(struct link *head,char a[])        //删除联系人

343 {

344     if(head == NULL)

345     {

346         printf("链表为空");

347         return NULL;

348     }

349     struct link * p, * q;

350     p = head;

351     q = p->next;

352     if(head != NULL && strcmp(head->data.teleno,a)==0)

353     {

354         q = head;

355         head = q->next;

356         free(q);

357         return head;

358     }

359     while(q != NULL)

360     {

361         if(q->next==NULL)

362             break;

363         if(strcmp(q->data.teleno,a)==0)

364         {

365             p->next = q->next;

366             q->next = NULL;

367             free(q);

368             return head;

369         }

370         else

371         {

372             p = p->next;

373             q = q->next;

374         }

375     }

376     if(strcmp(q->data.teleno,a)==0)

377     {

378         p->next = NULL;

379     }

380     return head;

381 }

382

383 struct link *DeleteNode2(struct link *head,char a[])      //删除联系人

384 {

385     if(head == NULL)

386     {

387         printf("链表为空");

388         return NULL;

389     }

390     struct link * p, * q;

391     p = head;

392     q = p->next;

393     if(head != NULL && strstr(head->data.name,a)!=NULL)

394     {

395         q = head;

396         head = q->next;

397         free(q);

398         return head;

399     }

400     while(q != NULL)

401     {

402         if(q->next==NULL)

403             break;

404         if(strstr(q->data.name,a)!=NULL)

405         {

406             p->next = q->next;

407             q->next = NULL;

408             free(q);

409             return head;

410         }

411         else

412         {

413             p = p->next;

414             q = q->next;

415         }

416     }

417     if(strstr(q->data.name,a)!=NULL)

418     {

419         p->next = NULL;

420     }

421     return head;

422 }

423

424 void DisplyNode(struct link *head)                            //展示现有所有联系人

425 {

426     struct link *p = head;

427     int j = 1,n;

428     while(p != NULL)

429     {

430         printf("%5d%10s%15s%5c\n",j,p->data.name,p->data.teleno,p->data.xing);

431         p = p->next;

432         j++;

433     }

434     printf("输入任何一个数字结束查看。\n");

435     scanf("%d",&n);

436 }

437

438 void DeleteMemory(struct link *head)                          //清理内存

439 {

440     struct link *p = head,*pr = NULL;

441     while(p!=NULL)

442     {

443         pr = p;

444         p = p->next;

445         free(pr);

446     }

447 }

448

449 void SortNode(struct link *head)                    //对数据进行排序

450 {

451     int i=1,n,j,k;

452     struct link *p = head,*pr = head;

453     while(p->next!=NULL)

454     {

455         p = p->next;

456         i++;

457     }

458     n = i;

459     for(j=1; j<n; j++)

460     {

461         pr = head;

462         p = pr->next;

463         for(k=0; k<n-j; k++)

464         {

465             //if(pr->data>p->data)

466             if(strcmp(pr->data.name,p->data.name)>0)

467             {

468                 struct link *temp;

469                 temp = (struct link *)malloc(sizeof(struct link));

470                 if(temp == NULL)

471                 {

472                     printf("内存不足!\n");

473                     exit(0);

474                 }

475                 *temp = *pr;

476                 temp->next = p->next;

477                 *pr = *p;

478                 pr->next = p;

479                 *p = *temp;

480                 free(temp);

481             }

482             p = p->next;

483             pr = pr->next;

484         }

485     }

486 }

487

488 void SearchNode1(struct link *head,char a[],int n)                     //通过姓名查找联系人

489 {

490     struct link *pr = head,*p = head;

491     if(p == NULL)

492     {

493         printf("内存不足!\n");

494         exit(0);

495     }

496     int i=0;

497     while(i<=n)

498     {

499         char *flag;

500         flag = strstr(pr->data.name,a);

501         if(flag!=NULL)

502         {

503             printf("%d 这是你要找的联系人吗?\n",i+1);

504             printf("%10s%15s%5c\n",pr->data.name,pr->data.teleno,p->data.xing);

505         }

506         flag = NULL;

507         pr = pr->next;

508         i++;

509     }

510

511 }

512

513 void SearchNode2(struct link *head,char a[],int n)                     //通过手机号查找联系人

514 {

515     struct link *pr = head,*p = head;

516     if(p == NULL)

517     {

518         printf("内存不足!\n");

519         exit(0);

520     }

521     int flag,i=0,j=0;

522     while(i<=n)

523     {

524         j++;

525         flag = strcmp(pr->data.teleno,a);

526         if(flag==0)

527         {

528             printf("%d 这是你要找的联系人吗?\n",j);

529             printf("%10s%15s%5c\n",pr->data.name,pr->data.teleno,pr->data.xing);

530         }

531         pr = pr->next;

532         i++;

533     }

534

535 }

536

537 struct link *InsertNode(struct link *head,char a[],char b[],char c)                     //插入联系人

538 {

539     struct link *pr = head,*p = head;

540     p = (struct link *)malloc(sizeof(struct link));

541     if(p == NULL)

542     {

543         printf("内存不足!\n");

544         exit(0);

545     }

546     p->next = NULL;

547     strcpy(p->data.name,a);

548     strcpy(p->data.teleno,b);

549     p->data.xing = c;

550     if(head == NULL)

551     {

552         head = p;

553     }

554     else

555     {

556         while(pr->next!=NULL)

557         {

558             pr = pr->next;

559         }

560         pr->next = p;

561     }

562     return head;

563 }

564

565 char getachar(void)                               //清除缓存区内容

566 {

567     char ch1;

568     while(getchar()!='\n')

569     {

570         ;

571     }

572     scanf(" %c",&ch1);

573     while(ch1!='N'&&ch1!='n'&&ch1!='Y'&&ch1!='y')

574     {

575         printf("输入错误,请重新输入!\n");

576         while(getchar()!='\n')

577     {

578         ;

579     }

580     scanf(" %c",&ch1);

581     }

582     return ch1;

583 }

584 void save(struct link *head,char *filename,int n)//存到文件内

585 {

586     FILE *w;//文件指针

587     if ((w = fopen(filename, "wb")) == NULL){   //二进制只写打开文件

588         printf("文件打开失败!\n");

589         exit(1);

590     }

591     struct link *p = head;

592     if(head == NULL)

593     {

594         printf("链表为空!\n");

595         return;

596     }

597     for (int i = 0; i <= n; i++)  //链表数据循环输入到文件里

598     {

599          fprintf(w,"%s ",p->data.name);//数据存入到文件

600          fprintf(w,"%s", p->data.teleno);

601          fprintf(w,"%c", p->data.xing);

602          fprintf(w,"%s","\r\n");//换行

603          p=p->next;//指向下一个节点

604     }

605     fclose(w); //关闭文件

606 }

607 void show(struct link *head,char *filename,int n)//输出文件

608 {

609     int x;

610     FILE *fp;//文件指针

611     LX info[100];  //负责存放文件中的数据,然后输出

612     if ((fp = fopen(filename, "rb")) == NULL){   //二进制只读打开文件

613         printf("文件打开失败!\n");

614         exit(1);

615     }

616     for (int i = 0; i <= n; i++)

617     {

618         fscanf(fp,"%s",(info[i].name));//输出数据到数组

619         fscanf(fp,"%s",(info[i].teleno));

620         fscanf(fp,"%c",&(info[i].xing));

621         printf("%10s%15s%5c\n", info[i].name,info[i].teleno,info[i].xing);//输出数据到屏幕

622     }

623     printf("输入任何一个数字结束展示。\n");

624     scanf("%d",&x);

625     fclose(fp);//关闭文件

626 }

627 int number(struct link *head)                                         //统计链表中数据个数

628 {

629     struct link *p = head;

630     int flag=0;

631     if(head == NULL)

632     {

633         printf("链表为空!\n");

634         return 0;

635     }

636     while(p->next!=NULL)

637     {

638         p = p->next;

639         flag++;

640     }

641     free(p);

642     return flag;

643 }

644 void huizong(struct link *head,int n)                                //统计不同姓氏联系人数目

645 {

646     struct link *p = head;

647     char a[n];

648     RENSHU b[n];

649     int i=0,j=0,k=0,flag;

650     if(p == NULL)

651     {

652         printf("内存不足!\n");

653         exit(0);

654     }

655     for(j=0;j<=n;j++)

656     {

657         b[j].renshu=0;

658     }

659     for(j=0;j<=n;j++)

660     {

661         b[j].xing='0';

662     }

663     while(i<=n)

664     {

665         a[i] = p->data.xing;

666         p = p->next;

667         i++;

668     }

669     for(i=0;i<=n;i++)

670     {

671         flag = 0;

672         for(j=0;j<=n;j++)

673         {

674             if(b[j].xing==a[i])

675             {

676                 b[j].renshu++;

677                 flag = 1;

678             }

679         }

680         if(flag==0)

681         {

682             b[k].xing = a[i];

683             b[k].renshu++;

684             k++;

685         }

686     }

687     i=0;

688     while(b[i].renshu!=0)

689     {

690         printf("%5c%5d\n",b[i].xing,b[i].renshu);

691         i++;

692     }

693     printf("输入任何一个数字结束查看。\n");

694     scanf("%d",&n);

695 }

分析总结、收获和体会:

优点:

1,对输入的检验严格,出错概率降低;

  1. 函数封装性好,重复利用率高;

3,采用了链表的动态数据存储结构。

创新之处

1,加入了背景音乐;

2,增加了对姓氏首字母不同的联系人进行统计的功能;

  1. 支持通过联系人姓名中的一部分进行模糊查找;
  2. 改变了运行窗口的颜色。

不足之处:

1,有些算法过于复杂繁冗,不够精炼;

  1. 没有设计出对不同姓氏的联系人进行统计的功能;
  2. 没有加入修改联系人信息的功能(因为这个可以通过删除,插入再排序实现);
  3. 插入联系人只能插入在末端(刚开始设计的是插入到排好顺序的联系人之间,但考虑到有时候不排序也需要插入,就修改为直接插入到末端)。

需要改进的地方:

1,精简算法的复杂性;

2,对变量的起名可以在详细一些;

收获与学习体会:

1,加深了对链表的认知;

  1. 学会了流程图的画法;
  2. 学会了添加背景音乐;
  3. 在编写大作业的同时一定程度提高了自己的编程水平。

自我评价

程序运行是否无bug

是否在撰写报告之前观看了MOOC里的华为编程实践和代码规范相关的视频

程序代码是否符合华为代码规范(对齐与缩进,变量名和函数名命名,必要的注释)?

是否按模块化要求进行了程序设计,系统功能是否完善

是否是独立完成

自我评语

  

报告完成日期:2021.12.23

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
学校实验周的编程题目之一,大神都是自己编自然看不上,所以就给有需要的人看看。 下面是题目要求: 系统模拟手机通信录管理系统,实现对手机中的通信录进行管理。提供以下几个基本功能: (1)查看功能:选择此功能时,列出下列三类选择。 A:办公类 B:个人类 C:商务类 (2)当选中某类时,显示出此类所有数据中的姓名、电话号码、单键拨号号码。 (3)添加数据功能:能录入新数据,每个结点包括:姓名、电话号码、分类(可能选项有:A为办公类 B为个人类 C为商务类)、电子邮件、单键拨号号码。例如: 杨春 13589664454 商务类 chuny@126.com 0 姓名和电话号码不能同时相同,如果发生这种情况,需要提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号;单键拨号号码可以为空,但是不能设置为相同的数字。 (4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改。 (5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。 (6)拔号功能:当选中某个姓名时,屏幕上模拟打字机的效果依次显示出此人的电话号码中的各个数字;当输入单键拨号号码时,屏幕上显示被叫用户的姓名及完整电话号码
该设计要求学生以通讯录管理业务为背景,设计、开发一套“通讯录管理系统”软件。 通过该题目的设计,培养学生面向对象程序设计的思想,要求学生达到熟练掌握C++(或Java)语言的基本知识和技能,基本掌握面向对象程序设计的基本思路和方法,能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。同时强调好的程序设计风格,提高解决实际问题的能力。 二. 主要任务 1、查阅文献资料,一般在5篇以上; 2、应用系统分析,建立该系统的功能模块框图以及界面的组织和设计; 3、分析系统中的各个实体及它们之间的关系包括属性和方法; 4、根据问题描述,设计系统的类层次; 5、完成类层次中各个类的描述(包括属性和方法); 6、完成类中各个成员函数的定义; 7、完成系统的应用模块; 8、完成系统的软件开发和测试工作; 9、撰写设计说明书; 10、做好答辩工作。 三. 主要内容、功能及技术指标 1、要求利用面向对象的方法以及C++的编程思想来完成系统的设计; 2、要求在设计的过程中,建立清晰的类层次; 3、在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法; 4、在系统的设计中,要求运用面向对象的机制(继承、派生及多态性)来实现系统功能。 5、在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能及设计出比较友好的界面等。 6、系统能完成以下功能: (1)系统以菜单方式工作; (2)录入信息用文件保存; (3)能建立、修改和增删学生通讯录; (4)能够按多种方式进行查询; (5)具有统计输出功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值