Форум программистов  
Главная  |  Правила форума  |  Исходники Delphi  |  Основы Delphi  |  Блог программистов  |  Рассылка  |  Повторная активизация e-mail  | 

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



О проблемах с регистрацией и почтой пишите сюда - post@programmersforum.ru, по необходимости будем регистрировать вручную. И проверяйте папку спам!



Ответ
 
Опции темы
Старый 30.05.2009, 18:06   #1
Slicker
Форумчанин
 
Регистрация: 25.08.2008
Адрес: Новосибирск
Сообщений: 51
Репутация: 10
По умолчанию поменять местами слова в предложении (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, 18:52   #2
Sazary
В тени
Профессионал
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,785
Репутация: 970
По умолчанию

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

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

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

А, ну раз предложения, то да, нужно посимвольно.
Ну вот смотрите. Каждое предложение будем помещать в stroka.
Запускаем цикл с условием выхода "достигнут конец файла" (while(!feof(f)))
Код:

strcpy(stroka,""); // чистим строку
c = fgetc(f); // с - символ. 
while(c!='.')  // пока не встретили точку
 {
 strcat(stroka,c); //добавляем символ к строке
 c = fgetc(f); 
 }

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

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

Собрал..
Код:

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, 20:19   #6
Sazary
В тени
Профессионал
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,785
Репутация: 970
По умолчанию

Да, забыл, что там строка нужна. Тогда вот так сделайте:
Код:

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, 20:38   #7
Slicker
Форумчанин
 
Регистрация: 25.08.2008
Адрес: Новосибирск
Сообщений: 51
Репутация: 10
По умолчанию

Всеравно выдает 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, 21:04   #8
Sazary
В тени
Профессионал
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,785
Репутация: 970
По умолчанию

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

Код:

#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, 21:14   #9
Slicker
Форумчанин
 
Регистрация: 25.08.2008
Адрес: Новосибирск
Сообщений: 51
Репутация: 10
По умолчанию

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

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

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

В начале цикла строки очищайте:
Код:

strcpy(stroka,"");
 strcpy(buf,"");
 strcpy(buf2,"");
 strcpy(buf3,"");
 strcpy(newstroka,"");

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

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


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




08:52.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.

Forex с Admiral Markets — это надежно


Работа на Forex с 2000 года. Очное и дистанционное обучение. Выгодные условия.
магазин горящих туров


более 1000 горящих предложений ежедневно
Бэбиблог - соц сеть для будущих мам


RusProfile.ru


Справочник российских юридических лиц и организаций.