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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2009, 19:06   #1
Slicker
Пользователь
 
Регистрация: 25.08.2008
Сообщений: 51
По умолчанию поменять местами слова в предложении (C++)

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

Я написал программку которая считывает только одну строку, и меняет местами слова. Не получается сделать для многострочного текста. (Как я понимаю нужен посимвольное считывание, но вот рабочую программку сделать не выходит.)

Вот то что есть:
Код:
#include "stdafx.h"
#include <malloc.h>
#include <string.h>
#include <search.h>
#include <conio.h>
#include <windows.h>

#define STRLIMIT 100

int slovo1(char stroka[], int length){  //нахожу конец первого слова
    int i=0;
            for (i=0;i<length;i++) 
                if (stroka[i]==' ') {break;}
        return i;
}

int slovo2(char stroka[], int length){ //нахожу начало последнего слова
int i=0;
for (i=length; i>0; i--) if (stroka[i]==' '){break;}
return i;
}


int _tmain(int argc, _TCHAR* argv[]){
// объявляем переменные:
        char stroka[STRLIMIT]="", buf[STRLIMIT]="", buf2[STRLIMIT]="", buf3[STRLIMIT]="", newstroka[STRLIMIT]=""; 
						
		char str[STRLIMIT]="Ich habe keine Lust."; // вводим то что будем изменять

  FILE *f = fopen("C:\\idzcpp\\idz3.txt", "w");        // открываем файл на запись
            fputs(str,f);      
        fclose(f);


        f = fopen("C:\\idzcpp\\idz3.txt", "r");        // открываем файл на чтение
            fgets(stroka, STRLIMIT, f);        // чтение строки
        fclose(f);

    int length=(int)strlen(stroka);    

//----------------------------------------------------------------
// Делаю замену:
//----------------------------------------------------------------

	for(int i=0; i<(slovo1(stroka,length)); i++) // записываем первое слово
		buf[i] = stroka[i];

int k=0;
int j=0;

int s2=slovo2(stroka,length)+1; // чтобы не потерять последний пробел

	for(int i=(slovo1(stroka,length)); i<s2; i++){ //записываем то что между первым и последним словами
		buf2[k]=stroka[i];
		k++;
	}

	if(stroka[length-1]=='.') length--; // проверка стоит ли вконце точка

	for(int i=s2; i<length; i++){ //записываем последнее слово
		buf3[j]=stroka[i];
		j++;
	}
	if(stroka[length]=='.') buf[strlen(buf)]='.'; // если была точка добавляем ее в конец предложения..

	buf[strlen(buf)]='\0';		// дописываем нули окончания(на всякий случай)
	buf2[strlen(buf2)]='\0';
	buf3[strlen(buf3)]='\0';

	printf("%s:\n%s\n\n", "Bilo vvedeno",stroka); // выводим то что у нас имелось
sprintf(newstroka,"%s%s%s",buf3,buf2,buf);  // соединяем все в одну строку
printf("%s:\n%s","Polu4ilos",newstroka); // выводим то что получилось

//----------------------------------------------------------------
// Замена окончена.
//----------------------------------------------------------------


  f = fopen("C:\\idzcpp\\idz3.txt", "w");        // открываем файл на запись
            fputs(newstroka,f);      //  записываем в файл новую троку
        fclose(f);

		_getch();
    return 0;
    
}
Slicker вне форума Ответить с цитированием
Старый 30.05.2009, 19:52   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Не получается сделать для многострочного текста.
Ну так сделайте цикл, в котором будете считывать строки. А в теле цикла - то, что у вас уже сделано.
Посимвольное чтение не нужно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 20:19   #3
Slicker
Пользователь
 
Регистрация: 25.08.2008
Сообщений: 51
По умолчанию

дело в том что нужно поменять местами первые и последние места во всех предложениях в файле. Разделителями слов могут быть и пробел и табуляция и перенос строки, тоесть не буква. Разделителем предложения является точка!
Slicker вне форума Ответить с цитированием
Старый 30.05.2009, 20:24   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

А, ну раз предложения, то да, нужно посимвольно.
Ну вот смотрите. Каждое предложение будем помещать в stroka.
Запускаем цикл с условием выхода "достигнут конец файла" (while(!feof(f)))
Код:
strcpy(stroka,""); // чистим строку
c = fgetc(f); // с - символ. 
while(c!='.')  // пока не встретили точку
 {
 strcat(stroka,c); //добавляем символ к строке
 c = fgetc(f); 
 }
После этого делаем со строкой то, что вы делаете.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 21:05   #5
Slicker
Пользователь
 
Регистрация: 25.08.2008
Сообщений: 51
По умолчанию

Собрал..
Код:
while(!feof(f)){
	strcpy(stroka,""); // чистим строку
	c = fgetc(f); // с - символ. 
		while(c!='.')  // пока не встретили точку
		{
			strcat(stroka,c); //добавляем символ к строке
			c = fgetc(f); 
		}
}
выдает ошибку что строка char *, а с - просто char. Делаю strncat(stroka,&c,1) - вылетает Access violation.
Slicker вне форума Ответить с цитированием
Старый 30.05.2009, 21:19   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Да, забыл, что там строка нужна. Тогда вот так сделайте:
Код:
int k;
while(!feof(f)){
           k = 0;
	strcpy(stroka,""); // чистим строку
	c = fgetc(f); // с - символ. 
		while(c!='.')  // пока не встретили точку
		{
			stroka[k++] = c;
			c = fgetc(f); 
		}
           stroka[k] = 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 21:38   #7
Slicker
Пользователь
 
Регистрация: 25.08.2008
Сообщений: 51
По умолчанию

Всеравно выдает Access violation.
Код:
// IDZ_3_Slicker.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <malloc.h>
#include <string.h>
#include <search.h>
#include <conio.h>
#include <windows.h>

#define STRLIMIT 100

int slovo1(char stroka[], int length){  //нахожу конец первого слова
    int i=0;
            for (i=0;i<length;i++) 
                if (stroka[i]==' ') {break;}
        return i;
}

int slovo2(char stroka[], int length){ //нахожу начало последнего слова
int i=0;
for (i=length; i>0; i--) if (stroka[i]==' '){break;}
return i;
}


int _tmain(int argc, _TCHAR* argv[]){
// объявляем переменные:
        char stroka[STRLIMIT]="", buf[STRLIMIT]="", buf2[STRLIMIT]="", buf3[STRLIMIT]="", newstroka[STRLIMIT]=""; 
						
		char str[STRLIMIT]="Ich habe keine Lust."; // вводим то что будем изменять

char c;

  FILE *f = fopen("C:\\text1.txt", "w");        // открываем файл на запись
            fputs(str,f);      
        fclose(f);


        f = fopen("C:\\text1.txt", "r");        // открываем файл на чтение
 //           fgets(stroka, STRLIMIT, f);        // чтение строки
      

    int length=(int)strlen(stroka);    


int abc;
while(!feof(f)){
           abc = 0;
	strcpy(stroka,""); // чистим строку
	c = fgetc(f); // с - символ. 
		while(c!='.')  // пока не встретили точку
		{
			stroka[abc++] = c;
			c = fgetc(f); 
		}
           stroka[abc] = 0;
//----------------------------------------------------------------
// Делаю замену:
//----------------------------------------------------------------

	for(int i=0; i<(slovo1(stroka,length)); i++) // записываем первое слово
		buf[i] = stroka[i];

int k=0;
int j=0;

int s2=slovo2(stroka,length)+1; // чтобы не потерять последний пробел

	for(int i=(slovo1(stroka,length)); i<s2; i++){ //записываем то что между первым и последним словами
		buf2[k]=stroka[i];
		k++;
	}

	if(stroka[length-1]=='.') length--; // проверка стоит ли вконце точка

	for(int i=s2; i<length; i++){ //записываем последнее слово
		buf3[j]=stroka[i];
		j++;
	}
	if(stroka[length]=='.') buf[strlen(buf)]='.'; // если была точка добавляем ее в конец предложения..

	buf[strlen(buf)]='\0';		// дописываем нули окончания(на всякий случай)
	buf2[strlen(buf2)]='\0';
	buf3[strlen(buf3)]='\0';

//	printf("%s:\n%s\n\n", "Bilo vvedeno",stroka); // выводим то что у нас имелось
 sprintf(newstroka,"%s%s%s",buf3,buf2,buf);  // соединяем все в одну строку
//  printf("%s:\n%s","Polu4ilos",newstroka); // выводим то что получилось

//----------------------------------------------------------------
// Замена окончена.
//----------------------------------------------------------------

}


fclose(f);



  f = fopen("C:\\idzcpp\\idz3.txt", "w");        // открываем файл на запись
            fputs(newstroka,f);      //  записываем в файл новую троку
        fclose(f);

		_getch();
    return 0;
    
}
Slicker вне форума Ответить с цитированием
Старый 30.05.2009, 22:04   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Примерно так. Вы только допилите, если что там не так. Но я посмотрел - вроде, все работает.

Код:
#include <malloc.h>
#include <string.h>
#include <search.h>
#include <conio.h>
#include <windows.h>
#include <stdio.h>

#define STRLIMIT 200

int slovo1(char stroka[], int length){  //нахожу конец первого слова
    int i=0;
            for (i=0;i<length;i++) 
                if (stroka[i]==' ') {break;}
        return i;
}

int slovo2(char stroka[], int length){ //нахожу начало последнего слова
int i=0;
for (i=length; i>0; i--) if (stroka[i]==' '){break;}
return i;
}


int main(){
// объявляем переменные:
char stroka[STRLIMIT]="", buf[STRLIMIT]="", buf2[STRLIMIT]="", buf3[STRLIMIT]="", newstroka[STRLIMIT]=""; 
						
FILE *f,*fout;
f = fopen("text1.txt", "r");        // открываем файл на чтение
fout = fopen("text2.txt","w");
char c;
int abc;

while (!feof(f))
{
 abc = 0;
 do
 {
  c = fgetc(f);
  if(c!='\n') stroka[abc++] = c;
 } while(c!='.'&&abc<STRLIMIT&&!feof(f));
stroka[abc]=0;

int length=abc;   

//----------------------------------------------------------------
// Делаю замену:
//----------------------------------------------------------------

	for(int i=0; i<(slovo1(stroka,length)); i++) // записываем первое слово
		buf[i] = stroka[i];

int k=0;
int j=0;

int s2=slovo2(stroka,length)+1; // чтобы не потерять последний пробел

	for(int i=(slovo1(stroka,length)); i<s2; i++){ //записываем то что между первым и последним словами
		buf2[k]=stroka[i];
		k++;
	}

	if(stroka[length-1]=='.') length--; // проверка стоит ли вконце точка

	for(int i=s2; i<length; i++){ //записываем последнее слово
		buf3[j]=stroka[i];
		j++;
	}
	if(stroka[length]=='.') buf[strlen(buf)]='.'; // если была точка добавляем ее в конец предложения..

	buf[strlen(buf)]='\0';		// дописываем нули окончания(на всякий случай)
	buf2[strlen(buf2)]='\0';
	buf3[strlen(buf3)]='\0';

	printf("%s:\n%s\n\n", "Bilo vvedeno",stroka); // выводим то что у нас имелось
sprintf(newstroka,"%s%s%s",buf3,buf2,buf);  // соединяем все в одну строку
printf("%s:\n%s","Polu4ilos",newstroka); // выводим то что получилось

//----------------------------------------------------------------
// Замена окончена.
//----------------------------------------------------------------
fprintf(fout,"%s\n",newstroka);
}

fclose(f);
fclose(fout);

_getch();
return 0;  
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 22:14   #9
Slicker
Пользователь
 
Регистрация: 25.08.2008
Сообщений: 51
По умолчанию

для первого предложения работает отлично.. со вторыми так далее получается полная билиберда..

ушел дебажить..

Последний раз редактировалось Slicker; 30.05.2009 в 22:21.
Slicker вне форума Ответить с цитированием
Старый 30.05.2009, 22:21   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

В начале цикла строки очищайте:
Код:
strcpy(stroka,"");
 strcpy(buf,"");
 strcpy(buf2,"");
 strcpy(buf3,"");
 strcpy(newstroka,"");
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поменять местами слова в предложении (C++) Slicker Помощь студентам 3 30.05.2009 17:57
Найти все слова в предложении PbIska Помощь студентам 5 12.05.2009 21:23
поменять местами научите Паскаль, Turbo Pascal, PascalABC.NET 13 08.01.2009 13:43
как поменять местами слова в файле? r-tem Общие вопросы C/C++ 6 01.12.2008 22:17
В введенном предложении удалить все повторяющиеся слова Алена Помощь студентам 5 21.11.2007 14:12