在网上看到的一个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++实现简单学生管理系统的更多相关文章

  1. Java写一个简单学生管理系统

    其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swing来 ...

  2. jdbc简单学生管理系统

    这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; ...

  3. 简单学生管理系统HTML前端页面

    效果图: 实现代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  4. javaee三层架构案例--简单学生管理系统

    背景 学了jdbc.jsp等需要串起来,不然会忘记 项目环境 win10 jdk11 mysql8.0.13 jar包 c3p0-0.9.5.2 commons-dbutils-1.7 jstl mc ...

  5. C++ 实现简单命令行学生管理系统

    C++ 实现简单命令行学生管理系统 预览: 编译环境是macOS.system("clear") 在windows下请换成 system("cls") #inc ...

  6. php实现简单的学生管理系统

    php实现学生管理系统 一.效果 二.代码框架 functions文件夹里面是封装的mysqli的数据库操作函数和一个跳转的函数 student文件夹里面就是学生管理系统的主界面 applicatio ...

  7. java简单学生成绩管理系统

    题目要求: 一. 数据结构要求:(5 分) 1.定义 ScoreInformation 类,其中包括七个私有变量(stunumber, name, mathematicsscore, englishi ...

  8. Java实现功能简单的学生管理系统(附带源代码)

    这几天Java学了点新的知识,打算要用这些知识做一个比较简单的管理系统,实战一下子,代码中的功能简洁,可能不多,但是作为一个练手来了解一个项目是怎么样一点一点思考的还是不错的 一.代码中要实现的功能 ...

  9. <每日一题>题目7:简单的学生管理系统V1.0

    ''' # 学生管理系统v1.0 # 添加学生的信息 # 删除学生的信息 # 修改学生的信息 # 查看学生的信息 #遍历学生的信息 #退出系统 ''' import json #1 显示操作功能 de ...

随机推荐

  1. Struts2环境搭建和运用

    一.解压\struts-2.3.31\apps路径下struts2-blank.rar文件.将其中WEB-INFl路径下的lib中的包和web.xml文件复制到新项目中的WEB-INF路径下.web. ...

  2. Jmeter之https脚本录制

    jmeter录制脚本时,跟http脚本录制主要区别是,https录制需要添加安全证书.   一.jmeter代理服务器及证书配置. 1.打开jmeter,右键测试计划添加线程组,右键工作台--> ...

  3. hibernate @OneToMany等注解设置查询过滤条件

    如实体PdOrg对象中有users对象,数据库user表有字段DEL_FLAG(0:删除:1:未删除): private List<User> users= new ArrayList&l ...

  4. IIS7.5修改asp的文件上传限制方法

    第一.IIS7.5修改asp的文件上传限制方法 1.打开IIS 2.打开面板中的应用程序开发 asp 3.找到最后的限制属性 4.修改其中的最大请求实体主体限制的值:默认为200000字节,等于195 ...

  5. selenium 分布式 [WinError 10061] 由于目标计算机积极拒绝

    selenium grid分布式,老是出现[WinError 10061] 由于目标计算机积极拒绝的问题 网上查了一圈,出现积极拒绝大概是代理问题, 捣鼓了一圈,还是不行 想到fiddler自动侦听了 ...

  6. .NET界面控件DevExpress发布v18.2.8|附下载

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  7. Cocos2dx 代码中包含中文导致编译错误的问题解决方法

    从网上下载一个cocos2dx的源码,是IOS版本的,我将其迁移到windows 7下 ,用VS2010编译,出现一堆的C2001错误: 1>d:\cocos2d-x-2.2.6\mygame\ ...

  8. 剑指offer用位运算实现两个数相加,及python相关的位操作

    题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution:    def Add(self ...

  9. VBA中查找并选定文字

    如果从 Selection 对象访问 Find 对象,当找到搜索条件时,就会更改所选内容.下列示例选定下一个出现的“Hello”.如果到达文档结尾时仍未找到“Hello”,则停止搜索. With Se ...

  10. Oracle误删除数据和表的恢复办法包括truncate

    在工作中我们操作数据库的时候经常会发生一个不该发生的问题:用户意外的删除一个非常重要的表或者是表中的数据而且没有备份,需要尽快的恢复,以下就是解决的办法: 主要是利用Oracle回收站的闪回特性ora ...