实验内容:
设计一个菜单驱动的学生成绩管理程序,管理n个学生的m门考试科目成绩,实现以下基本功能。
(1)能够新增学生信息,并计算总分和平均分。
(2)能够根据学号修改和删除某学生信息。
(3)能够显示所有学生的成绩信息。
(4)能够分别按总分和学号进行排序。
(5)能够根据学号查询该学生的基本信息。
(6)学生成绩数据最终保存在文件scores.txt中,能够对文件读、写学生数据。
程序运行时,菜单形式如下。
Management for Students's scores
1.Append record
2.List record
3.Delete record
4.Modify record
5.Search record
6.Sort in descending order by sum
7.Sort in ascending order by sum
8.Sort in descending order by num
9.Sort in ascending order by num
W.Write to a File
R.Read from a File
0.Exit
Please input your choice:
要求用模块化方式组织程序结构,合理设计各个自定义函数。同时,程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include<math.h>
#define SUBJECT 4
typedef struct {
char num[10];
int score[SUBJECT];
char name[10];
int sum;
int average;
}Stu;
typedef struct STU {
Stu st;
STU* next;
}STU;
char menu()
{
printf("Management for Students's scores\n");
printf("1.-------Append record----------\n");
printf("2.--------List record-----------\n");
printf("3.-------Delete record----------\n");
printf("4.-------Modify record----------\n");
printf("5.-------Search record----------\n");
printf("6.Sort in descending order by sum\n");
printf("7.Sort in ascending order by sum\n");
printf("8.Sort in descending order by num\n");
printf("9.Sort in ascending order by num\n");
printf("W.------Write to a File---------\n");
printf("R.-----Read from a File---------\n");
printf("0.-----------Exit---------------\n");
printf("Please input your choice:");
char x = 0;
scanf("%c", &x);
return x;
}
void Add(STU* &L, int& length)
{
STU* p = (STU*)malloc(sizeof(STU)), *q = L;
int x = length, jude = 1;
while (jude) {
printf("The number is:");
scanf("%s", &p->st.num);
while (x--) {
if (!strcmp(p->st.num, q->next->st.num)) {
printf("The same ID!\n");
jude = 1;
printf("-ID----NAME---English---Chinese---Math---Sports-----SUM----Average\n");
printf("%s---%s------%d--------%d------%d------%d--------%3d-------%d\n", q->next->st.num, q->next->st.name, q->next->st.score[0], q->next->st.score[1], q->next->st.score[2], q->next->st.score[3], q->next->st.sum, q->next->st.average);
break;
}
else {
jude = 0;
}
q = q->next;
}
Sleep(2000);
system("cls");
}
printf("The name is:");
scanf("%s", &p->st.name);
printf("The English grade is:");
scanf("%d", &p->st.score[0]);
printf("The Chinese grade is:");
scanf("%d", &p->st.score[1]);
printf("The Math grade is:");
scanf("%d", &p->st.score[2]);
printf("The Sports grade is:");
scanf("%d", &p->st.score[3]);
p->st.sum = p->st.score[0] + p->st.score[1] + p->st.score[2] + p->st.score[3];
p->st.average = p->st.sum / SUBJECT;
p->next = L->next;
L->next = p;
length++;
system("cls");
printf("-------Add succeeded!------\n");
getchar();
}
void List(STU* p, int length)
{
printf("-ID----NAME---English---Chinese---Math---Sports-----SUM----Average\n");
while (length--) {
p = p->next;
printf("%s---%s------%d--------%d------%d------%d--------%3d-------%d\n", p->st.num, p->st.name, p->st.score[0], p->st.score[1], p->st.score[2], p->st.score[3], p->st.sum, p->st.average);
}
}
void Delete(STU* &L, int& length)
{
char ch[10] = { 0 };
int jude = 1, x = length;
printf("Please input ID to be deleted:");
scanf("%s", &ch);
getchar();
STU* p = L;
while (x--) {
if (!strcmp(ch, p->next->st.num)) {
jude = 0;
printf("-ID----NAME---English---Chinese---Math---Sports-----SUM----Average\n");
printf("%s---%s------%d--------%d------%d------%d--------%3d-------%d\n", p->next->st.num, p->next->st.name, p->next->st.score[0], p->next->st.score[1], p->next->st.score[2], p->next->st.score[3], p->next->st.sum, p->next->st.average);
STU* q = p->next->next;
p->next = q;
break;
}
p = p->next;
}
length--;
system("cls");
if (jude) {
printf("No this student!\n");
}
else {
printf("------Delete succeeded!-------\n");
}
}
void Modify(STU* &L,int length)
{
char ch[10] = { 0 };
printf("Please input ID to be modified:");
scanf("%s", &ch);
int jude = 1, jude_1 = 1, x = length, y = length;
STU* p = L, * q = L;
while (y--) {
if (!strcmp(ch, p->st.num)) {
jude_1 = 0;
printf("-ID----NAME---English---Chinese---Math---Sports-----SUM----Average\n");
printf("%s---%s------%d--------%d------%d------%d--------%3d-------%d\n", p->st.num, p->st.name, p->st.score[0], p->st.score[1], p->st.score[2], p->st.score[3], p->st.sum, p->st.average);
while (jude) {
printf("The number is:");
scanf("%s", &p->st.num);
if (!strcmp(p->st.num, ch)) {
jude = 0;
}
else {
while (x--) {
if (!strcmp(p->st.num, q->next->st.num)) {
printf("The same ID!\n");
jude = 1;
printf("-ID----NAME---English---Chinese---Math---Sports-----SUM----Average\n");
printf("%s---%s------%d--------%d------%d------%d--------%3d-------%d\n", q->next->st.num, q->next->st.name, q->next->st.score[0], q->next->st.score[1], q->next->st.score[2], q->next->st.score[3], q->next->st.sum, q->next->st.average);
break;
}
else {
jude = 0;
}
q = q->next;
}
Sleep(2000);
system("cls");
}
}
printf("The name is:");
scanf("%s", &p->st.name);
printf("The English grade is:");
scanf("%d", &p->st.score[0]);
printf("The Chinese grade is:");
scanf("%d", &p->st.score[1]);
printf("The Math grade is:");
scanf("%d", &p->st.score[2]);
printf("The Sports grade is:");
scanf("%d", &p->st.score[3]);
p->st.sum = p->st.score[0] + p->st.score[1] + p->st.score[2] + p->st.score[3];
p->st.average = p->st.sum / SUBJECT;
break;
}
p = p->next;
}
getchar();
system("cls");
if (jude_1) {
printf("No this student!\n");
}
else {
printf("-------Modify succeeded!------\n");
}
}
void Search(STU* L,int x)
{
char ch[10] = { 0 };
int jude = 1;
printf("Please input ID to find:");
scanf("%s", ch);
getchar();
STU* p = L;
while (x--) {
if (!strcmp(ch, p->next->st.num)) {
jude = 0;
printf("-ID----NAME---English---Chinese---Math---Sports-----SUM----Average\n");
printf("%s---%s------%d--------%d------%d------%d--------%3d-------%d\n", p->next->st.num, p->next->st.name, p->next->st.score[0], p->next->st.score[1], p->next->st.score[2], p->next->st.score[3], p->next->st.sum, p->next->st.average);
break;
}
p = p->next;
}
if (jude) {
printf("No this student!\n");
}
}
void SUMS(STU* &L, int length)
{
for (int i = 0; i < sqrt(length) + 1; i++) {
STU* p = L;
for (int j = 0; j < length - 1; j++) {
if (p->next->st.sum > p->next->next->st.sum) {
STU* f = p->next->next->next;
STU* q = p->next;
p->next = p->next->next;
p->next->next = q;
q->next = f;
}
p = p->next;
}
}
List(L, length);
}
void SUMJ(STU * &L, int length)
{
for (int i = 0; i < sqrt(length) + 1; i++) {
STU* p = L;
for (int j = 0; j < length - 1; j++) {
if (p->next->st.sum < p->next->next->st.sum) {
STU* f = p->next->next->next;
STU* q = p->next;
p->next = p->next->next;
p->next->next = q;
q->next = f;
}
p = p->next;
}
}
List(L, length);
}
void NUMS(STU * &L, int length)
{
for (int i = 0; i < sqrt(length) + 1; i++) {
STU* p = L;
for (int j = 0; j < length - 1; j++) {
if (strcmp(p->next->st.num , p->next->next->st.num)>0) {
STU* f = p->next->next->next;
STU* q = p->next;
p->next = p->next->next;
p->next->next = q;
q->next = f;
}
p = p->next;
}
}
List(L, length);
}
void NUMJ(STU * &L, int length)
{
for (int i = 0; i < sqrt(length) + 1; i++) {
STU* p = L;
for (int j = 0; j < length - 1; j++) {
if (strcmp(p->next->st.num, p->next->next->st.num) < 0) {
STU* f = p->next->next->next;
STU* q = p->next;
p->next = p->next->next;
p->next->next = q;
q->next = f;
}
p = p->next;
}
}
List(L, length);
}
void Write(STU * L, int length, FILE * &fp)
{
rewind(fp);
fprintf(fp, "%d\n", length);
while (length--) {
fprintf(fp, "%s %s %d %d %d %d\n", L->next->st.num, L->next->st.name, L->next->st.score[0], L->next->st.score[1], L->next->st.score[2], L->next->st.score[3]);
L = L->next;
}
Sleep(2000);
system("cls");
printf("-------Write succeeded!-------\n");
}
void Read(FILE * &fp, STU * &L, int& length)
{
fp = fopen("scores.txt", "r+");
if (fp == NULL) {
printf("----------NO FILE!----------\n");
}
else {
fscanf(fp, "%d\n", &length);
L->next = NULL;
for (int i = 0; i < length; i++) {
STU* p = (STU*)malloc(sizeof(STU));
fscanf(fp, "%s %s %d %d %d %d\n", &p->st.num, &p->st.name, &p->st.score[0], &p->st.score[1], &p->st.score[2], &p->st.score[3]);
p->st.sum = p->st.score[0] + p->st.score[1] + p->st.score[2] + p->st.score[3];
p->st.average = p->st.sum / SUBJECT;
p->next = L->next;
L->next = p;
}
printf("---------Read succeeded!--------\n");
}
}
int main()
{
FILE* fp=NULL;
STU* L = (STU*)malloc(sizeof(STU));
char choice, ch;
int length = 0;
while ((choice = menu()) != '0') {
while ((ch = getchar()) != '\n') {
choice = 'd';
}
system("cls");
switch (choice)
{
case '1':
Add(L, length);
Sleep(2000);
system("cls");
break;
case '2':
List(L, length);
Sleep(5000);
system("cls");
break;
case '3':
Delete(L, length);
Sleep(2000);
system("cls");
break;
case '4':
Modify(L,length);
Sleep(2000);
system("cls");
break;
case '5':
Search(L,length);
Sleep(3000);
system("cls");
break;
case '6':
SUMS(L, length);
Sleep(5000);
system("cls");
break;
case '7':
SUMJ(L, length);
Sleep(5000);
system("cls");
break;
case '8':
NUMS(L, length);
Sleep(5000);
system("cls");
break;
case '9':
NUMJ(L, length);
Sleep(5000);
system("cls");
break;
case 'W':
Write(L, length, fp);
Sleep(2000);
system("cls");
break;
case 'R':
Read(fp, L, length);
Sleep(2000);
system("cls");
break;
default:
printf("------INPUT ERROR!-----\n");
Sleep(2000);
system("cls");
break;
}
}
fclose(fp);
return 0;
}
经检查没有错误,也许是我能力不够没查出来,不过在VS里没有错误可以运行