Const N=IO;
Var AzВ: array [1..N] of Integer;
I: Byte;
Begin for 1:=1 to N do begin
Write (‘Введите A[‘z Iz’]: ‘);
Readln(A[I]) end;
For 1:=1 to N do
B fl] :=A[N-I + 1] ;
For 1:=1 to N do
Writeln(‘B[‘z Iz’]=’z B[I]);
Readln end.
Const N=10;
Var A: array [1..N] of Integer;
I: Byte;
Chz NCh: Longint; begin
For 1:=1 to N do begin
Write (‘Введите A[‘z Iz’]: ‘);
Readln(A[I]) end;
Ch:=0;
NCh:=0;
For 1:=1 to N do
If A[I] mod 2=0 then Ch:=Ch + A[I] else
NCh:=NCh + A [ I ] ;
Writeln(‘Четные — нечетные = ‘z Ch-NCh); Readln end.
Приведем только тело второго цикла, считающего суммы. В остальном решение в точности совпадает с решением предыдущей задачи, for 1:=1 to N do if I mod 2=0 then
Ch:=Ch + A[I] else
NCh:=NCh + A[I]
4 Const N=10;
Var A: array [1..N] of Integer;
I: Byte;
S: Boolean;
Begin
For 1:=1 to N do
Begin
Write (‘Введите A[‘z Iz’]: ‘); Readln(A[I])
End;
S :=True;
For 1:=1 to (N div 2) do
If A[I] <> A[N-I+1] then S:=False;
If S then
Writeln(‘Массив симметричный’) else
Writeln(‘Массив не симметричный’); Readln
End.
5 Const N=10;
Var A: array [1..N] of Integer;
Iz J: Byte;
S: Boolean;
Begin
For 1:=1 to N do
Begin
Write (‘Введите A[‘z Iz’]: ‘); Readln(A[I]) end;
S :=True;
For 1:=1 to N-I do
For J:=I+1 to N do if A[I] = A[J] then S :=False;
If S then
Writeln(‘Все элементы разные’) else
Writeln(‘Есть повторяющиеся элементы’); Readln
End.
Const N=10;
Var A: array [1..N] of Integer;
IrМ: Byte;
S: Longint;
Begin
For 1:=1 to N do begin
Write (’Введите A[‘r Ir’]: ‘);
Readln(A[I])
End;
S :=0;
M :=0;
For 1:=1 to N do
If A[I] <0 then begin
S :=S + A[I];
Inc (M) end;
If M>0 then
Writeln (‘Искомое число = ‘r S/M:7:3) else
Writeln (‘Все числа в массиве неотрицательные’); Readln end.
7 Во многих задачниках приводится решение этой задачи за два прохода: сначала ищется максимум, потом подсчитывается, сколько чисел ему равны. Это неэффективное решение. Посмотрите, как легко оба этих действия можно выполнить за один просмотр массива.
Const N=IO;
Var A: array [1..N] of Integer;
IrМ: Byte;
Max: Integer;
Begin
For 1:=1 to N do
Begin
Write (‘Введите A[‘r Ir’]: ‘);
Readln(A[I])
End;
Max :=A[1];
M :=1;
For 1:=2 to N do
If A[I]>Max then
Begin
Max:=A[I];
M:=l
End
Else if A[I]=Max then
Inc(M);
Writeln(‘Максимум = ‘, Max,
‘, всего таких чисел: ‘, М);
Readln
End.
8 Const N=10;
Var A: array [1..N] of Integer;
I, M, Ml: Byte;
Max: Integer;
Begin
For 1:=1 to N do
Begin
Write (‘Введите A[‘, I, ‘]: ‘);
Readln(A[I])
End;
Max :=A[1];
M :=1;
Ml :=1;
For 1:=2 to N do
If A[I]>Max then
Begin
Max :=A[I];
M :=1;
Ml :=1 end
Else if A[I]=Max then Ml :=1;
Writeln(‘Первый максимум A[‘, M, ‘], последний максимум А[‘, Ml, ‘]’);
Readln end.
9 Const N=10;
Var A: array [1..N] of Integer;
I, M: Byte;
Max: Integer;
Begin
For 1:=1 to N do
Begin
Write (‘Введите A[‘, I, ‘]: ‘);
Readln(A [ I ]) end;
M :=0;
If A[1]>A[2] then
Inc(M);
If A[N]>A[N-1] then
Inc(M);
For 1:=2 to N-I do
If A[I]>A[I-1]+A[I+1] then
Inc(M);
Writeln(‘Количество искомых чисел = ,, M) ;
Readln end.
Способ 1.
Const N=10;
Var A: array [1..N] of Integer;
M: Byte;
Begin
For M:=l to N do
Begin
Write (‘Введите A[‘, M, ,]: ‘);
Readln(A[M])
End;
M :=1;
While (A[N]*A[N-M]>0) and (M Inc(M); If (M=N-I) and (A[N]*A[1]>0) then Inc(M); If A[N]=0 then Writeln(‘последнее число O’) Else Begin Write (‘Количество чисел одного знака If A[N]>0 then Writeln(‘знак +’); If A[N]<0 then Writeln(‘знак -‘); End; Readln end. Способ 2. Как говорилось выше, многие задачи, предложенные в этом разделе, можно решить без использования массива. Покажем, как это делается, на примере этой задачи. Проверка производится во время ввода. Const N=IO; Var I, M: Byte;
А, С: Integer; Begin M :=0; For 1:=1 to N do Begin Write (‘Введите ‘, Iz’-e число: ‘); Readln(A); If I=I then C: =A; If A*C>0 then Inc(M) Else Begin C: =A; M:=l End End;
If A=O then
в конце = ‘, М, ‘, ‘);
Writeln(‘последнее число O’)
Else
Begin
Write (‘Количество чисел одного знака в конце = ‘, Mz’z’);
If A>0 then
Writeln(‘знак +’);
If A<0 then
Writeln(‘знак -‘)
End;
Readln end.
В операторе вывода воспользуемся так называемым Форматным выводом — укажем, сколько позиций требуется отвести для выводимого значения (в случае вещественного числа требуется также указать, сколько цифр напечатать после запятой).
Var М: Array [1..12]of Integer;
Var j: Integer;
S: Real;
Begin
Writeln(‘Ввод масива’);
For J:=l to 12 do
Begin
Write (‘Введите кол-во осадков в ‘z Jz ‘-м месяце: ‘);
Readln(М[j])
End;
S :=0;
For J:=l to 12 do
S:=S+M[j]; {Нашли общегодовое кол-во осадков} S:=S/12; {Среднегодовое кол-во осадков} Writeln(‘N’:3, ‘кол-во осадков’:15,
‘отклонение’:15); {Напечатали заголовок таблицы} for J:=l to 12 do
Writeln(J:3, M[J]:15, M[J]-S :15:1);
Readln end.
При решении задачи надо попарно сравнивать символы, взятые с начала и с конца, а остановиться, очевидно, посередине. Однако в отличие от предыдущей задачи здесь не всегда надо идти до конца цикла: как только обнаружено первое несовпадение букв, проверку можно прекратить. Результаты проверки мы будем хранить в логической переменной-флаге Т, Которая равна TRUE, если на данном этапе несовпадений букв не выявлено, и становится равной FALSE, как только проверяемые буквы не совпадут.
Еще одно замечание — относительно описания и ввода массива. Мы не знаем, из скольких букв будет состоять слово, поэтому массив приходится описывать «с запасом» — на 30 элементов, использоваться же будут только NПервых введенных букв.
В Паскале при вводе слово можно записать целиком (не забыв точку в конце!). Оператор READ будет за каждый проход цикла считывать из него по одной букве.
Var Slovo: Array [1..30] of Char;
J, N: Integer;
T: Boolean;
Begin
Writeln(‘Введите слово по буквам, в конце — точка’);
N:=0;
Repeat
N:=N+1;
Read (Slovo[N])
Until Slovo[N]=’.’;
Writeln;
N:=N-I; {слово введено и подсчитано количество букв в слове} T:=TRUE;
For J:=l to N div 2 do
If Slovo[J]<>Slovo[N-J+l] then begin
T:=False;
Break
End;
If not T then Write (‘HE ‘);
Writeln(‘палиндром. ‘);
Readln end.
Число в заданной системе счисления вводится последовательно по цифрам и сразу производится его перевод в десятичную систему. Если не печатать число в заданной системе счисления, то задачу можно решить без использования массива.
Var С: array [1..20] of Integer;
I, K, CIO, Sis: Integer; { Sis — система счисления} begin
Write (‘Основание системы счисления ‘);
Readln(Sis);
Write (‘Количество цифр в числе: ‘);
Readln(К);
Writeln(‘Цифры числа в ‘, ‘Sis’, ‘-ичной системе счисления’);
ClO:=0;
For i:=l to к do
Begin
Write (I, ‘-я цифра: ‘);
Readln(C[i]);
ClO:=C10*Sis+C[i]
End;
For 1:=1 to K do
Write (C[i]); {Напечатали введенное число}
Write (‘в ‘, sis, ‘-ичной системе = ‘);
Write (СЮ);
Writeln(‘ в десятичной’);
Readln end.
14 Вспомним алгоритм перевода чисел из десятичной системы в £>-ичную. Цифрами числа (начиная с последней) будут остатки от деления числа на Q,А число на каждом шаге будет нацело делиться на Q.
Так как цифры числа будут вычисляться в обратном порядке, сразу их печатать нельзя: придется сначала сохранить их в массиве. Причем этот массив надо заполнять с последней (крайней справа) цифры справа налево. При этом важно подсчитать, сколько позиций в массиве будет заполнено, так как на экран надо выводить только вычисленные цифры числа, а не «мусор», который хранится в незаполненных в программе ячейках массива.
Заметим, что ограничение Q< 10 связано только с тем, что для систем счисления с основанием, превышающим 10, пришлось бы определять дополнительные символы-цифры; алгоритм же останется без изменений.
Var Qr NlOr Ir J: Integer;
NQ: array [1..20] of Integer;
Begin
Write (‘Основание системы счисления — ‘);
Readln(Q);
Write (‘Число в 10-й системе — ‘);
Readln(NlO);
1:=20;
Repeat
NQ[I]:=NlO mod Q;
1:=1-1;
N10:=N10 div Q;
Until N10=0;
For J:=I+1 to 20 do Write ( NQ[J]);
Writeln end.
15 Const N=10;
Type Massiv= Array [1..N] of Real;
Var Mr Polr Otr: Massiv;
Jr KPolr Kotr: Integer;
Procedure VvodMas (var M: Massiv; N: Integer);
Var J: Integer;
Begin
Writeln (‘Ввод массива’);
For J:=1 to N do begin
Write (‘Введите ‘r jr’-й элемент: ‘); Readln(M[j]) end
End;
Procedure PrintMas (var M: Massiv; N: Integer);
Var J: Integer;
Begin
For J:=l to N do
Write (M[J]r’ ‘);
Writeln
End;
Begin
VvodMas (Mr N);
KPol:=0;
KOtr:=О; {в обоих массивах пока нет элементов} for J:=l to N do
Begin
If M[j]>O then
Begin
KPol:=KPol + l;
Pol[KPol]:=M[J]
End;
If M[J] Begin KOtr:=K0tr+l; Otr[K0tr]:=M[J] end end; Writeln(‘Исходный массив’); PrintMas (MrN); Writeln(‘Положительные числа’); PrintMas (Pol, KPol); Writeln(‘Отрицательные числа’); PrintMas (Otr, KOtr); Readln End. Const N=IO; Type Massiv= Array [1..N] of Integer; Var M: Massiv; J, X: Integer; Procedure VvodMas (var M: Massiv; N: Integer); Var J: Integer; Begin Writeln(‘Ввод массива’); For J:=l to N do Begin Write (‘Введите ‘, j, ‘-й элемент: ‘); Readln(M[j]) End End; Procedure PrintMas (var M: Massiv; N: Integer); Var J: Integer; Begin For J:=l to N do Write(M[J], ‘ ‘); Writeln End; Begin VvodMas (M, N); X:=M[1]; For J:=l to N-I do M[J]:=M[J+l]; M[N]:=X; PrintMas (MrN); Readln end. Const N=8; Type Massiv= Array [1..N] of Integer; Var M: Massiv; Kr jr Slr Sp: Integer; Procedure VvodMas (var M: Massiv; N: Integer); var J: Integer; Begin Writeln(‘Ввод массива’); For J:=1 to N do Begin Write (‘Введите ‘r jr’-й элемент: ‘); Readln(M[j]) End End; Procedure PrintMas (var M: Massiv; N: Integer); Var J: Integer; Begin For J:=l to N do Write (M[J]r’ ‘); Writeln End; Begin VvodMas (Mr N); PrintMas (MrN); Sl:=0; Sp:=0; {B начале суммы правой и левой частей — нулевые} For J:=l to N div 2 do Sl∙.=Sl+M[j]; {Найдена сумма левой части} If N mod 2 =0 then K:=N div 2+1 else К:=N div 2 + 2; For J:=K to N do Sp:=Sp+M[j]; {Найдена сумма правой части} if Sl=Sp then Writeln(‘билет счастливый’) else Writeln(‘билет несчастливый’) end.
Сохраним первый элемент в переменной X, произведем сдвиг элементов и запишем XНа последнее место.
Надо подсчитать суммы правой и левой частей и сравнить их. Некоторую сложность представляет разделение массива на две части, потому что такое разделение зависит от того, четно ли количество его элементов. Воспользуемся операцией поиска остатка от деления MOD: если N mod 2 = 0, значит, N— четное.