Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмизация вычислений НИУ ВШЭпрогр 2014_15.doc
Скачиваний:
9
Добавлен:
08.02.2015
Размер:
294.4 Кб
Скачать

2 Модуль.

Дан массив символьных строк. Количество строк известно. Найти номер строки массива, имеющей минимальную длину. Требуется написать программу на Паскале. (0,1 балла).

Решение.

Program min_length;

Type masst=array[1..20] of string;

Var s:masst;

I,j,n,ni:integer;

Begin

repeat

Writeln(‘ введите число строк’);

Readln(n);

Until (n>0) and (n<=20);

Writeln(‘Введите строки’);

For i:=1 to n do

Readln(s[i]);

Ni:=1;

For i:=1 to n do

If (length (s[i]<length(s[ni]) then

Ni:=i;

Writeln(‘Строка с минимальной длиной ’, s[ni]);

End.

    1. Примеры заданий промежуточного /итогового контроля

Приведены примеры заданий промежуточного и итогового контроля, а также сформулированы критерии их оценивания.

Контрольная работа 1.

Критерии оценивания работы.

Задачи 1 и 2 оцениваются по – 4 баллакаждая:

постановка задачи – 0,5 балла;

алгоритм – 2 балла;

программа – 1,5 балла.

Задача 3:

постановка и трассировка по – 0,5 баллакаждая;

алгоритм – 1 балл.

Задания и примеры их выполнения

  1. Дан массив A[1:n]. Поменять местами его минимальный четный и максимальный нечетный элементы. Написать постановку задачи, алгоритм и программу.

Решение.

Постановка задачи

Дано:n,a[1:n]

Результат:a’[1:n] или сообщение «нет четных элементов» или сообщение «нет нечетных элементов»

При:nЄN,n≤Lmax(Lmaxздесь и далее - максимальная длина массива)

Связь: b=a[nch], a[nch]=a[nnech], a[nnech]=b,

где nch– номер минимального четного элемента массива,

nnech– номер максимального нечетного элемента массива.

Алг «обмен»

Нач

ввод(n, a[1:n])

{инициализации}

min:=maxint

nch:=0

max:=-maxint

nnech:=0

цикл от i:=1 до n

если a[i] – четное то

если a[i] <=min то

min:=a[i]

nch:=i

все

иначе

если a[i] >=max то

max:=a[i]

nnech:=i

все

все

кц

если nсh=0 то

вывод(«нет четных элементов»)

иначе

если nnech=0 то

вывод(«нет нечетных элементов»)

иначе

b:=a[nch]

a[nch]:=a[nnech]

a[nnech]:=b

вывод(a[1:n])

все

все

кон

program kr;

var a:array[1..20] of integer;

i,n,min,max,nch,nnech,b:integer;

begin

write('введите n'); read(n);

write('введите');

for i:=1 to n do read(a[i]);

{инициализация}

min:=maxint;

nch:=0;

max:=-maxint-1;

nnech:=0;

for i:=1 to n do

if not odd( a[i] ) then

begin

if a[i] <=min then

begin

min:=a[i];

nch:=i;

end

end

else

if a[i] >=max then

begin

max:=a[i];

nnech:=i

end;

if nch=0 then

writeln('нет четных')

else

if nnech=0 then

writeln('нет нечетных')

else

begin

b:=a[nch];

a[nch]:=a[nnech];

a[nnech]:=b;

writeln('массив после перестановки');

for i:=1 to n do writeln(a[i]);

end;

end.

  1. Дан массив B[1:n]. Сформировать два новых массива: первый содержит отрицательные элементы, а второй – четные. Написать постановку задачи, алгоритм и программу.

Решение.

Постановка задачи

Дано:n,a[1:n]

Результат: b[1:nb] или сообщение «нет отрицательных элементов»

с[1:nс] или сообщение «нет четных элементов»

При: n Є N, n≤ Lmax

Связь: b[j]=a[i], i=1,n; j=1,nb, если a[i]<0.

c[j]=a[i], i=1,n; j=1,nc, если a[i] - четное.

Алг «2 новых массива»

Нач

ввод(n, a[1:n])

{инициализации}

nb:=0

nc:=0

цикл от i:=1 до n

если a[i] <0 то

nb:=nb+1

b[nb]:=a[i]

все

если a[i] - четное то

nc:=nc+1

c[nc]:=a[i]

все

кц

если nb=0 то

вывод(«нет отрицательных элементов»)

иначе

вывод(b[1:nb])

все

если nc=0 то

вывод(«нет четных элементов»)

иначе

вывод(c[1:nc])

все

кон

program kr;

var a,b,c:array[1..20] of integer;

i,n,nb,nc:integer;

begin

write('введите n'); read(n);

write('введите массив');

for i:=1 to n do

read(a[i]);

{инициализация}

nb:=0;

nc:=0;

for i:=1 to n do

begin

if a[i] <0 then

begin

nb:=nb+1;

b[nb]:=a[i];

end;

if not odd( a[i]) then

begin

nc:=nc+1;

c[nc]:=a[i];

end;

end;

if nb=0 then

writeln('нет отрицательных элементов')

else

begin

writeln(' массив b') ;

for i:=1 to nb do

writeln(b[i]);

end;

if nc=0 then

writeln('нет четных элементов')

else

begin

writeln(' массив c') ;

for i:=1 to nc do

writeln(c[i]);

end;

end.

  1. Вычислить сумму ряда

с точностью до

Написать постановку задачи, алгоритм и трассировку (при трассировке достаточно рассмотреть два первых шага цикла).

Решение.

Выведем рекуррентное отношение.

Для того, чтобы выразить слагаемое через предыдущее, произведём деление:

Дано:x,Eps

Результат:s

При:Eps>0,x≠0

Связь:, с точностью до

алг «итерация 2»

нач

ввод(x, Eps)

z:=x{слагаемое}

s:=z{умма членов ряда}

i:=1{номер слагаемого}

цикл p:=z {предыдущее слагаемое}

z:=z*x2 /(2i(2i+1)){текущее слагаемое}

s:=z+s {вычисление суммы}

i:=i+1 {увеличение номера шага}

до |z-p|≤Eps

кц

вывод(s)

кон

Трассировка

Экзамен(1 модуль).

Задание и пример его выполнения

Задача.Дан целочисленный массивA[1:n]. Упорядочить по возрастанию элементы массива, расположенные после его максимального элемента. Записать постановку задачи, алгоритм ее решения, написать программу и привести данные для исчерпывающего тестирования.

Решение.

Дано:n,A[1:n]

Результат:A’[1:n] или сообщение «нет сортировки: максимум последний» или сообщение «нет перестановок»

При:nЄN, n≤Lmax

Связь: A’[i]≤A[i+1], i=nmax, n-1, где A[nmax]>=A[i], i=1,n.

Алг «сортировка после максимума»

Нач

ввод(n, a[1:n])

{инициализации}

nmax:=1

цикл от i:=2 до n

если a[i] >= a[nmax] то

nmax:=i

все

кц

если nmax=n то

вывод(«нет сортировки: максимум последний»)

иначе f:=false {признак наличия перестановок}

цикл от i:=nmax+1 до n-1{метод установки}

цикл от j:=i+1 до n

если a[i]>a[j] то

f:=true {перестановка была}

{собственно перестановка}

b:=a[i]; a[i]:=a[j]; a[j]:=b

все

кц

кц

если f=false то

вывод («нет перестановок»)

иначе

вывод («массив после сортировки»)

вывод(a[1:n])

все

все

кон

program kr;

var a:array[1..20] of integer;

i,j,n,nmax,b:integer;

f:boolean;

begin

write('введите n'); read(n);

write('введите массив');

for i:=1 to n do

read(a[i]);

{инициализация}

nmax:=1;

for i:=2 to n do

if a[i] >= a[nmax] then

nmax:=i;

if nmax=n then

writeln('нет перестановок: максимум последний')

else

begin

f:=false; {признак наличия перестановок}

for i:=nmax+1 to n-1 do{метод установки}

for j:=i+1 to n do

if a[i]>a[j] then

begin

f:=true;{перестановка была}

{собственно перестановка}

b:=a[i];a[i]:=a[j];a[j]:=b;

end;

if f=false then

writeln ('нет перестановок')

else

begin

writeln('массив после сортировки');

for i:=1 to n do writeln(a[i]);

end;

end;

end.

Контрольная работа 2.

Критерии оценивания работы

Требуется написать программу с использованием подпрограмм. В первой задаче используются отдельные процедуры для ввода матрицы, ввода массива, вывода результатов и вычислений. Во второй задаче все вычисления оформляются в виде функции. Первая задача оценивается в 6 баллов, вторая – в 4 балла.

Задача 1

  • ввод и вывод данных – 1 балл;

  • передача параметров и вызов функции – 1 балл;

  • анализ существования результата вычислений – 1 балл;

  • тесты – 1 балл;

  • обработка данных:

    • циклы –0,5 балла;

    • досрочный выход из цикла – 1,5 балла.

Задача 2

  • ввод и вывод данных – 0,5 балла;

  • тесты – 0,5 балла;

  • передача параметров в функцию и вызов – 0,5 балла;

  • анализ существования результата вычислений – 0,5 балла;

  • обработка данных – 2 балла.

Задания и примеры их выполнения

Задача 1. Дана целочисленная матрица A[1:n, 1:m] и массив B[1:k]. Обнулить те строки, все элементы которых отсутствуют в массиве B. Найти сумму элементов остальных строк.

Решение. Приведен алгоритм процедуры вычислительной части задачи.

Алг «процедура обнуления»

Вход: n, m, a[1:n, 1:m], k, b[1:k]

выход: n1, a[1:n1,1:m], s

Нач

s:=0 {сумма}

цикл от i:=1 до n {строки}

j:=1 {номер столбца}

flag:=false {признак отсутствия элементов в массиве}

цикл-пока j<=m и flag=false

L:=1 {текущий номер элемента в B}

цикл-пока L<=k и a[i,j]≠B[L]

L:=L+1{берем следующий элемент B}

кц

если L<=k то {a[i,j] есть в B}

flag:=true

иначе

j:=j+1 {берем следующий столбец}

все

кц

если flag то {i-я строка обнуляется}

цикл от j:=1 до m

a[i, j]:=0

кц

иначе

цикл от j:=1 до m

s:=s+a[i,j] {считаем сумму не обнуленных элементов}

кц

все

кц

кон

Задача 2. Написать программу с использованием функции, которая переставляет в обратном порядке элементы главной диагонали матрицы, если сумма четных элементов, расположенных под главной диагональю, положительная.

Решение. Приведена программа для решения задачи.

Program perest;

Type Matr=array[1..10,1..10] of integer;

Var A:matr;

n,i,j:integer;

flag:boolean;

Function f (n:integer; var a:matr):boolean;

Var i,j,c:integer;

Flag:boolean;

sum:integer;

Begin

Sum:=0;

flag:=false;

For i:=2 to n do

For j:=1 to i-1 do

If a[i,j] mod 2=0 then

Sum:=sum+a[i,j];

If sum > 0 then

begin

Flag:=true;

For i:=1 to trunc(n/2) do

begin

C:=a[i,i];

A[i,i]:=a[n-i+1,n-i+1];

a[n-i+1,n-i+1]:=c;

End;

End;

F:= flag;

End;

Begin

{начало основ. прог.}

{ввод n,a[1..n,1..n]}

Flag:=f(n,a);

If flag then

{Вывод a[1..n,1..n]}

else

writeln(‘нет изменений’);

End.

Зачет (1 модуль)

Для решения задачи необходимо написать постановку задачи (1 балл), алгоритм (4 балла). После проверки постановки и алгоритма необходимо отладить программу на компьютере (4 балла) и протестировать (1 балл).

В скобках указаны максимальные возможные баллы за выполнение каждого этапа. На решение задачи отводится 3 академических часа.

Задание и пример его выполнения

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]