精华内容
下载资源
问答
  • C语言开发简单的学生成绩管理系统(附源码)

    万次阅读 多人点赞 2019-04-15 21:08:22
    学生成绩管理系统 开发语言:C语言 开发工具:Visual Studio 2019 开发时间:2019.4.14 开发者:summer @一、系统使用展示 @二、系统功能 @三、菜单 @四、录入学生信息 @五、打印学生信息 @六、保存学生信息 @七、...

    学生成绩管理系统

    开发语言:C语言
    开发工具:Visual Studio 2019
    开发时间:2019.4.14
    开发者:summer

    商业合作可淘宝搜索店铺“程序员夏天的小店”

    @一、系统使用展示

    @二、系统功能

    @三、菜单

    @四、录入学生信息

    @五、打印学生信息

    @六、保存学生信息

    @七、读取学生信息

    @八、统计所有学生人数

    @九、查找学生信息

    @十、修改学生信息

    @十一、删除学生信息

    @十二、退出系统

    @十三、出错

    一、系统使用展示

    Alt

    二、系统功能

    1. 系统功能介绍
    1.录入学生信息:用户可以自由输入学生信息到系统中。
    2.打印学生信息:格式化展示系统中的学生信息。
    3.保存学生信息:将系统中的学生信息保存到本地文档。
    4.读取学生信息:读取本地文档中的学生信息并显示。
    5.统计所有学生人数
    6.查找学生信息:根据用户给定的信息(学号)在系统中查找该学生的信息
    7.修改学生信息
    8.删除学生信息
    0.退出系统
    
    1. 系统main函数,while循环在外,系统程序能够持续运行,switch判断语句进行功能选择与函数切换。
    int main() {
    	while (1)
    	{
    		//打印菜单
    		Menu();
    		//读取一个字符 整数,字符在内存中映射为ASCII码
    		char ch = _getch();
    
    		switch (ch)
    		{
    		case '1'://1.录入学生信息
    			InputStudent();
    			break;
    		case '2'://2.打印学生信息
    			PrintStudent();
    			break;
    		case '3'://3.保存学生信息
    			SaveStudent();
    			break;
    		case '4'://4.读取学生信息
    			ReadStudent();
    			break;
    		case '5'://5.统计所有学生人数
    			CountStudent();
    			break;
    		case '6'://6.查找学生信息
    			FindStudent();
    			break;
    		case '7'://7.修改学生信息
    			ChangeStudent();
    			break;
    		case '8'://8.删除学生信息
    			DeleteStudent();
    			break;
    		case '0'://0.退出系统
    			return 0;
    			break;
    		default:
    			printf("输入有误,没有该功能\n\n");
    			system("pause");  //暂停
    			system("cls");    //清屏
    			break;
    		}
    	}
    
    	return 0;
    }
    

    三、菜单

    1. 菜单显示
    //菜单
    void Menu() {
    	printf("*************************************************\n");
    	printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");
    	printf("*\t\t请选择功能\t\t\t*\n");
    	printf("*************************************************\n");
    	printf("*\t\t1.录入学生信息\t\t\t*\n");
    	printf("*\t\t2.打印学生信息\t\t\t*\n");
    	printf("*\t\t3.保存学生信息\t\t\t*\n");
    	printf("*\t\t4.读取学生信息\t\t\t*\n");
    	printf("*\t\t5.统计所有学生人数\t\t*\n");
    	printf("*\t\t6.查找学生信息\t\t\t*\n");
    	printf("*\t\t7.修改学生信息\t\t\t*\n");
    	printf("*\t\t8.删除学生信息\t\t\t*\n");
    	printf("*\t\t0.退出系统\t\t\t*\n");
    	printf("*************************************************\n");
    }
    
    1. 打印菜单

    scanf()、getchar()输入后均需要按enter,而getch()不用

    	//打印菜单
    	Menu();
    	//读取一个字符 整数,字符在内存中映射为ASCII码
    	char ch = _getch();
    

    四、录入学生信息

    1. 定义学生结构体、链表节点结构体
    //定义一个学生
    typedef struct tagStudent {
    	char szName[20];	//姓名
    	char szSex[4];		//性别
    	int  nAge;			//年龄
    	int  nStuNo;		//学号
    	int  nScore;		//成绩
    }Student;
    
    //链表
    //节点
    typedef struct tagNode
    {
    	Student stu;			//学生信息
    	struct tagNode* pNext;	//指向下一个节点
    }Node;
    
    //创建头节点
    Node* g_pHead = NULL;		//指向头节点
    
    1. 利用学生结构体,以及链表操作输入学生信息
    //1.录入学生信息
    void InputStudent() {
    	//创建一个人,在堆中分配内存
    	Node* pNewNode = (Node*)malloc(sizeof(Node));
    	//指针下一个指向空
    	pNewNode->pNext = NULL;
    
    	//查找链表的尾结点
    	Node* p = g_pHead;
    	while (g_pHead != NULL && p->pNext != NULL)
    	{
    		p = p->pNext;
    	}
    
    	//把节点插到链表的尾节点
    	if (g_pHead == NULL) {
    		g_pHead = pNewNode;
    	}
    	else {
    		p->pNext = pNewNode;
    	}
    
    	//录入学生信息
    	printf("请输入学生姓名:\n");
    	scanf_s("%s", pNewNode->stu.szName, sizeof(pNewNode->stu.szName));
    	printf("请输入性别:\n");
    	scanf_s("%s", pNewNode->stu.szSex, sizeof(pNewNode->stu.szSex));
    	printf("请输入学生年龄:\n");
    	scanf_s("%d", &pNewNode->stu.nAge);
    	printf("请输入学号:\n");
    	scanf_s("%d", &pNewNode->stu.nStuNo);
    	printf("请输入成绩:\n");
    	scanf_s("%d", &pNewNode->stu.nScore);
    
    	printf("学生信息录入成功。\n\n");
    	system("pause");
    	system("cls");
    }
    

    五、打印学生信息

    1. 读取链表结构,输出学生信息。先进行判空处理,如果无学生信息则输出提示信息,反之则正确输出学生信息。
    //2.打印学生信息
    void PrintStudent() {
    
    	system("cls");
    	//遍历链表
    	Node* p = g_pHead;
    	if (p == NULL) {
    		printf("系统中暂无学生信息,请录入后再来打印查看。\n\n");
    	}
    	else {
    		printf("*********************************************************************************\n");
    		printf("*\t\t\t欢迎使用高校学生成绩管理系统V1.0\t\t\t*\n");
    		printf("*********************************************************************************\n");
    		printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    		printf("*********************************************************************************\n");
    
    		while (p != NULL)
    		{
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    
    			//下一个节点
    			p = p->pNext;
    			printf("*********************************************************************************\n");
    		}
    	}
    
    	system("pause");
    	system("cls");
    }
    

    六、保存学生信息

    1. 利用文件对学生信息进行存储
    //3.保存学生信息
    void SaveStudent() {
    	//打开文件
    	FILE* pFile;
    	pFile = fopen(".\\stuinfo.dat", "w");
    	
    	if (pFile == NULL) {
    		printf("打开文件失败。\n");
    		return;
    	}
    
    	//写入数据
    	Node* p = g_pHead;
    	while (p != NULL)
    	{
    		fwrite(&p->stu, sizeof(Node), 1, pFile);
    		p = p->pNext;
    	}
    
    	//关闭文件
    	fclose(pFile);
    
    	printf("数据保存成功。\n");
    	system("pause");
    	system("cls");
    }
    
    1. fopen在vs中会报错,解决方式

    (1)按照vs的提示,将fopen换成fopen_s

    (2)不修改函数,仅仅修改项目的属性。因为fopen_s是一种Microsoft的函数,若纯做Windows开发则直接改为_s也无妨,但是我们尽量还是用标准C++比较好,这样代码有较好的移植性。

    具体操作:

    右键工程名–>属性–>C/C++–>预处理器–>预处理器定义,编辑右边输入框加入: _CRT_SECURE_NO_WARNINGS

    保存(注意用分号隔开)。

    七、读取学生信息

    1. 打开存储学生信息的文本,单个单词读取,判断非分隔符或者空时则赋值给链表中的节点,读取完毕后,直接调用PrintStudent()函数进行打印结果。
    //4.读取学生信息
    void ReadStudent() {
    	system("cls");
    
    	//打开文件
    	FILE* pFile;
    	pFile = fopen(".\\stuinfo.dat", "r");
    
    	if (pFile == NULL) {
    		printf("打开文件失败。\n");
    		return;
    	}
    	
    	//创建一个人,在堆中分配内存
    	Node* p = (Node*)malloc(sizeof(Node));
    	p->pNext = NULL;
    	//重新建立链表
    	g_pHead = p;
    
    	//逐个单词读入文本内容
    	char str[200];
    	int i = 0;
    	while (fscanf(pFile, "%s", str) != EOF) {  //读文件 
    		//单词不是*或者空时,进行赋值
    		if (strcmp(str, "*") && str != NULL) {
    			switch (i)
    			{
    			case 0:
    				p->stu.nStuNo = atoi(str);
    				break;
    			case 1:
    				strcpy(p->stu.szName, str);
    				break;
    			case 2:
    				strcpy(p->stu.szSex, str);
    				break;
    			case 3:
    				p->stu.nAge = atoi(str);
    				break;
    			case 4:
    				p->stu.nScore = atoi(str);
    				break;
    			default:
    				Node* pNewNode = (Node*)malloc(sizeof(Node));
    				pNewNode->pNext = NULL;
    				p->pNext = pNewNode;
    				p = pNewNode;
    				p->stu.nStuNo = atoi(str);
    				i = 0;
    				break;
    			}
    			i++;
    		}
    	}
    	//打印读取结果
    	PrintStudent();
    }
    
    1. 读取文本时,将内容全部赋值给char数组,所有赋值时需特殊处理。
    • char数组赋值给整数

      在<stdlib.h>头文件中有两个函数,int atoi(char *p)和char *itoa(int p),分别将装有整数的char数组转化为整数,和将整数按位数分解依次存入char数组中。

    • char数组赋值给char数组

      用strcpy函数!

      原型声明:extern char *strcpy(char *dest,char *src);

      头文件:string.h

      功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

      说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

      返回指向dest的指针。

      注:不能使用memcpy(a, b, strlen(b)),会导致中文乱码。

    八、统计所有学生人数

    1. 设置计数器,遍历链表
    //5.统计所有学生人数
    void CountStudent() {
    	int countStu = 0;
    
    	//遍历链表
    	Node* p = g_pHead;
    	while (p != NULL)
    	{
    		countStu++;
    		p = p->pNext;
    	}
    	printf("学生总人数:%d\n\n", countStu);
    
    	system("pause");
    	system("cls");
    }
    

    九、查找学生信息

    1. 本次查找以学号为示例,改用姓名等信息查询流程基本一致。

      遍历链表,如果有符合信息的学生则打印,反之则继续下一个节点,若系统中无该学生信息,给予用户无结果提示。

    //6.查找学生信息
    void FindStudent() {
    	system("cls");
    	//以学号为查找示例,其他信息查找流程基本相似
    	int stuNum;
    	printf("请输入查找学生学号:");
    	scanf("%d", &stuNum);
    	//遍历链表查找,查找到后进行信息显示
    	Node* p = g_pHead;
    	//对表头进行展示一次
    	bool isShowHead = false;
    	//记录是否有找到该学号的学生信息
    	bool isFindStu = false;
    	while (p != NULL)
    	{
    		if (stuNum == p->stu.nStuNo) {
    			if (!isShowHead) {
    				printf("*********************************************************************************\n");
    				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    				printf("*********************************************************************************\n");
    				isShowHead = true;
    			}
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    			isFindStu = true;
    			printf("*********************************************************************************\n");
    		}
    		p = p->pNext;
    	}
    
    	if (!isFindStu) {
    		printf("学号输入有误,系统中暂无该学生信息。\n\n");
    	}
    
    	system("pause");
    	system("cls");
    }
    

    十、修改学生信息

    1. 可参考查找学生信息代码段,在查找后进行修改即可
    //7.修改学生信息
    void ChangeStudent() {
    	//以学号为查找示例,其他信息查找流程基本相似
    	int stuNum;
    	printf("请输入欲修改学生的学号:");
    	scanf("%d", &stuNum);
    	//遍历链表查找,查找到后进行信息显示
    	Node* p = g_pHead;
    	//对表头进行展示一次
    	bool isShowHead = false;
    	//记录是否有找到该学号的学生信息
    	bool isFindStu = false;
    	while (p != NULL)
    	{
    		if (stuNum == p->stu.nStuNo) {
    			if (!isShowHead) {
    				printf("*********************************************************************************\n");
    				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    				printf("*********************************************************************************\n");
    				isShowHead = true;
    			}
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    			//修改学生信息
    			printf("请输入学生姓名:\n");
    			scanf_s("%s", p->stu.szName, sizeof(p->stu.szName));
    			printf("请输入性别:\n");
    			scanf_s("%s", p->stu.szSex, sizeof(p->stu.szSex));
    			printf("请输入学生年龄:\n");
    			scanf_s("%d", &p->stu.nAge);
    			printf("请输入学号:\n");
    			scanf_s("%d", &p->stu.nStuNo);
    			printf("请输入成绩:\n");
    			scanf_s("%d", &p->stu.nScore);
    			isFindStu = true;
    			printf("*********************************************************************************\n");
    			printf("学生信息修改成功,请注意及时保存。\n\n");
    		}
    		p = p->pNext;
    	}
    
    	if (!isFindStu) {
    		printf("学号输入有误,系统中暂无该学生信息,无法进行修改。\n\n");
    	}
    
    	system("pause");
    	system("cls");
    }
    

    十一、删除学生信息

    1. 仍然以查找学生信息操作为基础,以学号为线索,查找到则进行删除,未查找到则进行错误提示,删除时需要区分当前节点是头结点、尾节点或者中间节点,不同节点操作不同,同时该删除仅作用于本次操作,需保存学生信息才能长久生效。
    //8.删除学生信息
    void DeleteStudent() {
    	system("cls");
    	//以学号为查找示例,其他信息查找流程基本相似
    	int stuNum;
    	printf("请输入删除学生的学号:");
    	scanf("%d", &stuNum);
    	//遍历链表查找,查找到后进行信息显示
    	Node* p = g_pHead;
    	//记录前一个节点,删除时方便操作
    	Node* beforeNode = g_pHead;
    
    	//对表头进行展示一次
    	bool isShowHead = false;
    	//记录是否有找到该学号的学生信息
    	bool isFindStu = false;
    	while (p != NULL)
    	{
    		if (stuNum == p->stu.nStuNo) {
    			if (!isShowHead) {
    				printf("*********************************************************************************\n");
    				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    				printf("*********************************************************************************\n");
    				isShowHead = true;
    			}
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    			isFindStu = true;
    			printf("*********************************************************************************\n");
    
    			//删除节点为头节点
    			if (p == g_pHead) {
    				g_pHead = p->pNext;
    			}
    			//删除节点为尾节点
    			else if (p->pNext == NULL) {
    				p = beforeNode;
    				p->pNext = NULL;
    			}
    			//删除节点为中间节点
    			else {
    				beforeNode->pNext = p->pNext;
    			}
    			printf("删除成功,请记得保存。\n\n");
    		}
    		beforeNode = p;
    		p = p->pNext;
    	}
    
    	if (!isFindStu) {
    		printf("学号输入有误,系统中暂无该学生信息,无法进行删除操作。\n\n");
    	}
    
    	system("pause");
    	system("cls");
    }
    

    十二、退出系统

    直接在选择0时,设置return即可。

    十三、出错

    用户输入有误时,进行提示信息输出即可。

    	printf("输入有误,没有该功能\n\n");
    	system("pause");  //暂停
    	system("cls");    //清屏
    

    展开全文
  • 学生成绩查询web系统—功能概述 文章目录学生成绩查询web系统—功能概述任务摘要一、前景介绍1、背景2、规划二、技术分析1、前端技术2、后端技术3、数据库4、登录验证三、功能模块1、系统划分及功能2、功能例图四...

    学生成绩查询web系统—功能概述

    任务摘要

    对基于JSP+Mysql实现的简单的学生成绩查询web系统功能做一个简单的阐述,帮助大家了解其系统功能的实现。

    一、前景介绍

    1、背景

    随着学生数量的日渐增多,学生教务系统的数据量也不断增加,这无疑大大增加了教务系统的负担。如果能把负责学生成绩管理的模块独立出来形成一个独立的系统,便可以有效降低教务系统的数据量,不仅可以方便管理员对于所有学生的信息进行系统的管理,而且便于教师对学生成绩进行查询和修改,学生也可以查询自己的成绩。这些优点能够极大地提高学生成绩管理的效率。因此,开发一套合适的、兼容性好的系统是很有必要的。

    2、规划

    一个基于JSP成绩管理系统

    1. 良好的前端展示,便于用户操作,可以轻松上手
    2. 具有可靠性,系统不同角色分配的权限合理,不泄露用户信息
    3. 可以批量录入信息,实现对信息的增删改查
    4. 反应迅速,能及时给出反馈

    二、技术分析

    1、前端技术

    前端主要使用html、css、js等基本技术,此外还用到bootstrap、jQuery、jstl等技术使得前端交互性增强。页面布局多采用相对布局,放大或缩小页面,页面内容分仍保持相对位置。

    Frame框架
    用于实现页面的局部加载和刷新。
    jQuery技术
    为了可以直接在某条记录上动态修改数据(即直接在当前页面修改而不是重新打开一个修改数据的页面),采用了jQuery技术,实现了在记录原位置直接修改数据。
    Ajax
    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。AJAX 通过在后台与服务器进行少量数据交换,使网页实现异步更新。
    JSON
    JavaScript Object Notation(JavaScript 对象表示法)
    JSON 是存储和交换文本信息的语法。类似 XML,比 XML 更小、更快,更易解析,是一种轻量级的数据传输方式。

    2、后端技术

    DAO (DataAccessObjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。
    DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。
    DAO 模式的优势----两次隔离

    • 隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性
    • 隔离了不同数据库实现。采用面向接口编程,如果底层数据库变化,如由 MySQL 变成 Oracle 只要增加 DAO 接口的新实现类即可,原有 MySQL 实现不用修改。这符合”开-闭”原则。该原则降低了代码的藕合性,提高了代码扩展性和系统的可移植性

    三层架构(web层、service层和dao层)

    三层架构(web层、service层和dao层)

    Controller层:(也叫web层)Controller层负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程。
    Service层:Service层主要负责业务模块的逻辑应用设计。调用DAO层存取数据。
    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰。
    在这里插入图片描述

    3、数据库

    数据库的连接
    采用mysql数据库,连接数据库用到jdbc数据库驱动。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
    数据库的设计
    该系统使用关系型数据库,建表时采用关系模型的数据结构,每个实体对应一张表,联系若有属性,也可对应一张表,如学生实体对应一张学生表,课程对应一张课程表,课程和学生之间是学习的关系,他们会产生一个属性-分数,因此也应该有一张学生课程表。
    设置表的主键、外键以及表之间的级联关系。如:成绩表中的学生必须是学生表中存在的学生,当删除学生表中某一个学生时,若两张表是级联删除关系时,成绩表中该学生的信息自动删除。更新时也一样。这样避免了后端逻辑实现的复杂性。
    服务器
    使用Tomcat服务器。Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

    4、登录验证

    统有学生、教师和管理员三种不同身份的用户,系统分别为设置权限等级,当某用户登录时,系统会检索他们的等级,让他们访问对应的操作页面,学生进入学生系统模块,教师进入教师系统模块,管理员进入管理员系统模块。

    三、功能模块

    1、系统划分及功能

    学生成绩管理系统分为三个模块:学生模块、教师模块和管理员模块。

    • 学生模块的功能:个人信息的查询,部分信息的修改,本人成绩的查询
    • 教师模块的功能:个人信息的查询,成绩的录入、修改、查看和分析
    • 管理员模块的功能:对学生、教师、班级、课程的增删改查,课程的安排,系统用户的添加和删除

    在这里插入图片描述

    2、功能例图

    ,学生成绩管理系统包括三个参与者:学生、教师、管理员。根据不同身份的用户和系统的交互活动不同,可以画出如下用例
    在这里插入图片描述

    四、系统设计

    1、系统结构

    学生成绩管理系统分为学生、教师和管理员三大模块。每个模块有分为几个子功能模块。
    学生登录后可进行的操作:

    • 查看个人资料
    • 修改个人资料
    • 查询分数

    教师登陆后可进行的操作:

    • 查看个人资料
    • 修改个人资料
    • 录入学生成绩
    • 修改成绩
    • 查询学生成绩
    • 成绩分析统计查询

    管理员登陆后可进行的操作:

    • 管理学生信息
    • 管理教师信息
    • 基本信息管理
    • 系统用户信息管理

    2、数据表

    student(学生表)
    在这里插入图片描述
    teacher(教师表)
    在这里插入图片描述
    score(成绩表)
    在这里插入图片描述

    3、E-R图

    系统整体的实体关系图
    在这里插入图片描述
    学生信息实体E-R图
    在这里插入图片描述
    教师信息实体E-R图
    在这里插入图片描述
    成绩信息实体E-R图
    在这里插入图片描述

    4、系统流程图

    学生
    在这里插入图片描述
    教师
    在这里插入图片描述
    管理员
    在这里插入图片描述

    总结

    此篇文章主要对简易的学生成绩管理web系统功能做一个简单的描述,让大家可以清楚的理解其功能,当然系统的功能也比较简单,很容易上手的。主要就是针对学生成绩管理的相关操作。希望这篇文章对你有所帮助。

    参考资料

    基于JSP和MYSQL实现的学生成绩管理系统
    .

    展开全文
  • 【前言:如题,本文中涉及的项目是去年应学妹要求帮忙写的,纯C语言,在...同时,给需要完成类似课程设计的学生一个参考,但是应注意理解其中的知识点,而不应复制粘贴草草了事。】问题描述:  学期考试结束,统计

    【前言:如题,本文中涉及的项目是去年应学妹要求帮忙写的,纯C语言,在Turbo C下编译通过。最近整理资料,觉得该项目中涉及到的结构体、链表、文件操作、断言等基础知识,以及这个小项目的函数设计和变量命名等容易忽略的知识对初学C语言的朋友应该会有帮助,所以决定发布出来。同时,给需要完成类似课程设计的学生一个参考,但是应注意理解其中的知识点,而不应复制粘贴草草了事。】

    问题描述:
      学期考试结束,统计某班每个学生的平均成绩,每门课的平均成绩,并按个人平均成绩从高到低的顺序输出成绩,输出不及格人名单。输入、输出格式自定。

    实现提示:
      考试课程有:高等数学、物理、外语、C语言4门课程。录入所有同学的成绩,对数据进行处理,输出所要求的内容,程序的功能主要包括以下几个方面:
    ① 输入成绩
    ② 修改记录
    ③ 删除记录
    ④ 输出成绩并按平均成绩排序,并标记平均分不及格的学生。
    ⑤ 界面提供上述功能选择。
    ⑥ 学生人数由软件根据输入的成绩记录数自动控制。
    ⑦ 提供输出成绩到文件以及从文件读取成绩功能。

    测试数据:(自定模拟数据如下)

    这里写图片描述

    整体设计
      通过问题描述和对软件功能需求的分析,我们对程序的设计作出整体构思,其关键点在于数据结构的设计以及对数据的保存。本文提出一种用线性表和文件IO实现上述需求的解决方法,具体设计如下所述。
    数据结构
      本文将线性表设计双向循环链表,其中结点数据域为结构体stInfo。

    /// 用户信息
    typedef struct student
    {
        int  id;        // 学号
        char name[NAMELEN]; // 姓名
        int  AMaths;    // 高数成绩
        int  Physics;   // 物理成绩
        int  Foreign;   // 外语成绩
        int  Clan;  // C语言成绩
        float GPA;  // 平均分
    }stInfo;
    /// 用户信息结点结构体
    typedef struct studentNode
    {
        stInfo data;        //<! 数据域
        struct studentNode *prev;   //<! 指针域
        struct studentNode *next;
    }stNode;

    算法
      程序多处需要多链表进行查询和排序,为方便起见,本文使用遍历算法进行查询,使用冒泡法进行排序。详见附录。

    文件操作
      包括文件内容的读取和写入。为方便用户直接在文件中添加学生信息、查看程序对数据处理后的结果以及便于演示,我们并没有以二进制方式操作数据,而是将数据以文本方式写入文件,因此增加了对字符串操作的代码。详见附录。

    程序流程图

    这里写图片描述

    部分操作及细节说明

    1、该系统提供五个选项,根据提示操作即可。

    这里写图片描述

    2、文件操作涉及的两个文件,宏定义如下

    // 保存学生各科成绩
    #define STUDENTS_FILE "./students.txt"
    // 保存成绩处理完成后的结果
    #define SCORE_FILE "./GPA.txt"

      正常情况下,数据从文件STUDENTS_FILE和手动输入两种渠道进入链表,经过处理后再由链表流向文件STUDENTS_FILE和文件SCORE_FILE。

    3、主程序负责接收用户输入的数据,并传到相应接口函数,由于标准输入(即键盘)是带缓冲的,因此需要添加下面这行代码,用以清空缓冲区。

    while(getchar() != '\n') {;}

    4、输入ID号和成绩时需注意:系统将ID号范围限定为1000到1999,且不能重复,成绩范围限定为0到100。

    接口函数说明
    相关宏定义

    #define OK      1
    #define ERROR   0
    #define EXIT    2
    #define EXIST   1
    #define NOTEXIST 0

    系统操作相关函数

    /*
     * 检查用户输入的ID是否存在于链表;
     * 存在返回EXIST,不存在返回NOTEXIST。 
    */
    int CheckID(stNode *stHead, int id);
    
    /*
     * 检查用户输入的成绩是否合理;
     * 无返回值。
    */
    void InputScore(int *score);
    
    /*
     * 初始化系统,创建链表并从STUDENTS_FILE中读取数据插入链表;
     * 初始化成功返回OK,否则返回ERROR。
    */
    int InitSystem(void);
    
    /*
     * 等待用户输入结点数据并插入链表;
     * 无返回值。
    */
    void InputRecord(void);
    
    /*
     * 等待用户修改结点数据;
     * 无返回值。
    */
    void AlterRecord(void);
    
    /*
     * 等待用户删除特定结点;
     * 无返回值。
    */
    void DeleteRecord(void);
    
    /*
     * 按系统需求对链表进行处理,并将结果输出;
     * 无返回值。
    */
    void OutputRecord(void);
    
    /*
     * 退出系统,保存链表数据,释放内存;
     * 无返回值。
    */
    void Exit(void);

    链表操作相关函数

    /*
     * 初始化一个双循环链表,*stHead为链表头指针;
     * 初始化成功返回OK,否则返回ERROR。
    */
    int InitList(stNode **stHead);
    
    /*
     * 显示链表stHead所包含的内容;
     * 无返回值。
    */
    void ShowList(stNode *stHead);
    
    /*
     * 将链表stHead复制为cpHead;
     * 复制成功返回链表头指针,否则返回NULL。
    */
    stNode *CopyList(stNode *cpHead, stNode *stHead);
    
    /*
     * 将链表stHead的数据保存到文件fp中;
     * 无返回值。
    */
    void SaveList(FILE *fp, stNode *stHead);
    
    /*
     * 释放链表stHead所占用的内存;
     * 无返回值。
    */
    void FreeList(stNode *stHead);
    
    /*
     * 将以st作为数据域的结点插入到链表stHead的末尾;
     * 插入成功返回OK,否则返回ERROR。
    */
    int InsertNode(stNode *stHead, stInfo st);
    
    /*
     * 删除链表stHead上相关ID号的结点;
     * 删除成功返回OK,否则返回ERROR。
    */
    int DeleteNode(stNode *stHead, int id);
    
    /*
     * 将链表stHead相关ID号的column字段的成绩修改为score;
     * 修改成功返回OK,否则返回ERROR。
    */
    int AlterNode(stNode *stHead, int id, int column, int score);
    
    /*
     * 将链表stHead的结点按平均分降序来排序;
     * 无返回值。
    */
    void DescSort(stNode *stHead);
    
    /*
     * 显示链表stHead中平均分不及格的名单;
     * 无返回值。
    */
    void ShowFail(stNode *stHead);

    附录

    /************************************************
     File name : resultsMS.c
     Created  date : 2014-10-25 18:38
     Modified date : 2014-10-27 20:07
     Author : luhuadong
     Email  : luhuadong@163.com
     Description : 
    ************************************************/
    
    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /// 保存学生各科成绩
    #define STUDENTS_FILE "./students.txt"
    /// 保存成绩处理完成后的结果
    #define SCORE_FILE "./GPA.txt"
    
    #define OK  1
    #define ERROR   0
    #define EXIT    2
    #define EXIST   1
    #define NOTEXIST 0
    
    /// 用户基本信息数据长度
    #define STINFOLEN 80
    /// 结构体student中成员name的长度
    #define NAMELEN 32
    
    /// 用户信息
    typedef struct student
    {
        int  id;
        char name[NAMELEN];
        int  AMaths;
        int  Physics;
        int  Foreign;
        int  Clan;
        float GPA;
    }stInfo;
    
    /// 用户信息结点结构体
    typedef struct studentNode
    {
        stInfo data;        //<! 数据域
        struct studentNode *prev;   //<! 指针域
        struct studentNode *next;
    }stNode;
    
    stNode *stHead = NULL;
    int status = OK;
    
    /* 函数声明 */
    int CheckID(stNode *stHead, int id);
    void InputScore(int *score);
    int InitSystem(void);
    void InputRecord(void);
    void AlterRecord(void);
    void DeleteRecord(void);
    void OutputRecord(void);
    void Exit(void);
    
    int InitList(stNode **stHead);
    void ShowList(stNode *stHead);
    stNode *CopyList(stNode *cpHead, stNode *stHead);
    void SaveList(FILE *fp, stNode *stHead);
    void FreeList(stNode *stHead);
    int InsertNode(stNode *stHead, stInfo st);
    int DeleteNode(stNode *stHead, int id);
    int AlterNode(stNode *stHead, int id, int column, int score);
    void DescSort(stNode *stHead);
    void ShowFail(stNode *stHead);
    
    /* ******************************************************** */
    int main(void)
    {
        int mode;   // 模式选择
        // 系统初始化
        if(ERROR == InitSystem())
        {
            perror("Initialized system fail");
            return -1;
        }
        while(OK == status)
        {
            // system("clear");
            printf("++++++++++++++++++++++++++++++\n");
            printf(" 1-输入成绩\n 2-修改记录\n 3-删除记录\n 4-输出成绩\n 5-退出\n");
            printf("++++++++++++++++++++++++++++++\n>>");
            while(scanf("%d", &mode) == 0)
            {
                while(getchar() != '\n') {;}
                printf("error, try again >>\n");
            }
            while(getchar() != '\n') {;}
    
            switch(mode)
            {
                case 1: InputRecord(); break;
                case 2: AlterRecord();break;
                case 3: DeleteRecord();break;
                case 4: OutputRecord();break;
                case 5: Exit(); break;
                default: break;
            }
        }
        return 0;
    }
    /* ******************************************************** */
    
    
    int CheckID(stNode *stHead, int id)
    {
        stNode *currNode = stHead->next;
        while(currNode != stHead)
        {
            if(id == currNode->data.id) {return EXIST;}
            currNode = currNode->next;
        }
        return NOTEXIST;
    }
    
    int InitSystem(void)
    {
        FILE *fp = NULL;
        stInfo st;
        int i=0, j=0, k=0;
        char readbuf[STINFOLEN];        //<! 存放readFromFile()读取的字符串
        char strStInfo[6][NAMELEN]; //<! 保存每次读取的一条记录
    
        if(ERROR == InitList(&stHead))
        {
            printf("Created initial LIST failed.\n");
            status = ERROR;
            return ERROR;
        }
        fp = fopen(STUDENTS_FILE, "r");
        if(NULL == fp)
        {
            printf("Open %s failed.\n", STUDENTS_FILE);
            status = ERROR;
            return ERROR;
        }
        while(NULL != fgets(readbuf, STINFOLEN, fp))
        {
            /// 每一条记录共有6个字段
            for(i=0; i<6; i++)
            {
                while((' ' != readbuf[j]) \
                        && ('\n' != readbuf[j]) \
                        && ('\t' != readbuf[j]))
                {
                    strStInfo[i][k++] = readbuf[j++];
                }
                strStInfo[i][k] = '\0';
                j++;    //<! 跳过空格符
                k = 0;
            }
            j = 0;
            st.id       = atoi(strStInfo[0]);
            strcpy(st.name, strStInfo[1]);
            st.AMaths   = atoi(strStInfo[2]);
            st.Physics  = atoi(strStInfo[3]);
            st.Foreign  = atoi(strStInfo[4]);
            st.Clan     = atoi(strStInfo[5]);
            st.GPA      = 0;
    
            if(ERROR == InsertNode(stHead, st)) { return ERROR;}
        }
        printf("初始化链表==>\n");
        ShowList(stHead);
        fclose(fp);
        return OK;
    }
    
    void InputScore(int *score)
    {
        scanf("%d", score);
        while(getchar() != '\n') {;}
        while(*score < 0 || *score > 100)
        {
            printf("【成绩范围:0--100】\n>>");
            scanf("%d", score);
            while(getchar() != '\n') {;}
        }
        return ;
    }
    
    void InputRecord(void)
    {
        stInfo st;
        printf("Input ID: ");
        scanf("%d", &st.id);
        if(st.id > 1999 || st.id < 1000)
        {
            printf("ID范围为1000~1999.\n");
        }
        if(EXIST == CheckID(stHead, st.id))
        {
            printf("ID重复!\n");
            return ;
        }
        while(getchar() != '\n') {;}
        printf("姓名:");
        gets(st.name);
        printf("高数成绩:");
        InputScore(&st.AMaths);
        printf("物理成绩:");
        InputScore(&st.Physics);
        printf("外语成绩:");
        InputScore(&st.Foreign);
        printf("C语言成绩:");
        InputScore(&st.Clan);
    
        if(OK == InsertNode(stHead, st)) {printf("OK\n");}
        else {printf("Failed\n");}
    
        return ;
    }
    
    void AlterRecord(void)
    {
        int id, column, score;
        printf("Input ID: ");
        scanf("%d", &id);
    
        if(NOTEXIST == CheckID(stHead, id))
        {
            printf("ID不存在!\n");
            return ;
        }
        printf("1-高数\t2-物理\t3-外语\t4-C语言\n修改科目>>");
        scanf("%d", &column);
        printf("修改成绩为:");
        scanf("%d", &score);
    
        if(OK == AlterNode(stHead, id, column, score)) {printf("OK\n");}
        else {printf("Failed\n");}
    
        return ;
    }
    
    void DeleteRecord(void)
    {
        int id;
        printf("Input id: ");
        scanf("%d", &id);
    
        if(NOTEXIST == CheckID(stHead, id))
        {
            printf("ID不存在!\n");
            return ;
        }
        if(OK == DeleteNode(stHead, id)) {printf("OK\n");}
        else {printf("Failed\n");}
    
        return ;
    }
    
    void OutputRecord(void)
    {
        FILE *fp = NULL;
        stNode *cpHead = NULL;
    
        if(ERROR == InitList(&cpHead))
        {
            printf("Created output LIST failed.\n");
            status = ERROR;
            return ;
        }
        CopyList(cpHead, stHead);
    
        if(NULL == cpHead)
        {
            printf("Copy failed.\n");
            return ;
        }
        DescSort(cpHead);
        printf("按平均分排序==>\n");
        ShowList(cpHead);
        fp = fopen(SCORE_FILE, "w");
        if(NULL == fp)
        {
            printf("Open %s failed.\n", SCORE_FILE);
            return ;
        }
        printf("不及格学生==>\n");
        ShowFail(cpHead);
        SaveList(fp, cpHead);
        FreeList(cpHead);
        fclose(fp);
    
        return ;
    }
    
    void Exit(void)
    {
        FILE *fp = fopen(STUDENTS_FILE, "w");
        if(NULL == fp)
        {
            printf("Open %s failed.\n", STUDENTS_FILE);
            return ;
        }
        SaveList(fp, stHead);
        printf("Save to file ...\n");
        FreeList(stHead);
        fclose(fp);
        printf("successful exit.\n");
    
        status = EXIT;
        return ;
    }
    
    //****************************************************
    
    int InitList(stNode **stHead)
    {
        *stHead = (stNode *)malloc(sizeof(stNode));
    
        if(NULL != *stHead)
        {
            (*stHead)->prev = *stHead;
            (*stHead)->next = *stHead;
            return OK;
        }
        return ERROR;
    }
    
    void ShowList(stNode *stHead)
    {
        stNode *currNode = NULL;
        assert(NULL != stHead);
        printf("================================================================\n");
        printf("学号\t姓名\t\t高数\t物理\t外语\tC语言\t平均分\n");
    
        currNode = stHead->next;
        while(currNode != stHead)
        {
            printf("%d\t%-8s\t%d\t%d\t%d\t%d\t%.2f\n", currNode->data.id, \
                    currNode->data.name, currNode->data.AMaths, \
                    currNode->data.Physics, currNode->data.Foreign, \
                    currNode->data.Clan, currNode->data.GPA);
            currNode = currNode->next;
        }
        printf("================================================================\n");
    }
    
    stNode *CopyList(stNode *cpHead, stNode *stHead)
    {
        stInfo st;
        stNode *currNode = NULL;
        assert(NULL != cpHead && NULL != stHead);
    
        currNode = stHead->next;
        while(currNode != stHead)
        {
            st = currNode->data;
            st.GPA = (float)(st.AMaths + st.Physics + st.Foreign + st.Clan)/4;
            if(ERROR == InsertNode(cpHead, st)) {return NULL;}
            currNode = currNode->next;
        }
        return cpHead;
    }
    
    void SaveList(FILE *fp, stNode *stHead)
    {
        stNode *currNode = NULL;
        assert(NULL != fp && NULL != stHead);
    
        currNode = stHead->next;
        while(currNode != stHead)
        {
            fprintf(fp, "%d %s\t%d %d %d %d %.2f\n", currNode->data.id, \
                    currNode->data.name, currNode->data.AMaths, \
                    currNode->data.Physics, currNode->data.Foreign, \
                    currNode->data.Clan, currNode->data.GPA);
            currNode = currNode->next;
        }
    }
    
    void FreeList(stNode *stHead)
    {
        /// 释放链表
        stNode *currNode = stHead->next;
    
        while(currNode != stHead)
        {
            stHead->next = currNode->next;
            free(currNode);
            currNode = stHead->next;;
        }
        //free(currNode);   //<! 当用户信息表为空时会导致出错
        free(stHead);
    }
    
    int InsertNode(stNode *stHead, stInfo st)
    {
        stNode *new = NULL;
        assert(NULL != stHead);
    
        new = (stNode *)malloc(sizeof(stNode));
        if(NULL != new)
        {
            new->data = st;
    
            new->next = stHead;
            new->prev = stHead->prev;
            stHead->prev->next = new;
            stHead->prev = new;
            return OK;
        }
        return ERROR;
    }
    
    int DeleteNode(stNode *stHead, int id)
    {
        stNode *currNode = stHead->next;
        stNode *delNode = NULL;
        while(currNode != stHead)
        {
            if(id == currNode->data.id)
            {
                delNode = currNode;
                currNode->prev->next = currNode->next;
                currNode->next->prev = currNode->prev;
                currNode = currNode->prev;
                free(delNode);
                return OK;
            }
            currNode = currNode->next;
        }
        return ERROR;
    }
    
    int AlterNode(stNode *stHead, int id, int column, int score)
    {
        stNode *currNode = stHead->next;
        stNode *delNode = NULL;
        while(currNode != stHead)
        {
            if(id == currNode->data.id)
            {
                printf("修改前==>\n高数:%d\t物理:%d\t外语:%d\tC语言:%d\n", \
                        currNode->data.AMaths, currNode->data.Physics, \
                        currNode->data.Foreign, currNode->data.Clan);
    
                if(1 == column) {currNode->data.AMaths = score;}
                else if(2 == column) {currNode->data.Physics = score;}
                else if(3 == column) {currNode->data.Foreign = score;}
                else if(4 == column) {currNode->data.Clan = score;}
                else {return ERROR;}
    
                printf("修改后==>\n高数:%d\t物理:%d\t外语:%d\tC语言:%d\n", \
                        currNode->data.AMaths, currNode->data.Physics, \
                        currNode->data.Foreign, currNode->data.Clan);
                return OK;
            }
            currNode = currNode->next;
        }
        return ERROR;
    }
    
    void DescSort(stNode *stHead)
    {
        stInfo tmp;
        stNode *curr1 = stHead->next;
        stNode *curr2 = stHead->next;
        stNode *lastNode = stHead->prev;
    
        for(curr1 = stHead->next; curr1 != stHead->prev; curr1 = curr1->next, lastNode = lastNode->prev)
        {
            for(curr2 = stHead->next; curr2 != lastNode; curr2 = curr2->next)
            {
                if(curr2->data.GPA < curr2->next->data.GPA)
                {
                    tmp = curr2->data;
                    curr2->data = curr2->next->data;
                    curr2->next->data = tmp;
                }
            }
        }
    }
    
    void ShowFail(stNode *stHead)
    {
        stNode *currNode = NULL;
        assert(NULL != stHead);
        printf("********************************\n");
        printf("* 学号\t姓名\t\t平均分\n");
    
        currNode = stHead->prev;
        while(currNode->data.GPA < 60)
        {
            printf("* %d\t%-8s\t%.2f\n", currNode->data.id, \
                    currNode->data.name, currNode->data.GPA);
            currNode = currNode->prev;
        }
        printf("********************************\n");
    
    }
    
    展开全文
  • Java综合实践——学生成绩查询系统

    千次阅读 2020-12-18 15:47:43
    通过一个“学生成绩查询系统”的设计,提高运用数组和编写较大规模代码的综合能力。 “学生成绩查询系统”中保存有学生姓名、课程名称以及学生的课程成绩。查询系统从控制台输入统计命令及参数,实现几种方式的成绩...

    数组是最常用的一种数据结构,利用它可以解决很多较复杂的问题。通过一个“学生成绩查询系统”的设计,提高运用数组和编写较大规模代码的综合能力。
    “学生成绩查询系统”中保存有学生姓名、课程名称以及学生的课程成绩。查询系统从控制台输入统计命令及参数,实现几种方式的成绩查询,如:

    1. avg:分别统计学生和课程的平均分
    2. get song Java:获取学生song的Java课程的成绩
    3. sort song:列出学生song所有课程成绩排序结果
    4. exit:退出程序
    5. max java:获取Java课程成绩的最高分
    6. max song:获取学生song所有课程成绩的最高分
    package example3;
    import java.util.Arrays;
    import java.util.Scanner;
    //学生成绩查询系统
    public class example {
    		Scanner scn=new Scanner(System.in);
    	    final static int STUDENT_NUM=6;
    	    final static int COURSE_NUM=5;
    	    static String[] students= {"zhang","wang","li","zhao","liu","song"};
    	    static String[] courses= {"C","Java","mySQL","Linux","HTML"};
    	    static int[][] score=new int[STUDENT_NUM][COURSE_NUM];
    	    
    	    public static void main(String[] args) {
    	    		initScore();
    	    		show();
    	    		//显示菜单
    	    		run(students,courses,score);
    	    }
    	    
    	 //1.初始化方法   
    	public static void initScore() {//用随机数初始化成绩
    		for(int i=0;i<score.length;i++) {
    			for(int j=0;j<score[i].length;j++)
    				score[i][j]=(int)(Math.random()*101);
    		}
    	}
    	//显示成绩方法
    	public static void show() {//显示成绩
    		System.out.print("\t");//留出显示姓名的位置
    		for(int i=0;i<courses.length;i++) {//输出课程名称
    			System.out.print(courses[i]+"\t");
    		}
    		System.out.println();
    		for(int i=0;i<score.length;i++) {
    			//显示学生的姓名
    			System.out.print(students[i]+"\t");
    			//显示该学生成绩
    			for(int j=0;j<score[i].length;j++) {
    				System.out.print(score[i][j]+"\t");
    			}
    			System.out.println();
    		}
    	}
    	public static void run(String[] students,String[] courses,int[][] score) {
    		Scanner scn=new Scanner(System.in);
    		while(true) {
    			System.out.print("请输入命令:");
    			String command=scn.next();
    			
    			if(command.equalsIgnoreCase("avg")) {//"avg"命令不需要输入参数
    				avg(students,courses,score);
    			}
    			if(command.equalsIgnoreCase("get")) {//"get"命令需要两个参数
    				String parameter1=scn.next();
    				String parameter2=scn.next();
    				get(students,courses,score,parameter1,parameter2);
    			}
    			if(command.equalsIgnoreCase("sort")) {//"sort"命令需要一个参数
    				String parameter=scn.next();
    				sortByScore(students,courses,score,parameter);
    			}
    			if(command.equalsIgnoreCase("max")) {//"max"命令需要一个参数
    				String parameter=scn.next();
    				getMax(students,courses,score,parameter);
    			}
    			if(command.equalsIgnoreCase("exit")) {//退出查询系统
    				System.out.println("退出查询系统!byebye!");
    				System.exit(0);
    			}
    			}
    	}
    	private static void getMax(String[] students, String[] courses, int[][] score, String parameter) {
    		// 查询学生最高分
    		int c1=-1,c2=0;
    		for(int i=0;i<score.length;i++) {
    			if(students[i].equalsIgnoreCase(parameter)) {
    				int max=0;
    				c1=1;
    				for(int k=0;k<score.length;k++) {
    					for(int j=0;j<5;j++) {
    						if(max<score[i][j]) {
    							max=score[i][j];//算出最大值
    						}
    					}
    				}
    				System.out.println(max);
    			}
    		}
    		for(int i=0;i<courses.length;i++)//查询课程最高分
    			if(courses[i].equalsIgnoreCase(parameter)) {
    				int max=0;
    				c2=1;
    				for(int k=0;k<score.length;k++) {
    					for(int j=0;j<score[j].length-1;j++) {
    						if(max<score[k][i]) {
    							max=score[k][i];//算出最大值
    						}
    					}
    				}
    				System.out.println(max);
    			}
    	if(c1==-1&c2==0) {
    		System.out.println("你输入的既不是课程名,也不是学生名");
    	}
    }
    	private static void sortByScore(String[] students, String[] courses, int[][] score, String parameter) {	
    		//对某位学生成绩进行排序    
    		for(int i=0;i<students.length;i++)
    			if(students[i].equalsIgnoreCase(parameter)){
    			int[] a = score[i];
    			Arrays.sort(a);
    			System.out.println(Arrays.toString(a));
    			}
    	}
    	private static void get(String[] students, String[] courses, int[][] score, String condition1, String condition2) {
    		// 查询某人某门课程成绩
    		int i_index=-1,j_index=-1;
    		//查找是否存在该学生i_index
    		for(int i=0;i<score.length;i++) {
    			if(students[i].equalsIgnoreCase(condition1)) {
    				i_index=i;
    			}
    		}
    		if(i_index!=-1) {//有此人,继续查找是否有此课程j_index
    			for(int j=0;j<courses.length;j++)
    				if(courses[j].equalsIgnoreCase(condition2)) {
    					j_index=j;
    				}
    		}else {
    			System.out.println("没有"+condition1+"这个人");
    			return;
    		}
    		if(j_index!=-1) {
    			System.out.println(condition1+"的"+condition2+"的成绩是:"+score[i_index][j_index]);
    		}else {
    			System.out.println(condition1+"没有"+condition2+"这门课程");
    			return;
    		}
    	}
    	private static void avg(String[] students, String[] courses, int[][] score) {
    		// 算出所有学生课程成绩平均分
    		int i,k=0;
    		int sum1=0,sum2=0;
    		System.out.print("\t");//表示横向空8个空格
    		for(i=0;i<courses.length;i++) {
    			System.out.print(courses[i]+"\t");
    		}
    		System.out.println();//换行
    		for(i=0;i<students.length;i++) {
    			System.out.print(students[i]+"\t");
    		for(k=0;k<5;k++) {
    			System.out.print(score[i][k]+"\t");
    			sum1=sum1+score[i][k];
    		}
    		double avg1=sum1/5;
    		System.out.println(avg1+"\t");
    		sum1=0;
    		System.out.println();
    		}
    		System.out.println("所有课程平均分:");
    		for(i=0;i<5;i++) {
    			for(int j=0;j<6;j++) {
    				sum2=sum2+score[j][i];
    			}
    			double avg2=sum2/6;
    			System.out.print("\t"+avg2);
    			sum2=0;
    		}
    		System.out.println();
    		}
    }
    

    运行结果:
    在这里插入图片描述

    展开全文
  • C语言小程序-学生成绩统计系统

    万次阅读 多人点赞 2019-05-30 13:12:45
    C语言小程序-学生成绩统计系统 #刚入门的小白,写的一个C语言作业,参考了 另一位博主的代码(https://blog.csdn.net/qq_36503589/article/details/53106983) 但是我自信的认为我的代码更“好看”一点,见笑了,请...
  • MATLAB学生成绩查询系统

    千次阅读 2020-03-19 21:16:05
    学习学生成绩查询系统时, 1、我把fgetl函数中字母l写成了数字一,出错 2、 [str1 str2 str3 str4]=strread(str,’%s %s %s %s’,‘delimiter’,’ ');中, ’ '里面为空格,没有写出错 3、 chengji(counter-1,:,:)=...
  • C语言:学生成绩统计系统

    千次阅读 多人点赞 2016-11-09 22:40:21
    该程序可以输入学生成绩,计算平均成绩和及格率,以及查找学生成绩和修改学生成绩,输入所需功能对应的数字再按回车键即可,效果如下 : 看起来还不错吧,代码如下: #include void main() { int sel,i=0,x,...
  • 用数据库Access 2000 .Visual Basic 6.0制作一个类似学生成绩管理查询系统的程序,要求可以使用 有大神帮忙吗,求求!
  • 学生成绩统计系统 题目要求: 学期考试结束,统计有每班每个人的平均成绩,每门课的平均成绩,并按照个人平均成绩从高到低的顺序输出成绩, 输出不及格人名单。输入输出格式自定 假设某班有30人 考试课程自定 将所有...
  • **题目:**完成一个简易的学生成绩计算功能:从键盘输入N个学生的姓名,年龄,数学成绩,语文成绩四项信息,输入完N个学生信息后,计算各个学生的总成绩和平均成绩,计算完毕后输出每个学生的姓名、年龄、数学成绩、...
  • 基于区块链的学生课程成绩查询系统 【摘 要】传统成绩管理...系统有效解决学生成绩信息的真实性问题,为区块链在 教育领域的应用提供了思路。 【关键词】区块链 ;以太坊 ;成绩管理 【 Abstract】 The traditional ac
  • C++ 学生成绩管理系统

    万次阅读 多人点赞 2019-10-04 20:26:09
    用c++实现学生成绩管理系统,此系统可以提供成绩的录入,可以按学生成绩进行排名,求总分和平均分以及提供成绩查询功能等。 实现功能 提供成绩录入 统计每个学生的总分和平均分 按总分由大到小排出名次 提供成绩...
  • 学生成绩管理系统(C语言)

    万次阅读 多人点赞 2018-06-26 23:36:31
    一设计项目:学生成绩管理系统 二总体设计: 1程序设计组成框图: 学生成绩管理系统 输入学生成绩查看学生成绩及成绩 排序 通过学号查询学生成绩 统计成绩信息 通过学号修改学生成绩 添加学生成绩 通过学号...
  • python+mysql实现学生信息查询系统来源:中文源码网 浏览: 次 日期:2019年11月5日【下载文档: python+mysql实现学生信息查询系统.txt 】(友情提示:右键点上行txt文档名->目标另存为)python+mysql实现学生信息查询...
  • JAVA数组实现学生成绩统计

    千次阅读 2019-09-28 17:29:36
    数组实现学生成绩统计 二、项目描述 1.项目简介: 由用户输入学生人数与名字,并定义当前学期课程数与课程名,并分别录入每位学生每门课程成绩,系统显示输入每位学生每门课程成绩,并显示学生的总分与平均分。 2....
  • C语言进阶 (一)前言: 在学习c语言基础语法后我们需要通过...(二)题目要求:学生成绩统计系统实现 设计结构体数组,结构中包含学生数据为:学号、姓名、物理分数、数学分数、外语分数、计算机分数。 设...
  • 简单学生成绩查询系统 按成绩排序 按姓名排序

    千次阅读 多人点赞 2018-08-07 23:40:16
    把 按成绩排序,和按姓名排序,封装了两个函数。 (排序都是,冒泡算法) 运用了 结构体 和结构体数组的知识。 源代码: #include &lt;stdio.h&gt; #include &lt;string.h&gt; #define N 3 //N...
  • 学生成绩管理信息系统

    千次阅读 多人点赞 2017-09-10 00:23:03
    设计题目:学生成绩管理信息系统设计与实现。 软件功能分为服务器功能与客户端功能两部分。其中: 管理员通过系统管理界面进入,建立各种课程、班级,将课程、班级信息保存在数据库中并可以对课程、班级进行改动和...
  • java学生成绩管理系统

    万次阅读 多人点赞 2016-04-12 14:33:51
    *@name:java学生成绩管理系统. *@功能:学生相关信息,录入,查询统计,修改等.... *@PS:图形界面的学生管理系统不要求就不做了. */ import java.util.Scanner; import java.lang.*; import ja
  • C语言学生成绩管理系统

    万次阅读 多人点赞 2018-11-29 06:58:56
    C语言实现了学生成绩管理系统,可以对学生成绩进行录入、查询、修改、删除和排序。 #include &amp;amp;lt;stdio.h&amp;amp;gt; #include &amp;amp;lt;stdlib.h&amp;amp;gt; #include &amp;amp;...
  • java作业学生成绩管理系统

    万次阅读 多人点赞 2020-12-24 23:23:45
    应用面向对象的思想,设计实现一个课程成绩统计系统,实现如下功能: 1. 管理员登录,登录成功可以对成绩进行管理; 2. 显示成绩信息; 3.添加成绩信息; 4.修改成绩信息; 5.删除成绩信息; 6.查询成绩...
  • 期末课程设计—学生成绩查询系统

    千次阅读 2017-12-21 14:34:29
    *问题描述: 设计一个学生成绩查询系统 */ 采用了多文件组织 对此项目进行编写。 主函数代码如下: #include "huang.h" #include #include #include #include using namespace std; int ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,751
精华内容 11,100
关键字:

学生成绩查询统计系统