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

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

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

> Как можно улучшить эффективность и качество ПП?
1147
сообщение 29.01.2009 14:15
Сообщение #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 - 29.01.2009 14:35
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 31.01.2009 14:23
Сообщение #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 - печатая уже готовые суммы в обратном порядке...

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


Бывалый
***

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

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


good.gif Огромное спасибо volvo, этого разумеется хватит!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 19.07.2025 3:51
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"