学生信息管理系统(结构化程序)(C语言)

一、实验目的

  1. 明确结构化程序设计的基本结构。
    2.通过对问题的分析,设计合理的结构化程序解决问题
    二、实验内容
    对学生信息管理系统,要求完成以下基本任务:
    1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
    2.将功能补充完全(基于文件处理,完成刷新和保存功能)。
    3.将学生信息改为更好的数据组织,而非离散形式(结构体)。
    提高要求:
    可将程序中的不足(如数据验证)等根据自己的能力与理解完成。

三、算法流程图
程序框架流程图:
学生信息管理系统(结构化程序)(C语言)
主要算法流程图
学生信息管理系统(结构化程序)(C语言)
学生信息管理系统(结构化程序)(C语言)
四、主要代码
学生信息结构化:`

struct xinxi {
	char code[LEN + 1];	/* 学号*/
	char name[LEN + 1];	/* 姓名*/
	int age;			/* 年龄*/
	char sex[LEN + 1];		/* 性别*/
	float score[3];     /* 3门课程成绩*/
}stud[N];

源代码:

/*********************************************************************************
*FileName:  Test1.cpp
*Author:  Elf.苏洛曦
*e-mail:  [email protected]
*Version:  1.0.0
*Date:  2019.2.26
*Description: 学生信息管理系统
*History:
1.Date:    2019.4.7
Author:  Elf.苏洛曦
Modification:   Create  project
2.Date:    2019.4.9
Author:  Qixiang.Su
Modification:   Edit  project
**********************************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>	/*I/O函数*/
#include<stdlib.h>	/*其它说明*/
#include<string.h>	/*字符串函数*/
#define LEN 15		/* 学号和姓名最大字符数,实际请更改*/
#define N 50		/* 最大学生人数,实际请更改*/

//定义学生信息结构体
struct xinxi {
	char code[LEN + 1];	/* 学号*/
	char name[LEN + 1];	/* 姓名*/
	int age;			/* 年龄*/
	char sex[LEN + 1];		/* 性别*/
	float score[3];     /* 3门课程成绩*/
}stud[N];

int k = 1, n, m;    //n为学生的总人数,m为新增学生数

void save();    //保存学生信息
void seek();     //查找
void modify();   //修改学生信息
void insert();   //插入学生信息
void del();      //删除学生信息
void display();  //显示当前的学生信息
void menu();      //主界面
void read();      //读取信息

int main() {
	while (k) {
		menu();
	}
	system("pause");
	return 0;
}


void help() {
	printf("\n0.欢迎使用系统帮助!\n");
	printf("\n1.初次进入系统后,请先选择增加学生信息;\n");
	printf("\n2.按照菜单提示键入数字代号;\n");
	printf("\n3.增加学生信息后,切记保存;\n");
	printf("\n4.谢谢您的使用!\n");
}

void read() {
	char filename[LEN + 1];
	FILE *p;
	int i = 0;
	printf("请输入已经存有学生信息的文件名:\n");
	scanf("%s", filename);
	if ((p = fopen(filename, "r")) == NULL) {
		printf("error on open %s!", filename);
		printf("先选择菜单4输入学生信息并保存\n");
		system("pause");
		return;
	}
	while (fscanf(p, "%s%s%d%s%f%f%f\n", stud[i].code, stud[i].name, &stud[i].age, stud[i].sex,
		&stud[i].score[0], &stud[i].score[1], &stud[i].score[2]) == 7) {
		i++;
	}
	n = i;
	if (0 == i) {
		printf("文件为空");
	}
	else {
		printf("读入完成\n");
		fclose(p);
		system("pause");
	}
}


void seek() {
	int i, item, flag;
	char s1[21]; /* 以姓名和学号最长长度+1为准*/
	printf("------------------\n");
	printf("-----1.按学号查询-----\n");
	printf("-----2.按姓名查询-----\n");
	printf("-----3.退出本菜单-----\n");
	printf("------------------\n");
	while (1) {
		printf("请选择子菜单编号:");
		scanf("%d", &item);
		flag = 0;
		switch (item) {
		case 1:
			printf("请输入要查询的学生的学号:\n");
			scanf("%s", s1);
			for (i = 0; i < n; i++) {
				if (strcmp(stud[i].code, s1) == 0) {
					flag = 1;
					printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");
					printf("--------------------------------------------------------------------\n");
					printf("%6s %7s %6d %6s %9.1f %10.1f %10.1f\n", stud[i].code, stud[i].name, stud[i].age,
						stud[i].sex, stud[i].score[0], stud[i].score[1], stud[i].score[2]);
				}
			}
			if (0 == flag) {
				printf("该学号不存在!\n");
				break;
			}
		case 2:
			printf("请输入要查询的学生的姓名:\n");
			scanf("%s", s1);
			for (i = 0; i < n; i++) {
				if (strcmp(stud[i].name, s1) == 0)
				{
					flag = 1;
					printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");
					printf("--------------------------------------------------------------------\n");
					printf("%6s %7s %6d %6s %9.1f %10.1f %10.1f\n", stud[i].code, stud[i].name, stud[i].age,
						stud[i].sex, stud[i].score[0], stud[i].score[1], stud[i].score[2]);
				}
			}
			if (0 == flag) {
				printf("该姓名不存在!\n");
				break;
			}
		case 3:
			return;
		default:
			printf("请在1-3之间选择\n");
		}
	}
}


void modify() {
	int i, item, num = -1;            //item表示输入的菜单编号,num为学生数组的序号
	char sex1[LEN + 1], s1[LEN + 1], s2[LEN + 1]; /* 以姓名和学号最长长度+1为准*/
	float score1;
	printf("请输入要要修改的学生的学号:\n");
	scanf("%s", s1);
	for (i = 0; i < n; i++) {
		if (strcmp(stud[i].code, s1) == 0) {
			num = i;
		}
	}
	if (num != -1) {
		printf("------------------\n");
		printf("1.修改姓名\n");
		printf("2.修改年龄\n");
		printf("3.修改性别\n");
		printf("4.修改C语言成绩\n");
		printf("5.修改高等数学成绩\n");
		printf("6.修改大学英语成绩\n");
		printf("7.退出本菜单\n");
		printf("------------------\n");
		while (1) {
			printf("请选择子菜单编号:");
			scanf("%d", &item);
			switch (item) {
			case 1:
				printf("请输入新的姓名:\n");
				scanf("%s", s2);
				strcpy(stud[num].name, s2); break;
			case 2:
				printf("请输入新的年龄:\n");
				scanf("%d", &stud[num].age); break;
			case 3:
				printf("请输入新的性别:\n");
				scanf("%s", sex1);
				strcpy(stud[num].sex, sex1); break;
			case 4:
				printf("请输入新的C语言成绩:\n");
				scanf("%f", &score1);
				stud[num].score[0] = score1; break;
			case 5:
				printf("请输入新的高等数学成绩:\n");
				scanf("%f", &score1);
				stud[num].score[1] = score1; break;
			case 6:
				printf("请输入新的大学英语成绩:\n");
				scanf("%f", &score1);
				stud[num].score[2] = score1; break;
			case 7:	return;
			default:printf("请在1-7之间选择\n");
			}
		}
		printf("修改成功!");
	}
	else {
		printf("该学号不存在!\n");
		system("pause");
	}
}

void sort() {
	int i, j, k, *p, *q, s;
	char temp[LEN + 1], ctemp;
	float ftemp;
	for (i = 0; i < n - 1; i++) {
		for (j = n - 1; j > i; j--) {
			if (strcmp(stud[j - 1].code, stud[j].code)>0)
			{
				strcpy(temp, stud[j - 1].code);
				strcpy(stud[j - 1].code, stud[j].code);
				strcpy(stud[j].code, temp);
				strcpy(temp, stud[j - 1].name);
				strcpy(stud[j - 1].name, stud[j].name);
				strcpy(stud[j].name, temp);
				strcpy(temp, stud[j - 1].sex);
				strcpy(stud[j - 1].sex, stud[j].sex);
				strcpy(stud[j].sex, temp);
				p = &stud[j - 1].age;
				q = &stud[j].age;
				s = *q;
				*q = *p;
				*p = s;
			}
			for (k = 0; k < 3; k++) {
				ftemp = stud[j - 1].score[k];
				stud[j - 1].score[k] = stud[j].score[k];
				stud[j].score[k] = ftemp;
			}
		}
	}
}

void insert() {
	int i = n, j, flag;

	printf("请输入待增加的学生数:\n");
	scanf("%d", &m);
	if (m > 0) {
		do {
			flag = 1;
			while (flag) {
				flag = 0;
				printf("请输入第%d位学生的学号:\n", i + 1);
				scanf("%s", stud[i].code);
				for (j = 0; j < i; j++) {
					if (strcmp(stud[i].code, stud[j].code) == 0) {
						printf("该学号已存在!");
						flag = 1;
						break;
					}
				}
			}
			printf("请输入第%d 个学生的姓名:\n", i + 1);
			scanf("%s", stud[i].name);
			printf("请输入第%d 个学生的年龄:\n", i + 1);
			scanf("%d", &stud[i].age);
			printf("请输入第%d 个学生的性别:\n", i + 1);
			scanf(" %s", stud[i].sex);
			printf("请输入第%d 个学生的C语言成绩\n", i + 1);
			scanf("%f", &stud[i].score[0]);
			printf("请输入第%d 个学生的高等数学成绩:\n", i + 1);
			scanf("%f", &stud[i].score[1]);
			printf("请输入第%d 个学生的大学英语成绩:\n", i + 1);
			scanf("%f", &stud[i].score[2]);
			if (0 == flag) {
				i++;
			}
		} while (i < n + m);
		n += m;
		printf("信息增加完毕!\n\n");
		sort();
		system("pause");
	}
}

void del() {
	int i, j, flag = 0;
	char s1[LEN + 1];
	printf("请输入要删除学生的学号:\n");
	scanf("%s", s1);
	for (i = 0; i < n; i++) {
		if (strcmp(stud[i].code, s1) == 0)
		{
			flag = 1;
			for (j = i; j < n - 1; j++)
				stud[j] = stud[j + 1];

		}
	}
	if (0 == flag) {
		printf("该学号不存在!\n");
	}
	if (1 == flag) {
		printf("删除成功,显示结果请选择菜单\n");
		n--;
	}
	system("pause");
}


void display() {
	int i;
	printf("共有%d位学生的信息:\n", n);
	if (0 != n) {
		printf("学生学号  学生姓名 年龄  性别  C语言成绩  高等数学  大学英语成绩\n");
		printf("--------------------------------------------------------------------\n");
		for (i = 0; i < n; i++) {
			printf("%7s %7s %6d %6s %9.1f %10.1f %10.1f\n", stud[i].code, stud[i].name, stud[i].age, stud[i].sex, stud[i].score[0], stud[i].score[1], stud[i].score[2]);
		}
	}
	system("pause");
}

void save() {
	char filename[LEN + 1];
	FILE *fp;
	int i = 0;
	printf("请输入学生信心将要保存的文件名:\n");
	scanf("%s", filename);
	fp = fopen(filename, "w");
	for (i = 0; i < n; i++) {
		fprintf(fp, "%s\t %s\t% d  %s \t%.1f \t  %.1f\t %.1f\n", stud[i].code, stud[i].name, stud[i].age, stud[i].sex, stud[i].score[0], stud[i].score[1], stud[i].score[2]);
	}
	printf("保存成功!\n");
	fclose(fp);
	system("pause");

}

void menu() {
	int num;
	printf(" \n\n                    \n\n");
	printf("  ******************************************************\n\n");
	printf("  *                学生信息管理系统                    *\n \n");
	printf("  ******************************************************\n\n");
	printf("*********************系统功能菜单*************************       \n");
	printf("     ----------------------   ----------------------   \n");
	printf("     *********************************************     \n");
	printf("     * 0.系统帮助及说明  * *  1.刷新学生信息   *     \n");
	printf("     *********************************************     \n");
	printf("     * 2.查询学生信息    * *  3.修改学生信息   *     \n");
	printf("     *********************************************     \n");
	printf("     * 4.增加学生信息    * *  5.按学号删除信息 *     \n");
	printf("     *********************************************     \n");
	printf("     * 6.显示当前信息    * *  7.保存当前学生信息*     \n");
	printf("     ********************** **********************     \n");
	printf("     * 8.退出系统        *                            \n");
	printf("     **********************                            \n");
	printf("     ----------------------   ----------------------                           \n");
	printf("请选择菜单编号:");
	scanf("%d", &num);
	switch (num) {
	case 0:
		help();
		break;
	case 1:
		read();
		break;
	case 2:
		seek();
		break;
	case 3:
		modify();
		break;
	case 4:
		insert();
		break;
	case 5:
		del();
		break;
	case 6:
		display();
		break;
	case 7:
		save();
		break;
	case 8:
		k = 0;
		break;
	default:
		printf("请在0-8之间选择\n");
	}
}

五、测试与调试
主界面:
学生信息管理系统(结构化程序)(C语言)
帮助:
学生信息管理系统(结构化程序)(C语言)
(1)出现错误:增加学生信息,输入性别为男后,成绩没有提示输入自动跳过,如下图:
学生信息管理系统(结构化程序)(C语言)
解决方案:对insert()函数中的变量进行检查,发现性别定义为是char类型,只能接收一个字符,将char类型的sex改为char[],问题得到解决。如下图:
学生信息管理系统(结构化程序)(C语言)
将已经录入的信息,保存在指定的文件中:
学生信息管理系统(结构化程序)(C语言)
显示当前的学生信息:
学生信息管理系统(结构化程序)(C语言)
查询学生信息,输入不存在的学号,提示错误,重新输入已经存在的学号,显示学生信息:
学生信息管理系统(结构化程序)(C语言)
查询学生信息,输入不存在的姓名,提示错误,重新输入已经存在的姓名,显示学生信息:
学生信息管理系统(结构化程序)(C语言)
修改学生信息,将张三信息修改如下:
学生信息管理系统(结构化程序)(C语言)
查询结果为:
学生信息管理系统(结构化程序)(C语言)
将其信息保存在classmate.txt文件中,退出程序。
再次打开程序,显示当前学生信息为空:
学生信息管理系统(结构化程序)(C语言)
从文件中读取学生的信息,输入不存在的文件提示错误,输入正确的文件,可将信息读入:
学生信息管理系统(结构化程序)(C语言)
学生信息管理系统(结构化程序)(C语言)
显示当前学生信息:
学生信息管理系统(结构化程序)(C语言)
读入classmate.txt中的信息,显示结果如下:
学生信息管理系统(结构化程序)(C语言)
删除学生信息,输入不存在的学号,提示错误:
学生信息管理系统(结构化程序)(C语言)
输入已存在的学号,成功将学生信息删除,显示如下:
学生信息管理系统(结构化程序)(C语言)
学生信息管理系统(结构化程序)(C语言)
六、总结
通过本次实验,对结构化程序的特点有了进一步了解,程序具有唯一的入口和出口,并且不会出现死循环,将所要开发的系统划分成立多个相互独立的模块,这样每一个功能的实现不会受到其他部分的牵连,为扩充已有的系统、建立新系统带来了很多方便。在修改的时候易读、易理解。但数据的保护性不好。在以后的开发过程中应该更好的利用结构化程序的优点,将要开发的系统功能模块化,这样可以将复杂的问题细分成每一个简单的问题,从而提高开发的效率。在本次实验中也对char类型有了更深入的了解,感觉char类型在解决实际问题的时候有一定的局限性。熟悉了在C语言中对文件的操作。

相关文章: