Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача с меню

Автор: Денис18 8.04.2006 0:24

Большой привет всем участникам форума! У меня есть небольшая просьба: я написал программу, но не уверен, что все сделал эффекктивными методами. Не могли бы Вы посмотреть программу (файл прикреплен) и указать наявные и логические ошибки? Можно ли как-то уменьшить, улучшить программу?
Само задание:

Код

В программе осуществляется работа с 3 векторами. Память под них выделяется динамически с помощью getmem'а, по мере необходимости и в необходимом объёме.
Программа выводит и работает в соответствии со следующим меню:
выбор вектора
Выбирается один из трёх векторов. Все дальнейшие действия будут осуществляться с этим вектором, пока не будет выбран другой вектор. При переключении на новый вектор, старый вектор сохраняется и к нему можно вернуться, снова выбрав его номер.
ввод вектора
Вектор вводится в виде строки, содержащей целые числа, разделённые запятыми.
вывод вектора
Элементы вектора выводятся на экран.
сортировка вектора
Отсортировать вектор, метод сортировки выбирается в соответствии с вариантом (см. таблицу).
обработка вектора
Составить новый вектор из некоторых элементов текущего вектора, отсортировать и вывести. То, из каких элементов составлять новый вектор, и метод сортировки определяется вариантом (см. таблицу). Память под вектор выделяется getmem'ом, а после вывода освобождается freemem'ом.
выход
При выходе требуется освободить выделенную память с помощью freemem.

Программа должна корректно обрабатывать повторный ввод уже введённого вектора, попытки ввода невыбранного вектора, вывода невведённого вектора и т.п.

Какие элементы брать при обработке     Метод         
           повторяющиеся                           просеивание                   

Заранее спасибо.
[attachmentid=3113] - задание
P.S.: программа откомпилированна и работает, но не выполняет условие повторного ввода элементов в заданный вектор - не знаю как справиться с этой проблемой.

.DOC файл удален. Читаем правила!


Прикрепленные файлы
Прикрепленный файл  LAB.PAS ( 5.54 килобайт ) Кол-во скачиваний: 291

Автор: мисс_граффити 8.04.2006 1:01

1. напиши задание
2. что такое нелогические ошибки?

Автор: klem4 8.04.2006 13:43

Что-то ты очень намудрил по поводу запятой, вот посмотри такой вариант, правда сокращенный немного, я думаю делать стоит в таком ключе :

uses crt;

type


TType = integer;

PArr = record
arr : ^TArr;
size : word;
end;

TArr = array [1..1] of TType;
TArrays = array [1..3] of PArr;


procedure Free(var P : PArr);
begin
FreeMem(P.arr, P.size * sizeof(TType));
end;

procedure Init(var P : PArr; n : word);
begin
if p.size <> 0 then Free(P);
P.size := n;
GetMem(P.arr, P.size * sizeof(TType));
end;



procedure Input(var P : PArr);
var
i : word;
begin
clrscr;
writeln('Введите ', P.size, ' элементов через пробел');
for i := 1 to P.size do read(P.arr^[i]);
end;

procedure Print(const P : PArr);
var
i : word;
begin
for i := 1 to P.size do write(P.arr^[i], ' ');
end;

procedure Menu(var a : Tarrays; var quit : boolean; var indx : byte);
var
choice : char;
size : word;
begin

clrscr;

writeln('1 -> Choose array');
writeln('2 -> Input array');
writeln('3 -> Print array');
writeln('4 -> Quit');

choice := #0;

repeat
while keypressed do choice := readkey;
until choice in ['1'..'4'];

case choice of
'1' : begin clrscr; write('Indx = '); readln(indx); end;
'2' : begin write('n = '); readln(size); Init(a[indx], size); Input(a[indx]); end;
'3' : begin Print(a[indx]); readln; end;
'4' : quit := true;
end;
end;

var

arrays : TArrays;
indx : byte;
stop : boolean;

begin
stop := false;
while (not(stop)) do Menu(arrays, stop, indx);
end.

Автор: volvo 8.04.2006 14:06

Денис18,
А еще лучше - попробовать пользоваться тем, что выкладывалось в ответ, кстати, на твой же вопрос:

http://forum.pascal.net.ru/index.php?showtopic=10155
dry.gif Или ты думаешь, я делал это для чего? Просто, потому что время некуда было девать?

Автор: Денис18 8.04.2006 17:04

Klem, cпасибо за помощь! Но вот только одна проблема? Ту задачу которую ты написал, она же не совсем сообветствует условию. Ты мне посоветуешь вписать твои процедуры в программу? Или же как-то можно исправить прям у меня в проге, чтоб не было траблов с идентификаторами и т.п.??

Цитата(volvo @ 8.04.2006 11:06) *

Денис18,
А еще лучше - попробовать пользоваться тем, что выкладывалось в ответ, кстати, на твой же вопрос:

http://forum.pascal.net.ru/index.php?showtopic=10155
dry.gif Или ты думаешь, я делал это для чего? Просто, потому что время некуда было девать?

Уважаемый, Volvo!!! Я дико перед тобой извиняюсь! Я не вставил твою функцию в прогу, т.к не придумал, как реализовать твой алгоритм, не вызывая функцию из главной части программы). А в инсте препод сказал, что в главной части можно только инициализировать прогу и ожидать ввода команд! Не обижайся на меня! Я же только начинаю программировать, поэтому не всегда могу воткнуть, как изменить прогу - я всего лишь на 1 курсе! Если тебе не влом, то можешь хоть краем глаза указать на ошибки? Обещаю, впредь буду прислушиваться к твоему мнению. С уважением, Денис.

Автор: volvo 8.04.2006 17:10

А ... Мммм... Какая разница, вызывать процедуру из "главной части", как ты ее называешь, программы, или из другой процедуры? Объясни мне этот момент...

Вообще-то процедуры и функции для того и были придуманы, чтобы их можно было вызывать ОТОВСЮДУ, в том числе и из других подпрограмм... Ты же в своей программе вызываешь InputArray из процедуры Wait? Значит, это можно делать?

Автор: Денис18 9.04.2006 19:15

Цитата(volvo @ 8.04.2006 14:10) *

А ... Мммм... Какая разница, вызывать процедуру из "главной части", как ты ее называешь, программы, или из другой процедуры? Объясни мне этот момент...

Вообще-то процедуры и функции для того и были придуманы, чтобы их можно было вызывать ОТОВСЮДУ, в том числе и из других подпрограмм... Ты же в своей программе вызываешь InputArray из процедуры Wait? Значит, это можно делать?

Да, конечно, ты прав. Просто так вышло, что я написал разбиение строки раньше чем получил ответ на форум, а исправлять идентификаторы в твоей функции, вставляя ее в прогу, не захотел. Признаю, что поступил нехорошо. Впредь, обещаю такого не делать. Всегда буду пользоваться вашими советами. Но помогиет мне с уже написанной мной прогой. Укажите на ошибки. Я думаю, что если я написал сам, а не перекатал готовую процедуру лучше. Плз!