Print s(I); " "
Вид материала | Документы |
СодержаниеA, то обращение A[i,k] IF a = b THEN блок-1 ELSE блок-2END IF Часть 3. Задание C2. A, то обращение A(i,k) |
- Visa application important! Please type or print using ballpoint pen, 785.01kb.
- Выполнение скрипта для ms sql 2005, 16.6kb.
- Доклады независимых авторов, 2012, in print, 533.36kb.
- Офсетное резинотканевое полотно Ruby®Carat — высококачественный продукт для уф-печати, 1044.38kb.
- Спонсор деловой программы: ск «Мегарусс-Д». Партнеры vip-вечеринки, 121.33kb.
Типовой алгоритм обработки двумерного массива | Программная реализация на Бейсике | отдельно по строкам Программная реализация на Бейсике | отдельно по столбцам Программная реализация на Бейсике | Типовой алгоритм обработки одномерного массива | Программная реализация на Бейсике |
Сумма | …. 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 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 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 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;
- в
- ключевая тема этого задания ЕГЭ – использование вложенных условных операторов, причем в тексте задания фрагмент программы обычно записан без отступов «лесенкой» или с неправильными отступами, например, так:
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;
- ключевая тема этого задания ЕГЭ – использование вложенных условных операторов, причем в тексте задания фрагмент программы обычно записан без отступов «лесенкой» или с неправильными отступами, например, так:
- во втором фрагменте наоборот, есть end, а begin отсутствует;
if a = b then begin
c:=1;
d:=1;
end
else x:=1;
оператор 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
- программа не выводит результат или выводит не то, что спрашивают
синтаксические ошибки (знаки пунктуации – запятые, точки, точки с запятой; неверное написание ключевых слов) допускаются в разумных пределах (если они не искажают замысел автора)