精华内容
下载资源
问答
  • 在本篇文章里小给大家分享了关于C语言实现学生成绩管理系统实战教学内容,有兴趣的朋友们可以跟着学习参考下。
  • C语言编写学生成绩管理系统,要求该系统可 对学生操作:添加和删除操作。 可对3门成绩中各门成绩进行 成绩操作:录入、修改、排序、筛选、求平均分、数据保存为文件。 学生具备学号、姓名、性别和住址属性。 代码 #...

    文章链接:https://codemouse.online/archives/2020-06-04-16-07-48

    需求

    用C语言编写学生成绩管理系统,要求该系统可
    对学生操作:添加和删除操作。
    可对3门成绩中各门成绩进行
    成绩操作:录入、修改、排序、筛选、求平均分、数据保存为文件。
    学生具备学号、姓名、性别和住址属性。

    代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 学科的编号
    #define CHINESE 0
    #define MATH	1
    #define ENGLISH 2
    
    #define OTHER 3
    
    // 学生人数,暂定只能输入100个,链表可以做无数个,但是怕你看不懂
    #define STUNUM	100
    
    // 成绩结构体
    typedef struct grade_t{
    	int subject[3];
    }Grade,*Pgrade;
    
    // 学生信息结构体
    typedef struct stu_t{
    	char sno[20]; // 学号
    	char name[20];// 名字
    	char sex[10];// 性别
    	char address[50];//地址
    	Grade grade; // 成绩
    }Stu,*Pstu;
    
    // 学生信息
    Pstu globleStu[STUNUM];
    unsigned int current = 0; // 用来作为学生结构体的下标
    
    // 各科成绩排行榜
    int sortStuChinese[STUNUM];
    int sortStuMath[STUNUM];
    int sortStuEnglish[STUNUM];
    int sortAll[STUNUM];
    /*
    用C语言编写学生成绩管理系统,要求该系统可
    对学生操作:添加和删除操作。
    可对3门成绩中各门成绩进行
    成绩操作:录入、修改、排序、筛选、求平均分、数据保存为文件。
    学生具备学号、姓名、性别和住址属性。
    */
    
    void save(char* name)
    {
    	FILE *file = fopen(name, "w");
    	for (int i = 0; i < current; i++)
    	{
    		// 写入学生信息
    		fprintf(file, "%s %s %s %s ", globleStu[i]->sno, globleStu[i]->name, globleStu[i]->sex, globleStu[i]->address);
    		for (int j = 0; j < 3; j++)
    		{
    			fprintf(file, "%d ", globleStu[i]->grade.subject[j]);
    		}
    		fprintf(file, "\n");
    	}
    	
    	fclose(file);
    	return;
    
    }
    
    
    
    // 获取这人的总分
    int getGradetotal(Pstu* temp,int index){
    	int sum = 0;
    	for (int i = 0; i < 3; i++)
    	{
    		sum += temp[index]->grade.subject[i];
    	}
    	return sum;
    }
    
    // 选择排序哪个科目
    void Sort_Select(int subject)
    {
    	int len = current;
    	Pstu sortArr[STUNUM]; // 申请一个临时数组作为排序
    	memcpy(sortArr, globleStu, sizeof(Pstu)*STUNUM);
    	// 保存下标
    	int arr[STUNUM];
    	for (int i = 0; i < STUNUM; i++)
    	{
    		arr[i] = i;
    	}
    	if (subject == 3){
    		for (int i = 0; i < len - 1; i++)
    		{
    			int max = i;
    			for (int j = i + 1; j < len; j++)
    				//判断最小值并记录
    			if (getGradetotal(sortArr, max) < getGradetotal(sortArr, j))
    				max = j;
    			if (max != i)
    			{
    				Pstu temp = sortArr[max];
    				sortArr[max] = sortArr[i];
    				sortArr[i] = temp;
    				int tempArr = arr[max];
    				arr[max] = arr[i];
    				arr[i] = tempArr;
    			}
    		}
    	}
    	else if (subject == 1 || subject == 0 || subject == 2){
    		for (int i = 0; i < len - 1; i++)
    		{
    			int max = i;
    			for (int j = i + 1; j < len; j++)
    				//判断最小值并记录
    			if (sortArr[max]->grade.subject[subject] < sortArr[j]->grade.subject[subject])
    				max = j;
    			if (max != i)
    			{
    				Pstu temp = sortArr[max];
    				sortArr[max] = sortArr[i];
    				sortArr[i] = temp;
    				int tempArr = arr[max];
    				arr[max] = arr[i];
    				arr[i] = tempArr;
    			}
    		}
    	}
    	
    
    	// 更新对应排行榜的信息
    	switch (subject){
    	case 0:
    		memcpy(&sortStuChinese, &arr, sizeof(int)*STUNUM);
    		break;
    	case 1:
    		memcpy(&sortStuMath, &arr, sizeof(int)*STUNUM);
    		break;
    	case 2:
    		memcpy(&sortStuEnglish, &arr, sizeof(int)*STUNUM);
    		break; 
    	case 3:
    		memcpy(&sortAll, &arr, sizeof(int)*STUNUM);
    		break;
    	}
    }
    
    // 获取某科目的平均分
    double getAverage(int subject){
    	double sum = 0;
    	for (int i = 0; i < current; i++)
    	{
    		sum += globleStu[i]->grade.subject[subject];
    	}
    	return sum / current;
    }
    
    //index是学生下标, mode作为打印科目的选择,0是语文,1是数学,2是英语,3是全打印
    void printStu(int index,int mode){
    	switch (mode){
    	case 0:
    		printf("name:%s \t  Chinese:%3d \n",globleStu[index]->name, globleStu[index]->grade.subject[mode]);
    		break;
    	case 1:
    		printf("name:%s \t  Math:%3d  \n", globleStu[index]->name, globleStu[index]->grade.subject[mode]);
    		break;
    	case 2:
    		printf("name:%s \t  English:%3d \n", globleStu[index]->name, globleStu[index]->grade.subject[mode]);
    		break;
    	case 3:
    		printf("name:%s \t  Chinese:%3d  Math:%3d  English:%3d  total:%d \n", globleStu[index]->name,
    			globleStu[index]->grade.subject[CHINESE], globleStu[index]->grade.subject[MATH], globleStu[index]->grade.subject[ENGLISH], getGradetotal(globleStu,index));
    		break;
    	}
    }
    
    // 输出所有学生成绩
    void printAllStu(){
    	for (int i = 0; i < current; i++)
    	{
    		printStu(i, 3);
    	}
    }
    
    
    // 打印排序的学生成绩
    void printSort(int mode){
    	switch (mode){
    	case CHINESE:
    		for (int i = 0; i < current; i++)
    		{
    			printStu(sortStuChinese[i], mode);
    		}
    		break;
    	case MATH:
    		for (int i = 0; i < current; i++)
    		{
    			printStu(sortStuMath[i], mode);
    		}
    		break;
    	case ENGLISH:
    		for (int i = 0; i < current; i++)
    		{
    			printStu(sortStuEnglish[i], mode);
    		}
    		break;
    	case OTHER:
    		for (int i = 0; i < current; i++)
    		{
    			printStu(sortAll[i], mode);
    		}
    		break;
    	}
    }
    
    
    // 打印学生信息
    void printAllInfo(){
    	for (int i = 0; i < current; i++)
    	{
    		printf("sno:%s \t name:%s \t sex:%s \t address:%s \n", globleStu[i]->sno, globleStu[i]->name, globleStu[i]->sex, globleStu[i]->address);
    	}
    }
    
    
    // 输入分数段,和要筛选的科目,筛选出学生,打印学生信息,
    void selectStu(int gradeStart, int gradeEnd , int subject){
    	for (int i = 0; i < current; i++)
    	{
    		if (globleStu[i] == NULL)
    			continue;
    		// 判断是否符合成绩
    		if (globleStu[i]->grade.subject[subject] >= gradeStart && 
    			globleStu[i]->grade.subject[subject] < gradeEnd){
    			// 输出这个学生信息
    			printStu(i, subject);
    		}
    	}
    	
    }
    
    
    // 找到返回学生结构体的下标,没找到就返回-1
    int findStu(char* sno){
    	for (int i = 0; i < current; i++)
    	{
    		if (globleStu[i] == NULL)
    			continue;
    		// 找到学生
    		if (!strcmp(globleStu[i]->sno, sno)){
    			return i;
    		}
    	}
    	return -1;
    }
    
    // 输入学生的成绩,传入学生的结构体指针
    void inputStuGrade(Pstu stu){
    	printf("请输入学生的 语文 数学 英语的成绩,用空格隔开\n");
    	scanf("%d %d %d", &stu->grade.subject[CHINESE], &stu->grade.subject[MATH], &stu->grade.subject[ENGLISH]);
    }
    
    // 修改学生的成绩,传入学生的结构体指针
    void updateStuGrade(Pstu stu){
    	printf("修改%s同学的成绩\n",stu->name);
    	inputStuGrade(stu);
    	printf("成绩修改成功\n");
    }
    
    // 1成功, 0不成功
    int addStuGrade(){
    	printf("请输入添加成绩的同学的学号");
    	char sno[20];
    	scanf("%s", sno);
    	int index = -1;
    	if ((index = findStu(sno)) != -1){
    		inputStuGrade(globleStu[index]);
    		printf("输入成功\n");
    		return 1;
    	}
    	else{
    		printf("未找到该同学\n");
    		return 0;
    	}
    }
    
    
    int updateStuGrade(){
    	printf("请输入修改成绩的同学的学号");
    	char sno[20];
    	scanf("%s", sno);
    	int index = -1;
    	if ((index = findStu(sno)) != -1){
    		inputStuGrade(globleStu[index]);
    		printf("输入成功\n");
    		return 1;
    	}
    	else{
    		printf("未找到该同学\n");
    		return 0;
    	}
    }
    
    // 成功返回1,失败返回0
    int deleteStu(){
    	printf("请输入要踢出学籍的同学的学号");
    	char sno[20];
    	scanf("%s", sno);
    	int index = -1;
    	if ((index = findStu(sno)) != -1){
    		char name[20];
    		memcpy(name, globleStu[index]->name, 20);
    		free(globleStu[index]);
    		if (index < STUNUM - 1){
    			// 数据前移
    			memcpy(&globleStu[index], &globleStu[index + 1], sizeof(Pstu)*(current - 1 - index));
    			globleStu[current - 1] = NULL;
    		}
    		else{ // 如果是最后一个数据
    			globleStu[index] = NULL;
    		}
    		printf("成功将学号为%s的%s同学移除学籍\n", sno, name);
    		current--;
    		return 1;
    	}
    	printf("未找到该学生,无法删除!!\n");
    	return 0;
    }
    
    
    // 添加学员成功返回0,失败返回1,并及时释放内存
    int addStu(){
    	if (current >= STUNUM){
    		printf("班级已经满员,抱歉你不能加入\n");
    		return 0;
    	}
    	// 添加学员
    	Pstu stu = (Pstu)malloc(sizeof(Stu));
    	memset(stu, 0, sizeof(Stu));
    	printf("请输入学员的 学号 姓名 性别 家庭住址 内容用空格分开\n");
    	scanf("%s %s %s %s", stu->sno, stu->name, stu->sex, stu->address);
    	globleStu[current] = stu;
    	current++;
    	printf("成功添加学生信息!!\n");
    	return 1;
    }
    
    void main()
    {
    	int num = 0;
    	printf("输入要录入的学员个数\n");
    	scanf("%d",&num);
    	for (int i = 0; i < num; i++)
    	{
    		addStu();
    	}
    	printAllInfo();
    
    	// 添加某同学的成绩
    	for (int i = 0; i < num; i++)
    	{
    		addStuGrade();
    	}
    
    	printAllStu();
    
    	// 删除某同学的成绩
    	deleteStu();
    	printAllStu();
    
    	// 修改
    	updateStuGrade();
    	printAllStu();
    	// 排序
    	Sort_Select(CHINESE);
    	Sort_Select(MATH);
    	Sort_Select(ENGLISH);
    	Sort_Select(OTHER);
    	// 打印排序信息
    	printf("语文排行榜\n");
    	printSort(CHINESE);
    	printf("数学排行榜\n");
    	printSort(MATH);
    	printf("英语排行榜\n");
    	printSort(ENGLISH);
    	printf("总排行榜\n");
    	printSort(OTHER);
    
    
    	// 筛选学生成绩
    	selectStu(60, 100, MATH);
    
    	// 获得平均分
    	double grade = getAverage(MATH);
    	printf("平均分%f \n",grade);
    
    	//保存
    	save("信息.txt");
    }
    
    /*
    用C语言编写学生成绩管理系统,要求该系统可
    对学生操作:添加和删除操作。
    可对3门成绩中各门成绩进行
    成绩操作:录入、修改、排序、筛选、求平均分、数据保存为文件。
    学生具备学号、姓名、性别和住址属性。
    */
    
    
    
    
    
    展开全文
  • 用C#学生成绩管理系统 内含源代码
  • c语言学生成绩管理系统

    千次阅读 2016-10-18 22:08:37
    学生成绩管理。有一个班 10 个学生,5 门功课。用二维数组做参数函数分别实现部分功能
    /*1. 学生成绩管理。有一个班 10 个学生,5 门功课。用二维数组做参数编函数分别实现:
    (1)录入每个学生的学号和考试成绩;
    (2)求第一门课的平均分;
    (3) 找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩和平均成绩;
    (4)找出平均成绩在 90 以上或全部成绩在 85 分以上的学生;
    (5)按成绩高低排出名次表;*/
    /*
    #include<stdio.h>


    int input(int a[10][6])
    {
    int i,j;
    for(i=0;i<10;i++)
    {
    scanf("%ld",&a[i][0]);
    for(j=1;j<6;j++)
    scanf("%d",&a[i][j]);
    }
    return a;
    }


    void average(int a[10][6])
    {
    int i;
    double av;
    for(i=0;i<10;i++)
    av+=a[i][1];
    printf("%g\n",av);
    }


    void failure(int a[10][6])
    {
    int i,j,b[10];
    double sum=0;
    for(i=0;i<10;i++)
    b[i]=0;
    for(i=0;i<10;i++)
    {
    for(j=1;j<6;j++)
    if(a[i][j]<60)
    b[i]++;
    for(i=0;i<10;i++)
    if(b[i]>2)
    {
    printf("%d ",a[i][0]);
    for(j=1;j<6;j++)
    {
    printf("%d ",a[i][j]);
    sum+=a[i][j];
    }
    printf("%g\n",sum/5);
    }
    }
    展开全文
  • 3)学生成绩管理系统  需要处理的基础数据 学生基本信息:如班级、学号、姓名、性别、年龄等。 学生选修课程的基本信息:课程编号、课程名称、学分、考试成绩、平时成绩、综合成绩(考试成绩*0.7+平时成绩*0.3...
  • c语言课程设计实习题目的答案。 用C学生成绩管理系统
  • 功能: (1)能录入和修改全班...(3)能浏览和打印全班学生成绩单 (4)能按学号和姓名查询学生成绩 (5)能查询全部挂科信息(姓名、科目、成绩) (6)能统计各科挂科次数和总次数 (7)能查询某科目不及格学生名单
  • 这是自己C语言学生成绩管理系统(WINTC编译工具)
  • c语言实现学生成绩系统管理,是我当时的一个程序,用c的,今天奉献给大家
  • 本程序是c语言课程设计时的基于c语言学生成绩管理系统
  • 学生成绩管理系统是比较适合初学者的。它涵盖了c语言几乎知识。对于学了c语言的人,把这个课程设计搞好(当然自己能设计出来是要有很好的基础)。不管自己能不能够完成,最重要的是能弄懂。参考其他资料,试着自己...
  • 第一章 设计内容任务及具体要求 内容和要求 强化学习 C 语言中有关链表及外部文件的内容 独立设计学生成绩管理系统 程实现以下功能 1 整个系统均用C语言实现 2 利用指针链表来实现学生成绩的数据结构设计 3 ...
  • C语言编制,本人测验,完美运行,无错误。请放心下载!
  • 3)学生成绩管理系统  需要处理的基础数据 学生基本信息:如班级、学号、姓名、性别、年龄等。 学生选修课程的基本信息:课程编号、课程名称、学分、考试成绩、平时成绩、综合成绩(考试成绩*0.7+平时成绩*0.3...
  • #include #include #include #include #include #define FNAME "student.dat" #define N 200 #include"stu.h"//头文件:相关结构定义,常量及全局变量定义,函数声明 ...#include"Save.cpp"//保存学生信息
  • c语言编学生成绩管理系统,运行过,无误,有查询,插入,删除,排序等操作
  • C语言课程设计学生成绩管理系统 个人心得体会 这一周以来的课程设计不仅让我明白了C语言的确是一门很有 用的但是又是不容易的一门课程起初刚开始做课程设计时以为 这个课程设计不会有多难只不过是把多个函数组合起来...
  • C语言课程设计学生成绩管理系统 个人心得体会 这一周以来的课程设计不仅让我明白了C语言的确是一门很有用的但是又是不容易的一门课程起初刚开始做课程设计时以为这个课程设计不会有多难只不过是把多个函数组合起来就...
  • C 语言课程设计学生成绩管理系统 个人心得体会 徐州工程学院 14 计嵌 1 班 07 组 张凯 这一周以来的课程设计不仅让我明白了 C 语言的确是一门很有用的但是又是不容 易的一门课程 起初刚开始做课程设计时 以为这个...
  • C 语言课程设计学生成绩管理系统 个人心得体会 徐州工程学院 14 计嵌 1 班 07 组 张凯 这一周以来的课程设计不仅让我明白了 C 语言的确是一门很有用的但是又是不容易的一门课程 起初刚开始做课程设计时 以为这个课程...
  • C语言课程设计报告一、实践的目的和要求加深对《C语言程序设计》课程所学知识的理解,进一步巩固C语言讲法规则。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力二、实践...

    C语言课程设计报告

    一、实践的目的和要求

    加深对《C语言程序设计》课程所学知识的理解,进一步巩固C语言讲法规则。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力

    二、实践内容

    在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);函数的使用,结构体和文件的操作等。

    三、设计说明

    学生成绩管理系统

    建立一个学生成绩管理系统。

    程序运行时显示一个简单的菜单。

    例如:

    1.信息输入(INPUT)

    2.信息的删除与修改

    3.显示当前学生成绩的记录信息,若无记录,则给出提示信息

    4.学生或者各个班级各门课程总分、平均分、最低分、最高分等的统计

    5.可以按照班级、姓名、性别、分数(可以有区间)等方式进行查询

    6.具有良好的交互功能

    7.能使用图形函数进行简单的界面设计

    8.具有良好的纠错功能

    9.退出等等

    程序:

    #include      /*文件操作(读文件)*/

    #include

    #include     /*其它说明*/

    #include     /*字符串函数*/

    #include        /*内存操作函数*/

    #include /*屏幕操作函数*/

    #include      /*字符操作函数*/

    #include      /*动态地址分配函数*/

    #include

    #define LEN sizeof(STUDENT)

    #define N   3

    typedef struct stu     /*定义结构体数组用于缓存数据*/

    {char grade[6];

    char name[5];

    char sex[4] ;

    int score[N];

    int sum;

    float average;

    int order;

    struct stu *next;

    }STUDENT;

    /*以下是函数原型*/

    STUDENT  *init();      /*初始化函数*/

    STUDENT *create();   /*创建链表*/

    STUDENT *delete(STUDENT *head);   /*删除记录*/

    STUDENT *sort(STUDENT *head);      /*按平均分排序*/

    void print(STUDENT *head);   /* 显示所有记录*/

    void name(STUDENT *head);    /*姓名查找*/

    void grade(STUDENT *head);    /*班级查找*/

    void sex(STUDENT *head);    /*性别查找*/

    void average(STUDENT *head);     /*按平均分查找在那个分数里*/

    STUDENT *statistciam(STUDENT *head);/*统计记录*/

    void save(STUDENT *head);     /*保存文件*/

    STUDENT *load();        /*读文件*/

    STUDENT *insert(STUDENT *head,STUDENT *new);   /*插入记录*/

    int menu_select();           /*菜单函数*/

    int menu_search();          /*查询菜单*/

    void code(); /*密码验证*/

    /*主函数界面*/

    main()

    {

    int i,j,n,m;

    STUDENT *head,new;  /*链表定义头指针*/

    randomize();/*开启扬声器,发出声音*/

    while(!bioskey(1))

    {

    j=rand()*5000;

    sound(j);

    delay(10);

    }

    nosound();/*关闭声音文件*/

    code();/*密码输入*/

    clrscr();            /*清屏*/

    for(;;)             /*无限循环*/

    {

    switch(menu_select())     /*调用主菜单函数,返回值整数作开关语句的条件*/

    {                     /*值不同,执行的函数不同,break 不能省略*/

    case 0:head=init();break;   /*执行初始化*/

    case 1:head=create();break; /*创建链表*/

    case 2:head=delete(head);break; /*删除记录*/

    case 3:print(head);break;   /*显示全部记录*/

    case 4:

    loop:

    printf("sreach:\n 1.grade\n 2.name\n 3.sex\n 4.average\n 5.quit\n Enter you choice(0~5):");

    scanf("%d",&n);

    switch(n)

    {

    case 1:grade(head);

    goto loop;

    case 2:name(head);

    goto loop;

    case 3:sex(head);

    goto loop;

    case 4:average(head);

    goto loop;

    case 5: break;

    }

    break;

    /*查找记录*/

    case 5:sort(head);break;  /*排序*/

    case 6:save(head);break;  /*保存文件*/

    case 7:head=load(); break;  /*读文件*/

    case 8:head=insert(head,&new);  break; /*插入记录*/

    case 9:head=statistciam(head);  break; /*统计记录*/

    case 10:exit(0);       /*如菜单返回值为10程序结束*/

    }

    }

    }

    /*密码输入*/

    void code()

    {

    int i;

    char number[20];

    const w=10;

    printf("\n\t\t\t--------------------------------------------------");

    printf("\n\t\t\tBecause this system is busywork,Code is: 123456");

    printf("\n\t\t\t----------------------------------------------- ");

    printf("\n");

    printf("\n");

    printf("\n");

    printf("\n");

    printf("\n");

    printf("\n");

    printf("\n\t*********************************");

    printf("\n\t    Please Enter The Code  :     ");

    printf("\n\t*********************************\n");

    scanf("%s",number);

    printf("\n\t\t\tExamining!");

    for(i=0;i<=w;i++)

    {

    printf("*");

    }

    if(strcmp(number,"123456")==0)

    {

    printf("\n\t\t\tCode is right!press any key enter menu......");

    clrscr();

    }

    else

    {

    printf("\n\t\t\tCode is wrong!Please enter again : ");

    clrscr();

    code();

    }

    }

    /*初始化函数*/

    STUDENT *init()

    {

    return NULL;    /*返回空指针*/

    }

    /*菜单选择函数*/

    menu_select()

    {

    char *menu[]={"********************************************",

    "              Welcome to          ",

    "   The student score manage system!",

    "*****************MENU***********************",  /*定义菜单字符串数组*/

    "      0. Init list",    /*初始化*/

    "      1. Input list",   /*输入记录*/

    "      2. Delete a record from list",  /*从表中删除记录*/

    "      3. Print list ",       /*显示当前学生成绩的记录信息*/

    "      4. Search record ",   /*查询学生记录*/

    "      5. Sort to make new a file ", /*排序*/

    "      6. Save the file",          /*将单链表中记录保存到文件中*/

    "      7. Load the file",        /*从文件中读入记录*/

    "      8. insert record to list ",   /*插入记录到表中*/

    "      9. statistciam record to list ",   /*统计记录到表中*/

    "      10. Quit",                    /*退出*/

    "********************************************",

    "     Producer:ZengWenyan ZhaoJingxiu        ",

    "     Faculty Adviser:XiaoFengrui          ",};              /*退出*/

    char s[3];       /*以字符形式保存选择号*/

    int c,i;        /*定义整形变量*/

    textbackground(MAGENTA);   /*设置背景颜色为粉色*/

    gotoxy(1,50);        /*移动光标*/

    printf("press any key enter menu......\n");   /*压任一键进入主菜单*/

    getch();                       /*输入任一键*/

    clrscr();                     /*清屏幕*/

    gotoxy(1,1);             /*移动光标*/

    textcolor(YELLOW);   /*设置文本显示颜色为黄色*/

    textbackground(BLUE);   /*设置背景颜色为蓝色*/

    gotoxy(15,2);          /*移动光标*/

    putch(0xc9);        /*输出左上角边框┏*/

    for(i=1;i<44;i++)

    putch(0xcd);    /*输出上边框水平线*/

    putch(0xbb);            /*输出右上角边框  ┓*/

    for(i=3;i<23;i++)

    {

    gotoxy(15,i);putch(0xba);   /*输出左垂直线*/

    gotoxy(59,i);putch(0xba);

    }   /*输出右垂直线*/

    gotoxy(15,22);putch(0xc8);  /*输出左上角边框┗*/

    for(i=1;i<44;i++)

    putch(0xcd);      /*输出下边框水平线*/

    putch(0xbc);                 /*输出右下角边框┛*/

    window(16,3,58,21);       /* 制作显示菜单的窗口,大小根据菜单条数设计*/

    clrscr();              /*清屏*/

    for(i=0;i<18;i++)       /*输出主菜单数组*/

    {

    gotoxy(1,i+1);

    cprintf("%s",menu[i]);

    }

    textbackground(BLACK);   /*设置背景颜色为黑色*/

    window(1,1,80,25);       /*恢复原窗口大小*/

    gotoxy(10,23);       /*移动光标*/

    do{

    printf("\n  Enter you choice(0~10):");    /*在菜单窗口外显示提示信息*/

    scanf("%s",s);           /*输入选择项*/

    c=atoi(s);            /*将输入的字符串转化为整形数*/

    }while(c<0||c>10);    /*选择项不在0~10之间重输*/

    return c;              /*返回选择项,主程序根据该数调用相应的函数*/

    }

    /*输入函数*/

    STUDENT *create()

    {int i,s;

    STUDENT *head=NULL,*p;    /* 定义函数.此函数带回一个指向链表头的指针*/

    clrscr();

    textbackground(MAGENTA);

    textcolor(BLUE);

    for(;;)

    {p=(STUDENT *)malloc(LEN);    /*开辟一个新的单元*/

    if(!p)     /*如果指针p为空*/

    {printf("\nOut of memory.");     /*输出内存溢出*/

    return (head);    /*返回头指针,下同*/

    }

    printf("Enter the grade(0:list end):");

    scanf("%s",p->grade);

    if(p->grade[0]=='0') break;      /*如果班级首字符为0则结束输入*/

    printf("Enter the name:");

    scanf("%s",p->name);

    do{

    printf("Enter the sex(M or W):");

    scanf("%s",&p->sex[0]);

    if(p->sex[0]!='M'&&p->sex[0]!='W')

    printf("Data error,please enter again.\n");

    }while(p->sex[0]!='M'&&p->sex[0]!='W');

    printf("Please enter the %d scores\n",3);    /*提示开始输入成绩*/

    s=0;                  /*计算每个学生的总分,初值为0*/

    for(i=0;i

    {

    do{

    printf("score%d:",i+1);

    scanf("%d",&p->score[i]);

    if(p->score[i]<0 || p->score[i]>100)     /*确保成绩在0~100之间*/

    printf("Data error,please enter again.\n");

    }while(p->score[i]<0 || p->score[i]>100);

    s=s+p->score[i];     /*累加各门成绩*/

    }

    p->sum=s;       /*将总分保存*/

    p->average=(float)s/3;    /*先用强制类型转换将s转换成float型,再求平均值*/

    p->order=0;               /*未排序前此值为0*/

    p->next=head;             /*将头结点做为新输入结点的后继结点*/

    head=p;                   /*新输入结点为新的头结点*/

    }

    return(head);

    }

    /*删除记录函数*/

    STUDENT *delete(STUDENT *head)

    {int n;

    STUDENT *p1,*p2;    /*p1为查找到要删除的结点指针,p2为其前驱指针*/

    char c,s[6];       /*s[6]用来存放班级,c用来输入字母*/

    clrscr();

    textbackground(MAGENTA);

    textcolor(BLUE);

    printf("Please enter the deleted grade: ");

    scanf("%s",s);

    p1=p2=head;      /*给p1和p2赋初值头指针*/

    while(strcmp(p1->grade,s) && p1 != NULL)     /*当记录的班级不是要找的,或指针不为空时*/

    {p2=p1;              /*将p1指针值赋给p2作为p1的前驱指针*/

    p1=p1->next;        /*将p1指针指向下一条记录*/

    }

    if(strcmp(p1->grade,s)==0)    /*班级找到了*/

    {printf("**************************************FOUND************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|  Grade |   Name  |  sc1  |  sc2   |  sc3  |  Sum   |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s |   %4s   |  %3d  |  %3d   |  %3d  |  %3d   |  %4.2f  |  %-5d |\n",

    p1->grade,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    printf("Are you sure to delete the student Y/N ?"); /*提示是否要删除,输入Y删除,N则退出*/

    for(;;)

    {scanf("%c",&c);

    if(c=='n'||c=='N') break;    /*如果不删除,则跳出本循环*/

    if(c=='y'||c=='Y')

    {

    if(p1==head)         /*若p1==head,说明被删结点是首结点*/

    head=p1->next;       /*把第二个结点地址赋予head*/

    else

    p2->next=p1->next;    /*否则将一下结点地址赋给前一结点地址*/

    n=n-1;

    printf("\nNum %s student have been deleted.\n",s);

    printf("Don't forget to save.\n");break;    /*删除后就跳出循环*/

    }

    }

    }

    else

    printf("\nThere is no num %s student on the list.\n",s);    /*找不到该结点*/

    return(head);

    }

    /* 显示全部记录函数*/

    void print(STUDENT *head)

    {int i=0;       /* 统计记录条数*/

    STUDENT *p;    /*移动指针*/

    clrscr();

    textbackground(MAGENTA);

    textcolor(BLUE);

    p=head;        /*初值为头指针*/

    printf("\n************************************STUDENT************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("| Rec | Grade |  Name  |  Sc1  |  Sc2  |  Sc3  |  Sum  |   Ave | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    while(p!=NULL)

    {

    i++;

    printf("| %3d |  %4s  |   %-4s |  %3d  |  %3d  |  %3d  |  %3d  |  %4.2f|  %-5d |\n",

    i, p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    p=p->next;

    }

    printf("-------------------------------------------------------------------------------\n");

    printf("**************************************END**************************************\n");

    }

    /*姓名查找记录函数*/

    void name(STUDENT *head)

    {STUDENT *p;      /*    移动指针*/

    char s[5];       /*存放姓名用的字符数组*/

    clrscr();

    textbackground(MAGENTA);

    textcolor(BLUE);

    printf("Please enter name for searching.\n");

    scanf("%s",s);

    p=head;      /*将头指针赋给p*/

    while(strcmp(p->name,s) && p != NULL)    /*当记录的姓名不是要找的,或指针不为空时*/

    p=p->next;       /*移动指针,指向下一结点*/

    if(p!=NULL)           /*如果指针不为空*/

    {printf("\n*************************************FOUND************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|  %4s    |  %4s   |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f   |  %-5d|\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else

    printf("\nThere is no name %s student on the list.\n",s);     /*显示没有该学生*/

    }

    /*班级查找记录函数*/

    void grade(STUDENT *head)

    {STUDENT *p;      /*    移动指针*/

    char s[6];       /*存放班级用的字符数组*/

    clrscr();

    textbackground(MAGENTA);

    textcolor(BLUE);

    printf("Please enter grade for searching.\n");

    scanf("%s",s);

    p=head;      /*将头指针赋给p*/

    while(strcmp(p->grade,s) && p != NULL)    /*当记录班级不是要找的,或指针不为空时*/

    p=p->next;       /*移动指针,指向下一结点*/

    if(p!=NULL)           /*如果指针不为空*/

    {printf("\n*************************************FOUND************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s   |    %4s  |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f  |  %-5d |\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else

    printf("\nThere is no grade %s student on the list.\n",s);     /*显示没有该学生*/

    }

    /*性别查找记录函数*/

    void sex(STUDENT *head)

    {STUDENT *p;      /*    移动指针*/

    char s[4];       /*存放性别用的字符数组*/

    clrscr();

    textbackground(MAGENTA);

    textcolor(BLUE);

    printf("Please enter sex for searching.\n");

    scanf("%s",s);

    p=head;      /*将头指针赋给p*/

    while(strcmp(p->sex,s) && p != NULL)    /*当记录的性别不是要找的,或指针不为空时*/

    p=p->next;       /*移动指针,指向下一结点*/

    if(p!=NULL)           /*如果指针不为空*/

    {printf("\n*************************************FOUND************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s    |    %4s  |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f  |  %-5d |\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else

    printf("\nThere is no sex %s student on the list.\n",s);     /*显示没有该学生*/

    }

    /* 用平均分进行分数段查找  */

    void average(STUDENT *head)

    {

    STUDENT *p;      /*    移动指针*/

    clrscr();

    textbackground(MAGENTA);

    textcolor(BLUE);

    p=head;      /*将头指针赋给p*/

    if(p!=NULL&&p->average<60&&p->average>0)           /*如果指针不为空且平均分在0-60之间*/

    {

    printf("\n**********************************not pass************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s   |    %4s  |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f  |  %-5d |\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else if(p!=NULL&&p->average<70&&p->average>=60)           /*如果指针不为空且平均分在60-70之间*/

    {

    printf("\n**********************************60-70************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s   |    %4s  |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f  |  %-5d |\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else  if(p!=NULL&&p->average<80&&p->average>=70)           /*如果指针不为空且平均分在70-80之间*/

    {

    printf("\n**********************************70-80************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s   |    %4s  |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f  |  %-5d |\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else if(p!=NULL&&p->average<90&&p->average>=80)           /*如果指针不为空且平均分在80-90之间*/

    {

    printf("\n**********************************80-90************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s   |    %4s  |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f  |  %-5d |\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else   if(p!=NULL&&p->average<100&&p->average>=90)           /*如果指针不为空且平均分在90-100之间*/

    {

    printf("\n**********************************90-100************************************\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   Grade  |   Name  |  sc1   |  sc2  |  sc3   |   Sum  |   Ave   | Order |\n");

    printf("-------------------------------------------------------------------------------\n");

    printf("|   %4s  |    %4s  |  %3d   |  %3d  |  %3d   |   %3d  |  %4.2f  |  %-5d |\n",

    p->grade,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);

    printf("-------------------------------------------------------------------------------\n");

    printf("***************************************END**************************************\n");

    }

    else

    printf("\nThere is not average  student on the list.\n");     /*显示没有该学生*/

    }

    /*保存数据到文件函数*/

    void save(STUDENT *head)

    {FILE *fp;          /*定义指向文件的指针*/

    STUDENT *p;        /* 定义移动指针*/

    char outfile[10];

    printf("Enter outfile name,for example c:\\score\n");

    scanf("%s",outfile);

    if((fp=fopen(outfile,"wb"))==NULL)     /*为输出打开一个二进制文件,为只写方式*/

    {

    printf("Cannot open the file\n");

    return;      /*若打不开则返回菜单*/

    }

    printf("\nSaving the file......\n");

    p=head;                      /*移动指针从头指针开始*/

    while(p!=NULL)          /*如p不为空*/

    {

    fwrite(p,LEN,1,fp);       /*写入一条记录*/

    p=p->next;          /*指针后移*/

    }

    fclose(fp);        /*关闭文件*/

    printf("Save the file successfully!\n");

    }

    /* 从文件读数据函数*/

    STUDENT *load()

    {STUDENT *p1,*p2,*head=NULL;      /*定义记录指针变量*/

    FILE *fp;              /* 定义指向文件的指针*/

    char infile[10];

    printf("Enter infile name,for example c:\\score\n");

    scanf("%s",infile);

    if((fp=fopen(infile,"rb"))==NULL)     /*打开一个二进制文件,为只读方式*/

    {

    printf("Can not open the file.\n");

    return(head);

    }

    printf("\nLoading the file!\n");

    p1=(STUDENT *)malloc(LEN);     /*开辟一个新单元*/

    if(!p1)

    {

    printf("Out of memory!\n");

    return(head);

    }

    head=p1;           /*申请到空间,将其作为头指针*/

    while(!feof(fp))    /*循环读数据直到文件尾结束*/

    {

    if(fread(p1,LEN,1,fp)!=1) break;    /*如果没读到数据,跳出循环*/

    p1->next=(STUDENT *)malloc(LEN);    /*为下一个结点开辟空间*/

    if(!p1->next)

    {

    printf("Out of memory!\n");

    return (head);

    }

    p2=p1;           /*使p2指向刚才p1指向的结点*/

    p1=p1->next;     /*指针后移,新读入数据链到当前表尾*/

    }

    p2->next=NULL;     /*最后一个结点的后继指针为空*/

    fclose(fp);

    printf("You have success to read data from the file!\n");

    return (head);

    }

    /*按平均分排序函数*/

    STUDENT *sort(STUDENT *head)

    {int i=0;                         /*保存名次*/

    STUDENT *p1,*p2,*t,*temp;        /*定义临时指针*/

    temp=head->next;                 /*将原表的头指针所指的下一个结点作头指针*/

    head->next=NULL;                 /*第一个结点为新表的头结点*/

    while(temp!=NULL)                /*当原表不为空时,进行排序*/

    {

    t=temp;               /*取原表的头结点*/

    temp=temp->next;      /*原表头结点指针后移*/

    p1=head;               /*设定移动指针p1,从头指针开始*/

    p2=head;               /*设定移动指针p2做为p1的前驱,初值为头指针*/

    while(t->averageaverage&&p1!=NULL)    /*作成绩平均分比较*/

    {

    p2=p1;              /*待排序点值小,则新表指针后移*/

    p1=p1->next;

    }

    if(p1==p2)        /*p1==p2,说明待排序点值大,应排在首位*/

    {

    t->next=p1;       /*待排序点的后继为p*/

    head=t;           /*新头结点为待排序点*/

    }

    else      /*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/

    {

    t->next=p1;     /*t的后继是p1*/

    p2->next=t;     /*p2的后继是t*/

    }

    }

    p1=head;           /*已排好序的头指针赋给p1,准备填写名次*/

    while(p1!=NULL)    /*当p1不为空时,进行下列操作*/

    {

    i++;             /*结点序号*/

    p1->order=i;     /*将结点序号赋值给名次*/

    p1=p1->next;     /*指针后移*/

    }

    printf("Sorting is sucessful.\n");     /*排序成功*/

    return (head);

    }

    /*插入记录函数*/

    STUDENT    *insert(STUDENT *head,STUDENT *new)

    {STUDENT *p0,*p1,*p2;

    int n,sum1,i;

    p1=head;    /*使p1指向第一个结点*/

    p0=new;     /*p0指向要插入的结点*/

    printf("\nPlease enter a new record.\n");        /*提示输入记录信息*/

    printf("Enter the grade:");

    scanf("%s",new->grade);

    printf("Enter the name:");

    scanf("%s",new->name);

    do{

    printf("Enter the sex(M or W):");

    scanf("%s",&new->sex[0]);

    if(new->sex[0]!='M'&&new->sex[0]!='W')

    printf("Data error,please enter again.\n");

    }while(new->sex[0]!='M'&&new->sex[0]!='W');

    printf("Please enter the %d scores.\n",3);

    sum1=0;      /*保存新记录的总分,初值为0*/

    for(i=0;i<3;i++)

    {

    do{

    printf("score%d:",i+1);

    scanf("%d",&new->score[i]);

    if(new->score[i]>100||new->score[i]<0)

    printf("Data error,please enter again.\n");

    }while(new->score[i]>100||new->score[i]<0);

    sum1=sum1+new->score[i];      /*累加各门成绩*/

    }

    new->sum=sum1;      /*将总分存入新记录中*/

    new->average=(float)sum1/3;

    new->order=0;

    if(head==NULL)    /*原来的链表是空表*/

    {head=p0;p0->next=NULL;}    /*使p0指向的结点作为头结点*/

    else

    {while((p0->averageaverage)&&(p1->next!=NULL))

    {p2=p1;     /*使p2指向刚才p1指向的结点*/

    p1=p1->next;     /*p1后移一个结点*/

    }

    if(p0->average>=p1->average)

    {if(head==p1)head=p0;     /*插到原来第一个结点之前*/

    else p2->next=p0;        /*插到p2指向的结点之后*/

    p0->next=p1;}

    else

    {p1->next=p0;p0->next=NULL;} /*插到最后的结点之后*/

    }

    n=n+1; /*结点数加1*/

    head=sort(head);    /*调用排序的函数,将学生成绩重新排序*/

    printf("\nStudent    %s have been inserted.\n",new->name);

    printf("Don't forget to save the new file.\n");

    return(head);

    }

    /*统计学生成绩函数*/

    STUDENT *statistciam(STUDENT *head)

    {

    float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min;

    STUDENT *p;

    int x,y=0,i=0;

    p=head;

    printf("1.sum and average\n2.single of average\n3.max of sum\n4.min of sum\n");

    scanf("%d",&x);

    getchar();

    switch(x)

    /*用switch语句实现功能选择*/

    {

    case 1: if(head==NULL)

    {printf("\n There are not anyone's information !\n");return(head);}/*链表为空*/

    else

    {

    printf("---------------------------------------------------------\n");

    printf("|Grade\t|Name\t|Sc1\t|Sc2\t|Sc3\t|Sum\t|Ave\t|\n");

    printf("---------------------------------------------------------\n");/*打印表格域*/

    while(p!=NULL)

    {

    sum1=p->score[0]+p->score[1]+p->score[2];  /*计算个人总分*/

    ave1=sum1/3;/*计算个人平均分*/

    printf("|%s\t|%s\t|%.1d\t|%.1d\t|%.1d\t|%.1f\t|%.1f\t|\n",p->grade,p->name,p->score[0],p->score[1],p->score[2],sum1,ave1);

    /*打印结果*/

    printf("---------------------------------------------------------\n");/*打印表格域*/

    p=p->next;}

    }

    return(head);

    case 2: if(head==NULL)

    {printf("\nThere are not anyone's information !\n");return(head);}/*链表为空*/

    while(p!=NULL)

    {

    sum1=sum1+p->score[0];

    sum2=sum2+p->score[1];

    sum3=sum3+p->score[2];/*计算总分*/

    y=y+1;

    ave1=sum1/y;

    ave2=sum2/y;

    ave3=sum3/y;/*计算平均分*/

    p=p->next;/*使p指向下一个结点*/

    }

    printf("score1 average is%.1f\n",ave1);

    printf("score2 average is%.1f\n",ave2);

    printf("score3 average is%.1f\n",ave3);/*打印结果*/

    return(head);

    case 3:

    if(head==NULL)

    {printf("\nThere are not anyone's information !\n");return(head);}/*链表为空*/

    max=p->score[0]+p->score[1]+p->score[2];

    while(i

    {

    i=i+1;

    sum1=p->score[0]+p->score[1]+p->score[2];  /*计算个人总分*/

    if(max

    max=sum1;

    p=p->next;

    }

    printf("max of sum:%.1f",max);

    printf("\n");

    return(head);

    case 4: if(head==NULL)

    {printf("\nThere are not anyone's information !\n");return(head);}/*链表为空*/

    while(p!=NULL)

    {

    min=p->score[0]+p->score[1]+p->score[2];

    while(p!=NULL)

    {sum2=p->score[0]+p->score[1]+p->score[2];

    if(min>sum2)

    min=sum2;

    p=p->next;

    }

    }

    printf("min of sum:%.1f",min);

    printf("\n");

    return(head);

    default :printf("Data error,please enter again!\n");

    }

    return(head);

    }

    展开全文
  • C语言学生成绩管理

    2018-04-24 15:20:37
    设计一个学生成绩管理系统,对上学期的本班的学习成绩进行管理,具有查询和检索功能,并且能够对指定文件操作,也可将多个文件组成一个文件A、 设计内容 1、每一条记录包括一个学生的学号、姓名、性别、各门课成绩...
  • C语言基于单链表得学生成绩管理系统

    万次阅读 多人点赞 2018-07-31 22:57:54
    传说中讲课通俗而不庸俗,说话风流而不下流的小又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统。首先给大家总结下为什么你们学习C语言会觉得难,尤其是对于单链表这块,主要原因得是因为一下两点:...

    传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统。首先给大家总结下为什么你们学习C语言会觉得难,尤其是对于单链表这块,主要原因得是因为一下两点:

    编写流程不清晰

    功能设计不清晰

    基于单链表得学生成绩管理系统分为两个模块。

    #include

    #include

    #include

    struct student

    {

    char name[20];

    charnum[20];

    int math;

    int english;

    };

    struct Node

    {

    //int data;

    struct student data;

    struct Node* next;

    };

    struct Node* createList

    {

    //指针的基础:指针变成变量:需要内存

    struct Node*headNode= (struct Node*)malloc(sizeof(struct Node));

    //那么他就可以表示变量,初始化变量里面的东西

    //由于功能限制,导致有些东西不需要初始化

    headNode->next = NULL;

    return headNode;

    }

    //2.创建结点:数据

    struct Node* createNode(struct student data)

    {

    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

    newNode->data = data;

    newNode->next = NULL;

    return newNode;

    }

    //插入 学会一种方法就可以:表头插入 组成链表就是连接过程,结构体变量连接结构体

    //函数参数是有意义的东西,插入那个链表?--》list 插入的数据是多少--》data

    void insertNodeByHead(struct Node* headNode, struct student data)

    {

    //表头法插入

    //1.创建结点

    struct Node* newNode = createNode(data);

    //插入

    newNode->next = headNode->next;

    headNode->next = newNode;

    }

    //查找

    struct Node*findByName(struct Node* headNode, char * name)

    {

    struct Node* pMove = headNode->next;

    while (pMove)

    {

    //比较,改为字符串比较

    if (!strcmp(pMove->data.name,name))

    {

    return pMove;

    }

    //没有往下走

    pMove = pMove->next;

    }

    return NULL;

    }

    //删除--》指定删除

    void deleteNodeByName(struct Node* headNode, char * name)

    {

    //找到指定位置那个结点,以及制定位置前面那个结点

    //要有两个相邻的指针

    struct Node* p = headNode;//前面那个

    struct Node* q = headNode->next;//后面那个

    if (q == NULL)

    {

    printf("么有(没有)可用信息,无法删除 ");

    }

    else

    {

    while (strcmp(q->data.name,name))

    {

    p = q;//p到达q的位置

    q = p->next;//q到达q的下一个

    if (q == NULL)

    {

    printf("未找到制定位置,无法删除 ");

    return;

    }

    }

    p->next = q->next;

    free(q);

    }

    }

    //删除--》指定删除

    void deleteNodeByNum(struct Node* headNode, char * num)

    {

    //要有两个相邻的指针

    if (q == NULL)

    {

    }

    else

    {

    while (strcmp(q->data.num, num))

    {

    p = q;//p到达q的位置

    if (q == NULL)

    {

    return;

    }

    }

    p->next = q->next;

    free(q);

    }

    }

    //打印

    void printList(struct Node*headNode)

    {

    //要从二个开始打印

    //定义一个移动的指针

    printf("姓名 编号 数学 英语 ");

    while (pMove)

    {

    printf("%s %s %d %d ", pMove->data.name, pMove->data.num, pMove->data.math, pMove->data.english);

    pMove = pMove->next;

    }

    printf(" ");

    }

    系统设计

    #define _CRT_SECURE_NO_WARNINGS

    #include

    #include

    #include "singleList.h"

    struct Node* list = createList;

    //界面

    void menu

    {

    printf(" ");

    printf(" 0.退出系统 ");

    printf(" 1.录入信息 ");

    printf(" 2.显示信息 ");

    printf(" 3.删除信息 ");

    printf(" 4.查找信息 ");

    printf(" 5.保存到文件 ");

    }

    void menuOfDelete

    {

    printf(" 1.按照姓名删除 ");

    printf(" 2.按照学号删除 ");

    }

    voidkeyDownOfDelete

    {

    intchoice;

    scanf("%d", &choice);

    char name[20];

    char num[20];

    switch (choice)

    {

    case 1://1.按照姓名删除

    printf("请输入要删除的姓名:");

    scanf("%s", name);

    deleteNodeByName(list, name);

    break;

    case 2://2.按照学号删除

    printf("请输入要删除的学号:");

    scanf("%s", num);

    deleteNodeByNum(list, num);

    break;

    default:

    printf("输入错误,无法删除 ");

    }

    }

    //保存到文件

    void saveInfoToFile(struct Node* list, char *filePath, char *mode)

    {

    struct Node* pMove = list->next;

    FILE *fp =fopen(filePath, mode);

    while (pMove)

    {

    fprintf(fp, "%s %s %d %d ", pMove->data.name, pMove->data.num, pMove->data.math, pMove->data.english);

    pMove = pMove->next;

    }

    fclose(fp);

    }

    void readInfoFromFile(struct Node* list, char *filePath, char *mode)

    {

    struct student data;

    while (fscanf(fp, "%s %s %d %d ", data.name, data.num, &data.math, &data.english) !=EOF)

    {

    insertNodeByHead(list, data);

    }

    fclose(fp);

    }

    //交互:按键操作+鼠标操作C语言:按键操作

    void keyDown

    {

    int choice;

    struct student stuInfo;

    chartemp= ' ';

    switch (choice)

    {

    case 0:

    system("pause");

    exit(0);

    break;

    case 1://1.录入信息

    while (1)

    {

    printf("请输入学生的姓名,编号,math,english:");

    fflush(stdin);

    scanf("%s%s%d%d", stuInfo.name, stuInfo.num, &stuInfo.math, &stuInfo.english);

    //链表的插入

    insertNodeByHead(list, stuInfo);

    printf("是否继续?(N)");

    fflush(stdin);

    temp = getchar;

    if (temp == 'N' ||temp== 'n')

    break;

    }

    break;

    case 2://2.显示信息

    printList(list);

    break;

    case 3://3.删除信息

    menuOfDelete;

    keyDownOfDelete;

    break;

    case 4://4.查找信息

    printf("请输入要查找的学生的姓名:");

    scanf("%s", stuInfo.name);

    if (findByName(list, stuInfo.name) != NULL)

    {

    printf("%s %s %d %d ", findByName(list, stuInfo.name)->data.name,

    findByName(list, stuInfo.name)->data.num, findByName(list, stuInfo.name)->data.math,findByName(list, stuInfo.name)->data.english);

    }

    else

    {

    printf("未找到相关信息! ");

    }

    break;

    case 5://5.保存到文件

    saveInfoToFile(list,"1.txt", "w");

    break;

    default:

    printf("输入错误,重新输入 ");

    break;

    }

    }

    int main

    {

    readInfoFromFile(list, "1.txt", "r");

    while (1)

    {

    menu;

    keyDown;

    system("pause");

    system("cls");

    }

    return 0;

    }

    和大家说了这么多,并不是告诉大家我的技术有多么多么的牛,而是想告诉大家,只要你有决心和意志,要好学C/C++并没那么难。要混口饭吃也不是这么难哦。

    展开全文
  • C语言程序设计(学生成绩管理系统) 要求程序实现查询、排序、插入、删除诸功能
  • 这篇文章主要为大家详细介绍了C语言实现简单学生成绩管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 系统功能: 1.实现所有学生成绩的录入(利用结构体数组),当输入字符为end时候,结束成绩的...
  • 学生成绩管理程序 编制一个统计学生考试分数的管理程序。 设学生成绩已以一个学生一个记录的形式存储在文件中, 每位学生记录包含的信息有:姓名,学号和各门功课的成绩。 程序具有以下几项功能:求出各门课程的总分...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#includestructstu{intnum;//学号charname[10];//姓名floatcj[3];//成绩floatpj;//平均成绩floatzf;//总分};inti=0;intz;structstup[50];voidcharu(structstuu[]...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 133
精华内容 53
关键字:

c语言编学生成绩管理系统

c语言 订阅