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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> небольшая проблемка в коде.. 
:(
    Опции темы
pdiman58
Дата 11.2.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задание таково:
"Написать программу на языке C++ чересстрочного слияния двух текстовых файлов с удалением в каждой строке слов в которых встречаюстя цифры".

Моя прога работает, но с небольшой погрешностью она удаляет не все слово, а только предшествующую цифре часть слова и саму цифру..

Код:
Код

qwe8rty

rty  \\вот так работает мой код

а нужно чтоб полностью удалил слово..


вот мой код
Код

#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <iostream.h>
#include <conio.h>
#define LEN 1024

class myClass
{
public:
     void writeStr(char *str, FILE *in, FILE *out);
     void delSep(char *str);
     void newFunc();
};

void myClass::delSep(char *str)
{
  char *beg, *end;
  char *sep="0123456789";
  while(end=strpbrk(str, sep))
  {
    beg=end;
    while(*(end+1) && !isalnum(*(end+1))) end++;
    while(!isalnum(*beg) && beg>=str) beg--;
    while(!isspace(*beg) && beg>=str) beg--;
    while(!isalnum(*beg) && beg>=str) beg--;
    if(beg>=str) *(++beg)=' ';
    strcpy(beg+1, end+1);
  }
}

void myClass::writeStr(char *str, FILE *in, FILE *out)
{
    if(fgets(str, LEN, in))
    {
      delSep(str);
      fputs(str, out);
      if(str[strlen(str)-1]!='\n')
      fputc('\n', out);
    }
}

void myClass::newFunc()
{
  FILE *f1, *f2, *f3;
  char buf[LEN]="";
  char c1[20],c2[20],c3[20];
  clrscr();
  cout<<endl<<"Vvedite nazvanie file_1:"<<endl;
  cin>>c1;
  cout<<endl;
   if (!(f1=fopen (c1, "rt"))){
     cout<<"Error!!! File_1 ne otkrit!!!"<<endl;
     return;
   }
  clrscr();
  cout<<endl<<"Vvedite nazvanie file_2:"<<endl;
  cin>>c2;
  cout<<endl;
   if (!(f2=fopen (c2, "rt"))){
     cout<<"Error!! File_2 ne otkrit!!!"<<endl;
     return;
   }
  clrscr();
  cout<<endl<<"Vvedite nazvanie file_3:"<<endl;
  cin>>c3;
  cout<<endl;
   if (!(f3=fopen (c3, "wt")))     {
     cout<<"Error!!! File_3 ne otkrit!!!"<<endl;
     return;
   }
  while(!feof(f1) || !feof(f2))
  {
    writeStr(buf, f1, f3);
    writeStr(buf, f2, f3);
  }
  cout<<endl<<"Gotovo!!! Rezul'tat v file "<<c3<<endl;
  fcloseall();
}

int main()
{
  myClass ob;
  ob.newFunc() ;
  return 0 ;
}


Пожалуйста помогите поправить данную проблемку..
PM MAIL   Вверх
Веталька
Дата 11.2.2010, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



удаляй символы слова пока не дойдешь до пробела (==)

Это сообщение отредактировал(а) Веталька - 11.2.2010, 23:53


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
Neox_GeForce
Дата 11.2.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вижу ошибку 
Код

 while(end=strpbrk(str, sep))
  {
  //
  }

постав 
Код


while(end==strpbrk(str, sep))
  {
  //
  }



--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
pdiman58
Дата 12.2.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Neox_GeForce @ 11.2.2010,  23:50)
вижу ошибку 
Код

 while(end=strpbrk(str, sep))
  {
  //
  }

постав 
Код


while(end==strpbrk(str, sep))
  {
  //
  }

не помогло..
теперь вообще ничего не удаляется..
остаются слова с цифрами..
PM MAIL   Вверх
bsa
Дата 12.2.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



pdiman58, воспользуйся поиском. Такое задание было на этом форуме уже несколько раз!
PM   Вверх
pdiman58
Дата 12.2.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я пользовался поиском..
оттуда и почерпнул многое..
но вот как сделать чтобы удалялось все слово не понял..
если пробовать прибавлять цифарки в строчках
beg+1 
end+1
то получается как бы фиксированная величина..
а если в слове после цифры будет больше букв чем в заданной величине они все равно остануться..
PM MAIL   Вверх
bsa
Дата 12.2.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Понятия язык С++ и компилятор BC++ 3.1 мало совместимы... Имей это в виду.

Итак, что нужно делать.
1. открыть два исходных файла на чтение с помощью std::ifstream (#include <fstream>)
2. открыть результирующий файл на запись с помощью std::ofstream
3. читать в цикле из обоих исходных файлов последовательно с помощью std::getline в буфер типа std::string (#include <string>)
4. создать поток из каждого буфера с помощью std::istringstream (#include <sstream>)
5. читать в цикле из него слова с помощью операции >> в буфер типа std::string
6. на каждой итерации проверять наличие в буфере цифр с помощью strcspn (#include <cstring>)
7. если цифр нет, то записывать слово в выходной файл.
8. запись в выходной файл символа перевода строки ('\n')

Пункты 3-8 лучше выделить в отдельную функцию, которая получает на входе поток ввода и поток вывода. За одну операцию проводит копирование слов без цифр из одной строки входного файла в выходной
PM   Вверх
Dov
Дата 12.2.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(pdiman58 @  11.2.2010,  22:23 Найти цитируемый пост)
while(*(end+1) && !isalnum(*(end+1))) end++;

Эта строка должна, по-моему, выглядеть так: 
Код
while(*end && isalnum(*end)) end++;

или так:
Код
while(*end && !isspace(*end)) end++;


з.ы. При условии, что слова разделены пробелом.   А если знаками препинания, то нужно делать соответсвующие  условия в цикле.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
pdiman58
Дата 12.2.2010, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Dov @ 12.2.2010,  12:59)
Цитата(pdiman58 @  11.2.2010,  22:23 Найти цитируемый пост)
while(*(end+1) && !isalnum(*(end+1))) end++;

Эта строка должна, по-моему, выглядеть так: 
Код
while(*end && isalnum(*end)) end++;

или так:
Код
while(*end && !isspace(*end)) end++;


з.ы. При условии, что слова разделены пробелом.   А если знаками препинания, то нужно делать соответсвующие  условия в цикле.

спс.. работает..

Код

А если знаками препинания, то нужно делать соответсвующие  условия в цикле.


ну да вот это не рабит.. ну эт можно текст без знаков препинания просто использовать..
PM MAIL   Вверх
Dov
Дата 12.2.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(pdiman58 @  12.2.2010,  13:00 Найти цитируемый пост)
ну да вот это не рабит.. ну эт можно текст без знаков препинания просто использовать..


pdiman58,  попробуй заменить свой цикл (хотя мне кажется, что это я его когда-то писал  для другой, похожей задачи smile )  на этот:
Код

    while(end = strpbrk(str, sep))
    {
        beg = end;
        
        while(*end && !isspace(*end) && !ispunct(*end)) 
            end++;
        while(beg >= str && !isspace(*beg) && !ispunct(*beg))
            beg--;

        strcpy(beg + 1, end);
    }


 



Это сообщение отредактировал(а) Dov - 12.2.2010, 14:37


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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