Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: стеки и очереди в паскале (доделать)
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Palpalich
люди помогите дорешать задачу:
Сформировать файл из натуральных чисел. Разработать функцию, вычисляющую среднее арифметическое элементов списка, построенного из элементов файла.
CODE
program StackDemo;
uses crt;
const
AFileName = 'file.txt';
type
PIntStack = ^TIntStack;
TIntStack = record
Data: Integer;
Next: PIntStack;
end;
stek= PIntStack;
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;
dispose(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;
dispose(AStack);
AStack := P;
Pop := True;
end;
var
F: file of integer;
S: PIntStack;
X, Z, Y: Integer; q:real;
begin clrscr;
Assign(F, 'file.txt');
rewrite(F);
WriteLn('vvedite chisla');
repeat
readln(x);
write(F,x);
until x=0;
close(F);
Assign(F, 'file.txt');
Reset(F);
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;
q := Y/Z;
WriteLn('srednee ar: ', q);
done(s);
readkey;
end.



в принципе задача решена, но не доделана... мне нужно заталкать вот это
CODE
Z := 0;
Y := 0;
while Pop(X, S) do
begin
Y := Y + X;
Z := Z + 1;
end;
q := Y/Z;

в процедуру, т.к. в условии сказано.. и ещё нужно определить конец ввода, т.к. если сделать его =0, то ноль тоже будет вычисляться... помогите плиииз...

Паапрасил бы оформлять посты по-человечески. //Неизвестный Модератор
Tervyn
Ну запихнуть в функцию не проблема, добавляется функция:
Код
function CalcMedArValue(var AStack: PIntStack): Real;
var
  X, Y, Z: Integer;
begin
 Z := 0;
 Y := 0;
 while Pop(X, AStack) do
 begin
    Y := Y + X;
    Z := Z + 1;
 end;
 CalcMedArValye := Y/Z;
end;

Вместо всего расчета добавляется:
Код
Q := CalcMedArValue(S);

Ну и из объявлений глобальных переменных можно видимо удалить Y, Z. Вроде они больше не используются.

Ну а для ограничения ввода можно так:
Добавляем в объвление глобальных переменных переменную
var
Ch: Char;
И фрагмент:
Код
WriteLn('vvedite chisla');
repeat
readln(x);
write(F,x);
until x=0;

заменяем на
Код
WriteLn('vvedite chisla');
repeat
 ReadLn(X);
 Ch := 'N';
 if X = 0 then
 begin
   WriteLn('Прервать ввод?');
   Ch := ReadKey;
   if (Ch = 'Y') or (Ch = 'y') then
     Break;    
 end;
 Write(F, X);
until ((X = 0) and ((Ch = 'y') or (Ch = 'Y')));

Если ввести 0 как число будет задан вопрос - Прервать ввод? если нажать 'y' или 'Y' ввод прервется без записи 0 в файл. Любая другая клавиша - 0 записывается в файл и ввод чисел продолжается
Palpalich
Tervyn я тебе по гроб жизни обязан буду!!!!! огромное пасибо!!!!!!!!!!! Tervyn рулит!!!! good.gif
Tervyn
Да мелочи)
Shaidar Haran
Цитата(Tervyn @ 18 Dec 2008, 21:38)
Да мелочи)

Мелочи мелочами, а думаешь куда он со следующими своими лабами прибежит?
Guevara-chan
Да пусть бежит, пока ведет себя пристойно. Нам что, жалко что-ли ?
Tervyn
Шайдар, ну разок помочь сдать лабы и получить зачет можно ведь? Ты же всегда на форуме таким не предвзятым выглядишь, а тут так четко прослеживается неприязнь к человеку. У меня были знакомые которые для двух последовательных циклов (не вложенных) заводили две переменные в программе, и не понимали почему одной можно обойтись. Ты бы их тоже осудил? А они учились по специальности ...ммм... не вспоню щас, но лабы по кафедральным предметам - паять микросхемы. Зачем им Паскаль? А зачет сдавать нужно... Да и потом - я же комментирую как и что делаю. Вот помню у меня был курс в универе - Теория Языков Программирования. И третья лаба из пяти была написать интерпретатор заданного языка программирования (не целиком, а только часть функций). Я вроде все правильно делал - а прога уходила в бесконечный цикл. Подхожу к преподу - так мол и так, а он на меня смотрит широко раскрытыми глазами и говорит - я не понимаю почему не работает, все вроде правильно. Препод асприрант был, и не из лучших. Я потратил три месяца, нашел ошибку (грамматика языка не верно была задана, а прога нормальная) и сдал лабу. Но я ведь с 10ти лет программированием увлекся, мне интересно было. Да и время было. А одногрупники скатывали прогу тупо и пытались сдавать. И они кстати действительно не заменили бы целочисленной деление на дробное. Только как такому преподу сдавать? Препод ведь не только принимать должен, но и помочь если все плохо. А не говорить что сам не понимает. Ситуации разные бывают...
Shaidar Haran
Я в данный момент веду как раз то, о чем он просит. Я вижу своих студентов, вижу их глаза, в которых читается "да клал я на твои объяснения, потом скатаю текст и сдам без защиты", и так действительно получается.
У меня полгруппы ничего рассказать на защите не могут, хотя я пошагово объяснял ВООБЩЕ ВСЕ лабораторные - от них требовалось только слегка их модифицировать!
Потому терпеть не могу такого вот "решите мне задачу плз". Ну решил ты ему задачу, а польза-то где? Лучше б он ночь посидел почитал учебник по Паскалю, но написал бы эту лабу сам - не такая уж она и страшная.
Tervyn
Шайдар, если предмет не является профилирующим и дальше не будет использоваться так почему бы не помочь? Лаба не страшная когда знаешь как ее делать, а если не знаешь... Может ему не повезло с преподом?smile.gif
P.S.: И вообще не хочу спорить ибо лень
Shaidar Haran
Цитата(Tervyn @ 18 Dec 2008, 23:48)
Шайдар, если предмет не является профилирующим и дальше не будет использоваться так почему бы не помочь? Лаба не страшная когда знаешь как ее делать, а если не знаешь... Может ему не повезло с преподом?smile.gif

Предмет действительно не профильный, и именно поэтому я позволяю им сдавать верные решения без защиты - на тройку. Я понимаю, и они понимают что я понимаю что они не сами делали - но все молчат. Воот.. Но это не мешает мне нелюбить таких вот халявщиков.
По поводу.. Те, кому интересно, кто слушает - у тех не возникает проблем почему-то) Все-таки желание учиться тоже играет роль, я не могу напрямую вставить им свои мозги. Если чел тупо не обращает внимания на предмет - ему уже ничем не поможешь.
Tervyn
Если не обращает на предмет, то да. А если "повезло" с преподом? Ни разу не сталкивался с преподами которые не знают предмет? У которых на лекциях надо исправлять ошибки, которые не могут ответить ни на один вопрос? Ты просто сам ведешь пары, потому у тебя сразу мысли что студент косил и сам виноват. А я вспоминаю как мне читали лекции и вели лабы, и первая мысль - может препод не объяснил нормально. Потому и помог малость.
P.S.: хорошо мы нафлудилиsmile.gif хорошо хоть без перехода на личностиsmile.gif
Palpalich
на самом деле нам динамику плохо объяняли, точнее вообще о ней речи не было.... а препод - это люди настроение, захотят помогут, а не захотят... пошлют куда подальше... поэтому я и братился нафорум, но я задачи "неотредактироваными" не здаю, сначала разбираюсь, а потом уже....

Добавлено ([mergetime]1229668534[/mergetime]):
Tervyn помоги плиз с езё одной просьбой, если не затруднит....
Код
program StackDemo;
uses crt;
const
AFileName = 'file.txt';
type
PIntStack = ^TIntStack;
TIntStack = record
  Data: Integer;
  Next: PIntStack;
end;
stek= PIntStack;
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;
  dispose(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;
dispose(AStack);
AStack := P;
Pop := True;
end;
function call(var AStack: PIntStack): real;
var
 X, Y, Z: Integer;
begin
Z := 0;
Y := 0;
while Pop(X, AStack) do
begin
   Y := Y + X;
   Z := Z + 1;
end;
call  := Y/Z;
end;
var
  ch:char;
F: file of integer;
S: PIntStack;
X: Integer;
begin  clrscr;
Assign(F, 'file.txt');
rewrite(F);
WriteLn('vvedite chisla (nol - okonchanie vvoda)');
repeat
ReadLn(X);
Ch := 'N';
if X = 0 then
begin
  WriteLn('hotite zakonchit vvod? (y/n)');
  Ch := ReadKey;
  if (Ch = 'Y') or (Ch = 'y') then
    Break;
end;
Write(F, X);
until ((X = 0) and ((Ch = 'y') or (Ch = 'Y')));
close(F);
Assign(F, 'file.txt');
Reset(F);
while not Eof(F) do
begin
  Read(F, X);
  Push(X, S);
end;
 Close(F);
 WriteLn('srednee ar: ', call(s));
 done(s);
 readkey;
end.

она выводит число не "чистое" , т.е. если сделать call(s:3:2); она "ругается", ка это делать? пробовал переменной присвоить значение ф-и, но чёт не получается....
Tervyn
Можно попробовать так (должно сработать):
Код
WriteLn('srednee ar: ', call(s):3:2);

если не получиться то так
Код
Q := Call(S);
WriteLn('srednee ar: ', Q: 3: 2);
Palpalich
спасибо, но я сам допёр до второго вариантаsmile.gif.. зачёт получил... кстати узнал много нового, спасибо тебе... особенно понравилась идея как ограничить ввод!!!! супер!!!! огромное спасибо...
мне уже неудобно спрашивать, но у моей одногрупницы тож пероблемы с очередями и деревьями..
у деревьев:
поиск максимального ключа в дереве (просто функцию нахождения максимального ключа)
а вот очереди уже сложнее...
Сформировать файл из символов и с помощью очереди за один просмотр файла напечатать элементы файла в следующем порядке: сначала все сим-волы, отличные от знаков препинания и цифр, затем все знаки препинания и наконец – все цифры, сохраняя исходный порядок в каждой из этих групп символов.
если тебя не затруднит помоги...

Добавлено ([mergetime]1229677912[/mergetime]):
а на счёт преподов ничего плозого нихочу говорить, но иногда препод ведёт себя словно он бог, вершитель судьбы и т.д. если у них какие-то свои личные проблемы, то на кого это всё выливается??? конечно на учеников... но опять же я не обобщаю всех преподавателей, встречаются и хорошие, честные и порядочные...
Dofur
Думаю вряд ли Tervyn согласится делать лабы того же типа - он ведь откоментировал все свои действия - в принципе вы можете модифицировать его программы для лаб своей одногрупницы.А вообще не красиво получается - так может получиться, что ему придется для всей группы вашей лабы делать smile.gif
P.S. Вот реально лаба очень похожа...
gilex
друзья у меня к вам просьба: динамику вообще почти не шарю. помогите чем могёте: Используя стек, напечатать содержимое текстового файла, выписывая символы каждой его строки в обратном порядке.
Монца
Динамика - это раздел физики
gamecreator
Монца, учим матчасть
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.