помогите кто может
у меня есть строка все символы которой разделённые пробелами назовём словами, подщитать количество слов у которых первый и последний элимент одинаковый.
я попытался сделать но у меня чушь вышла:
# include <iostream.h>
# include <conio.h>
# include <string.h>
# include <stdio.h>
int main(){
int const n=10;
int i, k=4, j=0;
char m, a, b, c, p;
char s[n];
cout<<"Vvedite stroku\n";
gets(s);
for(i=0;i<n;i++){
if (((k%2)==0)&&(s==' ')){a=s[i-1];
b=s[i+1];
k++;}
if (((k%2)!=0)&&(s==' ')){m=s[i-1];
p=s[i+1];
k++;}
c=s[0];
if((i==0)&&(c==a))j++;
if ((k>4)&&(b==m))j++;
if ((k>4)&&(p==a))j++;cout<<"a="<<a<<" "<<"b="<<b<<" "<<"m="<<m<<" "<<"\n";
}
cout<<"j="<<j;getch();
return 0;}
помогите пожалуйста!!!!!!!
>помогите кто можетПолагаю, что помочь тут сможет любой. Вопрос в том -- станет ли? Задачка элементарная, почему сам решить не можешь?
>у меня есть строка все символы которой разделённые пробелами назовём словами, подщитать
>количество слов у которых первый и последний элимент одинаковый.
>я попытался сделать но у меня чушь вышла:
># include <iostream.h>С некоторых пор (новый стандарт) для стандартных С++-шных хедеров не надо указывать .h:
#include <iostream>
># include <conio.h>
Этого хедера нет под Линуксом, если я правильно помню. Вы программу писАли под Виндой, видимо?
># include <string.h>
># include <stdio.h>В программах на С++ советуют подключать Сишные хедеры так:
># include <сstring>
># include <сstdio>Вот только они вам не нужны здесь: string.h не используется совсем, а stdio.h нужен для gets(), который нужно выкинуть. :)
>int main(){
>int const n=10;
>int i, k=4, j=0;
>char m, a, b, c, p;
>char s[n];
>cout<<"Vvedite stroku\n";
>gets(s);Здесь ошибка. Классический пример, когда пользователь может ввести строку превышающую размер массива и вызвать переполнение буфера.
[...]
Вот вам алгоритм:
- в цикле пройтись по всем словам в строке. Это можно сделать с помощью поиска символа пробела, ведь слова, по условию, разделены именно им.
- если первый символ слова равен последнему увеличить значение счётчика.Это всё.
Сами напишете? Тут не сложно.
Вот мой вариант на С++:#include <iostream>
#include <string>
#include <cctype>using std::cin;
using std::cout;
using std::endl;
using std::string;namespace {
size_t words_count = 0;
void check_word(const string &str, size_t begin, size_t end) {
// skip non alphabetic characters at begin of word
while (isalpha(str.at(begin)) == 0) {
++begin;
}
// skip non alphabetic characters at end of word
while (isalpha(str.at(end)) == 0) {
--end;
}
if (str.at(begin) == str.at(end)) {
++words_count;
}
}} // end of anonymous namespace
int main() {
string line;
// get string from user
getline(cin, line);
string::size_type pos;
string::size_type prev_pos = 0;
// check all words in line
while ((pos = line.find(' ', prev_pos)) != string::npos) {
check_word(line, prev_pos, pos-1),
prev_pos = pos + 1;
}
// check last word in line
check_word(line, prev_pos, line.size()-1);
// print result
cout << "Found: " << words_count << endl;
return 0;
}Вот как работает:
[c0der@rock ~]$ g++ count_words.cc -o count_words -W -Wall -ansi -pedantic
[c0der@rock ~]$ echo 'test! "bla" test "test" Slava! coder? test' | ./count_words
Found: 4
>помогите кто может
>у меня есть строка все символы которой разделённые пробелами назовём словами,Жесть.. Я неправильно задание понял. Я его и сейчас не очень понимаю. Автору читать доку о том как задавать вопросы не меньше двух раз.
Вроде я также понял#include <iostream>
#include <cstdlib>
#include <string>using namespace std;
int main(int argc, char *argv[])
{
string s;
cout << "Vvedite stroku:\n";
getline(cin,s);
s+=" ";//Два пробела
int counter = 0;
char bc = s[0];
char ec = ' ';
for (size_t i = 0; i < s.size()-1; i++)
{
if (s[i] == ' ')
{
ec = s[i-1];
if (ec==bc & ec!=' ')
{
counter++;
}
bc = s[i+1];
}
}
cout << counter;
return 0;
}
[...]
> if (ec==bc & ec!=' ')Ошибка. :)
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;int main(int argc, char *argv[])
{
string s;
cout << "Vvedite stroku:\n";
getline(cin,s);
s+=" ";//один пробел
int counter = 0;
char bc = s[0];
char ec = ' ';
string::iterator i;
for (i=s.begin();i!=s.end();i++)
{
if ((*i) == ' ')
{
ec=*(i-1);
counter=(ec==bc & ec!=' ')? counter+1:counter;
bc=(i==s.end())? bc:*(i+1);
}
}
cout << counter;
return 0;
}Не ошибка если пробелов многомежду словами
Блин сам дурак#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;int main(int argc, char *argv[])
{
string s;
cout << "Vvedite stroku:\n";
getline(cin,s);
s+=" ";//один пробел
int counter = 0;
char bc = *s.begin();
char ec = ' ';
for (string::iterator i=s.begin();i!=s.end();i++)
{
if ((*i) == ' ')
{
ec=(i==s.begin())?' ':*(i-1);
counter=(ec==bc & ec!=' ')? counter+1:counter;
bc=(i==s.end())? ' ':*(i+1);
}
}
cout << counter;
return 0;
}Хотя и прошлый вариант работал, но