Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с меню
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Денис18
Большой привет всем участникам форума! У меня есть небольшая просьба: я написал программу, но не уверен, что все сделал эффекктивными методами. Не могли бы Вы посмотреть программу (файл прикреплен) и указать наявные и логические ошибки? Можно ли как-то уменьшить, улучшить программу?
Само задание:
Код

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

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

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

Заранее спасибо.
Нажмите для просмотра прикрепленного файла - задание
P.S.: программа откомпилированна и работает, но не выполняет условие повторного ввода элементов в заданный вектор - не знаю как справиться с этой проблемой.

.DOC файл удален. Читаем правила!
мисс_граффити
1. напиши задание
2. что такое нелогические ошибки?
klem4
Что-то ты очень намудрил по поводу запятой, вот посмотри такой вариант, правда сокращенный немного, я думаю делать стоит в таком ключе :

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

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

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

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

Разбиение строки на числа
dry.gif Или ты думаешь, я делал это для чего? Просто, потому что время некуда было девать?

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

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

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

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

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