Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаление слов из предложения, удаление слов из предложения 
V
    Опции темы
Domain
Дата 23.4.2011, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Тема вот в чем. Есть задание: "Дана  строка  предложение.  Удалить  из  предложения  все  слова,  в  которых  символ  'X' 
встречается менее трех раз. " Я так полагаю, что слова в предложении разделены пробелами. Делаю так, отделаю одно слово, проверяю сколько в нем букв, а потом удаляю со строки элементы. Похода шляпа у удалении. Если удалять один элемент, один раз, то все нормально, а когда в цикле, то не работает. Надо что-то типа erase и удалять слово целиком. Может кто знает как это сделать, есть готовый метод. Гуглил это дело, так и не нашел ничего рабочего. Что посоветуете.
Код

#include <iostream>
#include <cstdio>
int sort(char *st, int f,int l);
void search(char *str,int strSize);
void deleteElement(char *mas, int pos,int &size);
int strlen(char *str);
using namespace std;
/*****************************************/
void search(char *str,int masSize)
{
 int pos=0; 
 int size = masSize;
 for (int i=0;i<masSize;i++)
    {
    if(str[i]==' ')
        {
            if (sort(str,pos,i) < 3)
            {
                for(;pos<i;pos++)
                {
                    //cout<<str[pos];
                    deleteElement(str,pos,size);
                } 
            }
            pos=i+1;
        }
   else if(str[i+1]=='\0')
        { 
            if (sort(str,pos,i) < 3 )
            {
                for(;pos<i+1;pos++)
                {   
                    //cout<<str[pos];
                    deleteElement(str,pos,size);
                }
            }
        }
    }
}
/*****************************************/
int strlen(char *str)
{   int  len = 0;
    for (len = 0;str[len];len++);
    return len;
}    
/*****************************************/
void deleteElement(char *mas, int pos,int &size)
{
     for(int i=pos;i<size;i++)
     mas[i] = mas[i+1];
     mas[size-1] = '\0';
     size--;
     
}     
/*****************************************/
int sort(char *st,int f,int l)
 {
 int count=0;
 for (f;f<l;f++)
    {
     if(st[f]=='x')
     count++;
    }
     return count;
}
/*****************************************/
int main()
{
    int n;
    char *a=new char;
    printf("Enter the text: \n");
    gets(a);
    search(a,strlen(a));
    printf("Result:%s.\n",a);
    delete []a;
    cin.get();
    cin.get();
    return 0;
}


Границы слов для удаления определяются вроде верно.
PM MAIL   Вверх
borisbn
Дата 23.4.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



твой deleteElement изменяет строку, а
Цитата(Domain @  23.4.2011,  12:29 Найти цитируемый пост)

for (int i=0;i<masSize;i++)
    {    if(str[i]==' ')

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

Цикл по исходной строке
    Если обнаружена граница слова, то
        Если в слове >= 3-х 'x'
            Переписать это слово в выходную строку
        Конец если в слове < 3-х 'x'
    Конец если обнаружена граница слова
Конец цикла по исходной строке


Цитата(Domain @  23.4.2011,  12:29 Найти цитируемый пост)
char *a=new char;

а это вообще жесть. Ты выделил один символ, а гуляешь по памяти, как будто их там много...
И ещё. в задании сказано
Цитата(Domain @  23.4.2011,  12:29 Найти цитируемый пост)
Удалить  из  предложения  все  слова,  в  которых  символ  'X' встречается менее трех раз.

а ты удаляешь все слова, у которых букв 'X' меньше трёх. Даже те слова, где этого символа нет вообще. Обрати на это внимание. Я не знаю, м.б. это и правильно... А м.б. и нет...



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 23.4.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Лови:

Код

#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

string deleteWords( const string & str, char ch )
{
    string result;
    string::const_iterator startWord = str.begin();
    for ( string::const_iterator it = str.begin(); it != str.end(); ++it )
    {
        if ( (*it) == ' ' )
        {
            int chCount = count( startWord, it, ch );
            ++it;
            if ( chCount == 0 || chCount >= 3 )
            {
                result.append( startWord, it );
            }
            startWord = it;
        }
    }
    result.append( startWord, str.end() );
    return result;
}


int main()
{
    string a = "qwe xa1 x2xa xxx3 xxxx4 asd";
    //printf("Enter the text: \n");
    printf( "%s\n",a.c_str() );
    //gets(a);
    //search(a,strlen(a));
    string result = deleteWords( a, 'x' );
    printf("Result:\n%s\n",result.c_str());
    //delete []a;
    cin.get();
    cin.get();
    return 0;
}


http://liveworkspace.org/code/d1250780f7f5...135a54b782eaebd


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Domain
Дата 23.4.2011, 14:11 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Спасибо. 
Код
советую для упрощения алгоритма переписывать результат в другую строку 
я тоже так думал делать, но там препод принципиальный: если говорит удалять слова, значит их нужно удалять. Ну думаю прокатит. Еще раз спасибо.
Код
а это вообще жесть. Ты выделил один символ, а гуляешь по памяти, как будто их там много...
 так это ведь указатель. какая разница сколько ты выделил памяти, он просто указывает на нее. Единственное что запись char *a=new char; излишне. Просто char *a; хватило бы.


Это сообщение отредактировал(а) Domain - 23.4.2011, 14:25
PM MAIL   Вверх
bsa
Дата 25.4.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Domain @  23.4.2011,  14:11 Найти цитируемый пост)
так это ведь указатель. какая разница сколько ты выделил памяти, он просто указывает на нее. Единственное что запись char *a=new char; излишне. Просто char *a; хватило бы.

Угу. а построить дорогу от москвы до владивостока это тоже самое, что заложить первый камень. Да и вообще, зачем что-то закладывать, достаточно сказать: "Дорога от Москвы до Владивостока", - и все сразу по ней поедут и будут радоваться...

Нет дорогой. ТЫ НЕ ИМЕЕШЬ ПРАВА РАБОТАТЬ С ПАМЯТЬЮ, КОТОРУЮ НЕ ВЫДЕЛИЛ. Почитай: Указатели и ссылки и Динамические массивы
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2893 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.