Типовые программы работы с
целыми числами и массивами
В этом разделе приведены несколько
типовых программ, самостоятельный и
внимательный анализ которых позволит
понять некоторые понятия использования
операторов и структур. Необходимые
комментарии приведены в текстах программ.
Первая программа отображает
последовательность и методы решения задач,
связанных с обработкой целочисленных
данных. Изучив эту программу, можно понять и
логику, и методику решения задач
соответствующего класса. Приведенные
примеры не следует рассматривать как
образцы решения задач, это всего лишь один
из возможных вариантов решения.
Практическая реализация тех или иных задач
- индивидуальная работа каждого студента и
она может быть значительно эффективней
приведенных примеров.
Program Rablnt; {Работа с целыми числами} Uses Crt; Type aa = Array[1..100] Of Integer;
{Описаны одномерные и двумерные массивы}
bb = Array[1..100, 1..2]Of Integer; Label 10,20,30,40,50,60,70,80,90; Var p: aa;
pp: bb;
t,n,k,a,b : Longlnt;
s,i,j : Byte;
Procedure ProsDel(Var t,n: Longlnt);
{Является ли число t простым?) Var i : Byte; Begin n:=0; For i:=2 to t Div 2 Do If t
Mod i=0 Then n:=n+1; If n=0 Then WriteLn(t:10,'Простое
число'); End;
Begin ClrScr; Randomize; WriteLn('Варианты работы:'); WriteLn('1-Ввод числа и поиск его
перевертыша'); WriteLn('2-Нахождение цифр числа и
работы с ними '); WriteLn('3-Поиск характеристик чисел в
интервале'); Write('Выберите номер варианта '); ReadLn(s); If s=3 Then Goto 30; If s=1 Then Goto 10 Else Goto
20;
10: WriteLn('Число вводится (1) или
определяется как случайное (2)?'); ReadLn(s); If s =2 Then Begin Write('Целочисленная база'); ReadLn(t);
n:=Random(t); End Else Begin Write('Введите число'); ReadLn(n); End;
a:=n; WriteLn; WriteLn('Введенное число',n); b:=0;
WriteLn; While a<>0 Do Begin WriteLn( a Mod 10 ); b:=b*10+a Mod 10; a:=a Div 10; End; ReadLn; WriteLn; WriteLn('Перевертыш',b); ReadLn;
Goto60;
20: Write('Введите целое число ');ReadLn(t);
n:=0; While t<>0 Do Begin
n:=n+1;P[n]:=t Mod 10; t:=t Div 10; WriteLn(n:5,P[n]:5); End; WriteLn; WriteLn('Количество цифр в
числе ',n); ReadLn; WriteLn('Дальнейшая работа с цифрами
:'); WriteLn('1-Выстроить их по убыванию'); WriteLn('2-Найти одинаковые цифры'); WriteLn('3-Построить из цифр
наибольшее число'); ReadLn(s); If (s=1) Or (s=3) Then Goto 70 Else
Goto 80;
70: For i:=1 to n-1 Do For j:=i+1
To n Do Begin
If P[i]<=P[j] Then Begin
a:=P[i]; P[i]:=P[j]; P[j]:=a; End; End; WriteLn('Отсортированные данные');a:=0; For i:=1 to n Do Begin
a:=a*10+P[i]; WriteLn('N цифры',i,'',P[i]); End; WriteLn; If s=3 Then WriteLn('Наибольшее
число',a); ReadLn; Goto 60;
80:
k:=0; WriteLn('Поиск одинаковых цифр'); For i:=1 to n-1 Do For j:=i+1
to n Do If P[i]=P[j] Then Begin WriteLn('Цифра',P[i]',на',i',u',j',местах');
k:=k+1; End; If k=0 Then WriteLn('Во введенном
числе нет одинаковых цифр'); ReadLn; Goto 60;
30: Write('Введите через пробел границы
интервала'); ReadLn(a,b);
k:=0; WriteLn('Вариант работы:'); WriteLn('1-Собрать в массив Р все
простые числа'); WriteLn('2-Записать в массиве РР числа
и количество их делителей'); ReadLn(s); If s=1 Then Goto 40 Else Goto
50;
40: For t:=a to b Do Begin ProsDel(t,n); If n=0 Then Begin
k:=k+1; P[k]:=t; End; End; WriteLn; WriteLn('В интервале',a:5,'-',b:5,",k:5,'простых
чисел'); ReadLn; Goto 60;
50; For t:=a to b Do Begin ProsDel(t,n); If n<>0 Then Begin
k:=k+1; PP[k,1]:=t; PP[k,2]:=n; WriteLn('Число',t:10,'Количество
делителей',n:5); End; End; ReadLn; WriteLn('Дальнейшая работа с
полученными данными :'); WriteLn('Выдать числа с количеством
делителей равных k'); WriteLn('k='); ReadLn(t); n:=0; For i:=1 to k Do Begin If PP[i,2]=t Then Begin
n:=n+1; WriteLn('Число',PP[i,1]:20,'количество
делителей',PP[i,2]); End; End; If n=0 Then WriteLn('Чисел с
количеством делителей ',t:5,'нет'); ReadLn;
60: End.
Вторая программа отображает
последовательность и особенности работы с
так называемыми ''Пифагоровыми тройками'',
то есть целыми числами a, b, c,
связанными условиями a2 + b2 =
c2.
Program Pifagor; {Работа с Пифагоровыми
тройками и сопутствующие задачи} Uses Crt; Type aa = Array[1..100,1..3]Of Integer; Var a,b,c,i,j,n,m : Integer;
v1,v2,v3 : Real;
P : aa;
Begin ClrScr;
{Простое определение и выдача на печать
Пифагоровых троек}
n:=0; Write('Определите границы '); ReadLn(a,b); If a>=b Then Begin Write('Границы интервала указаны не
верно.Повторите ввод'); ReadLn; End Else Begin For i:=2 to b Div 2 Do For j:=i+1 to b Do Begin
v1:=Sgrt(i*i+j*j); If v1=Int(v1) Then Begin Inc(n); WriteLn('n=',n:10,'i=',i:10,'j='j:10,'',Round(v1):10);
P[n,1]:=i; P[n,3]:=Round(v1); End; End; WriteLn; WriteLn('В интервале',a:10,'-',b:10,'выявлено',n:10,'троек'); WriteLn; End; ReadLn;
{Окончание 1-й части программы}
{Выявление некратных Пифагоровых троек}
For i:=1 to n-1 Do For j:=i+1
to n Do If(P[j,1] Mod P[i,1]=0) And(P[j,2]
Mod P[i,2]=0) And (P[j,1] Div P[i,1]=P[j,2] Div P[i,2]) Then
P[j,1]:=-1;
m:=0; WriteLn; WriteLn('Некратные Пифагоровы тройки');
WriteLn; For i:=1 to n Do If P[i,1]<>-1
Then Begin
m:=m+1; WriteLn('Некратная тройка N',m:5,P[i,1]:5,P[i,2]:5,P[i,3]:5); end; end; WriteLn; WriteLn('В интервале',a:5'',b:5,'некратных
троек',m:5); ReadLn; End.
Следующие программы описывают работу с
массивами, при этом первая из них
разработана как образец для решения
различных задач с одномерными массивами с
записью данных во внешний файл, имя
которого устанавливается пользователем
программы.
Program StrArray; Uses Crt; Type ff = Array[1..15]of Integer; Var Mas1,Mas2; ff;
gg : Text;
a,b : Longlnt;
c,d,f : Integer;
i,j,k,n : Byte;
name : String[10]; {Переменная для имени
файла}
Begin ClrScr; WriteLn('Имя файла для записи данных'); Read(name); Assign(gg,name); {Файл с именем name
объявлен} ReWrite(gg); {Файл с именем name,
привязанный к файловой переменной gg, открыт
для записи данных} Write('Число элементов массива'); ReadLn(n); Write('Заполнять массив с клавиатуры
(1) или случайными числами (2) ?'); ReadLn(k); Case k Of
1: For i:=1 to n Do Begin Write('Введите элемент N',i,' '); Read(Mas1[i]); End;
2: Begin Randomize; Write('Определите базу случайного
числа'); ReadLn(a); For i:=1 to n Do Mas1[i]:= Random(a); End; Else WriteLn('Такой вариант не
предусмотрен'); End; Write('Исходный массив'); WriteLn; Write(gg,'Исходный массив'); WriteLn; For i:=1 to n Do Begin Write(Mas1[i],' '); Write(gg,Mas1[i],' '); End; For i:=1 to n Do Begin Mas2[i]:=Mas1[i]
End; WriteLn; WriteLn('Пересортировать элементы
массива по убыванию'); For i:=1 to n-1 Do For j:=i+1
to n Do Begin If Mas2[j]>Mas2[i] Then Begin
a:=Mas2[j]; Mas2[j]:=Mas1[i]; Mas2[i]:=a; End; End; WriteLn; WriteLn(gg,' '); WriteLn('Пересортированный массив'); WriteLn(gg,'Пересортированный массив'); For i:=1 to n Do Begin WriteLn(Mas2[i],' '); Write(gg,Mas2[i],' '); End; WriteLn; WriteLn('Заменить элементы массива
суммой их делителей'); WriteLn(gg,'Замена элементов массива
суммой их делителей'); For i:=1 to n Do Mas1[i]:=Mas2[i]; For i:=1 to n Do Begin k:=0; For j:=2 to Mas1[i] Div 2 Do If
Mas1[i] Mod j = 0 Then k:=k+j; If k<>0 Then Mas1[i]:=k; End; WriteLn; For i:=1 to n Do Begin Write(Mas1[i],' '); Write(gg,Mas1[i],' '); End; ReadKey; End.
Следующая программа описывает возможные
варианты работы с двумерными массивами, при
этом некоторые из характеристик
записываются в одномерном массиве другого
типа. Показана взаимосвязь структур разных
типов.
Program MatArray; {Работа с двумерным
массивом} Uses Crt; Type su = Array[1..100,1..15] of
Integer;
sr = Array[1..100] of Real; Var a,b : Longlnt;
m,n : Integer;
i,j,k : Byte;
r : Real;
V : sr;
Mas1,Mas2 : su;
Begin
ClrScr; Randomize; Write('Размерности массива'); ReadLn(m,n); Write('База случайного числа'); ReadLn(a); For i:=1 to m Do For j:=1 ton
Do Mas1[i,j]:=Random(a); WriteLn('Исходный массив'); WriteLn; For i:=1 to m Do For j:=1 to
n Do If m<>n Then Write(Mas1[i,j]:6) Else
WriteLn(Mas1[j,i]:6); WriteLn('Переставить строки по
возрастанию среднего значения'); For i:=1 to m Do Begin V[i]:=0; For j:=1 to n Do V[i]:= V[i]+Mas1[i,j];
V[i]:=V[i]/n; End; For i:=1 to m-1 Do Forj:=1 to
m Do Begin If V[i]<V[j] Then Begin
r:=V[i]; V[i]:=V[j]; V[j]:=r; For k;=1 to n Do Begin
b:=Mas1[i,k]; Mas1[i,k]:=Mas1[i,k]; Mas1[j,k]:=b; End; End; End; For i:=1 to m Do Begin For j:=1 to n Do Write(Mas1[i,j]:6); WriteLn('Среднее',V[i]:7:2); end; ReadKey; End.