URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6963
[ Назад ]

Исходное сообщение
"Помогите кто сможет!!!!!!"

Отправлено xxxborland89 , 21-Ноя-07 23:22 
помогите кто может
у меня есть строка все символы которой разделённые пробелами назовём словами, подщитать количество слов у которых первый и последний элимент одинаковый.
я попытался сделать но у меня чушь вышла:
# 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;}
помогите пожалуйста!!!!!!!


Содержание

Сообщения в этом обсуждении
"Помогите кто сможет!!!!!!"
Отправлено phpcoder , 22-Ноя-07 08:22 
>помогите кто может

Полагаю, что помочь тут сможет любой. Вопрос в том -- станет ли? Задачка элементарная, почему сам решить не можешь?

>у меня есть строка все символы которой разделённые пробелами назовём словами, подщитать
>количество слов у которых первый и последний элимент одинаковый.
>я попытался сделать но у меня чушь вышла:
># 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);

Здесь ошибка. Классический пример, когда пользователь может ввести строку превышающую размер массива и вызвать переполнение буфера.

[...]

Вот вам алгоритм:
- в цикле пройтись по всем словам в строке. Это можно сделать с помощью поиска символа пробела, ведь слова, по условию, разделены именно им.
- если первый символ слова равен последнему увеличить значение счётчика.

Это всё.

Сами напишете? Тут не сложно.



"Помогите кто сможет!!!!!!"
Отправлено phpcoder , 22-Ноя-07 11:00 
Вот мой вариант на С++:

#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


"Помогите кто сможет!!!!!!"
Отправлено phpcoder , 22-Ноя-07 15:05 
>помогите кто может
>у меня есть строка все символы которой разделённые пробелами назовём словами,

Жесть.. Я неправильно задание понял. Я его и сейчас не очень понимаю. Автору читать доку о том как задавать вопросы не меньше двух раз.


"Помогите кто сможет!!!!!!"
Отправлено tux2002 , 22-Ноя-07 16:16 
Вроде я также понял

#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;
}


"Помогите кто сможет!!!!!!"
Отправлено phpcoder , 22-Ноя-07 16:20 
[...]
>      if (ec==bc & ec!=' ')

Ошибка. :)


"Помогите кто сможет!!!!!!"
Отправлено tux2002 , 22-Ноя-07 18:34 
#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;
}

Не ошибка если пробелов многомежду словами


"Помогите кто сможет!!!!!!"
Отправлено tux2002 , 22-Ноя-07 18:52 
Блин сам дурак

#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;
}

Хотя и прошлый вариант работал, но