简单的c程序学生成绩管理系统
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
typedef struct Lesson //定义课程结构体
{
int Lesson_Num;
char Lesson_Name[50];
int Lesson_Mark;
int Lesson_Credit;
}Lesson;
typedef struct Student // 定义学生的结构体
{
char Name[50];
int Num;
int Lesson_Count;
Lesson L[20];
}Student;
Student S[MAX];
static int Student_Count = 0; // 记录学生数的变量
void PrintInterface(); // 打印界面
int AddStudent(); // 添加,带返回值,提示操作成功
int DelStudent(); // 删除,带返回值,提示操作成功
void CheckStudent(); // 查学生成绩
void CheckClass(); // 查班成绩表
void WriteFile(); // 写入文本文件
void ReadFile(); // 读取文本文件
void main()
{
int Choice;
while (1)
{
PrintInterface();
scanf("%d%*c", &Choice); //"%*c" 是吸收回车的,因为后面会输入字母类型
if (Choice >= 0 && Choice <= 6) // 选择操作合法
{
switch (Choice)
{
case 0: exit(1);
case 1:
{
system("cls");
if (AddStudent()) printf("\n 添加成功...回车继续\n");
else printf("\n 添加失败...回车继续\n");
getchar();
getchar();
system("cls");
break;
}
case 2:
{
system("cls");
if (DelStudent()) printf("\n 删除成功...回车继续\n");
else printf("\n 删除失败...回车继续\n");
getchar();
getchar();
system("cls");
break;
}
case 3:
{
system("cls");
CheckStudent();
system("cls");
break;
}
case 4:
{
system("cls");
CheckClass();
system("cls");
break;
}
case 5: WriteFile();system("cls");break;
case 6: ReadFile();system("cls");break;
default:;
}
}
else
{
printf(" 无此功能..重新选择..回车确定\n"); // 选择操作非法
getchar();
system("cls"); // 清屏函数
}
}
}
void PrintInterface()
{
printf("\t -------------------------- \n");
printf("\t| 1 、添加|\n");
printf("\t| |\n");
printf("\t| 2 、删除|\n");
printf("\t| |\n");
printf("\t| 3 、查学生成绩|\n");
printf("\t| |\n");
printf("\t| 4 、查班成绩表|\n");
printf("\t| |\n");
printf("\t| 5 、写入文本文件|\n");
printf("\t| |\n");
printf("\t| 6 、读取文本文件|\n");
printf("\t| |\n");
printf("\t| 0 、退出|\n");
printf("\t -------------------------- \n");
printf("\t 选择操作:");
}
int AddStudent()
{
int S_count, i, j;
printf("\n 添加中......\n");
printf("\n 添加学生人数(如1、2 .. 999): ");
scanf("%d", &S_count);
if (Student_Count + S_count >= MAX) return 0; // 超过了数组上限
for (i = Student_Count; i < Student_Count + S_count; i++)
{
printf("\n\t 第%d 个学生: \n", i - Student_Count + 1);
printf("\n\t 学生学号: "); scanf("%d%*c", &S[i].Num);
printf("\n\t 学生姓名: "); gets(S[i].Name);
printf("\n\t 该学生所修课程数: "); scanf("%d", &S[i].Lesson_Count);
for (j = 0; j < S[i].Lesson_Count; j++)
{
printf("\n\t 第%d 门课: \n", j + 1);
printf("\n\t\t 课程编号: "); scanf("%d%*c", &S[i].L[j].Lesson_Num);
printf("\n\t\t 课程名称: "); gets(S[i].L[j].Lesson_Name);
printf("\n\t\t 课程成绩: "); scanf("%d", &S[i].L[j].Lesson_Mark);
printf("\n\t\t 课程学分: "); scanf("%d", &S[i].L[j].Lesson_Credit);
if (S[i].L[j].Lesson_Mark < 60) S[i].L[j].Lesson_Credit = 0; // 不及格的课程学
分为0
}
}
Student_Count += S_count;
return 1;
}
int DelStudent()
{
char *D_Name;
int D_Num;
int i, j;
printf("\n 填写待删除学生的信息: \n");
printf("\n 学生姓名: "); gets(D_Name);
printf("\n 学生学号: "); scanf("%d", &D_Num);
for (i = 0; i < Student_Count; i++)
{
if (!strcmp(S[i].Name, D_Name) && S[i].Num == D_Num)
{
printf("\n 找到该学生,删除中......\n");
for (j = i + 1; j < Student_Count; j++)
{
S[j - 1] = S[j];
}
break;
}
}
if (i == Student_Count)
{
printf("\n 未找到该学生...请核对所填信息\n\n");
return 0;
}
else
{
Student_Count--;
return 1;
}
}
void CheckStudent()
{
int C_Choice;
char C_Name[50];
int C_Num;
int i, j;
printf("\n 输入所查学生信息( 1.姓名\\ 2. 学号)选择: ");
scanf("%d%*c", &C_Choice);
printf("\n 查找中......\n");
if (C_Choice == 1 || C_Choice == 2) // 选择合法
{
if (C_Choice == 1)
{
printf("\n 姓名: "); gets(C_Name);
for (i = 0; i < Student_Count; i++) // 全部穷举,防止同名同姓
{
if (!strcmp(S[i].Name, C_Name))
{
printf("\n 学号: %d\t 姓名: %s\n", S[i].Num, S[i].Name);
printf("\n 课程编号\t 课程名称\t 课程成绩\t 课程学分\n");
printf("-----------------------------------------------------\n");
for (j = 0; j < S[i].Lesson_Count; j++)
{
printf("%d\t\t%s\t\t%d\t\t%d\n", S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name, S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("-----------------------------------------------------\n");
}
printf("\n\n");
}
}
}
else
{
printf("\n 学号: "); scanf("%d%*c", &C_Num);
for (i = 0; i < Student_Count; i++) // 不用全部穷举,学号唯一
{
if (S[i].Num == C_Num)
{
printf("\n 学号: %d\t 姓名: %s\n", S[i].Num, S[i].Name);
printf("\n 课程编号\t 课程名称\t 课程成绩\t 课程学分\n");
printf("-----------------------------------------------------\n");
for (j = 0; j < S[i].Lesson_Count; j++)
{
printf("%d\t\t%s\t\t%d\t\t%d\n", S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name, S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("-----------------------------------------------------\n");
}
printf("\n\n");
break;
}
}
}
printf(" 查找完毕...回车继续\n");
getchar();
}
else // 选择不合法
{
printf(" 选择错误...回车继续\n");
getchar();
return;
}
}
void CheckClass()
{
int C_LNum;
double SSNum = 0, PassSNum = 0, SMark = 0;
int i, j;
printf("\n 请输入课程编号: ");
scanf("%d%*c", &C_LNum);
printf("\n 查找中......\n\n");
printf(" 学号\t 姓名\t 课程名称\t 课程成绩\t 课程学分\n");
printf("----------------------------------------------------\n");
for (i = 0; i < Student_Count; i++)
{
for (j = 0; j < S[i].Lesson_Count; j++)
{
if (S[i].L[j].Lesson_Num == C_LNum)
{
printf("%d\t%s\t%s\t\t%d\t\t%d\n", S[i].Num, S[i].Name,
S[i].L[j].Lesson_Name,
S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("----------------------------------------------------\n");
SMark += S[i].L[j].Lesson_Mark;
SSNum ++;
if (S[i].L[j].Lesson_Mark >= 60) PassSNum++;
break;
}
}
}
printf("\n 平均分:%.2lf\t 及格率:%.2lf%%\n\n", SMark / SSNum, PassSNum / SSNum
* 100);
printf("\n 查找完毕...回车继续\n");
getchar();
}
void WriteFile()
{
FILE *fp;
int i, j;
char Adr[100];
printf("\n 请输入写入的文件地址: \n\n 地址输入格式:例如为转义
字符): ");
scanf("%s%*c", Adr);
printf("\n 写入中......\n");
if (fp = fopen(Adr,"w")) // 写入文件
{
fprintf(fp,"%d\n",Student_Count);
for (i = 0; i < Student_Count; i++)
{
fprintf(fp,"%d\t%s\t%d\n",S[i].Num, S[i].Name,S[i].Lesson_Count);
for (j = 0; j < S[i].Lesson_Count; j++)
{
fprintf(fp,"%d\t%s\t%d\t%d\n", S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
}
}
printf("\n 写入完成...回车继续\n");
fclose(fp);
}
else
{
printf("\n 写入失败...回车继续\n");
}
getchar();
}
void ReadFile()
{
FILE *fp;
int i, j;
char Adr[100];
printf("\n 请输入读取(为防止读入错误,希望与写入文件内容格式一致)的文件地址:
\n\n 地址输入格式:例如为转义字符): ");
scanf("%s%*c", Adr);
printf("\n 读取中......\n");
if (fp = fopen(Adr,"r"))
{
fscanf(fp,"%d",&Student_Count);
for (i = 0; i < Student_Count; i++)
{
fscanf(fp,"%d%s%d",&S[i].Num, &S[i].Name,&S[i].Lesson_Count);
for (j = 0; j < S[i].Lesson_Count; j++)
{
fscanf(fp,"%d%s%d%d",&S[i].L[j].Lesson_Num,
&S[i].L[j].Lesson_Name,&S[i].L[j].Lesson_Mark,
&S[i].L[j].Lesson_Credit);
}
}
printf("\n 读取成功...回车继续\n");
fclose(fp);
}
else
{
printf("\n 读取失败...回车继续\n");
}
getchar();
}
本文来自博客园,作者:JackieDYH,转载请注明原文链接:https://www.cnblogs.com/JackieDYH/p/17634985.html