C 课程设计2(25页).doc
-C 课程设计2-第 21 页成 绩 评 定 表学生姓名马舒阳班级学号1203070102专 业电子信息科学与技术课程设计题目编程技术基础实训评语组长签字:成绩日期 2013 年 月 日课程设计任务书学 院信息科学与工程学院专 业电子信息科学与技术学生姓名马舒阳班级学号1203070102课程设计题目编程技术基础实训实践教学要求与任务:利用C语言编写下题的代码。题目名称:设计求两数之差的绝对值的函数和学生成绩统计程序内容及要求:(1)题目一的内容和要求:1).设计一个选择式菜单。栈子系统* 1 入栈 * 2 出栈 * 3 显示 * 4 数制转换 * 0 返回 *请选择菜单号(04):2).设计一个整型数据元素的链栈。3).编写入栈、出栈和显示栈中全部元素的程序。4).编写一个把十进制数转换成八进制数的应用程序。(2)题目二的内容和要求:通讯录实质上是一个线性表,由于通讯录长度不确定,且插入或删除操作比较频繁,因此,采用单链式存储结构。要求实现如下功能:1).设计一个选择式菜单。通讯录管理系统* 1 通讯录单链表的建立 * 2 通讯者的插入 * 3 通讯者的删除 * 4 通讯者的查询 * 0 退出 *请选择菜单号(04):2).编程实现通讯录单链表的建立、通讯者的插入、通讯者的删除、通讯者的查询、通讯录的输出。工作计划与进度安排:第1天:1、指导教师布置课程设计题目及任务2、查找相关资料第24天:1、根据具体设计题目进行具体分析2、对设计题目进行编码和调试3、指导教师进行验收第5天:1、指导教师针对课程设计进行答辩2、完成课程设计报告指导教师: 2013年 月 日专业负责人:2013年 月 日学院教学副院长:2013 年 月 日目 录一、课程设计目的-1二、课程设计内容和要求-1三、题目一设计过程-2四、题目二设计过程-24五、设计总结-36六、参考文献-36题目 栈子系统、通讯录管理系统一、课程设计的目的本学期我们对数据结构这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握数据结构中的各方面知识,还要求学生具备一定的C语言基础和编程能力。(1)题目一的目的: 1.掌握栈的特点及其描述方法2.掌握链式存储结构实现一个栈3.掌握链栈的各种基本操作4.掌握栈的典型应用的算法(2)题目二的目的: 1.掌握线性表的特点2.掌握线性表的顺序存储结构和链式存储结构的基本运算3.掌握线性表的基本操作二、课程设计的内容和要求(1)题目一的内容和要求:1).设计一个选择式菜单。栈子系统* 1 入栈 * 2 出栈 * 3 显示 * 4 数制转换 * 0 返回 *请选择菜单号(04):2).设计一个整型数据元素的链栈。3).编写入栈、出栈和显示栈中全部元素的程序。4).编写一个把十进制数转换成八进制数的应用程序。(2)题目二的内容和要求:通讯录实质上是一个线性表,由于通讯录长度不确定,且插入或删除操作比较频繁,因此,采用单链式存储结构。要求实现如下功能:1).设计一个选择式菜单。通讯录管理系统* 1 通讯录单链表的建立 * 2 通讯者的插入 * 3 通讯者的删除 * 4 通讯者的查询 * 0 退出 *请选择菜单号(04):2).编程实现通讯录单链表的建立、通讯者的插入、通讯者的删除、通讯者的查询、通讯录的输出。三、题目一设计过程1、题目分析本题要求合理地设计一个栈的结构及入栈、出栈、删除、查找等基本操作,并运用此结构实现数制转换。2、 算法描述首先定义一个结点结构体,指针域包括两个指针,分别指向前驱结点和后继结点,数据域为一个DataType类型的变量,其中DataTYpe类型为宏定义;在定义一个栈结构体,结构体内包括两个指针,分别为栈顶指针和栈低指针,还有一个int型记录栈的长度。下面仅详细阐述一下各功能模块的工作原理。入栈为栈的首次赋值,利用dowhile();可按需求循环输入多组信息,并及时退出返回到主菜单,在实现循环多组输入时调用了函数Push,Push为机械入栈一个新元素,将参数nn,入栈到栈tt内,栈的长度加一。出栈函数Pop中,首先判断栈是否为空,为空时,不可出栈;非空时,输出栈顶元素及栈的长度,并删除栈顶节点,栈的长度减一。信息输出完毕后按任意键返回主菜单。显示函数Show中,即利用do.while循环多次调用出栈函数,每次输出时要按任意键继续一次,以保障画面整洁。信息输出完毕后按任意键返回主菜单。数制转换函数chang中,大体结构包括一个大的do.while允许多次使用信息转换,do中首先输入数及其进制和预期进制,然后判断是否为十进制,经费是禁止的数字转换为十进制,再将其循环除以预期进制,将其余数存在新建号的栈中,直到余数为零,停止循环,然后依次出栈,将栈顶元素依次显示出来,即转换结束。可选N或Y,继续下一次转换,或者返回主菜单。3、 源代码ST.h :#ifndef ST_H#define ST_H#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<windows.h>typedef int DataType;typedef struct Nodestruct Node *pro;DataType data;struct Node *next; NN;/双向链栈的结点typedef structNN *top;NN *base;int size; ST;/栈/main.c:主函数/Menu.c:框架界面函数和初始化退出函数void Initiate(ST *tt);/栈的初始化 及 双向链的初始化void JM();/界面int Num();/菜单序号选择void Exit();/退出/FUN.c:具体功能函数void Input(ST *tt);/入栈void Push(ST *tt,DataType nn);/机械入栈int Pop(ST *tt);/机械出栈void Show(ST tt);/显示void change(ST tt);/数制转换#endifMenu.c:#include"ST.H"void JM()/界面函数int ch;ST tt;Initiate(&tt);printf("nnnnnnnntt欢迎您使用 栈子系统 !nnn ");printf("tttt设计者:马舒阳(1203070102)n");getch();dosystem("cls");printf ("nntttt栈子系统n");printf ("t*n");printf ("t* 1 入栈 *n");printf ("t* 2 出栈 *n");printf ("t* 3 显示 *n");printf ("t* 4 数制转换 *n");printf ("t* 0 返回 *n");printf ("t*n");printf ("t* 提示:本系统仅可用于整型数数据的储存,望谅解。*tn");printf ("t*n");ch=Num();switch(ch)case 1 :Input(&tt);break;case 2 :Pop(&tt);break;case 3 :Show(tt);break;case 4 :change(tt);break;case 0 :Exit();case -1:while(ch);int Num()/判断菜单号int k;printf("ntt请选择菜单号(04):");scanf("%d",&k);getchar();if(k<0|k>5)printf("ntt输入错误!按任意键继续.");getch();return (-1);elsereturn k;void Initiate(ST *tt)/栈空的初始化 注意:此函数内的tt为栈型指针,不同于JM内的tttt->base = (NN*)malloc(sizeof (NN);tt->top = tt->base;tt->size=0;void Exit()/退出system("cls");printf("nnnnnntt谢谢使用 程序退出!");printf("nnnnnnttt");printf("按任意键继续.");getch();main.c:#include"ST.H"int main()JM();return 0;FUN.c:#include"ST.H"void Input(ST *tt)/栈的初始化DataType nn;int ch;system("cls");printf("nntt老师早安! 开始入栈!nn");doprintf("ntt请输入新栈顶数据 : ");scanf ("%d",&nn);/%dgetchar();Push(tt,nn);/调用入栈函数doprintf("ntt继续? <Y or N> ");ch = getchar();getchar();if(ch != 'N' && ch != 'Y')printf("ntt请输入 Y 或 N !n");elsebreak;while(1);while (ch = 'Y');void Push(ST *tt,DataType nn)/将nn入栈到tt所指栈 (栈中top指向还未赋值的结点)NN *p;p = (NN *)malloc(sizeof (NN);tt->top->data = nn;p->pro = tt->top;(tt->top)->next = p;tt->top = p;tt->size+;int Pop(ST *tt)/出栈NN *p;if (tt->size=0)printf ("ntt对不起,此栈已空!n");getch();return 0;elseprintf("ntt栈顶元素为 %d n",tt->top->pro->data);/%dp = tt->top;tt->top = tt->top->pro;free(p);tt->top->next=NULL;if (!(tt->top->next)tt->size-;printf("ntt出栈成功!栈中还有%d个元素!按任意键继续.n",tt->size);getch();return 1;void Show(ST tt)/显示 全部出栈system("cls");doif (!tt.size)break;elsePop(&tt);while(1);printf("ntt马舒阳汇报完毕完毕!按任意键继续.n");getch();void change()/数值转换ST cc;NN *p;int i,nn,zz,yy,tem_1,tem_2,tem_3;char ch;Initiate(&cc);dosystem("cls");printf("nntt欢迎进入数据转换!nntt(请注意:系统暂不支持十以上进制转换!)n");printf("nntt请输入一个数字! ");scanf("%d",&nn);/%dgetchar();printf("nntt请问已输入的数字是什么进制呢? ");scanf("%d",&zz);/%dgetchar();printf("nntt请问您想要转换到几进制的呢? ");scanf("%d",&yy);/%dgetchar();if(zz>10 | yy>10)printf("ntt待转换的数字进制输入不合理!按任意键回到主菜单.");getch();return ;if(zz!=10)/若不是十进制 要转换成十进制tem_3=1;/变量含义:进制数的n次方tem_2=0;/变量含义:暂时存放和tem_1=1;/变量含义:各项数for(i=0;nn;nn/=10)tem_1=(nn%10)*tem_3 ;tem_2+=tem_1;tem_3*=zz;nn=tem_2;for(;nn;nn/=yy)/大除法入栈if(nn%yy<zz)Push(&cc,nn%yy);elseprintf("ntt待转换的数字进制输入不合理!按任意键回到主菜单.");getch();return ;printf("nntt转换结果为 ");for(;cc.base!=cc.top;)/出栈p = cc.top->pro;printf("%d",p->data);/%dcc.top = p;free(p->next);cc.size-;doprintf("nntt继续? <Y or N> ");ch = getchar();getchar();if(ch != 'N' && ch != 'Y')printf("ntt请输入 Y 或 N !n");elsebreak;while(1);while (ch = 'Y');4、 运行结果欢迎界面,如图所示。图1-1 按任意键继续后进入主菜单,选择菜单号1,进入入栈模块,如图所示。图1-2 开始入栈,输入新的栈顶元素(整型),并输入Y或N选择是否继续,此过程中,输入错误有提示,如图所示,以1,3,5,7,9,2,4,6,8,入栈为例。图1-3图1-4图1-5 选择N,输入结束,然后回到主菜单,下面选择菜单号2,进入出栈模块。图1-6按任意键继续后,回到主菜单,选择菜单号3,显示栈内剩余信息。图1-7图1-8其间,每一次输出可按需要按任意键输出,并显示剩余信息。图1-9图1-10汇报完毕后,即栈已空,按任意键返回到主函数,选择菜单号4 ,进入数制转换模块。图1-11输入被转换的数字,被转换数字的数制及预期数制,并可按需求输入Y或N选择继续或退出。图1-12图1-13退出后返回主菜单,选择0,即可退出程序图1-14图1-15四、题目二设计过程1、题目分析本题要求建立链表,以存储联系人信息,并设计出对其的建立,插入删除显示等基本操作即可。2、 算法描述首先定义一个链表结点结构体,指针域包括一个next指针,数据域包括个人姓名及联系方式。下面仅具体阐述一下各功能模块的工作原理。函数Build,首先判断该表是否已建立过,即表内是否有一个空结点(头结点),表未初始化时便建立一个空表,否则提示“表已存在,无需建立”。提示后延时2s自动跳转到主菜单。插入函数Insert,首先输入有效信息,然后利用头插法将其插入到头指针的下一个结点,再输出提示,提示用户选择N或Y,判断是否继续,若要继续,则递归本函数,否,直接返回主菜单。删除函数Delete,首先判断表是否为空,表为空时,不允许删除,并弹出提示,按任意键继续后后跳转到主菜单;表非空时,输入要删除人的姓名,利用循环查找表中人的信息(暂不支持多元素的查找与删除),若查找成功则输出提示,询问是否确定删除,按需求,删除该结点(暂不支持误删恢复)或取消操作;若查找失败,不存在该联系人,则输出提示。最后按任意键退回到主菜单。查询函数Search,首先判断表是否为空,表为空时,不允许查找,并弹出提示,按任意键继续后后跳转到主菜单;表非空时,输入要查询人的姓名,利用循环查找表中人的信息(暂不支持多元素的查找),然后输出信息,按任意键退回到主菜单。退出函数Exit,先输出表内所有信息,信息输出完毕后,按任意键结束程序。3、源代码MSY.h:#ifndef MSY_H#define MSY_H#include <stdlib.h>#include <stdio.h>/#include <conio.h>#include <windows.h>#define N 20typedef struct Nodechar nameN;char numN;struct Node *next;NODE;void Welcome();void jiemian();int Num();void Build(NODE *head);void insert(NODE *head);void Delete(NODE *head);void Find(NODE *head);void Exit(NODE *head);/待改进:多元素查询/待改进:当head没有初始化,要直接关闭,不允许进行插入和删除等操作#endifFx.c:#include "MSY.h"void jiemian()static NODE *head=NULL;system("cls");printf("nntttt通讯录管理系统n");printf("*n");printf("* 1 通讯录单链表的建立 *n");printf("* 2 通讯者的插入 *n");printf("* 3 通讯者的删除 *n");printf("* 4 通讯者的查询 *n");printf("* 0 退出 *n");printf("*n");printf("t提示:在2,3,4功能执行前,须先执行1.操作! *n");printf("*n");switch(Num()case 1:Build(&head);break;case 2:insert(&head);break;case 3:Delete(head);break;case 4:Find(head);break;case 0:Exit(head);break;int Num()int k;printf("ntt请选择菜单号(04):");scanf("%d",&k);getchar();if(k<0|k>4)printf("ntt输入错误!按任意键继续.");getch();system("cls");jiemian();elsereturn k;void Build(NODE *head)/建立一个有头结点的链表(以头结点是否已存在为判定依据)system("cls");if(*head)!=NULL)printf("nnnn*链表已存在,无需创建!*n");else(*head)=(NODE *)malloc(sizeof(NODE);if( (*head) )(*head)->next=NULL;printf("nn#n");printf("# - 创建成功! - #n");printf("#n");elseprintf("tt内存分配失败!");Sleep(2000);jiemian();void insert(NODE *head)char ch;NODE *p;system("cls");printf("#n");printf("#-INSERT NEW CONTACT-#n");printf("#n");p=(NODE *)malloc(sizeof(NODE);printf("ntt请输入新联系人的姓名(1%d位字母或数字):",N-1);/待改进 判定溢出 及 字符或是数字scanf("%s",&(p->name);printf("nntt请输入新联系人的电话号码(1%d位数字):",N-1);scanf("%s",&(p->num) );getchar();p->next=(*head)->next;(*head)->next=p;if(p=(*head)->next)printf("nn= 插入成功! =n");elseprintf("nn= 插入失败! =n");Sleep(1500);dosystem("cls");printf("#n");printf("#n");printf("nntt是否继续?<Y or N> ");ch=getchar();getchar();if(ch!='N' && ch!='Y')printf("ntt输入有误,按任意键继续");getchar();else if(ch='Y')insert(head);break;while(1);jiemian();void Delete(NODE *head)NODE *n,*p;char ch,nameN;system("cls");printf("#n");printf("#-DELETE-#n");printf("#n");if(!(head->next)printf("nnnnt*通讯录为空!快加入新联系人吧!*n");printf("ntt按任意键继续.");getch();jiemian();printf("nntt请输入欲删除联系人姓名: ");scanf("%s",name);getchar();p=head;doif(!strcmp(p->name,name)break;elsen=p;p=p->next;while(p);if(!p)printf("nn-您所输入的联系人不存在,请查证!-n");elseprintf("nnttTA的电话号码是%s,您确定要删除吗?<Y or N> ",p->num);scanf("%c",&ch);getchar();if(ch!='Y' && ch !='N')printf("ntt输入错误!按任意键继续.");getch();else if(ch='N')printf("nn-删除未成功!- n");else n->next=p->next;free(p);printf("nn - 删除成功! - n");printf("ntt按任意键继续.");getch();jiemian();void Find(NODE *head)NODE *p;char nameN;system("cls");printf("#n");printf("#-SEARCH-#n");printf("#n");if(!(head->next)printf("nnnn*通讯录为空!快加入新联系人吧!*n");printf("ntt按任意键继续.");getch();jiemian();printf("nntt请输入TA的姓名:");scanf("%s",name);getchar();p=head;while(p)if(!strcmp(name,p->name)break;p=p->next;if(p)printf("nttTA的电话号码为%s!n",p->num);elseprintf("nn-您所输入的联系人不存在,请查证!- n");printf("ntt按任意键继续.");getch();jiemian();void Exit(NODE *head)NODE *p;system("cls");printf("#n");printf("#-ALL CONTACTS-#n");printf("#n");p=head->next;while(p)printf("ntt%s的电话号码为%sn",p->name,p->num);p=p->next;/待改进:当head没有初始化,要直接关闭printf("ntt马舒阳汇报完毕,按任意键退出程序.");getch();system("cls");printf("nnnnnntt谢谢使用 程序退出!");printf("nnnnnnttt");printf("按任意键继续.");getch();exit(0);Main.c:#include "MSY.h"void main()Welcome();jiemian();void Welcome()printf("nnnnnnntt欢迎您使用 通讯录管理系统 !nnn ");printf("tttt设计者:马舒