powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление самого длинного слова в файле
14 сообщений из 14, страница 1 из 1
Удаление самого длинного слова в файле
    #38642926
yurez_orsha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток, помогите пожалуйста доделать задачу:
Вот условие: Напишите программу, которая считывает текст из файла и удаляет самое длинное слово в тексте. Необходимо предусмотреть случай, если файла не существует.
Здесь реализовано поиск и вывод самого длинного слова в файле
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
int main()
{
   clrscr ();
   int ggg;
   FILE *f;
   int max;
   char *e;
   char s[255];
   int k,d,i,ii,m,h;
   f = fopen("readme.txt", "rt");
   if (f==NULL)
   {
      printf("Owibka\n");
      getch ();
      return 0;
   }
   cout<<"Samye dlinnye slova:\n";
   max=0;  ii=0; k=0; m=0; d=0; i=0;
   while(feof(f)==NULL)
   {
      e[0]=fgetc(f);
      if (e[0]!=' ') k++;
      if (e[0]==' ')
      {
         if (k>max)
     {
        (max=k);
 
     }
      k=0;
      }
   }
   fseek (f,0,SEEK_SET);
   while(feof(f)==NULL)
   {
      e[0]=fgetc(f);
      s[i]=e[0];
      if (e[0]!=' ') (d++) ;
      if (e[0]==' ')
      {
         if (d==max)
    {
            ii=i-max;
        m=i;
        for (h=ii; h<=m; h++)
        {
           printf ("%c",s[h]);
        }
        ii=0;
        d=0;
         }
         else
         d=0;
      } 
   i++;
   }
   fclose (f);
   getch();
   return 0;
}



Заранее благодарен!!!
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38642955
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurez_orshaЗдесь реализовано поиск и вывод самого длинного слова в файле
А по заданию надо выводить всё КРОМЕ этого слова.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38642969
c guy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yurez_orsha,

c++, конечно, не страдает краткостью, но всё пишется гораздо короче:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>

struct length_is {
    int length;
    length_is(int len): length(len) {}
    bool operator() (const std::string &s) const { return s.length() == length; }
};

bool str_len_comp(const std::string &a, const std::string &b) { return a.length() < b.length(); }

int main() {
  std::vector<std::string> words(std::istream_iterator<std::string>(std::cin), std::istream_iterator<std::string>());
  auto max_element = std::max_element(words.begin(), words.end(), str_len_comp);
  if (max_element != words.end()) {
    std::remove_copy_if(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout," "), length_is(max_element->length()) );
  }
}
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38642988
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня так получилось, но вполне вероятно можно проще и короче. М плохо что фигурирует число 100 в коде. Но создавать дополнительный указатель на конец буфера не стал

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
int main(int argc, char** argv)
{
	char buf[100] = "hello 1sldjfjkdjdfsfsdfsdf25555555555555555555555555555555555555555 orsha! vsdbfsdjkf 5sdhf  sdfsdf";
	char* cur_s = buf;

	//Поиск указателей на начало и конец максимального слова в массиве символов (файл)
	char* sw = buf;
	char* ew=buf;
	for (int i = 0; i<100;i++)
	{
		if (*(buf+i) == ' ')//если закончислоь текущее слово
		{
			if (buf+i - cur_s > ew-sw)//если длина закончившегося слова больше максимального на текущий момент
			{
				sw = cur_s; //Старт самого длинного слова на текущий момент
				ew = buf+i;  //Конец самого длинного слова на текущий момент
			}
			cur_s = buf + i + 1;
		}
	}

	//Удаление слова
	char* buf_c = buf;
	for (int i = 0; i < 100; i++)
	{
		if (buf_c >= sw && buf_c<ew && (buf_c + (ew - sw)<buf + 100))	*buf_c = *(buf + i + (ew - sw)); 
		else if (buf_c >=ew && i< 100 - (ew - sw))	*buf_c = *(buf + i);
		if (i>= 100 - (ew - sw))	*(buf+i) = ' ';
		
		buf_c++;
	}
	return 0;
}
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38642991
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется в коде выше ошибки. Позже исправлю
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38642994
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но можно ещё лучше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
int main(int argc, char** argv)
{
	char buf[100] = "1sldjfjkdjdfsfsdfsdf255555555555555555555555555555555555sdfsdf hello orsha! vsdbfsd jkf5sdhf";
	char* cur_s = buf;

	//Поиск указателей на начало и конец максимального слова в массиве символов (файл)
	char* sw = buf;
	char* ew=buf;
	for (int i = 0; i<=100;i++)
	{
		if (*(buf+i) == ' ' || i+1==100)//если закончислоь текущее слово
		{
			if (buf+i - cur_s > ew-sw)//если длина закончившегося слова больше максимального на текущий момент
			{
				sw = cur_s; //Старт самого длинного слова на текущий момент
				ew = buf+i;  //Конец самого длинного слова на текущий момент
			}
			cur_s = buf + i + 1;
		}
	}

	//Удаление слова
	for (int i = 0; i < 100; i++)
	{
		if (i >= 100 - (ew - sw)) *(buf + i) = ' ';
		else if (sw <= buf + i) *(buf + i) = *(buf + (ew - sw) + i);
	}
	for (int i = 0; i < 100; i++)
	{
		printf("%c", buf[i]);
	}
	return 0;
}
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38643005
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё, больше переписывать не буду. Хотя поиск не очень, перепишите через указатели. Убежал.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
int main(int argc, char** argv)
{
	char buf[100] = "sdfsd hello orsha! vsdbfsd jkf5sdhf 1sldjfjkdjdfsfsdfsdf255555555555555555555555555555555555";
	
	char* buf_s = buf;
	char* buf_e = buf + 99;
	char* cur_s = buf;

	//Поиск указателей на начало и конец максимального слова в массиве символов (файл)
	char* sw = buf;
	char* ew=buf;
	for (int i = 0; i<=100;i++)
	{
		if (*(buf+i) == ' ' || i+1==100)//если закончислоь текущее слово
		{
			if (buf+i - cur_s > ew-sw)//если длина закончившегося слова больше максимального на текущий момент
			{
				sw = cur_s; //Старт самого длинного слова на текущий момент
				ew = buf+i;  //Конец самого длинного слова на текущий момент
			}
			cur_s = buf + i + 1;
		}
	}
	//Удаление слова
	while (buf_s <= buf_e)
	{
		if (buf_s >= buf_e-(ew-sw))		*buf_s = ' ';
		else if (buf_s >= sw)			*buf_s = *(buf_s + (ew - sw));
		buf_s++;
	}
	return 0;
}
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38643262
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое "слово"? Это с точки зрения языка? Переносы учитывать? Или это лексема в понимании текстовых парсеров?

Код: plaintext
1.
2.
3.
4.
В О Д О Г Р Я З Е Т О Р Ф О П А Р А Ф И Н О Л Е Ч Е Н И Е

самообороноспособность, восьмидесяти-
четырехлетний
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38643726
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во время езды на автобусе после годзиллы меня не покидала мысль о том, что я должен переписать этот по нормальному, через указатели.
Файл, это именованная область памяти, потому мой пример тоже подходит. Вроде бы так ;)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include <stdio.h>

char buf[]=" hello world smth_text hodzillaaaaaaaaa ice-cream unix math mathematic lenta.ru sql.ru  ";
char* e=buf+sizeof(buf)-1;//указатель на завершающий '\0' buf

char* sw=buf;
char* ew=buf;

int main(int argc,char** argv)
{
	//Поиск указателей на начало и конец самого длинного слова
	char* cur=buf;
	char* cur_s=buf;
	while(cur<e)
	{
		if(*cur==' ' || cur==e-1) //если пробел или конце массива символов
		{
			if(cur-cur_s>ew-sw)//если длина нового слова больше текущей максимальной
			{
				ew=cur;
				sw=cur_s;
			}
			cur_s=cur+1;
		}
		cur++;
	}
	//Удаление самого длинного слова из массива байт
	cur=buf;
	while (cur <= e)
	{
		if (cur >= e-(ew-sw))	*cur = ' ';
		else if (cur >= sw)		*cur = *(cur + (ew - sw));

		cur++;
	}
	//Проверка
	for(int i=0;*(buf+i);i++)
	{
		printf("%c",*(buf+i));
	}
	getc(stdin);
	return 0;
}



меня гонят спать(
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38643797
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
char* e=buf+sizeof(buf)-1;//указатель на завершающий '\0' buf



Саша. Это фейерично! Я уже слышу топот ног. Это старый Бьярне бегает с топором. Тебя ищет...
меня гонят спать(
Давай дуй. Сон разума порождает чудовищ...
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38643840
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury
Код: plaintext
1.
char* e=buf+sizeof(buf)-1;//указатель на завершающий '\0' buf



Саша. Это фейерично! Я уже слышу топот ног. Это старый Бьярне бегает с топором. Тебя ищет...



В данном конкретном случае, поскольку

Код: plaintext
1.
char buf[]=" hello world smth_text hodzillaaaaaaaaa ice-cream unix math mathematic lenta.ru sql.ru  ";



эта конструкция вполне работоспособна. Но ТОЛЬКО в данном конкретном случае, и только потому, что проблемная строка идёт сразу же за объявлением char buf[].
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38644003
yurez_orsha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а можно все это реализовать для файла,пожалуйста, а то я это тему вообще не знаю
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38644048
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСаша. Это фейерично! Я уже слышу топот ног. Это старый Бьярне бегает с топором. Тебя ищет...
прочитал с телефона перед сном, и долго веселился прежде чем заснул, представляя злого Бьярне с топором, ругающегогся на меня ахахах :DDD а приснилось мне что я иду в Кёниг из России, попадаю каким-то боком в Албанию, пытаюсь попасть обратно в Россию, две женщины начинают мне объяснять, как попасть обратно, и потом зазвенел телефон


Код: plaintext
1.
2.
char buf[]=" hello world smth_text hodzillaaaaaaaaa ice-cream unix math mathematic lenta.ru sql.ru  ";
char* e=buf+sizeof(buf)-1;//указатель на завершающий '\0' buf


1.Сделал неправильный комментарий, в конце buf не будет '\0' ? // проверял, он был.
2.Или дело в том, что если бы инициализация была бы после получения указателя на конец (а такое вполне возможно в больших программах), я получал бы неправильные данные.


Вообще, я думал что это хороший шаг, ушёл от явного указания размерности массива, и сразу получил указатель на конец.
Как бы вы сделали и в чём неккоретность в общем случае?

yurez_orsha а можно все это реализовать для файла,пожалуйста, а то я это тему вообще не знаю
С файлом я смогу вам помочь где-то через неделю, ещё изучаю fopen. Впрочем, файл, это именованная область памяти, и потому программы выше тоже подходят.
...
Рейтинг: 0 / 0
Удаление самого длинного слова в файле
    #38644089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury , я имел в виду что нужно использовать ASCIIZ-строки в обычном
ежедневном программировании.

Но ты правильно решил работать с потоком символов. Просто здесь по хорошему исходник должен быть другим.
Работать с файлом или с STDIN. Вообще, я-бы решал эту задачу в две фазы.
1) Получить поток (STDIN) текста.
2) Игнорировать переносы. {конецслова}+"-"+"\n"+{начало слова} фильтровать.
3) Фиксировать offset и length максимально длинного слова
4) Повторно вычитать файл (Фаза2) и выдать на выход (STDOUT).

Поскольку речь идёт о модификации файла то направить STDOUT в тот же файл скорее всего не получится.
Нужно будет завешить процесс и закрыть STDIN. Лучше это сделать cmd/bash скриптиком где на самом
последнем шаге мы переименовываем временный файл с удалённым словом в наш исходный.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление самого длинного слова в файле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]