大作业题目 | 手机通讯录管理系统 | 类型 | 信息管理系统 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
班 号 |
| 学 号 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
所在院系 | 计算机与电子通信 | 学 期 | 2021年 秋 季学期 | 任课教师 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
实验类型 | 综合设计型 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
实验目的: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
实验要求: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
实验内容: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
以手机通讯录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个函数,每个函数的功能和接口设计如下表所示:
各个函数之间的调用关系如下所示:
栈或队列的链式存储结构、链表等动态数据结构 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,对输入的检验严格,出错概率降低;
3,采用了链表的动态数据存储结构。 创新之处 1,加入了背景音乐; 2,增加了对姓氏首字母不同的联系人进行统计的功能;
不足之处: 1,有些算法过于复杂繁冗,不够精炼;
需要改进的地方: 1,精简算法的复杂性; 2,对变量的起名可以在详细一些; 收获与学习体会: 1,加深了对链表的认知;
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自我评价: | 是 | 否 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
程序运行是否无bug? | 是 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
是否在撰写报告之前观看了MOOC里的华为编程实践和代码规范相关的视频? | 是 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
程序代码是否符合华为代码规范(对齐与缩进,变量名和函数名命名,必要的注释等)? | 是 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
是否按模块化要求进行了程序设计,系统功能是否完善? | 是 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
是否是独立完成? | 是 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自我评语: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
报告完成日期:2021.12.23 |
12-07
12-24