Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Неудобочитаемая программа ⇐ ПредыдущаяСтр 3 из 3
uses crt; const st = 25; type student = record fio: string[40]; data_rozhd: record day: integer; month: integer; year: integer; end; god_post: integer; group: string[8]; kurs: integer; ocenki: array [1.. 40] of integer; sr_ball: real; end; var spisok:array [1..st] of student; procedure vvod; var i,j,k,sr:integer; begin for i:= 1 to st do begin clrscr; writeln(i,' fio data rozhd god post group kurs ocenki'); gotoxy(1,2); readln(spisok[i].fio); gotoxy(18,2); readln(spisok[i].data_rozhd.day,spisok[i].data_rozhd.month,spisok[i].data_rozhd.year); gotoxy(31,2); readln(spisok[i].god_post); gotoxy(41,2); readln(spisok[i].group); gotoxy(50,2); readln(spisok[i].kurs); sr:=0; for j:=1 to spisok[i].kurs do begin gotoxy(56,1+j); for k:=1 to 4 do begin readln(spisok[i].ocenki[(j-1)*4+k]); gotoxy(56+2*(k),1+j); sr:=sr+spisok[i].ocenki[(j-1)*4+k]; end; end; spisok[i].sr_ball:=sr/(spisok[i].kurs*4); end; end; procedure vyvod; var i,j,k,sr,str:integer; sredn:real; stud:student; begin for i:=1 to st-1 do for j:=i+1 to st do begin if spisok[j].sr_ball < spisok[i].sr_ball then begin stud:=spisok[i]; spisok[i]:=spisok[j]; spisok[j]:=stud; end; end; clrscr; str:=2; writeln(' fio data_rozhd god_post group kurs ocenki sr_ball'); for i:=1 to st do begin gotoxy(1,str); writeln(spisok[i].fio); gotoxy(18,str); writeln(spisok[i].data_rozhd.day,spisok[i].data_rozhd.month,spisok[i].data_rozhd.year); gotoxy(31,str); writeln(spisok[i].god_post); gotoxy(41,str); writeln(spisok[i].group); gotoxy(50,str); writeln(spisok[i].kurs); gotoxy(66,str); writeln(spisok[i].sr_ball:4:1); for j:=1 to spisok[i].kurs do begin gotoxy(56,str); for k:=1 to 4 do begin writeln(spisok[i].ocenki[(j-1)*4+k]); gotoxy(56+2*(k),str); end; str:=str+1; end; end; end; begin vvod; vyvod; end.
Практическая работа № 3 “Выбор алгоритма”
Цель: получение навыков по выбору правильного алгоритма решения задачи Перечень оборудования: IBM PC / AT 386 – 486 Последовательность: 1. Описать назначение каждого алгоритма 2. Составить алгоритм решения задачи, применяя предложенные с использованием подпрограмм. Назначение алгоритмов: 1. Поиск максимального значения и его индекса 2. Поиск минимального значения и его индекса 3. Сумма элементов массива 4. Количество нулевых элементов массива 5. Проверка на совпадение значений 6. Обмен элементами двух массивов 7. Сортировка по возрастанию 8. Проверка массива на его отсортированность по возрастанию 9. Произведение отрицательных элементов 10. Количество положительных элементов 11. Перестановка элементов в обратном порядке 12. Сортировка по убыванию Методические указания: Имеется матрица размера N*M. Определить в какой строке количество положительных элементов наибольшее. Алгоритм решения задачи: Контрольные вопросы: 1. Какую роль на решение задачи оказывает выбор алгоритма? 2. Как выбрать хороший алгоритм? Ответы на контрольные вопросы:
Практическая работа №4 “Определение эффективности программ”
Цель работы: получение навыков по оптимизации программ. Перечень оборудования: IBM PC / AT 386 – 486 Содержание работы:
Последовательность выполнения работы:
Контрольные вопросы: 5. Что является наиболее важным при написании эффективной программы? 6. Какой тип программ следует оптимизировать? 7. Почему оптимизирующий компилятор необходим даже в том случае, когда программист выполнил оптимизацию? 8. Что означают понятия: · оверлейность программ · свертка · уменьшение силы операции
Методические указания: Для произвольно выбранной последовательности целых чисел, в которой не более 30 элементов, выполнить следующее задание: ввести числа в массив и реорганизовать массив.
Исходная программа: program pr13; uses crt; var mas: array [1..20] of integer; x,i,j,s,cod,min,f: integer; st,stt: string; sr: real; b: boolean; begin s:=0; clrscr; {---------------начало подпрограммы 1------------------------------------} for i:=1 to 20 do mas[i]:=random(100); for i:=1 to 20 do writeln('MAS[',i,']=',mas[i]); for i:=1 to 20 do s:=s+mas[i]; {---------------конец подпрограммы 1------------------------------------} sr:=s/20; min:=-abs(round(sr-mas[1])); f:=1; {---------------начало подпрограммы 2------------------------------------} for i:=1 to 20 do begin b:=false; str(mas[i],st); {---------------начало подпрограммы 4------------------------------------} for j:=1 to length(st) do begin stt:=copy(st,j,1); val(stt,x,cod); if odd(x)=false then {esli x - chetn to vypoln b:=true} b:=true else begin j:=length(st); b:=false; end; end; {---------------конец подпрограммы 4------------------------------------} x:=abs(round(sr-mas[i])); {---------------начало подпрограммы 5------------------------------------} if mas[i]<min then begin min:=mas[i]; f:=i; {f - nomer min el-ta} end; {---------------конец подпрограммы 5------------------------------------} if b then mas[i]:=-x; {esli vse cifry chisla - chetn to... } end; {---------------конец подпрограммы 2------------------------------------} gotoxy(18,1); {---------------начало подпрограммы 3------------------------------------} for i:=1 to 20 do begin gotoxy(18,i+1); writeln('MAS[',i,']=',mas[i]); end; {---------------конец подпрограммы 3------------------------------------} writeln; writeln(f); readln; end.
Кол-во операторов (процент общего времени): Подпрограмма 1: 60 (15,7 %) Подпрограмма 2: ((подпрограма 4) + 3)* 20 = 160-260 (68 %) Подпрограмма 3: 40 (10,5 %) Подпрограмма 4: 5-10 (2,6 %) Подпрограмма 5: 1-3 (0,8 %) Основная программа: 9 (2,4 %) Всего: 275-382 (100 %)
Оптимизированная программа: {esli hotya by odna iz cifr chisla - nechetnaya, to chislo ne menyaetsya} {inache zanositsya novoe chislo na mesto starogo = -abs(round(sr-mas[i]))} {sr - srednee arifmet.} program pr13; uses crt; var mas: array [1..20] of integer; x,i,j,s,cod,min,f: integer; st,stt: string; sr: real; b: boolean; begin {randomize;} s:=0; clrscr; {---------------начало подпрограммы 1------------------------------------} {begin zapolnenie massiva, vyvod ishodnogo massiva, summirovanie elementov} for i:=1 to 20 do begin mas[i]:=random(100); writeln('MAS[',i,']=',mas[i]); s:=s+mas[i]; end; {end zapolnenie massiva, vyvod ishodnogo massiva, summirovanie elementov} {---------------конец подпрограммы 1------------------------------------} sr:=s/20; min:=-abs(round(sr-mas[1])); f:=1; {---------------начало подпрограммы 2------------------------------------} for i:=1 to 20 do begin b:=false; str(mas[i],st); {---------------начало подпрограммы 4------------------------------------} for j:=1 to length(st) do begin stt:=copy(st,j,1); val(stt,x,cod); if odd(x)=true then {esli x - chetn to vypoln b:=true} begin j:=length(st); b:=false; end else b:=true; end; {---------------конец подпрограммы 4------------------------------------} {---------------начало подпрограммы 5------------------------------------} if mas[i]<min then begin min:=mas[i]; f:=i; {f - nomer min el-ta v ishodnom massive} end; {---------------конец подпрограммы 5------------------------------------} if b then mas[i]:=-abs(round(sr-mas[i])); {esli vse cifry chisla - chetn to... } end; {---------------конец подпрограммы 2------------------------------------} {---------------начало подпрограммы 3------------------------------------} {begin vyvod konechnogo massiva} for i:=1 to 20 do begin gotoxy(18,i); writeln('MAS[',i,']=',mas[i]); end; {end vyvod konechnogo massiva} {---------------конец подпрограммы 3------------------------------------} writeln; writeln(f); end.
Кол-во операторов (процент улучшения, процент общего улучшения): Подпрограмма 1: 60 (0 %) Подпрограмма 2: ((подпрограма 4) + 3)* 20 = 160-260 (0 %) Подпрограмма 3: 40 (0 %) Подпрограмма 4: 5-10 (0 %) Подпрограмма 5: 1-3 (0 %) Основная программа: 7 (77,8 %, 1,9%) Всего: 273-380 (99,5 %)
Ответы на контрольные вопросы: 1. При написании эффективной программы наиболее важным является определение критических областей и их оптимизация. 2. В первую очередь следует оптимизировать часто используемые программы (ОС, компиляторы, постпроцессоры). 3. Оптимизирующий компилятор необходим для того, чтобы получить более качественную объектную программу, используя встроенные методы оптимизации, в т.ч. на уровне выходного языка. 4. Под оверлейностью программы понимают возможность перенесения подпрограмм во время работы программы в быстродействующую память из некоторого другого типа памяти таким образом, что несколько подпрограмм в различное время занимают одну и ту же область памяти. · свертка · уменьшение силы операции Практическая работа №5 “Работа с циклами”
Цель работы: сформировать навыки по оптимизации циклов. Перечень оборудования: IBM PC / AT 386 – 486 Последовательность выполнения работы:
Контрольные вопросы: 9. В каком случае использовать цикл менее эффективно, чем программировать последовательно? 10. Как следует располагать вложенные циклы, чтобы сократить число инициирований и проверок цикла? 11. Какие области программы наиболее выгодны для оптимизации? 12. Какое преобразование цикла называется разверткой, сжатием, разъединением?
Методические указания: даны 3 одномерных массива. Начальное состояние каждого массива задается в программе либо в разделе констант. Сформировать двумерный массив из элементов одномерных массивов согласно варианту, размерность массива N*M, где N=M и равно количеству элементов в одномерном массиве.
SQR (A[i])-SQRT(C[i])*ABS(C[j])
Неоптимизированная программа: uses crt; const n=10; a:array [1..n] of integer = (-9,11,0,38,15,-45,4,-7,4,6); b:array [1..n] of integer = (6,3,8,3,7,2,3,14,5,6); c:array [1..n] of integer = (5,6,-85,21,6,33,12,-8,43,33); var mas:array [1..n,1..n] of real; i,j:byte; begin clrscr; for i:=1 to n do writeln(a[i],b[i]:8,c[i]:8); for j:=1 to n do begin for j:= 1 to n do begin mas[i,j]:=sqr(a[i])-sqrt(b[i])*abs(c[j]); write(mas[i,j]:7:1); end; writeln; end; end.
Оптимизированная программа: uses crt; const n=10; a:array [1..n] of integer = (-9,11,0,38,15,-45,4,-7,4,6); b:array [1..n] of integer = (6,3,8,3,7,2,3,14,5,6); c:array [1..n] of integer = (5,6,-85,21,6,33,12,-8,43,33); var mas:array [1..n,1..n] of real; i,j:byte; sqr_a:integer; sqrt_b:real; begin clrscr; for i:=1 to n do writeln(a[i],b[i]:8,c[i]:8); for j:=1 to n do begin sqr_a:=a[i]*a[i]; sqrt_b:=sqrt(b[i]); for j:= 1 to n do begin mas[i,j]:=sqr_a-sqrt_b*abs(c[j]); write(mas[i,j]:7:1); end; writeln; end; end.
Более оптимизированная программа: uses crt; const n=10; a:array [1..n] of integer = (-9,11,0,38,15,-45,4,-7,4,6); b:array [1..n] of integer = (6,3,8,3,7,2,3,14,5,6); c:array [1..n] of integer = (5,6,-85,21,6,33,12,-8,43,33); var mas:array [1..n,1..n] of real; i,j:byte; sqr_a:integer; sqrt_b:real; begin clrscr; for j:=1 to n do begin writeln(a[i],b[i]:8,c[i]:8); <---- sqr_a:=a[i]*a[i]; <---- sqrt_b:=sqrt(b[i]); <---- for j:= 1 to n do begin mas[i,j]:=sqr_a-sqrt_b*abs(c[j]); <---- write(mas[i,j]:7:1); end; writeln; end; end.
Ответы на контрольные вопросы:
Сжатием называется, разъединением?
|