Окончание, начало см. в МК № 3, 8, 16, 27, 29, 31, 35 (226, 231, 239, 250, 252, 254, 258).

На этот раз обойдемся без вступления, чтобы решить больше задач :-).

Проверим домашнее задание:

Задача №30

Составить программу вывода на экран N-го символа заданного текста.

Совсем легкая задача. Решение заняло у меня три строки (вся программа — десять). Приложение выводит на экран символ, который находится на N-ом месте в тексте.

uses Crt; // Подключаем модуль Crt к программе var s: String; // Объявляем переменные n: Integer; begin clrscr; // Очищаем экран writeln('Введите текст и символ:'); read(s, n); // Считываем с клавиатуры текст и символ writeln(copy(s, n, 1)); // Печатаем знак, находящийся на N-ом месте repeat until keypressed; end.

Такая вот кроха получилась :-). Зато чтобы решить следующую задачу, нужно хорошенько пораскинуть мозгами.

Задача №31

Составить программу, которая позволяет из любого натурального числа N получить «перевернутое» число, и подсчитать сумму цифр этого числа.

Перевернутым числом называют число, в котором цифры идут в обратном порядке. Например, N=123456789, перевернутое число — 987654321.

Главная проблема, которая встает при решении данной задачи — незнание количества цифр в числе N. Я решил ее достаточно просто: в первом цикле переменная i принимает значения не от 1 до 9, а наоборот, от 9 до 1. Что это дает? Если, например, N=1234, то есть состоит из четырех цифр, то при i=9,8,7,6,5 элементам массива ar1[i] присваивается значение 0. В итоге перевернутое число будет равняться 000004321, что соответствует числу 4321.

uses Crt; // Подключаем модуль Crt к программе var n, n1, k: longint; // Объявляем переменные i, j, sum, c: integer; ar, ar1: array[1..10] of longint; // Объявляем массивы begin clrscr; // Очищаем экран write('Введите натуральное N = '); readln(n); // Считываем с клавиатуры N for i := 9 downto 1 do begin k:=1; for j := 2 to i do k:=k*10; // Вычисляем, на сколько нужно поделить число N ar1[i] := n div k; // «Отрезаем» все цифры, стоящие после цифры на позиции i ar[i] := ar1[i] — ar1[i+1]*10; // Находим цифру на позиции i Inc(sum,ar[i]); // Увеличиваем сумму цифр if ar1[i]>0 then inc(c); // Подсчитываем количество цифр в числе N end; for i := 1 to c do begin k:=1; for j := c downto i+1 do k:=k*10; // Вычисляем разряд цифры ar[i] n1 := n1 + ar[i]*k; // Находим «перевернутое» число end; writeln; writeln('Перевернутое число = ', n1); writeln; writeln('Сумма цифр числа = ', sum); repeat until keypressed; end.

Кстати, если вы заметили, я написал n div k вместо привычного Trunc(n/k). Результат получаем тот же, но при этом генерируется более оптимальный код.

Задача №32

Проходят соревнования по прыжкам в длину. D спортсменов выполняют по С попыток. Заполнить двухмерный массив размерностью DC случайными числами от 1 до 10, выполнив округление до десятых. Отпечатать элементы массива в виде матрицы. Определить лучшую попытку каждого спортсмена, создав при этом линейный массив. Отпечатать элементы массива в строку. Определить чемпиона по прыжкам в длину и вывести на печать его (их) результаты.

Уточню: в последней фразе подразумевается, что нужно показать все попытки чемпиона.

uses Crt; // Подключаем модуль Crt к программе var ar: array[1..50,1..50] of real; // Объявляем массивы ar1: array[1..50] of real; i, j, d, c: integer; // Объявляем переменные max, ch: Real; begin clrscr; // Очищаем экран Randomize; // Инициализируем генератор случайных чисел writeln('Введите количество спортсменов (D) и попыток (C):'); readln(d, c); // Ввод переменных for i := 1 to d do begin for j := 1 to c do begin ar[i,j] := Random(91)/10+1; // Прыгаем :-), то есть заполняем массив write(ar[i,j]:10); if ar[i,j] > max then max := ar[i,j]; // Вычисляем лучшую попытку спортсмена end; writeln; ar1[i] := max; if ch < max then ch := max; // Находим чемпиона max := 0; end; writeln('Лучший результат каждого спортсмена:':40); for i := 1 to d do write(ar1[i]:10); // Печатаем лучший результат каждого спортсмена writeln; writeln('Чемпионы:':20); for i := 1 to d do begin if ar1[i] = ch then begin for j := 1 to c do write(ar[i,j]:10); // Печатаем результаты чемпионов writeln; end; end; repeat until keypressed; end.

Задача №33

С клавиатуры вводится действительное (читай: любое) число. Определить знак числа (положительное, отрицательное, равное нулю). Проверить, целое ли это число; если целое, то установить его парность или непарность; если оно целое и неотрицательное, то проверить, будет ли оно полным квадратом.

uses Crt; // Подключаем модуль Crt к программе var n: real; // Объявляем переменные k, i: integer; begin clrscr; // Очищаем экран writeln('Введите число:'); readln(n); // Считываем с клавиатуры число if n = 0 then writeln('N равно нулю.'); // Определяем знак числа if n > 0 then writeln('N — положительное.'); if n < 0 then writeln('N — отрицательное.'); if n <> 0 then begin k := Trunc(n); if k = n then // Проверяем, целое ли это число begin writeln('N — целое число.'); if k mod 2 = 0 then writeln('N — парное.') // Определяем парность числа else writeln('N — непарное.'); if n > 0 then if sqrt(n) = Trunc(sqrt(n)) // Узнаем, будет ли N полным квадратом then writeln('N — полный квадрат.'); end; end; repeat until keypressed; end.

Задача №34

«Раджа и шахматы». Когда-то один богатый раджа проиграл мудрецу в шахматы. Он согласился расплатиться рисовым зерном в таком количестве: на первую клетку шахматной доски кладется 1 зерно; на вторую — 2 зерен; на третью — 4 и так далее; на последнюю шестьдесят четвертую кладется 263 зерен. Эта схема показалась радже очень выгодной, но всего зерна, которое у него было, хватило лишь на половину доски. Вычислить общее количество зерен, проигранных раджой. Учитывая, что одна рисовая зернина весит приблизительно 1 карат = 0.2 грамма, подсчитать массу проигранного зерна. Принимая, что средняя грузоподъемность одного железнодорожного вагона-зерновоза равна 70 тоннам, вычислить количество вагонов проигранного зерна. Принимая среднюю длину железнодорожного вагона равной 20 метров, установить длину эшелона для перевозки проигранного зерна.

Честно говоря, я и не подозревал, как много зерна выиграл мудрец, пока не решил задачу :-). Как вы уже догадались, типы Integer и LongInt в этой задаче использовать не получится.

uses Crt; // Подключаем модуль Crt к программе var i: integer; // Объявляем переменные a, k, m, v, d: real; begin clrscr; // Очищаем экран k := 1; a := 1; for i := 2 to 63 do // Находим общее количество зернинок begin k := k*2; a := a + k; end; writeln('Общее количество зернинок = ',a); m := a/10000000; writeln('Масса зерна = ', m, ' тонн.'); v := Int(m/70) + 1; // Не может же быть полвагона. Поэтому отбрасываем дробную часть числа, но добавляем еще один вагон, который будет заполнен не полностью. writeln('Раджа проиграл ', v,' вагонов зерна.'); d := v*20; writeln('Длина эшелона = ', d, ' метров.'); repeat until keypressed; end.

Задача №35

Натуральные числа записаны в виде таблицы (Табл. 1). Написать программу, которая выводит на экран число N (вводится с клавиатуры) и числа данной таблицы, которые его окружают (примеры: Табл. 2, 3).

Таблица 1 Таблица 2

Таблица 3

Первым делом у вас должен возникнуть вопрос: как получить первую таблицу? Понятно, что это будет двумерный массив, просто нужно придумать алгоритм заполнения. Конечно, фанатики могут заполнить массив вручную :-), но лучше, чтобы это делалось автоматически. В данном случае надо заполнять массив не по строкам, а по столбцам, то есть сначала элемент [1,1], потом [2,1], [3,1] и так далее. Зачем? Как видите, при таком методе перебора элементов каждая последующая ячейка таблицы (не считая пустых) будет на единицу больше предыдущей. Остается только узнать, где пусто, а где стоит циферка. Наша таблица из цифр представляет собой пирамиду, положенную набок. Причем цифры располагаются посредине столбца. Эту особенность я и использовал в своем решении. В первом столбце снизу и сверху от единицы располагается по 11 пустых ячеек (в моем решении), во втором уже по 10, то есть вместо двух пустых ячеек появились два числа, и так далее.

Решение задачи можно условно поделить на три части: заполнение таблицы (массива), вывод ее на экран, печать числа N и окружающих его чисел.

uses Crt; // Подключаем модуль Crt к программе var mas: array[1..24,1..13] of Integer; // Объявляем массив i, j, j1, k, k1 { Количество пустых ячеек над (или под) числом (числами) в столбце}, k2 {количество непустых ячеек в столбце}, ch {число в ячейке}, n, i2, j2: Integer; // Объявляем переменные begin clrscr; // Очищаем экран writeln('Введите число N:'); read(n); k1 := 12; // Количество пустых ячеек над (или под) числом в первом столбце k2 := 1; for i := 1 to 12 do // По мере выполнения циклов заполняем таблицу begin for j := 1 to 23 do begin inc(k); if k = k1 then begin for j1 := 1 to k2 do begin Inc(ch); mas[j,i] := ch; Inc(j); end; end; end; k := 0; k1 := k1 — 1; k2 := k2 + 2; end; // Здесь начинается вторая часть программы — печать таблицы for i := 1 to 23 do begin for j := 1 to 12 do begin if mas[i,j] = n then begin i2 := i; j2 := j; textcolor(28); // Для красоты печатаем число N другим цветом end else textcolor(15); if mas[i,j] = 0 then write(' ') else write(mas[i,j]:4); end; writeln; end; repeat until keypressed; // И наконец, завершающая часть — печать числа N и его соседей clrscr; // Очищаем экран textcolor(12); writeln(' N = ', n); writeln; textcolor(15); for i := i2-1 to i2+1 do begin for j := j2-1 to j2+1 do begin if mas[i,j] = n then textcolor(12) else textcolor(15); if mas[i,j] = 0 then write(' -') else write(mas[i,j]:4); end; writeln; end; while keypressed do readkey; // Очищаем буфер клавиатуры для повторного использования функции keypressed repeat until keypressed; end.

Кстати, заметьте, что я объявил массив размерностью 2413, но заполнил только 2312 элементов. Это сделано затем, чтобы, например, при N=144 (число в двенадцатом столбце) получить правильный результат. Иначе справа от числа будут не знаки -, а совершенно «левые» числа.