需要源代码:
1、私聊博主
2、看主页联系
3、完整代码访问以下链接:
腾讯文档腾讯文档-在线文档https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10
该项目所用到的知识点:
链表、结构体、函数调用的实现、文件的生成(对录入好的学生成绩写到.txt文本)、文件的读写操作、排序算法、数据的增删查
文章先讲原理再看代码实现,文章比较长,希望耐心看完,代码接近500多行!!
一、 设计任务目的与要求
1、 进一步掌握和利用C语言进行程设计的能力;
2、 进一步理解和运用结构化程设计的思想和方法;
3、 初步掌握开发一个小型实用系统的基本方法;
4、 学会调试一个较长程序的基本方法;
5、 学会利用流程图或N-S图表示算法;
6、 掌握书写程设计开发文档的能力(书写课程设计报告);
二、 设计内容
2.1 总体设计
说明包含几大功能模块
画出系统功能模块结构图和系统流程图
数据结构设计及用法说明
2.2 详细设计
函数名字:
函数功能:
数据结构设计描述,参数说明
实现过程:写算法或解决思路,贴(NS图或流程图)
学生奖学金管理系统流程图如下:
使用到的结构体变量:
struct Student
{
char Sid[10];
char Sclass[20];
char Sname[20];
int Math;
int English;
int Physic;
int Sum;
int rank;
struct Student;
};
简介:以上的结构体为学生奖学金管理系统的核心部分,是贯穿整个系统的灵魂。存储和读取都是以结构体的形式进行的,每个结构体包含着丰富的信息。
第一板块:学生成绩的录入
使用到的函数有:
Ø int main();(控制主流程)
Ø void ShowMenu();(显示主菜单)
Ø struct Student in_stuNode(); (从键盘中输入的数据创建链表)
Ø void Record(struct Student *head); (从链表中的数据写入文件)
函数简介:先把用户输入的数据用链表储存起来,然后链表遍历,并写入文件中。
程序流程图分别如下
函数 3( 创建stu链表):用户输入表中相关信息(格式如流程图所示),输入学号为@输入结束。
函数 4( stu链表写入文件):成功写入文件, 在屏幕中输出录入成功!)
第二板块:显示全部学生成绩信息
使用到的函数有:
Ø int main();(控制主流程)
Ø void Show_stuNode();(从链表中输出到屏幕)
Ø struct Student \ File_stuNode();(从文件中读取数据,建立链表)
函数简介:由于要经常对文件中数据操作,为了方便,把文件的数据存储到链表中,对链表的操作就是对文件中数据操作。
函数 2简介:
程序流程图分别如下:
函数 3简介:
第三板块:条件查询学生信息
使用到的函数有:
Ø int main();(控制主流程)
Ø void Search();(Search主菜单,控制流程)
Ø void SearchByRank();(按名次查询某学生的个人成绩)
Ø void SearchByClass();(按班级查询班级前3名学生的个人成绩)
Ø void SearchByScore();(按成绩段查询某学生的个人成绩)
Ø void SearchBySid() NEW :ADD FILE
Ø void SearchByName() NEW :ADD FILE
Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)
程序流程图分别如下
函数 3简介:
函数 4简介:
函数 5简介:
第四板块:条件统计学生信息
使用到的函数有:
Ø int main()**;(控制主流程)**
Ø void Statistics()**;(统计主菜单,控制流程)**
Ø void StatByStu()**;(按学生统计所有人的总分)**
Ø void StatByClass()**;(按班统计每个班的总分)**
Ø void StatByProject()**; NEW :ADD FILE**
Ø struct Student * File_stuNode();**(从文件中读取数据,建立链表)**
函数3简介:
函数4简介:
第五板块:删除学生信息
使用到的函数有:
Ø int main();(控制主流程)
Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)
Ø void Delete();(删除学生信息)
Ø void Record(struct Student *head); (从链表中的数据写入文件)
函数 3简介:
第六板块:添加学生信息
使用到的函数有:
Ø int main()**;(控制主流程)
Ø void Add()**;(调用其他函数,完成添加功能)
Ø struct Student * in_stuNode(); (从键盘中输入的数据创建链表)
Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)
Ø void Record(struct Student *head); (从链表中的数据写入文件)
函数简介:
第七板块:按条件排序
使用到的函数有:
Ø int main();(控制主流程)
Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)
Ø void ShowSort();( 控制sort 流程)
Ø void ShowSortBy()(调用 sort 函数,显示结果)
Ø struct Student SortByRank(struct Student *head)(按名次排序)
Ø struct Student * SortBySid(struct Student *head)(按学号排序)
Ø void Record(struct Student *head); (从链表中的数据写入文件)
函数 5 简介:
第八板块:保存文件
使用到的函数有:
Ø int main();(控制主流程)
Ø void SaveFile();(调用函数,保存文件)
Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)
函数简介:
第九板块:复制文件
使用到的函数有:
Ø int main();(控制主流程)
Ø void CopyFile()**;(将文件1复制到文件2)
函数简介:
三、 实验结果与代码分析
运行程序主页面:
菜单函数代码:
void ShowMenu()
{
printf("\n********** 需要源代码看主页联系QQ **********\n\n");
printf("\t欢迎登录学生奖学金管理系统\n\n");
printf("\t1-------------- 录入\n");
printf("\t2-------------- 显示所有信息\n");
printf("\t3-------------- 查询\n");
printf("\t4-------------- 数据统计\n");
printf("\t5-------------- 删除\n");
printf("\t6-------------- 添加\n");
printf("\t7-------------- 排序\n");
printf("\t8-------------- 保存文件\n");
printf("\t9-------------- 复制文件\n");
printf("\t10------------- 退出\n\n");
printf("\n********** 需要源代码联系 +QQ:3125841747 **********\n\n");
}
当txt文件内无内用时:显示为空的信息:
代码实现:
void Show_stuNode()
{
printf("---------------------------STUDENT------------------------------------\n");
printf("需要源代码 +Q:3125841747")
printf("|编号 |班级 |姓名 |分数1 |分数2 |分数3 |总分 | 排名 |\n");
printf("----------------------------------------------------------------------\n");
struct Student *p, *head;
head = File_stuNode(); 调用 File_stuNode()
p = head;
while(p != NULL)
{
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p->Sid, p->Sclass, p->Sname, p->Math, p->English, p->Physic, p->Sum, p->rank);
p = p->next;
}
}
非法输入时:
实现代码:
do
{
ShowMenu();
printf("\n********** **********\n\n");
printf("\t请选择: ");
scanf("%d", &option);
getchar();
switch(option)
{
case 1: Record(in_stuNode()); break;
case 2: Show_stuNode(); break;
case 3: Search(); break;
case 4: Statistics(); break;
case 5: Delete(); break;
case 6: Add(); break;
case 7: ShowSort(); break;
case 8: SaveFile();break;
case 9: CopyFile();break;
case 10: break;
default : printf("输入错误!");
}
}while(option != 10);
录入学生信息及成绩:@为结束标记
代码实现:
struct Student * in_stuNode()
{
struct Student * head, * p1, * p2;
int n = 0;
p1 = p2 = (struct Student *)malloc(SIZE);
head = NULL;
scanf("%s", p1->Sid);
while(p1->Sid[0] != '@')
{
scanf("%s%s%d%d%d", p1->Sclass, p1->Sname, &p1->Math, &p1->English, &p1->Physic);
p1->Sum = 0; p1->rank = 0;
n++;
if(n == 1)
{
head = p1;
}else
{
p2->next = p1;
}
p2 = p1;
p1 = (struct Student *)malloc(SIZE);
scanf("%s", p1->Sid);
}
p2->next = NULL;
return head;
}
//从链表中的数据 写入文件
void Record(struct Student *head)
{
FILE *fp;
struct Student *p1;
p1 = head;
if((fp = fopen("D:\\Course\\student.txt", "w")) == NULL)
{
printf("无法打开此文件\n");
return;
}
while(p1 != NULL)
{
fprintf(fp, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
/* if(fwrite(p1, SIZE, 1, fp) != 1)
{
printf("file write error\n");
}
*/
p1 = p1->next;
}
if(p1 == NULL){
printf("已记录!!\n");
}
free(p1);
free(head);
fclose(fp);
}
必须要先进行排名再去查询数据:
void SortRank()
{
struct Student *p1, *head, *p2;
int i;
head = File_stuNode();
p1 = head;
while(p1 != NULL)
{
i = 1;
p2 = head;
while(p2 != NULL)
{
if(p1->Sum < p2->Sum)
{
i++;
}
p2 = p2->next;
}
p1->rank = i;
p1 = p1->next;
}
Record(head);
}
void SearchByRank()
{
struct Student *p1, *head;
int number;
head = File_stuNode();
p1 = head;
if(p1->rank == 0)
{
printf("你还没有排名呢?请返回主菜单执行操作7\n");
return;
}
printf("请输入要查询的名次:");
scanf("%d", &number);
while(p1 != NULL)
{
if(p1->rank == number)
{
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
}
p1 = p1->next;
}
free(p1);
free(head);
}
查找:
void SearchByClass()
{
int i = 1;
char Class[10] = {0};
struct Student *p1, *head, *p2;
printf("请输入要查询的班级: \n");
scanf("%s", Class);
head = File_stuNode();
p1 = head;
while(p1 != NULL)
{
if(strcmp(Class, p1->Sclass) == 0)
{
i = 1;
p2 = head;
while(p2 != NULL)
{
if(strcmp(Class, p2->Sclass) == 0)
{
if(p1->Sum < p2->Sum)
{
i++;
}
}
p2 = p2->next;
}
if(i <= 3)
{
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
}
else if(i > 3)
{
break;
}
}
p1 = p1->next;
}
free(p1);
free(head);
}
功能按钮4:
void ShowMenu4()
{
printf("\t****************************************\n");
printf("\t1-------------- 总计\n");
printf("\t2-------------- 分班统计\n");
printf("\t3--------------退出\n");
printf("\t****************************************\n");
printf("需要源代码 +Q:3125841747");
}
void StatByStu()
{
struct Student *head, *p1;
head = File_stuNode();
p1 = head;
while(p1 != NULL)
{
p1->Sum = p1->Math + p1->English + p1->Physic;
p1 = p1->next;
}
Record(head);
}
void StatByClass()
{
char Class[10][10] = {0};
int ClassSum[10] = {0};
FILE *fp;
struct Student *head, *p1;
int i = 0; // 记录class总数
int j;
int tag = 1;
head = File_stuNode();
p1 = head;
while(p1 != NULL)
{
tag = 1;
for(j = 0; j < i; j++)
{
if(strcmp(Class[j] , p1->Sclass) == 0)
{
tag = 0; break;
}
}
if(tag == 1)
{
strcpy(Class[i++], p1->Sclass);
}
p1 = p1->next;
}
p1 = head;
while(p1 != NULL)
{
for(j = 0; j < i; j++)
{
if(strcmp(p1->Sclass, Class[j]) == 0)
{
ClassSum[j] += p1->Sum;
}
}
p1 = p1->next;
}
if((fp = fopen("D:\\Course\\student1.txt", "w+")) == NULL)
{
printf("无法打开此文件\n");
return;
}
for(j = 0; j < i; j++)
{
printf("%s %d\n", Class[j], ClassSum[j]);
}
}
void Statistics()
{
int op;
do
{
ShowMenu4();
printf("\t请选择: ");
scanf("%d", &op);
switch(op)
{
case 1: StatByStu(); break;
case 2: StatByClass(); break;
case 3: break;
default : printf("出入错误!\n");
}
}while(op != 3);
}
删除:
代码实现:
void Delete()
{
struct Student *p1, *head, *p2;
char stuid[10] = {0};
int tag = 0;
head = File_stuNode();
printf("请输入要删除的stuSid:\n");
scanf("%s", stuid);
p1 = head;
p2 = NULL;
while(p1 != NULL)
{
if(strcmp(p1->Sid, stuid) == 0)
{
if(p2 == NULL)
{
head = p1->next; // 删除是 head 结点
tag = 1;
break;
}else{
if(p1->next == NULL)
{
p2->next = NULL; // 删除是 尾节点
tag = 1;
break;
}
p2->next = p1->next;
tag = 1;
break;
}
}
p2 = p1;
p1 = p1->next;
}
if(tag == 0)
{
printf("没找到学生!\n");
}else{
Record(head);
}
}
学生的插入:
实现代码:
void Add()
{
struct Student * head1, *head2, *p1, *head;
head1 = File_stuNode();
head2 = in_stuNode();
p1 = head1;
if(p1 != NULL)
{
while(p1->next != NULL)
{
p1 = p1->next;
}
head = head1;
p1->next = head2;
}
else
{
head = head2;
}
if(head == NULL){
printf("Y");}
Record(head);
}
排序:这个功能可以对等级排序和学生的id排序,学生的id排序时,可以自己结算总分,排名!
代码实现:
void ShowSort()
{
int op;
do
{
printf("\t****************************************\n");
printf("\t1----------对所有学生按等级排序\n");
printf("\t2----------按Sid为所有学生排序\n");
printf("\t3----------退出!\n");
printf("\t****************************************\n");
printf("\t请选择:: ");
scanf("%d", &op);
switch(op)
{
case 1: ShowSortBy(op); break;
case 2: ShowSortBy(op); break;
case 3: break;
default : printf("输入错误!\n");
}
}while(op != 3);
}
当你看到这里时,说明你真的很有耐心,接下来才是亮点!因为可以实现对txt文件的操作,保存文件和复制文件,看接下来的演示:
保存文件:输入 你想保存的的文件的文件名以及文件保存位置,即可导出文件。文件的后缀名是自己自定义,生成.c之类的都可以!下面图作为示例:生成.c和.txt文件。
即可生成文件:
将student.txt文件作为备份,拷贝一份新的文件:
实现代码:
//复制文件
void CopyFile(){
FILE *fp, *fp1;
char filename[30] = {0};
char filename1[30] = {0};
struct Student *p1, stu;
printf("请输入文件名\n");
scanf("%s", filename);
getchar();
printf("请输入文件名路径\n");
scanf("%s", filename1);
getchar();
if((fp = fopen(filename, "r")) == NULL)
{
printf("文件打开失败");
return;
}
if((fp1 = fopen(filename1, "w")) == NULL)
{
printf("打开文件错误");
return;
}
p1 = &stu;
while(!feof(fp))
{
fscanf(fp, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d", p1->Sid, p1->Sclass, p1->Sname, &p1->Math, &p1->English, &p1->Physic, &p1->Sum, &p1->rank);
fprintf(fp1, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
}
fclose(fp);
fclose(fp1);
}
//保存的路径
void SaveFile()
{
FILE *fp;
char filename[30] = {0};
struct Student *head, *p1;
scanf("%s", filename);
getchar();
if((fp = fopen(filename, "w")) == NULL)
{
printf("打开文件错误");
return;
}
head = File_stuNode();
p1 = head;
while(p1 != NULL)
{
fprintf(fp, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
p1 = p1->next;
}
free(head);
free(p1);
fclose(fp);
}
正常退出程序: