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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2016, 07:11   #1
WhineZ
 
Регистрация: 25.12.2016
Сообщений: 5
По умолчанию Поменять местами максимальное и минимальное слово в тексте из файла - C (СИ)

Сделал поиск макс и мин, но без понятия как поменять их местами. Натолкните на мысль)

Код:
#define _CRT_SECURE_NO_WARNINGS 
#pragma warning(disable:4996)
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "locale.h"
#include < string.h >
#include <ctype.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "rus");
    FILE *f;
    int i = 0, j = 0, MaxLength = 0, MinLength = RAND_MAX, k, kol_strok;
    char a[100] = { NULL }, **text, *max, *min, *p, dop[100] = { NULL };
    f = fopen("data.txt", "r");
    while (fgets(a, 100, f)) {
        printf(a);
        i++;
    }
    kol_strok = i;
 
    text = new char*[kol_strok];
    fseek(f, 0L, SEEK_SET);
    
    while (fgets(a, 100, f))
        {
            
            k = strlen(a);
            text[j] = new char[k+1];
            strcpy(text[j], a);
            j++;
        }
        printf("\n");
    for (j = 0; j < kol_strok; j++)
    printf(text[j]);
 
    i = 0;
    while (i < kol_strok)
    {
        p = strtok(text[i], ".,! ");
        
        while (p)
        {
            printf("\n");
            printf(p);
            if (strlen(p) > MaxLength && *p!='\n')
            {
                MaxLength = strlen(p);
                max = p;
                
            }
            if (strlen(p) < MinLength && *p!='\n')
            {
                MinLength = strlen(p);
                min = p;
 
            }
            p = strtok(NULL, ".,! ");
        }
        
        i++;
    }
    printf("\n %d \n %d", MaxLength, MinLength);
    
 
    delete(text);
    fclose(f);
    _getch();
}
WhineZ вне форума Ответить с цитированием
Старый 25.12.2016, 10:44   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Традиционно: запоминайте индексы/номера максимума и минимума, а не их самих.
p51x вне форума Ответить с цитированием
Старый 25.12.2016, 10:51   #3
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Обратите внимание на функцию fseek, может чем то поможет.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 25.12.2016, 10:58   #4
WhineZ
 
Регистрация: 25.12.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Традиционно: запоминайте индексы/номера максимума и минимума, а не их самих.
очень сложно даются указатели. Чтобы запомнить их индекс, что нужно?
WhineZ вне форума Ответить с цитированием
Старый 25.12.2016, 12:40   #5
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Может я и не права, но если Вам необходимо поменять местами слова в текстовом файле, да еще и разной длины, то проще создать новый файл с перезаписью имеющегося, с соответствующей коррекцией при перезаписи.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 25.12.2016, 13:01   #6
WhineZ
 
Регистрация: 25.12.2016
Сообщений: 5
По умолчанию

это сначала нужно записать текст до макс/мин, потом еще часть текста, потом снова макс/мин, потом опять текст.
не догадываюсь вообще как можно это реализовать)
WhineZ вне форума Ответить с цитированием
Старый 25.12.2016, 15:36   #7
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

В общем да
Алгоритм можно представить следующим образом:

Открыть имеющийся файл на чтение
Открыть новый файл на запись
Пока не конец файла
Читать слово
Если слово не менять
Печатать в выходной файл считанное слово
Иначе
Печатать в выходной новое слово
Закрыть файл на чтение
Закрыть файл на запись
где то так
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 25.12.2016 в 17:17. Причина: Уточнение
Sweta вне форума Ответить с цитированием
Старый 28.12.2016, 01:32   #8
WhineZ
 
Регистрация: 25.12.2016
Сообщений: 5
По умолчанию Разобрался. Вдруг кто искать будет, как я.

P.S. После знаков препинания не должно быть пробела, иначе неправильно считает позицию максимума и минимума. Как исправить еще не додумался.
Код:
#define _CRT_SECURE_NO_WARNINGS 
#pragma warning(disable:4996)
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "locale.h"
#include < string.h >
#include <ctype.h>


int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(0, "rus");
	FILE *f;

	int i = 0, j = 0, MaxLength = 0, MinLength = RAND_MAX, k, kol_strok, Nmin, Nmax, z = 0, PosMax, PosMin;
	char a[100] = { NULL }, **text, *max, *min, *p, OstStrok[100];
	f = fopen("data.txt", "r");
	if (!(f = fopen("data.txt", "r")))
		printf("Файл не найден....\n");
	else {
		printf("\t\t\t\t\t\tИсходный текст\n");
		printf("\n\t\t\t---------------------------------------------------------------\n");
		while (fgets(a, 100, f)) {
			printf(a);
			i++;
		}
		printf("\n\t\t\t---------------------------------------------------------------\n");
		kol_strok = i;

		text = new char*[kol_strok];
		fseek(f, 0L, SEEK_SET);

		while (fgets(a, 100, f))
		{

			k = strlen(a);
			text[j] = new char[k + 1];
			strcpy(text[j], a);
			j++;
		}
		printf("\n");
		i = 0;
		printf("\t\t\t\t\tТекст, разделенный на лексемы\n");
		printf("\n\t\t\t---------------------------------------------------------------\n");
		while (i < kol_strok)
		{
			j = 0;
			strcpy(a, text[i]);
			p = strtok(a, ".,! \n");

			while (p)
			{
				printf("\n");
				z++;
				printf(p);

				if (strlen(p) > MaxLength)
				{
					MaxLength = strlen(p);
					max = p;
					Nmax = i;
					PosMax = j;
				}

				if (strlen(p) < MinLength)
				{
					MinLength = strlen(p);
					min = p;
					Nmin = i;
					PosMin = j;
				}
				j += strlen(p) + 1;
				p = strtok(NULL, ".,! \n");
			}

			i++;
		}
		fclose(f);
		printf("\n\t\t\t---------------------------------------------------------------\n");
		printf("\n");
		*(text[Nmax] + PosMax + MaxLength) = '\0';
		*(text[Nmin] + PosMin + MinLength) = '\0';
		*(text[Nmax] + PosMax - 1) = '\0';
		*(text[Nmin] + PosMin - 1) = '\0';
		strcpy(a, text[Nmax] + PosMax);
		printf("\n");
		strcpy(OstStrok, text[Nmin] + PosMin + MinLength + 1);
		strcat(text[Nmax], " ");
		strcat(text[Nmax], text[Nmin] + PosMin);
		strcat(text[Nmax], " ");
		strcat(text[Nmax], text[Nmax] + PosMax + MaxLength + 1);
		strcat(text[Nmin], " ");
		strcat(text[Nmin], a);
		strcat(text[Nmin], " ");
		strcat(text[Nmin], OstStrok);

		printf("\n");
		printf("\t\t\t\t\t      Отформатированный текст\n");
		printf("\n\t\t\t---------------------------------------------------------------\n");
		for (j = 0; j < kol_strok; j++)
			printf(text[j]);
		printf("\n\t\t\t---------------------------------------------------------------\n");
		f = fopen("out.txt", "w+");
		for (i = 0; i < kol_strok; i++) 
			if (text[i]) 
				fputs(text[i], f);
		delete(text);
		fclose(f);
	}
	_getch();
}
WhineZ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строки ( максимальное и минимальное слово) denis2997 Общие вопросы C/C++ 6 16.04.2015 19:04
Дан массив целых чисел. Найти максимальное и минимальное значение. Вывести максимальное на 1-ое место, минимальное на последнее. Punk_Killer Паскаль, Turbo Pascal, PascalABC.NET 1 01.04.2013 09:38
Выделить в тексте максимальное слово TYMON C++ Builder 0 25.05.2012 17:05
поменять местами первое слово со вторым.. 3 и 4 5 и 6 7 и 8 kiruka4 Общие вопросы C/C++ 0 22.12.2011 18:45
Определить в тексте слово, содержащее минимальное число согласных stasig Помощь студентам 3 15.02.2009 13:11