运用c++设计一个控制台窗口,可以进行学生成绩的储存与初步分析
首先在相应目录下建好文件夹:存储文件/学生信息
然后下面是源码
先是一些辅助的函数:
键盘事件.h
#pragma once
#include<iostream>
#include<conio.h>
using namespace std;
#pragma warning(disable:4996)//unsafe问题解决
//键盘事件.h
//按下esc返回1
int all_bk() {
int ch;
while (1) {
if (_kbhit()) {//如果有按键按下,则_kbhit()函数返回真
ch = _getch();//使用_getch()获取按下的键值
return ch;
}
}
}
bool esc_kb() {
//按下esc返回1,其他按键0
int ch;
while (1) {
if (_kbhit()) {//如果有按键按下,则_kbhit()函数返回真
ch = _getch();//使用_getch()获取按下的键值
//cout << ch;
if (ch == 27) { return 1; }//当按下ESC时退出循环,ESC键的键值是27.
else {
return 0;
}
}
}
}
类的定义:
//班级与学生类的初定义、“班级与学生.h”
#pragma once
#include<iomanip>
#include<string.h>
#include<Windows.h>
#include<vector>
#include<iostream>
#include<fstream>
#include <stdio.h>
#pragma warning(disable:4996)//unsafe问题解决
using namespace std;
/*——————————————————————————————————————————————————————————————*/
//基础功能函数
char* num2str(int a) {
char p[20];
sprintf(p, "%d", a);
return p;
}
double str2num(char* str) {
double a;
sscanf(str, "% lf", &a);
return a;
}
/*
int str2num(char* str) {
int a;
sscanf(str, "% d", &a);
return a;
}
*/
//搜寻函数
bool search_file(char* name) {
char head_txt[100] = "存储文件//学生信息//";
strcat(head_txt, name);
strcat(head_txt, ".txt");
fstream infile;
infile.open(head_txt, ios::in);
if (infile) {
//cout << "文件存在";
return 1;
}
else {
//cout << "文件不存在";
return 0;
}
}
/*——————————————————————————————————————————————————————————————*/
//类的前定义
class student
{//使用ID来索引学生
public:
student(int);
//创建
void create() { first_set(); save_info(); }
//读取
bool load_stu();
//
void change() { first_set(); save_info(); }
void show();//输出对象内容
char* getid() { return ID; }
char* getname() { return name; }
int sum() { return physics + english + math; }
double average() { return (physics + english + math) / 3.0; }
int tell_subject(int x);
private:
//构建学生项目
void first_set();
//读取与存储学生文件
bool save_info();
//info
char ID[20];
char name[20];
char class_[20];
int physics;
int math;
int english;
};
class class_stu {
//按照班级学号来存储
public:
class_stu();//创建并读取信息,要进行判断班级是否存在
//存在则调用old
~class_stu() {
cout << "班级项目已退出。" << endl;
}
/*______________________________________________*/
void delete_member(int num);//删除成员
void add_member();//添加成员
void change_member();//修改成员
/*______________________________________________*/
void show_member();//显示成员
void show_one_member(int id);//显示一个成员
int search(char*);//找寻成员位置
/*______________________________________________*/
void refresh();//刷新班级信息文档
/*______________________________________________*/
//外部友元
void math_ave();
void chinese_ave();
void english_ave();
void sort_total();
void sort_math();
void sort_chinese();
void sort_english();
private:
void create();
void quit();
typedef vector<student>::size_type stu_type;
int class_num;
vector<student> class_all;
bool read_class_info();//读取班级文档信息
bool save_class_info(int);
};
/*——————————————————————————————————————————————————————————————*/
然后是它的实现:
//"实现.h"
#pragma once
#include"学生和班级.h"
#include"界面.h"
/*——————————————————————————————————————————————————————————————*/
//student 类实现
//文件存储功能
bool student::save_info() {
char head_txt[100] = "存储文件//学生信息//";
strcat(head_txt, ID);
strcat(head_txt, ".txt");
fstream outfile;
outfile.open(head_txt, ios::out);
if (!outfile) {
cout << "文件存储失败" << endl;
outfile.close();
return 0;
}
else
{
outfile << ID << '\n' << name << '\n'<<class_<<'\n';
outfile << physics << '\t' << math << '\t' << english << '\t';
cout << "save!" << endl;
outfile.close();
}
return 1;
}
bool student::load_stu() {
char head_txt[100] = "存储文件//学生信息//";
strcat(head_txt, ID);
strcat(head_txt, ".txt");
fstream infile;
infile.open(head_txt, ios::in);
if (!infile) {
cout << "文件read失败" << endl;
infile.close();
return 0;
}
else {
infile >> ID;
infile >> name;
infile >> class_;
infile >> physics;
infile >> math;
infile >> english;
cout << "load!" << endl;
infile.close();
return 1;
}
}
//类基本功能实现
void student::first_set()
{
cout << "\t学生学号:";
cout << ID << endl;
cout << "\t学生姓名:";
cin >> name;
cout << "\t学生班级:";
cin >> class_;
cout << "\t物理成绩:";
cin >> physics;
cout << "\t英语成绩:";
cin >> english;
cout << "\t数学成绩:";
cin >> math;
return;
}
void student::show()
{
cout << "该学生的学号:" << ID << endl;
cout << "该学生的姓名:" << name << endl;
cout << "该学生的班级:" << class_ << endl;
cout << "该学生的物理成绩:" << physics << endl;
cout << "该学生的数学成绩:" << math << endl;
cout << "该学生的英语成绩:" << english << endl;
}
student::student(int id) {
strcpy(ID, num2str(id));
if (search_file(ID)) {
load_stu();
}
else {
create();
}
}
int student::tell_subject(int x) {
switch (x) {
case 1:return math; break;
case 2:return physics; break;
case 3:return english; break;
}
}
/*——————————————————————————————————————————————————————————————*/
//class_stu类的实现
int class_stu::search(char* id) {
int i;
for (i = 0; i < class_all.size(); i++) {
if (!strcmp(id, class_all[i].getid())) {
return i;
}
}
cout << "查无此人" << endl;
return -1;
}
void class_stu::show_member() {
system("cls");
for (int i = 0; i < class_all.size(); i++) {
class_all[i].show();
cout << "________________________________________________________\n";
}
cout << "按下任意键返回" << endl;
system("pause");
}
void class_stu::show_one_member(int num) {
class_all[num].show();
}
void class_stu::refresh() {
fstream ref;
ref.open("存储文件//班级信息.txt", ios::out);
for (int i = 0; i < class_all.size(); i++) {
ref << class_all[i].getid()<<'\n';
}
}
void class_stu::create() {
int i;
for (i = 0; 1; i++) {
system("cls");
add_member();
cout << "按下esc退出,按下其他键继续。" << endl;
if (esc_kb()) { break; }
}
class_num = i;
}
bool class_stu::save_class_info(int ID) {
fstream out;
out.open("存储文件//班级信息.txt", ios::app);
out << ID << '\n';
out.close();
return 1;
}
bool class_stu::read_class_info() {
fstream infile;
infile.open("存储文件//班级信息.txt", ios::in);
if (!infile) {
cout << "flase";
return 0;
}
int temp;
int i = 0;
while (infile >> temp) {
class_all.push_back(student(temp));
i++;
}
class_num = i;
infile.close();
return 1;
}
void class_stu::change_member() {
cout << "输入ID:";
char p[20];
cin >> p;
int id = search(p);
class_all[id].change();
return;
}
void class_stu::add_member() {
cout << "输入学生ID:" << endl;
int ID;
cin >> ID;
if (search_file(num2str(ID))) {
cout << "学生ID已经存在" << endl;
}
else {
class_all.push_back(student(ID));
fstream out;
save_class_info(ID);
}
}
void class_stu::delete_member(int num) {
char head[50] = "存储文件//学生信息//";
strcat(head, class_all[num].getid());
strcat(head, ".txt");
remove(head);
class_all.erase(class_all.begin() + num);
refresh();
}
//构造函数
class_stu::class_stu() {
if (read_class_info()) {
cout << "successfully read! " << endl;
}
else {
cout << "尚未创建班级,是否创建班级?(Y/N):" << endl;
char y = cin.get();
if (y == 'Y') {
create();
}
else {
//quit();
system("pause");
cout << "exit project." << endl;
exit(1);
return;
}
}
}
/*——————————————————————————————————————————————————————————————*/
//学生成绩统计分析模块函数:
//求全班数学平均成绩
void class_stu::math_ave() {
double s = 0;
cout << "全班同学的数学平均成绩为:";
for (int i = 0; i < class_all.size(); i++)
s += class_all[i].tell_subject(1);
cout << s / class_all.size() << '\n';
}
//求全班语文平均成绩
void class_stu::chinese_ave() {
double s = 0;
cout << "全班同学的物理平均成绩为:";
for (int i = 0; i < class_all.size(); i++)
s += class_all[i].tell_subject(2);
cout << s / class_all.size() << '\n';
}
//求全班英语平均成绩
void class_stu::english_ave() {
double s = 0;
cout << "全班同学的英语平均成绩为:";
for (int i = 0; i < class_all.size(); i++)
s += class_all[i].tell_subject(3);
cout << s / class_all.size() << '\n';
}
//对全班总成绩进行排序
void class_stu::sort_total() {
char* str[30];
char* id[30];
int score[30];
for (int i = 0; i < class_all.size(); i++) {
str[i] = class_all[i].getname();
score[i] = class_all[i].sum();
id[i] = class_all[i].getid();
}
for (int i = 0; i < class_all.size() - 1; i++) {
for (int j = i + 1; j < class_all.size(); j++)
if (score[i] <= score[j]) {
int t = score[i];
score[i] = score[j];
score[j] = t;
char* p = str[i];
str[i] = str[j];
str[j] = p;
char* p1 = id[i];
id[i] = id[j];
id[j] = p1;
}
}
cout << "全班学生总成绩从高到低排序为:" << '\n';
; for (int i = 0; i < class_all.size(); i++) {
cout << id[i] << " " << str[i] << ":" << score[i] << '\n';
}
}
//对数学成绩进行排序
void class_stu::sort_math() {
char* str[30];
char* id[30];
int score[30];
for (int i = 0; i < class_all.size(); i++) {
str[i] = class_all[i].getname();
score[i] = class_all[i].tell_subject(1);
id[i] = class_all[i].getid();
}
for (int i = 0; i < class_all.size() - 1; i++) {
for (int j = i + 1; j < class_all.size(); j++)
if (score[i] <= score[j]) {
int t = score[i];
score[i] = score[j];
score[j] = t;
char* p = str[i];
str[i] = str[j];
str[j] = p;
char* p1 = id[i];
id[i] = id[j];
id[j] = p1;
}
}
cout << "全班学生数学成绩从高到低排序为:" << '\n';
; for (int i = 0; i < class_all.size(); i++) {
cout << id[i] << " " << str[i] << ":" << score[i] << '\n';
}
}
//对语文成绩排序
void class_stu::sort_chinese() {
char* str[30];
char* id[30];
int score[30];
for (int i = 0; i < class_all.size(); i++) {
str[i] = class_all[i].getname();
score[i] = class_all[i].tell_subject(2);
id[i] = class_all[i].getid();
}
for (int i = 0; i < class_all.size() - 1; i++) {
for (int j = i + 1; j < class_all.size(); j++)
if (score[i] <= score[j]) {
int t = score[i];
score[i] = score[j];
score[j] = t;
char* p = str[i];
str[i] = str[j];
str[j] = p;
char* p1 = id[i];
id[i] = id[j];
id[j] = p1;
}
}
cout << "全班学生物理成绩从高到低排序为:" << '\n';
; for (int i = 0; i < class_all.size(); i++) {
cout << id[i] << " " << str[i] << ":" << score[i] << '\n';
}
}
//对英语成绩进行排序
void class_stu::sort_english() {
char* str[30];
char* id[30];
int score[30];
for (int i = 0; i < class_all.size(); i++) {
str[i] = class_all[i].getname();
score[i] = class_all[i].tell_subject(3);
id[i] = class_all[i].getid();
}
for (int i = 0; i < class_all.size() - 1; i++) {
for (int j = i + 1; j < class_all.size(); j++)
if (score[i] <= score[j]) {
int t = score[i];
score[i] = score[j];
score[j] = t;
char* p = str[i];
str[i] = str[j];
str[j] = p;
char* p1 = id[i];
id[i] = id[j];
id[j] = p1;
}
}
cout << "全班学生英语成绩从高到低排序为:" << '\n';
; for (int i = 0; i < class_all.size(); i++) {
cout << id[i] << " " << str[i] << ":" << score[i] << '\n';
}
}
/*
bool class_stu::class_num_get() {
fstream infile;
infile.open("存储文件//班级信息", ios::in);
if (!infile) {
cout << "flase";
return 0;
}
char temp[100];
int i = 0;
while (infile >> temp)i++;
class_num = i;
//strcat(names, num2str(class_num));
return 1;
}
*/
显示界面:
界面.h
#pragma once
#include"键盘事件.h"
using namespace std;
//这个函数设计UI界面
int UIface_01() {
int select;
//刷新页面
system("cls");
cout << "*****************学生成绩管理信息系统*****************" << endl;
cout << "1-- - 学生成绩基本管理 2-- - 学生成绩统计分析" << endl;
cout << "3-- - 退出系统" << endl;
cout << "*****************************************************" << endl;
system("pause");
cout << "请按下按键" << endl;
select=all_bk();
return select;
}
int UIface_02() {
int select;
//刷新页面
system("cls");
cout << "*****************************************************" << endl;
cout << "A-- - 插入学生记录 B-- - 修改学生记录" << endl;
cout << "C-- - 删除退学学生记录 D-- - 查找学生记录" << endl;
cout << "E-- - 浏览全班学生成绩 F-- - 返回上一级菜单" << endl;
cout << "G-- - 退出系统" << endl;
cout << "*****************************************************" << endl;
system("pause");
cout << "请按下按键" << endl;
select = all_bk();
return select;
}
int UIface_03() {
int select;
//刷新页面
system("cls");
cout << "*****************************************************" << endl;
cout << "A-- - 统计全班学生平均成绩 B-- - 排序输出全班总分" << endl;
cout << "C-- - 单科成绩排序输出 D-- - 返回上一级菜单" << endl;
cout << "F-- - 退出系统" << endl;
cout << "*****************************************************" << endl;
system("pause");
cout << "请按下按键" << endl;
select = all_bk();
return select;
}
然后定义一下响应事件:
//事件定义.h
#pragma once
#include"实现.h"
//前定义操作
//关于界面操作
void inter_action_02(int&, class_stu& cla);
void inter_action_03(int&, class_stu& cla);
void inter_action_01(int&, class_stu& cla);
void inter_action_01(int& se, class_stu& cla) {
int le;
se = UIface_01();
switch (se)
{
case 49:
se = UIface_02();
le = 1;
break;
case 50:
se = UIface_03();
le = 2;
break;
case 51:
cout << "程序终止" << endl;
return;
default:
cout << "请输入正确按键" << endl;
return;
}
system("cls");
switch (le)
{
case 1:
inter_action_02(se, cla);
break;
case 2:
inter_action_03(se, cla);
break;
default:
break;
}
return;
}
void inter_action_02(int& se, class_stu& cla) {
switch (se) {
case 97:
cla.add_member();
int id;
break;
case 98:
cla.change_member();
break;
case 99:
cout << "输入ID:";
char p2[30];
cin >> p2;
id = cla.search(p2);
if (id == -1)cout << "fail" << endl;
else cla.delete_member(id);
break;
case 100:
cout << "输入ID:";
char p3[30];
cin >> p3;
id = cla.search(p3);
if (id == -1)cout << "fail" << endl;
else cla.show_one_member(id);
break;
case 101:
cla.show_member();
break;
case 102:
system("cls");
cout << "连续按下任意按键返回" << endl;
break;
case 103:
system("cls");
cout << "连续按下esc退出" << endl;
break;
default:
cout << "按错了" << endl;
break;
}
}
void inter_action_03(int& se, class_stu& cla) {
switch (se) {
case 97:
cla.math_ave();
cout << "——————————————————————————————————————————————" << endl;
cla.chinese_ave();
cout << "——————————————————————————————————————————————" << endl;
cla.english_ave();
cout << "——————————————————————————————————————————————" << endl;
break;
case 98:
cla.sort_total();
break;
case 99:
int a;
cout << "请输入排序的对象:数学按1,物理按2,英语按3";
a = all_bk();
switch (a) {
case 49:
cla.sort_math();
break;
case 50:
cla.sort_chinese();
break;
case 51:
cla.sort_english();
break;
default:
cout << "按错了!";
break;
}
break;
case 100:
system("cls");
break;
case 101:
break;
default:
cout << "按错了" << endl;
break;
}
}
接下来就是主函数了:
#include"事件定义.h"
int main() {
class_stu cla;
int se=-1;
while(1){
inter_action_01(se,cla);
cout << "按下esc退出" << endl;
if (esc_kb())break;
}
return 0;
}
|