Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

Проблема со строками   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
3-37506
Andrey V.
2003-12-15 14:41
2004.01.13
Нужен


1-37653
r00t
2003-12-26 19:59
2004.01.13
Полное удаление с файлов?


14-37868
Maga MS
2003-12-21 18:57
2004.01.13
Папка-ярлык или феномен


6-37816
Mr.Bean
2003-11-10 23:20
2004.01.13
Как отправить сообщерие про помощи сокета конкретному пользовател


3-37564
Vemer
2003-12-15 12:08
2004.01.13
Запуск ХП дя формирования





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский