Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2009, 13:21   #1
mihail0608
 
Регистрация: 04.12.2009
Сообщений: 7
Стрелка Перестановка в строке первого и последнего слова..

Всем доброго времени суток!!
Появилось вот такое задание написать программу на языке C++ чересстрочного слияния двух текстовых файлов (первая строка выходного файла - первая строка первого входного файла, вторая строка выходного файла - первая строка второго входного файла, третья строка выходного файла - вторая строка первого входного файла, четвертая строка выходного файла - вторая строка второго входного файла) с удалением в каждой строке слов после которых стоит любой знак препинания..

У меня есть похожая программка, только в ней нужно было удалить слова после которых стоят знаки препинания..

Код:
#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=".,:;?!(){}[]-";
  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 ;
}
Помогите пожалуйста переделать первую процедуру, в мое задание, в ней как раз и происходит процесс удаления слов после которых стоит знак препинания, а то с С++ совсем туго..
mihail0608 вне форума Ответить с цитированием
Старый 04.12.2009, 21:06   #2
mihail0608
 
Регистрация: 04.12.2009
Сообщений: 7
По умолчанию

Парни я перепутал задание..
Мне нужно чтобы программа меняла в каждой строке первое и последнее слово местами в выходном файле..


А в теме программа которая удаляет слова после которых стоит знак препинания..
mihail0608 вне форума Ответить с цитированием
Старый 04.12.2009, 21:30   #3
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Считываешь getline строки.
И каждую строку обрабатываешь.
Ищешь первый пробел,как тока нашел значит первое слово от 0 позиции до позиции пробела -1.Тоже самое и с конца.Потом меняешь
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 05.12.2009, 00:34   #4
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
Счастье

Вот мое решение.

Код:
#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "conio.h"
#include "cstring"
using namespace std;

int main()
{
	cout<<"Swap 2 words.\n\n";
	char st[50],*f,*l;
	char res[50];
//---------------------------------------------------------
	cout<<"Vvedite stroky- ";
	cin.getline(st,50);//vvod
	int lee;
	lee=strlen(st); //obwaj dlina orig. stroki 
	cout<<"\nStroka- "<<st<<"\n\n";//vuvod orig.
	cout<<"DLINA= "<<lee<<"\n";//vuvod dlinu stroki
//---------------------------------------------------------
	int lf=0;
	f=strchr(st,' ');//naxogdenie dlinu
	lf=strlen(f);//    pervogo slova
	lf=lee-lf;//lenght of first word; (obwaj dlina-pos prevogo probela)
	cout<<"LF= "<<lf<<"\n";//out >> lenght of first word
//----------------------------------------------------------
	int ll=0;
	l=strrchr(st,' ');//naxogdenie dlinu
	ll=strlen(l)-1;//	poslednego slova
	cout<<"LL= "<<ll<<"\n";// out...
//-------------komponovka-----------------------
	int i=0;                     
	for (i=0;i<ll;i++)           //zapisuvaem v rezyltizyuwyu stroky
		res[i]=st[(lee-ll)+i];   //poslednee slovo (lee-ll) eto
	res[i]=0;                    //indeks na4ala poslednego slova
//-----------------------------------------------
	int j=0;// zdes zapisuvaem slova serediny stroki
	for(i=strlen(res),j=lf;j<lee-ll;i++,j++)
		res[i]=st[j];
	res[i]=0;
	//cout<<"\n\nOUT- "<<res;
//--------------------------
	for(i=strlen(res),j=0;j<lf;j++,i++)
		res[i]=st[j]; // eto zapis pervogo slova 
	res[i]=0;         // v konec rezylt. stroki
	cout<<"\n\nOUT- "<<res;
_getch();
return 0;
}
программа работает, но вопрос - все ли рационально я сделал? может можно проще, или как то иначе? мне интересно.
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 05.12.2009, 00:53   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

можно пройтись по строке с начала и с конца меняя символы пока не встретится пробел
всю программу писать не буду, вот пример перестановки слов
немного доработать надо.
Код:
char str[] = "abcd 6666 1234";
    int i,j;
    for(i=0; str[i] != ' '; i++)
    {
        for(j=strlen(str)-1; str[j] != ' '; j--)
        {
              str[i]^=str[j];
              str[j]^=str[i];
              str[i]^=str[j];              
        }
    }

Последний раз редактировалось NiCola999; 05.12.2009 в 01:05.
NiCola999 вне форума Ответить с цитированием
Старый 05.12.2009, 01:04   #6
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию

Хм, мне кажется ваш вариант не будет работать если первое и посл. слова разной длины. Я что то неправильно понял?

Вот, так тоже можно:
1) строка S1 - копируем туда все кроме последнего слова
2) строка S3 - копируем последнее слово
3) S3+S1
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 05.12.2009, 01:09   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

я же сказал) надо немного доработать
NiCola999 вне форума Ответить с цитированием
Старый 05.12.2009, 01:10   #8
forsaken66
Куды бечь?
Форумчанин
 
Аватар для forsaken66
 
Регистрация: 05.10.2009
Сообщений: 104
По умолчанию

аа, пардон, не заметил
Не хватало всего одного байта. Да-да, того самого, что из восьми бит состоит.
forsaken66 вне форума Ответить с цитированием
Старый 05.12.2009, 10:36   #9
mihail0608
 
Регистрация: 04.12.2009
Сообщений: 7
По умолчанию

Вот так вот работает правильно в моем старом турбо си.. Только вот непонятно зачем самая первая библиотека?? В турбо си досовом и без нее все нормально заработало..

Код:
//#include "stdafx.h"
#include "stdio.h"
#include "iostream.h"
#include "conio.h"
#include "string.h"

int main()
{
	cout<<"Swap 2 words.\n\n";
	char st[50],*f,*l;
	char res[50];
//---------------------------------------------------------
	cout<<"Vvedite stroky- ";
	cin.getline(st,50);//vvod
	int lee;
	lee=strlen(st); //obwaj dlina orig. stroki
	cout<<"\nStroka- "<<st<<"\n\n";//vuvod orig.
	cout<<"DLINA= "<<lee<<"\n";//vuvod dlinu stroki
//---------------------------------------------------------
	int lf=0;
	f=strchr(st,' ');//naxogdenie dlinu
	lf=strlen(f);//    pervogo slova
	lf=lee-lf;//lenght of first word; (obwaj dlina-pos prevogo probela)
	cout<<"LF= "<<lf<<"\n";//out >> lenght of first word
//----------------------------------------------------------
	int ll=0;
	l=strrchr(st,' ');//naxogdenie dlinu
	ll=strlen(l)-1;//	poslednego slova
	cout<<"LL= "<<ll<<"\n";// out...
//-------------komponovka-----------------------
	int i=0;
	for (i=0;i<ll;i++)           //zapisuvaem v rezyltizyuwyu stroky
		res[i]=st[(lee-ll)+i];   //poslednee slovo (lee-ll) eto
	res[i]=0;                    //indeks na4ala poslednego slova
//-----------------------------------------------
	int j=0;// zdes zapisuvaem slova serediny stroki
	for(i=strlen(res),j=lf;j<lee-ll;i++,j++)
		res[i]=st[j];
	res[i]=0;
	//cout<<"\n\nOUT- "<<res;
//--------------------------
	for(i=strlen(res),j=0;j<lf;j++,i++)
		res[i]=st[j]; // eto zapis pervogo slova
	res[i]=0;         // v konec rezylt. stroki
	cout<<"\n\nOUT- "<<res;
getch();
return 0;
}
А как бы эту прогу впихнуть в первую процедуру проги, представленной в первом посте?? Т.к. нужно обязательно в том виде ООП сделать..
mihail0608 вне форума Ответить с цитированием
Старый 05.12.2009, 11:24   #10
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Часть проги, которая меняет слова местами сделай как метод класса

Код:
char* MyClass::changeStr(char* str);
будет возвращать обработанную строку.Затем этот метод применяешь в процессе работы с файлом

Последний раз редактировалось NiCola999; 05.12.2009 в 11:27.
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СИ. Удалить слова, которые содержат все повторяющиеся буквы первого слова nick23 Помощь студентам 7 01.11.2009 14:47
Минимальная длинна слова в строке Anarki Общие вопросы C/C++ 7 24.09.2009 20:39
Замена одного слова в string строке. Samopal Паскаль, Turbo Pascal, PascalABC.NET 8 19.04.2009 08:03
Указание последнего в строке значения прерывистого ряда значений. Baloo007 Microsoft Office Excel 10 06.08.2008 15:20
написать с помощью рекурсии функцию поиска последнего слова в строке? - Си Cvetok Помощь студентам 1 13.05.2008 15:43