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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 00:53   #1
semennn
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 28
По умолчанию изменения строки

Строка длиной не более 1000 символов содержит полный путь к файлу в формате MS-DOS (возможно, с указанием имени диска): имя файла и каждого из промежуточных директориев не превосходит 8 символов, а необязательное расширение отделяется от имени точкой и имеет длину не более 3 символов. Если длина исходной строки больше N символов (N ≤ 1000), ее необходимо сократить до длины, не превосходящей N, по следующим правилам:
• несколько идущих подряд промежуточных директориев и разделяющие их символы ’\’ заменяются на три точки. Может быть выполнена только одна такая замена. Имя диска и директорий, следующий за корневым, не заменяются;
• длина полученной строки должна быть максимальной;
• из нескольких возможных решений, удовлетворяющих предыдущему требованию, необходимо выбрать то, при котором подстрока, расположенная после вставленных точек, имеет максимальную длину.
Входные данные:
На входе содержится две строки. В первой из них записано значение N, а вторая представляет собой исходный полный путь к файлу. Значение N достаточно велико, чтобы сформировать строку согласно указанным выше требованиям.
Выходные данные
Содержат единственную преобразованную строку (либо исходную строку, если преобразование не требуется).
Пример
Вход
30
e:\games\burut\goldenl.and\data\scr ipts\charctrs\npc\2.txt
Выход
e:\games\burut\...\npc\2.txt
semennn вне форума Ответить с цитированием
Старый 06.05.2009, 10:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Какой язык?
В принципе есть функция WINAPI GetShortPathName. Описание в Хелпе или MSDN
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.05.2009, 14:37   #3
semennn
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 28
По умолчанию

язык - pascal
semennn вне форума Ответить с цитированием
Старый 06.05.2009, 14:46   #4
semennn
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 28
По умолчанию

ну помогите пожалуйста очень надо
semennn вне форума Ответить с цитированием
Старый 06.05.2009, 20:59   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Строка длиной не более 1000 символов содержит полный путь к файлу в формате MS-DOS (возможно, с указанием имени диска):
дилетанты!!!! Полный путь к файлу не может превышать 258 символов (255 + буква диска + ':\')!!!

а по поводу решения - задачка несложная, но заковыристая...
я бы рекомендовал, для начала, выделить из строки
неубираемую часть (это "Имя диска и директорий, следующий за корневым, не заменяются;") это можно выделить найдя второй слеш от начала строки.
пусть это будет s0 (для примера s0 : "e:\games\")
дальше выделяем имя файла (это всё, что справа до первого слеша) пусть будет в sEnding (sEnding: "2.txt")
дальше получаем строку из внутренних поддиректорий.
"goldenl.and\data\scripts\charctrs\ npc\"
и длину строки
N_inner := N - Length(s0) - Length(sEnding);
дальше суммируем подстроки ( от текущей и до очередного слеша) суммируем до тех пор, пока сумма не строго меньше N_inner
потом цикл повторяем от следующей позиции (каждый раз в цикле провереяем полученную сумму, если она меньше, чем минимальная, то запоминаем полученную длину как минимальная и запоминаем позицию начала этой самой минимальной подстроки )

всё. задача решена.
вывыдим S0 + строчка, из которой удалена обнаруженная минимальная подстрока + sEnding;

p.s. в принципе, писал столько же, сколько это и програмировать
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2009, 21:29   #6
semennn
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 28
По умолчанию

сам делитант такое ни когда не видел??
while not eoln do
read(c);
где с-символ
semennn вне форума Ответить с цитированием
Старый 06.05.2009, 23:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
while not eoln do
read(c);
где с-символ
К чему этот код? Это к чему иллюстрация?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2009, 23:18   #8
semennn
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 28
По умолчанию

Ты написал строка не может быть длинее 255 вот способ считывания символов до тех пор пока не нажмется ENTER
А идея хорошая только реализуй пожалуйста, а то я пытался бред получается
semennn вне форума Ответить с цитированием
Старый 07.05.2009, 00:34   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) я говорил совершенно про другое - ПОЛНОЕ ИМЯ ФАЙЛА НЕЛЬЗЯ ПОЛУЧИТЬ более 258 символов.
Создайте папку с именем 150 символов (например, 150 символов A "AAAA...AAA") войдите в эту папку и ещё раз создайте папку (или файл) с именем из 150 символов...
Не получилось? так вот я именно про это.

2) теперь про тип данных String
Если речь идёт о TurboPascal, то там строка НЕ МОЖЕТ БЫТЬ ДЛИНЕЕ 255 символов! цитирую из хелпа к TP:
Цитата:
A string type variable is a sequence of
characters with a dynamic length, and a
constant maximum size between 1 and 255.
Если речь идёт о Delphi - то тут совсем другой разговор...

Кстати, в Pascal обойти подобное ограничение (в 255 символов) можно, например, так:
Код:
var 
   MyStr : array[1..1000] of char;
3) код в цикле

и последнее, код в while Nor eoln read(c), в цикле считывающий по ОДНОМУ символу никакого отношения к строке не имеет...

Удачи.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2009, 15:07   #10
semennn
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 28
По умолчанию

дааа помоему между моим кодом и твоими словами
Кстати, в Pascal обойти подобное ограничение (в 255 символов) можно, например, так:
Код:

var
MyStr : array[1..1000] of char;
3) код в цикле

и последнее, код в while Nor eoln read(c), в цикле считывающий по ОДНОМУ символу никакого отношения к строке не имеет...

разничы абсолютно нет



ладно можеш написать программу???
semennn вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменения в настройках Иллидан Общие вопросы Delphi 3 19.01.2008 23:50
Проверка изменения ячейки boocephal Microsoft Office Excel 3 17.12.2007 16:02
оптимизация изменения данных Lunatikus БД в Delphi 6 03.07.2007 11:47
Изменения алгоритма delphi_beginner Общие вопросы Delphi 2 13.05.2007 21:27