哈工大2018秋高级语言程序设计课程大作业

Github文件下载地址哈工大2018秋高级语言程序设计课程

《高级语言程序设计》实验大作业反思报告

实验大作业题目 智能趣味电子通讯录 类型 信息管理系统
学生姓名 郭茁宁 班 号 1837101 学 号 1183710109
所在院系 计算机学院 学 期 2018年秋季学期 任课教师 苏小红
实验类型 综合设计型
实验目的:
 掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句、算法和数据结构,以及自顶向下、逐步求精的模块化设计方法,能够设计具有一定规模的系统级C语言程序,提高系统编程能力;
 针对计算相关的复杂工程问题,能够使用恰当的算法和数据结构,完成计算、统计、排序、检索、匹配等相关的软件系统的构造、测试与实现;
 掌握常用的程序调试和测试方法。
实验要求:
 采用自顶向下、逐步求精的模块化设计思想设计一个小型信息库管理系统,或者闯关式游戏程序。
 要求解释说明采用了什么数据结构和算法,为什么选择这种数据结构或算法,系统实现过程中遇到了哪些问题,这些问题是如何解决的,还有什么问题尚未解决,今后打算从哪几个方面进行改进,本设计的亮点和难点在哪里,实验结果如何,有哪些收获和学习体会;
 编写程序完成以下实验大作业内容并完成实验大作业反思报告。
实验内容:
用复杂的静态数据结构(结构体数组)保存联系人的姓名、手机号、办公电话、工作单位、所在城市等信息。

typedef struct Adress_List
{
char Name[20];//姓名
char City[20];//城市
char Number[20];//电话号码
int Dial_Time;//通话时间
int Close_Score;//亲密度
}AL;

LoginName : gzn
Password : 123

要求使用模块化程序设计方法设计各个子模块,例如:显示主菜单模块,添加联系人模块,删除联系人模块,修改联系人模块,显示通讯录模块、统计分析和分类模块,通讯录文件读取模块、通讯录存档模块等。能够对多种类型信息进行统计分析和分类,以及查找。例如,按所在单位查找联系人模块,按所在城市对联系人进行分类,按所在工作单位对联系人进行分类等。
请选择功能:
0. 退出系统

  1. 增加联系人信息
  2. 打印联系人信息
  3. 删除联系人信息
  4. 修改联系人信息
  5. 拨打电话
  6. 模糊查找
  7. 亲密度排行及查询
  8. 相识概率
    实验环境:
    操作系统: Win10
    集成开发环境:Dev C++ 5.11或Codeblocks17.12
    外部库:无
    输入输出设计:
    输入类型:
  9. 输入字符串验证账号密码
  10. 输入数字选择通讯录对应功能
  11. 添加新联系人中,输入字符串和数字存储信息
  12. 在功能分支的人机交互中,输入数字选择不同功能模式

输入设计:
功能选择中,有效应对用户输入错误格式的问题,保证了运行流畅和程序健壮性。存储联系人时,统一规定为英文格式,对于信息有较强的包容性,将字母小写化,高效应对查找时不匹配。

输出类型:

  1. 联系人信息按原格式输出
  2. 计算亲密度和概率值时,统一为百分制整型输出

输出设计:
每次输出暂停程序,供用户仔细查看结果。打印联系人按后对齐输出,提升用户直观体验。可选择打印至指定文件,供用户存储和查看。标记输出结果的实际意义,提高使用可读性。
系统设计与实现:

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

  2. 函数功能和外部接口设计
    本系统总计设计了17个函数,每个函数的功能和接口设计如下表所示:
    序号 函数名 函数功能 函数参数 函数返回值
    1 Main 功能选择 无 0
    2 Login 登陆账户密码 无 无
    3 Menu 显示功能菜单 无 无
    4 Initial 创建初始链表 无 无
    5 Insert 插入新结点 结点p 无
    6 Standardize 字母标准化 字符串str[] 无
    7 Add 添加新联系人 无 无
    8 Delete 删除联系人 无 无
    9 Edit 编辑联系人 无 无
    10 PrintAll 打印通讯录 无 无
    11 Dial 拨打电话 无 无
    12 Fuzzy_Match (模糊)匹配查找 无 无
    13 FM_Name 姓名(模糊)匹配 无 无
    14 FM_City 城市(模糊)匹配 无 无
    15 FM_Number 电话(模糊)匹配 无 无
    16 Sort_Close 亲密度排序 无 无
    17 Acquaintance_Possibility 相识概率 无 无
    各个函数之间的调用关系如下所示:

  3. 算法

  4. 递归法创建、删除、查询链表(使用了递归算法)

  5. 选择排序(字典序、亲密度降序)(常用的排序和查找算法)

  6. 字母小写化

  7. 字符串模糊匹配(模糊匹配算法,或高效的模式匹配算法)

  8. 多信息分类查找(分类统计算法)

  9. 文件打印(文件操作)

  10. 数据结构

  11. 递归式动态链表

  12. 并查集

  13. 程序主流程图
    系统总体流程图如下:

实验过程中遇到的问题及解决方法与思路:
问题1: 概率学公式的植入
原因:对函数不了解
解决方法:查阅论文

问题2:防御输入格式错误
原因:提升健壮性
解决方法:判断字符输入合法性

问题3:链表排序
原因:无法调用sort()函数
解决方法:自己编写以姓名等为关键字的选择排序

问题4:用户输入错误功能选项无法返回
原因:程序希望完成该功能
解决方法:设置标记返回上一级

问题5:功能使用多次后屏幕繁冗,不易查看功能菜单
原因:连续使用功能,输入增多,光标下滑
解决方法:每次完成功能后清屏重新打印菜单

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

程序的全部源代码:

1.	#include <stdio.h>
2.	#include <stdlib.h>
3.	#include <string.h>
4.	#include <windows.h>
5.	#include <time.h>
6.	#include <math.h>
7.	
8.	typedef struct Adress_List//存储信息结构体 
9.	{
10.		char Name[20];//姓名 
11.		char City[20];//城市 
12.		char Number[20];//电话号码 
13.		int Dial_Time;//通话时间 
14.		int Close_Score;//亲密度 
15.	}AL;
16.	
17.	typedef struct LL//链表结构
18.	{
19.		AL data;
20.		struct LL *nxt;
21.	}LinkList;
22.	
23.	char Name[20];//姓名 
24.	char City[20];//城市 
25.	char Number[20];//电话号码 
26.	int Dial_Time;//通话次数
27.	int Close_Score;//亲密度
28.	
29.	int Num;//联系人数量
30.	LinkList *L,*head;//链表
31.	
32.	void login();//登陆界面 
33.	void menu();//功能菜单 
34.	void Initail();//链表初始化 
35.	void Insert(LinkList *p);//插入新节点
36.	void Standardize(char str[]);//字母小写化 
37.	void Add();//添加联系人 
38.	void Delete();//删除联系人 
39.	void Edit();// 编辑信息 
40.	void PrintAll();//打印所有联系人至文件或屏幕 
41.	void Dial();//拨打电话并显示通话时长 
42.	void Fuzzy_Match();//模糊查找(分类查找)
43.	void FM_Name();
44.	void FM_City();
45.	void FM_Number();
46.	void Sort_Close();//亲密度排序
47.	void Acquaintance_Possibility();//相识概率
48.	
49.	int main()
50.	{
51.		login();
52.		Initail();
53.		Sleep(1000);
54.		int Key_Print,Flag;
55.		while (1)
56.		{
57.			system("cls");
58.			menu();
59.			printf("请选择功能:");
60.			Flag=scanf("%d",&Key_Print);
61.			getchar();
62.			if (Flag)
63.			switch(Key_Print)
64.		 	{
65.				case 0://退出
66.					printf("欢迎使用!期待下次光临!");
67.					exit(0);
68.					return 0;
69.				case 1://添加
70.					Add();
71.					break;
72.				case 2://打印
73.					PrintAll();
74.					break;
75.				case 3://删除
76.					Delete();
77.					break; 
78.				case 4://编辑
79.					Edit();
80.					break; 
81.				case 5://拨打电话
82.					Dial();
83.					break; 
84.				case 6://模糊查找
85.					Fuzzy_Match();
86.					break;
87.				case 7://亲密度查询
88.					Sort_Close();
89.					break;
90.	            case 8://相识概率
91.	            	Acquaintance_Possibility();
92.					break;
93.				default:
94.					break;
95.			}
96.			else printf("输入错误!\n");
97.			system("pause");
98.		}
99.		return 0;
100.	}
101.	
102.	void login()//登陆界面  
103.	{ 
104.	    while (1)
105.		{
106.	 	    system("color b1");
107.			printf("\n");
108.	    	printf("```````````````````````````````````````````````````````````````````````````");  
109.	    	printf("\n");  
110.	    	printf("\n");  
111.	    	printf("\n");  
112.	    	printf("   ***********************  欢迎登陆电子通讯录 *************************  \n");  
113.	    	printf("\n");
114.			printf("\n");
115.	    	printf("                           ---Created By GZN---                            \n");
116.	    	printf("\n");
117.	    	printf("\n");
118.	    	printf("```````````````````````````````````````````````````````````````````````````");
119.			printf("\n");
120.			
121.			char LOG[20],PW[20];
122.			char log[3]={'g','z','n'},pw[3]={'1','2','3'};//自定义用户密码
123.			printf("                              LoginName:");
124.			scanf("%s",LOG);
125.			printf("                              Password:");
126.			scanf("%s",PW);
127.			if (strcmp(LOG,log)==0&&strcmp(PW,pw)==0)
128.			{
129.				printf("登陆成功!欢迎使用!\n");
130.				return;
131.			}
132.			else
133.			{
134.				printf("\n");
135.				printf("                          用户名或密码错误,请重新输入!\n");
136.				
137.				system("color F0");
138.				Sleep(200);
139.				system("color CD");
140.				Sleep(200);
141.				system("color A2");
142.				Sleep(200);//用户输入错误的视觉提示
143.				
144.				system("cls");
145.			}
146.		}
147.		return;
148.	}  
149.	
150.	void menu()//功能菜单  
151.	{
152.		//system("cls");
153.	    system("color E1");
154.	    printf("\n");
155.	    printf("     ____________________________________________ \n");
156.	    printf("    |                                            |\n");
157.	    printf("    |                电子通讯录                  |\n");
158.	    printf("    |                                            |\n");
159.	    printf("    |             0、退出系统                    |\n");
160.	    printf("    |             1、增加联系人信息              |\n");
161.	    printf("    |             2、打印联系人信息              |\n");
162.	    printf("    |             3、删除联系人信息              |\n");
163.	    printf("    |             4、修改联系人信息              |\n");
164.	    printf("    |             5、拨打电话                    |\n");
165.	    printf("    |             6、模糊查找                    |\n");
166.	    printf("    |             7、亲密度排行及查询            |\n");
167.	    printf("    |             8、相识概率                    |\n");
168.	    printf("    |                                            |\n");
169.	    printf("    |____________________________________________|\n");
170.	    return;
171.	}
172.	
173.	void Initail()//链表初始化
174.	{
175.		head=(LinkList*)malloc(sizeof(LinkList));
176.		L=(LinkList*)malloc(sizeof(LinkList));//头节点申请空间
177.		head->nxt=L;
178.		L->nxt=NULL;
179.		return; 
180.	} 
181.	
182.	void Insert(LinkList *New)//插入新节点
183.	{
184.		LinkList *Old=NULL;
185.		Old=L;
186.		New->nxt=Old->nxt;
187.		Old->nxt=New;
188.		New->data.Dial_Time=0;
189.	    New->data.Close_Score=0;
190.		return;
191.	}
192.	
193.	void Standardize(char str[])//字母小写化
194.	{
195.		int i,len=strlen(str);
196.		for (i=0;i<len;i++)
197.		{
198.			if (*(str+i)>='A'&&*(str+i)<='Z')
199.			*(str+i)=*(str+i)-'A'+'a';
200.		}
201.		return;
202.	}
203.	
204.	void Add()//添加联系人
205.	{
206.		system("color fa");
207.	    printf("请输入联系人的信息:\n");  
208.	    printf("姓名:"); 
209.	    scanf("%s",Name);
210.	    Standardize(Name);
211.	    LinkList *q=L->nxt;
212.	    while(q!=NULL)
213.	    {  
214.	        if(strcmp(q->data.Name,Name)==0)//判断是否存在  
215.	        {
216.	            printf("该生已存在\n");  
217.	            return;
218.	        }
219.	        q=q->nxt;
220.	    }  
221.	    if(q==NULL)  
222.	    {  
223.	        LinkList *p;  
224.	        p=(LinkList*)malloc(sizeof(LinkList));
225.			p->nxt=NULL; 
226.			
227.	        strcpy(p->data.Name,Name);  
228.	        
229.	        printf("城市:") ;  
230.	        scanf("%s",City) ;
231.	        Standardize(City);
232.	        strcpy(p->data.City,City);
233.	        
234.	        printf("电话:");  
235.	        scanf("%s",Number);
236.	        Standardize(Number);
237.	        strcpy(p->data.Number,Number);
238.	        
239.	        Insert(p);//插入p节点
240.	        printf("添加联系人成功!\n");
241.	    }
242.	    return;
243.	}
244.	
245.	void Delete()//删除联系人
246.	{
247.		system("color f4");
248.	    if (L->nxt==NULL)
249.	    {  
250.	        printf("通讯录为空,请增加联系人信息\n");  
251.	        return;
252.	    }
253.		printf("请输入您要删除的联系人的姓名:");
254.	    scanf("%s",Name);
255.	    Standardize(Name);
256.	    LinkList *p,*pre;
257.	    
258.	    pre=L;
259.	    p=pre->nxt;
260.	    int judge=0;
261.	    while (p!=NULL)
262.	    {
263.	 		if (strcmp(p->data.Name,Name)==0)
264.	    	{
265.	        	judge=1;
266.				pre->nxt=p->nxt;//前驱结点接入后继结点
267.				free(p);//释放内存
268.				printf("删除联系人成功!\n");
269.				break;
270.	        }
271.	        pre=p;
272.	        p=p->nxt;//逐一推进寻找
273.	    } 
274.	    if (judge==0)
275.		{
276.			printf("该联系人不存在,请重新输入!\n");
277.			return;
278.		}
279.	    return;
280.	}
281.	
282.	void Edit()// 编辑信息
283.	{
284.		system("color 0A");
285.		if (L->nxt==NULL)
286.	    {
287.	        printf("通讯录为空,请增加联系人信息\n");  
288.	        return;
289.	    }
290.	    printf("请输入您要编辑的联系人的姓名:");
291.	    scanf("%s",Name);
292.	    Standardize(Name);
293.	    LinkList *ed=L;
294.	    int choice;
295.		while (ed!=NULL)
296.		{
297.			if (strcmp(ed->data.Name,Name)==0)
298.			{
299.				do
300.				{
301.	                printf("请输入您要编辑的联系人的信息\n");
302.					printf("姓名(1)城市(2)电话(3)修改完成退出(0):");//多种编辑信息
303.					scanf("%d",&choice);
304.					printf("您将修改为:");
305.					switch(choice)
306.					{
307.						case 1:
308.							scanf("%s",Name);
309.							Standardize(Name);
310.							strcpy(ed->data.Name,Name);
311.							break;
312.						case 2:
313.							scanf("%s",City);
314.							Standardize(City);
315.							strcpy(ed->data.City,City);
316.							break;
317.						case 3:
318.							scanf("%s",Number);
319.							Standardize(Number);
320.							strcpy(ed->data.Number,Number);
321.							break;
322.						default:
323.							return;
324.					}
325.					printf("编辑成功!\n");
326.					choice=0;
327.					scanf("%d",&choice);
328.				}while (choice!=0);
329.				return;
330.			}
331.			ed=ed->nxt;
332.		}
333.		printf("该联系人不存在,请重新输入\n");
334.		return;
335.	}
336.	
337.	void PrintAll()//打印所有联系人
338.	{
339.		system("color 0E");
340.		int choice;
341.		printf("请选择打印至屏幕(1)或文件(2):");
342.		scanf("%d",&choice);
343.		if (choice!=1&&choice!=2) return;
344.		if (choice==2) freopen("Adress_List.txt","w",stdout);//打印通讯录至文件
345.		LinkList *i,*j;
346.		AL t;
347.		for (i=L->nxt;i!=NULL;i=i->nxt)//按字典序从小到大排序
348.		{
349.			for (j=i->nxt;j!=NULL;j=j->nxt)
350.			if (i->data.Name>j->data.Name)
351.			{
352.				t=i->data;
353.				i->data=j->data;
354.				j->data=t;
355.			}
356.		}
357.		LinkList *p=L,*q;
358.		int k=0;
359.		while (p->nxt!=NULL)
360.		{
361.			q=p->nxt;
362.			printf("%d:%5s %5s %11s\n",++k,q->data.Name,q->data.City,q->data.Number);
363.			p=q;
364.		}
365.		printf("成功打印联系人至");
366.		if (choice=='2')
367.		{
368.			fclose(stdout);
369.			printf("文件");
370.		}
371.		else printf("屏幕");
372.		printf("!\n");
373.		return;
374.	}
375.	
376.	void Dial()//拨打电话并显示通话时长
377.	{
378.		system("color 70");
379.		if(L->nxt==NULL)
380.	    {
381.	        printf("通讯录为空,请增加联系人信息\n");  
382.	        return;
383.	    }
384.	    
385.		printf("请输入您要拨叫的用户姓名:");
386.		scanf("%s",Name);
387.		Standardize(Name);
388.		LinkList *p=L;
389.		while (p!=NULL)
390.		{
391.			if (strcmp(p->data.Name,Name)==0) break;
392.			p=p->nxt;
393.		}
394.		if (p==NULL)
395.		{
396.			printf("该联系人不存在,请重新查找!\n");
397.			return;
398.		}
399.		
400.		clock_t start,finish;
401.		start=clock();//通话开始时间
402.		printf("正在通话...\n");
403.		system("pause");
404.		finish=clock();//通话结束时间
405.		int duration=(int)(finish-start)/CLOCKS_PER_SEC;//记录时差,单位为秒
406.		
407.		printf("通话结束,感谢您的使用\n");
408.		Sleep(500);
409.		printf("本次通话持续%d秒\n",duration+2);
410.		Sleep(500);
411.		
412.		p->data.Dial_Time+=duration+2;//累计通话时间
413.		printf("您和该联系人一共通话%d秒\n",p->data.Dial_Time);
414.		return;
415.	}
416.	
417.	void Fuzzy_Match()//模糊查找(分类查找)
418.	{
419.		system("color 5E");
420.		printf("请输入您要匹配的信息类型(姓名:1,城市:2,电话:3)\n");
421.		int choice;
422.		scanf("%d",&choice);
423.		switch(choice)
424.		{
425.			case 1:
426.				FM_Name();//姓名匹配
427.				break;
428.			case 2:
429.				FM_City();//城市匹配
430.				break;
431.			case 3:
432.				FM_Number();//电话匹配
433.				break;
434.		}
435.		return;
436.	}
437.	
438.	void FM_Name()
439.	{
440.		printf("请输入您要匹配的名字\n");
441.		scanf("%s",Name);
442.		Standardize(Name);
443.		int l1=strlen(Name),l2,i,j,flag,cnt=0;
444.		LinkList *p=L;
445.		while (p!=NULL)
446.		{
447.			l2=strlen(p->data.Name);
448.			for (i=0;i<=l2-l1;i++)
449.			{
450.				flag=1;
451.				for (j=0;j<l1;j++)
452.				{
453.					if (Name[j]!=p->data.Name[i+j]) flag=0;//对照匹配姓名
454.				}
455.				if (flag)
456.				{
457.					printf("%d:%5s\n",++cnt,p->data.Name);
458.					break;
459.				}
460.			}
461.			p=p->nxt;
462.		}
463.		if (cnt==0)
464.		{
465.			printf("没有存储您想查找的联系人,请重新查找!\n");
466.			return;
467.		}
468.		int choice;
469.		printf("请选择您想查找的联系人编号:");
470.		scanf("%d",&choice);
471.		while (choice>cnt||choice<1)
472.		{
473.			printf("输入编号错误,请重新输入!");
474.			scanf("%d",&choice);
475.		}
476.		p=head->nxt;
477.		cnt=0;
478.		while (p!=NULL)
479.		{
480.			l2=strlen(p->data.Name);
481.			for (i=0;i<=l2-l1;i++)
482.			{
483.				flag=1;
484.				for (j=0;j<l1;j++)
485.				{
486.					if (Name[j]!=p->data.Name[i+j]) flag=0;
487.				}
488.				if (flag)
489.				{
490.					cnt++;
491.					if (cnt==choice)//找到用户想查询的联系人
492.					{
493.						printf("%5s %5s %15s\n",p->data.Name,p->data.City,p->data.Number);
494.						return;
495.					}
496.				}
497.			}
498.			p=p->nxt;
499.		}
500.		return;
501.	}
502.	
503.	void FM_City()
504.	{
505.		printf("请输入您要匹配的城市\n");
506.		scanf("%s",City);
507.		Standardize(City);
508.		int l1=strlen(City),l2,i,j,flag,cnt=0;
509.		LinkList *p=L;
510.		while (p!=NULL)
511.		{
512.			l2=strlen(p->data.City);
513.			for (i=0;i<=l2-l1;i++)
514.			{
515.				flag=1;
516.				for (j=0;j<l1;j++)
517.				{
518.					if (City[j]!=p->data.City[i+j]) flag=0;
519.				}
520.				if (flag)
521.				{
522.					printf("%d:%5s\n",++cnt,p->data.Name);
523.					break;
524.				}
525.			}
526.			p=p->nxt;
527.		}
528.		if (cnt==0)
529.		{
530.			printf("没有存储您想查找的联系人,请重新查找!\n");
531.			return;
532.		}
533.		int choice;
534.		printf("请选择您想查找的联系人编号:");
535.		scanf("%d",&choice);
536.		while (choice>cnt||choice<1)
537.		{
538.			printf("输入编号错误,请重新输入!");
539.			scanf("%d",&choice);
540.		}
541.		p=head->nxt;
542.		cnt=0;
543.		while (p!=NULL)
544.		{
545.			l2=strlen(p->data.City);
546.			for (i=0;i<=l2-l1;i++)
547.			{
548.				flag=1;
549.				for (j=0;j<l1;j++)
550.				{
551.					if (City[j]!=p->data.City[i+j]) flag=0;
552.				}
553.				if (flag)
554.				{
555.					cnt++;
556.					if (cnt==choice)
557.					{
558.						printf("%5s %5s %15s\n",p->data.Name,p->data.City,p->data.Number);
559.						return;
560.					}
561.				}
562.			}
563.			p=p->nxt;
564.		}
565.		return;
566.	}
567.	
568.	void FM_Number()
569.	{
570.		printf("请输入您要匹配的电话\n");
571.		scanf("%s",Number);
572.		Standardize(Number);
573.		int l1=strlen(Number),l2,i,j,flag,cnt=0;
574.		LinkList *p=L;
575.		while (p!=NULL)
576.		{
577.			l2=strlen(p->data.Number);
578.			for (i=0;i<=l2-l1;i++)
579.			{
580.				flag=1;
581.				for (j=0;j<l1;j++)
582.				{
583.					if (Number[j]!=p->data.Number[i+j]) flag=0;
584.				}
585.				if (flag)
586.				{
587.					printf("%d:%5s\n",++cnt,p->data.Name);
588.					break;
589.				}
590.			}
591.			p=p->nxt;
592.		}
593.		if (cnt==0)
594.		{
595.			printf("没有存储您想查找的联系人,请重新查找!\n");
596.			return;
597.		}
598.		int choice;
599.		printf("请选择您想查找的联系人编号:");
600.		scanf("%d",&choice);
601.		while (choice>cnt||choice<1)
602.		{
603.			printf("输入编号错误,请重新输入!");
604.			scanf("%d",&choice);
605.		}
606.		p=head->nxt;
607.		cnt=0;
608.		while (p!=NULL)
609.		{
610.			l2=strlen(p->data.Number);
611.			for (i=0;i<=l2-l1;i++)
612.			{
613.				flag=1;
614.				for (j=0;j<l1;j++)
615.				{
616.					if (Number[j]!=p->data.Number[i+j]) flag=0;
617.				}
618.				if (flag)
619.				{
620.					cnt++;
621.					if (cnt==choice)
622.					{
623.						printf("%5s %5s %15s\n",p->data.Name,p->data.City,p->data.Number);
624.						return;
625.					}
626.				}
627.			}
628.			p=p->nxt;
629.		}
630.		return;
631.	}
632.	
633.	void Sort_Close()//亲密度排序
634.	{
635.		system("color CF");
636.		if(L->nxt==NULL)
637.	    {
638.	        printf("通讯录为空,请增加联系人信息\n");
639.	        return;
640.	    }
641.		LinkList *i,*j;
642.		AL t;//信息存储类型
643.		int Sum_Dial=0,k=0;
644.		for (i=L->nxt;i!=NULL;i=i->nxt) Sum_Dial+=i->data.Dial_Time;//累计用户总通话时间
645.		if (Sum_Dial==0)//未通话无法计算亲密度
646.		{
647.			printf("您的通话记录为空!\n");
648.			return;
649.		}
650.		for (i=L->nxt;i!=NULL;i=i->nxt)
651.		i->data.Close_Score=min(99,i->data.Dial_Time*100/Sum_Dial+rand()%20+20);
652.		for (i=L->nxt;i!=NULL;i=i->nxt)//亲密度排序
653.		{
654.			for (j=i->nxt;j!=NULL;j=j->nxt)
655.			if (i->data.Close_Score<j->data.Close_Score)
656.			{
657.				t=i->data;
658.				i->data=j->data;
659.				j->data=t;
660.			}
661.		}
662.		for (i=L->nxt;i!=NULL;i=i->nxt)
663.		printf("Rank%d:%5s  Dial:%4d  Close_Score:%2d%%\n",++k,i->data.Name,i->data.Dial_Time,i->data.Close_Score);
664.		return;
665.	}
666.	
667.	void Acquaintance_Possibility()//相识概率
668.	{
669.		system("color F0");
670.		printf("请输入两个联系人姓名,将输出两人相识的概率!\n");
671.		int poss=rand()%10;
672.		char n1[20],n2[20];
673.		LinkList *i,*j;
674.		printf("请输入第一个联系人姓名:");
675.		scanf("%s",n1);
676.		for (i=L->nxt;i!=NULL;i=i->nxt)
677.		if (strcmp(i->data.Name,n1)==0) break;//寻找目标联系人存储结点
678.		if (i==NULL)
679.		{
680.			printf("该联系人不存在!\n");
681.			return;
682.		}
683.		printf("请输入第二个联系人姓名:");
684.		scanf("%s",n2);
685.		if (strcmp(n1,n2)==0)
686.		{
687.			printf("两个联系人相同,输入错误!\n");
688.			return;
689.		}
690.		for (j=L->nxt;j!=NULL;j=j->nxt)
691.		if (strcmp(j->data.Name,n2)==0) break;
692.		if (j==NULL)
693.		{
694.			printf("该联系人不存在!\n");
695.			return;
696.		}
697.		if (strcmp(i->data.City,j->data.City)==0) poss+=20+rand()%50;//概率公式计算相识概率
698.		printf("两人相识的概率为:%d%%\n",poss);
699.		return;700.	}

分析总结、收获和体会:
优点(你最满意的设计):

  1. 链表动态储存
  2. 选择排序优化
  3. 多种趣味功能(见“创新之处”)

创新之处:

  1. 出类拔萃、脱颖而出的通话功能
  2. 趣味横生、极富人性化的亲密度排序
  3. 数学意味浓厚的概率学公式应用

不足之处:

  1. 输入格式错误的健壮性
  2. 排序稳定性和高效性
  3. 程序结构动态来回运行能力

需要改进的地方:
同上

收获与体会:
细节决定成败。
金无足赤,人无完人。

自我评价: 是 否
程序是否能通过编译并正常运行,没有bug? √
是否在撰写报告之前观看了spoc里的代码风格视频? √
程序代码是否符合代码规范(模块化,变量和函数命名规范,对齐与缩进,有必要的注释)? √
是否按模块化要求进行了程序设计,系统功能是否完善? √
是否是独立完成,未参考其他人的设计或代码? √
自我评语:
我认为我在本次实验大作业中认真仔细地编写代码,充分体现了我高级语言程序设计能力突出和经验丰富的优点,并在实验过程中挑战自我、弥补缺漏,使本次大作业既成为检验能力的好机会,又是激发潜力的好方式。希望我在本次程序设计和报告撰写上下的功夫,能成为我编程素养较高的重要标志,更希望我能以此为新台阶,不断进步,超越自我。
报告完成日期:2018.12.25

你可能感兴趣的:(课程作业,计算机系统,c语言,数据库)