for语句
for (循环变量赋初始值;循环条件;更新循环变量) {
循环体
}
- 语法解析
- 循环变量:用于控制循环的变量,一般在循环条件中使用
比如:循环变量可以是在存钱100天这个例子中的天数
for循环的执行逻辑:
- 首先会给循环变量赋一个初始值
- 然后判断是否满足循环条件
- 如果不满足,直接跳出循环;
- 如果满足,执行循环体,更新循环变量,再跳回去重新判断是否满足循环条件。
比如:输出存款总数,天数加1,再跳回去看看现在是不是依然满足循环条件
使用for循环时,【循环变量赋初始值】,【循环条件】,【更新循环变量】这三个表达式都可以省略,变为 for ( ; ; ) ,这表示不用给循环变量赋初始值,也不用在每次执行后更新循环变量,同时循环的条件始终为真,也就是说每次都会选择进入循环体。
- 如果循环体只有一句话,可以不用大括号括起来
- 循环控制语句 break
除了正常的循环之外,循环控制语句可以更改程序执行的正常序列。循环控制语句常用的是 break 和 continue。
‘’break只能在循环体和switch语句中使用‘’
- break 用法
在switch语句中也有用到过,用于停止执行模块内后面的程序语句
通常放在循环体中,当执行到这句语句时,跳出整个循环,也就是说整个循环立即终止
- 循环控制语句 continue
另一个常用的循环控制语句是 continue。
- continue 用法
通常也是放在循环体中,当执行到这句语句时,跳过当前循环体,强迫进入下一次循环
举例
int savings = 0;
for (int i=1; i<=100; i++) {
// 如果天数是10的倍数,直接进入下一天
if (i % 10 == 0)
continue;
savings = savings + 1;
cout << i << ":总数" << savings << endl;
}
说明:
假设如果天数是10的倍数(第10、20、30、…天),那么那天迷你键可以不存钱,也不输出存款总量。他可以用continue来跳过这几次循环
输出21世纪(2001年1月1日至2100年12月31日的这一段期间称为21世纪)中截止某个年份以来的所有闰年年份。
注意:闰年的判别条件是该年年份能被4整除但不能被100整除,或者能被400整除。
- 输入描述:
输入在一行中给出21世纪的某个截止年份。
- 输出描述:
逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出**“Invalid year!”。若不存在任何闰年,则输出“None”**。
#include <bits/stdc++.h>
using namespace std;
int year;
int b=0;
int main() {
// 请补全代码,实现题目功能
cin>>year;
//判断在不在21世纪范围
if(year>=2100 || year<=2001){
cout<<"Invalid year!";
}
//在21世纪范围
else{
for(int i=2001;i<=year;i++){
//判断闰年
if(((i%4==0) && (i%100!=0)) || (i%400==0)){
cout<<i<<endl;
b +=1;
}
}
//如果计数为0证明,这个范围内没有闰年
if(b==0){
cout<<"None";
}
}
return 0;
}
while语句
while (循环成立条件) {
循环体
}
do {
循环体
} while (循环成立条件);
- do while 执行逻辑
和while类似
唯一的区别在于: 因为条件表达式出现在循环的尾部,do–while所以至少会执行一次循环体,执行完成后,再判断是否进入下一次循环。
- 猜数字游戏
#include <iostream>
using namespace std;
int main() {
// 声明生成的随机数字和猜的数字这两个变量
int num, guess;
// 提供随机种子
srand((unsigned)time(NULL));
// 随机生成一个1-100的数字
num = rand() % 100 + 1;
// TODO 先进入循环,如果猜的数字和生成的数字不相同就再次进入循环
do {
// TODO 输入猜测的数字
cin>>guess;
// 输出猜大了还是猜小了
if (guess > num)
cout << "猜大了" << endl;
else if (guess < num)
cout << "猜小了" << endl;
} while(guess!=num);
// 当猜的数字和生成的数字相同时,跳出循环后,输出“猜对了”
cout << "猜对了" << endl;
数组
int sales[6] = {0};
cin >> sales[0];
scanf("%i", &sales[1]);
cout << sales_4[0];
printf("%i", sales[1]);
Tips:在 C++ 中,‘a’ 和 “a” 是不一样的,前者是一个字符常量,在内存中占 11 字节,后者是一个字符串,占 22 字节的空间,第 11 个字节储存了字母 a 的内码值,第二个字节储存了 ‘\0’。
字符串数组
- 举例:char userName[11]
就可以声明一个名字叫userName的字符数组型字符串,这个数组最多能存放一个长度为10的字符串。
// 第一种:给每个元素指定初始化值
// 依次赋初值,剩下的会默认被初始化为\0
char userName[11] = {'L', 'a', 'o', 'W', 'a', 'n', 'g', '\0'};
char userName[11] = {'L', 'a', 'o', 'W', 'a', 'n', 'g'};
// 和普通数组一样,元素个数可以省略,c++会自动识别长度为8
char userName[] = {'L', 'a', 'o', 'W', 'a', 'n', 'g', '\0'};
//第二种:使用字符串常量初始化字符数组
char userName[11] = {"LaoWang"};
// 大括号可以省略
char userName[11] = "LaoWang";
- 字符数组的输入输出
字符数组可以进行逐个字符的输入输出,这种做法和普通的数组操作一样,分为以下两种方式:
- 将整个字符串一次性地用对象 cin 和 cout 的 >> 和 << 操作完成输入或输出。
- 通过 cin 的成员函数 get 或 getline 输入。
**
- 方式一:使用 cin 和 cout
**
对于字符数组 userName,输入一个字符串到数组中,可以使用语句:
cin >> ch;
输入的时候,使用cin语句,会不断的读入字符串,直到遇到一个空白字符(空格、回车或者制表符)就结束读入
用cin向计算机输入一串字符时,输入的字符的数量应该少于已定义的字符数组的长度,否则会出现问题
如果输入的字符的数量 小于 字符数组长度时,剩下的部分会默认补上’\0’
- 方式二:用 scanf printf 也可以输入输出字符串,有以下一些需要注意的点:
字符的输入用 scanf("%c", &变量名),而输入一个字符串用 scanf("%s", 数组名)
scanf("%s", userName);
- 字符数组型字符串的常用操作
字符串不能用系统的内置运算符进行操作,C++语言设计了一个 cstring 库,提供了一些用来处理字符串的函数。
- 连接字符串
使用 strcat(s1, s2) 函数可以把字符串 s2 连接到 s1 的末尾。
- 获取字符串长度
使用 strlen(s1) 函数可以返回字符串 s1 的有效字符数。比如"yes"的长度就是3。
- 比较字符串的字典序
使用 strcmp(s1, s2) 函数可以比较两个字符串之间的字典序:如果 s1和 s2是相同的,会返回0;如果s1的字典序在 s2前面,则返回值会小于0;如果s1的字典序在 s2后面,则返回值会大于0。
- 复制字符串
使用 strcpy(s1, s2) 函数可以复制字符串 s2 到字符串 s1。如果 s2 比 s1 短,那么 s1 这个数组后面没被覆盖的部分不会改变。比如 s1存的是 {q, w, e, r, \0}, s2存的是 {a, s, \0},那么使用 strcpy(s1, s2)后,s1前五位应该是{a, s, \0, r, \0}。
string类型
- string 类型的基本操作
字符数组型字符串是把字符串当作一个元素为字符的一维数组,而 string 类型是直接把字符串当作一个整体,可以像整型变量、字符变量一样使用。
- string 类型的用法有以下一些注意点:
- 头文件
- 首先需要加载 string 类型所在的头文件。
"# include < string >
- 声明和初始化
- 输入输出
string 类型的字符串一般直接通过cin和cout进行输入输出。
输入的时候,使用cin语句,会不断的读入字符串,直到遇到一个空白字符(空格、回车或者制表符)就结束读入
输出的时候,从字符串中第一个字符开始输出,直到遇到 ‘\0’(不会输出 ‘\0’)
string 类型的常用操作
对于string 类型的字符串,官方提供了一些字符数组型字符串常用处理函数,可以对字符数组型的字符串进行一些常规操作。本节选取抽取一些常用操作,和字符数组型字符串对照讲解一下:
- 连接字符串
字符数组型字符串会使用 strcat(s1, s2) 函数把字符串 s2 连接到 s1 的末尾。
string 类型可以直接使用s1 + s2 连接两个字符串。
- 获取字符串长度
字符数组型字符串会使用 strlen(s1) 函数返回字符串 s1 的字符数。
string 类型可以直接使用 s1.size() 或者 s1.length() 返回字符串 s1 的字符数。
- 比较字符串的字典序
字符数组型字符串会使用 strcmp(s1, s2) 函数比较两个字符串之间的字典序:
如果s1和s2是 相同 的,会返回0
如果s1在s2 前面 ,则返回值会小于0
如果s1在s2 后面,则返回值会大于0
string 类型可以直接使用 关系运算符 来比较两个字符的字典序:
如果s1 < s2为1(真),就表示s1的字典序在 s2前面
如果s1 < s2为0(假),就表示s1的字典序不在 s2前面
- 复制字符串
字符数组型字符串使用 strcpy(s1, s2) 函数复制字符串 s2到字符串 s1。
string 类型可以直接使用赋值表达式 s1 = s2来复制字符串 s2到字符串 s1。
举例:小六在处理平台上的新老用户名,并且尝试做了一些操作:
string userName_old = "LaoWang";
string userName_new = "Liu";
string str;
int len;
// 连接小六的新老用户名,并赋值给str
str = userName_old + userName_new;
cout << userName_old << " + " << userName_new << " = " << str << endl;
// 输出连接后str的总长度
cout << "str length: " << str.size() << endl;
cout << "str length: " << str.length() << endl;
// 比较新老用户名的字典序
cout << (userName_old > userName_new) << endl;
// 再把老用户名赋给str
str = userName_old;
cout << "str : " << str << endl;
第一张
第二张
第三张