输入一行字符,统计其中有多少个a,单词之间用空格隔开,如果a连续出现,则算一个。

纯属借口 2013-11-17 12:32:45
输入一行字符,统计其中有多少个a,单词之间用空格隔开,如果a连续出现,则算一个。用数组的知识!
怎么编程??高手教下。。。。谢谢了
...全文
1215 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
WizardOz 2013-11-18
  • 打赏
  • 举报
回复
我最不理解题目中那些“用数组”“用指针”的要求是怎么想出来的。
max_min_ 2013-11-17
  • 打赏
  • 举报
回复
输入的字符串长度有没有限制?还有单词空格隔开是什么意思?会输入很多个字符串么?
Vegertar 2013-11-17
  • 打赏
  • 举报
回复
1、遍历,找到a就计数器加1并转到2,否则转到3 2、找第一个不是a的字符,找到就转到1否则转到3 3、结束
浮世修 2013-11-17
  • 打赏
  • 举报
回复
引用 21 楼 u012329132 的回复:
嗯,输入和输出我都改了下,就还有 int prePos = -2,if(i-1!=prePos), prePos = i不懂- -求解释。
这个我代码注释和中文解释都告诉你了呀。 prePos就是a上一次出现的位置,初始化为小于-1和大于256都是可以的,因为如果字符串第一个就是a的话,那么检测上一个下标就是0-1 = -1;所以prePos初始化为-1或者大于都是不合理的。 if(i-1!=prePos)就是判断啊,i是当前遍历到的下标号,如果当前下标的上一个位置不是a上一次出现的位置,也就是说出现了a但是不连续,那么就把计数增加一个啊。 prePos = i;就是只要当前下标是a 那么就在本次循环结束前吧prePos的值更新为当前的下标,这样之后再判断a是否连续就是用当前这次a出现的位置为准。
纯属借口 2013-11-17
  • 打赏
  • 举报
回复
引用 20 楼 AzraelLamber 的回复:
[quote=引用 19 楼 u012329132 的回复:] 可以了,有些代码没学过,写上去会不会被老师劈啊?- -
会的,除了std::cin,std::cout我实在想不出还有什么你能没学过。 std::cin.getline(str,256);这一句你可以用你学过的输入方式替换掉的,只要把输入的字符串存入str数组里面就可以了。[/quote] 嗯,输入和输出我都改了下,就还有 int prePos = -2,if(i-1!=prePos), prePos = i不懂- -求解释。
浮世修 2013-11-17
  • 打赏
  • 举报
回复
引用 19 楼 u012329132 的回复:
可以了,有些代码没学过,写上去会不会被老师劈啊?- -
会的,除了std::cin,std::cout我实在想不出还有什么你能没学过。 std::cin.getline(str,256);这一句你可以用你学过的输入方式替换掉的,只要把输入的字符串存入str数组里面就可以了。
纯属借口 2013-11-17
  • 打赏
  • 举报
回复
引用 18 楼 AzraelLamber 的回复:
[quote=引用 14 楼 u012329132 的回复:] 不懂,啥叫开发环境,是我一编译就说按任意键继续,啥也没有
上面的少个分号,用这个

#include <iostream>
#include <string>

int main(){

	char str[256]={0};//根据需要定义字符串buff长度
	std::cout << "请输入字符串,并按回车结束:" << std::endl;
	std::cin.getline(str,256);
	int count = 0; //有效计数
	int prePos = -2;//记录a上一次出现的位置,初始化需要一个无效值,需要小于-1或者大于256
	for ( int i = 0; i != strlen(str); ++i ) {
		if ( str[i] == 'a' ) {
			if(i-1!=prePos){//前一个如果是a那就不做计数
				++count;
			}
			prePos = i;
		}
	}

	std::cout << "您输入的字符串里共有" << count << "个不连续的a"<<std::endl;
	getchar();
	return 0;
}
[/quote]
引用 18 楼 AzraelLamber 的回复:
[quote=引用 14 楼 u012329132 的回复:] 不懂,啥叫开发环境,是我一编译就说按任意键继续,啥也没有
上面的少个分号,用这个

#include <iostream>
#include <string>

int main(){

	char str[256]={0};//根据需要定义字符串buff长度
	std::cout << "请输入字符串,并按回车结束:" << std::endl;
	std::cin.getline(str,256);
	int count = 0; //有效计数
	int prePos = -2;//记录a上一次出现的位置,初始化需要一个无效值,需要小于-1或者大于256
	for ( int i = 0; i != strlen(str); ++i ) {
		if ( str[i] == 'a' ) {
			if(i-1!=prePos){//前一个如果是a那就不做计数
				++count;
			}
			prePos = i;
		}
	}

	std::cout << "您输入的字符串里共有" << count << "个不连续的a"<<std::endl;
	getchar();
	return 0;
}
[/quote]可以了,有些代码没学过,写上去会不会被老师劈啊?- -
浮世修 2013-11-17
  • 打赏
  • 举报
回复
引用 14 楼 u012329132 的回复:
不懂,啥叫开发环境,是我一编译就说按任意键继续,啥也没有
上面的少个分号,用这个

#include <iostream>
#include <string>

int main(){

	char str[256]={0};//根据需要定义字符串buff长度
	std::cout << "请输入字符串,并按回车结束:" << std::endl;
	std::cin.getline(str,256);
	int count = 0; //有效计数
	int prePos = -2;//记录a上一次出现的位置,初始化需要一个无效值,需要小于-1或者大于256
	for ( int i = 0; i != strlen(str); ++i ) {
		if ( str[i] == 'a' ) {
			if(i-1!=prePos){//前一个如果是a那就不做计数
				++count;
			}
			prePos = i;
		}
	}

	std::cout << "您输入的字符串里共有" << count << "个不连续的a"<<std::endl;
	getchar();
	return 0;
}
纯属借口 2013-11-17
  • 打赏
  • 举报
回复
引用 16 楼 AzraelLamber 的回复:
[quote=引用 14 楼 u012329132 的回复:] 不懂,啥叫开发环境,是我一编译就说按任意键继续,啥也没有
。。。这样吧,你用下面的代码。


#include <iostream>
#include <string>

int main(){

	char str[256]={0};//根据需要定义字符串buff长度
	std::cout << "请输入字符串,并按回车结束:" << std::endl
	std::cin.getline(str,256);
	int count = 0; //有效计数
	int prePos = -2;//记录a上一次出现的位置,初始化需要一个无效值,需要小于-1或者大于256
	for ( int i = 0; i != strlen(str); ++i ) {
		if ( str[i] == 'a' ) {
			if(i-1!=prePos){//前一个如果是a那就不做计数
				++count;
			}
			prePos = i;
		}
	}

	std::cout << "您输入的字符串里共有" << count << "个不连续的a"<<std::endl;
	return 0;
}

[/quote]报错了
浮世修 2013-11-17
  • 打赏
  • 举报
回复
引用 14 楼 u012329132 的回复:
不懂,啥叫开发环境,是我一编译就说按任意键继续,啥也没有
。。。这样吧,你用下面的代码。


#include <iostream>
#include <string>

int main(){

	char str[256]={0};//根据需要定义字符串buff长度
	std::cout << "请输入字符串,并按回车结束:" << std::endl
	std::cin.getline(str,256);
	int count = 0; //有效计数
	int prePos = -2;//记录a上一次出现的位置,初始化需要一个无效值,需要小于-1或者大于256
	for ( int i = 0; i != strlen(str); ++i ) {
		if ( str[i] == 'a' ) {
			if(i-1!=prePos){//前一个如果是a那就不做计数
				++count;
			}
			prePos = i;
		}
	}

	std::cout << "您输入的字符串里共有" << count << "个不连续的a"<<std::endl;
	return 0;
}

纯属借口 2013-11-17
  • 打赏
  • 举报
回复
引用 12 楼 JiMoKuangXiangQu 的回复:
[quote=引用 11 楼 JiMoKuangXiangQu 的回复:] int cnt = 0; int is_a= 0; const char *s = "abaacgax"; char *p = s; while (*p) { if (*p == ‘a’ && !is_a) { cnt++; is_a = 1; } else { is_a = 0; } }
写错了一句: if(*p…) -> if (*p++ == ‘a’ && !is_a)[/quote]这个。。我看不懂- -
纯属借口 2013-11-17
  • 打赏
  • 举报
回复
引用 13 楼 AzraelLamber 的回复:
[quote=引用 10 楼 u012329132 的回复:] 嗯,中文看懂了。代码有些还没学过。 代码我刚试了下,不行耶
不行是什么情况,是编译过不去,还是运行报错了?你的开发环境是什么?[/quote] 不懂,啥叫开发环境,是我一编译就说按任意键继续,啥也没有
浮世修 2013-11-17
  • 打赏
  • 举报
回复
引用 10 楼 u012329132 的回复:
嗯,中文看懂了。代码有些还没学过。 代码我刚试了下,不行耶
不行是什么情况,是编译过不去,还是运行报错了?你的开发环境是什么?
JiMoKuangXiangQu 2013-11-17
  • 打赏
  • 举报
回复
引用 11 楼 JiMoKuangXiangQu 的回复:
int cnt = 0; int is_a= 0; const char *s = "abaacgax"; char *p = s; while (*p) { if (*p == ‘a’ && !is_a) { cnt++; is_a = 1; } else { is_a = 0; } }
写错了一句: if(*p…) -> if (*p++ == ‘a’ && !is_a)
JiMoKuangXiangQu 2013-11-17
  • 打赏
  • 举报
回复
int cnt = 0; int is_a= 0; const char *s = "abaacgax"; char *p = s; while (*p) { if (*p == ‘a’ && !is_a) { cnt++; is_a = 1; } else { is_a = 0; } }
纯属借口 2013-11-17
  • 打赏
  • 举报
回复
引用 9 楼 AzraelLamber 的回复:
[quote=引用 5 楼 u012329132 的回复:] 有点看不懂,我是初学者- -
额。。。这么说吧,思想就是,建立一个字符数组,用于存放输入的字符串。 然后字符串从头到尾遍历一遍,数有多少个字符a。 但是遍历的时候呢,有一个规则,如果当前出现的字符a前面一个还是a,那么后面这个a不计数。 所以定义了一个prePos,记录上一个a出现的位置,如果当前位置和上一个a出现的位置相邻,那么就不计数了。 如果是代码看不懂,那你要说清楚第几行不懂。[/quote] 嗯,中文看懂了。代码有些还没学过。 代码我刚试了下,不行耶
浮世修 2013-11-17
  • 打赏
  • 举报
回复
引用 5 楼 u012329132 的回复:
有点看不懂,我是初学者- -
额。。。这么说吧,思想就是,建立一个字符数组,用于存放输入的字符串。 然后字符串从头到尾遍历一遍,数有多少个字符a。 但是遍历的时候呢,有一个规则,如果当前出现的字符a前面一个还是a,那么后面这个a不计数。 所以定义了一个prePos,记录上一个a出现的位置,如果当前位置和上一个a出现的位置相邻,那么就不计数了。 如果是代码看不懂,那你要说清楚第几行不懂。
junlinfushi 2013-11-17
  • 打赏
  • 举报
回复
引用 7 楼 Adol1111 的回复:
最简单的方式就是直接遍历,可以像3楼那样,也可以用一个bool值表示是否处于'a'中,比如
for ( int i = 0; i != strlen(str); ++i ) {
    if(flag&&str[i]!='a')//切换为非'a'字符
    {
        flag=false;
        continue;
    }
    if(!flag&&str[i]=='a'){//进入'a'字符串中
        n++;
        flag=true;
    }
}
Adol1111 2013-11-17
  • 打赏
  • 举报
回复
最简单的方式就是直接遍历,可以像3楼那样,也可以用一个bool值表示是否处于'a'中,比如
for ( int i = 0; i != strlen(str); ++i ) {
    if(flag&&str[i]!='a')//切换为非'a'字符
    {
        flag=false;
        continue;
    }
    if(!flag&&str[i]=='a'){//进入'a'字符串中
        n++;
        flag=true;
    }
}
纯属借口 2013-11-17
  • 打赏
  • 举报
回复
引用 1 楼 Vegertar 的回复:
1、遍历,找到a就计数器加1并转到2,否则转到3 2、找第一个不是a的字符,找到就转到1否则转到3 3、结束
不懂0.0
加载更多回复(3)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧