Print s(I); " "

Вид материалаДокументы

Содержание


A, то обращение A[i,k]
IF a = b THEN блок-1 ELSE блок-2END IF
Часть 3. Задание C2.
A, то обращение A(i,k)
Подобный материал:

Типовой алгоритм обработки двумерного массива

Программная реализация на Бейсике

отдельно по строкам

Программная реализация на Бейсике

отдельно по столбцам

Программная реализация на Бейсике

Типовой алгоритм обработки одномерного массива

Программная реализация на Бейсике

Сумма

….

s= 0

for i= 1 to n

for j= 1 to m

s= s+ a(i , j)

next j

next i

print ”s=”; s



….

for i= 1 to n

s(i)=0

next i

for i= 1 to n

for j= 1 to m

s(i)= s(i)+ a(i , j)

next j

next i

for i= 1 to n

print s(i); ” ”;

next i



….

for j= 1 to m

s(j)= 0

next j

for j= 1 to m

for i= 1 to n

s(j)= s(j)+ a(i , j)

next i

next j

for j= 1 to m

print s(j); ” ”;

next j



Сумма

….

s= 0

For i= 1 to n

s = s+ a ( i )

next i

print ”s=”; s



Произведение

….

p= 1

for i= 1 to n

for j= 1 to m

p= p* a(i , j)

next j

next i

print ”p=”; p





for i= 1 to n

p(i)= 1

next i

for i= 1 to n

for j= 1 to m

p(i)= p(i) * a(i,j)

next j

next i

for i= 1 to n

print p(i); ” ”;

next i





for j= 1 to m

p(j)= 1

next j

for j= 1 to m

for i= 1 to n

p(j)= p(j) * a(i,j)

next i

next j

for j= 1 to m

print p(j); ” ”;

next j



Произведение



p= 1

For i= 1 to n

p= p* a( i )

next i

print p



Выбор по условию



for i= 1 to n

for j= 1 to m

if <условие> then

Rez= …

next j

next i

print Rez





For i= 1 to n

Rez(i)=0

next i

for i= 1 to n

for j= 1 to m

if <условие> then

Rez(i)= …

next j

next i

for i= 1 to n

print Rez(i); ” ”;

next i





for j= 1 to m

Rez(j)=0

next j

for j= 1 to m

for i= 1 to n

if <условие> then

Rez(j)= …

next i

next j

for j= 1 to m

print Rez(j); ” ”;

next j



Выбор по условию



k=0

s= 0

p= 1

For i = 1 to n

if <условие> then

k=k+1 : s= s+ a( i ) : p=p* a( i )

next i

print k : print s : print p



Максимальный (минимальный) элемент



max=a(1,1)

min=a(1,1)

for i= 1 to n

for j= 1 to m

if a(i,j) > max then max=a(i,j)

if a(i,j) < min then min=a(i,j)

next j

next i

print ”max=”; max

print ”min=”; min





For i= 1 to n

max(i)=a(i,1)

min(i)=a(i,1)

next i

for i= 1 to n

for j= 1 to m

if a(i,j) > max(i) then

max(i)=a(i,j)

if a(i,j) < min(i) then

min(i)=a(i,j)

next j

next i

for i= 1 to n

print max (i); ” ”;

print

print min (i); ” ”;

next i





For j= 1 to m

max(j)=a(1,j)

min(j)=a(1,j)

next j

for j= 1 to m

for i= 1 to n

if a(i,j) > max(j) then

max(j)=a(i,j)

if a(i,j) < min(j) then

min(j)=a(i,j)

next i

next j

for j= 1 to m

print max (j); ” ”;

print

print min (j); ” ”;

next j



Максимальный (минимальный) элемент



max=a(1)

min=a(1)

For i = 2 to n do

if a(i) > max then max=a( i )

if a(i) < min then min=a( i )

next i

print ”max=”; max

print ”min=”; min



Заполнение массива

input n: input m

dim a(n,m)

for i=1 to n

for j= 1 to m

input a(i,j)

next j

next i









Заполнение массива



input n

dim a(n)

for i=1 to n

input a(i)

next i



Вывод (таблицей)

….

for i= 1 to n

for j= 1 to m

print a(i,j);” ”;

next j

print

next i



на Бейсике:

сортировки одномерных массивов:

Вывод в строку



for i=1 to n

print a(i);” ”;

next i



Вывод в столбец



for i=1 to n

print a(i)

next i



1 методом «Пузырька»



for j = n to 2 step -1

for i = 1 to j-1

if a(i)>a(i+1) then

swap a(i), a(i+1)

next i

next j

...


2 методом «Пузырька»



for i = 1 to n

for j = 1 to n-1

if a(j)>a(j+1) then

swap a(j), a(j+1)

next j

next i

...


«Выбором»

for i = 1 to n-1

for j = i+1 to n

if a(i)>a(j) then

swap a(i), a(j)

next j

next i

...





Вставка

dim a (n+1)



for i=n to k step -1

a( i + 1 )= a(i)

next i

a( k )= x






Удаление



for i =k to n-1

a(i) = a( i + 1 )

next i






Типовой алгоритм обработки двумерного массива

Программная реализация на Паскале

отдельно по строкам

Программная реализация на Паскале

отдельно по столбцам

Программная реализация на Паскале

Типовой алгоритм обработки одномерного массива

Программная реализация на Паскале

Сумма

….

s:= 0;

For i:= 1 to n do

For j:= 1 to m do

s:= s+ a[i,j];

writeln( ’s=’, s);



….

For i:= 1 to n do

s[i]:= 0;

For i:= 1 to n do

For j:= 1 to m do

s[i]:= s[i]+ a[i,j];

For i:= 1 to n do

write(s[i], ’ ’);



….

For j:= 1 to m do

s[j]:= 0;

For j:= 1 to m do

For i:= 1 to n do

s[j]:= s[j]+ a[i,j];

For j:= 1 to m do

write(s[j], ’ ’);



Сумма

….

s:= 0;

For i:= 1 to n do

s:= s+ a[ i ];

writeln( ’s=’, s);



Произведение

….

p:= 1;

For i:= 1 to n do

For j:= 1 to m do

p:= p* a[i,j];

writeln( ’p=’, p);





For i:= 1 to n do

p[i]:= 1;

For i:= 1 to n do

For j:= 1 to m do

p[i]:= p[i] * a[i,j];

For i:= 1 to n do

write(p[i], ’ ’);





For j:= 1 to m do

p[j]:= 1;

For j:= 1 to m do

For i:= 1 to n do

p[j]:= p[j] * a[i,j];

For j:= 1 to m do

write(p[j], ’ ’);



Произведение



p:= 1;

For i:= 1 to n do

p:= p* a[ i ];

writeln( ’p=’, p);



Выбор по условию



For i:= 1 to n do

For j:= 1 to m do

if <условие> then

Rez:= …;

For i:= 1 to n do
writeln(’Rez=’, Rez);





For i:= 1 to n do

begin

Rez[i]:=0;

end;

For i:= 1 to n do

For j:= 1 to m do

if <условие> then

Rez[i]:= … ;

For i:= 1 to n do
write(Rez[i], ’ ’);





For j:= 1 to m do

begin

Rez[j]:=0;

end;

For j:= 1 to m do

For i:= 1 to n do

if <условие> then

Rez[j]:= … ;

For j:= 1 to m do
write(Rez[j], ’ ’);



Выбор по условию



k:=0;

s:= 0;

p:= 1;

For i:= 1 to n do

if <условие> then

begin
k:=k+1; s:= s+ a[ i ];

p:= p* a[ i ];

end;



Максимальный (минимальный) элемент



max:=a[1,1];

min:=a[1,1];

For i:= 1 to n do

For j:= 1 to m do

begin
if a[i,j] > max then

max:=a[i,j];

if a[i,j] < min then

min:=a[i,j];

end;

writeln(’max=’, max);

writeln (’min=’, min);





For i:= 1 to n do

begin

max[i]:=a[i,1];

min[i]:=a[i,1];

end;

For i:= 1 to n do

For j:= 1 to m do

begin
if a[i,j] > max[i] then

max[i]:=a[i,j];

if a[i,j] < min[i] then

min[i]:=a[i,j];

end;

For i:= 1 to n do
write(max[i], ’ ’);

writeln;

For i:= 1 to n do
write(min[i], ’ ’);





For j:= 1 to m do

begin

max[j]:=a[i,1];

min[j]:=a[i,1];

end;

For j:= 1 to m do

For i:= 1 to n do

begin
if a[i,j] > max[j] then

max[j]:=a[i,j];

if a[i,j] < min[j] then

min[j]:=a[i,j];

end;

For j:= 1 to m do
write(max[j], ’ ’);

writeln;

For j:= 1 to m do
write(min[j], ’ ’);



Максимальный (минимальный) элемент



max:=a[1];

min:=a[1];

For i:= 2 to n do

begin
if a[i] > max then

max:=a[ i ];

if a[i] < min then

min:=a[ i ];

end;

writeln( ’max=’, max);

writeln( ’min=’. min);



Заполнение массива



For i:= 1 to n do

For j:= 1 to m do

readln(a[ i, j]);









Заполнение массива

const

n=10;

var a: array [1..n] of … ;

I : integer;

Begin

for i:=1 to n do

readln (a[i]);



Вывод (таблицей)

….

For i:= 1 to n do
begin

For j:= 1 to m do

begin
write(a[ i, j ]),’ ’ );

end;

writeln;

end;



на Паскале:

сортировки одномерных массивов:

Вывод в строку



for i:=1 to n do

write(a[i],’ ’ );



Вывод в столбец



for i:=1 to n do

writeln(a[i]);



1 методом «Пузырька»



for j:= n downto 2 do

for i:= 1 to j-1 do

if a[i]>a[i+1] then

begin

x:=a[i];

a[i]:=a[i+1];

a[i+1]:=x;

end;

...


методом прямых вставок с барьером



for i:= 2 to n do

if a[i-1]>a[i] then begin

a[0]:= a[i];

j:= i-1;

while a[j]>a[0] do begin

a[j+1]:= a[j];

j:= j-1;

end;

a[j+1]:= a[0];

end;





2 методом «Пузырька»:



for j:=1 to n-1 do

for i:=1 to n-j do

if а[i] > а[i+l] then

begin

b:=а[i];

а[i]:=а[i +1];

а[i+1]:=b;

end;




«Выбором»



k:=0;

for i:=1 to n-1 do

for j:=i+1 to n do

begin

K:=K+1;

if y[i]>[j] then

begin

b:=y[i];

y[i]:=y[j];

y[j]:=b;

end;

end;




простыми вставками:



for i:= 2 to n do

if a[i-1]>a[i] then

begin x:= a[i];

j:= i-1;

while (j>0) and (a[j]>x) do

begin a[j+1]:= a[j];

j:= j-1;

end;

a[j+1]:= x;

end;




Вставка



for i:=n downto k do

a[ i + 1 ]:= a[i];

a[ k ]:= x;



Удаление



for i:=k to (n-1) do

a[i]:= a[ i + 1 ];











Паскаль. Часть 3. Задание C1.

Исправление ошибок в простой программе с условными операторами.

Что нужно знать:
  • правила построения программы на Паскале, Бэйсике.
  • правила работы с переменными (объявление, ввод, вывод, оператор присваивания)
  • ветвление – это выбор одного из двух возможных вариантов действий в зависимости от того, выполняется ли некоторое условие;
  • на блок-схеме алгоритма ветвление изображается в виде блока-ромба с одним входом и двумя выходами:
  • условный оператор if–else служит для организации ветвления в программе на языке Паскаль
  • условный оператор может иметь полную или неполную форму; вот фрагменты программы, реализующие ветвления, показанные на рисунках 1 и 2:

    полная форма:

    неполная форма:

    if a = b then begin

    { блок-1 }

    end

    else begin

    { блок-2 }

    end;

    if a = b then begin

    { блок-1 }

    end;
  • обычно при записи программы операторы, находящиеся внутри обоих блоков, сдвигают вправо на 2-3 символа (запись «лесенкой»), это позволяет сразу видеть начало и конец блока (конечно, если «лесенка» сделана правильно)
  • после else не надо (нельзя!) ставить какое-то условие, эта часть выполняется тогда, когда условие после if неверно
  • в Паскале перед else не ставится точка с запятой, поскольку это ключевое слово обозначает не начало нового оператора, а вторую часть условного оператора if–else
  • слова begin и end (их называют также «операторные скобки») ограничивают блок-1 и блок-2; если внутри блока всего один оператор, эти «скобки» можно не писать, например, допустимы такие операторы а вот такие операторы недопустимы:

    if a = b then

    c:=1

    else c:=0;

    if a = b then begin

    c:=1;

    end

    else c:=0;

    if a = b then c:=1;




    if a = b then begin

    c:=1

    else c:=0;

    if a = b then

    c:=1;

    end

    else c:=0;

    if a = b then

    c:=1;

    d:=1;

    else x:=1;
    1. в
      • ключевая тема этого задания ЕГЭ – использование вложенных условных операторов, причем в тексте задания фрагмент программы обычно записан без отступов «лесенкой» или с неправильными отступами, например, так:

      if a = b then begin

      if a = c then

      c:=1;

      end

      else c:=0;

      if a = b then

      if a = c then

      c:=1

      else c:=0;



      первом случае есть begin, но забыли про соответствующий ему end;
    2. во втором фрагменте наоборот, есть end, а begin отсутствует;

    3. if a = b then begin

      c:=1;

      d:=1;

      end

      else x:=1;
      третий случай более сложный: судя по записи «лесенкой», здесь внутри блока-1 находятся 2 оператора, а операторных скобок begin-end нет; в результате получилось, что оператор c:=1 находится внутри блока-1, он выполняется только при условии a=b;
      оператор d:=1 выполняется всегда, после того, как условный оператор закончил работу; а else вообще «висит» непонятно как, тут транслятор выдаст ошибку; исправить эту программу можно так, как показано справа (добавив пару begin-end):



чтобы разобраться с работой этих программ, нужно определить, к какому из условных операторов if относится часть else; для этого используют такое правило: «любой else относится к ближайшему if»
  • в условных операторах можно использовать сложные условия, которые строятся из простых отношений (<, <=, >, >=, =, <>) с помощью логических операций not («НЕ», отрицание), and («И», одновременное выполнение двух условий) и or («ИЛИ», выполнение хотя бы одного из двух условий)
  • в сложном условии сначала выполняются действия в скобках, потом – not, затем – and, затем – or и, наконец, отношения;
    операции равного уровня (приоритета) выполняются последовательно слева направо

  • if (a = b) or (b < c) and (c <> d) then begin

    ...

    end;
    поскольку отношения в Паскале имеют низший приоритет, в сложном условии их приходится брать в скобки:
  • в приведенном выше примере сначала определяются результаты сравнения (выражения в скобках), затем выполняется операция and («И»), а затем – or («ИЛИ»)

Возможные проблемы:
    • как правило, в этой задаче требуется использовать знания из курса математики (решение уравнений, графики функций, составление уравнений прямой по приведенному графику)
    • как показывает анализ опубликованных задач этого типа, нужно уметь, прежде всего, разбираться в серии вложенных условных операторов в полной и неполной форме
    • неправильная «лесенка» в записи сбивает с толку и подталкивает к неверному решению; чтобы разобраться в программе, лучше на черновике построить блок-схему алгоритма и правильную «лесенку»
    • чтобы не запутаться, к какому оператору относится else, используйте следующее правило:
  • если перед else нет слова end, нужно искать ближайший сверху условный оператор if
  • если перед else стоит end (конец блока), нужно искать парный ему begin (начало блока) и соответствующий условный оператор if ... then begin
    • проверяйте, все ли необходимые условия учтены в программе, это особенно актуально для немонотонных функций типа синуса или косинуса (немонотонные функции на некоторых участках возрастают при увеличении аргумента, а на некоторых – убывают);
    • не перепутайте, где нужно использовать операцию and («И», одновременное выполнение условий), а где – or («ИЛИ», хотя бы одно условие)
    • нужно внимательно проверять, всегда ли программа выдает сообщение, если заданное условие не выполняется;
    • часто бывает полезно нарисовать блок-схему алгоритма, которая позволяет увидеть ход выполнения программы при всех возможных вариантах;
    • проверяйте, включает ли заданная область свои границы; если включает – в отношениях будут нестрогие неравенства (<=, >=), если не включает – строгие (<, >);
    • при оценке работы можно (при абсолютно правильном решении) потерять баллы из-за синтаксических ошибок в программе (скобки, точки с запятой, неправильное написание оператора и т.п.); не забывайте, что
  • в сложном условии все простые условия (отношения) нужно брать в скобки, так как в Паскале отношения при вычислении логического выражения имеют самый низкий приоритет
  • перед else точка с запятой никогда не ставится в конце программы после последнего end ставится точка.

За что снимают баллы:
    • неправильно определены входные данные, при которых исходная программа работает неверно
    • исправлены не все ошибки в программе,
    • программа работает правильно в большем количестве случаев, чем исходная, но не для всех возможных исходных данных
    • перепутаны знаки < и >, логические операции or и and
    • неверно расставлены операторные скобки begin-end

синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов); чтобы получить 3 балла, нужно сделать не более одной синтаксической ошибки; на 2 балла – до двух ошибок, на 1 балл – до трех ошибок

Часть 3. Задание C2.

Обработка массива (написать программу из 10-15 строк на языке программирования или алгоритм на естественном языке).

Что нужно знать:
  • массив – это набор однотипных элементов, имеющих общее имя и расположенных в памяти рядом
  • для обращения к элементу массива используют квадратные скобки, запись A[i] обозначает элемент массива A с номером (индексом) i
  • для обработки всех элементов массива используется цикл вида

for i:=1 to N do begin

{ что-то делаем с элементом A[i] }

end;

переменная i обозначает номер текущего элемента массива, она меняется от 1 до N с шагом 1, то есть мы «проходим» последовательно все элементы
  • матрица (двухмерный массив) – это прямоугольная таблица однотипных элементов
  • если матрица имеет имя A, то обращение A[i,k] обозначает элемент, расположенный на пересечении строки i и столбца k







    k




























    i




    A[i,k]















  • каждая строка матрицы – это обычный (одномерный, линейный) массив; для того, чтобы обработать строку i в матрице из M столбцов, нужно использовать цикл, в котором меняется номер столбца k:

for k:=1 to M do begin

{ что-то делаем с элементом A[i,k] }

end;
  • каждый столбец матрицы – это обычный (одномерный, линейный) массив; для того, чтобы обработать столбец k в матрице из N строк, нужно использовать цикл, в котором изменяется номер строки i:

for i:=1 to N do begin

{ что-то делаем с элементом A[i,k] }

end;


Возможные проблемы:
    • проверяйте правильность минимального и максимального значения переменной цикла в заголовке цикла for
    • как видим, основная сложность в этой задаче – не написать программу, а придумать хороший (часто еще нужно – быстрый) алгоритм
    • проверьте, что будет записано в переменные до начала цикла (определены ли их начальные значения)
    • проверяйте, не выйдет ли индекс за границу массива в начале или в конце цикла
    • будьте внимательны с «крайними» случаями, например, нужно обязательно убедиться, что программа работает, когда интересующая нас цепочка стоит в самом начале или в самом конце массива
    • проверьте, правильно ли заданы (и заданы ли вообще) начальные значения для всех переменных
    • проверьте, правильно ли расставлены операторные скобки begin-end, ограничивающие тело цикла; их обязательно нужно ставить, если в теле цикла несколько операторов
    • проверяйте, не выйдет ли индекс за границу массива в начале или в конце цикла
    • не перепутайте номер строки (это первый индекс) и номер столбца (второй индекс)
    • для надежности не рекомендуется использовать в одной программе переменные i и j, потому что они слишком похоже выглядят, вот пример ошибочного решения в этой задаче:

for i:=1 to N do begin

max := A[i,1];

for i:=2 to N do

if A[j,i] > max then max := A[i,j];

Sum := Sum + max;

end;

Немного тактики:
    • если вы хорошо умеете выражать свои мысли по-русски, эксперты рекомендуют писать только алгоритм на русском языке; дело в том, что если вы сделаете много ошибок в программе, оценка будет снижена даже при абсолютно правильном алгоритме
    • если вам сложно изъясняться на родном языке, а легче записать свои мысли на Паскале или Си – пишите программу, но тщательно проверяйте ее на предмет возможных случайных ошибок-опечаток, которые можно сделать просто по невнимательности:
    • задавайте все начальные значения для переменных
    • проверяйте правильность написания ключевых слов
    • если в теле цикла несколько операторов, заключайте их в блок begin-end (операторные скобки)
    • проверяйте начальное и конечное значение переменной цикла
    • если вы используете циклы while или repeat, проверьте, что переменная цикла изменяется в теле цикла (иначе в программе будет зацикливание, а на ЕГЭ – потерянные баллы)
    • выводите на экран именно то, что требуется по условию
    • ставьте точку с запятой в конце операторов
    • НЕ ставьте точку с запятой перед else (Паскаль)
    • ставьте точку в конце последнего оператора end (Паскаль)

За что снимают баллы:
    • задано неверное начальное значение переменных (или вообще не задано)
    • неверно указано условие завершения цикла
    • «забыли» изменять переменную цикла в цикле while (repeat)
    • перепутаны знаки < и >, логические операции or и and
    • неверно расставлены операторные скобки begin-end
    • программа не выводит результат или выводит не то, что спрашивают

синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов) допускаются в разумных пределах (если они не искажают замысел автора)


Бейсик. Часть 3. Задание C1.

Что нужно знать:
  • правила построения программы на Бэйсике.
  • правила работы с переменными (объявление, ввод, вывод, оператор присваивания)
  • ветвление – это выбор одного из двух возможных вариантов действий в зависимости от того, выполняется ли некоторое условие;
  • на блок-схеме алгоритма ветвление изображается в виде блока-ромба с одним входом и двумя выходами:
  • условный оператор if–else служит для организации ветвления в программе на языке Бэйсик.
  • условный оператор может иметь полную или неполную форму; вот фрагменты программы, реализующие ветвления, показанные на рисунках 1 и 2:

    Линейная форма

    Блочная форма

    полная форма:

    неполная форма:

    полная форма:

    неполная форма:

    if a = b then блок-1 else блок-2

    if a = b then блок-1

    IF a = b THEN
    блок-1
    ELSE
    блок-2
    END IF


    IF a = b THEN
    блок-1
    END IF

  • ключевая тема этого задания ЕГЭ – использование вложенных условных операторов, причем в тексте задания фрагмент программы обычно записан без отступов «лесенкой» или с неправильными отступами.

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

Блочная форма на три условия: Линейная форма на три условия:

IF a = b THEN if a = b then блок-1 else if a > b then блок-2 else блок-3
блок-1
ELSEIF


a > b THEN
блок-2
ELSE
блок-3


END IF
  • в условных операторах можно использовать сложные условия, которые строятся из простых отношений (<, <=, >, >=, =, <>) с помощью логических операций not («НЕ», отрицание), and («И», одновременное выполнение двух условий) и or («ИЛИ», выполнение хотя бы одного из двух условий)
  • в сложном условии сначала выполняются действия в скобках, потом – not, затем – and, затем – or и, наконец, отношения;
    операции равного уровня (приоритета) выполняются последовательно слева направо

Возможные проблемы:
    • как правило, в этой задаче требуется использовать знания из курса математики (решение уравнений, графики функций, составление уравнений прямой по приведенному графику)
    • как показывает анализ опубликованных задач этого типа, нужно уметь, прежде всего, разбираться в серии вложенных условных операторов в полной и неполной форме
    • неправильная «лесенка» в записи сбивает с толку и подталкивает к неверному решению; чтобы разобраться в программе, лучше на черновике построить блок-схему алгоритма и правильную «лесенку»
    • если использовали блочную форму записи, то закрыть end if, а elseif записываем слитно.
    • если линейную, то else if записываем раздельно.
    • проверяйте, все ли необходимые условия учтены в программе, это особенно актуально для немонотонных функций типа синуса или косинуса (немонотонные функции на некоторых участках возрастают при увеличении аргумента, а на некоторых – убывают);
    • не перепутайте, где нужно использовать операцию and («И», одновременное выполнение условий), а где – or («ИЛИ», хотя бы одно условие)
    • нужно внимательно проверять, всегда ли программа выдает сообщение, если заданное условие не выполняется;
    • часто бывает полезно нарисовать блок-схему алгоритма, которая позволяет увидеть ход выполнения программы при всех возможных вариантах;
    • проверяйте, включает ли заданная область свои границы; если включает – в отношениях будут нестрогие неравенства (<=, >=), если не включает – строгие (<, >);
    • при оценке работы можно (при абсолютно правильном решении) потерять баллы из-за синтаксических ошибок в программе (скобки, точки с запятой, неправильное написание оператора и т.п.);

За что снимают баллы:
    • неправильно определены входные данные, при которых исходная программа работает неверно
    • исправлены не все ошибки в программе,
    • программа работает правильно в большем количестве случаев, чем исходная, но не для всех возможных исходных данных
    • перепутаны знаки < и >, логические операции or и and

синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов); чтобы получить 3 балла, нужно сделать не более одной синтаксической ошибки; на 2 балла – до двух ошибок, на 1 балл – до трех ошибок

Часть 3. Задание C2.

Обработка массива (написать программу из 10-15 строк на языке программирования или алгоритм на естественном языке).

Что нужно знать:
  • массив – это набор однотипных элементов, имеющих общее имя и расположенных в памяти рядом
  • для обращения к элементу массива используют квадратные скобки, запись A(i) обозначает элемент массива A с номером (индексом) i
  • для обработки всех элементов массива используется цикл вида

for i:=1 to N

{ что-то делаем с элементом A(i) }

next i

переменная i обозначает номер текущего элемента массива, она меняется от 1 до N с шагом 1, то есть мы «проходим» последовательно все элементы
  • матрица (двухмерный массив) – это прямоугольная таблица однотипных элементов
  • если матрица имеет имя A, то обращение A(i,k) обозначает элемент, расположенный на пересечении строки i и столбца k







    k




























    i




    A(i,k)















  • каждая строка матрицы – это обычный (одномерный, линейный) массив; для того, чтобы обработать строку i в матрице из M столбцов, нужно использовать цикл, в котором меняется номер столбца k:

for k:=1 to M

{ что-то делаем с элементом A(i,k) }

next k
  • каждый столбец матрицы – это обычный (одномерный, линейный) массив; для того, чтобы обработать столбец k в матрице из N строк, нужно использовать цикл, в котором изменяется номер строки i:

for i:=1 to N

{ что-то делаем с элементом A(i,k) }

next i


Возможные проблемы:
    • проверяйте правильность минимального и максимального значения переменной цикла в заголовке цикла for
    • как видим, основная сложность в этой задаче – не написать программу, а придумать хороший (часто еще нужно – быстрый) алгоритм
    • проверьте, что будет записано в переменные до начала цикла (определены ли их начальные значения)
    • проверяйте, не выйдет ли индекс за границу массива в начале или в конце цикла
    • будьте внимательны с «крайними» случаями, например, нужно обязательно убедиться, что программа работает, когда интересующая нас цепочка стоит в самом начале или в самом конце массива
    • проверьте, правильно ли заданы (и заданы ли вообще) начальные значения для всех переменных
    • проверьте, правильно ли закрыты циклы
    • проверяйте, не выйдет ли индекс за границу массива в начале или в конце цикла
    • не перепутайте номер строки (это первый индекс) и номер столбца (второй индекс)
    • для надежности не рекомендуется использовать в одной программе переменные i и j, потому что они слишком похоже выглядят, вот пример ошибочного решения в этой задаче:

for i=1 to N

max = A(i,1)

for i=2 to N

if A(j,i) > max then max = A(i,j)

Sum = Sum + max

next i


Немного тактики:
    • если вы хорошо умеете выражать свои мысли по-русски, эксперты рекомендуют писать только алгоритм на русском языке; дело в том, что если вы сделаете много ошибок в программе, оценка будет снижена даже при абсолютно правильном алгоритме
    • если вам сложно изъясняться на родном языке, а легче записать свои мысли на Бейсике – пишите программу, но тщательно проверяйте ее на предмет возможных случайных ошибок-опечаток, которые можно сделать просто по невнимательности:
    • задавайте все начальные значения для переменных
    • проверяйте правильность написания ключевых слов
    • проверяйте начальное и конечное значение переменной цикла
    • выводите на экран именно то, что требуется по условию

За что снимают баллы:
    • задано неверное начальное значение переменных (или вообще не задано)
    • неверно указано условие завершения цикла
    • «забыли» изменять переменную цикла в цикле while … wend или do … loop.
    • перепутаны знаки < и >, логические операции or и and
    • программа не выводит результат или выводит не то, что спрашивают

синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов) допускаются в разумных пределах (если они не искажают замысел автора)