Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Egorova1

.pdf
Скачиваний:
36
Добавлен:
14.02.2015
Размер:
1.67 Mб
Скачать

Для очистки экрана используется обращение к стандартной процедуре ClrScr в виде: ClrScr;

Эта процедура очищает экран и помещает курсор в верхний левый угол экрана. Для того, чтобы в программе можно было использовать процедуру ClrScr, к программе необходимо подключить стандартный модуль Crt. Для этого в программе до использования процедуры Clrscr должно быть предложение

Uses Crt; (* Использовать модуль Crt *)

Для задержки экрана по концу работы программы используются стандартная функция

Keypressed или Readkey (см. п.3.1 и п.3.2).

Пример 1.

(* Ввод и вывод одномерного массива *) program p0;

var a:array[1..10] of integer; (* a - массив *)

i,

(* i - индекс массива a *)

n:integer;

(* n - количество элементов в массиве a *)

begin

(* Ввод массива *)

write('Введите количество элементов массива: '); readln(n);

writeln('Введите ',n,' элементов:'); for i:=1 to n do read(a[i]);

(* Вывод массива *)

writeln('Вы ввели массив из ',n,' элементов:'); for i:=1 to n do write(a[i],' ');

end.

(* При описании массива задается максимальный размер массива (количество элементов), данном случае 10. Но при работе с программой можно указать реальный фактический размер массива n, не превышающий максимальный размер 10 *)

Пример 2.

(* Сумма и произведение элементов одномерного массива *)

program summa_proizvedenie;

 

 

uses crt;

 

 

 

var i,

(* i - индекс элемента в массиве a

*)

n:integer;

(* n - количество элементов в массиве a

*)

pr,

(* pr - произведение элементов массива a *)

sum:integer; (* sum - сумма элементов массива a

*)

a:array[1..100] of integer;

(* a - массив *)

 

begin

 

 

 

clrscr;

 

 

 

(* Ввод массива *)

 

 

write('Введите количество элементов в массиве (не более 100): '); readln(n);

writeln('Введите ',n,' целых элементов:');

 

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

 

(* Определение суммы и произведения элементов массива *)

 

sum:=0;

(* Установка начального значения суммы sum=0

*)

pr:=1;

(* Установка начального значения произведения pr=1 *)

for i:=1 to n do begin

sum:=sum+a[i];

pr:=pr*a[i];

end;

(* Вывод суммы и произведения *) writeln('Сумма S=',sum,' Произведение P=',pr);

81

readkey;

end.

Пример 3.

(* Определение количества положительных элементов в массиве *)

program polozh_elem;

 

 

uses crt;

 

 

 

var i,

(* i - индекс элемента в массиве a

*)

n:integer; (* n - количество элементов в массиве a

*)

k:integer; (* k - количество положит. элементов в массиве a *)

a:array[1..100] of integer;

(* a - массив *)

 

begin

 

 

 

clrscr;

 

 

 

(* Ввод массива *)

 

 

write('Введите количество элементов в массиве (не более 100): '); readln(n);

writeln('Введите ',n,' целых элементов:'); for i:=1 to n do read(a[i]);

(* Определение количества положительных элементов массива *)

k:=0; (* Установка начального значения кол-ва положит. эл-тов k=0 *) for i:=1 to n do

if a[i]>0 then k:=k+1;

(* Вывод количества положительных элементов *) writeln('Количество положительных элементов равно ',k);

readkey;

 

 

 

end.

 

 

 

Пример 4.

 

 

(* Определение значений min и max элементов массива *)

 

program min_max;

 

 

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

(* а - исходный массив

*)

i,

(* индекс элемента в массиве a

*)

n:integer;

(* количество элементов в массиве a

*)

max,

(* значение максимального элемента в массиве a *)

min:integer; (* значение минимального элемента в массиве a *) begin

(* Ввод массива *)

write('Введите количество элементов массива (не более 10): '); readln(n);

writeln('Введите ',n,' элементов:'); for i:=1 to n do read(a[i]);

(* Определение значений min и max элементов массива *)

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); writeln('Значение минимального элемента равно ',min); end.

Пример 5.

(* Определение максимального (минимального) значения среди элементов массива, удовлетворяющих определенному условию *)

82

(* Дан одномерный массив. Определить максимальное значение среди тех

элементов этого массива, которые кратны 3 *)

 

 

program Mini_Maxi;

 

 

var a:array[1..10] of integer;(* исходный массив *)

 

 

i,

(* индекс массива *)

 

 

n:integer;

(* кол-во элементов в массиве *)

 

 

max:integer;(* значение максимального элемента *)

 

f:boolean;

(* флаг *)

 

 

begin

 

 

 

 

writeln;

 

 

 

 

write('Введите кол-во элементов массива:');

 

 

readln(n);

 

 

 

writeln('Введите ',n,' элементов:');

 

 

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

 

 

f:=true;

 

 

 

 

for i:=1 to n do

 

 

begin

 

 

 

 

if a[i] mod 3=0 then

 

 

if f then begin max:=a[i]; f:=false end

 

 

else if a[i]>max then max:=a[i];

 

 

end;

 

 

 

 

writeln('Значение максимального элемента, кратного 3, равно ',max);

 

end.

 

 

 

 

Пример 6.

 

(*

Определение значения максимального элемента массива и

 

номеров максимальных элементов в массиве

*)

(*

Пример.

 

 

 

 

Дано: массив А=(5,1,-1,5,4,5).

 

 

Получить: максимальное значение равно 5;

 

 

номера максимальных элементов: 1,4,6. *)

 

 

program lmax;

 

 

var a:array[1..100] of real; (* a - исходный массив

*)

 

k:array[1..100] of integer; (* k - получаемый массив номеров максим. элементов *)

 

dmax:real;

(* значение максимального элемента массива a *)

 

i:integer;

(* индекс массива a *)

 

 

l:integer;

(* индекс массива k *)

 

 

n:integer;

(* кол-во элементов массива a *)

 

 

j:integer;

(* кол-во элементов массива k *)

 

 

begin

 

 

 

(* Ввод массива *)

write('Введите кол-во элементов массива:'); readln(n);

writeln('Введите ',n,' элементов:'); for i:=1 to n do read(a[i]);

writeln;

writeln('Ваш массив из ',n,' элементов:'); for i:=1 to n do write(a[i],'');

writeln;

(* Определение максимального значения и номеров *)

dmax:=a[1];

(* Установка нач. dmax и нач. массива k *)

k[1]:=1;

 

j:=1;

 

l:=2;

 

for i:=2 to n do

(* Сравнение эл-тов массива a с dmax *)

83

begin

if a[i]>dmax then

begin (* Эл-т больше dmax - меняем dmax и массив k *) dmax:=a[i];

for l:=1 to j do k[l]:=0; j:=1;

l:=2;

k[1]:=i; end

else if a[i]=dmax then

begin (* Эл-т равен dmax - записываем номер в массив k *) k[l]:=i;

j:=j+1;

l:=l+1;

end;

end;

(* Вывод результатов *)

writeln('Значение максимального элемента равно ',dmax); write('Индексы максимальных элементов: ');

for l:=1 to j do write(k[l],' '); end.

(* Замечание. Возможны другие пути решения задачи. Например:

1)просмотреть весь массив и найти максимальное значение (см. пример 4);

2)просмотреть весь массив и распечатать номера элементов, которые имеют это максимальное значение.

При таком решении массив просматривается дважды, что не всегда желательно. *) Пример 7.

(* Перестановка со сдвигом назад (в конец массива) 2-х первых элементов *)

(* Дано: A=(a1,a2,...,an)

 

Получить: A=(a3,a4,...,an,a1,a2)

 

Например: A=(1,2,3,4,5) --> A=(3,4,5,1,2)

*)

program PerestanovkaNazad_1;

 

uses crt;

 

 

const n=10;

(* Размер массива *)

var a:array[1..10] of integer; (* Массив

*)

i,

(* Индекс массива *)

 

b,c:integer; (* Вспомогательные переменные для перестановки *)

begin

 

 

clrscr;

 

 

(* Ввод массива *)

writeln('Введите массив из 10 целых элементов: '); for i:=1 to n do read(a[i]);

(* Перестановка со сдвигом *)

b:=a[1];c:=a[2]; (* Запоминаем два первых эл-та *)

for i:=1 to n-2 do a[i]:=a[i+2]; (* Сдвигаем остальные (n-2)-элемента на 2 поз. вперед.

 

Сдвиг начинаем от начала массива

*)

a[n-1]:=b;a[n]:=c;

(* Восстанавливаем два первых эл-та в конце массива *)

(* Вывод преобразованного массива *) writeln('');

for i:=1 to n do write(a[i],' '); readkey;

end.

Пример 8.

(* Перестановка со сдвигом вперед (в начало массива) 2-х последних элементов *)

84

(* Дано: A=(a1,a2,...,an)

Получить: A=(an,a n-1,a1,a2,..,a n-2) Например: A=(1,2,3,4,5) --> A=(5,4,1,2,3) *)

program PerestanovkaVpered_1;

 

uses crt;

 

 

const n=10;

(* Размер массива *)

var a:array[1..10] of integer; (* Массив

*)

i,

(* Индекс массива *)

 

b,c:integer; (* Вспомогательные переменные для перестановки *) begin

clrscr;

(* Ввод массива *)

writeln('Введите массив из 10 целых элементов: '); for i:=1 to n do read(a[i]);

(* Перестановка со сдвигом *)

b:=a[n];c:=a[n-1]; (* Запоминаем два последних эл-та *)

for i:=n-2 downto 1 do a[i+2]:=a[i]; (* Сдвигаем остальные (n-2)-элемента на две поз.

 

назад. Сдвиг начинаем от конца массива

*)

a[1]:=b;a[2]:=c;

(* Восстанавливаем два последних эл-та в начале массива*)

(* Вывод преобразованного массива *) writeln('');

for i:=1 to n do write(a[i],' '); readkey;

end.

Пример 9.

(* Перестановка со сдвигом назад (в конец массива) k-первых элементов *) (* Например: A=(1,2,3,4,5,6,7), k=3 --> A=(4,5,6,7,1,2,3) *)

(* Алгоритм: будем последовательно k-раз в цикле переставлять по одному элементу назад

(в конец массива)

*)

program PerestanovkaNazad_2;

 

uses crt;

 

 

const n=10;

(* Размер массива

*)

var a:array[1..10] of integer; (* Массив

*)

i,

(* Индекс массива

*)

j,

(* Счетчик по количеству перестановок *)

b,

(* Вспомогат. перем. для перестановки *)

k:integer; (* Количество перестановок

*)

begin

 

 

clrscr;

(* Ввод массива и количества перестановок *) writeln('Введите массив из 10 целых элементов: '); for i:=1 to n do read(a[i]);

writeln('Введите количество переставляемых элементов: '); readln(k);

(* Перестановки со сдвигом *) for j:=1 to k do

begin b:=a[1];

for i:=1 to n-1 do a[i]:=a[i+1]; a[n]:=b;

end;

(* Вывод преобразованного массива *) for i:=1 to n do write(a[i],' ');

85

readkey;

end.

Пример 10.

(* Перестановка со сдвигом вперед (в начало массива) k-последних элементов *)

(* Например: A=(1,2,3,4,5,6,7), k=3 --> A=(5,6,7,1,2,3,4)

*)

(* Алгоритм: будем последовательно k-раз в цикле переставлять

 

по одному элементу вперед (в начало массива)

*)

program PerestanovkaVpered_2;

 

uses crt;

 

 

const n=10;

(* Размер массива *)

 

var a:array[1..10] of integer; (* Массив

*)

i,

(* Индекс массива

*)

j,

(* Счетчик по количеству перестановок *)

b,

(* Вспомогат. перем. для перестановки *)

k:integer; (* Количество перестановок

*)

begin

 

 

clrscr;

 

 

(* Ввод массива и количества перестановок *)

writeln('Введите массив из 10 целых элементов: '); for i:=1 to n do read(a[i]);

writeln('Введите количество переставляемых элементов: '); readln(k);

(* Перестановки со сдвигом *) for j:=1 to k do

begin b:=a[n];

for i:=n-1 downto 1 do a[i+1]:=a[i]; a[1]:=b;

end;

(* Вывод преобразованного массива *) for i:=1 to n do write(a[i],' ');

readkey;

end.

Пример 11.

(* Зеркальное отображение массива относительно центральной позиции *)

(* Например: 1)

A=(1,2,3,4,5,6,7)

-->

A=(7,6,5,4,3,2,1)

*)

(*

2)

A=(1,2,3,4,5,6)

--> A=(6,5,4,3,2,1)

*)

program Otobrazhenie;

 

 

 

uses crt;

 

 

 

 

 

const n=10;

(* Размер массива *)

 

var a:array[1..10] of integer; (* Массив

*)

 

i,

(* Индекс массива

 

*)

 

b:integer; (* Вспомогат. перем. для перестановки *) begin

clrscr;

(* Ввод массива *)

writeln('Введите массив из 10 целых элементов: '); for i:=1 to n do read(a[i]);

(* Перестановки элементов *) for i:=1 to n div 2 do

begin b:=a[i];

a[i]:=a[n-i+1]; a[n-i+1]:=b;

86

end;

 

(* Вывод преобразованного массива *)

 

for i:=1 to n do write(a[i],' ');

 

readkey;

 

end.

 

Пример 12.

 

(* Пример работы с одномерным массивом литер

*)

(* Дано натуральное число n и последовательность символов

a[1],a[2],...a[n] (массив

литер). Построить новую последовательность символов, заменив в исходной каждую точку многоточием, то есть тремя точками. Исходную и полученную

последовательности распечатать.

*)

program posl (i,o);

 

 

var a:array [1..80] of char;

(* исходная последовательность *)

b:array [1..240] of char;

(* новая последовательность

*)

i:integer;

(* индекс массива a *)

 

j:integer;

(* индекс массива b *)

 

n:integer;

(* количество элементов исходного массива a *)

begin

 

 

 

(* Ввод исходного массива a

*)

 

write(' Введите n: ');

 

 

readln(n);

 

 

 

writeln(' Введите ',n,' знаков '); for i:=1 to n do read (a[i]);

(* Построение нового массива в *) j:=1;

for i:=1 to n do begin

b[j]:=a[i]; j:=j+1; if a[i]='.' then

begin b[j]:='.'; b[j+1]:='.'; j:=j+2;

end

end;

(* Вывод исходного и полученого массивов *) writeln ('Исходная последовательность'); for i:=1 to n do

write (a[i]); writeln;

writeln (' Результирующая последовательность'); for i:=1 to j-1 do

write (b[i]);

end.

Пример 13.

(* Пример работы с одномерным массивом *)

(* Дан текст в виде строки символов (предполагается, что все буквы прописные, то есть "большие"). Определить, сколько раз в этой строке встречаются различные буквы английского алфавита.

Например, в строке "ARRAY" из 5 символов встречаются: буква A - 2 раза,

буква R - 2 раза,

буква Y - 1 раз, ост. буквы - 0 раз.

87

Дано: N: integer

- длина исходной строки,

 

 

T: array [1..N] of CHAR - исходный текст.

 

 

Результат: C:array ['A'..'Z'] of integer - счетчик количества букв, то есть

 

C['A']= <кол-во букв 'A'>, C['B']= <кол-во букв 'B'>,...

*)

PROGRAM PR8 (I,O);

 

 

USES CRT;

 

 

 

CONST N=10;

(* Длина строки

*)

 

VAR T: array [1..N] of char; (* Исходный текст

*)

 

C: array ['A'..'Z'] of integer; (* Счетчик кол-ва букв *)

 

I: integer;

(* Индекс элементов массива Т *)

 

 

CH: char;

(* Индекс элементов массива C *)

 

 

BEGIN

 

 

 

clrscr;

 

 

 

FOR CH:='A' to 'Z' DO C[CH]:=0; (* очистка счетчика *) FOR I:=1 TO N DO

BEGIN

WRITELN (' ВВЕДИТЕ: СИМВОЛ и < ВК>'); READLN (T[I]);

IF (T[I]>='A') and (T[I]<='Z') then C[T[i]]:=C[T[I]]+1;

END;

clrscr;

WRITELN ('ИСХОДНАЯ СТРОКА A:'); FOR I:=1 TO N DO WRITE (T[I]); WRITELN;

WRITELN ('КОЛИЧЕСТВО БУКВ:'); FOR CH:='A' to 'M' DO

WRITELN (CH:5, C[CH]);

WRITELN('ДЛЯ ПРОДОЛЖЕНИЯ РАБОТЫ НАЖМИТЕ ЛЮБУЮ КЛАВИШУ'); readln;

FOR CH:='N' to 'Z' DO WRITELN (CH:5, C[CH]);

END.

Пример 14.

(* Сортировка (упорядочивание) одномерного массива методом пузырька *) (* Задан массив, содержащий не более 100 элементов. Упорядочить массив по

возрастанию элементов. Математическая постановка задачи.

Дано: массив А из n- элементов, то есть A=(a[1],a[2],...a[n]). Представить его в таком виде, чтобы a[1]<=a[2]<=a[3]<=...<= a[n].

Математический метод решения задачи.

Для упорядочения массива по возрастанию элементов будем использовать метод "пузырька".

Суть метода.

Вначале рассмотрим метод на примере: n = 5, A=(32861).

1 просмотр - просматриваем последовательность 32861, сравнивая слева направо два соседних элемента и переставляя их, если надо:

1 сравнение:

32861

--->

23861

2 сравнение:

23861

 

 

3 сравнение:

23861

--->

23681

4 сравнение:

23681

--->

23618

Наибольший элемент 8 "всплыл" в конце последовательности. 2 просмотр - просматриваем последовательность 2361, сравнивая слева

направо два соседних элемента и переставляя их, если надо:

88

1

сравнение:

2361

 

 

 

2

сравнение: 2361

 

 

 

3

сравнение:

2361

--->

2316

 

Наибольший элемент 6 "всплыл" в конце последовательности.

3 просмотр - просматриваем последовательность 231, сравнивая слева

направо два соседних элемента и переставляя их, если надо:

1

сравнение:

231

 

 

 

2

сравнение:

231

--->

213

 

Наибольший элемент 3 "всплыл" в конце последовательности.

4 просмотр - просматриваем последовательность 21, сравнивая слева

направо два соседних элемента и переставляя их, если надо:

1

сравнение:

21

--->

12

 

Наибольший элемент 2 "всплыл" в конце последовательности.

Итак, для последовательности из

n

элементов число просмотров равно (n-1). В

каждом к-ом просмотре производится

(n-к) сравнений первых элементов. В результате

каждого просмотра в конце текущей просматриваемой последовательности "всплывает" наибольший элемент.

Ниже дано подробное словесное описание полученного алгоритма.

1 просмотр. Последовательность из n элементов просматривается слева направо. Каждые 2 соседних элемента a[i] и a[i+1] сравниваются (то есть 1-ый и 2-ой, 2-ой и 3-ий и т.д.) и, если a[i] > a[i+1], то эти элементы переставляются. В результате наибольший элемент "всплывает" в конце рассматриваемой последовательности из n элементов.

2 просмотр. Последовательность из (n-1) первых элементов просматривается слева направо. Каждые 2 соседних элемента a[i] и a[i+1] сравниваются (то есть 1-ый и

2-ой,

2-ой и 3-ий и т.д.) и, если a[i] > a[i+1], то эти элементы переставляются. В

результате наибольший элемент "всплывает"

в

конце

рассматриваемой

последовательности из (n-1) элементов.

 

 

 

....

 

 

 

 

 

(n-1)ый просмотр. Последовательность из n-(n-2)=2,

то

есть

из 2-х элементов

просматривается слева направо....

 

 

*)

PROGRAM UP (I,O);

 

 

 

VAR

a:array[1..100] of real; (* Массив

*)

 

n:integer;

(* Количество элементов в массиве *)

 

i,

(* i - количество сравнений в каждом просмотре *)

 

k:integer; (* к - номер просмотра

 

*)

 

c:real;

(* Вспомогат. переменная для перестановки 2-х элементов *)

begin

 

 

 

 

 

(* Ввод массива *)

write ( 'Введите количество элементов n = '); readln (n);

writeln ('Введите ',n,' элементов' );

writeln ('После набора очередного элемента нажмите <вк>' ); for i:=1 to n do readln(a[i]);

(* Сортировка массива *) for k:=1 to n-1 do

for i:=1 to n-k do

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

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

(* Вывод массива после сортировки *) writeln (' номер и элемент' );

89

for i:=1 to n do writeln(' ',i,' ',a[i]) end.

Пример 15.

(* Работа с целыми числами: выделить отдельные цифры целого положительного числа n.

Ниже дан фрагмент программы.

 

 

 

*)

...

 

 

 

 

 

 

 

var n,

(* n - исходное число

 

*)

 

i:integer; (* i - индекс в массиве с

 

*)

 

c:array[1..5] of integer; (* массив из цифр числа n *)

 

...

 

 

 

 

 

 

 

begin

 

 

 

 

 

 

 

readln(n);

(* Ввод исходного числа n

*)

 

i:=1;

 

 

 

 

 

 

 

repeat

 

 

 

 

 

 

 

c[i]:=n mod 10; (* Выделение последней младшей цифры *)

 

n:=n div 10; (* "Отбрасывание" выделенной цифры; например,

 

i:=i+1;

было n=125, стало n=12

*)

 

 

 

 

 

 

 

until n=0;

 

 

 

 

 

 

...

 

 

 

 

 

 

 

(* При выходе из цикла имеем:

 

 

 

 

c[1]

- младшая цифра исходного числа,

 

 

...

 

 

 

 

 

 

 

c[i-1] - старшая цифра исходного числа,

 

 

(i-1)

- количество цифр в числе

 

*)

 

Пример 16.

 

 

 

 

 

 

(* Работа с полиномом *)

 

 

 

 

 

(* Для задания полинома (многочлена)

 

 

 

Pn(x) = c[0]+c[1]* x1 +c[2]* x2 +...+c[n]* xn

 

 

достаточно указать его степень n

и массив коэффициентов (c[0],c[1],...c[n]).

 

Задание

 

 

 

+...+a[n]* xn .

 

Дан полином Pn(x) = a[0]+a[1]* x1

+a[2]* x2

2

Получить другой полином, сделав в исходном замену переменной x

на t .

 

Обозначения

+a[2]* x2 +...+a[n]* xn , а именно:

 

Дано: Pn(x) = a[0]+a[1]* x1

 

n - степень полинома, целое положительное число;

 

a[0],a[1],...a[n] - коэффициенты полинома, произвольные числа, причем

 

 

старший коэффициент

a[n] не равен 0.

 

Получить: Sm(t) = b[0]+b[1]* t1 +b[2]* t2

+...+b[m]* t m , а именно:

 

m - степень полинома;

 

 

 

 

b[0],b[1],...b[m] - коэффициенты полинома.

 

 

Математическая постановка

 

 

 

Sm(t)=Pn(t ) = a[0]+a[1]* t2

+a[2]* t 4 +...+a[n]* t 2n .

 

Итак: 1) степень:

m=2*n;

 

 

 

 

 

2) коэффициенты:

 

 

 

 

 

 

b[0]=a[0]

b[1]=0

 

 

 

 

b[2]=a[1]

b[3]=0

 

 

 

 

b[4]=a[2]

b[5]=0

 

 

 

 

. . . . . . . . .

 

 

 

 

 

b[m-1]=0

b[m]=a[n]

Это значит, что коэффициенты нового полинома при нечетных индексах (i=1,3,5...)

равны 0, а при четных индексах (i=0,2,4...) b[i]=a[i div 2].

90

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