Текущий архив: 2004.01.13;
Скачать: CL | DM;
ВнизПроблема со строками Найти похожие ветки
← →
asquick (2003-12-29 23:38) [0]Помогите пожалуйста решить задачу:
есть строка вида: #b|c#a~1#a|c#b~1#0~0
получить из нее динамический массив строк вида:
1) b|c
2) a~b|c (на место единицы или нуля встает предидущая строчка)
3) a|c
4) b~a|c (на место единицы или нуля встает предидущая строчка)
5) константа (если в полученной строчке два нуля или две единицы или один ноль и одна единица)
Сам понимаю, что задачка простенькая, но что-то никак не получаеться :(((
← →
Palladin (2003-12-30 04:31) [1]Ты человек? человек...
Думать умеешь? наверно умеешь...
Сможешь в голове провести, то что должна делать программа? можешь, провел уже...
Проанализировать свои действия можешь? Наверное можешь, но вот не догадался этого сделать...
Ты видишь разделитель "#" и мысленно раделяешь строки, значит тебе нужна функция или процедура которая движется по входным данным и возвращает данные между разделителями, думая над ее реализацией вспоминаем (или достаем учебник паскаля и ищем или изучаем) две функции работы со строкамиPos
иCopy
, первая понятно нужна для определения положения нашего разделителя во входной строке, вторая для выделения кусочков текста:
function GetNext(var rp_strInData:string):string;
var
nNextPos:integer;
begin
if rp_strInData="" then result:="" else // не забываем проверить входные данные
if rp_strInData[1]<>"#" then raise Exception.Create("Какаято не правильная у нас функция") // проверяем себя, это уже чисто аттрибутика программы и ты об этом не задумывался
else
begin
// ты бежишь глазами до следующего разделителя и выделяешь для себя тот кусок который нужен тебе... ты ведь так сделал когда писал свой пост?
nNextPos:=Pos("#",Copy(rp_strInData,2,Length(rp_strInData)));
if nNextPos=0 then // если вдруг ты дошел глазами до конца данных и не встретил разделителя
begin
result:=Copy(rp_strInData,2,Length(rp_strInData));
rp_strInData:="";
end else // но вот ты встретил раздедитель
begin
result:=Copy(rp_strInData,2,nNextPos-1); // ты отделил нужный кусок...
rp_strInData:=Copy(rp_strInData,nNextPos+1,Length(rp_strInData)); // и забыл про то что было перед этим
end;
end;
end;
ну скажи, разве не так ты думал? и реализовать разве все можно не так же?
ладно пойдем дальше...
наверное нужно организовать главный цикл который будет бежать по буфферу, не так ли (?), опять же применив знания из учебника или книжки по поводу циклов, ты наверное придешь к мнению что лучше воспользоватся цикломrepeat until
илиwhile do
, я бы предпочелrepeat until
перед этим мы определяем наши глобальные переменные, это сами данные и результат в виде массива
strInData:string;
daResult:array of string;
и проводим их инициализацию
strInData:="#b|c#a~1#a|c#b~1#0~0";
SetLength(daResult,0);
строим главный цикл, здесь нам понадобится вспомогательная переменная для хранения полученного куска
strChunk:string;
и сам цикл
repeat
strChunk:=GetNext(strInData);
// сюда мы вставим код попозже, когда реализцуем свои мысли
until strChunk="";
неплохо конечно выделить процедуру добавления в массив, что бы не портить наглядность главного цикла техническими подробностями :)
procedure AddChunk(const p_strChunk:string);
begin
SetLength(daResult,Length(daResult)+1);
daResult[high(daResult)]:=p_strChunk;
end;
теперь ты определяешь, что же находится в куске, основываясь на своих же правилах, кстати твое правило по поводу всех нулей или единиц мне не понятно... какая констата? это я тебе оставлю на домашнее задание... сам реализуешь... всего у тебя есть три варианта, цыфры, буквы и (буквы и цифры)
как ты определяешь что там все цифры(?) ты смотришь опять же на кусок и если видишь присутствие только (!) симоволов 0,1 и ~ то реализуешь свое действие, здесь для реализации можно выбрать два варианта, либо делаем навека, либо учитывая конкретное задание. делая навека мы должны проверить каждый символ полученного куска на вхождение во множество ["~","0","1"], тут просто стоит задуматся, а нужны ли нам в этом случае века :), поэтому учитывая условия задачи проще провести четыре сравнения на равность. занесем это в отдельную функцию, вообще каждый случай лучше занести в свою отдельную функцию, избегать нагромождения кода при каждом удобном случае (но не впадая в маразм конечно).
function IsConstant(const p_strChunk:string):boolean;
begin
Result:=(p_strChunk="0~0") or // первый вариант
(p_strChunk="1~1") or // второй вариант
(p_strChunk="1~0") or // третий вариант
(p_strChunk="0~1"); // четвертый вариант
end;
как видишь способ не навека, будет работать быстрее да и проще в понимании, но если формат на самом деле не такой строгий или присутствуют другие цифры, придется забыть про этот способ.
теперь, как ты проверяешь на все буквы (?) правильно :) нет ли тут цифр, если цифра встретилась значит не все буквы, здесь опять вспоминаем про нашу хорошую функциюPos
, проверяем на вхождение 1 или 0 в кусок
function IsOnlyChars(const p_strChunk:string):boolean;
begin
result:=(Pos("1",p_strChunk)=0) and (Pos("0",p_strChunk)=0);
end;
ну и наконец последний четвертый выриант если цифра и буква, он последний поэтому проверку на него писать не обязательно, ведь мы же видели синтаксис опретаротаif then else
в учебнике, а ведь именно его здесь мы применим
предусматривая этот четвертый вариант, тебе может прийти в голову, что неплохо бы сделать функцию для замены цифры предыдущей строкой... пользоватсяPos
иCopy
ты уже умеешь, потрясно да? :)
function NumReplace(const p_strChunk:string):string;
var
nNumPos:integer;
begin
if IsOnlyChars(p_strChunk) then raise Exception.Create("Что то ты не правильно сделал") else
if Length(daResult)=0 then raise Exception.Create("Ты чего творишь, мне заменять нечем") else
begin
nNumPos:=Pos("1",p_strChunk);
if nNumPos=0 then nNumPos:=Pos("0",p_strChunk);
Result:=Copy(p_strChunk,1,nNumPos-1)+daResult[High(daResult)]+Copy(p_strChunk,nNumPos+1,Length(p_strChunk));
end;
end;
какая хорошая функция получилась
начнем применятьif then else
и наши свеженаписанные функции
кусок мы уже получили, начнем анализ
if IsConstant(strChunk) then {не знаю, сам делай} else
if IsOnlyChars(strChunk) then AddChunk(strChunk) {просто добавляем}
else {наконец добрались до составной} AddChunk(NumReplace(strChunk));
вот так... теже мысли, только на бумаге...
а теперь собирай...
← →
VAleksey (2003-12-30 09:23) [2]Ни фига себе!
Это под новый год подарочек?
← →
Бегемот (2003-12-30 10:49) [3]У TSringList есть свойства Text, Delimiter, DelimitedText.
Поробуй.
Palladin! Королева в восхищении!!!
← →
Новичек (2003-12-30 10:54) [4]Удалено модератором
← →
ssk (2003-12-30 10:56) [5]>Palladin
Как будто подменили...
← →
Плохиш_ (2003-12-30 10:57) [6]>Palladin © (30.12.03 04:31) [1]
8-)) ... бурные, продолжительные аплодисменты ... ;-O
Palladin вообще, когда выпьет, такой добрый добрый бывает ;-)
← →
alex_*** (2003-12-30 10:57) [7]>asquick ©
Что, студент, опять сессия? По программированию зачет не ставят? ;))
← →
Новичек (2003-12-30 11:04) [8]Удалено модератором
← →
VAleksey (2003-12-30 11:07) [9]Вот если бы на каждый вопрос - такой ответ ;-).
← →
REA (2003-12-30 11:09) [10]Сегодня всем лекции читают? Я последний :)
← →
alex_*** (2003-12-30 11:10) [11]тогда бы про хелп вообще забыли.
← →
Palladin (2003-12-30 11:31) [12]у меня нервов на всех не хватит так писать, да и ни у кого не хватит, мастеров мало, вопросов много, одинаковых или схожих
> alex_*** © (30.12.03 11:10) [11]
как видишь, ответ в основном содержит ход мыслей и рассуждения, а не справочную информацию... пользование справкой бесполезно без мыслей в голове... хоть ты кучу справок нарой, хоть груду книг...
> Плохиш_ (30.12.03 10:57) [6]
а вот и не угадал :) я трезвый был, почти...
← →
Anatoly Podgoretsky (2003-12-30 11:33) [13]А толку то, ведь тут дальше еще головой нужно работать.
← →
Palladin (2003-12-30 11:41) [14]Вот и проверим способен он головой дальше работать или нет.
← →
alex_*** (2003-12-30 11:45) [15]>[12]
>а вот и не угадал :) я трезвый был, почти...
был... )))
← →
Тимохов (2003-12-30 11:53) [16]Теперь можно соревнование открыть в номенации "самый лучший интернет учитель Дельфи".
Знаю, что Юрий Зотов любит (честь и хвала ему) отвечать как учитель - развернуто, но не разжевывая, а там, чтобы было о чем подумать.
Теперь, во Palladin.
Круто!
← →
Sandman25 (2003-12-30 12:39) [17]Palladin
Очень хорошо написали! Уроками не подрабатываете? Если нет, то студенты потеряли чудеснейшего преподавателя.
← →
Ломброзо (2003-12-30 12:51) [18]Фи.
char *strtok(
char *strToken,
const char *strDelimit
);
wchar_t *wcstok(
wchar_t *strToken,
const wchar_t *strDelimit
);
unsigned char *_mbstok(
unsigned char*strToken,
const unsigned char *strDelimit
);
Parameters
strToken
String containing token or tokens.
strDelimit
Set of delimiter characters.
← →
asquick (2003-12-31 11:08) [19]Palladin, Спасибо большое!
Я разобрался и сделал :)
Действительно подарок на Новый год!
Даже не ожидал такого полного ответа.
>alex_***
А что студентам за такое зачеты ставят?
Я вообще-то в 8 классе учусь!
Страницы: 1 вся ветка
Текущий архив: 2004.01.13;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.012 c