C语言课程设计
姓名:刘显安
学号:09041131
班级:090411
专业:计算机科学与技术
学院:信息工程学院
设计题目:学生通讯录管理系统
指导教师:宋文琳
提交时间:20##年9月4日
课程题目:学生通讯录管理系统
要求:学生通讯录信息包括:学号、姓名、班机、联系电话、E-mail、宿舍等
主要功能:
1、 通讯录信息录入功能
2、 通讯录信息删除功能
3、 通讯录信息浏览功能
4、 通讯录信息查询功能
5、 按学号排序功能
一、总体设计
首先,整个系统必须有一个主函数,为了尽量提高程序的易修改性,且不至于相互干扰,将每一个功能分成不同的模块,用不同的函数来实现,例如在我写的这个程序中,一共用了11个函数,分别是:
主菜单函数menu()、关于函数gaunyu()、帮助函数help()、输出单个学生信息函数shuchu()、输入函数shuru()、输出所有学生信息函数findall()、按姓名查找函数findname()、按学号查找函数findnum()、删除函数shanchu()、排序函数paixu()、主函数main(),这样在整个程序的设计过程中也就一目了然,写起来也相对轻松了不少。
这个程序我只是总体上参考了一下网上程序的架构,具体的各个函数是参照课本上《链表》那一章的内容的,比如结构体的建立、查找和排序等功能,这些书上都有类似的,其中排序功能虽没有原版的,但是在第六章中有一个用冒泡法排序的例题,我就是仿照这个模式来对结构体进行排序的,总之整个程序中蕴含了我很多的汗水。
二、具体设计
关于这个程序的具体设计,也不是一两句话就能说完的,所以我也不想再在这里赘述了,因为程序里都可以看的到,几乎每个函数都倾注了我的大量汗水,我在这上面花了不少的时间,不过从中也收获了很多,因为不停地修改不停的调试,总之还是直接看源程序吧,因为也没必要在这里重复地说废话。
三、源代码
以下是整个程序的源代码,其中我的主菜单函数是很美观的,但由于这里字体和板式的限制,不能很好的显现,可以看我下面程序运行的截图就知道了。
——————————————————
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#define NULL 0
struct student{
long num;
char name[20];
int banji;
char tel[11];
char Email[20];
int sushe;
struct student *next;
};
struct student *stu;
int n;
void menu(void){ /*主菜单函数*/
system("cls");
puts("****************************************************************************");
puts("** ^_^学生通讯录管理系统^_^ **");
puts("****************************************************************************");
puts("******** 计 ********");
puts("******* *******");
puts("****** 算 ******");
puts("***** 0 1=录入学生通讯录信息 *****");
puts("**** 9 刘 2=列出所有学生通讯录 机 ****");
puts("*** 0 3=按姓名查询信息 ***");
puts("** 4 显 4=按学号查询信息 科 **");
puts("* 1 5=删除学生信息 *");
puts("** 1 安 6=按学号将通讯录排序 学 **");
puts("*** 3 7=关于 ***");
puts("**** 1 8=帮助 与 ****");
puts("***** 0=退出 *****");
puts("****** 技 ******");
puts("******* *******");
puts("******** 术 ********");
puts("****************************************************************************");
}
void guanyu() /*关于函数*/
{
system("cls");
puts("\n ************************** ");
puts(" *** 版权所有,翻版必究! ***");
puts("**** copyright◎刘显安! ****");
puts(" *** 2009~2010 ***");
puts(" **************************");
puts("\n返回主菜单请按【9】");
if(getche()=='9') menu();
}
struct student *shuru(void) /*输入函数*/
{
system("cls");
struct student *s1,*s2;
n=1;
int num;
puts("请输入学生个数(提示:个数不能输入0!):");
scanf("%d",&num);
s1=s2=(struct student *)malloc(sizeof(struct student));
puts("*************************************************");
puts("请输入学号:");
scanf("%ld",&s1->num);
puts("请输入学生姓名:");
scanf("%s",s1->name);
puts("请输入班级:");
scanf("%d",&s1->banji);
puts("请输入电话号码:");
scanf("%s",s1->tel);
puts("请输入电子邮件:");
scanf("%s",s1->Email);
puts("请输入学生宿舍号:");
scanf("%d",&s1->sushe);
stu=s1;
while(n<num)
{
s2->next=s1;
s2=s1;
s1=(struct student *)malloc(sizeof(struct student));
puts("*************************************************");
puts("请输入学号:");
scanf("%ld",&s1->num);
puts("请输入学生姓名:");
scanf("%s",s1->name);
puts("请输入班级:");
scanf("%d",&s1->banji);
puts("请输入电话号码:");
scanf("%s",s1->tel);
puts("请输入电子邮件:");
scanf("%s",s1->Email);
puts("请输入学生宿舍号:");
scanf("%d",&s1->sushe);
n=n+1;
}
puts("*************************************************");
s2->next=s1;
s2=s1;
s2->next=NULL;
return(stu);
//system("cls");
}
void shuchu(struct student *s){ /*输出单个学生信息*/
printf("* %-8ld",s->num);
printf("%-15s",s->name);
printf("%-8d",s->banji);
printf("%-15s",s->tel);
printf("%-15s",s->Email);
printf("%-5d *\n",s->sushe);
}
void findall() /*输出所有学生信息*/
{
system("cls");
struct student *s;
//if(n=2)
//printf("\n现在有%d个学生信息,分别是:\n",n);
//else
printf("\n现在有%d个学生信息,分别是:\n",n);
puts("________________________________________________________________________");
puts("* 学号 姓名 班级 电话 电子邮件 宿舍 *");
s=stu;
while(s!=NULL)
{
shuchu(s);
s=s->next;
}
puts("________________________________________________________________________");
puts("返回主菜单请按【9】");
if(getche()=='9') menu();
}
void findname(){ /*按姓名查找函数*/
system("cls");
struct student *s;
char name[20];
printf("\n请输入你要查询的学生姓名:\n");
scanf("%s",name);
s=stu;
while(strcmp(s->name,name)!=0)
{
s=s->next;
}
if(s==NULL)
{
puts("查无此学生姓名!");
goto end;
}
else
{
puts("该学生的信息为:");
puts("* 学号 姓名 班级 电话 电子邮件 宿舍 *");
shuchu(s);
}
end:;
puts("返回主菜单请按【9】");
if(getche()=='9') menu();
}
void findnum() /*按学号查找函数*/
{
system("cls");
struct student *s;
puts("请输入你要查询的学生学号:");
long i;
scanf("%ld",&i);
s=stu;
while(s->num!=i)
{
s=s->next;
}
if(s==NULL)
{puts("查无此学生学号!");goto end;}
else
{
puts("该学生的信息为:");
puts("* 学号 姓名 班级 电话 电子邮件 宿舍 *");
shuchu(s);
}
end:;
puts("返回主菜单请按【9】");
if(getche()=='9') menu();
}
struct student *shanchu(struct student*stu) /*删除函数*/
{
system("cls");
long num;
char s;
struct student *s1,*s2;
if(stu==NULL)
{
puts("傻冒!没有任何学生信息,还删个屁啊,删删删!");
goto end;
}
puts("请输入你要删除的学生学号:");
scanf("%ld",&num);
s1=stu;
puts("警告:你确定要删除这个学生的信息吗(Y/N)?");
scanf("%s",&s);
if((s=='Y')||(s=='y'))
{
while((num!=s1->num)&&(s1->next!=NULL))
{s2=s1;s1=s1->next;}
if(num==s1->num)
{ puts("该学生的信息为:");
puts("* 学号 姓名 班级 电话 电子邮件 宿舍 *");
shuchu(s1);
if(s1==stu)
stu=s1->next;
else
s2->next=s1->next;
puts("注意哟,该学生的信息已经删除了!剩下的学生通讯录信息如下:");
n=n-1;
}
}
findall();
return(stu);
end:;
puts("返回主菜单请按【9】");
if(getche()=='9') menu();
}
void paixu(){ /*排序函数*/
struct student *p, *p1,*p2;
int i,j;
int temp;
char b[20];
if(stu==NULL)
{printf("\n学生信息不存在\n");
goto end;
}
for(i=0;i<n-1;i++)
{p1=stu;
for(j=0;j<n-1;j++)
{
p2=p1->next;
if(p1->num>p2->num)
{temp=p1->num;p1->num=p2->num;p2->num=temp;
strcpy(b,p1->name);strcpy(p1->name,p2->name);strcpy(p2->name,b);
temp=p1->banji;p1->banji=p2->banji;p2->banji=temp;
strcpy(b,p1->tel);strcpy(p1->tel,p2->tel);strcpy(p2->tel,b);
strcpy(b,p1->Email);strcpy(p1->Email,p2->Email);strcpy(p2->Email,b);
temp=p1->sushe;p1->sushe=p2->sushe;p2->sushe=temp;
}
p1=p1->next;
}
}
p=stu;
puts("已按学生学号顺序排序完毕!重新排序如下:");
puts("****************************************************************************");
puts("* 学号 姓名 班级 电话 电子邮件 宿舍 *");
while(p!=NULL)
{
printf("* %-8ld",p->num);
printf("%-15s",p->name);
printf("%-8d",p->banji);
printf("%-15s",p->tel);
printf("%-15s",p->Email);
printf("%-5d *\n",p->sushe);
p=p->next;
}
end:;
puts("返回主菜单请按【9】");
if(getche()=='9')
menu();
}
void help() /*帮助函数*/
{
system("cls");
puts("\n1、请按提示操作,第一次进入本系统时请按“1”录入学生信息,");
puts(" 否则有可能造成程序运行错误!");
puts("2、添加、修改功能本系统暂不提供,还有待以后完善,谢谢合作!");
puts("3、请注意查看“Num Lock”是否打开,如果没有打开,则按数字\n 键可能导致程序错误!");
puts("4、版权所有,翻版必究!请按“7”键查看关于。");
puts("\n返回主菜单请按【9】");
if(getche()=='9') menu();
}
void main() /*主函数*/
{
char a;
menu();
puts("\n您为首次使用本系统,强烈建议您按1开始录入学生信息,");
puts("否则有可能导致程序运行错误!您可以按8查看帮助.");
a=getche();
while(a){
puts("");
switch(a)
{case'0':goto end;break;
case '1':
puts("\n好了,您可以开始向本系统录入学生通讯录信息了:");
stu=shuru();
system("cls");
menu();
puts("\n学生信息录入完毕,请输入你的选择(0~6):\n");
break;
case '2':findall();puts("\n请输入你的选择(0~6):"); break;
case '3':findname();puts("\n请输入你的选择(0~6):"); break;
case '4':findnum();puts("\n请输入你的选择(0~6):"); break;
case '5':stu=shanchu(stu);puts("\n请输入你的选择(0~6):"); break;
case '6':paixu();puts("\n请输入你的选择(0~6):"); break;
case '7':guanyu();puts("\n请输入你的选择(0~6):"); break;
case '8':help();puts("\n请输入你的选择(0~6):"); break;
default:puts("输错了!笨蛋!快点按数字1键录入学生信息吧!"); break;
}
a=getche();
}
end:;
puts("谢谢您使用本系统,欢迎再次使用!");
}
—————————————————————————
四、调试
主要是通过截图来显示运行过程
以下是程序运行的主界面:
按1后,开始录入信息,程序会提示你输入学生个数(例如本例中输入4个),当输完4个学生的信息时,程序会提示你已输入完毕:
学生信息录入完毕,提示输入(0到6)进行选择:
这时我选择按2输出所有学生信息,按9返回:
按3按姓名查询信息:
按4按学号查询信息:
按5删除学生信息,这是按学号删除学生信息,本例中,删除学号为41212的学生信息:
删除成功后,系统自动将剩下的学生信息列出:
按6按学号从小到大进行排序,可以发现,排序成功:
按8查看帮助函数:
呵呵,这是我设置的关于函数,满足一下敝人的虚荣心嘛^_^,版权所有,翻版必究哦!
最后按0退出系统:
呵呵,怎么样?我写的程序还行吧。
嘿嘿……
三、总结
这个程序我只是总体上参考了一下网上程序的架构,具体的各个函数是参照课本上《链表》那一章的内容的,比如结构体的建立、查找和排序等功能,这些书上都有类似的,其中排序功能虽没有原版的,但是在第六章中有一个用冒泡法排序的例题,我就是仿照这个模式来对结构体进行排序的,总之整个程序中蕴含了我很多的汗水。