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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2012, 00:08   #1
ovaaal
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 13
По умолчанию Pascal, стек с динамической структурой

В общем начал только-только разбираться со стеками, очередями и т.п.
Смысл, то понятен, но вот реализация (т.к. я только начинаю) хромает, да что уж говорить - ползает на четвереньках .
Вот нужно выполнить такую вот довольно-таки легкую (увы пока не для меня) задачу:
"Реализовать операции работы со стеком, построенным на основе динамических структур. Распечатать символы введенной пользовательской строки в обратном порядке."
Начал я пытаться реализовать все это дело (только начало, можно сказать, что практически ничего и не сделал-то я ), но смысл улавливаю (возможно по-своему), но все же...
Код:
program stack_dm;
uses crt;
type
    nodeptr=^nodetype; 
    nodetype=record
        number:char;
        nextnode:nodeptr;
    end;
var stack:nodeptr;
    invalue,ch:char;
   l,l2:string;
    i:byte;
    k:integer;
procedure push(var st:nodeptr; value:char); 
var
    p:nodeptr;



begin
new(p);
p^.number:=value;
p^.nextnode:=st;
st:=p;
end;
procedure write_stack(stack:nodeptr);
var
p:nodeptr;
begin
p:=stack;
while p<>nil do
begin
write(p^.number:3);
p:=p^.nextnode;
end;
end;

begin
clrscr;
stack^.nextnode:=nil;
writeln('vvedite stek');
read(l);
k:=length(l);
for i:=1 to k do

begin
     push(stack,l[i]);
     read(l2[i]);
end;
write_stack(stack);
readkey;
end.
Как видно из кода - решил я все это делать "поэлементно", т.е. не строку целиком, а символы по отдельности заносить/выносить в стек, как-то так...
Прошу помощи
ovaaal вне форума Ответить с цитированием
Старый 30.03.2012, 00:27   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

1) "read(l2[i]);" зачем? как-то не логично
2) на всякое выделение должно быть освобождение)) вы выделили память через new - изволь вернуть её через dispose (если верно помню имя)
3) "stack^.nextnode:=nil;" куда тут мы лезим? stack же указатель и указывает на три весёлых буквы... в смысле, надо вначале написать new(stack) и выделить память под данные
4) общий стиль хромает, но, увы, на это плюют даже преподы.... лишние переменные, именование паршивое, неумение верно прописывать типы аргументов (var/const/none)
5) так-то вроде верно всё, если исправить п1-3

Последний раз редактировалось GreenWizard; 30.03.2012 в 00:31.
GreenWizard вне форума Ответить с цитированием
Старый 30.03.2012, 00:56   #3
ovaaal
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
1) "read(l2[i]);" зачем? как-то не логично
2) на всякое выделение должно быть освобождение)) вы выделили память через new - изволь вернуть её через dispose (если верно помню имя)
3) "stack^.nextnode:=nil;" куда тут мы лезим? stack же указатель и указывает на три весёлых буквы... в смысле, надо вначале написать new(stack) и выделить память под данные
4) общий стиль хромает, но, увы, на это плюют даже преподы.... лишние переменные, именование паршивое, неумение верно прописывать типы аргументов (var/const/none)
5) так-то вроде верно всё, если исправить п1-3
1) ну тут вроде да, что-то не то я надумал (хотя раз написал, значит какие-то мысли все же были на сей счет, ну да ладно... допустим убрали.
2) согласен, сморозил.
3)с этим немного неясно
4)преподы-шмеподы... в данный момент "я плюю на них", т.к. хочу для себя разобраться, но тот "препод", что у меня довольно-таки строго следит за так называемым стилем(но это так, отступление). лишние переменные возникли из-за того, что вначале я совсем не так хотел строить это программу, а убрать их и забыл, именование такое, из-за того, что я так понял принцип работы стека, как-то так...
5)с 3-им пунктом траблы
ovaaal вне форума Ответить с цитированием
Старый 30.03.2012, 09:26   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

у вас переменная stack имеет тип nodeptr т.е. указатель на nodetype т.е. самой структуры нет пока и это ошибка! компилятор выделил память под stack, но не под stack^ и нужно самостоятельно её выделять
-----
именование чем плохо напишу позже, бегу в спорт зал
GreenWizard вне форума Ответить с цитированием
Старый 30.03.2012, 14:55   #5
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

и так, замечания по именованию:
1) не отделяете слова.. ПрощеПрочестьТакоеВот, чемвоттакуюкашу это всё нужно не компу, не пользователю, а Вам т.к. снижает нагрузку на мозг и глаза
2) именование типов и переменных одинаковое... это +1 к нагрузке и -2 зрение через пару лет Хотя бы префикс Т ставьте, а лучше более расширенно именовать (например, R - record, S - Set, A - Array, C - Class и т.д. тогда "массив указателей на записи типа Item" = "APRItem", что информативно и лаконично).... тут есть один подводный камень: как быть, если тип меняется, сегодня это класс, а завтра запись? да, это проблема, но проблема в Вашем подходе к коду... не хочешь сразу спроектировать хорошо, продумать тип - плати штраф в виде рутины!
3) имена функций/процедур... т.к. это тестовый проект, лишь для обучения, то это допустимо, но лучше и тут дать имена толковые, например, Stack_Push или PushToStack
4) одинаковые имена параметров и глобальных переменных... как я обычно говорю: это работает, но огребёшь однажды старайтесь давать имена более-менее уникальные, чтоб не было пересечений... я вот, например, всё пытаюсь приучить себя к особому именованию переменных (локальные с буквы l, параметры с р и т.д.), но это сложно т.к. опыта программирования уже 8й год.. лучше сразу практиковать толковые методики, чем гробить себя
5) разберитесь с типами параметров... всегда вначале ставим const т. е. предполагаем, что параметр не будет меняться сам по себе (указатель на стек не изменится, но при этом сам стек можем менять).. если внутри функции нужно менять параметр "лишь раз" (сложно пояснить... это когда в функции решается одна подзадач, например, проход по стеку, но не проход и какая-то иная операция, которой нужен исходное значение параметра), то опускаем модификаторы (просто "xxx(param: type)" ) таким образом мы получаем локальную копию параметра... в самых крайних случаях, когда уверенны в подходе, можно использовать var-параметры, но по минимуму! т. е. не 3+ таких параметра, а одна структура с 3+ полями... не рационально, громоздко, но намного прозрачнее! увы, пример не приведу т.к. громоздкий весьма и спорный... на вкус и цвет фломастеры разные, НО жрать их одинаково вредно однозначно нужно вырабатывать свой стиль кода, самостоятельно приходить к пониманию того, что важнее читаемость кода т.к. программист читает код в разы чаще, чем пишет

уфф, что-то я разфилософствовался

Последний раз редактировалось GreenWizard; 30.03.2012 в 15:01.
GreenWizard вне форума Ответить с цитированием
Старый 31.03.2012, 20:55   #6
ovaaal
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
и так, замечания по именованию:
1) не отделяете слова.. ПрощеПрочестьТакоеВот, чемвоттакуюкашу это всё нужно не компу, не пользователю, а Вам т.к. снижает нагрузку на мозг и глаза
2) именование типов и переменных одинаковое... это +1 к нагрузке и -2 зрение через пару лет Хотя бы префикс Т ставьте, а лучше более расширенно именовать (например, R - record, S - Set, A - Array, C - Class и т.д. тогда "массив указателей на записи типа Item" = "APRItem", что информативно и лаконично).... тут есть один подводный камень: как быть, если тип меняется, сегодня это класс, а завтра запись? да, это проблема, но проблема в Вашем подходе к коду... не хочешь сразу спроектировать хорошо, продумать тип - плати штраф в виде рутины!
3) имена функций/процедур... т.к. это тестовый проект, лишь для обучения, то это допустимо, но лучше и тут дать имена толковые, например, Stack_Push или PushToStack
4) одинаковые имена параметров и глобальных переменных... как я обычно говорю: это работает, но огребёшь однажды старайтесь давать имена более-менее уникальные, чтоб не было пересечений... я вот, например, всё пытаюсь приучить себя к особому именованию переменных (локальные с буквы l, параметры с р и т.д.), но это сложно т.к. опыта программирования уже 8й год.. лучше сразу практиковать толковые методики, чем гробить себя
5) разберитесь с типами параметров... всегда вначале ставим const т. е. предполагаем, что параметр не будет меняться сам по себе (указатель на стек не изменится, но при этом сам стек можем менять).. если внутри функции нужно менять параметр "лишь раз" (сложно пояснить... это когда в функции решается одна подзадач, например, проход по стеку, но не проход и какая-то иная операция, которой нужен исходное значение параметра), то опускаем модификаторы (просто "xxx(param: type)" ) таким образом мы получаем локальную копию параметра... в самых крайних случаях, когда уверенны в подходе, можно использовать var-параметры, но по минимуму! т. е. не 3+ таких параметра, а одна структура с 3+ полями... не рационально, громоздко, но намного прозрачнее! увы, пример не приведу т.к. громоздкий весьма и спорный... на вкус и цвет фломастеры разные, НО жрать их одинаково вредно однозначно нужно вырабатывать свой стиль кода, самостоятельно приходить к пониманию того, что важнее читаемость кода т.к. программист читает код в разы чаще, чем пишет

уфф, что-то я разфилософствовался
В общем: огромное спасибо, просто приятен тот факт, что мне уделили внимание и не восприняли в штыки
Вы меня недопоняли и я не понимал, что от меня хотят, я и сейчас если честно, толком объяснить не могу чего я хотел, но это должно было быть примерно так: стек, динамич. структура, я ввожу строку и мне должно (по моей задумке) выводить её задом-наперед+ещё раз задом-наперед, т.е. я ввожу например слово "код" мне посредством "структуры"(LIFO) стека выводит его как "док", ну а я же добивался того, чтобы я получил обратно слово "код", т.е. (т.к. я уже немного разобрался во всем этом) мне следовало просто "запихнуть" полученное "док" в стек и оно бы вывело, то чего я добивался. Ещё раз огромное спасибо. И про наставления тоже огромное спасибо (они даже чем-то мотивируют).
Теперь-то и я вижу, что код отвратный, но это из-за не правильно усвоенной теор. части, когда я разобрался что к чему, то такие вещи как стек (которые казались мне очень скучными и сложноватыми) оказались весьма простыми
ovaaal вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] Создать очередь и скопировать в стек go.d_bq Помощь студентам 4 17.05.2011 23:23
Turbo Pascal Стек Dower Помощь студентам 11 26.04.2011 12:35
Двумерный массив с динамической переменной Pascal AxisNet Помощь студентам 1 17.11.2009 14:33
Pascal Множества, стек, списки, очередь. RrR5 Помощь студентам 4 26.01.2009 15:00
Проблемы с динамической структурой данных Mailz Общие вопросы C/C++ 1 21.05.2008 00:18