Контрольная работа №2 1. Диаметр колеса автомобиля D см. Колесо потребует замены через T оборотов. Написать программу для того, чтобы определить, сколько раз потребуется сменить колесо при движении от г.Краснодара до г.N, если расстояние между ними X километров. Формат входных данных Файл содержит три числа D, T и X, разделенных пробелами. Формат выходных данных Выходной файл содержит количество замен колеса. Пример входных и выходных файлов Task01.in 80 200000 1500 80 150000 500 70 150000 700 Task01.out 2 1 2 program Task01; var D, X, T, Otvet: integer; FileIn, FileOut: text; begin Assign(FileIn, 'Task01.in'); Assign(FileOut,'Task01.out'); ReSet(FileIn); ReWrite (FileOut); Read(FileIn, D); Read(FileIn, T); Read(FileIn, X); otvet:=trunc((X*1000.0)/((pi*D)/100.0)) div T; writeln(FileOut, otvet); Close(FileIn); Close(FileOut); end. 2. Дано четырехзначное целое положительное число. После удаления первой цифры это число уменьшилось в N раз. Вывести в порядке убывания все такие числа. Формат входных данных Файл содержит число N. Формат выходных данных Выходной файл содержит в отдельной строке такие числа. Пример входных и выходных файлов Task1.in 5 4 6 9 program Task14; var S, SR:String; с: Char; FileIn, FileOut: Text; procedure Solve(N: Integer); Task1.out 3750 2500 1250 4800 3600 2400 1200 7875 6750 5625 4500 3375 2250 1125 Var a, b, c, d, R1, R2: integer; Begin For a:=9 downto 1 do For b:=9 downto 0 do For c:=9 downto 0 do For d:=9 downto 0 do Begin R1:= (b*10+c)*10+d; R2:= ((a*10+b)*10+c)*10+d; If R1*N = R2 Then WriteLn(FileOut, R2); R:=R+1; End; end; Begin Assign(FileIn, 'Task14.in'); Assign(FileOut,'Task14.out'); ReSet(FileIn); ReWrite(FileOut); ReadLn(FileIn, N); Solve(N); Close(FileOut); Close(FileIn); End. 3. 5 Сколько вариантов имеется у учеников для того, стать в шеренгу из N человек? Формат входных данных Строка входного файла содержит число N — количество учеников. (1 N 150). Формат выходных данных Выходной файл содержит количество вариантов расстановки. Пример входных и выходных файлов Task2.in 10 1 10 17 53 111 150 Task2.out 3628800 1 3628800 355687428096000 4274883284060025564298013753389399649690343788366813724672000000 000000 1762952551090244663872161047107075788761409536026565516041574063 3473469550872483164365555745984623157731960476628379789131458474 97199871623320096254145331200000000000000000000000000 5713383956445854590478932865261054003189553578601126418254837583 3179829124845398393126574488675311145377107878746854204162666250 1986845044663559491959220665749425920957357789293253572904449624 7240541679072211844543712226967552000000000000000000000000000000 0000000 Необходимо реализовать «длинный» N! program Task14; var FileIn, FileOut: Text; procedure Solve(N, K: Integer; Var R: Integer); begin end; Begin Assign(FileIn, 'Task14.in'); Assign(FileOut,'Task14.out'); ReSet(FileIn); ReWrite(FileOut); ReadLn(FileIn, N, K); Solve(N, K, R); WriteLn(FileOut, R); Close(FileOut); Close(FileIn); End. 4. 6 Дана строка символов. Найти все входящие в нее символы. Для заданной строки определить все входящие в неё символы. Формат входных данных Входной файл содержит строку символов. Формат выходных данных Все символы через «,», которые входят в строку по одному разу. Пример входного и выходного файла Task13.in abccbbbabba 1 2 3 Task13.out a,b,c,d ,1,2,3 program Task13; type SetSimb=Set Of Char; var S:String; с: Char; FileIn, FileOut: Text; procedure Solve(S: String); begin end; Begin Assign(FileIn, 'Task13.in'); Assign(FileOut,'Task13.out'); ReSet(FileIn); ReWrite(FileOut); ReadLn(FileIn, S); Solve(S); Close(FileOut); Close(FileIn); End. 5. 8 Вывести в порядке возрастания все простые несократимые дроби из интервала (0, 1), знаменатели которых не превосходят заданного P9. В последней строке вывести количество таких дробей. Формат входных данных Файл содержит число P. Формат выходных данных Каждая строка выходного файла содержит несократимую дробь. Последняя строка содержит количество таких дробей. Примеры входных и выходных файлов Task12.in 3 4 Task12.out 1/3 1/2 2/3 3 1/4 1/3 1/2 2/3 3/4 5 Task12.in 5 9 Program Task12; Var FileIn, FileOut: Text; Procedure Solve_T1; Var m, n, m1, n1, a, b, k,p: Integer; Begin ReadLn(FileIn, p); k:=0; m:=0; n:=1; Repeat If m>0 Then Begin Writeln(FileOut, m,'/',n); Inc(k); End; m1:=1; n1:=1; For b:=2 to p Do Begin a:=m*b div n + 1; if a*n1 < b*m1 Then begin m1:=a; n1:=b; End; End; m:=m1; n:=n1; Until m >= n; Writeln(FileOut, k); End { Solve_T1 }; Task12.out 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 9 1/9 1/8 1/7 1/6 1/5 2/9 1/4 2/7 1/3 3/8 2/5 3/7 4/9 1/2 5/9 4/7 3/5 5/8 2/3 5/7 3/4 7/9 4/5 5/6 6/7 7/8 8/9 27 Begin Assign(FileIn, Assign(FileOut, ReSet(FileIn); Solve_T1; Close(FileIn); End. 'Task12.in'); 'Task12.out'); ReWrite(FileOut); Close(FileOut); 6. 10 Фишка может двигаться только вперед по полю длины N. Длина хода фишки не более K. Найти число различных вариантов ходов, при которых фишка может пройти поле от начала до конца. Например, при N=3, K=2 — возможные пути: (1,1,1), (1,2), (2,1), т.е. возможны 3 варианта. Формат входных данных Файл содержит два числа N и K, разделенных пробелами. 1 N 15, 1 K 15, K N Формат выходных данных Выходной файл содержит число вариантов. Пример входных и выходных файлов Task2.in 3 2 15 15 1 1 15 10 15 1 13 7 10 8 Task2.out 3 16384 1 16336 1 3984 509 program Task14; var S, SR:String; с: Char; FileIn, FileOut: Text; procedure Solve(N, K: Integer; Var R: Integer); begin end; Begin Assign(FileIn, 'Task14.in'); Assign(FileOut,'Task14.out'); ReSet(FileIn); ReWrite(FileOut); ReadLn(FileIn, N, K); Solve(N, K, R); WriteLn(FileOut, R); Close(FileOut); Close(FileIn); End. 7. 12 Заданы две упорядоченные по значениям своих элементов целочисленные таблицы A[1..M] и B[1..N] (M≤50, N≤50). Составить программу создания упорядоченной таблицы C[1..M+N] слиянием таблиц A и B. Формат входных данных Первая строка входного файла содержит числа M и N — количество элементов таблиц A и B. Вторая строка содержит M значений элементов таблицы A. Третья строка— N значений элементов таблицы B. Формат выходных данных Строка, содержащая упорядоченные значения таблицы C, разделенных пробелами. Примеры входных и выходных файлов Task017.in 3 5 2 4 6 1 3 5 7 9 Task017.out 1 2 3 4 5 6 7 9 Program Task17; Const KMax=50; Type TArrAB= Array[1..KMax] Of Integer; TArrC= Array[1..2*KMax] Of Integer; Var M, N: Integer; FileIn, FileOut: Text; A, B: TArrAB; C: TArrC; procedure In_mass; var i: integer; begin read(FileIn,M); Readln(FileIn,N); for i:=1 to M do read(FileIn,a[i]); readln(FileIn); for i:=1 to N do read(FileIn,b[i]); readln(FileIn); end; procedure Out_mass; var i: integer; begin for i:=1 to M+N do write(FileOut,c[i]:4); writeln(FileOut); end; { Процедура слияния двух упорядоченных массивов } Procedure Solve(M, N: Integer; A, B: TArrAB; Var C: TArrC); Var i, j, k: Integer; Begin i:=1; j:=1; For k:=1 To M+N Do Begin If ((i>M) or (A[i]>B[j])) and (j<=N) Then Begin C[k]:=B[j]; j:=j+1; End Else Begin C[k]:=A[i]; i:=i+1; End; End; End { Solve }; begin Assign(FileIn, 'Task17.in'); Assign(FileOut, 'Task17.out'); ReSet(FileIn); ReWrite(FileOut); In_mass; Solve(M,N,A,B,C); Out_mass; close(FileIn);close(FileOut); end. 8. 15 Задана квадратная таблица A, содержащая N строк и N колонок (N≤10). Составить программу формирования одномерной таблицы B длины (2*N – 1), элементы которой — минимумы элементов диагоналей, параллельных главной диагонали (см. рисунок). Формировать таблицу B начинать с левого нижнего угла таблицы A. Формат входных данных Первая строка входного файла содержит число N — количество строк и колонок таблицы. Следующие N строк содержат по N значений элементов таблицы, разделяемых пробелами. Формат выходных данных Одна строка, содержащая (2*N – 1) элементов таблицы B. Примеры входных и выходных файлов Task16.in 5 6 5 4 2 1 7 1 2 3 4 5 6 7 7 6 5 3 3 8 6 5 4 4 9 7 7 6 5 9 8 8 7 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 Task16.out 1 2 3 4 5 6 7 8 9 7 6 5 4 3 2 1 1 1 1 1 1 1 1 2 3 4 5 6 7 1 2 3 4 5 6 7 Program Task16; const N_max=10; N_mas=-9; Type Index=1..N_max; TXY_Arr = Array [index,index] Of Integer; T_Arr= Array [N_mas..-N_mas] of integer; Var N: integer; A: TXY_Arr; B: T_Arr; FileIn, FileOut: Text; { Ввод значений из файла } Procedure InpMass_F (var A: TXY_Arr); Var i,j: Index; Begin ReadLn(FileIn, N); for i:= 1 to N do begin for j:=1 to N do read(FileIn,a[i,j]); readln(FileIn); end; End { InpMass_F }; procedure Out_mass; var i: integer; begin for i:=n-1 downto -n+1 do write(FileOut,b[i] :4); end; {вывод итогового массива} procedure Add_B; {Массив из диагональных элементов, псевдо Min} var h,g,i: integer; begin h:=1; g:=n+1; for i:= -n+1 to n-1 do begin if i<=0 then begin dec(g); b[i]:=a[h,g]; end else begin inc(h); b[i]:=a[h,g]; end; end; end; procedure Main_Proc; var i,j: integer; begin for i:=1 to N do for j:=1 to N do if B[i-j]>A[i,j] then B[i-j]:=A[i,j]; out_mass; end; begin Assign(FileIn, 'Task16.in'); Assign(FileOut, 'Task16.out'); ReSet(FileIn); ReWrite(FileOut); InpMass_F(A); ADD_B; Main_Proc; Close(FileIn); End. { Ввод значений из файла } { Заполнение массива из первых диагональных элементов матрицы } { Нахождение Min на диагонали } Close(FileOut); 9. 17 Написать программу подсчета количества одно-, двух-, трёх- и четырехпалубных кораблей, расположенных на поле для игры «Морской бой». Корабли не могут быть изогнутыми и друг с другом не соприкасаются. Поле для игры задается в виде таблицы NN, каждый элемент которой равен либо 0, если клетка свободна, либо 1, если занята. Формат входных данных Первая строка входного файла содержит число N — количество строк и колонок таблицы. Следующие N строк содержат по N значений элементов таблицы, разделенных пробелами. Формат выходных данных Одна строка, содержащая 4 числа — количество одно-, двух-, трёх- и четырехпалубных кораблей. Пример входного и выходного файла Task26.in 5 1 1 0 0 1 0 0 0 1 0 10 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 8 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 Task26.out 2 1 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 6 4 3 3 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 8 0 0 4 Program Task26; Const N_MAX=50; Type Index = 1..N_MAX; TX_Arr = Array [Index,Index] Of Integer; Var k1,k2,k3,k4,n,i,j: Integer; x: TX_Arr; FileIn, FileOut: Text; Procedure InpMass_F (var x: TX_Arr;var n:integer); Var i,j:integer; Begin readln(filein, n); For i:=1 to n do For j:=1 to n do Read(FileIn, x[i,j]); End; Procedure Solve(var k1,k2,k3,k4: Integer; x:TX_Arr); Var z,i,j,k,k_0,k_1:integer; Begin For i:=1 to n do begin z:=0; For j:=1 to n do Begin If x[i,j]=1 then begin inc(z); If j=n then begin k_0:=0; k_1:=z-1; End Else Begin k_0:=1; k_1:=z; End; Case z of 2: inc(k2); 3: inc(k3); 4: inc(k4); End; For k:=k_0 to k_1 do x[i,j-k]:=0; z:=0; End; End; End; For j:=1 to n do begin z:=0; For i:=1 to n do If (x[i,j]=1) then begin inc(z); If i<n then z:=0; Case z of 1: inc(k1); 2: inc(k2); 3: inc(k3); 4: inc(k4); End; End; End; Begin Assign(FileIn, 'Task26.in'); Assign(FileOut, 'Task26.out'); ReSet(FileIn); ReWrite(FileOut); InpMass_F(x,n); k1:=0; k2:=0; k3:=0; k4:=0; Solve(k1,k2,k3,k4,x); write(fileout,k1,' ',k2,' ',k3,' ',k4); Close(FileIn); Close(FileOut); End. 1 2 3 4 5 6 7 10. 19 На квадратном клетчатом листе бумаги NN клеток 1 заштрихована часть клеток. Написать программу, которая 2 определяет прямоугольник максимальной площади, не 3 содержащий заштрихованных клеток. Предполагается, что такой 4 прямоугольник единственный. В качестве ответа вывести площадь прямоугольника и координаты его двух противоположных вершин 5 (левой верхней и правой нижней). Для приведенного примера: 6 7 площадь 12, координаты вершин (3,2) и (6,4). Формат входных данных Первая строка файла содержит число N — количество строк и колонок таблицы (2 N 10). Следующие N строк содержат по N значений элементов таблицы, разделенных пробелами (1 — заштрихованная клетка, 0 — нет). Формат выходных данных Первая строка выходного файла содержит значение максимальной площади. Две следующие строки — координаты левой верхней и правой нижней клеток такого прямоугольника, разделенных пробелами. Пример входных и выходных файлов Task3.in 7 0 1 0 1 1 0 0 0 1 0 0 0 0 1 10 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 Task3.out 12 3 2 6 4 1 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 18 2 4 10 5 Представим лист бумаги в виде числовой матрицы А(NxN). Обозначим заштрихованные клетки единицами, а чистые - нулями. Напишем подпрограмму, которая проверяет, есть ли в прямоугольнике с координатами левой верхней вершины (i1,j1) и координатами правой нижней вершины (i2,j2) заштрихованные клетки (т.е. элементы, равные 1). function prov(a:matr;i1,j1,i2,j2:integer):boolean; var i,j:integer; begin prov:=true; for i:=i1 to i2 do for j:=j1 to j2 do if a[i,j]=1 then prov:=false; end; Эта функция будет возвращать значение "истина" (true), если заштрихованных клеток в рассматриваемом прямоугольнике нет, и "ложно" (false) - в противном случае. В основной программе организуем два вложенных цикла: в первом цикле будут изменяться координаты верхнего левого угла рассматриваемого прямоугольника, во втором - координаты нижнего правого угла. Если в прямоугольнике нет заштрихованных точек, то вычислим его площадь, и если она является максимальной, запомним её и координаты противоположных вершин этого прямоугольника. Часть основной программы, реализующая данный алгоритм, будет иметь следующий вид: maxs:=0; for i1:=1 to n do for j1:=1 to n do for i2:=i1 to n do for j2:=j1 to n do begin s:=(i2-i1+1)*(j2-j1+1); if prov(a,i1,j1,i2,j2)and(maxs<s) then begin maxs:=s; maxi1:=i1; maxj1:=j1; maxi2:=i2; maxj2:=j2; end; end; writeln(' s=',maxs); writeln('(',maxi1,',',maxj1,')', '(',maxi2,',',maxj2,')'); Здесь maxs - площадь полученного прямоугольника, (maxi1, maxj1) - координаты его левой верхней вершины, (maxi2, maxj2) - координаты его правой нижней вершины.