Большой привет всем участникам форума! У меня есть небольшая просьба: я написал программу, но не уверен, что все сделал эффекктивными методами. Не могли бы Вы посмотреть программу (файл прикреплен) и указать наявные и логические ошибки? Можно ли как-то уменьшить, улучшить программу? Само задание:
Код
В программе осуществляется работа с 3 векторами. Память под них выделяется динамически с помощью getmem'а, по мере необходимости и в необходимом объёме. Программа выводит и работает в соответствии со следующим меню: выбор вектора Выбирается один из трёх векторов. Все дальнейшие действия будут осуществляться с этим вектором, пока не будет выбран другой вектор. При переключении на новый вектор, старый вектор сохраняется и к нему можно вернуться, снова выбрав его номер. ввод вектора Вектор вводится в виде строки, содержащей целые числа, разделённые запятыми. вывод вектора Элементы вектора выводятся на экран. сортировка вектора Отсортировать вектор, метод сортировки выбирается в соответствии с вариантом (см. таблицу). обработка вектора Составить новый вектор из некоторых элементов текущего вектора, отсортировать и вывести. То, из каких элементов составлять новый вектор, и метод сортировки определяется вариантом (см. таблицу). Память под вектор выделяется getmem'ом, а после вывода освобождается freemem'ом. выход При выходе требуется освободить выделенную память с помощью freemem.
Программа должна корректно обрабатывать повторный ввод уже введённого вектора, попытки ввода невыбранного вектора, вывода невведённого вектора и т.п.
Какие элементы брать при обработке Метод повторяющиеся просеивание
Заранее спасибо. [attachmentid=3113] - задание P.S.: программа откомпилированна и работает, но не выполняет условие повторного ввода элементов в заданный вектор - не знаю как справиться с этой проблемой.
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
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 Или ты думаешь, я делал это для чего? Просто, потому что время некуда было девать?
Автор: Денис18 8.04.2006 17:04
Klem, cпасибо за помощь! Но вот только одна проблема? Ту задачу которую ты написал, она же не совсем сообветствует условию. Ты мне посоветуешь вписать твои процедуры в программу? Или же как-то можно исправить прям у меня в проге, чтоб не было траблов с идентификаторами и т.п.??
Цитата(volvo @ 8.04.2006 11:06)
Денис18, А еще лучше - попробовать пользоваться тем, что выкладывалось в ответ, кстати, на твой же вопрос:
http://forum.pascal.net.ru/index.php?showtopic=10155 Или ты думаешь, я делал это для чего? Просто, потому что время некуда было девать?
Уважаемый, Volvo!!! Я дико перед тобой извиняюсь! Я не вставил твою функцию в прогу, т.к не придумал, как реализовать твой алгоритм, не вызывая функцию из главной части программы). А в инсте препод сказал, что в главной части можно только инициализировать прогу и ожидать ввода команд! Не обижайся на меня! Я же только начинаю программировать, поэтому не всегда могу воткнуть, как изменить прогу - я всего лишь на 1 курсе! Если тебе не влом, то можешь хоть краем глаза указать на ошибки? Обещаю, впредь буду прислушиваться к твоему мнению. С уважением, Денис.
Автор: volvo 8.04.2006 17:10
А ... Мммм... Какая разница, вызывать процедуру из "главной части", как ты ее называешь, программы, или из другой процедуры? Объясни мне этот момент...
Вообще-то процедуры и функции для того и были придуманы, чтобы их можно было вызывать ОТОВСЮДУ, в том числе и из других подпрограмм... Ты же в своей программе вызываешь InputArray из процедуры Wait? Значит, это можно делать?
Автор: Денис18 9.04.2006 19:15
Цитата(volvo @ 8.04.2006 14:10)
А ... Мммм... Какая разница, вызывать процедуру из "главной части", как ты ее называешь, программы, или из другой процедуры? Объясни мне этот момент...
Вообще-то процедуры и функции для того и были придуманы, чтобы их можно было вызывать ОТОВСЮДУ, в том числе и из других подпрограмм... Ты же в своей программе вызываешь InputArray из процедуры Wait? Значит, это можно делать?
Да, конечно, ты прав. Просто так вышло, что я написал разбиение строки раньше чем получил ответ на форум, а исправлять идентификаторы в твоей функции, вставляя ее в прогу, не захотел. Признаю, что поступил нехорошо. Впредь, обещаю такого не делать. Всегда буду пользоваться вашими советами. Но помогиет мне с уже написанной мной прогой. Укажите на ошибки. Я думаю, что если я написал сам, а не перекатал готовую процедуру лучше. Плз!