Форум программистов, компьютерный форум CyberForum.ru

Задача по строкам - C++

Восстановить пароль Регистрация
 
nega_ufa
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 12
15.04.2012, 21:55     Задача по строкам #1
Вводиться строка, необходимо вывести на экран все слова нечетной длинны, в которых не содержится повторяющихся букв
пример, вводим "привет большое вам спасибо" вывести должен "вам"
начал делать, решил сначала вывести слова нечетной длинны, но там проблема, если предыдущее слово было длиннее, то оно не убирается полностью, вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<conio.h>
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<string.h>
main()
{
char *str1;
char *str2;
int i,k,l,j;
clrscr();
cout<<"vvedite stroku"<<"\n";
gets(str1);
k=strlen(str1);
str2=new char[k];
j=0;
*(str2+j)='\0';
for(i=0;i<k;i++)
if(*(str1+i)!=' ')  { //&&(*(str1+i)!='\0'){
*(str2+j)=*(str1+i);j++;}
else {
l=strlen(str2);
cout<<l<<" ";
if(l%2!=0){
*(str2+j)='\0';
puts(str2);
}j=0;*(str2+j)='\0';
}
 
getch();
}
Пожалуйста, помогите, нужно очень срочно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2012, 21:55     Задача по строкам
Посмотрите здесь:

Задача по строкам в С C++
C++ Задача по строкам
Задача по строкам!!! C++
C++ по строкам
C++ Задача по строкам!String
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
15.04.2012, 22:53     Задача по строкам #2
По идее всё должно работать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <string>
 
bool isValidWord( std::string word );
 
int main()
{
   std::string text; // строка для ввода пользователем
   std::string word; // текущее слово
   const char *delimeters = " .,;:?!"; // символы разделяющие слова
   size_t prevPos = 0; // предыдущая позиция поиска
   size_t curPos = 0; // текущая позиция поиска
 
   std::cout << "Vvedite text:" << std::endl;
   std::getline( std::cin, text );
 
   curPos = text.find_first_of( delimeters );
   while ( curPos != std::string::npos )
   {
      word = text.substr( prevPos, curPos - prevPos );
      if ( isValidWord( word ) )
         std::cout << word << std::endl;
 
      prevPos = curPos + 1;
      curPos = text.find_first_of( delimeters, curPos + 1 );
   }
   word = text.substr( prevPos, text.length() - prevPos ); // обработка последнего слова
   if ( isValidWord( word ) )
      std::cout << word << std::endl;
 
   return 0;
}
 
bool isValidWord( std::string word )
{
   if ( word.length() % 2 == 1 )
   {
      bool isBreaked = false;
      for ( size_t i = 0; i < word.length(); ++i )
      {
         if ( word.rfind( word.at(i) ) != i )
         {
            isBreaked = true;
            break;
         }
      }
 
      if ( isBreaked )
         return false;
      else
         return true;
   }
   else
      return false;
}
nega_ufa
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 12
16.04.2012, 15:58  [ТС]     Задача по строкам #3
система на все ругается...но все равно спасибо...я делал вывод нечетных слов, не могли бы вы написать код проверяющий слова на одинаковость букв???заранее спасибо
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2012, 18:07     Задача по строкам #4
nega_ufa, в моём алгоритме строки с 39 по 55 находят при помощи функции rfind() самую правую позицию символа в отдельном слове, и, если эта позиция отличается от текущей, то этот символ повторяется. А на что конкретно ругается компилятор? Если вам нужен код на чистом C, т.е. без C++
То попробуйте копать в сторону функций strtok() + strrchr()
Вначале разбиваете предложение на слова, затем для каждого символа в слове выполняете функцию strrchr( текущее_слово, искомый символ ), обратите внимание на буковку r. Эта функция возвращает указатель на самый правый искомый символ, если этот возвращаемый указатель сравнить с текущей позицией, то можно узнать, есть ли такой же символ правее в текущей строке. Узнать позицию символа в строке можно при помощи арифметики указателей ( символ_в_строке - самый_первый_символ_в_строке )

Добавлено через 12 минут
ps даже можно, по-моему, просто сравнивать указатели, например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WORD_LEN = strlen( word );
int hasTwo = 0; // флаг наличия двух одинаковых символов в строке
for ( size_t i = 0; i < WORD_LEN; ++i )
{
    if ( &(word[i]) != strrchr( word, word[i] ) )
       {
        // здесь код, что нужно делать, когда слово имеет два одинаковых символа
            hasTwo = 1;
            break;
       }
   
}
 if ( hasTwo != 0 )
       printf("%s\n", word);
но это только в теории, на практике не проверял
nega_ufa
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 12
17.04.2012, 17:37  [ТС]     Задача по строкам #5
сделал сам)))всем огромнейшее спасибо
вот код, может кому понадобиться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<iostream.h>
 
main()
{
  char *str1, *str2;
  int k,i,j,x,y,z=0;
  
  clrscr();
  
  printf("vvedite stroku\n");
  gets(str1);
  
  k = strlen(str1);
  str2 = new char[k];
  for(i=0,j=0; i<k; j=0,i++){
    while((*(str1+i)!=' ')&&(i<k)){
      *(str2+j++)=*(str1+i++);
    }
    *(str2+j)='\0';
    if(j%2!=0){
      for(x=1; x<j; x++){
        for(y=0; y<x; y++){
          if(*(str2+x)==*(str2+y)){
            z=1;
          }
        }
      }
      if(z==0)
        cout << str2 << " ";
      else
        z=0;
    }
  }
  getch();
}
еще раз спасибо, тема закрыта
Yandex
Объявления
17.04.2012, 17:37     Задача по строкам
Ответ Создать тему
Опции темы

Текущее время: 00:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru