1、 C 语言课程设计专 业:电气工程及其自动化班 级: 电气 11 姓 名: 学 号: 指导教师: 兰州交通大学自动化与电气工程学院2012 年 7 月 6 日评语:平时(40) 修改(30) 报告(30) 总成绩C 程序设计课程设计报告- 1 -1 基本题目1.1 题目编写函数,求取两个整数 m,n 的最大公约数和最小公倍数。1.2 题目分析开始输入两个数 m , np = m * nm 是否不等于nm int max(int a,int b);C 程序设计课程设计报告- 2 -int main()printf(“请输入两个整数“);int m,n,p;scanf(“%d%d“,p=m*n;p
2、rintf(“最大公约数为:%d 最小公倍数为:%dn“,max(m,n),p/max(m,n);return 0;int max(int a,int b)int c;while (a!=b)if(a#include main()int i=0,j;char ch;while(ch=getch()!=r)i+;C 程序设计课程设计报告- 3 -printf(“%c“,ch);printf(“you type %d charactersn“,i);2.2 程序运行结果图 3 正确程序运行结果3 综合题目3.1 题目综合题目为:班级通讯录 。3.2 数据结构对上述题目进行分析,定义结构体数据结构如
3、下:struct Personchar name10; /姓名char num15; /号码char age8; /年龄char adds20; /住址struct Person *next;3.3 程序的主要功能通过该系统实现对通讯录信息进行录入、显示、修改、删除、排序、保存等操作的管理。本系统采用链表的方式动态储存每个数据,每个数据结构包括姓名,电话号码,年龄,地址,还有指向下一结构体的地址。本系统显示这样的菜单:1.新建联系人;2. 打开文件;3. 保存联系人;4. 显示联系人;5. 查找,删除联系人;0. 退出程序;C 程序设计课程设计报告- 4 -开始打印主界面a = = 0 ?a
4、= = 1 ?否结构体数n = = 0 ?是调用 i n p u t s _ f i r s t函数是调用i n p u t s _ n e x t 函数b r e a ka = = 2 ?否调用 o p e n ( ) 函数是b r e a ka = = 3 ?否调用 c r e a t ( ) 函数是b r e a ka = = 4 ?否调用 p r i n t ( h e a d )函数是b r e a ka = = 5 ?否调用 l o o k _ u p ( )函数是b r e a k输出 “ 您的输入有误 ”否否结束是图3 主函数流程图3.4 各函数的功能(1) inputs_fi
5、rst()C 程序设计课程设计报告- 5 -该函数用来创建第一个结构体,创建第一个内存单元,并写入其中的数据;(2) inputs_next()该函数用来新建非第一个结构体,创建一个内存单元,写入数据到其中并使得各个结构体之间能够单项链接;(3) prin()此函数用来打印内存中链表内各内存单元内的数据到屏幕上,起到显示数据的作用;(4 )creat()此函数用来保存链表内数据到硬盘上,保存的标题提供两种方式,一个是保存到默认文件,另一个是保存到自己命名的文件上。所保存的文件可以用记事本等软件打开,并可以显示所有联系人信息;(5 )open()此函数用来打开文件。既可以把文件的信息显示到屏幕上
6、,而且可以把文件的联系人信息输入到内存中形成链表,可供编辑。此函数也提供两种打开文件的方式,一是打开默认文件,另一个是打开自己输入的文件;(6) look_up()此函数用来查找和删除文件。此函数提供三种查找方式,第一是名字查找,第二是电话号码查找,第三是地址查找。查找到联系人并显示信息之后,可选择是否删除联系人。3.5 源程序#include#include# define LEN sizeof(struct Person)# includestruct Personchar name10; /姓名char num15; /号码char age8; /年龄char adds20; /住址st
7、ruct Person *next;int n=0;struct Person *head;struct Person *p1,*p2;struct Person *inputs_first(void)/创建首个联系人 char ch;p1=p2=(struct Person *) malloc(LEN);C 程序设计课程设计报告- 6 -head=p1;printf(“请输入姓名:n“);scanf(“%s“,p1-name);printf(“请输入号码:n“);scanf(“%s“,p1-num);printf(“请输入年龄:“);scanf(“%s“,p1-age);printf(“请输
8、入地址:“);scanf(“%s“,p1-adds);ch=getchar();p1-next=NULL;n=1;return (head);system(“pause“);struct Person *inputs_next(void)/创建新的联系人char ch;p1=(struct Person *) malloc(LEN);printf(“请输入姓名:n“);scanf(“%s“,p1-name);printf(“请输入号码:n“);scanf(“%s“,p1-num);printf(“请输入年龄:“);scanf(“%s“,p1-age);printf(“请输入地址:“);scan
9、f(“%s“,p1-adds);ch=getchar();p2-next=p1;p1-next=NULL;p2=p1;n+;return (head);void print(struct Person *head)/输出链表函数char ch;ch=getchar();struct Person *p;p=head;if(head!=NULL)do printf(“%s %s %s %sn“,p-name,p-num,p-age,p-adds);p=p-next;C 程序设计课程设计报告- 7 -while (p!=NULL);printf(“共有%d 项记录“,n);system(“paus
10、e“);void creat()/创建新文件(保存) char d,ch,e;FILE *fp;e=getchar();printf(“是否保存到默认文件?(Y/N)n“);scanf(“%c“,ch=getchar();if(d=Y)if(fp=fopen(“default.txt“,“w“)=NULL)printf(“无法打开此文件n“);exit(0);else char filename10;printf(“请输入所用的文件名:“);scanf(“%s“,filename);if(fp=fopen(filename,“w“)=NULL)printf(“无法打开此文件n“);exit(0
11、);struct Person *p;p=head;while(p)fprintf(fp,“%s %s %s %sn“,p-name,p-num,p-age,p-adds);p=p-next;fclose(fp);system(“pause“);int open()/打开文件char ch,a10,d;int i=0;FILE *fp;C 程序设计课程设计报告- 8 -printf(“是否打开默认联系人列表(Y/N)“);d=getchar();scanf(“%c“,getchar();if(ch=Y) if(fp=fopen(“default.txt“,“r“)=NULL)printf(“无
12、法打开文件n“);exit(0);else printf(“请输入要打开的文件名:“);scanf(“%s“,a);if(fp=fopen(a,“r“)=NULL)printf(“无法打开文件n“);exit(0);while (!feof (fp) p1=(struct Person *) malloc(LEN); if (n=0) head=p1;else p2-next=p1;fscanf(fp,“%s %s %s %s“,p1-name,p1-num,p1-age,p1-adds);printf(“%s %s %s %sn“,p1-name,p1-num,p1-age,p1-adds)
13、;p2=p1;p1-next=NULL;n+;fclose(fp);system(“pause“);return 0;void look_up()/查找联系人char ch;printf(“1.用姓名查找。“);printf(“2.用电话号码查找。“);printf(“3.用地址查找查找。n“);int i,j=1;struct Person *p,*q;p=head;scanf(“%d“,ch=getchar();switch(i)C 程序设计课程设计报告- 9 -case 1:char name10;printf(“请输入姓名“);scanf(“%s“,name);doif(strcmp(
14、name,p-name)=0) break;q=p;p=p-next; j+;while (p-next!=NULL);break;case 2:char num15;printf(“请输入号码“);scanf(“%s“,num);doif(strcmp(num,p-num)=0) break;q=p;p=p-next; j+;while (p-next!=NULL);break;case 3: char adds20;printf(“请输入地址“);scanf(“%s“,adds);doif(strcmp(adds,p-adds)=0) break;q=p;p=p-next; j+;whil
15、e (p-next!=NULL);break;default:printf(“您的输入有误n“);break;if(p!=NULL)printf(“%s %s %s %sn“,p-name,p-num,p-age,p-adds);else printf(“通讯录中没有此人 n“);/删除联系人printf(“1.返回n“);printf(“2.删除此联系人n“);scanf(“%d“,if(i=2)C 程序设计课程设计报告- 10 -printf(“确认删除此联系人?(Y/N)“);char ch;scanf(“%c“,ch=getchar();if(ch=Y)if(n=1) head=NUL
16、L;else if (j=1) head=p-next;else if (p-next=NULL) q-next=NULL;p1=q;p2=p1;else q-next=p-next;void main()/主函数 (编辑联系人函数)int a;char ch;for(;1;)printf(“tt *通讯录* n“); printf(“tt -n“); printf(“tt 1. 新建联系人 n“); printf(“tt 2. 打开文件 n“); printf(“tt 3. 保存联系人 n“); printf(“tt 4. 显示联系人 n“); printf(“tt 5. 查找,删除联系人
17、n“); printf(“tt 0. 退出程序 n“); printf(“tt -n“); printf(“tt 请您选择 (0-5):“); scanf(“%d“,if(a=0) break;elseswitch (a)case 1: if (n=0)inputs_first();else inputs_next();printf(“您需要再新建联系人吗?(Y/N)n“);ch=getchar();while(ch=Y)inputs_next();printf(“您需要再新建联系人吗?(Y/N)n“);scanf(“%c“, C 程序设计课程设计报告- 11 -print (head); b
18、reak;case 2:open();break;case 3:creat ();break;case 4:print(head);break;case 5:look_up();break;default: printf(“您的输入有误n“);system(“CLS“);/printf(“是否保存所有联系人?(Y/N)“);/scanf(“%c“,/if(ch=Y)/creat ();3.6 程序运行结果图 4 主界面C 程序设计课程设计报告- 12 -图 5 新建联系人图 6 保存联系人 1C 程序设计课程设计报告- 13 -图 7 保存联系人 2图 8 查找并删除联系人图 9 显示联系人4 结论我的这个大程序主要的难点是链表之间的连接,开始我的程序格式很乱,所以很容易的出现问题。其中有着两个问题小问题令我印象非常深刻,第一是关于吸收回车字符的问题,第二个是大括号对应的问题。这种问题虽然小,但检查出来很不容易。吸收回车字符的问题就像我们的生活,自己造成错误后要马上改正,否则以后可能会为此付出不小的代价。创新也是很重要的方面,创造性的解决方案能使一个程序变得更加完美。开始时同学们都建议不要用链表,应为这个相当难一点,但最后我还是完成了。挑战困难成功的感觉确实爽。这次程序设计我再次感受到交流的重要性,同学们为我指出了许多问题并提供了许多很好的建议,真的很感谢他们。