IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Как можно улучшить эффективность и качество ПП?
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Такое задание по курсу технологии программирования:
дан текст программы (Pascal). Программа создает динамический список неповторяющихся целых чисел в диапазоне от -50 до 50, обеспечивает прямой и обратный вывод элементов списка, должна посчитать сумму 1+n, 2+n-1,...i+n-1+1,...n/2+n/2+1
Необходимо улучшить эффективность и качество данной программы, что увеличит скорость ее выполнения, устранит возможные недостатки и возможно улучшит другие характеристики...
Если кто заметит в ней какие-либо недостатки или фрагменты которые можно улучшить (например операцию умножения заменить на смещение и т.д.), огромная просьба пояснить мне в чем заключается улучшение, как его реализовать и какой фрагмент кода можно преобразовать, возможно есть чтото лишнее в коде...

{построение динамического списка }
Program din;
uses crt;
type tpo=^tn; tn=record x:real; p1,p2:tpo; end;
var s,b:tpo; f,k:pointer;
i,n,x,dd:integer; z:real;

begin
clrscr; n:=6; dd:=9;
{создание списка }
new(s); randomize; z:=random(100)-50; s^.x:=z; f:=s; s^.p2:=nil;
for i:=1 to n-1 do begin new(b); z:=random(100)-50; b^.x:=z;
s^.p1:=b; b^.p2:=s; s:=b; end;
s^.p1:=nil; k:=s;

textcolor(13);
Write(' прямой вывод: ');
s:=f; x:=18;
while s<>nil do
begin gotoxy(x,wherey); write(s^.x:1:1); s:=s^.p1; x:=x+dd;
end;
writeln;
x:=20;
for i:=1 to N do begin gotoxy(x,wherey); write('+'); x:=x+dd;
end;
writeln;

Write('обратный ввод: ');
b:=k; x:=18;
while b<>nil do
begin gotoxy(x,wherey); write(b^.x:1:1); b:=b^.p2; x:=x+dd;
end;
x:=wherex;
writeln; textcolor(11);
for i:=1 to x do begin gotoxy(i,wherey); write('_'); end;
writeln;
writeln;
Write(' результат: ');
s:=f; b:=k; x:=18;
while s<>nil do
begin z:=s^.x+ b^.x; gotoxy(x,wherey); write(z:1:1);
s:=s^.p1; b:=b^.p2; x:=x+dd; end;
readkey;
end.
;
end.


Тегами пользоваться не забывай

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
Каким образом можно организовать проверку на повторение?
Смотри внимательно, что изменилось в программе:
Program  din;
uses crt;
type
tpo = ^tn;
tn = record
x: shortint;
p1, p2: tpo;
end;

const
width = 15;
field = 8;

var s,b,f,k:tpo;
i,n,x:integer; z:byte;
used: set of byte;

begin
clrscr;
n:=6;

randomize;
new(s); z:=random(101); inclide(used, z);
s^.x := z - 50; f:=s; s^.p2:=nil;
for i:=1 to n-1 do begin
new(b);
repeat z:=random(101); until not (z in used);
b^.x:=z - 50; s^.p1:=b; b^.p2:=s; s:=b;
end;
s^.p1:=nil; k:=s;

textcolor(13);
write('прямой вывод: ':width);
s:=f;
while s<>nil do begin
write(s^.x:field); s:=s^.p1;
end;
writeln;

write('':width);
for i:=1 to N do write('+':field);
writeln;

Write('обратный ввод: ':width);
b:=k; x := width;
while b<>nil do begin
write(b^.x:field); b:=b^.p2;
inc(x, field);
end;
writeln;

textcolor(11);
for i:=1 to x do write('_');
writeln; writeln;

Write('результат: ':width);
s:=f; b:=k;
while s<>nil do begin
write((s^.x+ b^.x):field);
s:=s^.p1; b:=b^.p2;
end;
readkey;
end.
Можно еще убрать вызова textcolor, записывая атрибуты напрямую в переменную textattr, вызов функции - тоже время. Но оно тут не в цикле, поэтому можно пренебречь.

Можно суммировать только первую половину элементов списка, вторая записывается в обратном порядке, если зарезервировать еще один массив 1 .. n div 2, то можно сэкономить кое-что на последнем цикле, до n/2 записывая полученные суммы в массив, после n/2 - печатая уже готовые суммы в обратном порядке...

Хватит?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Последний вопрос у меня, но не столько по самой программе, сколько по функции Gettime. Никак не получается измерить время выполнения программы. Соответствующие темы на форуме читал (http://forum.pascal.net.ru/index.php?showtopic=8585&st=0&p=58499&#entry58499), но применить не получается.. Исчерпал все возможные варианты (как видно все, кроме правильного), но время выполнения получить так и не удалось..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
1147   Как можно улучшить эффективность и качество ПП?   29.01.2009 18:15
volvo   Во-первых, в твоем коде я не увидел проверку на по…   29.01.2009 18:33
1147   Получается что программа содержит эти 2 недочета, …   29.01.2009 18:48
volvo   Для начале надо создать корректно (а не кое-как) р…   29.01.2009 19:05
1147   Большое спасибо за полезные советы Volvo, с осталь…   29.01.2009 19:10
1147   Если мы список заменим на массив, как это поможет …   31.01.2009 10:15
volvo   Если мы список заменим на массив - это поможет зна…   31.01.2009 17:29
1147   type подойдет для того чтобы избавиться от gotoxy?…   31.01.2009 17:39
volvo   Смотри внимательно, что изменилось в программе: Pr…   31.01.2009 18:23
1147   :good: Огромное спасибо volvo, этого разумеется хв…   31.01.2009 18:43
1147   Последний вопрос у меня, но не столько по самой пр…   1.02.2009 15:27
volvo   Твоя программа выполняется слишком быстро, чтобы з…   1.02.2009 15:50
1147   {$N+} procedure ReadTSC(Var counter : Comp);…   1.02.2009 18:00
volvo   Нет-нет... У тебя здесь - основная программа. Проц…   1.02.2009 18:09
1147   Получается таким образом {$N+} procedure Read…   1.02.2009 18:46
1147   Так, ну с этим вопросом я разобрался, вот только т…   1.02.2009 20:22
volvo   Значит, что-то сделал не так... У меня ничего не с…   1.02.2009 20:51
1147   а почему значение времени выполнения программы каж…   1.02.2009 21:47
volvo   Потому что такты - вещь 1) очень чувствительная; 2…   1.02.2009 21:55
1147   да, у меня windows. Но тогда получается что в резу…   1.02.2009 21:59
volvo   Делай среднее арифметическое. Способ с GetTime, кс…   1.02.2009 22:13
1147   Еще раз хочу поблагодарить тебя volvo, твоя помощь…   2.02.2009 13:44


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.09.2025 20:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name