Полная версия этой страницы:
стеки и очереди в паскале
Palpalich
01 Dec 2008, 20:28
прошу помогите решить задачку на Стеки и очереди.
Сформировать файл из натуральных чисел. Разработать функцию, вычисляющую среднее арифметическое элементов списка, построенного из элементов файла.
никак не могу сладить с ней.... уже аж псих берёт...
Ниасилил: "Сформировать файл из натуральных чисел", "построенного из элементов файла".
Причем, файлы бывают разные, и какбэ где очереди и стеки?
Реализуешь стек.
С помощью Random формируешь файл.
Записываешь все числа в стек.
Потом вытаскиваешь и считаешь среднее.
Зачем здесь стек непонятно, можно просто циклом пройтись по файлу и посчитать среднее.
gamecreator
04 Dec 2008, 17:59
скорей всего чтобы отрепетировать проход по элементам стека
ну хоть немножко смысла все же должно быть.
Shaidar Haran
04 Dec 2008, 18:42
Цитата(Монца @ 04 Dec 2008, 20:12)
ну хоть немножко смысла все же должно быть.
не ищи особый смысл в лабораторной работе) он должен ПОНЯТЬ, как это делается, и САМ сделать - если вы решите за него, это ничем ему не поможет.
Palpalich
04 Dec 2008, 21:26
это поможет мне остаться на факультете, просто нет времени разбираться с задачей, а сдавать по любому нужно.... я надеюсь, что среди читателей этой темы найдётся добрая душа кот. пришлёт хоть отрывок листинга программы... заранее благодарен

просто войдите в моё положение....
Palpalich
07 Dec 2008, 14:26
может сдесь нужно сначала создать файл, а потом из этого файла данные "заталкать в стек"??

я просто не понимаю вообще что делать, и как это делать, да и как это со стеком реализовать...
Guevara-chan
07 Dec 2008, 15:08
Цитата
может сдесь нужно сначала создать файл, а потом из этого файла данные "заталкать в стек"?
Вполне возможно. Кстати, хотят, кажется, списковый стек, а не стандартный блочный... Впрочем, лично мне условие тоже не вполне ясно, ибо уж очень оно слабо коррелирует с заголовком.
Palpalich
07 Dec 2008, 16:04
а мне то что делать, если я в программировании не секу?Chrono Syndrome помоги если можешь решить задачу, я протсто её не вывезу, а за Shaidar Haran извини, погоричился, просто не люблю когда у людей язык длинноват...
Guevara-chan
07 Dec 2008, 16:23
Да я-то могу спокойно решать такие задачи в любых кол-вах, затрачивая на это минимум времени и усилий. Но только, увы, не на TP7...
--------------------
Алгоритм, вот, описать могу. Блок-схему нарисовать могу. Код решения на PB, Blitz3D, QB, VB, PCForth, AutoIT или Win32FORTH дать могу. А вот сделать за тебя лабораторную работу - увы, не могу.
Shaidar Haran
07 Dec 2008, 16:25
Берем file of word, из него читаем числа поэлементно в список указателей. Далее, когда выстроится список целиком (достигнут eof файла), пробегаемся по нему и считаем сумму элементов и их количество. Далее делим оную сумму на оное количество.
Нормальное задание для лабораторной работы по указателям, сам такие давал)
Кодь, естественно, сам - за время, кое ты терроризируешь нас, можно СТО РАЗ разобраться в материале с нуля.
Guevara-chan
07 Dec 2008, 16:30
Цитата(Shaidar Haran @ 07 Dec 2008, 17:25)
Берем file of word, из него читаем числа поэлементно в список указателей. Далее, когда выстроится список целиком (достигнут eof файла), пробегаемся по нему и считаем сумму элементов и их количество. Далее делим оную сумму на оное количество.
Не Eof, это только для plain text). Просто читать word'ы пока позиция меньше длинны файла.
Цитата
Нормальное задание для лабораторной работы по указателям, сам такие давал)
Вопрос лишь: а причем здесь, собственно, пиво "Сок[зачеркнуто] стеки с очередями ?
Shaidar Haran
07 Dec 2008, 17:05
Цитата(Chrono Syndrome @ 07 Dec 2008, 18:30)
Цитата(Shaidar Haran @ 07 Dec 2008, 17:25)
Берем file of word, из него читаем числа поэлементно в список указателей. Далее, когда выстроится список целиком (достигнут eof файла), пробегаемся по нему и считаем сумму элементов и их количество. Далее делим оную сумму на оное количество.
Не Eof, это только для plain text). Просто читать word'ы пока позиция меньше длинны файла.
В Паскале ЕоФ применим к любому типа файла, хоть ты of record его сделай.
Цитата(Chrono Syndrome @ 07 Dec 2008, 18:30)
Цитата
Нормальное задание для лабораторной работы по указателям, сам такие давал)
Вопрос лишь: а причем здесь, собственно, пиво "Сок[зачеркнуто] стеки с очередями ?
Ну так список указателей и есть стек, бтв, если рассматривать его структуру.
Guevara-chan
07 Dec 2008, 17:26
Цитата
В Паскале ЕоФ применим к любому типа файла, хоть ты of record его сделай.
А, ну тогда да.
Цитата
Ну так список указателей и есть стек, бтв, если рассматривать его структуру.
LIFO ?
Цитата(Shaidar Haran @ 04 Dec 2008, 18:42)
Цитата(Монца @ 04 Dec 2008, 20:12)
ну хоть немножко смысла все же должно быть.
не ищи особый смысл в лабораторной работе) он должен ПОНЯТЬ, как это делается, и САМ сделать - если вы решите за него, это ничем ему не поможет.
ППКС...
ато понимаешь пришел с простым вопросом... да еще и хамит...
Shaidar Haran
07 Dec 2008, 20:40
Цитата(Chrono Syndrome)
LIFO ?
Эээ.. Ммм. FIFO я б сказал, ибо строится и читается с начала до конца.
sergroj
08 Dec 2008, 01:59
Whatever In Whatever Out
Guevara-chan
08 Dec 2008, 13:13
Цитата
Эээ.. Ммм. FIFO я б сказал, ибо строится и читается с начала до конца.
А стек-то LIFO по определению.
Shaidar Haran
08 Dec 2008, 14:44
Цитата(Лекции по Паскалю)
При программировании на Паскале стек чаще всего реализуется в виде однонаправленного списка. Каждый элемент структуры содержит указатель на следующий.
Это означает, что стек мы определяем следующим образом:
Код
Type
EXST = ^ST;
ST = record
Data : integer;
Next : EXST;
end;
Var
Stack : EXST; {Текущая переменная}
Это имхо FIFO, ибо он и заполняется от первой к последней, и читается от первой к последней (если мы, конечно, предусмотрительно сохранили где-то указатель на первую переменную. если не сохранили - стек потерян). Вот так вот)
Palpalich
08 Dec 2008, 16:31
ребят, стек описывается вот так в паскале:
Program r;
Uses crt;
Type ss=^zveno;
Zveno=record
inf:integer;
next:ss;
End;
Var p,l1,r1,l2,r2:ss;
c,a,b,i,n:integer;
f:file of integer;
я саму программу при всём своём желании не напишу, т.к. в паскале не секу....
Guevara-chan
08 Dec 2008, 21:55
Цитата(Shaidar Haran @ 08 Dec 2008, 15:44)
Цитата(Лекции по Паскалю)
При программировании на Паскале стек чаще всего реализуется в виде однонаправленного списка. Каждый элемент структуры содержит указатель на следующий.
Это означает, что стек мы определяем следующим образом:
Код
Type
EXST = ^ST;
ST = record
Data : integer;
Next : EXST;
end;
Var
Stack : EXST; {Текущая переменная}
Это имхо FIFO, ибо он и заполняется от первой к последней, и читается от первой к последней (если мы, конечно, предусмотрительно сохранили где-то указатель на первую переменную. если не сохранили - стек потерян). Вот так вот)
Забавно. Вот только стек обычно используется для хранения вложенных данных, а потому первым оттуда читается последний параметр. Впрочем он и реализуется, если по нормальному, тупым указателем на позицию последней записи в заранее выделенный участок памяти. Остальное - как бы изврат).
Palpalich
12 Dec 2008, 11:43
люди, напишите пожалуйста, хотя бы функцию, которая бы считала среднее арифмитическое, используя стек..
Tervyn
12 Dec 2008, 12:48
Мученик, блин. Так до сих пор и не сдал?
Код
program StackDemo;
{ Название файла с данными }
const
AFileName = 'file.txt';
{ Описание стека }
type
PIntStack = ^TIntStack;
TIntStack = record
Data: Integer;
Next: PIntStack;
end;
{ Инициализация стека }
procedure Init(var AStack: PIntStack);
begin
AStack := nil;
end;
{ Завершение работы со стеком }
procedure Done(var AStack: PIntStack);
var
P: PIntStack;
begin
while (AStack <> nil) do
begin
P := AStack^.Next;
Delete(AStack);
AStack := P;
end;
end;
{ Проталкивание элемента в стек }
procedure Push(AData: Integer;var AStack: PIntStack);
var
P: PIntStack;
begin
P := nil;
New(P);
if (P = nil) then Exit;
P^.Data := AData;
P^.Next := AStack;
AStack := P;
end;
{ Выталкивание элемента из стека }
function Pop(var AData: Integer; var AStack: PIntStack): Boolean;
var
P: PIntStack;
begin
if (AStack = nil) then
begin
Pop := False;
Exit;
end;
P := AStack^.Next;
AData := AStack^.Data;
Delete(AStack);
AStack := P;
Pop := True;
end;
var
F: file of Integer; { переменная файла }
S: Stack; { переменная стека }
X, Y, Z: Integer; { временные переменные для работы }
begin
{ Привязка переменной к имени }
Assign(F, AFileName);
{ Отключение встроенной проверки Паскаля }
{$I-}
{ Открытие файла }
Reset(F);
{ Включение встроенной проверки Паскаля }
{$I+}
{ Проверка прошло ли открытие файла успешно }
if (IOResult <> 0) then
begin
WriteLn('Не могу открыть файл!');
Halt(0);
end;
{ Создание пустого стека }
Init(S);
{ Заталкивание элементов файла в стек }
while not Eof(F) do
begin
Read(F, X);
Push(X, S);
end;
{ Закрытие файла }
Close(F);
{ Подсчет суммы и количества элементов в стеке }
Z := 0;
Y := 0;
while Pop(X, S) do
begin
Y := Y + X;
Z := Z + 1;
end;
{ Собственно расчет среднего арифметического }
{ Считал в целочисленном варианте, хотя это не принципиально }
X := Y div Z;
WriteLn('Среднее арифметическое элементов файла: ', X);
{ Удаление стека }
{ Конкретно в этой проге это вобщем-то не нужно, }
{ Но на всякий случай - чтобы препод проперся:) }
Done(S);
end.
Сразу же скажу - Паскалем не пользовался лет 7, ибо он хорош только для учебы. Искать ссылки на книжку и читать было влом. Потому писал по памяти
и могут быть ошибки синтаксиса. Или еще какие. Так что разбирайся сам -
комментариев я везде натыкал
Shaidar Haran
12 Dec 2008, 12:57
Черта с два он это сдаст. Спорим, даже целочисленное деление на обыкновенное заменить не сможет?
Guevara-chan
12 Dec 2008, 13:14
Цитата
люди, напишите пожалуйста, хотя бы функцию, которая бы считала среднее арифмитическое, используя стек..
Хех, у меня тут еще вариант родился:
Код
((
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Stack average num demo (Win32FORTH).
Developed in 2008 by Chrono Syndrome.
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
))
\ Cреднее значение
: Average { \ SDepth -- }
Depth TO SDepth 0E
Begin Depth While S>F F+ Repeat
SDepth S>F F/
;
\ Приводим число к строчке.
: F>Z { \ $buf -- }
MAXSTRING LocalAlloc: $buf
$BUF (F.) $BUF Count ASCIIZ
;
: Create-Random-File { \ FHandle -- }
GENERIC_WRITE CREATE-FILE DROP to FHandle \ Создаем файл.
20 Random 10 + 0 DO \ Начинаем цикл.
30 Random 1+ SP@ CELL FHandle write-file 2DROP \ Вписываем случайные значения.
LOOP FHandle Close-File DROP \ Закрываем файл.
;
: ReadFile2Stack { \ FHandle -- }
GENERIC_READ OPEN-FILE DROP to FHandle \ Открываем файл
BEGIN FHANDLE file-position DROP FHANDLE File-Size DROP DU< WHILE \ Начинаем цикл.
0 SP@ CELL FHandle Read-file 2DROP \ Читаем значения прямо на стек.
REPEAT FHandle Close-File DROP \ Закрываем файл.
;
s" Random.dat" 2VALUE FName \ Временный файл с данными.
FName CReate-Random-File \ Вписываем числа.
NOSTACK FName ReadFile2Stack CHECKSTACK \ Читаем числа на стек.
FName DELETE-FILE DROP \ Удаляем временный файл.
Average \ Считаем среднее значение.
F>Z z" Average value:" 0 NULL MESSAGEBOX DROP \ Выдаем среднее значение.
...15 минут кодинга отсилы). И то, в основном, из-за глючного IDE да корявой документации.
Palpalich
12 Dec 2008, 16:28
Tervyn огромное спасибо!!!!! единственный нормальный человек на форуме!!!!!!!! да так же Chrono Syndrome пасибо, ловите плюсы...
Отмодерировано
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.