程序设计与实践 学生成绩管理 C语言

实验内容:

    设计一个菜单驱动的学生成绩管理程序,管理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里没有错误可以运行

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值