Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Неудобочитаемая программа





 

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. Как выбрать хороший алгоритм?

Ответы на контрольные вопросы:

  1. Если мы решаем задачу с помощью детерминированного алгоритма, то в такой задаче отсутствует элемент неопределённости, недопустимо применение метода проб и ошибок. Такой алгоритм проще на восприятие. Если задача решается недетерминированным алгоритмом, то в ней используются методы проб и ошибок, повторов, откатов назад. Это нарушает наглядность задачи.
  2. Для выбора хорошего алгоритма необходимо точно знать в чем заключается смысл задачи. То есть если решать математические уравнения, проверять какие-либо данные или печатать отчеты, то лучше всего использовать детерминированный алгоритм. Если нужно решать задачи на нахождение делителя числа, поиска кратчайшего пути, то нужно использовать недетерминированный алгоритм. Если необходимо решать задачу для создания обучающих программ, а не для поиска ответа на поставленную задачу, то лучше использовать алгоритм для моделирования физических систем с помощью ЭВМ.

Практическая работа №4

“Определение эффективности программ”

 

Цель работы: получение навыков по оптимизации программ.

Перечень оборудования: IBM PC / AT 386 – 486

Содержание работы:

  1. Составить эффективную программу
  2. Провести анализ программ

Последовательность выполнения работы:

  1. Программу разделить на подпрограммы
  2. Определить какой процент общего времени использует каждая подпрограмма
  3. Определить насколько в процентном выражении оптимизируется каждая подпрограмма
  4. Сравнить работу предложенной программы с переработанной

 

Контрольные вопросы:

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

Последовательность выполнения работы:

  1. Составить программу с использованием циклов
  2. Проанализируйте составленную программу, исключив циклы по возможности.
  3. Организуйте циклы и оптимизируйте их работу

Контрольные вопросы:

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.

 

Ответы на контрольные вопросы:

  1. При использовании циклов значительная часть времени тратится на инициирование и проверку индекса цикла, поэтому при небольшом количестве повторений, рациональнее программировать последовательно.
  2. Чтобы сократить число инициирований и проверок цикла, внешние циклы должны иметь наименьшее число итераций, по отношению к внутренним (вложенным).
  3. Для оптимизации наиболее выгодны критические области программы (наиболее часто используемые).
  4. Разверткой называется метод оптимизации, при котором один и тот же оператор, стоящий в теле цикла, записывается для нескольких различных значений управляющей переменной, и таким образом сокращается число итераций.

Сжатием называется, разъединением?

 

Date: 2015-12-12; view: 327; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию