一个自动管理学生信息的控制台应用程序(C语言)

//学生统计 Ver 6.0
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXN_stu 35
#define MAXN_cl 7
#define MAXN_name 20
#define MAXN_lv 6
int N_cl, N_stu;
int sum[MAXN_cl];
double aver[MAXN_cl];
int lv[MAXN_cl][MAXN_lv];
double percent_lv[MAXN_cl][MAXN_lv];

struct cc {//定义结构体
	int sum;
	int num, cl[MAXN_cl];
	char name[MAXN_name];
	double aver;
}nd[MAXN_stu];

void init_() {//对数据进行录入
	int i, j;
	memset(sum, 0, sizeof(sum));//对sum数组进行初始化操作
	memset(aver, 0.0, sizeof(aver));//对aver数组进行初始化操作
	memset(lv, 0, sizeof(lv));//对sum数组进行初始化操作
	scanf("%d%d", &N_cl, &N_stu);
	for (i = 1; i <= N_stu; i++) {//数据输入
		scanf("%d%s", &nd[i].num, &nd[i].name);
		for (j = 1; j <= N_cl; j++) {
			scanf("%d", &nd[i].cl[j]);
		}
	}
}

void cal() {//计算汇总
	int i, j;
	for (i = 1; i <= N_stu; i++) nd[i].sum = 0;
	for (i = 1; i <= N_stu; i++) {//计算每个学生的总分和平均分
		for (j = 1; j <= N_cl; j++) {
			nd[i].sum += nd[i].cl[j];//计算每个学生的总分
		}
		nd[i].aver = (double)nd[i].sum / (double)N_cl;//计算每个学生的平均分
	}
	for (i = 1; i <= N_cl; i++) {//计算每门课程的总分和平均分
		for (j = 1; j <= N_stu; j++) {//计算每门课程的总分
			sum[i] += nd[j].sum;
		}
		aver[i] = (double)sum[i] / (double)N_cl;//计算每门课程的平均分
	}

}

void lv_() {//计算各个分数段的学生
	int i, j;
	printf("class\t\t优秀(90-100)\t良好(80-89)\t中等(70-79)\t及格(60-69)\t不及格(0-59)\n");
	for (i = 1; i <= N_cl; i++) {
		for (j = 1; j <= N_stu; j++) {//对每个分数段的人员数量进行统计
			if (nd[j].cl[i] >= 90)      lv[i][1]++;//90+
			else if (nd[j].cl[i] >= 80) lv[i][2]++;//80-89
			else if (nd[j].cl[i] >= 70) lv[i][3]++;//70-79
			else if (nd[j].cl[i] >= 60) lv[i][4]++;//60-69
			else                        lv[i][5]++;//0-59
		}
		for (j = 1; j <= 5; j++) {//对每个分数段的人员比例进行统计
			percent_lv[i][j] = (double)lv[i][j] / (double)N_stu;
		}

		printf("class%d", i);
		for (j = 1; j <= 5; j++) {//对每个分数段的人员数量进行输出
			printf("\t\t%d(%.2llf)", lv[i][j], percent_lv[i][j]);
		}
		puts("");
	}

}

void sort_sum_down() {//冒泡排序按照降序对数据总分进行排序
	int i, j;
	struct cc tmp;
	for (i = 1; i <= N_stu; i++) {
		for (j = 1; j <= N_stu - 1; j++) {
			if (nd[j].sum < nd[j + 1].sum) {
				tmp = nd[j];
				nd[j] = nd[j + 1];
				nd[j + 1] = tmp;
			}
		}
	}
}

void sort_sum_up() {//冒泡排序按照升序对数据总分进行排序
	int i, j;
	struct cc tmp;
	for (i = 1; i <= N_stu; i++) {
		for (j = 1; j <= N_stu - 1; j++) {
			if (nd[j].sum > nd[j + 1].sum) {
				tmp = nd[j];
				nd[j] = nd[j + 1];
				nd[j + 1] = tmp;
			}
		}
	}
}

void sort_num() {//冒泡排序按照升序对数据学号进行排序
	int i, j;
	struct cc tmp;
	for (i = 1; i <= N_stu; i++) {
		for (j = 1; j <= N_stu - 1; j++) {
			if (nd[j].num > nd[j + 1].num) {
				tmp = nd[j];
				nd[j] = nd[j + 1];
				nd[j + 1] = tmp;
			}
		}
	}
}

void sort_name() {//冒泡排序按照升序对数据姓名进行排序
	int i, j;
	struct cc tmp;
	for (i = 1; i <= N_stu; i++) {
		for (j = 1; j <= N_stu - 1; j++) {
			//            printf("%d\n",strcmp(nd[j].name, nd[j+1].name));
			if (strcmp(nd[j].name, nd[j + 1].name) > 0) {

				tmp = nd[j];
				nd[j] = nd[j + 1];
				nd[j + 1] = tmp;
			}
		}
	}
}

void qry_num() {//按照学号查询学生排名以及其考试成绩
	int i, j, tmp_num;
	scanf("%d", &tmp_num);
	printf("rank\tnum\tname");
	for (j = 1; j <= N_cl; j++) {
		printf("\tclass%d", j);
	}
	printf("\tsum\taver\n");
	for (i = 1; i <= N_stu; i++) {
		if (tmp_num == nd[i].num) {
			printf("%d\t%d\t%s", i, nd[i].num, nd[i].name);
			for (j = 1; j <= N_cl; j++) {
				printf("\t%d", nd[i].cl[j]);
			}
			printf("\t%d\t%.2llf", nd[i].sum, nd[i].aver);
			puts("");
		}
	}
}

void qry_name() {//按照姓名查询学生排名以及其考试成绩
	int i, j;
	char tmp_name[MAXN_name];
	scanf("%s", tmp_name);
	printf("rank\tnum\tname");
	for (j = 1; j <= N_cl; j++) {
		printf("\tclass%d", j);
	}
	printf("\tsum\taver\n");
	for (i = 1; i <= N_stu; i++) {
		if (strcmp(nd[i].name, tmp_name) == 0) {
			printf("%d\t%d\t%s", i, nd[i].num, nd[i].name);
			for (j = 1; j <= N_cl; j++) {
				printf("\t%d", nd[i].cl[j]);
			}
			printf("\t%d\t%.2llf", nd[i].sum, nd[i].aver);
			puts("");
		}
	}
}

void prt_all() {//打印所有学生成绩
	int i, j;
	printf("rank\tnum\tname");
	for (j = 1; j <= N_cl; j++) {
		printf("\tclass%d", j);
	}
	printf("\tsum\taver\n");
	for (i = 1; i <= N_stu; i++) {
		printf("%d\t%d\t%s", i, nd[i].num, nd[i].name);
		for (j = 1; j <= N_cl; j++) {
			printf("\t%d", nd[i].cl[j]);
		}
		printf("\t%d\t%.2llf", nd[i].sum, nd[i].aver);
		puts("");
	}
}

void fprt_() {//读取文件并输出
	char ch;
	FILE *fp = NULL;
	if ((fp = fopen("stu.txt", "r")) == NULL) {
		printf("Failure ro open stu.txt!\n");
		exit(0);
	}
	while ((ch = fgetc(fp)) != EOF) {
		printf("%c", ch);
	}
	fclose(fp);
}

void fout_() {//输出到文件
	FILE *fp = NULL;
	if ((fp = fopen("stu.txt", "w")) == NULL) {
		printf("Failure ro open stu.txt!\n");
		exit(0);
	}

	int i, j;
	fprintf(fp, "rank\tnum\tname");
	for (j = 1; j <= N_cl; j++) {
		fprintf(fp, "\tclass%d", j);
	}
	fprintf(fp, "\tsum\taver\n");
	for (i = 1; i <= N_stu; i++) {
		fprintf(fp, "%d\t%d\t%s", i, nd[i].num, nd[i].name);
		for (j = 1; j <= N_cl; j++) {
			fprintf(fp, "\t%d", nd[i].cl[j]);
		}
		fprintf(fp, "\t%d\t%.2llf\n", nd[i].sum, nd[i].aver);
	}
	fclose(fp);
}

int main() {
	int op;
	//输出提示信息
	puts("1.Input record");
	puts("2.Calculate tatal and average score of every course");
	puts("3.Calculate tatal and average score of every student");
	puts("4.Sort in descending order by total score of every student");
	puts("5.Sort in ascending order by total score of every student");
	puts("6.Sort in ascending order by number");
	puts("7.Sort in ascending order by name");
	puts("8.Search by number");
	puts("9.Search by name");
	puts("10.Statistic analysis for every course");
	puts("11.List record");
	puts("12.Write to a file");
	puts("13.Read from a flie");
	puts("0.Exit");
	puts("Please enter you choice:");

	while (1) {
		scanf("%d", &op);
		if (!op) break;
		else switch (op) {
		case 1:
			init_();
			break;
		case 2:
			cal();
			break;
		case 3:
			cal();
			break;
		case 4:
			sort_sum_down();
			prt_all();
			break;
		case 5:
			sort_sum_up();
			prt_all();
			break;
		case 6:
			sort_num();
			prt_all();
			break;
		case 7:
			sort_name();
			prt_all();
			break;
		case 8:
			qry_num();
			break;
		case 9:
			qry_name();
			break;
		case 10:
			lv_();
			break;
		case 11:
			prt_all();
			break;
		case 12:
			fout_();
			break;
		case 13:
			fprt_();
			break;
		default: break;
		}
	}
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/radiumlrb/p/10014105.html