嗯,现在的计算机作业似乎十有八九都是学生管理系统这类东西,而且还得用C做,真是...嗯。
这里有一个用C写的,百度的排版不太好,将就看吧。
稍微说一下思路。先是定义一个学生结构,接着是一个类似管理者的结构,管理者中存储学生数组,并记录学生数。之后则是一系列操作,包括排序、计算平均值、读写文件等等,这些操作基本上都以管理者作为操作对象。最后当然就是界面菜单的处理。
运行程序时必须有stud.txt文件,另外,保存文件的操作没有设为自动进行,而是通过菜单选择进行。默认保存的文件名有stud.txt和stud2.txt,如果要存为其他文件需要自己输入文件名。
每个函数都有说明,希望你能看明白。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME_MAX_LENGTH 25
#define STUDENT_MAX_NUMBER 100
/* 定义学生信息结构 */
struct Student
{
int id;
char name[NAME_MAX_LENGTH];
int age;
float score;
};
/* 管理者结构 */
struct Manager
{
struct Student stus[STUDENT_MAX_NUMBER];
int size;
int stu_count;
};
/********************** 相关操作 ********************/
/*
交换两个学生信息
*/
void SwapStudents(struct Student *pStu1, struct Student *pStu2)
{
struct Student temp;
temp.id = pStu1->id;
temp.age = pStu1->age;
temp.score = pStu1->score;
strcpy(temp.name, pStu1->name);
pStu1->id = pStu2->id;
pStu1->age = pStu2->age;
pStu1->score = pStu2->score;
strcpy(pStu1->name, pStu2->name);
pStu2->id = temp.id;
pStu2->age = temp.age;
pStu2->score = temp.score;
strcpy(pStu2->name, temp.name);
}
/*
初始化管理者
*/
void InitializeManager(struct Manager *pm)
{
int i;
pm->size = NAME_MAX_LENGTH;
pm->stu_count = 0;
for (i=0; i<pm->size; ++i)
{
pm->stus[i].id = 0;
pm->stus[i].name[0] = 0;
pm->stus[i].age = 0;
pm->stus[i].score = 0.0f;
}
}
/*
查找一个学生
id: 学生id
return: 指定学生的索引,查找失败返回-1
*/
int SearchForOne(struct Manager *pm, int id)
{
int i;
for (i=0; i<pm->stu_count; ++i)
{
if (pm->stus[i].id != id) continue;
return i;
}
return -1;
}
/*
从文件中加载学生信息
szFileName: 文件名
return: 学生数。若读取失败,则返回0。
P.S. 如果文件中的学生数超过数组大小,则多余部分不会读入
*/
int LoadStudentsInfo(struct Manager *pm, char *szFileName)
{
char ch, str[10];
int i;
FILE *fp = fopen(szFileName, "r");
if (!fp) return 0;
for (i=0; i<pm->size; ++i)
{
if (fscanf(fp, "%d%c%s%d%s", &pm->stus[i].id, &ch, pm->stus[i].name,
&pm->stus[i].age, str) == EOF) break;
pm->stus[i].score = (float)atof(str);
}
fclose(fp);
return pm->stu_count = i;
}
/*
将学生信息保存到文件中
szFileName: 文件名
*/
int SaveStudentsInfo(struct Manager *pm, char *szFileName)
{
char ch = 'a';
int i;
FILE *fp = fopen(szFileName, "w");
if (!fp) return 0;
for (i=0; i<pm->stu_count; ++i)
{
fprintf(fp,"%03d%c %s %d %g\n", pm->stus[i].id, ch, pm->stus[i].name,
pm->stus[i].age, pm->stus[i].score);
}
fclose(fp);
return 1;
}
/*
根据ID排序
mode: 0 - 升序,非0 - 降序
*/
void SortByID(struct Manager *pm, int mode)
{
int i, j;
int flag = 1;
if (mode)
{
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].id < pm->stus[j+1].id)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
return;
}
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].id > pm->stus[j+1].id)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
}
/*
根据成绩排序
mode: 0 - 升序,非0 - 降序
*/
void SortByScore(struct Manager *pm, int mode)
{
int i, j;
int flag = 1;
if (mode)
{
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].score < pm->stus[j+1].score)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
return;
}
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].score > pm->stus[j+1].score)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
}
/*
平均成绩
*/
float AverageScore(struct Manager *pm)
{
float sum = 0.0f;
int i;
for (i=0; i<pm->stu_count; ++i) sum += pm->stus[i].score;
return sum / pm->stu_count;
}
/*
打印一个学生的信息
index: 学生索引
return: 非法索引值将返回0
*/
int PrintOne(struct Manager *pm, int index)
{
char ch = 'a';
if (index<0 || index>=pm->size) return 0;
printf("* * * * * * * * * * * * * *\n");
printf("ID:\t%03d%c\nName:\t%s\nAge:\t%d\nScore:\t%.1f\n", pm->stus[index].id, ch,
pm->stus[index].name, pm->stus[index].age, pm->stus[index].score);
printf("* * * * * * * * * * * * * *\n");
return 1;
}
/*
打印所有学生信息
*/
void PrintAll(struct Manager *pm)
{
char ch = 'a';
int i;
printf("* * * * * * * * * * * * * * * *\n");
printf("ID Name\tAge\tScore\n");
for (i=0; i<pm->stu_count; ++i)
{
printf("%03d%c: %s\t%d\t%.1f\n", pm->stus[i].id, ch,
pm->stus[i].name, pm->stus[i].age, pm->stus[i].score);
}
printf("* * * * * * * * * * * * * * * *\n");
}
/*
清除缓冲区中的剩余字符
*/
void clear()
{
for (; getchar()!=10; );
}
/*
界面处理
rank: 菜单级次。1: 显示所有学生信息;
2: 显示指定学生信息;
3: 修改指定学生信息;
4: 平均成绩;
5: 按ID升序排列;
6: 按成绩降序排列;
7: 重新从文件中读入学生数据;(文件可选)
8: 将当前学生信息保存到文件中;(文件可选)
9. 退出程序
return: 如果选择退出,返回0;否则返回非0值
*/
int InteraceProc(int rank, struct Manager *pm)
{
char sel = 0;
char szFile[30];
int id, index, res;
int age;
float score;
switch (rank)
{
case 0:
printf("\n");
printf("- - - - - - - - - - - - - - - - -\n");
printf("1. Information of all students\n");
printf("2. Information of one student\n");
printf("3. Modify data of one student\n");
printf("4. Average score\n");
printf("5. Sort by ID\n");
printf("6. Sort by score\n");
printf("7. Reload data from...\n");
printf("8. Save current data as...\n");
printf("9. Exit\n");
printf("- - - - - - - - - - - - - - - - -\n");
printf("Please choose one: ");
break;
case 1:
printf("\n");
PrintAll(pm);
clear();
break;
case 2:
id = -1;
printf("\nSpecify the student by ID: ");
scanf("%d", &id);
clear();
index = SearchForOne(pm, id);
if (index < 0) printf("Can't find the student.\n");
else PrintOne(pm, index);
clear();
break;
case 3:
printf("\nSpecify the student by ID: ");
scanf("%d", &id);
clear();
index = SearchForOne(pm, id);
if (index < 0)
{
printf("Can't find the student.\n");
break;
}
PrintOne(pm, index);
printf("Input the new age and new score: ");
res = scanf("%d %f", &age, &score);
clear();
if (!res) break;
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
pm->stus[index].age = age;
pm->stus[index].score = score;
PrintOne(pm, index);
clear();
break;
case 4:
score = AverageScore(pm);
printf("\nThe average score: %.2f", score);
clear();
break;
case 5:
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
printf("\n");
SortByID(pm, 0);
PrintAll(pm);
clear();
break;
case 6:
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
printf("\n");
SortByScore(pm, 1);
PrintAll(pm);
clear();
break;
case 7:
case 8:
printf("\n1. stud.txt");
printf("\n2. stud2.txt");
printf("\n3. other file");
printf("\n4. return");
printf("\nchoose one: ");
res = scanf("%d", &index);
clear();
if (!res || index<1 || index>3) break;
switch (index)
{
case 1: strcpy(szFile, "stud.txt"); break;
case 2: strcpy(szFile, "stud2.txt"); break;
case 3:
printf("Input the file name: ");
scanf("%s", szFile);
clear();
break;
}
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
if (rank == 7) res = LoadStudentsInfo(pm, szFile);
else res = SaveStudentsInfo(pm, szFile);
if (!res) printf("Can't open the file!\n");
break;
case 9:
printf("\nThe program end.");
getchar();
return 0;
}
return 1;
}
/******************* 主函数 *******************/
int main()
{
int sel, res;
struct Manager manager;
/* 程序的正常运行需要确保存在stud.txt文件 */
InitializeManager(&manager);
if (!LoadStudentsInfo(&manager, "stud.txt"))
{
printf("Can't load students data.\n");
printf("The program abort.");
getchar();
return -1;
}
for (; ; )
{
InteraceProc(0, &manager);
res = scanf("%d", &sel);
clear(); /* 如果没有这一句,在主菜单中输入非数字字符时,程序将陷入死循环 */
if (!res || !sel) continue;
if (!InteraceProc(sel, &manager)) break;
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考