Каким образом игрушечные утки помогают
программистам в отладке кода?
Некоторые программисты используют для отладки кода метод утёнка. Для этого нужно поставить на рабочий стол игрушечную утку (или представить её) и подробно объяснять строка за строкой, что должна делать программа. Прибегая к этому методу, программист зачастую встречает искомую ошибку, которую не замечал при просмотре кода в среде разработки.
Источник: http://muzey-factov.ru/tag/computers
Задача 1. Прямоугольники. Шоколадную плитку сначала разломали N раз, затем каждую полученную часть разделили M раз. Определить общее количество полученных прямоугольников.
Входные данные: строка из двух чисел N>=0 и M<=2147483647, разделенных пробелом.
Выходные данные: одно число -количество прямоугольников.
Задача 2. Размен. Написать программу, которая бы для двух типов купюр по X и Y денежных единиц определяла бы, какую наибольшую сумму денег невозможно разменять этими купюрами, если X и Y - взаимно простые натуральные числа.
Входные данные: номиналы купюр - два взаимно простых натуральных числа.
Выходные данные: наибольшая сумма, которую нельзя разменять этими купюрами. Если можно разменять любую сумму - выводим 0
2. Фінансова піраміда
3. Перестановка
4. Велосипед
5. Сума дільників
8-9 клас
1. Среднее число (№108)
Входные
данные
Выходные
данные
3. Количество игрушек (№927)
end.
4. Сдвинь элементы (№ 922)
Входные
данные
Выходные
данные
5. Покупка цветов
(№ 891)
Входные данные
Выходные данные
1. Несчастливый автобус (№ 247)
end.
end.
2. Компакт-диски (№107)
Входные данные
Выходные данные
3. Лицензионное ПО (№ 255)
4. Кубики (№202)
5*. Решение
задач (№ 893)
Задача 1. Прямоугольники. Шоколадную плитку сначала разломали N раз, затем каждую полученную часть разделили M раз. Определить общее количество полученных прямоугольников.
Входные данные: строка из двух чисел N>=0 и M<=2147483647, разделенных пробелом.
Выходные данные: одно число -количество прямоугольников.
Задача 2. Размен. Написать программу, которая бы для двух типов купюр по X и Y денежных единиц определяла бы, какую наибольшую сумму денег невозможно разменять этими купюрами, если X и Y - взаимно простые натуральные числа.
Входные данные: номиналы купюр - два взаимно простых натуральных числа.
Выходные данные: наибольшая сумма, которую нельзя разменять этими купюрами. Если можно разменять любую сумму - выводим 0
2018-2019
Завдання для олімпіади з інформатики 2 туру (8-9 клас)
2018-2019
1. Дощ
Дощ вимірюється в міліметрах. Дощ збирають у вертикальній
прозорій трубці з міліметровою розміткою, і як тільки падіння крапель дощу припиняється,
можна перевірити висоту води в трубці.
У
нашій задачі, трубка, на жаль, має витік на висоті L міліметрів (мм). Якщо рівень води стає вище точки витоку, то вода
стікає з труби зі швидкістю K міліметрів
на годину (мм/год).
Ми хочемо з'ясувати, який випав рівень опадів, коли протягом
певного часу йшов дощ. Вважаємо, що сама трубка досить висока і вона ніколи не наповнюється.
Вважаємо також, що дощ йде з однією (невідомою) швидкістю, і вода не випаровується
з трубки. Розміром течі можна знехтувати.
Вхідні дані
Один
рядок містить п'ять позитивних чисел: L K T1 T2 H,
де
L -
висота витоку (мм)
K - швидкість витікання води з місця витоку (мм/год)
T1 - час продовження дощу (ч)
T2 - час між закінченням дощу і спостереженням рівня води в трубці (ч)
H - рівень води в трубці в момент спостереження (мм)
K - швидкість витікання води з місця витоку (мм/год)
T1 - час продовження дощу (ч)
T2 - час між закінченням дощу і спостереженням рівня води в трубці (ч)
H - рівень води в трубці в момент спостереження (мм)
Кожне число не менше
0.01 і не більше 1000.00, задається з двома десятковими знаками.
Вихідні дані
Вивести два дійсних числа F1 F2,
де F1 - найменша кількість опадів в міліметрах, яке можна отримати
в результаті спостережень,, F2 - найбільша можлива кількість опадів
в міліметрах, отримане при спостереженні. Вивести відповідь з точністю 10-9.
·
Ліміт часу 1 секунда
·
Ліміт використання пам'яті 64
MiB
Вхідні дані
Sample 1
80.00 0.50 2.00 1.50 80.00
Sample 2
100.00 0.50 2.00 1.50 80.00
|
Вихідні дані
Sample 1
80.000000000 80.759403280
Sample 2
80.000000000 80.000000000
|
#include <iostream>
#include <math.h>
#include <iomanip>
using
namespace
std;
int main()
{
double l, k, t1, t2, h;
cin >> l >> k >> t1 >> t2 >> h;
double p = h + k*(t2 + t1), f = p /
2 +
sqrt(p*p /
4 - k*t1*l);
cout << fixed << setprecision(
9) << (h <= l ? h : f) <<
" " << (h < l ? h : f) << endl;
return
0;
}
2. Фінансова піраміда
В понеділок Толя позичив
у Сергійка 2 цукерки і з задоволенням їх з'їв. У вівторок він позичив у два рази
більше цукерок, після чого віддав половину боргу, а решту цукерок знову із задоволенням
з'їв. Кожний наступний день він позичав у два рази більше цукерок, ніж у попередній
день, віддавши з них цілу частину від половини боргу, а решту цукерок із задоволенням
з'їдав. Скільки цукерок K із задоволенням з'їсть Толя N-гo дня? Який у нього
буде борг B на кінець N-го дня ?
Вхідні
дані
У вхідному файлі одне число N. 1 ≤ N ≤ 30.
Вихідні
дані
У вихідний файл потрібно записати два числа - значення
K та
B.
·
Ліміт часу 1 секунда
·
Ліміт використання пам'яті 64 MiB
Вхідні дані
4
|
Вихідні дані
5 11
|
using System;
namespace
Problem140
{
internal
class
Program
{
public static void Main(string[] args)
{
int n =
int.Parse(Console.ReadLine());
int aldi =
2;
int borc =
2;
int yedi =
2;
for (
int i =
2; i <= n; i++)
{
aldi = aldi*
2;
int qaytardi = (borc + aldi)/
2;
borc = borc + aldi - qaytardi;
yedi = aldi - qaytardi;
}
Console.WriteLine(
"{0} {1}", yedi, borc);
}
}
}
3. Перестановка
Задано послідовність, що складається з n натуральних
чисел. Визначити, чи є вона перестановкою перших n натуральних чисел.
Вхідні дані
В єдиному рядку задано спочатку число n (n ≤10000),
а потім n натуральних чисел, розділених пропуском. Відомо, що кожне з натуральних
чисел менше за 2000000.
Вихідні дані
Вивести 0, якщо послідовність є перестановкою. Інакше
слід вивести мінімальне число, що не входить в цю послідовність.
·
Ліміт часу 1 секунда
·
Ліміт використання пам'яті 128 MiB
Вхідні дані #1
3 2 1 3
|
Вихідні дані #1
0
|
Вхідні дані #2
3 1 4 2
|
Вихідні дані #2
3
|
#include <iostream>
#include <string.h>
using namespace std;
int main() {
//Читаем входные данные. Обнуляем массив m. Для каждого входного числа
//а ≤ n увеличим m[a] на единицу (а может принимать значение от 1 до 2000000).
int a, n, i, m[10001];
scanf("%d",
&n);
memset(m,
0, sizeof m);
for (i
= 0; i < n; i++)
{
scanf("%d",
&a);
if
(a <= n) m[a]++;
}
//Находим наименьшее
натуральное число i, которого нет
во входном массиве.
//Для такого числа будет
выполнено равенство m[i] = 0.
for (i = 1; i <= n; i++) if (m[i] == 0) break;
//Если i > n, то все числа от 1 до n встретились.
//Значит входная
последовательность является перестановкой.
//Иначе i будет наименьшим числом, не
входящим в эту последовательность
if (i <= n) printf("%d\n", i);
else
printf("0\n");
return
0;
}
4. Велосипед
Велосипедист збирається проїхати з пункту A в пункт B, відстань між якими становить L м. У нього є велосипед, який може
развивати швидкість v м/c. Однак перед
тем як виїхати, велосипедист може виконати деякі модернізації свого велосипеда.
Для кожної модернізації відомо на скільки вона збільшує швидкість велосипеда, а
також час, за який вона може бути виконана. Можна виконувати декілька різних модернізацій,
проте кожна модернізація може бути виконана не більше одного разу. Допоможіть велосипедисту
дістатись до пункту B якомога швидше.
Вхідні дані
Напишіть програму, яка зчитує три цілих числа: відстань
між пунктами L, початкову швидкість велосипеда v та кількість різних модернізацій
N. Далі йде N пар цілих чисел, кожна з яких визначає
відповідну модернізацію: приріст швидкості після модернізації vi і час ti, що витрачається на
цю модернізацію. Всі величини задано у системі СІ (метри та секунди).
0 ≤ L≤ 109, 1 ≤ v≤ 106, 0
≤ N≤ 100, 0
≤ vi≤ 1000,
0 ≤ ti≤
1000.
Вихідні дані
Необхідно вивести з шістю десятковими знаками мінімальний
час, який потрібно велосипедисту для того, щоб доїхати з пункту A у пункт
B з врахуванням часу на модернізації.
·
Ліміт часу 1 секунда
·
Ліміт використання пам'яті 122.17 MiB
Вхідні дані #1
100 5 1 3 10
|
Вихідні дані #1
20.000000
|
Вхідні дані #2
100 5 2 5 3
5 3
|
Вихідні дані #2
12.666667
|
#include <iostream>
#include <string.h>
using
namespace
std;
int i, j, l, v, n, t, vi, mx, dp[
100001];
int main() {
scanf(
"%d %d %d", &l, &v, &n);
memset(dp,
0x3F,
sizeof dp);
dp[
0] = mx =
0;
//Совершим пересчет массива dp для всех модернизаций.
for (i =
0; i < n; i++)
{
scanf(
"%d %d", &vi, &t);
for (j = mx; j >=
0; j--)
if (dp[j] + t < dp[j + vi]) dp[j + vi] = dp[j] + t;
mx += vi;
}
//Для каждого значения прироста скорости i вычислим время, необходимое для преодоления
//расстояния из пункта A в пункт B. Оно равно величине пути l, деленное на скорость
//велосипедиста v + i, плюс время модернизации dp[i].Наименьшее из таких времен и будет искомым.
double res =
1e10;
for (i =
0; i <= mx; i++)
{
double temp =
1.0 * l / (v + i) + dp[i];
if (temp < res) res = temp;
}
printf(
"%.6lf\n", res);
return
0;
}
5. Сума дільників
Нехай n - натуральне число. Число
d є його
дільником, якщо 1
≤ d ≤ n та остача від ділення
n на d дорівнює нулю. За заданим
числом n знайдіть
суму його дільників.
Вхідні дані
Одне ціле число
n (1 ≤ n ≤
1018
), усі прості
дільники якого не перевищують 1000.
Вихідні дані
Виведіть суму
дільників числа n.
·
Ліміт часу 1 секунда
·
Ліміт використання пам'яті 128 MiB
Вхідні дані #1
12
|
Вихідні дані #1
28
|
Вхідні дані #2
239
|
Вихідні дані #2
240
|
#include <iostream>
using
namespace
std;
int main() {
long n, p, res =
1;
scanf(
"%lld", &n);
for (
int i =
2; i <=
1000; i++)
{
p =
i;
//Пусть i – простой делитель n. Находим максимальную
//степень a, для которой i^a делит n.
while (n % i ==
0)
{
n /= i;
p *= i;
}
//После выполнения цикла p = i^(a + 1).
res *= (p -
1) / (i -
1);
}
printf(
"%ld\n", res);
return
0;
}
2016-2017
Завдання та розв’язки
8-9 клас
1. Среднее число (№108)
Дано три
различных числа a, b, c. Вывести среднее из них.
Входные
данные
Числа a, b, c целые и по модулю не превышают 1000.
Выходные
данные
Вывести среднее
среди трех чисел.
var a,b,c:integer;
Begin
readln(a,b,c);
if (b<a) and (a<c) or (c<a) and (a<b)then writeln(a);
if (a<b) and (b<c) or (c<b) and (b<a)then writeln(b);
if (a<c) and (c<b) or (b<c) and (c<a)then writeln(c);
end.
2. Банкомат (№ 138)
В банкомате имеются в достаточном
количестве купюры номиналом 10, 20, 50, 100, 200
и 500 гривен. Найти минимальное количество купюр, которое необходимо
использовать, чтобы выдать сумму в n гривен или вывести -1,
если указанную сумму выдать нельзя.
Входные данные
Одно число n (1 ≤ n ≤ 1000000).
Выходные данные
Наименьшее количество купюр, которыми
можно выдать n гривен.
var n,k:longint;
begin
readln(n);
k:=0;
k:=k+n div 500; n:=n mod 500;
k:=k+n div 200; n:=n mod 200;
k:=k+n div 100; n:=n mod 100;
k:=k+n div 50; n:=n mod 50;
k:=k+n div 20; n:=n mod 20;
k:=k+n div 10; n:=n mod 10;
if n<>0 then writeln(-1) else writeln(k);
End.
3. Количество игрушек (№927)
Задано количество видов игрушек в магазине, количество игрушек
каждого вида и стоимость игрушки каждого вида. Определить количество игрушек,
стоимость которых меньше 50 грн.
Входные
данные
В первой строке задано количество наличных в прейскуранте видов
игрушек n (0 ≤ n ≤ 1000). В
следующих n строках задано
по 2 числа через пробел:
сначала количество игрушек a (0 ≤ a ≤ 1000) очередного вида и их цена b (0 < b ≤ 10000) в
грн.
Выходные
данные
Вывести количество игрушек, стоимость которых меньше 50 грн.
var i,n,kol:integer;
otv:longint;
cena:real;
Begin
readln(n);
otv:=0;
for i:=1 to n do
begin
read(kol,cena);
if cena<50 then otv:=otv+kol;
end;
writeln(otv);
end.
4. Сдвинь элементы (№ 922)
Задан
одномерный массив целых чисел длины n. Сдвинуть элементы
массива вправо циклически на 1 шаг.
Входные
данные
В первой строке
задано количество элементов массива n (n ≤ 100). Во
второй строке через пробел заданы сами элементы массива, значение каждого из
которых по модулю не превышает 100.
Выходные
данные
В одной строке
вывести через пробел n чисел: новые значения
элементов массива.
var a:array[1..100] of longint;
n,i,x:longint;
Begin
readln(n);
for i:=1 to n do
read(a[i]);
x:=a[n];
for i:=n downto 2 do
a[i]:=a[i-1];
a[1]:=x;
for i:=1 to n do
write(a[i],' ');
end.
5. Покупка цветов
(№ 891)
На День учителя Вася решил купить букет цветов. В магазине продаются
ромашки по a рублей за штуку и гладиолусы по b рублей
за штуку (a < b). У Васи есть c рублей.
Он хочет составить букет из максимально возможного количества цветов, и при
этом потратить как можно больше денег. Другими словами, из всех букетов с
максимально возможным количеством цветов он хочет выбрать самый дорогой, но не
дороже c рублей. Помогите ему вычислить стоимость такого
букета.
Входные данные
Три целых числа a, b, c (1 ≤ a < b ≤ 100, 0 ≤ c ≤ 1000).
Выходные данные
Выведите одно число - стоимость самого дорогого букета из максимального
количества цветов.
var i_a,i_b,a,b,c,kol,stoim:longint; //Мое решение
Begin
readln(a,b,c);
kol:=0;stoim:=0;
for i_a:=0 to c div
a do
for i_b:=0 to c div
b do
if (i_a+i_b>=kol) and (a*i_a+b*i_b<=c) then kol:=i_a+i_b;
for i_a:=0 to c div
a do
for i_b:=0 to c div
b do
if i_a+i_b=kol then if (a*i_a+b*i_b>stoim) and
(a*i_a+b*i_b<=c) then stoim:=a*i_a+b*i_b;
writeln(stoim);
end.
var a,b,c,m,t,k:longint; //решение Устинова
begin
Readln(a,b,c);
k:=c div a;
m:=k*a;
t:=m;
while (k>0) and (t>=a) and (t-a+b<=c) do
begin
t:=t-a+b; dec( k );
if t>m then m:=t;
end;
Writeln( m );
end.
10-11 клас
1. Несчастливый автобус (№ 247)
Витя живёт довольно далеко от школы, поэтому, чтобы не
опаздывать на уроки, он ездит на автобусе. Витя - очень наблюдательный мальчик,
он старается замечать все интересные совпадения, которые происходят в жизни.
Однажды он заметил, что как только он садится в автобус, у которого номер в двоичном представлении второй цифрой справа имеет единичку,
так его обязательно вызовут к доске отвечать заданный урок. А кто же любит
ходить к доске?! Тем более, если накануне просидел за компьютером и не выучил
уроки!!! Явно, что в таком случае грозит "двойка" ...
Помогите Вите составить список автобусов, которые он считает
"несчастливыми" автобусами.
Входные данные
В певрой строке записано число N (0 ≤ N ≤ 100000) — количество
автобусов, далее указаны номера автобусов mi (0 ≤ mi ≤ 231-1) по одному в
строке.
Выходные данные
Выведите количество "несчастливых" автобусов.
var x,k,i,n:longint; //Мое решение
begin
k:=0;
readln(n);
for i:=1 to n do
begin
readln(x);
if ((x-2) mod 4=0) or ((x-3) mod
4=0) then k:=k+1;
end;
writeln(k);
end.
var i,n,t,k:longint; //Решение Устинова
begin
k:=0;
readln( n );
for
i:=1 to
n do
begin
readln( t );
if
(t div 2) mod 2=1 then
inc( k );
end;
writeln( k );
end.
2. Компакт-диски (№107)
Чистые
компакт-диски продают в трёх видах упаковок. Упаковка из 100 дисков стоит 100 грн., из 20 дисков - 30 грн., а один диск стоит 2грн. Какую минимальную сумму нужно истратить для покупки n таких дисков?
Входные данные
Количество
дисков n (n ≤ 1000).
Выходные данные
Вывести
минимальную сумму в гривнах для покупки n дисков.
var n:integer;
k100,k20,k:integer;
begin
k100:=0;k20:=0;k:=0;
readln(n);
if n>=100 then begin
k100:=n div 100; n:=n mod 100;end;
if n>=65 then
k100:=k100+1
else if n mod
20 <=14
then begin
k20:=n div 20;k:=n mod 20;end
else k20:= n div
20+1;
writeln(100*k100+30*k20+2*k);
end.
3. Лицензионное ПО (№ 255)
Как вы знаете, для удостоверения лицензионности ПО используются
серийные номера и регистрационные ключи. Вами, как ведущими разработчиками
систем верификации лицензионности ПО была разработана идея надежнейшей в своём
роде системы. Основывается она на цифровых корнях чисел. Теперь вам требуется
написать программу, определяющую цифровой корень данного числа.
Для
произвольного числа цифровой корень определяется следующим образом:
1.
Если сумма цифр числа
меньше десяти, то цифровой корень и есть сумма цифр этого числа.
2.
В противном случае
цифровой корень числа равен цифровому корню суммы его цифр.
Входные
данные
Единственное
число n (0 ≤ n ≤ 231- 1).
Выходные данные
Вывести одно число
- ответ на поставленную задачу.
var sum:longint; //Мое решение
function s_chifr(x:longint):longint;
var a:integer;
begin
s_chifr:=0;
while x>0 do
begin
a:=x mod 10;
s_chifr:=s_chifr+a;
x:=x div 10;
end;
end;
Begin
readln(sum);
while sum>9 do
sum:=s_chifr(sum);
writeln(sum);
End.
var k,t,i:longint;
//Решение Устинова
s:string;
begin
readln(s);
if
length(s)>1 then
begin
k:=0;
for i:=1 to
length(s) do
begin
k:=k+ord(s[i])-48;
end;
while k>9
do
begin
t:=0;
while
k>0 do
begin
t:=t+(k
mod 10);
k:=k div
10;
end;
k:=t;
end;
writeln(k);
end else
writeln(s);
end.
4. Кубики (№202)
Витэк еще в детсадике любил играть в
кубики. Так как Витэк был в старшей группе, то на всех кубиках были большие
буквы, да еще и английские. А так как детсадик был специализированным и
детсадиковцев готовили как будущих разведчиков, то все они должны были знать
английский язык. А возможно - и не разведчиков, а дипломатов, но и для этой
профессии знание английского языка было необходимым. Витэк не очень хорошо
запоминал все слова, что учили на занятиях в детсадике, но всегда мог запомнить
самое длинное слово, которое на кубиках, что использовались на занятиях, читалось
в обеих направлениях одинаково.
Сколько кубиков было использовано в слове, которое запомнил Витэк?
Сколько кубиков было использовано в слове, которое запомнил Витэк?
Входные данные: В первой строке – количество
разложенных перед Витэком
кубиков N (1 ≤ N ≤ 100000), в следующей строке
последовательность N букв на кубиках без пробелов.
Выходные данные: Количество букв в самом длинном слове, которое запомнил Витэк.
Выходные данные: Количество букв в самом длинном слове, которое запомнил Витэк.
var s:ansistring;
mas:array['A'..'Z'] of longint;
n,i,k:longint;
ch:char;
begin
k:=0;
readln(n);
readln(s);
for i:=1 to
length(s) do
inc(mas[s[i]]);
for ch:='A' to 'Z' do
k:=k+mas[ch] div 2;
k:=K*2;
if k=n then writeln(k) else writeln(k+1);
end.
5*. Решение
задач (№ 893)
В этой задаче Вася готовится к олимпиаде. Учитель дал ему N (1 ≤ N ≤ 100000)
задач для тренировки. Для каждой из этих задач известно, каким умением ai нужно обладать для её решения. Это означает, что если
текущее умение Васи больше либо равно заданного умения для задачи, то он может
ее решить. Кроме того, после решения i-й задачи Васино умение увеличивается на число bi.
Исходное умение Васи равно A. Решать
данные учителем задачи он может в произвольном порядке. Какое максимальное
количество задач он сможет решить, если выберет самый лучший порядок их
решения?
Входные
данные
Сначала вводятся два целых числа N, A (1 ≤ N ≤ 100000, 0 ≤ A ≤ 109) - количество задач и исходное умение. Далее идут N пар целых чисел ai, bi (1 ≤ ai ≤ 109, 1 ≤ bi ≤ 109) - соответственно сколько умения нужно для решения i-й задачи и сколько умения прибавится после её решения.
Выходные
данные
Выведите одно число - максимальное количество задач, которое
Вася сможет решить.
type ch=record //С
использованием пузырьковой сортировки 70% тестов
a,b:longint;
end;
var mas:array[1..100000] of ch;
pr:ch;
i,j,n,um,kol:longint;
Begin
readln(n,um);
kol:=0;
for i:=1 to n do
read(mas[i].a,mas[i].b);
for i := 1 to n-1 do
for j := 1 to
n-i do
if mas[j].a > mas[j+1].a then
begin
pr := mas[j];
mas[j] := mas[j+1];
mas[j+1] := pr;
end;
for i:=1 to n do
if um>=mas[i].a then begin
kol:=kol+1;um:=um+mas[i].b;end;
writeln(kol);
End.
type z=record //с
использованием быстрой сортировки 100 тестов
a,b:longint;
end;
var n,i,k:longint;
a:Int64;
m:array[1..100000] of z;
procedure qSort(l,r:longint);
var i,j:longint;
w,q:z;
begin
i := l; j := r;
q := m[(l+r) div 2];
repeat
while (m[i].a < q.a) do
inc(i);
while (q.a < m[j].a) do
dec(j);
if (i <= j) then
begin
w:=m[i]; m[i]:=m[j]; m[j]:=w;
inc(i); dec(j);
end;
until (i > j);
if (l < j) then qSort(l,j);
if (i < r) then qSort(i,r);
end;
begin
readln(n,a);
i:=0; k:=0;
while n>0 do
begin
Inc(i);
Readln(m[i].a,m[i].b);
if a>=m[i].a then
begin
a:=a+m[i].b;
dec(i); inc(k);
end;
Dec(n);
end;
n:=i;
qSort(1,n); i:=1;
while (i<=n) and
(a>=m[i].a) do
begin
a:=a+m[i].b;
Inc(k); Inc(i);
end;
Writeln(k);
end.
Джерело
Олімпіадні
завдання з інформатики
10 клас
Опрацювання рядкових величин. Одновимірний масив,
дії над елементами масиву.
Завдання 1.
В рядку, який містить арифметичний вираз, перевірити чи правильно поставлені дужки.
У випадку лишніх дужок не
рахувати неправильним розстановку дужок(наприклад: ((а+b)) – дужки поставлені правильно.
Обробка двовимірного масиву: заповнення, вивід
елементів масиву, вставка, видалення елементів
Завдання 2.
Латинським квадратом
називається масив, в рядках і стовпчиках якого немає одинакових елементів.
Вивести на екран латинський квадрат розміром N x N.
1
|
2
|
3
|
4
|
5
|
5
|
1
|
2
|
3
|
4
|
4
|
5
|
1
|
2
|
3
|
3
|
4
|
5
|
1
|
2
|
2
|
3
|
4
|
5
|
1
|
Сортування елементів
масиву, обмін місцями пари чисел.
Завдання 3.
Відомо ряд цілих
випадкових чисел. Перетворіть його в ряд чисел, між якими можна було б розставити знаки ‘<’ і ‘>’ чередуючи їх.
Завдання 1.
В рядку, який містить арифметичний вираз, перевірити чи правильно поставлені дужки.
У випадку лишніх дужок не
рахувати неправильним розстановку дужок(наприклад: ((а+b)) – дужки поставлені правильно.
Розв’язок.
- Допустимо, відомо такий вираз:
(a+b((4a-8)*b+3)-15b)
- Створимо два масиви:А і flag.
- Розібємо рядок, що містить вираз на окремі
символи.
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
(
|
a
|
+
|
b
|
(
|
(
|
4
|
a
|
-
|
8
|
)
|
b
|
+
|
3
|
)
|
-
|
1
|
5
|
b
|
)
|
Це так виглядає масив А.
А масив flag заповнити так:
Ставимо, 1 якщо елемент масиву А – відкрита дужка
Ставимо, -1 якщо елемент масиву А – закрита дужка
1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20
|
1
|
0
|
0
|
0
|
1
|
1
|
0
|
0
|
0
|
0
|
-1
|
0
|
0
|
0
|
-1
|
0
|
0
|
0
|
0
|
-1
|
Знаходимо суму елементів масиву flag.
Якщо сума елементів буде відємна(отрицательна), то дужки розставлені
неправильно.
Якщо сума дорівнює 0 тоді дужки розставлено правильно.
Програма.
Uses crt;
Const m=20;
Var flag:array[1..m] of integer;
A:array[1..m] of string;
Stroka:string;
I, s,
n, x:integer;
Begin
clrscr;
Writeln(‘vvesti stroky’);
Readln(stroka);
N:=length(stroke);
For
i:=1 to n do
Begin
A[i]:=copy(stroka, I,1);
Flag[i]:=0;
End;
For i:=1 to n do
Begin
If
a[i]:=’(‘ then flag[i]:=1;
If
a[i]:=’)’ then flag[i]:= - 1;
End;
S:=0;
For i:=1 to n do
Begin
S:=s+flag[i];
If s<0 then x:=1;
End;
If (s=0) and (x=0) then writeln(‘verno’)
Else
writeln(‘ploho’); end.
Завдання 2.
Латинським квадратом називається
масив, в рядках і стовпчиках якого немає одинакових елементів. Вивести на екран
латинський квадрат розміром N x N.
1
|
2
|
3
|
4
|
5
|
5
|
1
|
2
|
3
|
4
|
4
|
5
|
1
|
2
|
3
|
3
|
4
|
5
|
1
|
2
|
2
|
3
|
4
|
5
|
1
|
Заповнити перший рядок квадратного масиву (N x N) числами від 1 до N.
Другий рядок масиву получається
шляхом циклічного зсуву елементів першого рядка. Циклічний зсув елементів
получається використовуючи алгоритм
вставка - знищення
.
uses crt;
var a:array[1..10, 1..10] of integer;
n,I,j,x: integer;
begin clrscr;
writeln(‘razmer’);
readln(n);
for
j:=1 to n do
a[1,j]:=j;
{ ---- сдвиг------}
For i:=2 to n do
Begin
For
j:=1 to n do
A[I,j]:=a[i-1,j];
X:=a[I,n];
For j:=n downto 2 do
A[I,j]:=a[I,j-1];
A[I,1]:=x;
End;
{
------- new masiv -------}
For
i:=1 to n do
Begin
For
j:=1 to n do
Write(a[I,j]:3);
Writeln; end;
End.
Завдання 3.
Відомо ряд цілих випадкових чисел. Перетворіть його в ряд
чисел, між якими можна було б
розставити знаки ‘<’
і ‘>’ чередуючи їх.
Розвязування.
Ряд чисел сортуємо. Міняємо місцями кожну пару чисел.
Uses crt;
Var a:array[1..10] of integer;
I,j,n,x:integer;
Begin
clrscr;
Writeln(‘kolichestvo chisel’);
Readln(n);
For i:=1 to n do
Begin
Writeln(‘vvesti chislo’);
Readln(a[i]); end;
{ ----- sortyvannya----}
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;
{-------- obmin ----------}
X:=1;
For i:=1 to (n div 2) do
Begin
X:=a[j];
A[j]:=a[j+1];
A[j+1]:=x;
J:=j+2; end;
For
i:=1 to n do
Writeln(a[i]);
End.
Ввести числа 5, 2, 1, 8, 0,
67, 100
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.