-
[图文详解]C语言实现学生成绩管理系统,采用链表结构
2021-01-14 14:34:12相信很多大一的同学在做c语言程序设计期末大作业的时候,都会被这些题目所困扰:学生成绩管理系统、学生信息管理系统、图书借阅管理系统、通讯录、选课系统......上网百度到别人的代码,有的人用C++写,有的人用类C...目录
一、前言(学习请从头开始看)
四、完整代码(搬运请看这)
一、前言
相信很多大一的同学在做c语言程序设计期末大作业的时候,都会被这些题目所困扰:学生成绩管理系统、学生信息管理系统、图书借阅管理系统、通讯录、选课系统......上网百度到别人的代码,有的人用C++写,有的人用类C写,有的人用C写,有的人用链表写,有的人用顺序表(结构体数组)写,搬运完别人的代码,还得自己看懂并且修改,以防和别的同学雷同。但不同的学校采用不同的c语言教材,不同的老师又有不同的理念:有的老师要求学生使用vb(Visual Basic)来进行编码,有的老师要求学生使用vs(Visual Studio)来进行编码......
vb的缺点是比较死板,规范陈旧,如变量申明必须在函数一开始的时候,否则会报错;vs体量大不说,要求用scanf_s来代替scanf,用fopen_s来代替fopen,并且scanf_s在接收字符串的时候用法和传统的scanf不一样,fopen_s的用法也和fopen稍有不同。个人认为如果不做大型项目,大学4年使用Dev-Cpp足以应付基础的C语言学习和C++学习,Dev-Cpp精巧强大,兼容性较好,不像vb和vs一样纠结于细枝末节,令初学者对C语言的学习望而生畏。一般的Dev-Cpp安装好后默认关闭了调试模式,需要手动打开,这里附上教程。
说完IDE,接下来说说语言:受严蔚敏《数据结构(C语言版)》的影响,很多人在学习数据结构的时候逐渐将C语言代码转变为了类C代码,因为默认使用.cpp文件,类C代码(其实就是C语言代码中混入了少量使代码能够更加简洁的C++的语法)在部分IDE中也能运行。本文所使用的也是类C,部分函数为方便采用了C++的引用符号&(C语言中&是取地址符号,C++中既可以用做取地址也可以用作引用),目的是和传统的数据结构教程相对应,有利于读者后续对数据结构的学习。
通过之前顺序表的学习,相信很多同学都对管理系统的代码结构有了一定的了解,本文用链式结构实现学生成绩管理系统,用到了一些数据结构的思想和理念。
这里简单介绍一些顺序表和链表的区别:顺序表中每个元素在内存中的分布是连续的,当删除中间的某个元素的时候,需要把其后面的所有元素向前移动,比如删除数组a中的第6个元素,那么原先的第7个元素需要移动到现在第6个的位置,原先的第8个元素需要移动到现在第7个的位置......最后再修改顺序表的长度即可;而链表中每个元素(链表中习惯称作节点)在内存中的分布是离散的,当删除中间的某个节点的时候,只需要把该节点的前一个节点和后一个节点进行链接,再释放该节点的空间。
首先定义一个数据结构,再申明操作该数据结构的基本函数,最后实现这些基本函数。
二、要求和思路
2.1 要求
对学生信息(学号、姓名、成绩)进行统一管理,实现增、删、改、查、显,且需要用到文件读写的知识对学生信息进行读取和保存。
2.2 数据结构的定义
数据结构的思想就是基于现有的数据结构(本文的数据结构是链表)和相关函数来实现需求。
链表中的每一个节点都有数据域和指针域,数据域用来存放该节点所存储的信息,指针域用来获取下一个节点在内存中的位置。如下是非常经典的链表节点的定义方式:
typedef struct LNode{//定义节点 ElemType data; //数据域 LNode *next; //指针域 }LNode, *LinkList;
typedef 可以理解为是一个取名字的符号,他将struct LNode这个结构体取了一个简单的代号叫LNode。通常我们定义一个结构体变量,需要这样写struct LNode p,当我们取完代号之后,可以直接写作LNode p。这里举一个一般的例子说明一下
#include<stdio.h> struct a{ int b; }; typedef struct a a; int main(){ a b; b.b = 2; printf("%d", b.b); }
这段代码首先声明结构体a,接着将结构体a取代号为a,即省略了struct。然后在主函数中直接使用a来声明一个结构体变量b,再对他进行赋值和输出。
这段代码和链表节点的定义方式的区别在于,节点的定义方式取代号和申明结构体同时进行,然后用代号在节点结构体中申明一个指针变量,可以说是一举三得。而这段代码就比较中规中矩,便于理解了。肯定有人要问*LinkList是怎么回事,*LinkList和他左边的LNode一样,也是代号,只不过这个代号的类型是指向LNode的指针。可以这样理解,*表示这个代号的类型是LNode类型的指针,LinkList表示这个代号的具体名字。为什么这里要申明一个LNode类型的指针呢?当然是为了编程方便。后面出现的LinkList其实都可以用LNode *来替换。
2.3 基本函数的申明
链表的基本函数有很多,但最最最基础的只有几个,初始化链表、销毁链表、增加节点、删除节点、查找节点、修改节点、打印节点。这里先罗列链表的基本函数:(本文省略了销毁链表)
void CreateList(LinkList &L); //创建链表 void NodeAppend(LinkList &L, ElemType e); //增加节点 int NodeDelete(LinkList &L, int num); //删除节点 int NodeModify(LinkList &L, int num, ElemType e);//修改节点 int NodeSearch(LinkList L, int num, ElemType &e);//查找节点
这里CreateList和NodeAppend的函数类型是void,意思是没有返回值,而其余三个函数的返回值是int,通过返回值来判断删除、修改、查找操作是否成功。当然,创建链表和增加节点的操作也可能不成功,即没有内存空间可以申请,遇到这种情况通常是直接用exit(1)来退出整个程序,但一般来说,这两个操作都是能正常运行的,所以我也就没写异常退出的情况了。
2.3.1 链表初始化
//创建链表(含头节点) void CreateList(LinkList &L){ L = (LinkList)malloc(sizeof(LNode)); L -> next = NULL; }
朴实无华的创建一个链表。
2.3.2 尾部增加节点
//尾部增加节点 void NodeAppend(LinkList &L, ElemType e){ LNode *q = (LinkList)malloc(sizeof(LNode)); q -> data = e; q -> next = NULL; LNode *p = L; while(p -> next) p = p -> next; p -> next = q; }
一般插入都采用的是头插法,即在链表头部插入,这里为了逻辑更清晰一些,采用了更费时的尾部插入法。首先函数传入的参数是L和e,L是链表,e是新增节点的数据域。要插入一个节点,首先需要申明一个节点空间用于存储e。这里LNode *q = (LinkList)malloc(sizeof(LNode))的作用是申明一个LNode类型的指针p,申明一段LNode大小的空间,并让p指向这段空间。当然也可以写作LNode *q = (LNode *)malloc(sizeof(LNode)),因为LNode * 和 LinkList是等价的。正常来说,q是一个指针,想要对q指向的空间进行赋值,应该使用解地址符*,考虑到q是指针类型,c\c++对结构体的指针类型的数据提供了一个更便捷的符号 ->,用以直接访问该指针指向的结构体的内部成员。当然你也可以使用*来实现,如q -> data = e可以改写为 (*q).data = e。
接着申明一个指针变量p指向链表的头部,通过while循环将p逐步更新,直到p -> next为空,此时p指向链表尾部的节点,用q来更新p -> next实现节点的尾部插入。
2.3.3 删除节点
//根据编号删除节点 int NodeDelete(LinkList &L, int num){ LNode *p,*q; p = L; while(p -> next){ q = p -> next; if(num == (q -> data).num){ p -> next = q -> next; free(q); return 0; } p = p -> next; } return 1; }
返回0表示删除成功,返回1表示未找到节点,删除失败。
2.3.4 修改节点
//根据编号修改节点 int NodeModify(LinkList &L, int num, ElemType e){ LNode *p,*q; p = L; while(p -> next){ q = p -> next; if(num == (q -> data).num){ q -> data = e; return 0; } p = p -> next; } return 1; }
返回0表示修改成功,返回1表示未找到节点,修改失败。
2.3.5 搜索节点
//根据编号搜索节点,若找到则将节点信息存储至e并返回 int NodeSearch(LinkList L, int num, ElemType &e){ LNode *p, *q; p = L; while(p -> next){ q = p -> next; if(num == (q -> data).num){ e = q -> data; return 0; } p = p -> next; } return 1; }
返回0表示查找成功,返回1表示未找到节点,查找失败。
三、具体构建
实现了基本的数据结构(数据结构和基本操作),现在只要在其基础上增加交互性就能实现成绩管理系统。
首先要定义学生信息结构体,并将其取代号为ElemType来和链表的数据域相统一。
//student结构体存储学生信息 typedef struct student{ int num;//学号 char name[10];//姓名 int score;//分数 }student; typedef student ElemType;
这里先将struct student取代号为student,再将student取代号为ElemType。当然也可以一步到位。
//student结构体存储学生信息 typedef struct student{ int num;//学号 char name[10];//姓名 int score;//分数 }ElemType;
这里再提供一种方法,请读者自行理解。
//student结构体存储学生信息 typedef struct{ int num;//学号 char name[10];//姓名 int score;//分数 }student; typedef student ElemType;
3.1 函数申明
void ReadFile(LinkList &L); //读取文件 void WriteFile(LinkList L); //写入文件 void AddStudent(LinkList &L); //增加学生 void DeleteStudent(LinkList &L); //删除学生 void ModifyStudent(LinkList &L); //修改学生 void SearchStudent(LinkList L); //查找学生 void DisplayStudent(LinkList L); //显示学生 void Menu(); //主菜单
3.2 读取文件
//读取文件中的数据到链表 void ReadFile(LinkList &L){ FILE *fp = NULL; fp = fopen("student.txt", "r"); if(fp == NULL){ printf("Can not open the file\n"); exit(1); } CreateList(L); ElemType temp; while(fscanf(fp, "%d %s %d", &temp.num, temp.name, &temp.score) != EOF){ NodeAppend(L, temp); } fclose(fp); }
3.3 写入文件
//将链表中的数据用覆盖的方式写入文件中 void WriteFile(LinkList L){ FILE *fp = NULL; fp = fopen("student.txt", "w"); if(fp == NULL){ printf("Can not open the file\n"); exit(1); } LNode *p = L; ElemType temp; while(p -> next){ temp = p -> next -> data; fprintf(fp, "%d %s %d\n", temp.num, temp.name, temp.score); p = p -> next; } fclose(fp); }
3.4 增加学生
//录入学生信息 void AddStudent(LinkList &L){ ElemType e; printf("请输入要录入的学生信息:\n"); printf("学号\t姓名\t分数\n"); scanf("%d %s %d", &e.num, e.name, &e.score); NodeAppend(L, e); system("pause"); }
3.5 删除学生
//删除学生信息 void DeleteStudent(LinkList &L){ int num; printf("请输入要删除的学生学号:"); scanf("%d", &num); if(NodeDelete(L,num) == 1) printf("未查找到该学生!\n"); else printf("删除成功!\n"); system("pause"); }
3.6 修改学生
//修改学生信息 void ModifyStudent(LinkList &L){ ElemType e; int num; printf("请输入要修改的学生的当前学号:"); scanf("%d", &num); printf("请输入修改后的信息:学号 姓名 分数\n"); scanf("%d %s %d", &e.num, e.name, &e.score); if(NodeModify(L, num, e) == 1) printf("未查找到该学生!\n"); else printf("修改成功!\n"); system("pause"); }
3.7 查找学生
//查找学生信息 void SearchStudent(LinkList L){ ElemType e; int num; printf("请输入要查找的学生学号:\n"); scanf("%d", &num); if(NodeSearch(L, num, e) == 1) printf("未查找到改该学生!\n"); else printf("学号\t姓名\t分数\n%d %s %d\n", e.num, e.name, e.score); system("pause"); }
3.8 显示学生
//显示学生信息 void DisplayStudent(LinkList L){ printf("学号\t姓名\t分数\n"); LNode *p = L; ElemType e; while(p -> next){ e = (p -> next) -> data; printf("%d %s %d\n", e.num, e.name, e.score); p = p -> next; } system("pause"); }
3.9 主菜单
//主菜单 void Menu(){ system("cls"); printf("------------------------------------------\n"); printf(" 学生管理系统 \n"); printf(" \n"); printf(" 作者微信:qczsbwjzjn \n"); printf(" \n"); printf(" 欢迎交流咨询~ \n"); printf(" \n"); printf(" 1.增加学生信息 2.删除学生信息 \n"); printf(" \n"); printf(" 3.修改学生信息 4.查找学生信息 \n"); printf(" \n"); printf(" 5.显示所有信息 0.退出管理系统 \n"); printf(" \n"); printf("------------------------------------------\n"); printf(" \n"); printf(" 请输入:"); }
3.10 主函数
//主函数 int main(){ LinkList L; CreateList(L); ReadFile(L); int choice = 1; while(choice){ Menu(); scanf("%d", &choice); switch(choice){ case 1: AddStudent(L); break; case 2: DeleteStudent(L); break; case 3: ModifyStudent(L); break; case 4: SearchStudent(L); break; case 5: DisplayStudent(L); break; case 0: WriteFile(L); break; } } return 0; }
四、完整代码
#include<stdio.h> #include <stdlib.h> //student结构体存储学生信息 typedef struct student{ int num;//学号 char name[10];//姓名 int score;//分数 }ElemType; typedef struct LNode{//定义节点 ElemType data; //数据域 LNode *next; //指针域 }LNode, *LinkList; void CreateList(LinkList &L); //创建链表 void NodeAppend(LinkList &L, ElemType e); //增加节点 int NodeDelete(LinkList &L, int num); //删除节点 int NodeModify(LinkList &L, int num, ElemType e);//修改节点 int NodeSearch(LinkList L, int num, ElemType &e);//查找节点 void ReadFile(LinkList &L); //读取文件 void WriteFile(LinkList L); //写入文件 void AddStudent(LinkList &L); //增加学生 void DeleteStudent(LinkList &L); //删除学生 void ModifyStudent(LinkList &L); //修改学生 void SearchStudent(LinkList L); //查找学生 void DisplayStudent(LinkList L); //显示学生 void Menu(); //主菜单 //创建链表(含头节点) void CreateList(LinkList &L){ L = (LinkList)malloc(sizeof(LNode)); L -> next = NULL; } //尾部增加节点 void NodeAppend(LinkList &L, ElemType e){ LNode *q = (LinkList)malloc(sizeof(LNode)); q -> data = e; q -> next = NULL; LNode *p = L; while(p -> next) p = p -> next; p -> next = q; } //根据编号删除节点 int NodeDelete(LinkList &L, int num){ LNode *p,*q; p = L; while(p -> next){ q = p -> next; if(num == (q -> data).num){ p -> next = q -> next; free(q); return 0; } p = p -> next; } return 1; } //根据编号修改节点 int NodeModify(LinkList &L, int num, ElemType e){ LNode *p,*q; p = L; while(p -> next){ q = p -> next; if(num == (q -> data).num){ q -> data = e; return 0; } p = p -> next; } return 1; } //根据编号搜索节点,若找到则将节点信息存储至e并返回 int NodeSearch(LinkList L, int num, ElemType &e){ LNode *p, *q; p = L; while(p -> next){ q = p -> next; if(num == (q -> data).num){ e = q -> data; return 0; } p = p -> next; } return 1; } //读取文件中的数据到链表 void ReadFile(LinkList &L){ FILE *fp = NULL; fp = fopen("student.txt", "r"); if(fp == NULL){ printf("Can not open the file\n"); exit(1); } CreateList(L); ElemType temp; while(fscanf(fp, "%d %s %d", &temp.num, temp.name, &temp.score) != EOF){ NodeAppend(L, temp); } fclose(fp); } //将链表中的数据用覆盖的方式写入文件中 void WriteFile(LinkList L){ FILE *fp = NULL; fp = fopen("student.txt", "w"); if(fp == NULL){ printf("Can not open the file\n"); exit(1); } LNode *p = L; ElemType temp; while(p -> next){ temp = p -> next -> data; fprintf(fp, "%d %s %d\n", temp.num, temp.name, temp.score); p = p -> next; } fclose(fp); } //录入学生信息 void AddStudent(LinkList &L){ ElemType e; printf("请输入要录入的学生信息:\n"); printf("学号\t姓名\t分数\n"); scanf("%d %s %d", &e.num, e.name, &e.score); NodeAppend(L, e); system("pause"); } //删除学生信息 void DeleteStudent(LinkList &L){ int num; printf("请输入要删除的学生学号:"); scanf("%d", &num); if(NodeDelete(L,num) == 1) printf("未查找到该学生!\n"); else printf("删除成功!\n"); system("pause"); } //修改学生信息 void ModifyStudent(LinkList &L){ ElemType e; int num; printf("请输入要修改的学生的当前学号:"); scanf("%d", &num); printf("请输入修改后的信息:学号 姓名 分数\n"); scanf("%d %s %d", &e.num, e.name, &e.score); if(NodeModify(L, num, e) == 1) printf("未查找到该学生!\n"); else printf("修改成功!\n"); system("pause"); } //查找学生信息 void SearchStudent(LinkList L){ ElemType e; int num; printf("请输入要查找的学生学号:\n"); scanf("%d", &num); if(NodeSearch(L, num, e) == 1) printf("未查找到改该学生!\n"); else printf("学号\t姓名\t分数\n%d %s %d\n", e.num, e.name, e.score); system("pause"); } //显示学生信息 void DisplayStudent(LinkList L){ printf("学号\t姓名\t分数\n"); LNode *p = L; ElemType e; while(p -> next){ e = (p -> next) -> data; printf("%d %s %d\n", e.num, e.name, e.score); p = p -> next; } system("pause"); } //主菜单 void Menu(){ system("cls"); printf("------------------------------------------\n"); printf(" 学生管理系统 \n"); printf(" \n"); printf(" 作者微信:qczsbwjzjn \n"); printf(" \n"); printf(" 欢迎交流咨询~ \n"); printf(" \n"); printf(" 1.增加学生信息 2.删除学生信息 \n"); printf(" \n"); printf(" 3.修改学生信息 4.查找学生信息 \n"); printf(" \n"); printf(" 5.显示所有信息 0.退出管理系统 \n"); printf(" \n"); printf("------------------------------------------\n"); printf(" \n"); printf(" 请输入:"); } //主函数 int main(){ LinkList L; CreateList(L); ReadFile(L); int choice = 1; while(choice){ Menu(); scanf("%d", &choice); switch(choice){ case 1: AddStudent(L); break; case 2: DeleteStudent(L); break; case 3: ModifyStudent(L); break; case 4: SearchStudent(L); break; case 5: DisplayStudent(L); break; case 0: WriteFile(L); break; } } return 0; }
五、界面展示
5.1 显示信息
5.2 删除学生
5.3 修改学生
下面附上下载链接(含测试文件)
作者微信:qczsbwjzjn 欢迎交流咨询
-
求一个基于UI的学生成绩管理系统
2008-12-09 00:13:39求一个基于UI的学生成绩管理系统 java源代码 老师 今天布置了一个综合性实验 要求用图形界面来实现 一个简单的学生成绩管理系统 但我们异常都没学 而且文件类 也没学 还有两个星期就交 ...求一个基于UI的学生成绩管理系统 java源代码
老师 今天布置了一个综合性实验 要求用图形界面来实现 一个简单的学生成绩管理系统
但我们异常都没学 而且文件类 也没学 还有两个星期就交 -
学生信息成绩管理系统采用Python + qt5 来实现
2021-02-10 13:39:28学生信息成绩管理系统采用Python + qt5 来实现 由于项目文件比较多所以我分了好几个包来完成这个项目如下图: 然后就是一些要安装的组件 其实就是数据库组件pymysql,和qt5相关的组件。其项目就是基于对数据库的...学生信息成绩管理系统采用Python + qt5 来实现
快速获得整个项目的入口:https://download.csdn.net/download/nanxiang11/15179227
就可以获取整个项目资源由于项目文件比较多所以我分了好几个包来完成这个项目如下图:
然后就是一些要安装的组件
其实就是数据库组件pymysql,和qt5相关的组件。其项目就是基于对数据库的操作和对于qt5 的应用。接下来我们就进入正题!
首先是连接数据库,我们创建了一个文件夹叫service的文件夹里面就放了一个文件,名称叫service.py该文件就是对于数据库的连接,查找,和修改一类的操作详细代码如下# -*- coding: utf-8 -*- import pymysql # 导入操作MySQL数据库的模块 userName="" # 记录用户名 # 打开数据库连接 def open(): db = pymysql.connect(host="localhost", user="root", password="196811", database="db_student", charset="utf8") return db # 返回连接对象 # 执行数据库的增、删、改操作 def exec(sql,values): db=open() # 连接数据库 cursor = db.cursor() # 使用cursor()方法获取操作游标 try: cursor.execute(sql,values) # 执行增删改的SQL语句 db.commit() # 提交数据 return 1 # 执行成功 except: db.rollback() # 发生错误时回滚 return 0 # 执行失败 finally: cursor.close() # 关闭游标 db.close() # 关闭数据库连接 # 带参数的精确查询 def query(sql,*keys): db=open() # 连接数据库 cursor = db.cursor() # 使用cursor()方法获取操作游标 cursor.execute(sql,keys) # 执行查询SQL语句 result = cursor.fetchall() # 记录查询结果 cursor.close() # 关闭游标 db.close() # 关闭数据库连接 return result # 返回查询结果 # 不带参数的模糊查询 def query2(sql): db=open() # 连接数据库 cursor = db.cursor() # 使用cursor()方法获取操作游标 cursor.execute(sql) # 执行查询SQL语句 result = cursor.fetchall() # 记录查询结果 cursor.close() # 关闭游标 db.close() # 关闭数据库连接 return result # 返回查询结果
关于怎么操作请详细看关于pymysql的相关资料,文章中也有详细说明各个函数的用途。
接下来就是关于登入页面的实现和注册界面的实现了
我是直接有个login.py 和post.py两个来实现登入和注册功能
login.py详细代码如下# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'login.ui' # # Created by: PyQt5 UI code generator 5.15.2 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QMessageBox, QMainWindow import sys # 导入sys模块 import img_rc from service import service import main import post class Ui_MainWindow(QMainWindow): # 构造方法 def __init__(self): super(Ui_MainWindow, self).__init__() self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮 self.setupUi(self) # 初始化窗体设置 def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮 MainWindow.resize(467, 294) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(1, 0, 461, 151)) self.label.setStyleSheet("border-image: url(:/png/img/login.png);") self.label.setText("") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(40, 160, 61, 16)) self.label_2.setObjectName("label_2") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(100, 160, 141, 21)) self.lineEdit.setObjectName("lineEdit") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(40, 200, 61, 16)) self.label_3.setObjectName("label_3") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setGeometry(QtCore.QRect(100, 200, 141, 21)) self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password) self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999)) # 输入密码后按回车键执行登录操作 self.lineEdit_2.editingFinished.connect(self.openlog) self.lineEdit_2.setObjectName("lineEdit_2") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(300, 160, 93, 28)) # 单击“登录”按钮执行登录操作 self.pushButton.clicked.connect(self.openlog) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(300, 200, 93, 28)) self.pushButton_2.clicked.connect(MainWindow.close) # 关闭登录窗体 self.pushButton_2.setObjectName("pushButton_2") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(300, 242, 93, 28)) self.pushButton_3.clicked.connect(self.zc) # 注册 self.pushButton_3.setObjectName("pushButton_3") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 467, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "登入界面")) self.label_2.setText(_translate("MainWindow", "用户名:")) self.label_3.setText(_translate("MainWindow", "密 码:")) self.pushButton.setText(_translate("MainWindow", "登入")) self.pushButton_2.setText(_translate("MainWindow", "退出")) self.pushButton_3.setText(_translate("MainWindow", "注册")) def openlog(self): service.userName = self.lineEdit.text() # 全局变量,记录用户名 self.userPwd = self.lineEdit_2.text() # 记录用户密码 if service.userName != "" and self.userPwd != "": # 判断用户名和密码不为空 # 根据用户名和密码查询数据 result = service.query("select * from login where name = %s and password = %s", service.userName, self.userPwd) if len(result) > 0: # 如果查询结果大于0,说明存在该用户,可以登录 self.w = main.Ui_MainWindow() # 创建主窗体对象 self.w.show() # 显示主窗体 MainWindow.hide() # 隐藏当前的登录窗体 else: self.lineEdit.setText("") # 清空用户名文本 self.lineEdit_2.setText("") # 清空密码文本框 QMessageBox.warning(None, '警告', '请输入正确的用户名和密码!', QMessageBox.Ok) else: QMessageBox.warning(None, '警告', '请输入用户名和密码!', QMessageBox.Ok) def zc(self): self.m = post.Ui_MainWindow() self.m.show() MainWindow.hide() # 隐藏当前的登录窗体 if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() # 创建窗体对象 ui = Ui_MainWindow() # 创建PyQt5设计的窗体对象 ui.setupUi(MainWindow) # 调用PyQt5窗体的方法对窗体对象进行初始化设置 MainWindow.show() # 显示窗体 sys.exit(app.exec_()) # 程序关闭时退出进程
post.py详细代码如下
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'post.ui' # # Created by: PyQt5 UI code generator 5.15.2 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. import time import img_rc from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets from service import service import login class Ui_MainWindow(QMainWindow): # 构造方法 def __init__(self): super(Ui_MainWindow, self).__init__() self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮 self.setupUi(self) # 初始化窗体设置 def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(423, 485) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(110, 40, 61, 31)) self.label.setObjectName("label") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(170, 40, 113, 21)) self.lineEdit.setObjectName("lineEdit") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(110, 100, 61, 31)) self.label_2.setObjectName("label_2") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setGeometry(QtCore.QRect(170, 100, 113, 21)) self.lineEdit_2.setObjectName("lineEdit_2") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(110, 160, 61, 31)) self.label_3.setObjectName("label_3") self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_3.setGeometry(QtCore.QRect(170, 160, 113, 21)) self.lineEdit_3.setObjectName("lineEdit_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(110, 220, 61, 31)) self.label_4.setObjectName("label_4") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(110, 280, 61, 31)) self.label_5.setObjectName("label_5") self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_4.setGeometry(QtCore.QRect(170, 220, 113, 21)) self.lineEdit_4.setObjectName("lineEdit_4") self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_5.setGeometry(QtCore.QRect(170, 280, 113, 21)) self.lineEdit_5.setObjectName("lineEdit_5") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(60, 360, 93, 31)) self.pushButton.clicked.connect(self.judge) # 注册 self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(280, 360, 93, 31)) self.pushButton_2.clicked.connect(MainWindow.close) # 关闭登录窗体 self.pushButton_2.setObjectName("pushButton_2") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(170, 360, 93, 31)) self.pushButton_3.clicked.connect(self.dl) # 登入 self.pushButton_3.setObjectName("pushButton_3") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 423, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "注册界面")) self.label.setText(_translate("MainWindow", "用户名:")) self.label_2.setText(_translate("MainWindow", "密 码:")) self.label_3.setText(_translate("MainWindow", "性 别:")) self.label_4.setText(_translate("MainWindow", "电 话:")) self.label_5.setText(_translate("MainWindow", "住 址:")) self.pushButton.setText(_translate("MainWindow", "注 册")) self.pushButton_2.setText(_translate("MainWindow", "关 闭")) self.pushButton_3.setText(_translate("MainWindow", "登 入")) def dl(self): #打开登入窗口 self.m = login.Ui_MainWindow() self.m.show() def getnNP(self, name, password): # 获取数据库里面是否存在该用户 result = service.query("select * from login where name = %s and password = %s", name, password) return len(result) def judge(self): postname = self.lineEdit.text() # 记录名字 postpassword = self.lineEdit_2.text() # 记录密码 postsex = self.lineEdit_3.text() # 记录性别 posttel = self.lineEdit_4.text() # 记录电话 postaddress = self.lineEdit_5.text() # 记录密码 if postname != "" and postpassword != "": if self.getnNP(postname, postpassword) > 0: self.lineEdit.setText("") self.lineEdit_2.setText("") QMessageBox.information(None, '提醒', '已经有该账户信息,请换过一个用户名', QMessageBox.Ok) else: result = service.exec("insert into login(name, password, sex, telephone, address) value (%s, %s, %s, %s, %s)" , (postname, postpassword, postsex, posttel, postaddress)) time.sleep(1.0) # 线程等待1秒钟 if result > 0: QMessageBox.information(None, '提醒', '注册成功!', QMessageBox.Ok) else: QMessageBox.warning(None, '警告', '必须在用户名和密码中填入数据', QMessageBox.Ok)
然后就是一个主页面窗口
main.py# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'main.ui' # # Created by: PyQt5 UI code generator 5.15.2 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. import sys import img_rc from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets from baseinfo import student, result from query import stuquery, resquery from service import service from setting import grade, classes, subject, exam class Ui_MainWindow(QMainWindow): # 构造方法 def __init__(self): super(Ui_MainWindow, self).__init__() self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮 self.setupUi(self) # 初始化窗体设置 def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setStyleSheet("border-image: url(:/png/img/2.png);") self.centralwidget.setObjectName("centralwidget") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26)) self.menubar.setObjectName("menubar") self.menu = QtWidgets.QMenu(self.menubar) self.menu.setObjectName("menu") self.menu_2 = QtWidgets.QMenu(self.menubar) self.menu_2.setObjectName("menu_2") self.menu_3 = QtWidgets.QMenu(self.menubar) self.menu_3.setObjectName("menu_3") self.menu_4 = QtWidgets.QMenu(self.menubar) self.menu_4.setObjectName("menu_4") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.action = QtWidgets.QAction(MainWindow) self.action.setObjectName("action") self.action_2 = QtWidgets.QAction(MainWindow) self.action_2.setObjectName("action_2") self.action_3 = QtWidgets.QAction(MainWindow) self.action_3.setObjectName("action_3") self.action_4 = QtWidgets.QAction(MainWindow) self.action_4.setObjectName("action_4") self.actionstudent = QtWidgets.QAction(MainWindow) self.actionstudent.setObjectName("actionstudent") self.actionresult = QtWidgets.QAction(MainWindow) self.actionresult.setObjectName("actionresult") self.actionstudentquery = QtWidgets.QAction(MainWindow) self.actionstudentquery.setObjectName("actionstudentquery") self.actionresultquery = QtWidgets.QAction(MainWindow) self.actionresultquery.setObjectName("actionresultquery") self.menu.addAction(self.action) self.menu.addAction(self.action_2) self.menu_2.addAction(self.actionstudent) self.menu_2.addAction(self.actionresult) self.menu_3.addAction(self.actionstudentquery) self.menu_3.addAction(self.actionresultquery) self.menu.addAction(self.action_3) self.menu.addAction(self.action_4) self.menubar.addAction(self.menu.menuAction()) self.menubar.addAction(self.menu_2.menuAction()) self.menubar.addAction(self.menu_3.menuAction()) self.menubar.addAction(self.menu_4.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) gettime = QtCore.QDateTime.currentDateTime() time = gettime.toString("yyyy-MM-dd HH:mm:ss") self.statusbar.showMessage("当前登入的用户为:" + service.userName + "|登入时间为:" + time + "|星梦工作室|负责人:刘文豪") # 为基础设置菜单中的QAction绑定triggered信号 self.menu.triggered[QtWidgets.QAction].connect(self.openmenu) self.menu_2.triggered[QtWidgets.QAction].connect(self.openBase) self.menu_3.triggered[QtWidgets.QAction].connect(self.openQuery) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "主界面")) self.menu.setTitle(_translate("MainWindow", "基础设置")) self.menu_2.setTitle(_translate("MainWindow", "基本信息管理")) self.menu_3.setTitle(_translate("MainWindow", "系统查询")) self.menu_4.setTitle(_translate("MainWindow", "系统管理")) self.action.setText(_translate("MainWindow", "年级设置")) self.action_2.setText(_translate("MainWindow", "班级设置")) self.action_3.setText(_translate("MainWindow", "考试科目设置")) self.action_4.setText(_translate("MainWindow", "考试类别")) self.actionstudent.setText(_translate("MainWindow", "学生管理")) self.actionresult.setText(_translate("MainWindow", "成绩管理")) self.actionstudentquery.setText(_translate("MainWindow", "学生信息查询")) self.actionresultquery.setText(_translate("MainWindow", "学生成绩查询")) def openmenu(self, m): if m.text()=="年级设置": self.m = grade.Ui_MainWindow() # 创建年级设置窗体对象 self.m.show() # 显示窗体 elif m.text()=="班级设置": self.m = classes.Ui_MainWindow() self.m.show() elif m.text()=="考试科目设置": self.m = subject.Ui_MainWindow() self.m.show() elif m.text()=="考试类别": self.m = exam.Ui_MainWindow() self.m.show() # 基本信息管理菜单对应槽函数 def openBase(self, m): if m.text() == "学生管理": self.m = student.Ui_MainWindow() # 创建学生管理窗体对象 self.m.show() # 显示窗体 elif m.text() == "成绩管理": self.m = result.Ui_MainWindow() self.m.show() # 系统查询菜单对应槽函数 def openQuery(self,m): if m.text()=="学生信息查询": self.m = resquery.Ui_MainWindow() # 创建学生信息查询窗体对象 self.m.show() # 显示窗体 elif m.text()=="学生成绩查询": self.m = stuquery.Ui_MainWindow() # 创建学生成绩查询窗体对象 self.m.show() # 显示窗体
文章中代码也有尽可能的详细下面是各个界面运行的图片
上面的代码就是可以实现这些界面的功能。
另外还有其他界面的代码就不一一展示了由于实在是行数比较多我个人比较懒实在是难以一一写出来我这里展示一下数据库和一些运行截图
代码就不展示了哈,谅解谅解需要的可以去下载下面的是数据库结构
-
一个学生成绩管理系统的设计与实现:2
2011-03-16 19:12:00原型软件的文件结构如下图所示:SGSS.cpp的源代码如下:// SGSS.cpp : 定义应用程序的类行为。//#include "stdafx.h"#include "SGSS.h"#include "SGSSDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// ...原型软件的文件结构如下图所示:
SGSS.cpp的源代码如下:
// SGSS.cpp : 定义应用程序的类行为。
//
#include "stdafx.h"
#include "SGSS.h"
#include "SGSSDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CSGSSApp
BEGIN_MESSAGE_MAP(CSGSSApp, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
// CSGSSApp 构造
CSGSSApp::CSGSSApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
mceinline;">
// 唯一的一个 CSGSSApp 对象
CSGSSApp theApp;
// CSGSSApp 初始化
BOOL CSGSSApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControls()。否则,将无法创建窗口。
InitCommonControls();
CWinApp::InitInstance();
AfxEnableControlContainer();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CSGSSDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用“确定”来关闭
//对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
//对话框的代码
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
SGSSDlg.cpp源代码如下:
// SGSSDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "SGSS.h"
#include "SGSSDlg.h"
#include "./sgssdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CSGSSDlg 对话框
CSGSSDlg::CSGSSDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSGSSDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSGSSDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSGSSDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON8, OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
END_MESSAGE_MAP()
// CSGSSDlg 消息处理程序
BOOL CSGSSDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将/“关于.../”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
ShowWindow(SW_NORMAL);
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CSGSSDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CSGSSDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CSGSSDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CSGSSDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
void CSGSSDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码
createTable("", "");
}
void CSGSSDlg::createTable(CString sql, CString name)
{
CString filename, sExcelFile;
CString sPath;
CString workDir;
if ( "" == name )
{
CFileDialog fileDlg(FALSE, "xls", filename, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, "*.xls");
if (fileDlg.DoModal() == IDOK)
{
sExcelFile = fileDlg.GetPathName();
CFileFind finder;
BOOL bWorking = finder.FindFile(sExcelFile);
if (bWorking)
{
CFile::Remove(sExcelFile);
}
}
else
{
return;
}
}
else
{
sExcelFile = name;
}
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";
CString sSql;
TRY
{
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s",sDriver, sExcelFile, sExcelFile);
if (database.OpenEx(sSql, CDatabase::noOdbcDialog))
{
//sSql = "CREATE TABLE 成绩(序号 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,理综 float,政治 float,文综 float,平均 float,总分 float)";
if (sql == "")
{
sSql = "CREATE TABLE 成绩(序号 int,组别 int,组层 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,政治 float,理综 float,文综 float)";
}
else
{
sSql = sql;
}
//sSql = "CREATE TABLE 成绩(序号 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,理综 float,政治 float,文综 float,平均 float,总分 float)";
database.ExecuteSQL(sSql);
}
database.Close();
if ("" == name)
{
AfxMessageBox("表格创建成功。");
}
}
CATCH_ALL(e)
{
TRACE1("EXCEL驱动没有安装:%S",sDriver);
}
END_CATCH_ALL;
return;
}
void CSGSSDlg::OnBnClickedButton8()
{
CDBVariant iID, iClassID, iGrade, iGroupID, iGroupLevelID, sName;
CDBVariant fChinese, fMath, fEnglish, fHistory, fGeography, fPolicitics, fPhysics, fChymistry, fBiology, fArts, fScience;
CDatabase database;
CDatabase database2;
CString sPath;
GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH), MAX_PATH);
sPath.ReleaseBuffer();
int nPos = -1;
nPos = sPath.ReverseFind('//');
sPath = sPath.Left(nPos);
CString sSourceFile = sPath + "//data//source//chengji.xls";
CString sResultFile = sPath + "//data//source//sourcedata.xls";
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";
CString sDsn;
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver, sSourceFile);
CString sDsn2;
sDsn2.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;DBQ=%s",sDriver,sResultFile);
TRY
{
database.Open(NULL, false, false, sDsn);
database2.Open(NULL, false, false, sDsn2 );
CRecordset recordSet(&database);
CString sSql = "SELECT * FROM 成绩 ORDER BY 班级 ASC, 序号 ASC";
recordSet.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
while (!recordSet.IsEOF())
{
recordSet.GetFieldValue("序号",iID);
recordSet.GetFieldValue("姓名", sName);
recordSet.GetFieldValue("班级", iClassID);
recordSet.GetFieldValue("语文", fChinese);
recordSet.GetFieldValue("代数", fMath);
recordSet.GetFieldValue("外语", fEnglish);
recordSet.GetFieldValue("物理", fPhysics);
recordSet.GetFieldValue("化学", fChymistry);
recordSet.GetFieldValue("生物", fBiology);
recordSet.GetFieldValue("历史", fHistory);
recordSet.GetFieldValue("地理", fGeography);
recordSet.GetFieldValue("理综", fArts);
recordSet.GetFieldValue("文综", fScience);
CString destName;
destName.Format("%s",sName.m_pstring->GetBuffer(sName.m_pstring->GetLength()));
CString sInsertSql;
sInsertSql.Format("INSERT INTO 成绩(序号,姓名,班级,语文,代数,外语,物理,化学,生物,历史,地理,政治,理综,文综) VALUES('%d','%s','%d','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f')",
(int)iID.m_dblVal, destName,(int)iClassID.m_dblVal,(float)fChinese.m_dblVal,(float)fMath.m_dblVal,
(float)fEnglish.m_dblVal,(float)fPhysics.m_dblVal,(float)fChymistry.m_dblVal,(float)fBiology.m_dblVal,
(float)fHistory.m_dblVal,(float)fGeography.m_dblVal,(float)fArts.m_dblVal,(float)fScience.m_dblVal);
database2.ExecuteSQL(sInsertSql);
recordSet.MoveNext();
}
database.Close();
database2.Close();
AfxMessageBox("导入数据成功。");
}
CATCH_ALL(e)
{
TRACE0("数据库出错了。");
}
END_CATCH_ALL;
}
void CSGSSDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
CWnd * TextCtrl = NULL;
CString filename, sExcelFile;
CString sPath;
CFileDialog fileDlg(TRUE, NULL, NULL, NULL, NULL);
if (fileDlg.DoModal() == IDOK)
{
sExcelFile = fileDlg.GetPathName();
TextCtrl = GetDlgItem(IDC_EDIT1);
TextCtrl->SetWindowText(sExcelFile);
}
else
{
return;
}
}
void CSGSSDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
CString fileName;
CWnd * TextCtrl = NULL;
int MaxLen = 255;
TextCtrl = GetDlgItem(IDC_EDIT1);
TextCtrl->GetWindowText(fileName.GetBuffer(MaxLen),MaxLen);
ShellExecute(NULL,"open",fileName,NULL,NULL,SW_SHOWNORMAL);
return;
}
void CSGSSDlg::OnBnClickedButton1()
{
statisticsEachClassCourse();// TODO: 在此添加控件通知处理程序代码
}
//统计各班级学科成绩表
void CSGSSDlg::statisticsEachClassCourse()
{
int MaxLen = 255;
CString workDir;
CWnd * textCtrl;
CString sourceData;
CString destData;
char resultFilePath[200];
GetModuleFileName(NULL,resultFilePath,200);
workDir = resultFilePath;
int pos = workDir.ReverseFind('//');
workDir = workDir.Left(pos);
workDir = workDir +"//data//work//";
destData = workDir +"allClassTable.xls";
CString allClassTableString = "CREATE TABLE 年级学科成绩表(序号 int,组别 int,组层 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,政治 float,理综 float,文综 float, 总分 float, 平均 float, T平均 float, 班级名次 int, 年级名次 int)";
createTable(allClassTableString, destData);
textCtrl = GetDlgItem(IDC_EDIT1);
textCtrl->GetWindowText(sourceData.GetBuffer(MaxLen),MaxLen);
staticSumAverageTAverage(sourceData, destData);
/* staticGradeOrder();
staticClassOrder();
generateViewReport();
generatePrintReport();
*/
}
void CSGSSDlg::staticSumAverageTAverage(CString source, CString dest)
{
int courseCount = 5;
CDBVariant iID, iClassID, iGrade, iGroupID, iGroupLevelID, sName;
CDBVariant fChinese, fMath, fEnglish, fHistory, fGeography, fPolicitics, fPhysics, fChymistry, fBiology, fArts, fScience;
CDatabase database;
CDatabase database2;
CString sSourceFile = source;
CString sResultFile = dest;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";
CString sDsn;
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver, sSourceFile);
CString sDsn2;
sDsn2.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;DBQ=%s",sDriver,sResultFile);
TRY
{
database.Open(NULL, false, false, sDsn);
database2.Open(NULL, false, false, sDsn2 );
CRecordset recordSet(&database);
CString sSql = "SELECT * FROM 成绩 ORDER BY 班级 ASC, 序号 ASC";
recordSet.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
while (!recordSet.IsEOF())
{
recordSet.GetFieldValue("序号",iID);
recordSet.GetFieldValue("姓名", sName);
recordSet.GetFieldValue("班级", iClassID);
recordSet.GetFieldValue("语文", fChinese);
recordSet.GetFieldValue("代数", fMath);
recordSet.GetFieldValue("外语", fEnglish);
recordSet.GetFieldValue("物理", fPhysics);
recordSet.GetFieldValue("化学", fChymistry);
recordSet.GetFieldValue("生物", fBiology);
recordSet.GetFieldValue("历史", fHistory);
recordSet.GetFieldValue("地理", fGeography);
recordSet.GetFieldValue("理综", fArts);
recordSet.GetFieldValue("文综", fScience);
float fSum = fChinese.m_dblVal + fMath.m_dblVal + fEnglish.m_dblVal
+ fPhysics.m_dblVal + fPhysics.m_dblVal;
float fAverage = fSum / courseCount;
float fTAverage = 500;
CString destName;
destName.Format("%s",sName.m_pstring->GetBuffer(sName.m_pstring->GetLength()));
CString sInsertSql;
sInsertSql.Format("INSERT INTO 年级学科成绩表(序号,姓名,班级,语文,代数,外语,物理,化学,生物,历史,地理,政治,理综,文综,总分,平均,T平均) VALUES('%d','%s','%d','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f')",
(int)iID.m_dblVal, destName,(int)iClassID.m_dblVal,(float)fChinese.m_dblVal,(float)fMath.m_dblVal,
(float)fEnglish.m_dblVal,(float)fPhysics.m_dblVal,(float)fChymistry.m_dblVal,(float)fBiology.m_dblVal,
(float)fHistory.m_dblVal,(float)fGeography.m_dblVal,(float)fArts.m_dblVal,(float)fScience.m_dblVal,fSum,fAverage,fTAverage);
database2.ExecuteSQL(sInsertSql);
recordSet.MoveNext();
}
database.Close();
database2.Close();
AfxMessageBox("导入数据成功。");
}
CATCH_ALL(e)
{
TRACE0("数据库出错了。");
}
END_CATCH_ALL;
return;
}
stdafx.cpp源代码如下:
// stdafx.cpp : 只包括标准包含文件的源文件
// SGSS.pch 将是预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"
resource.h源代码如下:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by SGSS.rc
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_SGSS_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_EDIT1 1000
#define IDC_BUTTON1 1001
#define IDC_EDIT2 1002
#define IDC_BUTTON2 1003
#define IDC_EDIT3 1004
#define IDC_BUTTON3 1005
#define IDC_BUTTON4 1006
#define IDC_EDIT5 1007
#define IDC_EDIT6 1008
#define IDC_BUTTON5 1009
#define IDC_BUTTON6 1010
#define IDC_BUTTON7 1011
#define IDC_BUTTON8 1012
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1013
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
SGSS.h源代码如下:// SGSS.h : PROJECT_NAME 应用程序的主头文件//#pragma once#ifndef __AFXWIN_H__#error 在包含用于 PCH 的此文件之前包含“stdafx.h”#endif#include "resource.h" // 主符号// CSGSSApp:// 有关此类的实现,请参阅 SGSS.cpp//class CSGSSApp : public CWinApp{public:CSGSSApp();// 重写public:virtual BOOL InitInstance();// 实现DECLARE_MESSAGE_MAP()};extern CSGSSApp theApp;SGSSDlg.h源代码如下:// SGSSDlg.h : 头文件//#pragma once// CSGSSDlg 对话框class CSGSSDlg : public CDialog{// 构造public:CSGSSDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据enum { IDD = IDD_SGSS_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msg void OnBnClickedOk();afx_msg void OnBnClickedButton7();//creat tablevoid createTable(CString sql, CString name);//load file//static filevoid statisticsEachClassCourse();void staticSumAverageTAverage(CString source, CString dest);//preview file//print fileafx_msg void OnBnClickedButton8();afx_msg void OnBnClickedButton5();afx_msg void OnBnClickedButton6();afx_msg void OnBnClickedButton1();};stdafx.h源代码如下:// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 项目特定的包含文件#pragma once#ifndef VC_EXTRALEAN#define VC_EXTRALEAN // 从 Windows 标头中排除不常使用的资料#endif// 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。// 有关不同平台的相应值的最新信息,请参考 MSDN。#ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。#define WINVER 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。#endif#ifndef _WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。#define _WIN32_WINNT 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。#endif#ifndef _WIN32_WINDOWS // 允许使用 Windows 98 或更高版本的特定功能。#define _WIN32_WINDOWS 0x0410 //为 Windows Me 及更新版本改变为适当的值。#endif#ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。#define _WIN32_IE 0x0400 //为 IE 5.0 及更新版本改变为适当的值。#endif#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的// 关闭 MFC 对某些常见但经常被安全忽略的警告消息的隐藏#define _AFX_ALL_WARNINGS#include <afxwin.h> // MFC 核心和标准组件#include <afxext.h> // MFC 扩展#include <afxdisp.h> // MFC 自动化类#include <afxdtctl.h> // Internet Explorer 4 公共控件的 MFC 支持#ifndef _AFX_NO_AFXCMN_SUPPORT#include <afxcmn.h> // Windows 公共控件的 MFC 支持#endif // _AFX_NO_AFXCMN_SUPPORT#include <afxdb.h>#include <odbcinst.h>SGSS.manifest文件内容:<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><assemblyIdentityversion="1.0.0.0"processorArchitecture="X86"name="Microsoft.Windows.SGSS"type="win32"/><description>在此说明应用程序</description><dependency><dependentAssembly><assemblyIdentitytype="win32"name="Microsoft.Windows.Common-Controls"version="6.0.0.0"processorArchitecture="X86"publicKeyToken="6595b64144ccf1df"language="*"/></dependentAssembly></dependency></assembly> -
【初学】Golang中类c链表制作学生管理系统中关于“打印学生信息”存在的小问题
2021-01-27 22:39:20想学着在c中那样在go中利用链表的形式创建一个学生管理系统,结果只到输出环节就翻车了 以下是关于输入/输出的相关代码: <code class="language-Go">package main import( "fmt" "os&... -
华南理工大VC 实验报告:学生信息管理系统 附文档.rar
2019-07-10 18:56:11增加学生特有的信息,信息的生成和获取,)课表类:一周的课表,课表的生成和获取,)成绩表类:考试科目的成绩表,成绩表的生成和获取,)图形类:通过定义函数来生成UI图形,避免了大量的代码重复,简化了程序,... -
第十七周项目6-4:学生成绩统计
2014-12-30 17:44:15问题及代码: /* ...*All rights reserved. *文件名称:test.cpp *作者:贺老师 *完成日期:2014年12月30日 *版 本 号:v1.0 ...做成一个“学生成绩管理系统”之类的应用程序。 *程序输入: *程序输出 -
JSP+SQL学生信息管理系统ssh
2020-06-05 14:45:40JSP+SQL学生信息管理系统ssh ...基于JavaWeb开发的学生成绩,使用MyEclipse2014开发,连接MySQL数据库,存储学生的身份信息、成绩,管理员的身份信息,课程信息。 功能说明: 学生注册。学生身份:跳转到学生登.. -
本科毕业设计开题报告(成绩管理系统的设计与实现V3)
2018-08-15 10:08:05学校作为一个教育单位,成绩管理是学校日常管理不可缺少的部分,这就需要有一个能够提供这类服务的工具,因此课程成绩管理系统的开发就成为了必然。现在我国的大部分学校的成绩管理水平还停留在纸介质的基础上,这样... -
用C编写班级成绩管理系统
2009-06-18 19:32:07学生成绩管理系统有13种功能。把这13个功能做成13个子函数。在主函当数中设计一个菜单对这13个子数进行管理。来实现对整个系统的操作。 根据课题的要求。每一个学生的包括姓名(char)、学号(char)、M门课程的... -
微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理、消息群发等基础功能外,还有二维码推广、营销活动、微网站、会员卡、优惠券等。 zheng-wechat-app 微信小程序后台 zheng-message ...
-
java+mysql代码
2018-05-13 18:56:556.查询“方芳”老师所教的“数据库”课程成绩排名在第3~6名的学生学号、姓名,并将此记录插入新表tempScore中。(要求使用limit子句) 7.查询有两门以上课程不及格的学生学号及其平均成绩。 8.创建视图student_... -
基于SSM的学生信息管理系统(选课) 已停更 项目简介: 由SpringMVC+MyBatis为主要框架,mysql8.0配置主从复制实现读写分离,主机丛机分别为腾讯云的服务器,而项目部署在阿里云上。前端主要由bootstrap完成,背景用...
-
飞机大战Java源代码
2021-01-20 22:54:07而Java这门课程也有一个惯例就是要做一个课程设计,老师给了我们三个选择,分别是飞机大战、推箱子和学生成绩管理系统。在经过深思熟虑后,我选择了飞机大战。一方面是觉得他比较有趣和好玩,另一方面,觉得这难度也... -
java项目开发全程实录源代码_【程序源代码】轻量级JAVA应用开发框架
2021-01-14 20:03:14主要有学生管理、成绩查询管理、图书管理、课表管理、照片管理等等。感觉还是不错的小程序。详细界面看一下如下的页面。01—框架 技术特点采用组件化、模块化、可扩展;采用微内核实现Autoscan、AOP、IoC、Event等;... -
JAVA上百实例源码以及开源项目源代码
2018-12-11 17:07:42还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏 Java编写的网页版魔方游戏,编译后... -
完美学校网站系统全站源代码学校网站模板下载
2011-01-10 12:23:08学生成绩查询,专题报道,图片新闻,学校互动论坛,学校办公OA系统,学校信息,教务公开,学校动态,学校规章制度,政策法规,和家长学生互动,学校信息,校园风光网上介绍,名师风采,办学成就介绍,校园刊物网上电子版,学校的教学... -
java范例开发大全源代码
2011-10-30 23:31:51实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例161 垃圾回收的机制 250 第9章 面向对象的四大特征(教学视频:65分钟) 252 9.1 ... -
vc源代码合集0951.rar
2012-06-13 10:25:182012-06-12 12:06 228,818 一个简单的学生成绩管理系统.rar 2012-06-12 12:47 2,916 中缀表达式转后缀表达式代码(数据结构C++).rar 2012-06-12 11:57 6,246,172 串口助手源码.7z 2012-06-12 11:55 9,382 免疫算法... -
ASP.NET精品课程+源代码
2009-01-05 20:15:51让学生对这门语言有一个总的认识和总的把握,以便与其他语言进行比较,对一些重要的概念像类、空间、接口等先作一下简要介绍,因为这些概念相对来说比较难理解,主要是让学生在案例学习当中以及自己在实践操作中去... -
我的教务管理系统(jsp+servlet+mysql)130225.zip
2020-01-19 13:52:171、面向对象设计不再是单纯的从代码的第一行一直编到最后一行,而是考虑如何创建类和对象,利用类和对象来简化程序设计,并提供代码的封装和可重用性,便于程序的维护与扩展。 2、所谓的对象是一种抽象的名称,用来... -
Java开发技术大全(500个源代码).
2012-12-02 19:55:48mutexThread.java 一个能管理临界区的线程类 demoMutex.java 使用上面这个类来演示线程的互斥 commSource.java 一个共享资源的类 demoSynchrony.java 演示线程的同步 setDataThread.java 设置数据的线程类 ... -
C程序范例宝典(基础代码详解)
2013-05-17 00:15:35实例032 使用数组统计学生成绩 39 实例033 打印5阶幻方 40 1.6 字符和字符串操作 41 实例034 统计各种字符个数 41 实例035 字符串倒置 43 实例036 字符串替换 44 实例037 回文字符串 45 实例038 不用... -
天翼学校门户版网站管理系统.rar
2019-07-05 06:59:16功能,学生成绩查询,专题报道,图片新闻,学校互动论坛,学校办公OA系统,学校信息,教务公开,学校动态,学校规章 制度,政策法规,和家长学生互动,学校信息,校园风光网上介绍,名师风采,办学成就介绍,校园刊物网上电子版,... -
R语言实战:高级数据管理(1)
2014-11-06 22:46:47另外,你还想将前20%的学生评定为A,接下来20%的学生评定为B,依次类推。最后,你希望按字母顺序对学生排序。数据表如下图一所示: 思考: 我们为了给出每个人的综合成绩评价,并且进行等级评分。所以我们给出... -
本科毕业设计开题报告(学生电子作业提交与分析系统的设计与实现V2)
2018-08-15 10:26:05学生电子作业提交与分析系统的开发是为了解决传统的使用FTP服务器上传作业的作业管理方式下无法防止学生乱上传作业、上传作业到错误文件夹位置中,未能对学生上传作业的大小、类型、上传时间等进行限制,作业成绩不... -
(C#+SQL)旅游管理系统
2013-06-25 12:16:271、理解C#WinForm程序设计的风格,能设计合理的C#项目文件夹结构和公共类,注重代码的重用性,养成良好的标识符命名和代码编写习惯; 2、熟练掌握各种常见的控件属性和事件方法; 3、积累项目开发中常采用的设计模式... -
asp.net,java,jsp,安卓Android,苹果ios,php,vb.net,c#免费毕业课程设计源码打包下载
2015-01-29 22:29:54| 428双鱼林安卓Android学生成绩管理系统.rar 3.20 MB | 438双鱼林基于安卓Android销售管理系统.rar 3.53 MB | 457双鱼林苹果ios学生成绩管理系统.rar 3.87 MB | 461双鱼林苹果手机ios家庭财务管理系统.rar 3.82 MB ... -
java源码包---java 源码 大量 实例
2013-04-18 23:15:26还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏 Java编写的网页版魔方游戏,编译后...
-
Nginx 配置文件nginx.conf中文详解
-
高通dsp调试指南.pdf
-
转行做IT-第15章 Collection、泛型、Iterator
-
Galera 高可用 MySQL 集群(PXC v5.6 + Ngin
-
《LeetCode力扣练习》第1题 C语言版 (做出来就行,别问我效率。。。。)
-
Java项目演示第14期功能齐备的小区物业管理系统
-
C++小记
-
基于springboot2的springmvc执行流程(一)
-
MySQL Router 实现高可用、负载均衡、读写分离
-
深度学习中的五种归一化(BN、LN、IN、GN和SN)方法简介
-
基于投影寻踪回归的铜闪速熔炼过程关键工艺指标预测
-
实现 MySQL 读写分离的利器 mysql-proxy
-
多目标状态转移算法优化氧化铝蒸发过程的运营成本和能源效率
-
《文件过滤及内容编辑处理命令》
-
软件测试的职业发展路线,你知道吗
-
YUVPlayer1.5.exe
-
ppt模板01-103页
-
华为1+X——网络系统建设与运维(中级)
-
MySQL 数据类型和运算符
-
MySQL 高可用工具 DRBD 实战部署详解