该门课程成绩我的为优秀,仅供参考。
前言
在最近的一次课程设计中,我深刻地体会到了理论和实践的结合对于程序设计的重要性。在这个过程中我遇到了很多问题,意识到理论知识和实践应用之间存在一定的差距。因此,需要更多的实践来加深对于理论知识的理解和掌握。
针对学生籍贯管理系统的设计,需要将各个子程序进行衔接,并且需要对整个系统的结构非常熟悉才能达到预期效果。在这个过程中,我深刻认识到了程序设计的灵活性以及解决问题的逻辑思维和创新能力的重要性。同时,在处理程序报错的过程中,也让我深入理解了动手能力的重要性。
通过这次课程设计,我也充分认识到了团队合作的重要性,只有分工协作才能保证整个项目的顺利进行。在和小组同学的讨论和共同学习下,我也更加具备了坚持、耐心和合作的能力,这些也将为自己今后的学习和工作做出了最好的榜样。
在这次课程设计中,除了加深对于理论知识的掌握和实践应用的经验外,我也学会了如何面对程序设计过程中的挫折和困难。在程序报错或者遇到难题时,我不再焦急或者放弃,而是能够冷静分析问题并采取相应的解决方法。这种自信和处理问题的能力,将对我的未来成长和发展产生积极的影响。
此外,在整个课程设计过程中,我也学会了如何合理分配时间和资源,从而优化设计方案。在处理每一个子程序时,我不仅获得了实际操作的经验,也意识到了时间管理和资源利用的重要性。这些技能也将有助于我更好地规划和执行未来的项目任务。
作为一名数据科学与大数据技术专业的学生,这次课程设计对于我来说是很有意义的。虽然在开始时我感到很难,但是通过自身的坚持和不断地学习,我对这门课程产生了更大的兴趣,并且相信我一定可以学好做精这项技术。
在这次课程设计中,我的收获非常大。一开始我按照老师分配的课题从参考书上找来了课题,但是发现很多程序都是不完整的,这让我很苦恼。但是通过和小组同学的共同努力和动脑完成了任务,我也深刻体会到了团队合作的意义和重要性。
总之,这次课程设计意义深远,我在其中收获了很多,并且感谢老师和同学们的支持和帮助。虽然在设计过程中可能还存在一些错误,但是我愿意接受批评和指正,并将继续努力学习和提高自己的能力。
第一章 概述
- 目的:建立学生籍贯管理系统,对学生籍贯相关信息进行管理,为了方便组织各项类似于老乡联谊会、号召回母校进行大学招生宣传等活动以及统计各省市在校生的表现与其所在地的相关性来进行划分每一年对各省市的招生名额,还有记录本校生的联系方式得以在该生毕业后询问并统计其读研院校、就业情况、薪资、职业以及职业所在地等信息,用来制作升学率以及就业率表格汇报给省教育厅以及国家教育局和作为招生宣传的信息供考生参考。
- 要求:建立学生籍贯管理系统,对学生籍贯相关信息进行管理;实现对学生籍贯信息的录入、查找、修改、删除、插入等功能;建立系统的存储结构,快速查找对应学生的籍贯信息。
【题目】建立学生籍贯管理系统,对学生籍贯相关信息进行管理。学生的相关信息包括 学生学号、姓名、电话号码、身份证号码、籍贯和通讯地址等。具体要求如下:
(1)建立该系统的存储结构。
(2)录入学生的相关信息。
(3)查找某个学生的籍贯。
(4)修改某个学生的籍贯。
(5)删除某个学生的相关信息。
(6)插入某个学生的相关信息。
将每个学生记录当作一个结点,类型为结构体,结构体中包含学生的相关 信息和结点指针.定义联系人结点的结构为
struct node
{ char no[12];/*学号*/
char name[40];/*姓名*/
char tele[20];/*电话号码*/
int D[18] ;/*身份证号码*/
char jg[60];/*籍贯*/
char addr[80];/*通讯地址*/
struct node *link;/*指向下一结点的指针*/
};
编写查找函数,首先输入要查找的学号或身份证号,然后顺序查找结点,如果找到, 则显示找到的记录,之后继续向下查找直至链表结尾。删除某个结点时,可调用查找函数 如果没找到则输出没找到信息;如果找到则分3种情况讨论:①该结点为头结点时,修改 原头结点所指向的结点为新的头结点;②该结点为中间结点时,修改该结点的前一结点的 指针,使其指向该结点的后一结点;③该结点为尾结点时,修改原尾结点的前一结点为 的尾结点。最后释放该结点。
编译器:Dev C++ 5.11 开发环境:Windows 11系统
第二章 学生籍贯管理系统需求分析
- 建立学生籍贯管理系统,对学生籍贯相关信息进行管理。
- 实现对学生籍贯信息的录入、查找、修改、删除、插入等功能。
- 建立系统的存储结构,快速查找对应学生的籍贯信息。
- 主要功能:可以快速录入、查找、修改、删除和插入学生的信息。
(2)具体功能:系统会提供给管理员、教师和学生八个功能选项并指出输入方式,详细功能如下所示:
<1>录入学生信息:需要校方管理人员和教师人为输入在校持续就读学生信息或者安排学生自己填写,系统会根据管理人员所想要录入的学生人数提示管理员按照顺序依次录入每一位学生的学号、姓名、电话号码、身份证号码、籍贯和通讯地址等学生信息。
<2>查看全部学生的相关信息:管理员、教师和学生输入系统所设置的对应选项即可查看全部学生的相关信息。
<3>查找某个学生的籍贯:管理员和教师输入对应选项后按照系统的提示输入想要查询的学生的姓名即可查询该学生的相关信息。
<4>修改某个学生的籍贯:管理员输入对应选项后按照系统的提示输入想要修改的学生的姓名即可修改该学生的相关信息。
<5>删除某个学生的相关信息:管理员输入对应选项后按照系统的提示输入想要删除的学生的姓名即可删除该学生的相关信息。
<6>插入某个学生的相关信息:管理员输入对应选项后按照系统的提示依次输入想要插入的学生的学号、姓名、电话号码、身份证号码、籍贯和通讯地址等信息即可插入该学生的相关信息。
<7>保存学生信息:管理员、教师和学生输入对应选项后即可将学生的相关信息存储于与系统源程序在同一目录的student.txt文件夹中以便后续查看。
<8>退出管理系统:管理员和教师输入对应选项后即可退出本系统。
(3)系统功能结构图
图2-1 主系统功能结构图
图2-2 学生籍贯管理系统功能结构图
(1)优点:可供使用者方便快捷的录入、查找、修改、删除和插入学生的信息。操作简单易懂且系统会根据操作者所选的选项进行下一步的提示,逻辑结构十分严谨,适用于以班级为单位广泛使用。
(2)缺点:因为需要管理员依次输入每一位学生的学号、姓名、电话号码、身份证号码、籍贯和通讯地址等学生信息,所以只适用于一次性储存100人左右的数据而且需要消耗一定的时间,比较适用于以班级为单位广泛使用。
- 简化输入方式,提供导入数据的功能,这样就可以一次性录入院校级别的学生籍贯信息,极大的方便了管理员的工作并节约了很多时间。
- 强化系统记忆功能,对学号这一类有规律且逐个递增的数据,在管理员输入开头的数据后按照顺序自动补全数据。
注:(1)中方法最有效但依赖的技术太高,需要开发者花费大量时间。
(2)中方法效率没有方法1高,但是不需要开发者花费大量时间去提供技术支持。
原系统比较完美,以上方法请酌情采用。
第三章 学生籍贯管理系统算法设计
3.1主要算法流程图和代码
- 主函数算法流程图和实现代码
算法流程图:
图 3-1 主函数算法流程图
实现代码:
int main()
{
int item, n; //item用于接收菜单输入的命令,n用于接收输入的学生人数
char nam[30];
STU* L = NULL;
L = LIstInit(L);
do
{
menu1();
printf("请输入相应的数字,进行相应的操作:\n");
scanf("%d", &item);
switch (item)//switch语句编写菜单选项
{
case 1:
findMersennePrimes(); // 求指数n<30的所有梅森素数并输出
break;
case 2:
xuanmei();
break;
case 3:
do
{
menu2();
printf("请输入相应的数字,进行相应的操作:\n");
scanf("%d", &item);
switch (item)//switch语句编写菜单选项
{
case 1:
printf("请输入您要录入的学生人数:");
scanf("%d", &n);
L = ListCreate(L, n);
break;
case 2:
printf("全部学生信息如下:\n");
printf("学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
output(L);
break;
case 3:
printf("请输入您要查找的学生姓名:");
scanf("%s", nam);
LIstSearch(L, nam);
break;
case 4:
printf("请输入您要修改的学生姓名:");
scanf("%s", nam);
ListModify(L, nam);
break;
case 5:
printf("请输入您要删除的学生的姓名:");
scanf("%s", nam);
ListDelete(L, nam);
break;
case 6:
ListInsert(L);
break;
case 7:
PrintFile(L);
break;
case 0:
printf("您已经完成了学生籍贯管理系统的工作,祝您工作顺利!");
printf("即将退出学生籍贯管理系统.....");
printf("下班啦,嘿嘿嘿!");
exit(0);
default:
printf("输入格式错误,请重新输入");
break;
}
printf("\n\n\n\n");
} while (item);
case 0:
printf("即将退出本系统.....");
exit(0);
default:
printf("输入格式错误,请重新输入");
break;
}
printf("\n\n\n\n");
} while (item);
return 0;
}
- isPrime(int n)函数算法流程图和实现代码
算法流程图:
图 3-2 判断素数算法流程图
实现代码:
int isPrime(int n) {
if (n <= 1) return 0;
int i;
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
- findMersennePrimes()函数算法流程图和实现代码
算法流程图:
图 3-3 判断梅森素数算法流程图
实现代码:
void findMersennePrimes() {
int n, i, t = 2, count = 0;
printf("指数n<30的所有梅森素数:\n");
for (n = 2; n < 30; n++) {
t = pow(2, n) - 1; // 求t=2的n次方-1
if (isPrime(t)) { // 判断t是否为素数
printf("%-10d ", t); // 输出结果
count++;
if (count % 5 == 0) { // 每行输出5个梅森素数
printf("\n");
}
}
}
printf("\n");
printf("您已经完成了指数n<30的所有梅森素数的求取,祝您工作顺利!");
}
- ListInsert(STU* L)函数算法流程图和实现代码
算法流程图:
图 3-4 插入某个学生的相关信息的函数算法流程图
实现代码:
void ListInsert(STU* L)//插入学生的相关信息的函数
{
STU* s = NULL;
//生成一个新节点s
s = (STU*)malloc(sizeof(STU));
printf("请输入您要插入的学生的学号:");
scanf("%s", &s->no);
printf("请输入您要插入的学生的姓名:");
scanf("%s", &s->name);
printf("请输入您要插入的学生的电话号码:");
scanf("%s", &s->tele);
printf("请输入您要插入的学生的身份证号码:");
scanf("%s", &s->D);
printf("请输入您要插入的学生的籍贯:");
scanf("%s", &s->jg);
printf("请输入您要插入的学生的通讯地址:");
scanf("%s", &s->addr);
s->next = L->next;
L->next = s;
printf("插入成功!");
}
- ListDelete(STU* L, char n[40])函数算法流程图和实现代码
算法流程图:
图3-5 删除某个学生的相关信息的函数的算法流程图
实现代码:
void ListDelete(STU* L, char n[])//删除某个学生的信息的函数
{
STU* p = L->next, * pre = L; //定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点
if (p == NULL)
printf("数据为空,无法删除!");
else
{
while (strcmp(p->name, n) != 0)
{
pre = p;
p = pre->next;
if (p == NULL)
{
printf("没有找到相关信息,无法删除\n");//判断文件是否存在,是否删除成功
return;
}
}
pre->next = p->next;
free(p);
printf("删除成功");
}
}
- LIstSearch(STU* L, char n[])函数算法流程图和实现代码
算法流程图:
图 3-6 查找学生信息函数算法流程图
实现代码:
void LIstSearch(STU* L, char n[])//查找某个学生的信息的函数
{
STU* p = L->next;
if (p == NULL)
printf("数据为空,无法查找!");
else
{
while (strcmp(p->name, n) != 0)
{
p = p->next;
if (p == NULL)
{
printf("没有找到相关信息\n");//判断文件是否存在,是否查找成功
return;
}
}
printf("该学生的籍贯为:\n");
printf("\t%s\n", p->jg);
}
}
- input(STU* p, int i)函数算法流程图和实现代码
算法流程图:
图 3-7 录入学生信息的函数的算法流程图
实现代码:
void input(STU* p, int i)//录入学生信息的函数
{
printf("请输入第%d名学生的学号:", i + 1);
scanf("%s", &p->no);
printf("请输入第%d名学生的姓名:", i + 1);
scanf("%s", &p->name);
printf("请输入第%d名学生的电话号码:", i + 1);
scanf("%s", &p->tele);
printf("请输入第%d名学生的身份证号码:", i + 1);
scanf("%s", &p->D);
printf("请输入第%d名学生的籍贯:", i + 1);
scanf("%s", &p->jg);
printf("请输入第%d名学生的通讯地址:", i + 1);
scanf("%s", &p->addr);
}
- output(STU* L)函数算法流程图和实现代码
算法流程图:
图 3-8 输出函数的算法流程图
实现代码:
void output(STU* L)//输出函数
{
STU* p = L->next;
while (p != NULL)
{
printf("%s\t", p->no);
printf("%s\t", p->name);
printf("\t%s", p->tele);
printf("\t\t%s", p->D);
printf("\t%s", p->jg);
printf("\t%s", p->addr);
printf("\n");
p = p->next;
}
}
- PrintFile(STU* L)函数算法流程图和实现代码
算法流程图:
图 3-9 保存学生信息的函数算法流程图
实现代码:
void PrintFile(STU* L)//保存学生信息的函数
{
STU* p = L->next;
FILE* fp;
fp = fopen("student.txt", "w");
fprintf(fp, "学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
while (p != NULL)
{
fprintf(fp, "%s\t", p->no);
fprintf(fp, "%s\t", p->name);
fprintf(fp, "\t%s", p->tele);
fprintf(fp, "\t%s", p->D);
fprintf(fp, "\t%s", p->jg);
fprintf(fp, "\t\t%s", p->addr);
fprintf(fp, "\n");
p = p->next;
}
printf("保存成功,请到当前目录下的student.txt文件中查看");
fclose(fp);
}
- ListModify(STU* L, char na[])函数算法流程图和实现代码
算法流程图:
图 3-10 修改信息函数算法流程图
实现代码;
void ListModify(STU* L, char na[])//修改某个学生的信息的函数
{
char JG[60];
STU* p = L->next;
while (p != NULL)
{
if (strcmp(p->name, na) == 0)
{
printf("请选择您修改后的学生籍贯:\n");
scanf("%s", &JG);
strcpy(p->jg, JG);
break;
}
p = p->next;
}
}
- xuanmei()函数算法流程图和实现代码
算法流程图:
图 3-11 选美比赛排名函数算法流程图
实现代码:
void xuanmei()
{
int j,n,i;
int a[101],book[50],b[101],c[10000];//定义存储选手序号、选手得分、选手名次的数组
printf("请输入选手数量:");
scanf("%d",&n);//输入选手数量
printf("请依次输入选手序号(用空格隔开):");
for(i=0;i<n;i++)//输入选手序号
{
scanf("%d",&c[i]);
}
printf("请依次输入选手得分(用空格隔开):");
for(i=0;i<n;i++)//输入选手得分
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//排序
{
int count=1;
memset(book,0,sizeof(book));
for(j=0;j<n;j++)
{
if(a[j]>a[i]&&book[a[j]]==0)
{
book[a[j]]=1;
count++;
}
}
b[i]=count;
}
printf("各位选手的名次如下:");
for(i=0;i<n;i++)//输出选手名次
{
if(i==0)
printf("%d",b[i]);
else
printf(" %d",b[i]);
}
printf("\n");
printf("您已经完成了选美比赛成员的排名工作,祝您工作顺利!");
}
(1)求梅森素数所用数据类型:均为整型
(2)选美比赛评分排名所用数据类型:均为整型
(3)选美比赛评分排名所用数据结构:数组
(1)isPrime(int n)是判断素数的函数
(2)findMersennePrimes()是调用判断素数的函数的判断梅森素数函数
(3)xuanmei()是选美比赛排名函数
(4)ListInsert(STU* L)是插入学生的相关信息的函数且系统提示依次输入想要插入的学生的学号、姓名、电话号码、身份证号码、籍贯和通讯地址等信息。
(5)ListDelete(STU* L, char n[40])是删除某个学生的信息的函数且系统提示输入想要删除的学生的姓名即可删除该学生的相关信息。
(6)LIstSearch(STU* L, char n[])是查找某个学生的信息的函数且系统的提示输入想要查询的学生的姓名即可查询该学生的相关信息。
(7)input(STU* p, int i)是录入学生的相关信息的函数且系统会根据管理人员所想要录入的学生人数提示管理员按照顺序依次录入每一位学生的学号、姓名、电话号码、身份证号码、籍贯和通讯地址等学生信息。
(8)output(STU* L)是输出学生信息的函数且录入后即可输出
(9)PrintFile(STU* L)是保存学生信息的函数且直接保存录入、修改过后的的学生信息
(10)ListModify(STU* L, char na[])是修改某个学生的信息的函数
(11)menu1()是主系统菜单函数调用以上函数实现菜单界面如下:
<1>求指数n<30的梅森素数
<2>. 选美比赛排名
<3>. 学生籍贯管理系统
<0>. 退出系统
(12)menu2()是学生籍贯管理系统菜单函数调用以上函数实现菜单界面如下:
<1>. 录入学生的相关信息
<2>. 查看全部学生的相关信息
<3>. 查找某个学生的籍贯 ;
<4>. 修改某个学生的籍贯
<5>. 删除某个学生的相关信息
<6>. 插入某个学生的相关信息
<7>. 保存学生信息
<0>. 退出管理系统
Dev C++是一个免费的、开源的、轻量级的C/C++集成开发环境(IDE),可在Windows平台上运行。
(1)它是由Bloodshed Software开发的,已被多个社区继续维护和更新。Dev C++提供了丰富的功能和工具,包括代码高亮、代码提示、调试器、编译器、自动完成等,支持多种编程语言和库,并可扩展和自定义。
(2)Dev C++采用了基于Mingw(Minimalist GNU for Windows)的GCC编译器,可以帮助程序员轻松地编写、编译、调试和运行C/C++程序。它还支持多种文件格式的导入和导出,如.c、.cpp、.h、.rc、.def、.dll、.lib等,可以方便地管理和分享代码。
(3)该软件界面简洁、易于使用,适合初学者和专业开发人员使用。除了基础的C/C++编译环境外,还支持WinAPI、OpenGL等图形界面库,为用户提供了更加直观的程序开发界面。
总而言之,Dev C++是一个非常实用和高效的集成开发环境,可用于开发各种C/C++应用程序。
第四章 编码
typedef struct student//定义储存学生信息的结构体
{
char no[12]; //学号
char name[40]; //姓名
char tele[20]; //电话号码
int D[18]; //身份证号码
char jg[60]; //籍贯
char addr[80]; //通讯地址
struct student* next; //指向下一节点的指针
}STU;//后面可用STU定义变量或数组存放学生信息
结构体应用题目:学生籍贯管理系统。
结构体类型成员介绍:
- char no[12];学生的学号
- char name[40]; 学生的姓名
- char tele[20];学生的电话号码
- int D[18];学生的身份证号码
- char jg[60]; 学生的籍贯
- char addr[80];学生的通讯地址
4.2全局变量与符号常量
- 全局变量有:
int item, n; //item用于接收输入的命令,n用于接收输入的学生人数
char no[12]; //学号
char name[40]; //姓名
char tele[20]; //电话号码
int D[18]; //身份证号码
char jg[60]; //籍贯
char addr[80]; //通讯地址
应用题目:学生籍贯管理系统
- 符号常量有:
#define M 30
应用题目:求梅森素数
表4-1 函数简介
4.4主要功能的代码
求梅森素数:
//梅森素数
// 判断一个数是否为素数
int isPrime(int n) {
if (n <= 1) return 0;
int i;
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
// 求指数n<30的所有梅森素数并输出
void findMersennePrimes() {
int n, i, t = 2, count = 0;
printf("指数n<30的所有梅森素数:\n");
for (n = 2; n < 30; n++) {
t = pow(2, n) - 1; // 求t=2的n次方-1
if (isPrime(t)) { // 判断t是否为素数
printf("%-10d ", t); // 输出结果
count++;
if (count % 5 == 0) { // 每行输出5个梅森素数
printf("\n");
}
}
}
printf("\n");
printf("您已经完成了指数n<30的所有梅森素数的求取,祝您工作顺利!");
}
选美比赛评分排名:
//选美比赛
void xuanmei()
{
int j,n,i;
int a[101],book[50],b[101],c[10000];//定义存储选手序号、选手得分、选手名次的数组
printf("请输入选手数量:");
scanf("%d",&n);//输入选手数量
printf("请依次输入选手序号(用空格隔开):");
for(i=0;i<n;i++)//输入选手序号
{
scanf("%d",&c[i]);
}
printf("请依次输入选手得分(用空格隔开):");
for(i=0;i<n;i++)//输入选手得分
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//排序
{
int count=1;
memset(book,0,sizeof(book));
for(j=0;j<n;j++)
{
if(a[j]>a[i]&&book[a[j]]==0)
{
book[a[j]]=1;
count++;
}
}
b[i]=count;
}
printf("各位选手的名次如下:");
for(i=0;i<n;i++)//输出选手名次
{
if(i==0)
printf("%d",b[i]);
else
printf(" %d",b[i]);
}
printf("\n");
printf("您已经完成了选美比赛成员的排名工作,祝您工作顺利!");
}
学生籍贯管理系统:
//学生籍贯管理系统
//定义一个学生结构体
typedef struct student//定义储存学生信息的结构体
{
char no[12]; //学号
char name[40]; //姓名
char tele[20]; //电话号码
int D[18]; //身份证号码
char jg[60]; //籍贯
char addr[80]; //通讯地址
struct student* next; //指向下一节点的指针
}STU;//后面可用STU定义变量或数组存放学生信息
//创建表头,初始化链表
STU* LIstInit(STU* L)
{
STU* head = NULL;
head = (STU*)malloc(sizeof(STU));
head->next = NULL;
L = head;
return L;
}
//创建链表,将新生成的节点插入到链表的表头
STU* ListCreate(STU* L, int n)
{
int i;
for (i = 0; i < n; i++)
{
STU* p;
//将新生成的节点插入到链表中
p = NULL;
p = (STU*)malloc(sizeof(STU));
input(p, i);
p->next = L->next;
L->next = p;
}
return L;
}
//对链表进行节点的插入操作
void ListInsert(STU* L)//插入学生的相关信息的函数
{
STU* s = NULL;
//生成一个新节点s
s = (STU*)malloc(sizeof(STU));
printf("请输入您要插入的学生的学号:");
scanf("%s", &s->no);
printf("请输入您要插入的学生的姓名:");
scanf("%s", &s->name);
printf("请输入您要插入的学生的电话号码:");
scanf("%s", &s->tele);
printf("请输入您要插入的学生的身份证号码:");
scanf("%s", &s->D);
printf("请输入您要插入的学生的籍贯:");
scanf("%s", &s->jg);
printf("请输入您要插入的学生的通讯地址:");
scanf("%s", &s->addr);
s->next = L->next;
L->next = s;
printf("插入成功!");
}
删除函数:
//对链表的进行节点的删除操作
void ListDelete(STU* L, char n[])//删除某个学生的信息的函数
{
STU* p = L->next, * pre = L; //定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点
if (p == NULL)
printf("数据为空,无法删除!");
else
{
while (strcmp(p->name, n) != 0)
{
pre = p;
p = pre->next;
if (p == NULL)
{
printf("没有找到相关信息,无法删除\n");//判断文件是否存在,是否删除成功
return;
}
}
pre->next = p->next;
free(p);
printf("删除成功");
}
}
查找函数:
void LIstSearch(STU* L, char n[])//查找某个学生的信息的函数
{
STU* p = L->next;
if (p == NULL)
printf("数据为空,无法查找!");
else
{
while (strcmp(p->name, n) != 0)
{
p = p->next;
if (p == NULL)
{
printf("没有找到相关信息\n");//判断文件是否存在,是否查找成功
return;
}
}
printf("该学生的籍贯为:\n");
printf("\t%s\n", p->jg);
}
}
修改函数:
void ListModify(STU* L, char na[])//修改某个学生的信息的函数
{
char JG[60];
STU* p = L->next;
while (p != NULL)
{
if (strcmp(p->name, na) == 0)
{
printf("请选择您修改后的学生籍贯:\n");
scanf("%s", &JG);
strcpy(p->jg, JG);
break;
}
p = p->next;
}
}
录入函数:
void input(STU* p, int i)//录入学生信息的函数
{
printf("请输入第%d名学生的学号:", i + 1);
scanf("%s", &p->no);
printf("请输入第%d名学生的姓名:", i + 1);
scanf("%s", &p->name);
printf("请输入第%d名学生的电话号码:", i + 1);
scanf("%s", &p->tele);
printf("请输入第%d名学生的身份证号码:", i + 1);
scanf("%s", &p->D);
printf("请输入第%d名学生的籍贯:", i + 1);
scanf("%s", &p->jg);
printf("请输入第%d名学生的通讯地址:", i + 1);
scanf("%s", &p->addr);
}
输出函数:
void output(STU* L)//输出函数
{
STU* p = L->next;
while (p != NULL)
{
printf("%s\t", p->no);
printf("%s\t", p->name);
printf("\t%s", p->tele);
printf("\t\t%s", p->D);
printf("\t%s", p->jg);
printf("\t%s", p->addr);
printf("\n");
p = p->next;
}
}
保存函数:
void PrintFile(STU* L)//保存学生信息的函数
{
STU* p = L->next;
FILE* fp;
fp = fopen("student.txt", "w");
fprintf(fp, "学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
while (p != NULL)
{
fprintf(fp, "%s\t", p->no);
fprintf(fp, "%s\t", p->name);
fprintf(fp, "\t%s", p->tele);
fprintf(fp, "\t%s", p->D);
fprintf(fp, "\t%s", p->jg);
fprintf(fp, "\t\t%s", p->addr);
fprintf(fp, "\n");
p = p->next;
}
printf("保存成功,请到当前目录下的student.txt文件中查看");
fclose(fp);
}
主菜单函数:
void menu1()//菜单函数
{
printf("\n\n");
printf("\t\t\t*******************C语言课程设计***********************\n");
printf("\t\t\t* 作者:魏永雷 班级:数据科学221 学号:3220706134 *\n");
printf("\t\t\t* *\n");
printf("\t\t\t* <1>. 求指数n<30的梅森素数 *\n");
printf("\t\t\t* <2>. 选美比赛 *\n");
printf("\t\t\t* <3>. 学生籍贯管理系统 *\n");
printf("\t\t\t* <0>. 退出系统 *\n");
printf("\t\t\t* 欢迎使用本系统! *\n");
printf("\t\t\t*******************************************************\n");
printf("\t\t\t输入选项,按回车进入选项: \n");
}
学生籍贯管理系统菜单函数:
void menu2()//菜单函数
{
printf("\n\n");
printf("\t\t\t*******************学生籍贯管理系统********************\n");
printf("\t\t\t* 作者:魏永雷 班级:数据科学221 学号:3220706134 *\n");
printf("\t\t\t* *\n");
printf("\t\t\t* <1>. 录入学生的相关信息 *\n");
printf("\t\t\t* <2>. 查看全部学生的相关信息 *\n");
printf("\t\t\t* <3>. 查找某个学生的籍贯 *\n");
printf("\t\t\t* <4>. 修改某个学生的籍贯 *\n");
printf("\t\t\t* <5>. 删除某个学生的相关信息 *\n");
printf("\t\t\t* <6>. 插入某个学生的相关信息 *\n");
printf("\t\t\t* <7>. 保存学生信息 *\n");
printf("\t\t\t* <0>. 退出管理系统 *\n");
printf("\t\t\t* 欢迎使用本系统! *\n");
printf("\t\t\t*******************************************************\n");
printf("\t\t\t输入选项,按回车进入选项: \n");
}
第五章 运行与调试
(1)首先您会来到主系统界面
图 5-1 主系统界面
(2)调试结果
图 5-2 调试结果
如果您想要求指数n<30的梅森素数,那么输入1即可求得,如图:
图5-3 求梅森素数
如果您想对选美比赛进行排名,跟随系统的提示输入成员信息即可排名,如图:
图 5-4 选美比赛排名
首先您会来到学生籍贯管理系统主界面,如图:
图 5-5 学生籍贯管理系统主界面
- 如果您要录入学生的相关信息,输入1即可,如图:
图 5-6 录入信息功能
- 如果您要查看全部学生的信息,输入2即可,如图:
图 5-7 查看信息功能
- 如果您想要查找某个学生的籍贯,输入该学生的姓名即可查询,如图:
图 5- 8 查找学生信息
- 如果您想修改学生的籍贯,直接搜索该学生即可修改,如图:
图 5-9 修改功能
图 5-10 修改成功
- 如果您想要删除某个学生的信息,输入该学生的姓名即可删除,如图:
图 5-11 删除功能
图 5-12 删除成功
- 如果您想要插入学生的信息,直接输入6并根据提示输入即可,如图:
图 5-13 插入功能
图 5-14 插入成功
- 如果您想要保存学生信息,直接按7保存(保存在同目录下的student文件中)。如图:
图 5-15 保存功能
图 5-16 保存成功
- 如果您要退出系统,输入0即可(您会收到我的祝福哦),入土:
图 5-17 退出成功
第六章 小结
作为一名学生,在校期间我们所学的知识不仅仅是书本上的理论,更需要将这些知识运用到实际中去。而这次参与的课程设计正是一个很好的机会,让我更加深入的了解了项目开发的部分过程。
这两周的时间虽然短暂,但是收获颇丰。在项目的开发中,我意识到知道一些理论并不意味着就能够完成良好的设计,还需要对用户需求进行详细的调查和分析,否则就可能会出现设计方案不合理或者无法满足用户需求的情况。因此,我们在项目开始前需要做好充分的调研工作,并根据不同的用户需求来进行不同的设计。
在整个项目开发过程中,我们需要对需求进行分析,并根据不同的模块进行设计。在这个过程中,我们可以利用互联网等各种资源进行查询、学习、总结,不断完善自己的想法。同时,在编写代码时,注重代码规范性,添加适当的注释有助于提高代码的可读性和可维护性,也有利于其他成员的协作开发。在调试过程中,需要严谨的态度和耐心地解决问题,并且不断优化代码,提升程序的性能和稳定性。
在这次课程设计中,我还学到了团队合作的重要性。在开发过程中,我们需要与其他成员密切合作,共同进退。在组织开发过程中,我们需要沟通好各个模块的职责和任务,并且要保持信息的及时性和准确性,以避免出现误解和失误。通过团队合作,可以让我们更好地发挥自己的优势,同时也能够汇聚各种人才,创造更好的效果。
此外,在课程设计中,我们还需要注重文档的编写和管理。在项目开发中,文档是一份非常重要的资料,可以记录下整个项目的开发过程和相关信息。在编写文档时,要注意其规范性、全面性和准确性,以便于后期的维护和管理。同时,还需要注意文档的版本控制和备份,以避免因为数据丢失而影响项目的正常运行。
在这个过程中,我深刻体会到了“熟能生巧”的道理。只有不断的实践、学习和思考,才能让自己更好地理解所学知识,运用到实际项目中去。同时,还需要对自己有信心,积极尝试,勇于面对困难和挑战,不畏惧失败。
最后,这次课程设计不仅仅是对我们理论知识的检验,更是让我们深刻理解了实际项目开发的流程和方法,同时也提高了我们的解决问题的能力和团队协作能力。在今后的学习和工作中,我会持续保持这种学习和实践的态度,不断提升自己的能力水平,为实现更大的成就而不懈努力。
在此,感谢老师、同学们的支持和帮助,使我能够在这次课程设计中获得更多的收获和成长。我会继续努力,不断学习、实践,以更好的姿态面对未来的挑战。
参考文献
- 谭浩强.C语言程序设计[M].北京:清华大学出版社,2009.
- 何钦铭,颜晖.C语言程序设计[M].2版.北京:高等教育出版社,2012.
- 李丽娟.C语言程序设计教程(第四版).北京:人民邮电出版社,2013.
- 陈一明,吴良海.程序设计基础与实验教程.上海:复旦大学出版社,2012.
- 丁亚涛.C语言程序设计(第三版).北京:中国水利水电出版社,2010.
- 黄容,赵毅.C语言程序设计.北京:清华大学出版社,2012.
- 颜晖,柳俊.C语言程序设计实验与习题指导(第二版).北京:高等教育出版社,2012.
- 郎建昭.边用边学C语言[M].北京:清华大学出版社,2008.
- 王敬华,林萍,张清国.C语言程序设计教程[M].2版.北京:清华大学出版社,2013.
[10] Brian W Kernighan, Dennis M Ritchie. The C Programming Language[M]. 2nd edition. 北京:机械工业出版社,2004.
[11] H.H.塔恩.C语言程序设计问题解答和实例解析方法[M].北京:机械工业出版社,2016.
[12] 陈宝明,骆红波,许巨定.C语言程序设计[M].2版.北京:人民邮电出版社,2011.
附录
#include<cstdio>
#include<cstring>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
# define M 30
//梅森素数
// 判断一个数是否为素数
int isPrime(int n) {
if (n <= 1) return 0;
int i;
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
// 求指数n<30的所有梅森素数并输出
void findMersennePrimes() {
int n, i, t = 2, count = 0;
printf("指数n<30的所有梅森素数:\n");
for (n = 2; n < 30; n++) {
t = pow(2, n) - 1; // 求t=2的n次方-1
if (isPrime(t)) { // 判断t是否为素数
printf("%-10d ", t); // 输出结果
count++;
if (count % 5 == 0) { // 每行输出5个梅森素数
printf("\n");
}
}
}
printf("\n");
printf("您已经完成了指数n<30的所有梅森素数的求取,祝您工作顺利!");
}
//选美比赛
void xuanmei()
{
int j,n,i;
int a[101],book[50],b[101],c[10000];//定义存储选手序号、选手得分、选手名次的数组
printf("请输入选手数量:");
scanf("%d",&n);//输入选手数量
printf("请依次输入选手序号(用空格隔开):");
for(i=0;i<n;i++)//输入选手序号
{
scanf("%d",&c[i]);
}
printf("请依次输入选手得分(用空格隔开):");
for(i=0;i<n;i++)//输入选手得分
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//排序
{
int count=1;
memset(book,0,sizeof(book));
for(j=0;j<n;j++)
{
if(a[j]>a[i]&&book[a[j]]==0)
{
book[a[j]]=1;
count++;
}
}
b[i]=count;
}
printf("各位选手的名次如下:");
for(i=0;i<n;i++)//输出选手名次
{
if(i==0)
printf("%d",b[i]);
else
printf(" %d",b[i]);
}
printf("\n");
printf("您已经完成了选美比赛成员的排名工作,祝您工作顺利!");
}
//学生籍贯管理系统
//定义一个学生结构体
typedef struct student//定义储存学生信息的结构体
{
char no[12]; //学号
char name[40]; //姓名
char tele[20]; //电话号码
int D[18]; //身份证号码
char jg[60]; //籍贯
char addr[80]; //通讯地址
struct student* next; //指向下一节点的指针
}STU;//后面可用STU定义变量或数组存放学生信息
//函数声明放在这里
STU* LIstInit(STU* L);//创建表头,初始化链表
STU* ListCreate(STU* L, int n);//创建链表,将新生成的节点插入到链表的表头
void ListInsert(STU* L);//插入学生的相关信息的函数
void ListDelete(STU* L, char n[40]);//删除某个学生的信息的函数
void LIstSearch(STU* L, char n[]);//查找学生的相关信息的函数
void input(STU* p, int i);//录入某个学生的信息的函数
void output(STU* L);//输出学生信息的函数
void menu1();//主菜单函数
void menu2();//学生籍贯管理系统菜单函数
//创建表头,初始化链表
STU* LIstInit(STU* L)
{
STU* head = NULL;
head = (STU*)malloc(sizeof(STU));
head->next = NULL;
L = head;
return L;
}
//创建链表,将新生成的节点插入到链表的表头
STU* ListCreate(STU* L, int n)
{
int i;
for (i = 0; i < n; i++)
{
STU* p;
//将新生成的节点插入到链表中
p = NULL;
p = (STU*)malloc(sizeof(STU));
input(p, i);
p->next = L->next;
L->next = p;
}
return L;
}
//对链表进行节点的插入操作
void ListInsert(STU* L)//插入学生的相关信息的函数
{
STU* s = NULL;
//生成一个新节点s
s = (STU*)malloc(sizeof(STU));
printf("请输入您要插入的学生的学号:");
scanf("%s", &s->no);
printf("请输入您要插入的学生的姓名:");
scanf("%s", &s->name);
printf("请输入您要插入的学生的电话号码:");
scanf("%s", &s->tele);
printf("请输入您要插入的学生的身份证号码:");
scanf("%s", &s->D);
printf("请输入您要插入的学生的籍贯:");
scanf("%s", &s->jg);
printf("请输入您要插入的学生的通讯地址:");
scanf("%s", &s->addr);
s->next = L->next;
L->next = s;
printf("插入成功!");
}
//对链表的进行节点的删除操作
void ListDelete(STU* L, char n[])//删除某个学生的信息的函数
{
STU* p = L->next, * pre = L; //定义p指针指向头节点的指向,定义pre指向头节点,pre始终指向p的前驱节点
if (p == NULL)
printf("数据为空,无法删除!");
else
{
while (strcmp(p->name, n) != 0)
{
pre = p;
p = pre->next;
if (p == NULL)
{
printf("没有找到相关信息,无法删除\n");//判断文件是否存在,是否删除成功
return;
}
}
pre->next = p->next;
free(p);
printf("删除成功");
}
}
void LIstSearch(STU* L, char n[])//查找某个学生的信息的函数
{
STU* p = L->next;
if (p == NULL)
printf("数据为空,无法查找!");
else
{
while (strcmp(p->name, n) != 0)
{
p = p->next;
if (p == NULL)
{
printf("没有找到相关信息\n");//判断文件是否存在,是否查找成功
return;
}
}
printf("该学生的籍贯为:\n");
printf("\t%s\n", p->jg);
}
}
void ListModify(STU* L, char na[])//修改某个学生的信息的函数
{
char JG[60];
STU* p = L->next;
while (p != NULL)
{
if (strcmp(p->name, na) == 0)
{
printf("请选择您修改后的学生籍贯:\n");
scanf("%s", &JG);
strcpy(p->jg, JG);
break;
}
p = p->next;
}
}
void input(STU* p, int i)//录入学生信息的函数
{
printf("请输入第%d名学生的学号:", i + 1);
scanf("%s", &p->no);
printf("请输入第%d名学生的姓名:", i + 1);
scanf("%s", &p->name);
printf("请输入第%d名学生的电话号码:", i + 1);
scanf("%s", &p->tele);
printf("请输入第%d名学生的身份证号码:", i + 1);
scanf("%s", &p->D);
printf("请输入第%d名学生的籍贯:", i + 1);
scanf("%s", &p->jg);
printf("请输入第%d名学生的通讯地址:", i + 1);
scanf("%s", &p->addr);
}
void output(STU* L)//输出函数
{
STU* p = L->next;
while (p != NULL)
{
printf("%s\t", p->no);
printf("%s\t", p->name);
printf("\t%s", p->tele);
printf("\t\t%s", p->D);
printf("\t%s", p->jg);
printf("\t%s", p->addr);
printf("\n");
p = p->next;
}
}
void PrintFile(STU* L)//保存学生信息的函数
{
STU* p = L->next;
FILE* fp;
fp = fopen("student.txt", "w");
fprintf(fp, "学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
while (p != NULL)
{
fprintf(fp, "%s\t", p->no);
fprintf(fp, "%s\t", p->name);
fprintf(fp, "\t%s", p->tele);
fprintf(fp, "\t%s", p->D);
fprintf(fp, "\t%s", p->jg);
fprintf(fp, "\t\t%s", p->addr);
fprintf(fp, "\n");
p = p->next;
}
printf("保存成功,请到当前目录下的student.txt文件中查看");
fclose(fp);
}
void menu1()//菜单函数
{
printf("\n\n");
printf("\t\t\t*******************C语言课程设计***********************\n");
printf("\t\t\t* 作者:魏永雷 班级:数据科学221 学号:3220706134 *\n");
printf("\t\t\t* *\n");
printf("\t\t\t* <1>. 求指数n<30的梅森素数 *\n");
printf("\t\t\t* <2>. 选美比赛 *\n");
printf("\t\t\t* <3>. 学生籍贯管理系统 *\n");
printf("\t\t\t* <0>. 退出系统 *\n");
printf("\t\t\t* 欢迎使用本系统! *\n");
printf("\t\t\t*******************************************************\n");
printf("\t\t\t输入选项,按回车进入选项: \n");
}
void menu2()//菜单函数
{
printf("\n\n");
printf("\t\t\t*******************学生籍贯管理系统********************\n");
printf("\t\t\t* 作者:魏永雷 班级:数据科学221 学号:3220706134 *\n");
printf("\t\t\t* *\n");
printf("\t\t\t* <1>. 录入学生的相关信息 *\n");
printf("\t\t\t* <2>. 查看全部学生的相关信息 *\n");
printf("\t\t\t* <3>. 查找某个学生的籍贯 *\n");
printf("\t\t\t* <4>. 修改某个学生的籍贯 *\n");
printf("\t\t\t* <5>. 删除某个学生的相关信息 *\n");
printf("\t\t\t* <6>. 插入某个学生的相关信息 *\n");
printf("\t\t\t* <7>. 保存学生信息 *\n");
printf("\t\t\t* <0>. 退出管理系统 *\n");
printf("\t\t\t* 欢迎使用本系统! *\n");
printf("\t\t\t*******************************************************\n");
printf("\t\t\t输入选项,按回车进入选项: \n");
}
int main()
{
int item, n; //item用于接收菜单输入的命令,n用于接收输入的学生人数
char nam[30];
STU* L = NULL;
L = LIstInit(L);
do
{
menu1();
printf("请输入相应的数字,进行相应的操作:\n");
scanf("%d", &item);
switch (item)//switch语句编写菜单选项
{
case 1:
findMersennePrimes(); // 求指数n<30的所有梅森素数并输出
break;
case 2:
xuanmei();
break;
case 3:
do
{
menu2();
printf("请输入相应的数字,进行相应的操作:\n");
scanf("%d", &item);
switch (item)//switch语句编写菜单选项
{
case 1:
printf("请输入您要录入的学生人数:");
scanf("%d", &n);
L = ListCreate(L, n);
break;
case 2:
printf("全部学生信息如下:\n");
printf("学号\t\t姓名\t\t电话号码\t\t身份证号码\t\t籍贯\t\t通讯地址\n");
output(L);
break;
case 3:
printf("请输入您要查找的学生姓名:");
scanf("%s", nam);
LIstSearch(L, nam);
break;
case 4:
printf("请输入您要修改的学生姓名:");
scanf("%s", nam);
ListModify(L, nam);
break;
case 5:
printf("请输入您要删除的学生的姓名:");
scanf("%s", nam);
ListDelete(L, nam);
break;
case 6:
ListInsert(L);
break;
case 7:
PrintFile(L);
break;
case 0:
printf("您已经完成了学生籍贯管理系统的工作,祝您工作顺利!");
printf("即将退出学生籍贯管理系统.....");
printf("下班啦,嘿嘿嘿!");
exit(0);
default:
printf("输入格式错误,请重新输入");
break;
}
printf("\n\n\n\n");
} while (item);
case 0:
printf("即将退出本系统.....");
exit(0);
default:
printf("输入格式错误,请重新输入");
break;
}
printf("\n\n\n\n");
} while (item);
return 0;
}