【题目】输入一行字符,统计其中有多少个单词,每两个单词之间以空格隔开。如输入: This is a c++ program. 输出:There are 5 words in the line.
【本讲结构】
(一)讲解视频
(二)相关习题
(三)视频中的代码
(四)其他写法的代码
【正文】
(一)讲解视频(点下面的图标)
针对一个刚读入的符号如何判断?
- 读下一个符号ch;
- 如果ch是空格,表示现在不构成单词,什么操作都不做,继续读下一个符号ch;
- 如果ch不是空格
- 如果,在此之前读到的不是单词,则现在是读单词的开始,单词数增1
- 如果,在此之前正在读单词,现在的符号不构成新单词,继续读符号;
(二)相关习题
1. 输入一行字符构成的英文句子,分离出其中的每一个单词。【提示:(1)将正在分离出的单词存放到数组中,分离一个输出一个;或(2)将分离出的单词存入一个二维数组,完全处理完后再输出。】
2. 输入一行字符,统计其中有多少个单词。每两个单词之间以空格(可能多个)隔开,或者由标点符号(只考虑 , . ; ? !共5种)隔开。 如输入: How old are your? I am 20. 输出:There are 7 words in the line.
3. 所谓规范的文本是指:行首的第一个字符不能是空格;两个单词间只能有1个空格且必须有1个空格;标点符号前面是单词中的最后一个字母,后面有且只能有一个空格。
题目要求:输入一行字符,将其整理为规范的文本并输出。标点符号只考虑 , . ; ? !共5种。
如输入:“ How old are your? I am 20.It is too old. ”输出::“How old are your? I am 20. It is too old.”
处理后结果解读:即要求输出的文本开头无前导空格,两个单词间如果有多个空格时只保留1个,标点符号后没有空格时,要加上1个。
提示:可以设置另一个字符数组,逐个检查输入的字符数组,保留的字符复制过去,多余的空格不复制,增加需要补充的空格。当然也可以直接在原字符数组上做。
(三)视频中的代码
初始的程序:
#include <iostream>
using namespace std;
int main()
{
char str[81],ch;
int i=0,num=0;
bool isWord=false;
gets(str);
ch=str[i];
while(ch!='\0')
{
if (ch==' ') isWord=false;
else if (isWord==false)
isWord=true,num++;
++i;
ch=str[i];
}
cout<<"there are "<<num<<" words in the line"<<endl;
return 0;
}
不用ch变量的写法,这在C++中很常见:
#include <iostream>
using namespace std;
int main()
{
char str[81],ch;
int i=0,num=0;
bool isWord=false;
gets(str);
ch=str[i];
while(str[i]!='\0')
{
if (str[i]==' ') isWord=false;
else if (isWord==false)
{
isWord=true;
num++;
}
++i;
}
cout<<"there are "<<num<<" words in the line"<<endl;
return 0;
}
(四)其他写法的代码
#include <iostream>
using namespace std;
void main()
{
char string[81];
int i,num=0,word=0;
gets(string);
for(i=0;(string[i]!='\0');i++) //for循环中的结束条件
if (string[i]==' ') word=0; //word=0相当于上面的isWord=false,实际是用整型代替布尔型。用布尔型更清晰些,但用整型对C++程序员也不见怪
else if (word==0) //word==0可换为!word,C++程序员要适应这种写法
word=1,num++;
cout<<"there are "<<num<<" words in the line"<<endl;
}