Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: стеки и очереди в паскале
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Palpalich
прошу помогите решить задачку на Стеки и очереди.
Сформировать файл из натуральных чисел. Разработать функцию, вычисляющую среднее арифметическое элементов списка, построенного из элементов файла.
никак не могу сладить с ней.... уже аж псих берёт... banghead.gif
Azure
Ниасилил: "Сформировать файл из натуральных чисел", "построенного из элементов файла".

Причем, файлы бывают разные, и какбэ где очереди и стеки?
Монца
Реализуешь стек.
С помощью Random формируешь файл.
Записываешь все числа в стек.
Потом вытаскиваешь и считаешь среднее.
Зачем здесь стек непонятно, можно просто циклом пройтись по файлу и посчитать среднее.
gamecreator
скорей всего чтобы отрепетировать проход по элементам стека
Монца
ну хоть немножко смысла все же должно быть.
Shaidar Haran
Цитата(Монца @ 04 Dec 2008, 20:12)
ну хоть немножко смысла все же должно быть.

не ищи особый смысл в лабораторной работе) он должен ПОНЯТЬ, как это делается, и САМ сделать - если вы решите за него, это ничем ему не поможет.
Palpalich
это поможет мне остаться на факультете, просто нет времени разбираться с задачей, а сдавать по любому нужно.... я надеюсь, что среди читателей этой темы найдётся добрая душа кот. пришлёт хоть отрывок листинга программы... заранее благодаренsmile.gif просто войдите в моё положение....
Palpalich
может сдесь нужно сначала создать файл, а потом из этого файла данные "заталкать в стек"??smile.gif я просто не понимаю вообще что делать, и как это делать, да и как это со стеком реализовать...
Guevara-chan
Цитата
может сдесь нужно сначала создать файл, а потом из этого файла данные "заталкать в стек"?

Вполне возможно. Кстати, хотят, кажется, списковый стек, а не стандартный блочный... Впрочем, лично мне условие тоже не вполне ясно, ибо уж очень оно слабо коррелирует с заголовком.
Palpalich
а мне то что делать, если я в программировании не секу?Chrono Syndrome помоги если можешь решить задачу, я протсто её не вывезу, а за Shaidar Haran извини, погоричился, просто не люблю когда у людей язык длинноват...
Guevara-chan
Да я-то могу спокойно решать такие задачи в любых кол-вах, затрачивая на это минимум времени и усилий. Но только, увы, не на TP7...
--------------------
Алгоритм, вот, описать могу. Блок-схему нарисовать могу. Код решения на PB, Blitz3D, QB, VB, PCForth, AutoIT или Win32FORTH дать могу. А вот сделать за тебя лабораторную работу - увы, не могу.
Shaidar Haran
Берем file of word, из него читаем числа поэлементно в список указателей. Далее, когда выстроится список целиком (достигнут eof файла), пробегаемся по нему и считаем сумму элементов и их количество. Далее делим оную сумму на оное количество.
Нормальное задание для лабораторной работы по указателям, сам такие давал)
Кодь, естественно, сам - за время, кое ты терроризируешь нас, можно СТО РАЗ разобраться в материале с нуля.
Guevara-chan
Цитата(Shaidar Haran @ 07 Dec 2008, 17:25)
Берем file of word, из него читаем числа поэлементно в список указателей. Далее, когда выстроится список целиком (достигнут eof файла), пробегаемся по нему и считаем сумму элементов и их количество. Далее делим оную сумму на оное количество.

Не Eof, это только для plain text). Просто читать word'ы пока позиция меньше длинны файла.

Цитата
  Нормальное задание для лабораторной работы по указателям, сам такие давал)

Вопрос лишь: а причем здесь, собственно, пиво "Сок[зачеркнуто] стеки с очередями ?
Shaidar Haran
Цитата(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
Цитата
В Паскале ЕоФ применим к любому типа файла, хоть ты of record его сделай.

А, ну тогда да.

Цитата
Ну так список указателей и есть стек, бтв, если рассматривать его структуру.

LIFO ?
Druin
Цитата(Shaidar Haran @ 04 Dec 2008, 18:42)
Цитата(Монца @ 04 Dec 2008, 20:12)
ну хоть немножко смысла все же должно быть.

не ищи особый смысл в лабораторной работе) он должен ПОНЯТЬ, как это делается, и САМ сделать - если вы решите за него, это ничем ему не поможет.

ППКС...
ато понимаешь пришел с простым вопросом... да еще и хамит...
Shaidar Haran
Цитата(Chrono Syndrome)
LIFO ?
Эээ.. Ммм. FIFO я б сказал, ибо строится и читается с начала до конца.
sergroj
Whatever In Whatever Out smile.gif
Guevara-chan
Цитата
Эээ.. Ммм. FIFO я б сказал, ибо строится и читается с начала до конца.

А стек-то LIFO по определению.
Shaidar Haran
Цитата(Лекции по Паскалю)
При программировании на Паскале стек чаще всего реализуется в виде однонаправленного списка. Каждый элемент структуры содержит указатель на следующий.
Это означает, что стек мы определяем следующим образом:
Код
Type
 EXST = ^ST;
 ST = record
      Data : integer;
      Next : EXST;
 end;
Var
 Stack : EXST; {Текущая переменная}

Это имхо FIFO, ибо он и заполняется от первой к последней, и читается от первой к последней (если мы, конечно, предусмотрительно сохранили где-то указатель на первую переменную. если не сохранили - стек потерян). Вот так вот)
Palpalich
ребят, стек описывается вот так в паскале:
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;
я саму программу при всём своём желании не напишу, т.к. в паскале не секу....sad.gif
Guevara-chan
Цитата(Shaidar Haran @ 08 Dec 2008, 15:44)
Цитата(Лекции по Паскалю)
При программировании на Паскале стек чаще всего реализуется в виде однонаправленного списка. Каждый элемент структуры содержит указатель на следующий.
Это означает, что стек мы определяем следующим образом:
Код
Type
 EXST = ^ST;
 ST = record
      Data : integer;
      Next : EXST;
 end;
Var
 Stack : EXST; {Текущая переменная}

Это имхо FIFO, ибо он и заполняется от первой к последней, и читается от первой к последней (если мы, конечно, предусмотрительно сохранили где-то указатель на первую переменную. если не сохранили - стек потерян). Вот так вот)

Забавно. Вот только стек обычно используется для хранения вложенных данных, а потому первым оттуда читается последний параметр. Впрочем он и реализуется, если по нормальному, тупым указателем на позицию последней записи в заранее выделенный участок памяти. Остальное - как бы изврат).
Palpalich
люди, напишите пожалуйста, хотя бы функцию, которая бы считала среднее арифмитическое, используя стек..
Tervyn
Мученик, блин. Так до сих пор и не сдал?
Код
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
Черта с два он это сдаст. Спорим, даже целочисленное деление на обыкновенное заменить не сможет?
Guevara-chan
Цитата
люди, напишите пожалуйста, хотя бы функцию, которая бы считала среднее арифмитическое, используя стек..

Хех, у меня тут еще вариант родился:

Код
((
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
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
Tervyn огромное спасибо!!!!! единственный нормальный человек на форуме!!!!!!!! да так же Chrono Syndrome пасибо, ловите плюсы...
Отмодерировано
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.