C++实现简单学生管理系统
在网上看到的一个C++的小项目,自己码一下,然后记录下理解以及我这种菜鸟的问题。
我将我知道的尽可能详细的写下来,如有错误请联系我哈,QQ:920209178。
原文地址:https://blog.csdn.net/qq_33832591/article/details/78076816
环境:win10,Microsoft Visual Studio 2017
/*----------------------------------------------------------------------------------------
---------原文地址:https://blog.csdn.net/qq_33832591/article/details/78076816-------------
------------------------------------------------------------------------------------------
*/
#include <iostream>
#include <string.h>
using namespace std;
#define MAX 100 //宏定义 //学生的出生日期类
class CDate
{
public:
CDate(int y = , int m = , int d = );
//重载<运算符
bool operator < (CDate d);
//重载非成员函数和成员函数两者的参数会有变化,详情请百度
//重载流运算符
friend istream & operator >> (istream &in, CDate &d);
friend ostream & operator << (ostream &out, CDate &d); friend bool CheckValid(CDate d);
friend bool LeapYear(int year); void setDate(int y, int m, int d);
~CDate(); private:
unsigned short int year, month, day;
}; CDate::CDate(int y, int m, int d) :year(y), month(m), day(d)
{
//构造函数后面加':'---->初始化参数列表
//设置日期
} CDate::~CDate()
{
//~函数名----->析构函数
}
void CDate::setDate(int y, int m, int d)
{
year = y;
month = m;
day = d;
} //--------定义成员函数,就是那个流运算符的重载函数
istream &operator >> (istream &in, CDate &d)
{
char ch1, ch2;
cout << "请输入日期(格式:YYYY-MM-DD):";
while ()
{
cin >> d.year >> ch1 >> d.month >> ch2 >> d.day;
if (ch1 == '-' && ch2 == '-')
if (CheckValid(d)) break;
cerr << "时间格式不正确\n";
}
return cin;
} ostream &operator << (ostream &out, CDate &d)
{
out << d.year << "年" << d.month << "月" << d.day << "日";
return out;
} //用处:日期判断 ------ < 运算符重载函数定义
bool CDate::operator < (CDate d)
{
if (year < d.year) return true;
if (month < d.month) return true;
if (day < d.day) return true;
if (year > d.year) return false;
if (month > d.month) return false;
return false;
} //检查是否为闰年
bool LeapYear(int year)
{
//能被4整除而不能被100整除.
//能被400整除.
//就是闰年
if (year % == && year % || year % == )
return true;
else
return false;
} //检查用户输入的日期的合法性
bool CheckValid(CDate d)
{
int n;
if (d.month < || d.month>) return false;
if (d.day < ) return false;
n = ;
switch (d.month)
{
case :
if (LeapYear(d.year))//判断是否为闰年
n = ;
else
n = ;
break;
case :
case :
case :
case :
n = ;
break;
}
if (d.day > n) return false;//遇到return,函数结束(?)
return true;
} //--------------------------------------------------
//-----------------定义学生信息类-------------------
class CStudent
{
public:
static int num;//学生人数
CStudent(); void InputData();
friend void Sort();//排序
friend void FindName();//按姓名查询
friend void Statistic();//按性别统计
friend void display();//显示全部信息 ~CStudent(); private:
char* name;//姓名
bool sex;//性别
CDate date;//出生日期,CDate类对象为数据成员
}stu[MAX];//对象数组 int CStudent::num = ;//这里定义了学生信息类的num变量的值,代表学生编号(数量?) CStudent::CStudent()
{
} CStudent::~CStudent()
{
} //输入学生信息功能函数
void CStudent::InputData()
{
int p;
char s[];
cout << "请输入学生信息(NO." << num << "):\n";
cout << "姓名:";
cin >> s;
name = new char[strlen(s) + ];
strcpy(name, s);//strcpy函数:复制字符串,遇到'\0'为止
cout << "性别(输入1-男,输入2-女):";
cin >> p;
if (p) sex = true;//sex的值为1或0,一般除了0以外的都代表true
else sex = false;
cin >> date;
cout << endl;
} //友元函数,根据出生日期data从小到大排序
void Sort()
{
int i, j, p, num;
char* tn;
bool ts;
CDate td;
num = CStudent::num;//前面定义了num变量值为0,所以当学生数量为1或者0的时候不会调用下面for循环的语句
for (i = ; i < num; i++)
{
p = i;
for (j = i + ; j <= num; j++)
if (stu[i].date < stu[p].date) p = j;
if (p == i) continue;
//排序,姓名
tn = stu[i].name;
stu[i].name = stu[p].name;
stu[p].name = tn;
//排序,性别
ts = stu[i].sex;
stu[i].sex = stu[p].sex;
stu[p].sex = ts;
//排序,出生日期
td = stu[i].date;
stu[i].date = stu[p].date;
stu[p].date = td;
}
}
//根据学生姓名查询学生信息函数
void FindName()
{
char name[];
int i, num;
cout << "请输入姓名:";
cin >> name;
num = CStudent::num;
for (i = ; i <= num; i++)
if (strcmp(stu[i].name, name) == ) break;
//strcmp函数:比较两个参数,相同返回0,参数1>参数2,返回正数;参数1<参数2,返回负数
if (i < num)
{
cout << "查无此人" << endl << endl;
return;
} cout << "姓名:" << stu[i].name << endl;
cout << "性别:";
if (stu[i].sex)
cout << "男" << endl;
else
cout << "女" << endl;
cout << endl;
} //统计各性别人数
void Statistic()
{
//int i, num, s1, s0;
//我的显示错误:使用未初始化的变量:s1,s0
//给这两个值初始化
int i, num, s1=, s0=;
num = CStudent::num;
for (i = ; i <= num; i++)
{
if (stu[i].sex == ) s1++;
else s0++;
}
cout << "-----男生人数:" << s1 << "\n----女生人数:" << s0 << endl << endl;
} void display()
{
int i, num;
num = CStudent::num;
for (i = ; i <= num; i++)
{
cout << stu[i].name << "\t";
if (stu[i].sex == ) cout << "男";
else cout << "女";
cout << "\t" << stu[i].date << endl;
}
} //-----------------------------------------------
//--------------------主函数---------------------
int main()
{
//char* menu[] = { "","输入信息","排序","按姓名查询",
// "按性别统计", "显示全部信息", "推出"};
//这个按照原作者代码我的显示错误(VS2017),我加了个const约束
const char* menu[] = { "","输入信息","排序","按姓名查询",
"按性别统计","显示全部信息","退出" };
int i, p;
bool end;
end = false;
while (!end)
{
for (i = ; i < ; i++)
cout << i << " " << menu[i] << endl;
cin >> p;
switch (p)
{
case :
CStudent::num++;
stu[CStudent::num].InputData();
break;
case :
Sort();
break;
case :
FindName();
break;
case :
Statistic();
break;
case :
display();
break;
case :
end = true;
break;
}
}
return ;
}
-------------------------------------------------------------------------
再进行本地调试的时候有个错误:C4996 ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
在网上找到了解决方案:
项目 –> 项目属性 –> c/c++ –> 预处理器定义
添加: _CRT_SECURE_NO_WARNINGS
成功
--------------------------------------------------------------------------
如果我的理解有错误请一定要联系我,谢谢了!
C++实现简单学生管理系统的更多相关文章
- Java写一个简单学生管理系统
其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swing来 ...
- jdbc简单学生管理系统
这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; ...
- 简单学生管理系统HTML前端页面
效果图: 实现代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- javaee三层架构案例--简单学生管理系统
背景 学了jdbc.jsp等需要串起来,不然会忘记 项目环境 win10 jdk11 mysql8.0.13 jar包 c3p0-0.9.5.2 commons-dbutils-1.7 jstl mc ...
- C++ 实现简单命令行学生管理系统
C++ 实现简单命令行学生管理系统 预览: 编译环境是macOS.system("clear") 在windows下请换成 system("cls") #inc ...
- php实现简单的学生管理系统
php实现学生管理系统 一.效果 二.代码框架 functions文件夹里面是封装的mysqli的数据库操作函数和一个跳转的函数 student文件夹里面就是学生管理系统的主界面 applicatio ...
- java简单学生成绩管理系统
题目要求: 一. 数据结构要求:(5 分) 1.定义 ScoreInformation 类,其中包括七个私有变量(stunumber, name, mathematicsscore, englishi ...
- Java实现功能简单的学生管理系统(附带源代码)
这几天Java学了点新的知识,打算要用这些知识做一个比较简单的管理系统,实战一下子,代码中的功能简洁,可能不多,但是作为一个练手来了解一个项目是怎么样一点一点思考的还是不错的 一.代码中要实现的功能 ...
- <每日一题>题目7:简单的学生管理系统V1.0
''' # 学生管理系统v1.0 # 添加学生的信息 # 删除学生的信息 # 修改学生的信息 # 查看学生的信息 #遍历学生的信息 #退出系统 ''' import json #1 显示操作功能 de ...
随机推荐
- linux网络编程基础--(转自网络)
转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...
- Python输入数组(一维数组、二维数组)
一维数组: arr = input("") //输入一个一维数组,每个数之间使空格隔开 num = [int(n) for n in arr.split()] //将输入每个数以空 ...
- List、Set和数组之间的转换(转载)
本文转自 http://blog.sina.com.cn/s/blog_52fea7b60100s0hl.html 今天做项目中正好遇到该问题,就在网上查了下,这篇有些细节问题还是讲得挺好的. ★ 数 ...
- Java容器解析系列(7) ArrayDeque 详解
ArrayDeque,从名字上就可以看出来,其是通过数组实现的双端队列,我们先来看其源码: /** 有自动扩容机制; 不是线程安全的; 不允许添加null; 作为栈使用时比java.util.Stac ...
- python异常(概念、捕获、传递、抛出)
异常 目标 异常的概念 捕获异常 异常的传递 抛出异常 01. 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 程序停止执 ...
- linux实时时钟相关函数
time 功能:获取1970年1月1日00:00:00到现在的秒数 原型:time_t time(time_t *t); 参数: t:获取到的秒数 返回:获取到的秒数 说明:在time.h中定义了ti ...
- 个人洛谷账号地址——https://www.luogu.org/space/show?uid=181909 附上NOIP查分系统
个人洛谷地址: https://www.luogu.org/space/show?uid=181909 NOPI查分地址: http://bytew.net/OIer/
- div css 图片和文字上下居中对齐
想要图片和文字水平居中对齐很容易,可今天做这个树的时候,遇到了要将图片上下居中.这下就不知道怎么搞. 拿手册看也看不出所以然来,不同的浏览器对DIV的支持不一个,目前最好的浏览器是Firefox. 这 ...
- SQL Server tempdb 数据库位置迁移
SQL Server tempdb 数据库位置迁移 --查看物理位置 SELECT name, physical_name FROM sys.master_files WHERE database_i ...
- git教程:工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...