一、基础语法
1.1、数据类型
1)整型:也就是整数的类型
数据类型 | 关键字 | 大小 |
---|---|---|
短整型 | short | 2byte |
整型 | int | 4byte |
长整型 | long | win下4byte,其它8byte |
长长整型 | long long | 8byte |
# include <iostream>
int main(){
//sizeof 获取一个数据类型或者变量的空间占用大小
std::cout << "short:"<<sizeof(short) << std::endl;
std::cout << "int:" << sizeof(int) << std::endl;
return 0;
}
2)浮点型:小数类型
数据类型 | 关键字 | 大小 |
---|---|---|
单精度类型(小数点后7位) | float | 4byte |
双精度类型(小数点后15位) | double | 8byte |
3)布尔类型:描述真和假,关键字bool,只占用一个字节,有两个值true和false
4)字符型:描述文本类型最小的组成单位,关键字char,只占用一个字节
5)字符串类型:由若干个字符组成,关键字string
1.2、变量和常量
1)变量:可以修改的值----在使用之前要进行赋值
# include <iostream>
int main(){
// 变量的定义语法:变量类型 变量名
int num;
// 定义变量的同时赋初值
float num2 = 1.2f;
// 变量的值可以进行修改
num = 23;
// 定义多个相同类型的变量,并初始化
int num3 = 100,num4 = 200;
// 定义字符变量
char ch = 'a'
std::cout << "ch=" << ch << std::endl;
// 定义字符串类型
std::string m = "rgds";
return 0;
}
2)常量:不可以修改的值,定义常量时使用关键字const,常量名一般大写,在定义时就要进行赋值
# include <iostream>
int mian(){
// 定义常量,使用关键字const
const int NUM = 10;
std::cout << "NUM的值为:" << NUM << std::endl;
return 0;
}
1.3、类型转换
1)自动类型转换:
由取值范围小的数据类型,向取值范围大的数据类型转换,转换的过程不需要进行额外的操作,直接赋值就可以,不存在精度丢失问题
# include <iostream>
int main(){
// 定义一个short类型的变量
short num1 = 12;
// 转为int类型,直接赋值给int类型的变量即可
int num2 = num1;
return 0;
}
注意:byte,short,char类型的数据参与运算的时候,结果会自动提示为int类型
2)强制类型转换:
由取值范围大的数据类型,向取值范围小的数据类型转换,转换的过程需要进行强制类型转换操作,转换完成后可能会存在精度丢失问题
# include <iostream>
int main(){
// 强制类型转换---将取值范围大的float类型转为int类型
int a = (int)12.34;
}
1.4、键盘录入
# include <iostream>
int main(){
// 定义变量接收键盘输入的整数
int n1 = 0;
std::cout << "请输入有个整数:";
// 键盘录入
std::cin >> n1;
std::cout << "你输入的值为:" << n1 << std::endl;
// 定义字符串
std::string str = "";
std::cout << "请输入字符串:";
std::cin >> str;
std::cout << "你输入的字符串为:" << str << std::endl;
}
忽略缓冲区中的内容,默认忽略一位
// 不指定忽略位数,默认一位
std::cin.ignore()
// 忽略两位
std::cin.ignore(2)
// 忽略缓冲区中没有读走的全部数据
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
错误处理:cin内部会维护一个状态,来记录本次的读取操作是否正常,注意如果标记为fail状态,程序会停止,影响下次输入,使用清空缓冲区的方法解决
// cin.good()---为1表示成功
int good = std::cin.good()
// cin.fail()---为1表示失败
int fail = std:cin.fail()
// cin.clear()---恢复状态---再此之后一般跟上清空缓冲区的语句
std::cin.clear()
1.5、宏定义
宏定义就是在文件的头部使用关键字#define来定义的标识符,程序中用到这个宏定义的时候就会替换成相应的值
# include <iostream>
// 宏定义
#define SUCCESS 1
#define EE (2+2)
#define SE 2+2
int main(){
// 使用宏定义输出4*4的结果
std::cout << EE * EE << std::endl;
// 使用宏定义计算出8
std::cout << SE *SE << std::endl;
// 这里使用宏定义,SUCCESS会被替换成1,相当于返回1
return SUCCESS
}
1.6、命名空间
命名空间就是解决命名冲突的问题,使用关键字namespace可以更好的控制标识符的作用域
// 格式:namespace 名称{命名的语句}
# include <iostream>
// 定义一个命名空间
namespace a {
int num = 10;
// 命名空间可以嵌套
namespace aa {
int num = 20;
}
}
namespace c {
int num = 100;
}
int main(){
// 使用命名空间的变量
std::cout << a::num << std::endl;
// 使用嵌套的
std::cout << a::aa::num << std:endl;
namespace b {
int num = 50;
}
}
// 命名空间是开放的,可以随时添加新成员
namespace b{
int name = '张三'
}
使用命名空间中的变量是,需要命名空间名称调用
// 使用命名空间中的变量
命名空间名称::变量名
std::cout << 命名空间名称::变量名 << std::endl;
// 嵌套命名空间变量的使用
外层名称::内层名称::变量名
std::cout << 外层名称::内层名称::变量名 << std::endl;
优化命名空间中变量的使用格式,使用using关键字
// 指定命名空间中的具体成员
using 命名空间名称::具体成员;
std::cout << 成员名称 << std::endl;
// 指定命名空间中的所有成员
using namespace 命名空间名;
std::cout << 直接使用指定命名空间中的所有成员名 << std::endl;
注意:当多个命名空间中有相同名称的变量时,使用using简化后直接使用名称,会出现二义性,这种现象使用常规引用
1.7、运算符
1)算数运算符,赋值运算符,关系运算符,逻辑运算符,位运算符,三目运算,都与java中的运算符相同
1.8、随机数
1)产生随机数:
//随机数格式:
int random = rand() % n -- 表示产生0-(n-1)之间的随机数
2)设置种子数:
//设置种子数,使产生的随机数不一样
srand((unsigned int)time(NULL)); -- 使用到的time函数需要导入ctime包
二、流程控制
2.1、if-else语句
注意:如果大括号中只有一条语句,大括号可以省略
1)if基础语法
if (判断条件){
条件成立执行的语句;
}
2)if-else语句
if (判断条件){
条件成立执行的语句;
}else{
条件不成立执行的代码;
}
3)else if语句
if (判断条件1){
条件1成立执行的代码;
}else if(判断条件2){
条件2成立的代码;
}else{
都不成立执行的代码;
}
2.2、switch语句
switch语句检查某一个变量,从上往下依次和case后面的语句进行校验,case语句中的值必须为常量值,不能是一个范围值
# include <iostream>
using namespace std;
int main(){
int num = 0;
cout << "请输入数字:" << endl;
cin >> num;
switch(num){
case 1:
cout << "春暖花开" << endl;
break;
case 2:
cout << "夏季" << endl;
break;
case 3:
cout << "秋高气爽" << endl;
break;
case 4:
cout << "冬天" << endl;
break;
default:
cout << "输入错误!" << endl;
break;
}
}
switch语句的穿透性:没有break后从匹配的case语句后面依次向下执行,直到遇到break停止,计算天数的时候,利用穿透的性质可以依次加入下一月份的天数
int main(){
int year = 0,mounth = 0,day = 0;
cout << "请输入年:";
cin >> year;
cout << "请输入月:";
cin >> mounth;
cout << "请输入天数:";
cin >> day;
int days = day;
switch(mounth){
case 12:
days = day + 31; // 计算12月的天数和11月的天数
case 11:
days = day + 30; // 计算11月的天数和10月的天数
case 10:
days += 31; // 计算10月份的天数和9月的天数
case 9:
days += 30; // 计算9月的天数和8月的天数
case 8:
days += 31; // 计算8月的天数和7月的天数
case 7:
days += 30; // 计算7月的天数和6月的天数
case 6:
days += 31; // 计算6月的天数和5月的天数
case 5:
days += 30; // 计算5月的天数和4月的天数
case 4:
days += 31; // 计算4月的天数的3月的天数
case 3:
if (year%4==0&&year%100!=0||year%400==0){
days += 29;
}else{
days += 28;
}
case 2:
days += 30;
default:
cout << "输入错误!" << endl;
}
cout << year << "年" << mounth << "月" << day << "天是这一年的:" << days << "天" << endl;
}
2.3、循环结构
1)while循环:
// 格式:
while(判断条件){
循环体;
}
-
while循环本身没有循环变量的声明和初始化的组成部分,如果需要变量,需要在循环开始前进行声明,并赋值
-
while循环本身也没有控制循环的终止条件,需要在循环体中添加控制语句,否则会出现死循环
注意:cin.fail()判断键盘输入的是否正确,cin.clear()情况输入错误的状态cin.ignore(numeric_limits<streamsize>::max(),'\n')清空一整行缓存
int mian(){
int num;
cin >> num;
// 循环判断输入是否正确
while(cin.fail()){
// 如果不正确,先清空错误状态,在清空缓存,在重新输入
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cin >> num;
}
return 0;
}
2)do-while循环:
先执行一次循环体,在判断条件是否成立,do-while循环的循环体一定会执行一次
// 格式:
do{
循环体;
}while(条件判断);
3)for循环:
小括号中的语句之间使用分号分隔
// 格式:
for(循环起点;循环条件;条件控制语句){
循环体;
}
注意:sstream包中的ostringstream定义的变量可以进行拼接
# include <iostream>
# include <sstream>
using namespace std;
int main(){
// 定义两个变量统计个数
int num1 = 0, num2 = 0;
//定义两个ostringstream类型的变量拼接满足条件的结果
ostringstream strnum1,strnum2;
const char *str = "12hii3koj";
int len = strlen(str);
for (int i = 0; i < len; ++i) {
if('a' <= str[i] && 'z' >= str[i]){
num1++;
strnum1 << str[i];
}
if('0' <= str[i] && '9' >= str[i]){
num2++;
strnum2 << str[i];
}
}
cout << "数字个数:" << num2 << endl;
cout << "数字分别是:" << strnum2.str() << endl;
cout << "字母个数:" << num1 << endl;
cout << "字母分别是:" << strnum1.str() << endl;
return 0;
}# include <iostream>
# include <sstream>
using namespace std;
int main(){
// 定义两个变量统计个数
int num1 = 0, num2 = 0;
//定义两个ostringstream类型的变量拼接满足条件的结果
ostringstream strnum1,strnum2;
const char *str = "12hii3koj";
int len = strlen(str);
for (int i = 0; i < len; ++i) {
if('a' <= str[i] && 'z' >= str[i]){
num1++;
strnum1 << str[i];
}
if('0' <= str[i] && '9' >= str[i]){
num2++;
strnum2 << str[i];
}
}
cout << "数字个数:" << num2 << endl;
cout << "数字分别是:" << strnum2.str() << endl;
cout << "字母个数:" << num1 << endl;
cout << "字母分别是:" << strnum1.str() << endl;
return 0;
}
2.4、流程控制关键字
1)break:
用于终止某一个程序快的执行,在循环中break表示跳出当前的循环,switch中表示跳出switch语句
2)continue:
只能用在循环语句中,表示终止本次循环,开始下一次循环
3)goto:
在程序中可以设置指定的标签,goto语句可以跳转到指定标签的位置,继续执行,标签必须为合法的标识符
2.5、嵌套循环
在循环中嵌套循环,内层循环和外层循环
1)九九乘法表:
for循环实现:
int main(){
for(int i = 1; i<=9;i++){
for (int j = 1; j <= i; ++j) {
cout << j << "*" << i << "=" << (i*j) << '\t';
}
cout << endl;
}
return 0;
}
while循环实现:
int main(){
int i = 1,j;
while(i<=9){
j = 1;
while(j<=i){
cout << j << "*" << i << "=" << (i*j) << '\t';
j++;
}
cout << endl;
i++;
}
return 0;
}