Я учусь на 1 курсе факультета комп. наук. Мы изучаем Delphi. Сейчас тема "стеки". Зашел в интернет посмотреть как их записать, описать.. . И тут: "я ничего не понимаю!! ! (((". (До этого была работа с файлами и там всё интуитивоно (!) понятно: Memo1.Lines, Edit1.Text и тп) . То есть я понимаю как написать простые задачи в консольном режиме или массивы, например. Но, наткнувшись на пример задачи со стеком, я понял, что я не понимаю программирование. Вот пример задачи:
Program stek;
Type
EXST = ^ST; Что это за галочки вдруг появились.. .
ST = record
Data : char;
Next : EXST;
End;
Var
Stack : EXST
i : integer;
f : text;
Stroka : string;
c : char;
Procedure writeStack(Var u : EXST; Simvol : char); - посему например тут VAR внутри процедуры, а обычно он отдельно?.. .
Var
x : EXST;
Begin
new(x);
x^.Data := Simvol;
x^.Next := u;
u := x;
End;
Procedure Print(Var u : EXST);
Begin
while u <> Nil - это вообще не понятно
Begin
write (u^.Data);
u := u^.Next;
End;
End;
Begin
Stack := Nil;
Assign(f, 'c:\autoexec.bat');
Reset(f);
while Not Eof(f) do
Begin
readln (f, Stroka);
For i := 1 to Length(Stroka) do
writeStack(Stack, Stroka);
End;
close(f);
Print(Stack);
End.
Вообщем что я хочу спросить: есть ли какие-то книги которые детально излагают про каждую процедуру, рекорд, тайп и тп. Я скачал несколько книг, но там вначале совсем основы (типа что такое алгоритм) , а потом сразу примеры с бинарным поиском и тп.
Я просто не понимаю, когда какие процедуры нужно добавлять.
То есть до этого было просто
var
begin
(цикл )
end.
Другие языки программирования и технологии
Как ПОНЯТЬ структруру программирования? (внутри)
Указатели: http://citforum.ru/programming/bp70_ug/bp70ug_08.shtml
Передача параметров по ссылке: параметры, передаваемые по ссылке (var в объявлении) , будут изменяться вне функции. Т. е.
function a(var b:integer);
begin b:=100; end;
...
x:=10;
a(x);
сделает x равным 100.
type - объявление ТИПА, var- объявление переменной.
Если объявлено
type mas = array[1..100] of integer;
то запись
var m: array[1..100] of integer;
будет эквивалентна
var m:mas;
И вообще, в делфи неплохая справка есть.
Если еще вопросы - есть пиши на почту, только не забудь уточнить, по какому вопросу.
Передача параметров по ссылке: параметры, передаваемые по ссылке (var в объявлении) , будут изменяться вне функции. Т. е.
function a(var b:integer);
begin b:=100; end;
...
x:=10;
a(x);
сделает x равным 100.
type - объявление ТИПА, var- объявление переменной.
Если объявлено
type mas = array[1..100] of integer;
то запись
var m: array[1..100] of integer;
будет эквивалентна
var m:mas;
И вообще, в делфи неплохая справка есть.
Если еще вопросы - есть пиши на почту, только не забудь уточнить, по какому вопросу.
type — это служебное слово для описания типа переменных — создание пользовательских типов!
В примере описаны типы EXTS и ST.
^ — говорит, что это не переменная, а ссылка на переменную, которая будет размещена в свободном адресном пространстве − «куче» . Для ссылочных типов допустимо «предописание» : тип ещё не описан, а ссылка на него уже описывается!
EXST = ^ST; — ссылка на тип ST
ST = record — описание типа записи
Data : char; — для хранения символов
Next : EXST; — ссылка для связи со следующей записью
End;
Var Stack : EXST; — описание переменной, в которой будет храниться ссылка на вершину стека
Пока память под переменную стека не выделена (оператором New), значение переменной = nil — пусто.
В параметрах процедуры, если перед именем переменной стоит служебное слово var, это значит, что изменённое значение переменной будет возвращено в основную программу.
К примеру:
procedure Adding(var Num : Word; Slog : Word);
begin
Num := Num + Slog;
end;
Вызов такой процедуры будет увеличивать переданное в процедуру значение:
N := 1;
Adding(N, 10);
WriteLn(N);
В результате приведённого кода, будет выведено значение 11…
В описанной процедуре:
Procedure writeStack(Var u : EXST; Simvol : char);
После добавления очередного символа Simvol к стеку, значение u поменяется на ссылку на только-что добавленный в стек символ, т. е. на вершину стека!
(Принцип работы стека: первый вошел — последний вышел / последний вошёл — первый вышел ;-)
while u <> Nil do — по русски будет так: пока не все элементы стека…
u := u^.Next; — получаем следующий элемент.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Про массивы:
Если описание массива нужно использовать неоднократно (в разных частях программы) и/или нужно передавать массив в качестве параметра, то его нужно описать как тип.
К примеру:
type L : array [1..10] of Integer; { описываем строки массива как отдельный массив }
var M : array [1..5] of L; { описываем массив 5х10 как 5 строк типа L }
…
{ функция нахождения максимального значения строки массива }
function mMax(M : L) : Integer;
var i : Byte; Max : Integer;
begin
Max := M[1];
for i := 2 to 10 do
if M[ i ] > Max then Max := M[ i ];
end;
…
M[1, 1] := 15; { обращаемся к конкретной ячейке массива }
…
for i := 1 to 5 do
WriteLn('Максимальный элемент ', i, ' строки = ', M[ i ]); { вывод максимальных элементов строк — обращаемся к строке массива }
…
В примере описаны типы EXTS и ST.
^ — говорит, что это не переменная, а ссылка на переменную, которая будет размещена в свободном адресном пространстве − «куче» . Для ссылочных типов допустимо «предописание» : тип ещё не описан, а ссылка на него уже описывается!
EXST = ^ST; — ссылка на тип ST
ST = record — описание типа записи
Data : char; — для хранения символов
Next : EXST; — ссылка для связи со следующей записью
End;
Var Stack : EXST; — описание переменной, в которой будет храниться ссылка на вершину стека
Пока память под переменную стека не выделена (оператором New), значение переменной = nil — пусто.
В параметрах процедуры, если перед именем переменной стоит служебное слово var, это значит, что изменённое значение переменной будет возвращено в основную программу.
К примеру:
procedure Adding(var Num : Word; Slog : Word);
begin
Num := Num + Slog;
end;
Вызов такой процедуры будет увеличивать переданное в процедуру значение:
N := 1;
Adding(N, 10);
WriteLn(N);
В результате приведённого кода, будет выведено значение 11…
В описанной процедуре:
Procedure writeStack(Var u : EXST; Simvol : char);
После добавления очередного символа Simvol к стеку, значение u поменяется на ссылку на только-что добавленный в стек символ, т. е. на вершину стека!
(Принцип работы стека: первый вошел — последний вышел / последний вошёл — первый вышел ;-)
while u <> Nil do — по русски будет так: пока не все элементы стека…
u := u^.Next; — получаем следующий элемент.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Про массивы:
Если описание массива нужно использовать неоднократно (в разных частях программы) и/или нужно передавать массив в качестве параметра, то его нужно описать как тип.
К примеру:
type L : array [1..10] of Integer; { описываем строки массива как отдельный массив }
var M : array [1..5] of L; { описываем массив 5х10 как 5 строк типа L }
…
{ функция нахождения максимального значения строки массива }
function mMax(M : L) : Integer;
var i : Byte; Max : Integer;
begin
Max := M[1];
for i := 2 to 10 do
if M[ i ] > Max then Max := M[ i ];
end;
…
M[1, 1] := 15; { обращаемся к конкретной ячейке массива }
…
for i := 1 to 5 do
WriteLn('Максимальный элемент ', i, ' строки = ', M[ i ]); { вывод максимальных элементов строк — обращаемся к строке массива }
…
Вникать в код не стал - это детали синтаксиса конкретной версии:
Стек
Представь себе яму. В неё сверху наваливаешь. потом достаёшь. что последним навалил, то первым и вылезло
Проги обычно передают параметры как раз через такое, а список параметров функций - указание сколько достать и как распихать.
галочки "^" в паскалях работа с указателями на кусок памяти в котором та переменная, а не прямое её называние
А про книжки:
советую "Керниган Ричи'Язык С' "
Это не паскаль, но на этом многое основано и в том же паскале используется
Стек
Представь себе яму. В неё сверху наваливаешь. потом достаёшь. что последним навалил, то первым и вылезло
Проги обычно передают параметры как раз через такое, а список параметров функций - указание сколько достать и как распихать.
галочки "^" в паскалях работа с указателями на кусок памяти в котором та переменная, а не прямое её называние
А про книжки:
советую "Керниган Ричи'Язык С' "
Это не паскаль, но на этом многое основано и в том же паскале используется
Ищите материал по динамическому управлению памятью и по указателям.
Очень важно понять этот материал, если собираетесь и дальше программировать.
Очень важно понять этот материал, если собираетесь и дальше программировать.
Книга "библия дэлфи" М. Фленова самая путевая, чтобы понять хотябы основы программирования, там все есть и доступным языком написано, и примеры жизненные. Я учился уже на 2 курсе факультета информационных технологий и точно также в начале не вник в тему работа с динамической памятью и дальше стал скатываться т. к в программирование все основывается друг на друге. В итоге прочитал много книжек и только эта помогла наконец понять смысл динамики и не только. я даже сейчас когда делаю по работе какие либо приложения изредка обращаюсь к данной книге за помощью. Также у Фленова хорошая книга библия С# для изучения основ Visual Studio, данный язык в наше время набирает обороты, а дэлфи уже вымирает...
в type ты сам создаешь типы данных
пример
type govno=array[1..6] of integer
а в var пишем
x:govno;
мы создали новый тип данных ГОВНО который есть просто массив из 6 елементов типа интежер
понты и не более
короч не надо этого
пример
type govno=array[1..6] of integer
а в var пишем
x:govno;
мы создали новый тип данных ГОВНО который есть просто массив из 6 елементов типа интежер
понты и не более
короч не надо этого
Похожие вопросы
- Вопрос по WEB Дизайну/программированию - внутри фото.
- Вопрос по обучению в программировании (внутри, важно)
- Может ли понять язык программирования человек не дружащий с алгеброй?
- Как понять что программирования это для тебя ?
- Можно самому понять математику, программирование, если есть желание и упорство?
- что надо прочитать перед изучением языков программирования, чтобы понять всю суть вообще программирования ...
- Какой язык программирования выбрать для изучения для начинающего ? (внутри)
- Вообще не когда не понимал людей которые учат программирование именно ради заработка (Внутри весь крик души)
- Программирование для „чаиника”. Подскажите… (внутри)
- Необходимо консультация по реальности проекта, и выбору языка программирования для реализации нейросети. Подр. и внутри.
u := u^.Next
x := u
i := u^.Data