第6章 分支语句和逻辑操作符
6.3 字符库函数 cctype
6.4 ? : 操作符
6.5 switch 语句
6.6 break 和 continue 语句
这一节真的真的很重要,因为有的时候我们的程序到这个地方就该结束了,或者说程序的出口不止一个。之前有在递归等章节写过break; 这里再来仔细的整理一下。
我是这么记得:break就是不做了,所以就跳出当前的循环,执行循环体外的下一条语句。continue还是要做,这是这次的不做了,进行下一趟循环。
还有一点要注意,无论是break还是continue的跳出,针对的都是循环体(for/while) 而不是 条件语句(if/else)。
6.7 读取数字的循环
#include <iostream>
using namespace std;
int main()
{
int a[10];
int i = 0;
while(cin>>a[i] && i < 10)
{
i++;
}
cin.clear();
cin.ignore();
cin>>a[i++];
for(int num = 0;num < i;num++)
{
cout<<a[num]<<"\t";
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int a[10];
int i = 0;
cin>>a[i];
while(i < 10)
{
i++;
cin>>a[i];
if(a[i] == '\0')
{
cin.clear();
cin.ignore();
i--;
}
}
for(int j = 0;j < i;j++)
{
cout<<a[j]<<"\t";
}
return 0;
}
当我们仅通过while循环来输入数据时,一旦遇到输入一个非数字型数据,那么此时输入队列中的最后一个位置(即字符位置),值为0(false),那么其后想向其中输入数据是不可能的,可以通过clear()清除错误标志,并用ignore()来忽略这个符号位,以此来将输入队列后面的内容赋值给接下来的位置(即原符号位)。
#include <iostream>
using namespace std;
int main()
{
const int num = 5;
int a[num];
int i = 0;
cin>>a[i];
while(i < 5)
{
if(a[i] == '\0')
{
cin.clear();
cin.ignore();
i--;
cout<<"Please input a number: "<<endl;
}
i++;
cin>>a[i];
}
for(int j = 0;j < i;j++)
{
cout<<a[j]<<"\t";
}
return 0;
}
书上代码:
之所以选择粘出书上的代码,是因为有个地方可以学习一下:1. 用 while 循环结合 continue,来循环,如果不满足就跳出,这就对于多个字符输入是有益的,cin队列里的数字会被顺换取出,如果是字符就被处理掉,然后再输出一句:请输入一个数字(提示)。我的代码就有问题,比如输入两个字符,就会导致两次输出提示。。。
6.8 简单文件输入/输出
无关痛痒的话:不知道你现在遇到 / \ 是不是也得转个弯。(✿◡‿◡)
6.8.1 文本 I/O 和文本文件
6.8.2 写入到文本文件中
代码中几个点整理一下:
1. 整体的使用流程是:包含头文件:fstream -》创建ofstream对象 -》建立关联:outFile.open("XXX.txt"); -》具体的操作,比如输入啊计算之类的 -》可以通过outFile对象将文件内的东西读出来,使用方法与cout相同 -》关闭关联:outFile.close();
2. 声明一个ofstream对象后,便可以使用方法 open() 来将该对象同一个特定的文件关联起来
3. 使用完一个文件后,应该将其关闭:outFile.close(),注意,方法close()不需要使用文件名作为参数,这是因为outFile已经同特定的文件关联起来了,如果您忘记关闭文件,程序正常终止时将自动关闭它。
4. outFile(ofstream创建的对象)可以使用cout可使用的任何方法,也可以使用各种格式化方法,如setf()和precision(),但是它不能使用操作符<<
5.
6.8.3 读取文本文件
6.10 复习题
答:第二种统计的个数不对鸭,走的路径不一样。
由这个题联想了三个题,自己来练习一下:
- 1. 统计一个输入的字符串中,单词的个数
- 2. 统计一个输入的字符串中,空格的个数
- 3. 统计一个输入的字符串中,换行符的个数
首先来解决这几个问题,然后再回看之前的问题,嘿嘿~
1. 因为cin可以提取的单位是单词,所以可以用cin来解决这个问题,不过下面的程序只能通过Ctrl+Z结束。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int num = 0;
while(cin>>str)
{
num++;
}
cout<<num;
return 0;
}
2.3. 统计空格和换行符 ‘\n’ 使用cin显然不合适,所以可以用cin.get(ch)函数来获得当前输入的字符,已统计数量。
#include <iostream>
using namespace std;
int main()
{
char charr;
int num = 0;
int newlines = 0;
while(cin.get(charr) && charr != '\n')
{
if(charr == ' ')
{
num++;
}
}
cout<<num<<"\t"<<newlines;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
char charr;
int num = 0;
int newlines = 0;
while(cin.get(charr))
{
if(charr == ' ')
{
num++;
}
if(charr == '\n')
{
newlines++;
}
}
cout<<num<<"\t"<<newlines;
return 0;
}
答:ch+1,ch的值本身不会改变;++ch会让ch的值+1。
答:我看不懂→前面是不是有个空格,我就按有算了哈:思路ct1统计了循环执行的次数,整个cin队列一共有27个字符,ch = cin.get()就是从队列中逐一取字符,如果不等于 '$',那么就可以继续进行循环体内的内容,所以我的答案是:9 0。
嗯。。。自古套路得人心,这是个什么题:
答:a. weight >= 115 && weight <125
b. ch == q || ch == Q
c. x % 2 == 0 && x != 26
d. x % 2 == 0 && x % 26 != 0
e. donation >= 1000 || donation <= 2000 || guest == 1
f. (ch >= 'a' && ch <<'z') || (ch >= 'A' && ch <= 'Z')
答:不相同。x=6 -》!x = 0 -》!!x = 1
首先回忆一下求绝对值的函数abs,头文件是stdlib.h,不过只能求整型数的绝对值,不同类型针对的求绝对值的函数也是不同的。
#include <iostream>
#include <stdlib.h> //abs(int a);函数的头文件
/*
int abs(int x)返回整型参数i的绝对值
double cabs(struct complex znum) 返回复数znum的绝对值
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
*/
using namespace std;
int main()
{
int a = -2;
a = abs(a);
cout<<a;
return 0;
}
再回到题上就很简单了:
#include <iostream>
using namespace std;
int main()
{
int x;
cin>>x;
x = x > 0 ? x : -x;
cout<<x;
return 0;
}
当然这里没有用到绝对值函数而是使用了唯一的一个三目表达式来处理滴。如果 x > 0,则整个表达式的值为x的值,然后赋值给x;否则,整个表达式的值为-x的值,然后赋值给x。