零基础学习C++系列课程(五) 持续更新中
目录
项目四、路由器管理系统-权限判断
第 1 节 项目需求、项目实现
第 2 节 项目精讲-string 字符串的比较
第 3 节 项目精讲-表示真假的布尔类型
第 4 节 项目精讲-C 语言字符串的比较
第 5 节 项目精讲-其它数据类型的比较运算
第 6 节 项目精讲-用于综合决策的逻辑运算
6.1逻辑与 &&
6.2逻辑或 ||
6.3逻辑非 !
第 7 节 项目精讲-操作硬件的位运算
第 8 节 项目精讲-其它运算
8.1算术运算
8.2赋值运算
8.3复合赋值运算
8.4自增自减运算
8.5逗号运算符
8.6三目运算符
第 9 节 项目精讲-使用多个运算符时的优先级
第 10 节 项目精讲-数据类型之间的转换
10.1类型转换的概念
10.2隐式类型转换
10.3强制类型转化
第 11 节 项目精讲-如果再回到从前- 条件判断
11.1项目精讲-if 语句的三种形态
11.2项目精讲-if 语句的嵌套
第 12 节 项目精讲-switch 语句
12.1switch 的基本使用
12.2switch 和 if 的选择
第 13 节 项目精讲-常见错误总结
13.1switch 错误
13.2不安全函数(scanf 等)
13.3cin >> 的返回值
13.4getline 的返回值
13.5if 语句后面误加分号
第 14 节 英语不是障碍:计算机英语加油站
第 15 节 编程思维修炼
第 16 节 职场修炼:怎样优雅地避免加班
第 17 节 项目练习
17.1习题 1. 让用户输入一个字符, 然后进行转换:
17.2习题 2. 让用户输入一个数字(0-9),然后输出对应的大写汉字。
17.3习题 3. 让用户输入年份和月份,然后输出这个月有多少天。
第 18 节 程序员逼格提升:程序员的逼格神器-github
项目四、路由器管理系统-权限判断
为看书困难的小伙伴推荐视频教程:百度网盘 提取码:r59a
第 1 节 项目需求、项目实现
项目需求
项目实现:
#include <iostream>
#include <Windows.h>
#include <string>using namespace std;int main(void) {string name;string pwd;std::cout << "请输入账号:";std::cin >> name;std::cout << "请输入密码:";std::cin >> pwd;if (name == "54hk" && pwd == "123456") {std::cout << "1.网站 404 攻击" << std::endl;std::cout << "2.网站篡改攻击" << std::endl;std::cout << "3.网站攻击记录" << std::endl;std::cout << "4.DNS 攻击" << std::endl;std::cout << "5.服务器重启攻击" << std::endl;} else {cout << "用户名或密码错误!" << endl;}system("pause");return 0;
}
第 2 节 项目精讲-string 字符串的比较
复习字符串的比较规则:
按顺先从前往后比较
同序号的字符按“ASCII”码值比较
直到遇到对应字符不等或者字符串结束
字符串比较的“运算符”
==
>
<
>= (大于或者等于)
<= (小于或者等于)
!=
c++中,字符串的比较, 可以直接使用以上的”比较运算符”
比如:
str1 == str2
字符串比较的“结果”:bool 类型
逻辑真 true
逻辑假 false
第 3 节 项目精讲-表示真假的布尔类型
C++语言中,有两种 bool(布尔)类型的表示方式:
1)直接使用 bool 类型
bool x = true;
bool 类型, 只有两个值:
true
false
2)使用 0 和非 0 的任何值(C 语言风格)
0:表示假
非 0: 表示真
特别注意:
1>3 是假
1>3 == false 是真
3>1 是真
3>1 == false 是假
bool x;
x = 1 < 3;
类似:
对你的女神/男神说:
我爱你 => 是真
我爱你 == true => 是真
我爱你 == false => 是假
对你的备胎说:
我爱你 => 是假
我爱你 == true => 是假
我爱你 == false => 是真
常见错误:
3>2>1 是假
3>2>1 => true>1 => 1>1 => false
3>2 && 2>1 使用“逻辑与”运算。
bool 类型使用场合:
if 语句
for 语句
while 语句
第 4 节 项目精讲-C 语言字符串的比较
#include <string.h>
int strcmp( const char *str1, const char *str2 );
例如:
int ret;
ret = strcmp(str1, str2);
返回值:
str1 < str2 时, 返回值< 0(有些编译器返回 -1)
str1 > str2 时, 返回值> 0(有些编译器返回 1)
str1 等于 str2 时, 返回值为 0
demo
#include <stdio.h>
#include <string.h>
#include <Windows.h>int main(void) {char addr[32];int ret;printf("美女,你是哪里人?");scanf("%s", addr);if (strcmp(addr, "湖南") == 0) {printf("美女,我们是老乡啊!\n");} else {printf("美女,你和我的同学是老乡啊!\n");}system("pause");return 0;
}
第 5 节 项目精讲-其它数据类型的比较运算
char, int, short, float, double 等数据类型,都可以使用比较运算:
大于: >
大于或等于: >=
小于: <
小于或等于: <=
不等于: !=
等于: ==(注意:不是 = )
比较运算的结果:(逻辑值)
结果为“真”: true
结果为“假”: false
#include <iostream>
#include <Windows.h>using namespace std;int main(void) {int weight;printf("美女, 你多重啊?\n");cin >> weight;if (weight >= 120) {cout << "美女, 如此丰满, 真有福气!" << endl;} else {cout <<"美女, 这么瘦, 身材不错啊!" << endl;}system("pause");return 0;
}
第 6 节 项目精讲-用于综合决策的逻辑运算
与 C 语言完全相同。
现实生活中,任何决策,都是根据多个因素,综合决策的!
有没有钱, 有没有时间, 实力允不允许?
6.1逻辑与 &&
a |
b |
a&&b |
真 |
真 |
真 |
假 |
假 |
假 |
假 |
真 |
假 |
真 |
假 |
假 |
都为真,逻辑与才是真
只要有一个是假, 逻辑与就是假
相当于“而且”
应用场景:
当需要两个条件都满足时,就使用逻辑与
特别注意:
条件 1 && 条件 2
当条件 1 为真时,才去判断条件 2
当条件 1 为假时,就不再判断条件 2
多个条件:
条件 1 && 条件 2 && 条件 3
#include <iostream>
#include <Windows.h>using namespace std;int main(void) {int money;int days;cout << "你有多少钱?";cin >> money;cout << "你看多少天的假期?";cin >> days;//如果存款大于 10 万,而且假期大于 10 天, 就去旅游if (money > 100000 && days > 10) {cout << "我要去旅游!" << endl;} else {cout << "还是在家里呆着" << endl;}system("pause");return 0;
}
6.2逻辑或 ||
a |
b |
a||b |
真 |
真 |
真 |
假 |
假 |
假 |
假 |
真 |
真 |
真 |
假 |
真 |
只要有一个是真, 结果就是真
都为假时,结果才是假
相当于“或者”
多个条件:
条件 1 || 条件 2 || 条件 3
应用场景:
只需要满足任意一个条件时,就使用逻辑或
特别注意:
条件 1 || 条件 2
当条件 1 为真时,就不再判断条件 2
当条件 1 为假时,才判断条件 2
#include <iostream>
#include <string>
#include <Windows.h>using namespace std;int main(void) {int money;string love;cout << "你有多少钱?" << endl;cin >> money;cout << "你爱我吗?" << endl;cin >> love; //回答: 爱 或者 不爱if (money > 1000000 || love == "爱" ) {cout << "我们结婚吧!" << endl;} else {cout << "你是一个好人!" << endl;}system("pause");return 0;
}
6.3逻辑非 !
是”单目运算符”, 即:只有一个操作数
!条件
a |
!a |
真 |
假 |
假 |
真 |
相当于“不”
应用场景:
当需要不满足某条件时,就使用逻辑非
特别注意:
逻辑非,只对一个条件进行运算!
是一种“单目运算符”
需求: 如果月薪不到 3 万, 那就努力修炼. 否则, 就可以去接外包.
#include <iostream>
#include <Windows.h>using namespace std;int main(void) {int money;int days;cout << "你的月薪多少?";cin >> money;if (!(money >= 30000)) {cout << "我是菜鸟, 薪资不到 3 万, 我要努力修炼!\n" << endl;} else {cout << "我要接外包\n" << endl;}system("pause");return 0;
}
第 7 节 项目精讲-操作硬件的位运算
问题:
把地址为 0x80040 的寄存器的最低 4 位设置为 0110
解决方案:
使用位操作
什么是位?
内存的基本单元是字节, 一个字节有 8 位.
位与 &
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1
对应位, 都是 1, 结果才是 1
// 00001000
// 00000011
// 00000000
cout << " 8 & 3 = " << (8 & 3) << endl;
位或 |
0 | 0 0
0 | 1 1
1 | 0 1
1 | 1 1
对应位, 都是 0, 结果才是 0
只要有一位是 1, 结果就是 1
0 | x x
// 00001000
// 00000011
// 00001011
cout << " 8 | 3 = " << (8 | 3) << endl;
位非 ~
~ 1 0
~ 0 1
取反
// 00001000
// 11110111
unsigned char x = ~8;
cout << (int)x << endl; //247
异或 ^
0 ^ 0 0
1 ^ 1 0
0 ^ 1 1
1 ^ 0 1
对应位不同, 结果才是 1
// 00001000
// 00000011
// 00001011
cout << (8^3) << endl; //11
<< 左移
右边的位用 0 来填充, 移动超出左边边界的位则直接抛弃。
向左移动 n 个位置,就等同于乘以 2 的 n 次方
只适用于: int/short/long/char 等定点数类型(float/double 浮点数类型不能使用)
// 00001000
// 01000000
cout << (8<<3) << endl; //8*2*2*2 = 64
>> 右移
如果左操作数是无符号类型,则左边多出来的位用 0 来填充。
如果左操作数是有符号类型,则左边多出来的位用 符号位(最高位) 来填充。
向左移动 n 个位置,就等同于除以 2 的 n 次方
只适用于: int/short/long/char 等定点数类型(float/double 浮点数类型不能使用)
// 00001000
// 00000001
cout << (8>>3) << endl; //1
应用:
把一个整数的的最低 4 位设置为 0110
cout << "请输入一个整数: " << endl;
cin >> x;//把 x 的最低 4 位清 0
x = x & (~15);//把 x 的最低 4 位设置为 0110
x = x | 6;cout << "x=" << x << endl;
第 8 节 项目精讲-其它运算
已经学习了:
x = 100;
== > >= < <= !=
&& || !
& | ~ ^ >> <<
8.1算术运算
+ |
加 |
x = 5 + 3; |
|
- |
减 |
x = 5 - 3; |
|
* |
乘 |
x = 5 * 3; |
|
/ |
除 |
x = 10 / 3; |
1. 两个整数相除,结果取整数部分 |
% |
取余 |
x = 10 % 3; |
只有整数和 char 类型可以做%运算 |
8.2赋值运算
x = 10; //把 x 的值设置为 10, 把 10 写到变量 x 中。
x = 10 + a;
左边必须是变量
“优先级”很低,只比 ","(逗号元素符)高。
8.3复合赋值运算
x += 10; // x = x + 10
x -= 10; // x = x - 10
类的还有: *= ,/=, %= 等。
8.4自增自减运算
i++ => i = i+1
++i => i = i+1
i-- => i = i-1
--i => i = i-1
i = 100;
x = i++; // x = 100
i = 100;
x = ++i; // x= 101
后缀自增 |
x = i++; |
x = i; |
先取值 |
后缀自减 |
x=i--; |
x = i; |
先取值 |
前缀自增 |
x = ++i; |
i=i+1; |
先自增(自减) |
前缀自减 |
x = --i; |
i=i-1; |
先自增(自减) |
注意:
1. 只能对变量做++和--运算,不能对变量和表达式做++和--运算
5++; //ERROR
(3+x)++; //ERRO
2. 建议尽量使用前缀自增(自减),以避免错误。
8.5逗号运算符
优先级最低。
#include <stdio.h>int main(void) {int x;// 先计算 x = 3+5, 再计算 3*5x = 3+5, 3*5, 10/5;printf("x=%d\n", x); //x=8//取最后一个表达式的值,作为整个“逗号表达式”的值x = (3+5, 3*5, 10/5);cout << x << endl; //x=2return x;
}
8.6三目运算符
条件 ? 表达式 1 :表达式 2
如果条件为真,就取表达式 1 作为整个表达式的值
如果条件为假,就取表达式 2 作为整个表达式的值
#include <iostream>
#include <Windows.h>using namespace std;int main(void) {int salary;printf("请输入您的月薪: ");scanf("%d", &salary);cout << (salary > 30000 ? "老鸟" : "菜鸟") << ", 晚上好!" << endl;system("pause");return 0;
}
第 9 节 项目精讲-使用多个运算符时的优先级
一共有 15 个级别!
不需强制记忆,只需要掌握以下常用的优先级:
最高优先级:( )和[ ]
最低优先级:逗号表达式
倒数第二低优先级:赋值和复合赋值(=, +=, -= ...)
x = a+ b*c;
! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
(3 + 4 < 5 && 6 > 7) || (8 > 7);
第 10 节 项目精讲-数据类型之间的转换
10.1类型转换的概念
为什么需要“类型转换”
参与运算的两个操作数的数据类型,必须相同!
类型转换的类别:
1. 隐式类型转换 (自动完成转换)
1)算数转换
2)赋值转换
3)输出转换
2. 强制类型转化
10.2隐式类型转换
算数转化
(+,-,*,/,%)
char , int, long, long long, float, double
15 + 3.14 => 15.0 + 3.14
赋值转换
#include <stdio.h>int main(void) {int x;// 计算结果 31.4 转换为 int 类型,因为赋值符号的左边变量的类型是 int 类型x = 3.14 * 10.0;cout << x << endl; //31return 0;
}
输出转换(C 语言)
#include <stdio.h>int main(void) {printf("%c\n", 255+50); //305 -> 49 ('1');printf("%d\n", 255+50); //305return 0;
}
int 类型数据, 按照%f 格式输出时,将得到错误的输出
float(或 double) 类型数据,按照%d 格式输出时,将得到错误的输出
10.3强制类型转化
简单强制类型转换
(直接使用数据类型)
int x = 257 + 100;
cout << "x=" << x << endl; //357x = (char)257 + 100; //100000001 -> 00000001
cout << "x=" << x << endl; //101
高级强制类型转换
1) static_cast
2) dynamic_cast
3) const_cast
4) reinterpert_cast
[将在后续章节中, 详细精讲]
第 11 节 项目精讲-如果再回到从前- 条件判断
11.1项目精讲-if 语句的三种形态
形态 1:
#include <iostream>using namespace std;int main(void) {int salary;cout << "你月薪多少?";cin >> salary;if (salary < 20000) {cout << "你是一个好人, 我还不想谈恋爱." << endl;}system("pause");return 0;
}
形态 2:
#include <iostream>using namespace std;int main(void) {int salary;cout << "你月薪多少?" << endl;cin >> salary;if (salary < 20000) {cout << "你是一个好人, 我还不想谈恋爱." << endl;} else {cout << "我没有什么要求, 只要你对我好就行." << endl;}system("pause");return 0;
}
形态 3
#include <iostream>
#include <string>
#include <stdio.h>using namespace std;int main(void)
{int salary;string houseRet; //是否有房string carRet; //是否有车cout << "你的月薪是多少?" << endl;cin >> salary;cout << "你有房吗?" << endl;cin >> houseRet;cout << "你有车吗?" << endl;cin >> carRet;if (salary < 20000) {cout << "你是一个好人, 我现在还不想谈恋爱." << endl;} else if (houseRet == "有") {cout << "我其实没有什么要求,只要你对我好." << endl;} else if (carRet == "有") {cout << "还不错哦, 以后再联系." << endl;} else {cout << "有缘再见." << endl;}system("pause");return 0;
}
11.2项目精讲-if 语句的嵌套
实例:
求 3 个数的最大值。
#include <iostream>
#include <windows.h>using namespace std;int main(void) {int x, y, z;cout << "请输入 3 个整数: " << endl;cin >> x >> y >> z;if (x > y) {if (x > z) {cout << "最大值是: " << x << endl;} else {cout << "最大值是: " << z << endl;}} else {if (y > z) {cout << "最大值是: " << y << endl;} else {cout << "最大值是: " << z << endl;}}system("pause");return 0;
}
嵌套的常见错误(配对错误)
与前面最近的,而且还没有配对的 if 匹配
错误避免方法:
1)严格使用 { }
2)先写{}再写里面的内容
3)保持良好的“缩进”
第 12 节 项目精讲-switch 语句
12.1switch 的基本使用
语法:
switch (x) {case 表达式 1:语句 1break;case 表达式 2:语句 2break;case 表达式 3:语句 3break;default 表达式 1:语句 1break;
}
流程图:
demo
#include <iostream>
#include <windows.h>using namespace std;int main(void) {int num;cout << "请输入一个数字: ";cin >> num;switch (num) {case 1:cout << "星期一:包子" << endl;break;case 2:cout << "星期二:馒头" << endl;break;case 3:cout << "星期三:稀饭" << endl;break;case 4:cout << "星期四:白菜" << endl;break;case 5:cout << "星期五:土豆" << endl;break;case 6:case 7:cout << "周末:休息" << endl;break;default:cout << "请输入 1-7" << endl;break;}system("pause");return 0;
}
12.2switch 和 if 的选择
switch: 用于 int/char/long/long long 类型的变量,和多个特定常量的判断处理。
(float 和 double 类型不可以)
if: 适用于各种逻辑判断
第 13 节 项目精讲-常见错误总结
13.1switch 错误
以下错误,在 vs/vc 中有提示,但是仍可以通过编译。
在 gcc 编译器中,不能通过编译。
#include <stdio.h>int main(void) {int c;scanf("%d", &c);switch(c) {case 1:int x = 0; //错误!printf("c=1");break;case 2:printf("c=2");break;default:printf("other");break;}return 0;
}
应该修改为:
#include <stdio.h>int main(void) {int c;scanf("%d", &c);switch(c) {case 1:{int x = 0; //错误!printf("c=1");}break;case 2:printf("c=2");break;default:printf("other");break;}return 0;
}
13.2不安全函数(scanf 等)
#include <iostream>
#include <string>
#include <stdio.h>using namespace std;int main(void){int num;scanf("%d", &num);system("pause");return 0;
}
vs 中不能直接使用 scanf 等 C 标准库函数
因为 vs 使用更安全的 c11 标准, 认为这类函数不安全。
注明,这类函数正常使用时,是没有任何问题的
但是,部分黑客可能会利用其中的缺陷,开发恶意软件,对系统造成影响
解决方案:
1. 方法 1:使用修改项目的属性,直接使用这些“不安全”的函数。
添加: /D _CRT_SECURE_NO_WARNINGS
2. 方法 2:使用 c11 标准中的“更安全”的函数
scanf_s
gets 不能使用
使用 gets_s
gets 是老标准 C 语言函数,vs 使用更安全的 c11 标准, 使用对应的 gets_s
char line[32];
gets_s(line, sizeof(line));
scanf 不能使用
原因同上,改用 scanf_s
int x;
scanf_s("%d", &x); //不需要使用第 3 个参数,用法和 scanf 相同float f;
scanf_s("%f", &f); //不需要使用第 3 个参数, 用法和 scanf 相同char c;
scanf_s("%c", &c, sizeof(c)); //需要使用第 3 个参数, 否则有告警char name[16];
scanf_s("%s", name, sizeof(name)); //需要使用第 3 个参数int age;
char name[16];
scanf_s("%d%s", &age, name, sizeof(name));
13.3cin >> 的返回值
#include <iostream>
#include <string>
#include <Windows.h>using namespace std;int main(void) {string word;int count = 0;int length = 0;cout << "请输入任意多个单词:";while (1) {if ((cin >> word) == 0) { //在 vs 中不能通过编译break;}count++;length += word.length();}cout << "一共有" << count << "单词" << endl;cout << "总长度:" << length << endl;system("pause");return 0;
}
把 if ((cin >> word) == 0) 修改为:
if ((bool)(std::cin >> word) == 0) {
或者修改为:
if (!(cin >> word)) {
13.4getline 的返回值
#include <iostream>
#include <string>
#include <Windows.h>using namespace std;int main(void) {string line;int lineCount = 0;int length = 0;cout << "请输入任意多行:";while (1) {// 遇到文件结束符时, 返回 NULL(0)if (getline(cin, line) == 0) {break;}lineCount++;length += line.length();}cout << "一共有" << lineCount << "行" << endl;cout << "总长度: " << length << endl;system("pause");return 0;
}
测试代码:
string line;
int length = 0;getline(cin, line) >> length;
cout << "line=" << line << endl;
cout << "length=" << length << endl;
修改:
if (getline(cin, line) == 0) {
修改为:
if ((bool)getline(cin, line) == 0) {
或者修改为:
if (!getline(cin, line)) {
13.5if 语句后面误加分号
int age;cout << "请输入年龄: ";cin >> age;if (age > 40); {cout << "大叔" << endl;}
严格遵循代码规范,做到零警告。
以上代码在 VS 中编译时,会有警告 warning
第 14 节 英语不是障碍:计算机英语加油站
bool |
布尔 |
if |
如果 |
else |
否则 |
switch |
开关 |
case |
情况 |
default |
默认 |
第 15 节 编程思维修炼
代码对战(略)
Scratch 积木式编程:“灌篮高手”
演示演示
项目分析:
使用重力效果。
项目实现:
1. 选择背景 Wall
2. 给角色设置名称“乔丹猫”
3. 为“乔丹猫”创建表示速度的变量“垂直速度”
4. 让“乔丹猫”实现“重力降落”
5. 添加地平线
落到地平线后,“乔丹猫”就不再下降
6. 添加起跳代码
仅但乔丹猫在地平线上时,按下向上箭头键,才会起跳。
7. 让乔丹猫左右移动
8. 绘制篮筐
使用“矢量编辑模式”
并设置适当比例,比如 50。
命名为“篮筐”
9. 随机移动篮筐
10. 创建篮筐靶心
创建角色“靶心”,目的在于更方便的判断是否进球。
让靶心时刻跟随篮筐
把“虚像”特效设置为 100, 就能把靶心“隐藏”起来
11. 创建篮球
添加篮球角色,并命名为“篮球”
实现“乔丹猫”投篮
12. 投篮
为篮球添加以下代码:
当按下空格键,投篮:(先选中篮球,为篮球编辑代码)
13. 判断得分
分析:篮球在下降过程中遇到篮筐中心,才算得分。
篮球-垂直速度 < 0 时, 表示篮球在下降。
创建“进球”消息
创建得分变量“得分”
篮球的代码
靶心的代码:
14. 修改 BUG
投一次篮,得 2 分,甚至更多。
分析:在篮球一次跌落过程中,被循环监测多次。
第 16 节 职场修炼:怎样优雅地避免加班
996 工作制?
9-6-5
制定合理的项目计划
提高工作效率(要有一定的技术积累)
养成良好的工作习惯【不加班】
每天有目标的学习 1 小时以上
第 17 节 项目练习
17.1习题 1. 让用户输入一个字符, 然后进行转换:
如果是大写字母,就转换为小写字母
如果是小写字母,就转换为大写字母
如果是其它字符,不做任何转换。
#include <iostream>
#include <string>
#include <Windows.h>using namespace std;int main(void) {char c;cout << "请输入一个字符: " << endl;cin >> c;if (c >= 'a' && c <='z') {c = c - 'a' + 'A';} else if (c >= 'A' && c <= 'Z') {c = c - 'A' + 'a';}cout << c << endl;system("pause");return 0;
}
17.2习题 2. 让用户输入一个数字(0-9),然后输出对应的大写汉字。
注:零 壹 贰 叁 肆 伍 陆 柒 捌 玖
例如,用户输入 3, 输出“叁”
#include <iostream>
#include <string>
#include <Windows.h>using namespace std;//零 壹 贰 叁 肆 伍 陆 柒 捌 玖int main(void) {int num;string ret;cout << "请输入一个数字[0-9]: ";cin >> num;switch (num) {case 0:cout << "零";break;case 1:cout << "壹";break;case 2:cout << "贰";break;case 3:cout << "叁";break;case 4:cout << "肆";break;case 5:cout << "伍";break;case 6:cout << "陆";break;case 7:cout << "柒";break;case 8:cout << "捌";break;case 9:cout << "玖";break;default:break;}cout << endl;system("pause");return 0;
}
方法 2:
用空间换速度。
#include <iostream>
#include <string>
#include <Windows.h>using namespace std;int main(void) {int num;string ret[10] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌","玖"};cout << "请输入一个数字[0-9]: ";cin >> num;if (num >=0 && num <=9) {cout << ret[num] << endl;}system("pause");return 0;
}
17.3习题 3. 让用户输入年份和月份,然后输出这个月有多少天。
说明:
闰年的 2 月份有 29 天
普通闰年: 能被 4 整除但不能被 100 整除的年份为
世纪闰年: 能被 400 整除
#include <iostream>
#include <Windows.h>
#include <string>using namespace std;/*
闰年的 2 月份有 29 天
普通闰年: 能被 4 整除但不能被 100 整除的年份为
世纪闰年: 能被 400 整除
*/int main(void) {int year;int month;bool flag = false;int days;cout << "请输入年份:";cin >> year;cout << "请输入月份:";cin >> month;if (year % 400 == 0) {flag = true;} else if (year % 4 == 0 && year % 100 != 0) {flag = true;} else {flag = false;}switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:days = 31;break;case 2:days = flag ? 29 : 28;break;case 4:case 6:case 9:case 11:days = 30;break;default:std::cout << "无效月份" << std::endl;break;}cout << year << "年" << month << "月一共有:" << days << "天" << endl;system("pause");return 0;
}
第 18 节 程序员逼格提升:程序员的逼格神器-github
github 的重要性:
网络时代的程序员必备。
github 的作用:
1. 版本管理
2. 多人协作
3. 开源共享
常用方案:
git+TortoiseGit+github
[Tortoise,程序员常称其为小乌龟,小海龟]
安装配置步骤
1. 注册
使用邮箱: (例如:xxxxxxxx@qq.com)
密码需要至少包含一位小写字母,至少七位
在 step2 中,填写个人描述信息,可以直接点击 submit.
2. 在本地安装 git
3. 安装 tortoisegit
4. 配置 git 配置的账号
文件:.gitconf
[filter "lfs"]clean = git-lfs clean -- %fsmudge = git-lfs smudge -- %fprocess = git-lfs filter-processrequired = true
[user]name = xxxxemail = xxxxxx@qq.com
5. 在 github 创建仓库
6. 把 github 的仓库 clone【克隆】到本地
本地目录一定要为空
7. 在这个本地目录下, 创建 vs 项目。
8. commit【提交】到本地仓库
9. push【推】到 github 仓库
如果没有弹出框来输入密码, 这在 git 终端上输入:
git credential-manager uninstall
用来清除掉缓存在 git 中的用户名和密码
为看书困难的小伙伴推荐视频教程:百度网盘 提取码:r59a
零基础学习C++系列课程(五) 持续更新中相关推荐
- 零基础学习C++系列课程(一) 持续更新中
目录 第 1 节:课程目标 项目 1:C++基础编程-黑客攻击系统(含 6 个子项目) 项目 2:C++基础编程-人工智能之地形导航系统 项目 3:C++基础编程-人工智能之双色球预测系统 项目 4: ...
- 零基础学习C++系列课程(三) 持续更新中
目录 项目二.黑客攻击系统-输入账号 第 1 节 项目需求 第 2 节 项目实现 第 3 节 项目精讲 3.1 C++的数据类型 3.2 构建 IT 大厦的砖块:变量 3.3 用于计数的整数类型 3. ...
- 视频教程-零基础JS入门系列课程(2)之JS语法基础精讲-JavaScript
零基础JS入门系列课程(2)之JS语法基础精讲 螺钉课堂讲师,擅长Vue.React.ReactNative.NodeJS等前端框架及技术 邓老师 ¥59.00 立即订阅 扫码下载「CSDN程序员学院 ...
- C++学习笔记目录链接(持续更新中)
学习目标: C++学习笔记目录链接(持续更新中,未完待续) 学习内容: 序号 链接 0 C++ 常见bug记录(持续记录中) 1 C++学习笔记1[数据类型] 2 C++学习笔记2[表达式与语句] 3 ...
- Ambari源码二次开发实战课程(持续更新中)
如果大家想基于 ambari 开发一套自己的大数据平台,那么 ambari 二次开发的相关知识就必须具备.比如:ambari 整体编译,ambrai 汉化,ambari 页面开发,ambari api ...
- YOLO 3/4/5/6/7/x、Efficient、MaskRcnn、FasterRcnn、FCOS、SSD、M2Det、Retina、CenterNet、PicoDet等系列数据模型汇总持续更新中
做了很长时间的CV领域的任务了,见到了很多不错的项目,很多时候也是会选择直接拿来开源的项目去使用,自己也做过了很多项目,后面就萌生了一个想法,将看到的不错的文章或者是数据集或者是项目汇总记录一下,以便 ...
- 零基础学习网页制作(五)
郑重声明: 1.所谓的零基础并不是真的零基础,首先你会用电脑的一些简单操作,如:新建一个文本文档(txt): 2.文章仅供本人娱乐,如有雷同,纯属巧合: 3.文章的目的还有一个,告诉一些不懂写代码的人 ...
- 图谱(学习地图)系列总结,持续更新中
目录 1.2022年最新前端学习路线图 2.2022年最新大数据学习路线图 3.2022年最新javaEE学习路线图 4.2022年最新UI/UE学习路线图 5.2022年java学习路线指南 6.J ...
- 技术文章系列汇总(持续更新中)并附博客上树状列表源代码
系统架构系列 在多台服务器上简单实现Redis的数据主从复制 利用Nginx做负载均衡 软件设计系列 项目分析 [项目分析]ASP.NET MVC路由匹配检测组件的代码分析 [项目分析]保持你的网站激 ...
最新文章
- CloudStats :一款SaaS 服务器监控工具
- 产品打包工具的制作,ant,编译源码,打jar包,打tag,打war包,备份release版本等
- 如果编程替换成中文就会怎样? 程序员看了表示头疼
- BZOJ3884上帝与集合的正确用法-欧拉函数
- type或者xtype总结
- fgetcsv php,PHP - fgetcsv - 分隔符被忽略?
- jenkins远程构建job_jenkins分布式构建job
- Qt学习之路3---Qt中的坐标系统
- MATLAB的cat()函数
- 解决Linux系统下磁盘IO紧张的一种方法
- 欧拉函数计算公式的推导
- 利用gpu加速神经网络算法,为什么用gpu 模型训练
- 处世36计之第17计--恐吓计
- 在这个项目的心得体会和经验教训
- java freemarker导出word 带图片,文件导出后图片无法使用office正常打开
- LOG高斯-拉普拉斯算子
- ESP32 TM1637显示4位数码管
- 第五届蓝桥杯C/C++本科B组(真题试做)(1~5)
- 【obs】项目构建环境
- 史上最全的Git使用手册
热门文章
- idea字体设置--主题下载推荐及使用
- #DeepLearningBook#算法概览之八:Representation Learning
- 24岁了,做个精致的电子工程师--剑雨琴侠
- python之组合数据
- 未来有巨大潜力的四类垂直电商模式
- java垃圾回收器之跟搜索算法
- 苹果发布Apple Watch 5手表,是否值得购买?这真的要看个人!!!
- python(3.9.7)的字典(全面、细致)
- 51单片机 ret和reti
- Windows 7 + SQL Server 2005 + Visual Studio 2008 安装过程体验