前几天翻WPS的时候,发现了之前C语言程序设计的作业记录,就想着发出来给大家看看,万一用的上也可以用用,
《程序设计基础》课程设计报告
一、设计要求
1、题目分析
要求我们做一个学生信息的管理系统,要有展示增加、删除、修改、查询几个基本功能,既然是信息管理系统那么肯定需要结构体,还需要往里面加一个学生信息的文件,以便于存储和读取,看功能还要有循环类的代码结构。
- 需求分析
能够展示增加、删除、修改、查询学生信息,实现自动化管理。
二、概要设计
1、主界面设计
2、存储结构设计
建立一个txt文件和学生信息结构体以便存储学生信息
3、系统功能设计
查询学生信息
增加学生信息
删除学生信息
修改学生信息
输出学生信息
读取学生信息
三、功能模块设计
1、模块设计
头函数模块、结构体模块、主函数模块、函数声明模块
头函数模块
结构体模块
主函数模块
函数声明模块
2、系统子程序级功能设计
3、功能函数调用关系
四、详细设计
1、数据类型定义
定义了int整型和char字符型数据,还有指针域
定义链表
读取和保存文件
2、系统主要子程序详细设计
- 主函数界面
int main()
{
ReadFile(&List);
int choice = 0;
while(true){
welcome();
scanf("%d",&choice);
switch(choice){
case 1: //增加学生信息
printAddStuInfo();
break;
case 2: //删除学生信息
printDelStuInfo(&List);
break;
case 3: //修改学生信息
printFixStuInfo(&List);
break;
case 4: //查询学生信息
printFindStuInfo(&List);
break;
case 5: //输出学生信息
printStuInfo(&List);
break;
case 0: //退出管理系统
exitSys();
break;
}
printf("是否继续操作?(yes:1/no:0)\n");
scanf("%d",&choice);
if(choice == 0){
break;
}
}
exitSys();
return 0;
}
- 显示页面
void welcome()
{
printf("*******************************\n");
printf("********学生信息管理系统*******\n");
printf("** 增加学生信息----1 **\n");
printf("** 删除学生信息----2 **\n");
printf("** 修改学生信息----3 **\n");
printf("** 查询学生信息----4 **\n");
printf("** 输出学生信息----5 **\n");
printf("** 退出管理系统----0 **\n");
printf("*******************************\n");
printf("请输入对应的功能键(数字):\n");
}
- 增加学生信息
void printAddStuInfo(){
node st;
printf("请输入新增学生的相关信息:\n");
printf("学号:");
scanf("%d",&st.id);
printf("姓名:");
scanf("%s",&st.name);
printf("性别:");
scanf("%s",&st.gender);
printf("语文:");
scanf("%d",&st.Chinese);
printf("数学:");
scanf("%d",&st.math);
printf("英语:");
scanf("%d",&st.English);
st.sum = st.Chinese+st.math+st.English;
InsertStudentInfo(&List,st);
}
void InsertStudentInfo(node *L,node e){
node *h = L;
node *s = (node *)malloc(sizeof(node));
*s = e;
s->next = h->next;
h->next = s;
saveFile(L);
}
- 删除学生信息
void printDelStuInfo(node *L){
int id,choice;
printf("请输入要删除学生的学号信息\n");
scanf("%d",&id);
node *pre = findPreStuById(id,L);
node *st = pre->next;
if(st == NULL){
printf("不存在学号为%d的学生信息\n",id);
return;
}
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",st->id,st->name,st->gender,st->Chinese,st->math,st->English,st->sum);
printf(" ----------------------------------------------------\n");
printf("是否删除该学生信息(yes:1/no:0)\n");
scanf("%d",&choice);
if(choice == 0){
return;
}else if(choice == 1){
pre->next = st->next;
st->next = NULL;
free(st);
saveFile(L);
}else{
printf("不存在该选项,请输入0/1");
}
}
- 修改学生信息
void printFixStuInfo(node *L){
int id,choice = 0;
printf("请输入要修改的学生的学号信息\n");
scanf("%d",&id);
node *st = findStuById(id,L);
if(st == NULL){
printf("不存在学号为%d的学生信息\n",id);
}
while(1){
printf("修改姓名 --------1\n");
printf("修改性别 --------2\n");
printf("修改语文成绩 --------3\n");
printf("修改数学成绩 --------4\n");
printf("修改英语成绩 --------5\n");
printf("请输入要修改的内容:");
scanf("%d",&choice);
switch(choice){
case 1:
printf("请输入修改后的姓名:");
scanf("%s",st->name);
break;
case 2:
printf("请输入修改后的性别:");
scanf("%s",st->gender);
break;
case 3:
printf("请输入修改后的语文成绩:");
scanf("%d",&st->Chinese);
break;
case 4:
printf("请输入修改后的数学成绩:");
scanf("%d",&st->math);
break;
case 5:
printf("请输入修改后的英语成绩:");
scanf("%d",&st->English);
break;
}
printf("是否继续修改该学生信息(yes:1/no:0)");
scanf("%d",&choice);
if(choice == 0){
st->sum = st->Chinese + st->math + st->English;
printf("修改后的学生成绩如下:\n");
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",st->id,st->name,st->gender,st->Chinese,st->math,st->English,st->sum);
printf(" ----------------------------------------------------\n");
break;
}
saveFile(L);
}
}
- 查询学生信息
void printFindStuInfo(node *L){
int choice = 0,id;
node *p;
char name[50];
printf("请输入查询方式(学号:1/姓名:0)\n");
scanf("%d",&choice);
if(choice == 1){
printf("请输入查询学生的学号:\n");
scanf("%d",&id);
p = findStuById(id, L);
if(p == NULL){
printf("不存在学号为%d的学生的学生信息\n",id);
}else{
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
printf(" ----------------------------------------------------\n");
}
}else if(choice == 0){
printf("请输入查询学生的姓名:\n");
scanf("%s",&name);
p = findStuByName(name, L);
if(p == NULL){
printf("不存在姓名为%s的学生的学生信息\n",name);
}else{
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
printf(" ----------------------------------------------------\n");
}
}else{
printf("无该查询方式\n");
}
}
- 输出学生信息
void printStuInfo(node *L){
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
node *p = L->next;
while(p != NULL){
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
printf(" ----------------------------------------------------\n");
p = p->next;
}
}
- 保存学生信息文件
int saveFile(node *L){
FILE *fp = fopen("C:/Users/iio/Desktop/studentInfo.txt","w");
node st,*s,*t = L;
if(fp == NULL){
return 0;
}
node *p = L->next;
while(p != NULL){
fprintf(fp,"%d %s %s %d %d %d %d\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
p = p->next;
}
fclose(fp);
return 1;
}
- 读取学生信息文件
int ReadFile(node *L){
FILE *fp = fopen("C:/Users/iio/Desktop/studentInfo.txt","r");
node st,*s,*t = L;
if(fp == NULL){
return 0;
}
while(fscanf(fp,"%d %s %s %d %d %d %d",&st.id,st.name,&st.gender,&st.Chinese,&st.math,&st.English,&st.sum) != EOF){
s = (node *)malloc(sizeof(node));
*s = st;
t->next = s;
t = s;
t->next = NULL;
}
fclose(fp);
return 1;
}
五、测试分析
- 主程序测试
- 增加学生信息测试
增加学生信息
2022005 林一 100 100 100 300
确认已保存入文件,且信息正确
增加信息测试无误
- 删除学生信息测试
删除学生信息
2022005 林一 100 100 100 300
确认文件内已删除
删除信息测试无误
- 修改学生信息测试
修改学生信息
修改前
2022005 林一 100 100 100 300
修改后
2022005 李玲 99 99 99 297
确认已修改
修改学生信息测试无误
- 查询学生信息测试
查询测试无误
- 输出学生信息
将文件内所有学生信息读取并打印出来
输出学生信息无误
- 退出系统
输入0退出系统
退出系统测试无误
以下是源代码,如果是人事信息管理系统也可以在此基础上改
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//学生信息结构体
typedef struct Node{
int id; //学号
char name[50]; //姓名
char gender[10]; //性别
int Chinese,math,English;//语文、数学、英语成绩
int sum; //总分
struct Node *next; //指针域,指向下一个学生
}node;
node List; //链表
int ReadFile(node *L); //读取文件
int saveFile(node *L); //保存文件
void welcome(); //主函数界面
void printAddStuInfo(); //打印增加学生信息
void InsertStudentInfo(node *L,node e); //增加学生信息
void printDelStuInfo(node *L); //删除学生信息
void printFixStuInfo(node *L); //修改学生信息
void printFindStuInfo(node *L); //查询学生信息
node *findStuById(int id,node *L); //通过学号查询学生信息
node *findPreStuById(int id,node *L); //通过学号查询学生信息
node *findStuByName(char name[],node *L); //通过姓名查询学生信息
void printStuInfo(node *L); //输出学生信息
void exitSys(); //退出系统
//主函数界面
int main()
{
ReadFile(&List);
int choice = 0;
while(true){
welcome();
scanf("%d",&choice);
switch(choice){
case 1: //增加学生信息
printAddStuInfo();
break;
case 2: //删除学生信息
printDelStuInfo(&List);
break;
case 3: //修改学生信息
printFixStuInfo(&List);
break;
case 4: //查询学生信息
printFindStuInfo(&List);
break;
case 5: //输出学生信息
printStuInfo(&List);
break;
case 0: //退出管理系统
exitSys();
break;
}
printf("是否继续操作?(yes:1/no:0)\n");
scanf("%d",&choice);
if(choice == 0){
break;
}
}
exitSys();
return 0;
}
//显示页面
void welcome()
{
printf("***************Y***************\n");
printf("********学生信息管理系统*******\n");
printf("** 增加学生信息----1 **\n");
printf("** 删除学生信息----2 **\n");
printf("** 修改学生信息----3 **\n");
printf("** 查询学生信息----4 **\n");
printf("** 输出学生信息----5 **\n");
printf("** 退出管理系统----0 **\n");
printf("*******************************\n");
printf("请输入对应的功能键(数字):\n");
}
//打印增加学生信息
void printAddStuInfo(){
node st;
printf("请输入新增学生的相关信息:\n");
printf("学号:");
scanf("%d",&st.id);
printf("姓名:");
scanf("%s",&st.name);
printf("性别:");
scanf("%s",&st.gender);
printf("语文:");
scanf("%d",&st.Chinese);
printf("数学:");
scanf("%d",&st.math);
printf("英语:");
scanf("%d",&st.English);
st.sum = st.Chinese+st.math+st.English;
InsertStudentInfo(&List,st);
}
void InsertStudentInfo(node *L,node e){
node *h = L;
node *s = (node *)malloc(sizeof(node));
*s = e;
s->next = h->next;
h->next = s;
saveFile(L);
}
//保存文件
int saveFile(node *L){
FILE *fp = fopen("C:/Users/iio/Desktop/studentInfo.txt","w");
node st,*s,*t = L;
if(fp == NULL){
return 0;
}
node *p = L->next;
while(p != NULL){
fprintf(fp,"%d %s %s %d %d %d %d\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
p = p->next;
}
fclose(fp);
return 1;
}
//打印删除学生信息
void printDelStuInfo(node *L){
int id,choice;
printf("请输入要删除学生的学号信息\n");
scanf("%d",&id);
node *pre = findPreStuById(id,L);
node *st = pre->next;
if(st == NULL){
printf("不存在学号为%d的学生信息\n",id);
return;
}
//确认删除学生信息
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",st->id,st->name,st->gender,st->Chinese,st->math,st->English,st->sum);
printf(" ----------------------------------------------------\n");
printf("是否删除该学生信息(yes:1/no:0)\n");
scanf("%d",&choice);
if(choice == 0){
return;
}else if(choice == 1){
pre->next = st->next;
st->next = NULL;
free(st);
saveFile(L);
}else{
printf("不存在该选项,请输入0/1");
}
}
//修改学生信息
void printFixStuInfo(node *L){
int id,choice = 0;
printf("请输入要修改的学生的学号信息\n");
scanf("%d",&id);
node *st = findStuById(id,L);
if(st == NULL){
printf("不存在学号为%d的学生信息\n",id);
}
while(1){
printf("修改姓名 --------1\n");
printf("修改性别 --------2\n");
printf("修改语文成绩 --------3\n");
printf("修改数学成绩 --------4\n");
printf("修改英语成绩 --------5\n");
printf("请输入要修改的内容:");
scanf("%d",&choice);
switch(choice){
case 1:
printf("请输入修改后的姓名:");
scanf("%s",st->name);
break;
case 2:
printf("请输入修改后的性别:");
scanf("%s",st->gender);
break;
case 3:
printf("请输入修改后的语文成绩:");
scanf("%d",&st->Chinese);
break;
case 4:
printf("请输入修改后的数学成绩:");
scanf("%d",&st->math);
break;
case 5:
printf("请输入修改后的英语成绩:");
scanf("%d",&st->English);
break;
}
printf("是否继续修改该学生信息(yes:1/no:0)");
scanf("%d",&choice);
if(choice == 0){
st->sum = st->Chinese + st->math + st->English;
printf("修改后的学生成绩如下:\n");
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",st->id,st->name,st->gender,st->Chinese,st->math,st->English,st->sum);
printf(" ----------------------------------------------------\n");
break;
}
saveFile(L);
}
}
//查询学生信息
void printFindStuInfo(node *L){
int choice = 0,id;
node *p;
char name[50];
printf("请输入查询方式(学号:1/姓名:0)\n");
scanf("%d",&choice);
if(choice == 1){
printf("请输入查询学生的学号:\n");
scanf("%d",&id);
p = findStuById(id, L);
if(p == NULL){
printf("不存在学号为%d的学生的学生信息\n",id);
}else{
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
printf(" ----------------------------------------------------\n");
}
}else if(choice == 0){
printf("请输入查询学生的姓名:\n");
scanf("%s",&name);
p = findStuByName(name, L);
if(p == NULL){
printf("不存在姓名为%s的学生的学生信息\n",name);
}else{
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
printf(" ----------------------------------------------------\n");
}
}else{
printf("无该查询方式\n");
}
}
//通过学号查询学生信息
node *findStuById(int id,node *L){
node *p = L->next;
while(p != NULL){
if(p->id == id){
return p;
}
p =p->next;
}
return NULL;
}
//查找前一个学生信息
node *findPreStuById(int id, node *L){
node *p = L;
while(p->next != NULL){
if(p->next->id == id){
return p;
}
p = p->next;
}
return NULL;
}
//通过姓名查询学生信息
node *findStuByName(char name[],node *L){
node *p = L->next;
while(p != NULL){
if(strcmp(p->name,name) == 0){
return p;
}
p =p->next;
}
return NULL;
}
//输出学生信息
void printStuInfo(node *L){
printf(" ----------------------------------------------------\n");
printf("|学号\t|姓名\t|性别\t|语文\t|数学\t|英语\t|总分|\n");
printf(" ----------------------------------------------------\n");
node *p = L->next;
while(p != NULL){
printf("|%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d |\n",p->id,p->name,p->gender,p->Chinese,p->math,p->English,p->sum);
printf(" ----------------------------------------------------\n");
p = p->next;
}
}
//退出系统
void exitSys(){
printf("感谢您的使用,再见。-Y\n");
exit(0);
}
//文件读取
int ReadFile(node *L){
FILE *fp = fopen("C:/Users/iio/Desktop/studentInfo.txt","r");
node st,*s,*t = L;
if(fp == NULL){
return 0;
}
while(fscanf(fp,"%d %s %s %d %d %d %d",&st.id,st.name,&st.gender,&st.Chinese,&st.math,&st.English,&st.sum) != EOF){
s = (node *)malloc(sizeof(node));
*s = st;
t->next = s;
t = s;
t->next = NULL;
}
fclose(fp);
return 1;
}