学生成绩管理系统(C)
/*
**********************************************************************************
* 大一第一学期期末成绩管理系统
*
* 开发环境:VC++6.0
*
* 将全班学生成绩以记录的形式存储在文件中
* 记录包含每个学生的姓名、学号、性别、三科(高等数学、大学英语、C语言)成绩
* 程序功能:1.求各门课程总分、平均分; 2.求各个学生总分、平均分;
* 3.按姓名、学号查找学生记录并显示; 4.浏览全部学生成绩;
*
* Author: 啊杜
* email : ttl7626@126.com
**********************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUBJECT_NUMBER 3 //课程数目
#define SUBJECT_LENGTH 20 //课程名最大长度
#define NAME_LENGTH 20 //姓名最大长度
#define CODE_LENGTH 10 //学号最大长度
#define SEX 5 //性别长度
#define FILE_LENGTH 80 //文件名最大长度
#define BUFFER_LENGTH 80 //缓冲区最大长度
char subjectName[SUBJECT_NUMBER][SUBJECT_LENGTH] = {"高等数学", "大学英语", "C语言"}; //课程名称
int total[SUBJECT_NUMBER]; //各课程总分
char fileName[FILE_LENGTH]; //文件名
//结构——学生记录
struct record
{
char name[NAME_LENGTH+1]; //姓名
char code[CODE_LENGTH+1]; //学号
char sex[SEX]; //性别
int mark[SUBJECT_NUMBER+1]; //各科成绩
int total; //总分
}student;
//从指定文件读入一个记录
int ReadRecord (FILE *fpt, struct record *ppt)
{
char buf[BUFFER_LENGTH];
int i;
if (1 != fscanf (fpt, "%s", buf))
{
printf ("文件 %s 无法打开!\n", fpt);
return 0;
}
strncpy (ppt->name, buf, NAME_LENGTH); //存储学生姓名
fscanf (fpt, "%s", buf);
strncpy (ppt->code, buf, CODE_LENGTH); //存储学生学号
fscanf (fpt, "%s", buf);
strncpy (ppt->sex, buf, SEX); //存储学生性别
for (i = 0; i < SUBJECT_NUMBER; i++)
fscanf(fpt, "%d", &ppt->mark[i]); //存储学生各科成绩
for (ppt->total = 0, i = 0; i < SUBJECT_NUMBER; i++)
ppt->total += ppt->mark[i]; //计算学生总成绩
return 1;
}
//对指定文件写入一个记录
void WriteRecord (FILE *fpt, struct record *ppt)
{
int i;
fprintf (fpt, "%s\n", ppt->name); //写入学生姓名
fprintf (fpt, "%s\n", ppt->code); //写入学生学号
fprintf (fpt, "%s\n", ppt->sex); //写入学生性别
for (i = 0; i < SUBJECT_NUMBER; i++)
fprintf(fpt, "%d\n", ppt->mark[i]); //写入学生各科成绩
}
//显示某个学生的记录
void DisplayStudent (struct record *ppt)
{
int i;
printf ("\n姓名: %s\n", ppt->name); //显示姓名
printf ("\n学号: %s\n", ppt->code); //显示学号
printf ("\n性别: %s\n", ppt->sex); //显示性别
printf ("各科成绩:\n");
for (i = 0; i < SUBJECT_NUMBER; i++)
printf ("%-s :%d\n", subjectName[i], ppt->mark[i]); //显示各科成绩
printf ("\n总分: %d\n", ppt->total); //显示学生总分
printf ("\n平均分: %.2f\n", (float)ppt->total / SUBJECT_NUMBER); //显示学生平均分
}
//显示所有学生的记录
void ListStudent (char *fname)
{
FILE *fp;
struct record s;
if (NULL == (fp = fopen(fname, "r")))
{
printf ("文件 %s 打不开!", fname);
return ;
}
while (0 != ReadRecord (fp, &s))
{
DisplayStudent(&s); //显示学生信息
printf ("Press \"Enter\" to continue...");
while (‘\n‘ != getchar())
;
}
fclose(fp);
return ;
}
//计算各科总分
int TotalMark (char *fname)
{
FILE *fp;
struct record s;
int i, count = 0;
if (NULL == (fp = fopen(fname, "r"))) //如果文件打不开,就退出
{
printf ("文件 %s 打不开!", fname);
return 0;
}
for (i = 0; i < SUBJECT_NUMBER; i++) //初始化各科总分为0
total[i] = 0;
while (0 != ReadRecord (fp, &s))
{
for (i = 0; i < SUBJECT_NUMBER; i++)
total[i] += s.mark[i]; //各科总分
count++; //有记录的学生人数
}
fclose(fp);
return count; //返回记录数
}
//按学生姓名查找记录
int RetrieveByName (char *fname, char *key)
{
FILE *fp;
int n = 0;
struct record s;
if (NULL == (fp = fopen(fname, "r")))
{
printf ("文件 %s 无法打开!\n", fname);
return 0;
}
while (0 != ReadRecord (fp, &s))
{
if (0 == (strcmp (s.name, key))) //按姓名查找某一个或多个学生
{
DisplayStudent (&s); //显示某一个或多个学生的记录
n++;
}
}
fclose (fp);
if (0 == n)
printf ("学生 %s 不在文件 %s 中!\n", key, fname);
return 1;
}
//按学生学号查找记录
int RetrieveByCode (char *fname, char *key)
{
FILE *fp;
int n = 0;
struct record s;
if (NULL == (fp = fopen(fname, "r")))
{
printf ("文件 %s 无法打开!\n", fname);
return 0;
}
while (0 != ReadRecord (fp, &s))
{
if (0 == (strcmp (s.code, key))) //按学号查找某一个学生
{
DisplayStudent (&s); //显示某一个个学生的记录
n++;
break;
}
}
fclose (fp);
if (0 == n)
printf ("学生 %s 不在文件 %s 中!\n", key, fname);
else if (1 != n)
printf ("学生 %s 学号被盗用!\n", key);
return 1;
}
//主函数
main (void)
{
FILE *fp;
int i, j, n;
char c;
char buf[BUFFER_LENGTH];
//int total[SUBJECT_NUMBER];
struct record s;
printf ("输入储存学生记录的文件名: ");
scanf ("%s", fileName);
if(NULL == (fp = fopen(fileName, "r")))
{
printf ("文件 %s 无法打开或不存在,你要建立一个吗?(Y/N) ", fileName);
getchar();
c = getchar();
if(‘Y‘ == c || ‘y‘ == c)
{
fp = fopen(fileName, "w");
printf ("你要往文件中输入多少个记录: ");
scanf ("%d", &n);
for(i = 0; i < n; i++)
{
printf ("输入学生姓名: ");
scanf ("%s", &s.name);
printf ("输入学生学号: ");
scanf ("%s", &s.code);
printf ("输入学生性别:");
scanf ("%s", &s.sex);
for(j = 0; j < SUBJECT_NUMBER; j++)
{
printf ("输入 %s 成绩: ",subjectName[j]);
scanf ("%d", &s.mark[j]);
}
WriteRecord (fp, &s);
}
fclose(fp);
}
}
fclose(fp);
getchar();
puts("现在可以输入命令来管理学生记录了!");
puts("m : 各科平均分");
puts("t : 各科总分");
puts("n : 通过姓名查找学生记录");
puts("c : 通过学号查找学生记录");
puts("l : 查看全部学生记录");
puts("q : 退出");
while(1)
{
puts("输入命令:");
scanf (" %c",&c);
if(‘q‘ == c || ‘Q‘ == c)
{
puts("\n 谢谢使用(*^_^*).");
break; //结束程序运行
}
switch(c)
{
case ‘m‘: //计算平均分
case ‘M‘:
if(0 == (n = TotalMark(fileName)))
{
puts("错误!");
break;
}
printf ("\n");
for(i = 0; i < SUBJECT_NUMBER; i++)
printf ("%-s 的平均分: %.2f\n", subjectName[i], (float)total[i] / n);
break;
case ‘t‘: //计算总分
case ‘T‘:
if(0 == (n = TotalMark (fileName)))
{
puts("错误!");
break;
}
printf ("\n");
for(i = 0; i < SUBJECT_NUMBER; i++)
printf("%-s 的总分: %d\n", subjectName[i], total[i]);
break;
case ‘n‘: //按学生的姓名寻找记录
case ‘N‘:
printf ("输入你要查询的学生的姓名: ");
scanf ("%s", buf);
RetrieveByName (fileName, buf); //按姓名查找的查询结果
break;
case ‘c‘: // 按学生的学号寻找记录
case ‘C‘:
printf ("输入你要查询的学生的学号: ");
scanf ("%s",buf);
RetrieveByCode (fileName, buf); //按学号查找的查询结果
break;
case ‘l‘: // 列出所有学生记录
case ‘L‘:
ListStudent (fileName);
break;
default:
break;
}
}
return 0;
}
用C语言写的学生管理系统,布布扣,bubuko.com
用C语言写的学生管理系统