前言:
有朋友最近在做c语言课设,要求写一个班级成绩管理系统,便写份简单的代码来玩。代码原创,未参考任何其他人的代码
程序要求
说明
- 本程序主要采用结构体数组
- 本文件采用多文件编写,由于程序规模小,故未采用编写头文件的方式
- 使用 #pragma once 来防止头文件重复包含
代码
怎么使用本程序看看注释应该就知道了。run main.c 就行。其他各文件作用:
- def.c 定义了一些常量和全局变量,结构体
- myIO.c 实现了成绩录入和成绩打印输出
- file.c 实现了将成绩保存为文件
- menu.c 实现了菜单功能
- function.c 包含其他一些要用的函数
main.c
#include "menu.c"
int main()
{
select();
return 0;
}
def.c
// 相同头文件只包含一次,后不赘述
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define Status int
// 课程
typedef struct Course
{
char name[30];
int score;
} Course, *pCourse;
// 学生
typedef struct Student
{
char number[30];
char name[30];
pCourse pC;
} Student, *pStudent;
// n是学生数, m是课程数
int n, m;
char courseName[30], studentName[30], course[20][30];
pStudent pS = NULL;
myIO.c
#pragma once
#include "def.c"
pStudent inputStudentInfo(void);
void printStudentInfo(pStudent pS);
// 录入学生信息
pStudent inputStudentInfo(void)
{
int i, j;
printf("Please input the number of students and courses: ");
scanf("%d %d", &n, &m);
printf("Please input the name of courses: ");
for (i = 0; i < m; i++)
{
scanf("%s", course[i]);
}
pStudent pS = (pStudent)malloc(sizeof(Student) * n);
if (!pS)
return NULL;
printf("Please input the info: \n");
for (i = 0; i < n; i++)
{
pS[i].pC = (pCourse)malloc(sizeof(Course) * m);
if (!pS[i].pC)
return NULL;
scanf("%s %s", pS[i].name, pS[i].number);
for (j = 0; j < m; j++)
{
strcpy(pS[i].pC[j].name, course[j]);
scanf("%d", &pS[i].pC[j].score);
}
}
return pS;
}
// 打印所有学生信息
void printStudentInfo(pStudent pS)
{
int i, j;
// 打印标题
printf("Name\tnumber\t");
for (i = 0; i < m - 1; i++)
printf("%s\t", course[i]);
printf("%s\n", course[i]);
// 显示信息
for (i = 0; i < n; i++)
{
printf("%s\t%s\t", pS[i].name, pS[i].number);
for (j = 0; j < m - 1; j++)
printf("%d\t", pS[i].pC[j].score);
printf("%d\n", pS[i].pC[j].score);
}
}
file.c
#pragma once
#include "def.c"
Status saveStudentInfo(pStudent pS);
Status saveStudentInfo(pStudent pS)
{
FILE *fp;
int i, j;
char filename[30], str[100] = "student number";
printf("please input the filename: ");
scanf("%s", filename);
fp = fopen(filename, "w");
if (!fp)
return ERROR;
for (i = 0; i < m; i++)
{
strcat(str, " ");
strcat(str, course[i]);
}
strcat(str, "\n");
for (i = 0; i < n; i++)
{
strcat(str, pS[i].name);
strcat(str, " ");
strcat(str, pS[i].number);
for (j = 0; j < m; j++)
{
char score[30];
itoa(pS[i].pC[j].score, score, 10);
strcat(str, " ");
strcat(str, score);
}
strcat(str, "\n");
}
fputs(str, fp);
fclose(fp);
return OK;
}
menu.c
#pragma once
#include "def.c"
#include "myIO.c"
#include "file.c"
#include "function.c"
void menu();
void select();
// 菜单
void menu()
{
printf("------------------------------------\n");
printf("| Menu |\n");
printf("| 1. input |\n");
printf("| 2. show |\n");
printf("| 3. save |\n");
printf("| 4. sort |\n");
printf("| 5. modify |\n");
printf("| 6. count |\n");
printf("| 0. exit |\n");
printf("------------------------------------\n");
}
void select()
{
int branch;
while (TRUE)
{
system("cls");
menu();
printf("[Input]: ");
scanf("%d", &branch);
if (!branch)
break;
switch (branch)
{
case 1:
{
pS = inputStudentInfo();
if (pS == NULL)
printf("input error! please input again\n");
else
printf("Input success!\n");
system("pause");
break;
}
case 2:
{
printStudentInfo(pS);
system("pause");
break;
}
case 3:
{
if (OK == saveStudentInfo(pS))
printf("Save success!\n");
else
printf("Save fail!\n");
system("pause");
break;
}
case 4:
{
sort(pS);
printf("sort success\n");
system("pause");
break;
}
case 5:
{
int res = modify(pS);
if (res)
{
printf("change success!\n");
}
else
{
printf("change fail!\n");
}
system("pause");
break;
}
case 6:
{
int choose;
// 输入1 显示每门课程最高成绩信息
// 输入2 显示每门课程平均成绩信息
printf("choose 1 for the highest score: \n ");
printf("choose 2 for the average score: \n");
printf("[Input]: ");
scanf("%d", &choose);
if (choose == 1)
{
showMax(pS);
}
else if (choose == 2)
{
showAverage(pS);
}
else
{
// 输入非法提示信息
printf("Input error!\n");
}
system("pause");
break;
}
}
}
}
function.c
#include "def.c"
void sort(pStudent pS);
void Swap(pStudent s1, pStudent s2);
void showAverage(pStudent pS);
void showMax(pStudent pS);
Status modify(pStudent pS);
// 按课程成绩排序
void sort(pStudent pS)
{
int courseNumber, i, j, k;
char courseName[30];
printf("please input the course name which you want to sort: ");
scanf("%s", courseName);
for (courseNumber = 0; courseNumber < m; courseNumber++)
if (strcmp(course[courseNumber], courseName) == 0)
break;
// 如果找不到课程,则认为是按总分排序
if (courseNumber == m)
{
printf("Sort as total score: \n");
// 选择排序
for (i = 0; i < n - 1; i++)
{
int flag = i;
for (j = i + 1; j < n; j++)
{
int totalScore_1 = 0, totalScore_2 = 0;
for (k = 0; k < m; k++)
{
totalScore_1 += pS[j].pC[k].score;
totalScore_2 += pS[flag].pC[k].score;
}
if (totalScore_1 > totalScore_2)
{
flag = j;
}
}
Swap(&pS[i], &pS[flag]);
}
}
else
{
// 选择排序
for (i = 0; i < n - 1; i++)
{
int flag = i;
for (j = i + 1; j < n; j++)
{
if (pS[j].pC[courseNumber].score > pS[flag].pC[courseNumber].score)
{
flag = j;
}
}
Swap(&pS[i], &pS[flag]);
}
}
}
// 修改学生信息
Status modify(pStudent pS)
{
// 密码是1314
char password[30] = "1314", psd[30];
char number[30];
int score, i, j;
printf("please input password: ");
scanf("%s", psd);
// 密码正确才继续,否则返回ERROR
if (strcmp(password, psd) == 0)
{
printf("please input the student's number: ");
scanf("%s", number);
for (i = 0; i < n; i++)
{
// 找到学生则继续,否则返回ERROR
if (strcmp(pS[i].number, number) == 0)
{
printf("please input the course and score one by one: \n");
scanf("%s %d", courseName, &score);
for (j = 0; j < m; j++)
{
// 找到课程才继续,否则返回ERROR
if (strcmp(pS[i].pC[j].name, courseName) == 0)
{
// 修改课程成绩
pS[i].pC[j].score = score;
return OK;
}
}
return ERROR;
}
}
return ERROR;
}
else
return ERROR;
}
// 输出各课程最高分的学生
void showMax(pStudent pS)
{
int i, j, max;
for (i = 0; i < m; i++)
{
max = 0;
for (j = 0; j < n; j++)
{
if (pS[j].pC[i].score > pS[max].pC[i].score)
max = j;
}
printf("%s\t%s\t%s\t%d\n", course[i], pS[max].name, pS[max].number, pS[max].pC[i].score);
}
}
// 显示各课程的平均成绩
void showAverage(pStudent pS)
{
int i, j;
double ave;
for (i = 0; i < m; i++)
{
ave = 0;
for (j = 0; j < n; j++)
{
ave += pS[j].pC[i].score;
}
printf("%s\t%.2lf\n", course[i], ave / n);
}
}
void Swap(pStudent s1, pStudent s2)
{
int i;
char studentName[30], number[30];
// 交换姓名
strcpy(studentName, s1->name);
strcpy(s1->name, s2->name);
strcpy(s2->name, studentName);
// 交换学号
strcpy(number, s1->number);
strcpy(s1->number, s2->number);
strcpy(s2->number, number);
// 交换成绩
for (i = 0; i < m; i++)
{
int temp = s1->pC[i].score;
s1->pC[i].score = s2->pC[i].score;
s2->pC[i].score = temp;
}
}