文章目录
前言
初步学习了C语言,在暑期实训时,我选择了“学生成绩管理系统”这个项目,写这篇文章主要是为了存放代码,同时也希望可以帮助到正在学习C语言的朋友们,本系统没有用到链表,或许可以为不熟悉链表但需要写系统的朋友提供些思路。
一、头文件(head.h)
代码如下:
typedef struct user
{
char ID[20];//账号
char password[20];//密码
char name[20];//名字
int flag;//老师:0,学生:1
}USER;
typedef struct score
{
char studentID[20];//学号
char name[20];//名字
int chinese;//科目成绩
int math;
int english;
float aver;//平均分
int total;//科目总成绩
}SCORE;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void zhuce();//注册
void menu();//菜单
void logic();//登录
void save_user(USER user[], int n);//存储用户信息
int read_user(USER user[]);//读用户信息
int xiuPw();//修改登录密码
void teacher();//教师页面
void student();//学生页面
int read_score(SCORE score[]);//读学生成绩信息
void save_score(SCORE score[], int n);//存储学生成绩信息
void increase();//老师向score.txt中添加学生成绩信息
void total();//查询所有学生成绩信息并排序
void find_score();//通过学号或姓名查询学生成绩信息和平均分,总分
int delete();//删除
void sort();//按学号排序
int xiuscore();//修改学生成绩信息
void total1();//输出学生成绩信息
void user1();//输出用户信息
二、主要函数部分
1.主函数
代码如下:
#include"head.h"
int main()
{
menu();
logic();
zhuce();
return 0;
}
主函数写的比较简单,因为每个板块之间的调用写在各个模块中了,大家看的时候仔细一点,以免读错。
2.注册模块
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void zhuce()
{
USER user[N];
int i = 0, ch1, ch2;
do
{
printf("请输入账号:\n");
fflush(stdin);
scanf("%s",&user[i].ID);
printf("请输入密码:\n");
scanf("%s", &user[i].password);
printf("请输入名字:\n");
scanf("%s", &user[i].name);
printf("请选择用户类型:\n教师:0\n学生:1\n");
scanf("%d", &user[i].flag);
i++;//保存用户注册信息
printf("确认注册:0\n取消注册:1\n");
scanf("%d", &ch1);
if (ch1 == 0)
{
save_user(user, i);
printf("注册成功\n");
}
else
{
menu();
}
printf("是否继续注册\n继续:0\n返回:1\n");
scanf("%d", &ch2);
} while (ch2 ==0);
menu();//主菜单模块在下面
}
3.主菜单模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
void menu()
{
int choice;
printf("-----欢迎来到学生成绩管理系统-----\n请选择登录或者注册?\n1->注册:0\n2->登录:1\n3->退出:2");
scanf("%d", &choice);
if (choice == 0)
zhuce();
else if (choice == 1)
logic();
else if (choice == 2)
exit(0);
else
printf("选择错误");
exit(0);
}
4.登录模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void logic()
{
char ID[20];//账号
char password[20];//密码
USER user[N];
int i, n, count = 0, result = 0;
n = read_user(user);
do
{
printf("请输入学号:\n");
fflush(stdin);
scanf("%s", &ID);//获得账号
printf("请输入密码:\n");
scanf("%s", &password);//获得密码
count++;
for (i = 0 ; i < n; i++)
{
if (strcmp(user[i].ID, ID) == 0 && strcmp(user[i].password, password) == 0 && count < 3)
{
printf("登陆成功\n");
result = 1;
if (user[i].flag == 0)
teacher();
else
student();
break;
}
}
if (i >= n && count < 3)
{
printf("输入错误,还有%d次机会\n",3 - count);
}
else if (count >= 3)
{
printf("错误次数过多,没有机会了\n");
exit(0);
}
} while (result == 0 && count < 3);
}
登录共有三次机会,在三次机会以内输入正确即可登录,否则退出。
5.储存用户注册信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
void save_user(USER user[], int n)
{
FILE* fp = fopen("user.txt", "a+");//将用户的信息储存在user.text文件中
int i;
if (fp == NULL)
{
printf("文件创建失败\n");
exit(0);
}
for (i = 0; i < n; i++)
{
fprintf(fp, "%s %s %s %d\n", user[i].ID, user[i].password,user[i].name,user[i].flag);//储存信息包括账号,密码,姓名和用户类型,学生是1,老师是0
}
fclose(fp);
}
6.读取用户注册信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
int read_user(USER user[])
{
int i;
FILE* fp = fopen("user.txt", "a+");
if (fp == NULL)
{
printf("文件打开失败\n");
exit(0);
}
for (i = 0; !feof(fp); i++)
{
fscanf(fp, "%s %s %s %d", user[i].ID, user[i].password, user[i].name,&user[i].flag);
}
fclose(fp);
return i - 1;
}
7.老师菜单模块
void teacher()
{
int ch;
printf("---欢迎老师---\n");
printf("修改密码:1\n");
printf("查询班级所有学生成绩:2\n");
printf("查询班级指定学生成绩:3\n");
printf("修改学生成绩:4\n");
printf("删除学生成绩:5\n");
printf("增加学生成绩信息:6\n");
printf("退出:0\n");
scanf("%d", &ch);
if (ch == 1)
{
xiuPw();
}//修改密码
else if(ch == 2)
{
total();
}//查看所有学生成绩
else if(ch == 3)
{
find_score();
}//查看指定学生成绩
else if (ch == 4)
{
xiuscore();
}//修改学生成绩
else if (ch == 5)
{
delete();
}//删除学生成绩
else if (ch == 6)
{
increase();
}//增加学生成绩
else if (ch == 0)
{
exit(0);
}//退出
}
8.学生菜单模块
void student()
{
int ch;
printf("---欢迎同学---\n");
printf("修改密码:1\n");
printf("查询班级所有学生成绩:2\n");
printf("查询班级指定学生成绩:3\n");
printf("退出:0\n");
scanf("%d", &ch);
if (ch == 1)
{
xiuPw();
}//修改密码
else if (ch == 2)
{
total();
}//查询所有学生成绩
else if (ch == 3)
{
find_score();
}//查询指定学生成绩
else if (ch == 0)
{
exit(0);
}//退出
}
9.修改密码模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
int xiuPw()
{
int n;
USER user[N];
n = read_user(user);
char password[20];
char password1[20];
int i, j, q = n;
FILE* fp;
char temp[20], temp1[20];
int ftemp, ftemp1, ftemp2;
fp = fopen("user1.txt", "wb+");
printf("修改前为:\n");
user1();
printf("请输入要修改的密码:\n");
scanf("%s", &password);
for (i = 0; i < n; i++)
{
if (strcmp(user[i].password, password) == 0)
{
printf("请输入新密码:\n");
scanf("%s", &password1);
user[i].ID;
strcpy(user[i].password, password1);
user[i].name;
user[i].flag;
}
}
printf("修改后结果为:\n");
for (i = 0; i < n; i++)
{
printf("%s %s %s %d\n", user[i].ID, user[i].password, user[i].name, user[i].flag);
}
for (i = 0; i < n; i++)
{
fprintf(fp, "%s %s %s %d\n", user[i].ID, user[i].password, user[i].name, user[i].flag);
}
n = q;
fclose(fp);
FILE* ft;
ft = fopen("score.txt", "rb+");
for (i = 0; !feof(fp); i++)
{
fscanf(ft, "%s %s %s %d", user[i].ID, user[i].password, user[i].name, &user[i].flag);
}
fclose(ft);
remove("user.txt");
rename("user1.txt", "user.txt");
printf("修改成功\n");
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
menu();
}
else if (ch == 1)
{
exit(0);
}
return 0;
}
10.打印用户信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void user1()
{
int n;
USER user[N];
n = read_user(user);
FILE* fp = fopen("user.txt", "r");
int i = 0;
getchar();
if (fp == NULL)
{
printf("打开文件失败\n");
exit(0);
}
for (i = 0; !feof(fp); i++)
{
fscanf(fp, "%s %s %s %d", user[i].ID, user[i].password, user[i].name, &user[i].flag);
}
for (i = 0; i < n; i++)
{
printf("%s %s %s %d\n", user[i].ID, user[i].password, user[i].name, user[i].flag);
}
fclose(fp);
}
该模块主要应用在修改密码模块,为修改密码提供账号,密码,姓名,用户类型等信息。
11.查询所有学生成绩信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void total()
{
int n;
SCORE score[N];
n = read_score(score);
FILE* fp = fopen("score.txt", "r");
int i=0;
getchar();
if (fp == NULL)
{
printf("打开文件失败\n");
exit(0);
}
for (i = 0; !feof(fp); i++)
{
fscanf(fp, "%s %s %d %d %d",
score[i].studentID, score[i].name, &score[i].chinese,
&score[i].math, &score[i].english);
}
for (i = 0; i <n; i++)
{
printf("学号:%s 姓名:%s 语文:%d 数学:%d 英语:%d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
sort();//按照语文成绩的大小进行倒序排序
fclose(fp);
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
teacher();
}
else if (ch == 1)
{
exit(0);
}
}
12.按照语文成绩对学生成绩信息进行排序模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void sort()//按成绩排序
{
int n;
SCORE score[N];
n = read_score(score);
int i, j, s, k;
char temp[20];
int ftemp, ftemp1, ftemp2;
for (i = 0; i < n - 1; i++)
{
for (j = n - 1; j > i; j--)
if (score[j - 1].chinese > score[j].chinese)//如果不想按照语文成绩排序,可以改为学号或其他
{
strcpy(temp, score[j - 1].studentID);
strcpy(score[j - 1].studentID, score[j].studentID);
strcpy(score[j].studentID, temp);
strcpy(temp, score[j - 1].name);
strcpy(score[j - 1].name, score[j].name);
strcpy(score[j].name, temp);
ftemp = score[j - 1].chinese;
score[j - 1].chinese = score[j].chinese;
score[j].chinese = ftemp;
ftemp1 = score[j - 1].math;
score[j - 1].math = score[j].math;
score[j].math = ftemp1;
ftemp2 = score[j - 1].english;
score[j - 1].english = score[j].english;
score[j].english = ftemp2;
}
}
printf("---------按语文成绩升序排序---------\n");
for (i = 0; i < n; i++)
{
printf("学号:%s 姓名:%s 语文:%d 数学:%d 英语:%d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
}
13.查询指定学生成绩信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void find_score()
{
char studentID[20];//学号
char name[20];//姓名
SCORE score[N];
int i, n, choice, result = 0;
n = read_score(score);
do
{
printf("按学号查询:0\t,按姓名查询:1\t");
fflush(stdin);
scanf("%d", &choice);
if (choice == 0)
{
printf("请输入学号:");
fflush(stdin);
scanf("%s", &studentID);//获得账号
for (i = 0; i < n; i++)
{
if (strcmp(score[i].studentID, studentID) == 0)
{
int total = score[i].math + score[i].chinese + score[i].english;
float aver = total / 3;
printf("学号\t姓名\t语文\t数学\t英语\t平均分\t总分\n");
printf("%s\t %s\t %d\t %d\t %d\t%0.2f\t %d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english, aver, total);
result = 1;
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
teacher();
}
else if (ch == 1)
{
exit(0);
}
}
}
if (i > n);
{
printf("学号输入错误\n");
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
teacher();
}
else if (ch == 1)
{
exit(0);
}
}
}
if (choice == 1)
{
printf("请输入姓名:");
fflush(stdin);
scanf("%s",&name);//获得姓名
for (i = 0; i < n; i++)
{
if (strcmp(score[i].name, name) == 0)
{
int total = score[i].math + score[i].chinese + score[i].english;
float aver = total / 3;
printf("学号\t姓名\t语文\t数学\t英语\t平均分\t总分\n");
printf("%s\t %s\t %d\t %d\t %d\t %0.2f\t %d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english, aver, total);
result = 1;
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
teacher();
}
else if (ch == 1)
{
exit(0);
}
}
}
if (i > n);
{
printf("姓名输入错误\n");
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
teacher();
}
else if (ch == 1)
{
exit(0);
}
}
}
} while (result == 0);
}
本模块的查询方式有学号和姓名两种。
14.修改学生成绩信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
int xiuscore()
{
int n;
SCORE score[N];
n = read_score(score);
char studentID[20];
char studentID1[20];
char name1[20];
int chinese1, math1, english1;
int i, j, q = n;
FILE* fp;
char temp[20], temp1[20];
int ftemp, ftemp1, ftemp2;
fp = fopen("score1.txt", "wb+");
for (i = 0; i < n - 1; i++)
{
for (j = n - 1; j > i; j--)
if (strcmp(score[j - 1].studentID, score[j].studentID) > 0)
{
strcpy(temp, score[j - 1].studentID);
strcpy(score[j - 1].studentID, score[j].studentID);
strcpy(score[j].studentID, temp);
strcpy(temp, score[j - 1].name);
strcpy(score[j - 1].name, score[j].name);
strcpy(score[j].name, temp);
ftemp = score[j - 1].chinese;
score[j - 1].chinese = score[j].chinese;
score[j].chinese = ftemp;
ftemp1 = score[j - 1].math;
score[j - 1].math = score[j].math;
score[j].math = ftemp1;
ftemp2 = score[j - 1].english;
score[j - 1].english = score[j].english;
score[j].english = ftemp2;
}
}
printf("修改前为:\n");
total1();//该模块为打印学生成绩模块,在修改信息前打印一次所有学生成绩信息,为修改和删除提供学号,姓名信息
printf("请输入要修改的学号:");
scanf("%s", &studentID);
for (i = 0; i < n; i++)
{
if (strcmp(score[i].studentID, studentID) == 0)
{
printf("请输入新的学号:");
scanf("%s", &studentID1);
printf("请输入新的新的姓名:");
scanf("%s", &name1);
printf("请输入新的语文成绩:");
scanf("%d", &chinese1);
printf("请输入新的数学成绩:");
scanf("%d", &math1);
printf("请输入新的英语成绩:");
scanf("%d", &english1);
strcpy(score[i].studentID, studentID1);
strcpy(score[i].name, name1);
score[i].chinese = chinese1;
score[i].math = math1;
score[i].english = english1;
}
}
printf("修改后为:\n");
for (i = 0; i < n; i++)
{
printf("学号:%s 姓名:%s 语文:%d 数学:%d 英语:%d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
for (i = 0; i < n; i++)
{
fprintf(fp, "%s\t %s\t %d\t %d\t %d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
n = q;
fclose(fp);
FILE* ft;
ft = fopen("score.txt", "rb+");
for (i = 0; i < n; i++)
{
fscanf(ft, "%s\t %s\t %d\t %d\t %d\n",
score[i].studentID, score[i].name, &score[i].chinese,
&score[i].math, &score[i].english);
}
fclose(ft);
remove("score.txt");
rename("score1.txt", "score.txt");
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
teacher();
}
else if (ch == 1)
{
exit(0);
}
return 0;
}
15.打印学生成绩信息模块(total1())
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void total1()
{
int n;
SCORE score[N];
n = read_score(score);
FILE* fp = fopen("score.txt", "r");
int i = 0;
getchar();
if (fp == NULL)
{
printf("打开文件失败\n");
exit(0);
}
for (i = 0; !feof(fp); i++)
{
fscanf(fp, "%s %s %d %d %d",
score[i].studentID, score[i].name, &score[i].chinese,
&score[i].math, &score[i].english);
}
for (i = 0; i < n; i++)
{
printf("学号:%s 姓名:%s 语文:%d 数学:%d 英语:%d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
fclose(fp);
}
16.删除学生成绩信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
int delete()
{
int n;
SCORE score[N];
n = read_score(score);
char studentID[20];
int i, j, q = n;
FILE* fp;
char temp[20],temp1[20];
int ftemp, ftemp1, ftemp2;
fp = fopen("score1.txt", "wb+");
printf("删除前为:\n");
total1();
printf("请输入要删除的学号:");
scanf("%s", &studentID);
for (i = 0; i < n; i++)
{
if (strcmp(score[i].studentID,studentID) == 0)
{
for (i = i; i < n - 1; i++)
{
strcpy(score[i].studentID, score[i + 1].studentID);
strcpy(score[i].name, score[i + 1].name);
score[i].chinese = score[i + 1].chinese;
score[i].math = score[i + 1].math;
score[i].english = score[i + 1].english;
}
}
}
n = n - 1;
printf("删除后为:\n");
for (i = 0; i < n; i++)
{
printf("学号:%s 姓名:%s 语文:%d 数学:%d 英语:%d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
for (i = 0; i <n; i++)
{
fprintf(fp, "%s\t %s\t %d\t %d\t %d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
n = q;
fclose(fp);
FILE* ft;
ft = fopen("score.txt", "rb+");
for (i = 0; i < n; i++)
{
fscanf(ft, "%s\t %s\t %d\t %d\t %d\n",
score[i].studentID, score[i].name, &score[i].chinese,
&score[i].math, &score[i].english);
}
fclose(ft);
remove("score.txt");
rename("score1.txt", "score.txt");
int ch;
printf("返回菜单:0\n退出:1\n");
scanf("%d", &ch);
if (ch == 0)
{
teacher();
}
else if (ch == 1)
{
exit(0);
}
return 0;
}
17.添加学生成绩信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
#define N 100
void increase()
{
SCORE score[N];
int i = 0, ch1,ch2;
printf("添加前为:\n");
total1();
do {
printf("请输入学号:\n");
fflush(stdin);
scanf("%s", &score[i].studentID);
printf("请输入姓名:\n");
scanf("%s", &score[i].name);
printf("请输入语文成绩:\n");
scanf("%d", &score[i].chinese);
printf("请输入数学成绩:\n");
scanf("%d", &score[i].math);
printf("请输入英语成绩:\n");
scanf("%d", &score[i].english);
i++;
printf("确认输入:0\n取消输入:1\n");
scanf("%d", &ch1);
if (ch1 == 0)
{
save_score(score, i);
printf("输入成功\n");
}
printf("添加后为:\n");
total1();
printf("是否继续输入:\n继续:0\n返回:1\n");
scanf("%d",&ch2);
} while (ch2 == 0);
}
18.储存学生成绩信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
void save_score(SCORE score[],int n)
{
FILE* fp = fopen("score.txt", "a+");//通过添加学生成绩信息方式添加到score.txt文件中
int i;
if (fp == NULL)
{
printf("文件创建失败\n");
exit(0);
}
for (i = 0; i < n; i++)
{
fprintf(fp, "%s\t %s\t %d\t %d\t %d\n",
score[i].studentID, score[i].name, score[i].chinese,
score[i].math, score[i].english);
}
fclose(fp);
}
19.读取学生成绩信息模块
#define _CRT_SECURE_NO_WARNINGS
#include"head.h"
int read_score(SCORE score[])
{
int i;
FILE* fp = fopen("score.txt", "a+");
if (fp == NULL)
{
printf("文件打开失败\n");
exit(0);
}
for (i = 0; !feof(fp); i++)
{
fscanf(fp, "%s\t %s\t %d\t %d\t %d\n",
score[i].studentID, score[i].name, &score[i].chinese,
&score[i].math, &score[i].english);
}
fclose(fp);
return i;
}
总结
以上就是学生成绩管理系统的所有代码模块,每个模块对应一个.c文件,加一个文件名就能用,因为没有用链表,纯用文件方式进行删除与修改,因此系统比较繁琐,仅供参考,希望能帮助到大家。