在网上看到的一个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. python基础之作业1---用户登录

    作业:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 import sys, os, getpass os.system('clear')i = 0while i < 3: ...

  2. Django框架教程之正则表达式URL误区详解

    问题:我学习的视频大概是2015年录的,里面用的Django版本比较老关于正则表达式URL这一块都是用的url(“url(r'^admin/', admin.site.urls),”)方法.而我自己练 ...

  3. 在用单片机接受串口数据的时候,第一位是0x0A

    unsigned char data len=0; //命令字符串长度if(RI) //如果数据已经接收完,即RI=1{ RI=0; //对RI进行清零 cmd_buf[counter] = SBUF ...

  4. JAVA Character类

    字符可以用char类型声明: char ch = 'a'; // Unicode 字符表示形式 char uniChar = '\u039A'; // 字符数组 char[] charArray ={ ...

  5. [工控安全]“祝融”—一种针对PLC控制系统的欺骗攻击病毒

    “祝融”作为一种针对传统PLC控制系统的欺骗攻击病毒,所述的典型的PLC控制系统通常包括两部分: 用于组态.编程.监视.控制的工程师站(通常是PC设备) PLC控制器(通常如西门子.施耐德.三菱等厂家 ...

  6. L345 大脑复生

    Yale Researchers Build BrainEx Machine to Restore Brain Function After Death Researchers at Yale Uni ...

  7. java中外部类和内部类的访问控制符区别

    外部类只有两种访问控制符,即public和default(包访问控制级别).原因:外部类的上一级程序单元是包,所以它只有两种作用域:同一个包内和任何位置,这样只需要用public和default即可, ...

  8. 2--TestNG 参数化

    (1)XML文件 public class ParameterTest{ @test @Parameters({"name","age"}) public vo ...

  9. Delphi7第三方控件

    控件安装(安装时建议先关闭Delphi) 1.只有一个DCU文件的组件. DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布.一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本 ...

  10. 作为程序员你不知道中国互联网300强你就OUT了!

    很多程序员们工作一段时间之后,都想跳槽到综合实力更强的公司以获取高薪资或者接触到前沿的技术,但是哪些行业值得我们投入大量的时间,哪些公司属于我们行业中的佼佼者呢, 那么小编给您分析下2018年中国互联 ...