Продолжение, начало см. МК № 3, 8, 16, 27, 29 (226, 231, 239, 250, 252) Ну что, отдохнули после предыдущего урока? «Как же, отдохнешь, если на дом задано целых две задачи», — так и слышится недовольное ворчание. А я, в свою очередь не устаю повторять, что они решаются за десять минут. Вы не согласны? Тогда давайте попробуем вместе…
Задача №20
Составить программу, определяющую количество оставшихся до конца месяца дней. Текущую дату (день, месяц) вводить с помощью оператора READLN_. Количество дней в феврале принять равным 28._
Для решения этой задачи нужен лишь… календарик :-):
uses Crt; // Подключаем модуль Crt к программе var den, i, mes: Integer; // Объявляем переменные begin clrscr; // Очищаем экран writeln('Введите дату (день, месяц), например: 3, 6'); Read(den, i); // Считываем с клавиатуры день и месяц if i = 2 then mes := 28; // Определяем, сколько дней в указанном месяце if (i=1) or (i=3) or (i=5) or (i=7) or (i=8) or (i=10) or (i=12) then mes := 31; if (i=4) or (i=6) or (i=9) or (i=11) then mes := 30; i := mes — den; writeln('До конца месяца осталось ', i, ' дней.'); // Выводим результат repeat until keypressed; // Для удобства end.
Зато для следующей задачи нужно знать правила дорожного движения :-).
Задача №21
Водителю необходимо преодолеть расстояние в N км, из них М по городу. Какое при этом требуется минимальное время для прохождения всей дистанции без нарушения допустимых скоростей (60 км/час по городу, 80 км/час за городом). M и N принимать с клавиатуры. Результат выводить с соответствующими комментариями.
uses Crt; // Подключаем модуль Crt к программе var n, m, m1: integer; // Объявляем переменные t, t1: Real; begin clrscr; // Очищаем экран writeln('Введите расстояние в N км, из них M по городу:'); read(n, m); // Считываем с клавиатуры расстояние в N км, из них M по городу m1 := n — m; // Определяем расстояние за городом t := m / 60; // Время езды по городу t1 := m1 / 80; // Время езды за городом writeln('Минимальное время для прохождения всей дистанции =', t+t1, ' часов.'); writeln('Из них', t, ' часов по городу и', t1, ' часов за городом.'); repeat until keypressed; // Для удобства end.
В условии не требуется показать время езды по городу и за городом отдельно, но лишняя информация никогда не помешает, тем более что сделать это было нетрудно.
Немножко размялись? Давайте усложним задачу №20:
Задача №22
Составить программу определения суммы количества дней любых заданных (необязательно идущих подряд) трех месяцев года. Количество дней в феврале взять за 28.
Основная сложность программы состоит в том, что нам дают не один, как ранее, а три месяца. Давайте-ка пораскинем мозгами :-). Если месяца три, то определить, сколько дней в каждом из них, удобно в цикле. Но если для обозначения месяцев брать, например, переменные i, i1 и i2, то в цикл их никак не «впихнуть». Поэтому придется использовать массив. Вот так выглядит решение задачи:
var j: Integer; // Объявляем переменные den: array[1..3] of 28..31; // Объявляем массивы m: array[1..3] of 1..12; begin writeln('Введите три месяца (используя номер месяца):'); Read(m[1], m[2], m[3]); // Считываем с клавиатуры месяца for j := 1 to 3 do // Определяем количество дней в каждом из них begin if m[j] = 2 then den[j] := 28; if (m[j]=1) or (m[j]=3) or (m[j]=5) or (m[j]=7) or (m[j]=8) or (m[j]=10) or (m[j]=12) then den[j] := 31; if (m[j]=4) or (m[j]=6) or (m[j]=9) or (m[j]=11) then den[j] := 30; end; writeln('Сумма количества дней месяцев = ', den[1]+den[2]+den[3]); // Выводим результат end.
А сейчас займемся задачами посерьезней.
Задача №23
Составить программу вывода на экран простых чисел до указанного предела (задавать по READLN_)._
Для начала разберемся, какие числа называют простыми. Это те числа, которые делятся без остатка только на единицу и на само себя. Примеры простых чисел: 1, 3, 5, 7, 101…
Теперь придумаем алгоритм, который будет находить простые числа. Если число N простое, то оно должно с остатком делиться на числа в промежутке от 2 до N-1. Исключение составляет только единица, которая делится только на себя.
И последний шаг к успеху (точнее, к решению задачи) — описать этот алгоритм программно, что мы и сделаем:
uses Crt; // Подключаем модуль Crt к программе var i, i1, n, ost: Integer; // Объявляем переменные begin clrscr; // Очищаем экран writeln('Введите максимальное число:'); Read(n); // Считываем с клавиатуры максимальное число (предел) writeln; for i := 1 to n do // Проверяем все числа из заданного промежутка begin if i = 1 then write(i:8); // Единицу как исключение рассматриваем отдельно for i1 := 2 to (i-1) do // Делим текущее число на числа из интервала от 2 до i-1 begin if i = 1 then Break; // Если текущее число — единица, то выходим из внутреннего цикла ost := i mod i1; // Вычисляем остаток от деления if ost = 0 then Break; // Если остатка нет, то завершаем внутренний цикл end; if ost > 0 then write(i:8); // Если остаток ни разу не равнялся нулю, то число простое end; repeat until keypressed; // Для удобства end.
Вот за что я люблю такие задачи — они заставляют хорошенько подумать :-)!
Задача №24
Составить программу решения биквадратного уравнения, используя подпрограмму вычисления корней квадратного уравнения.
Эта задача еще раз доказывает, что учить информатику нужно с учебником по математике под мышкой :-). Если вы забыли, что такое биквадратное уравнение, то я вам напомню. В общем виде оно записывается как ax4+bx2+c=0. Решается заменой x2 на t. Получаем квадратное уравнение at2+bt+c=0. Далее вычисляем дискриминант D=b2–4ac и корни: t1,2=(–bvD)/2a. И наконец, x1,2=vt1, x3,4=vt2. И не забывайте, что корень из отрицательного числа добыть нельзя, поэтому дискриминант D и корни t1, t2 должны быть больше или равны нулю. Причем корень от положительного числа может быть как больше, так и меньше ноля. Например, корень от 4 = 2, а также –2. Теперь можно (и нужно :-)) решать задачу:
uses Crt; // Подключаем модуль Crt к программе var a, b, c, t1, t2, d: Real; // Объявляем переменные begin clrscr; // Очищаем экран writeln('Общий вид уравнения: ax^4 + bx^2 + c = 0'); writeln('Введите a, b, c:'); Read(a, b, c); // Считываем с клавиатуры d := Sqr(b)-(4*a*c); // Вычисляем дискриминант if d < 0 then writeln('Нет решений!') else // Если он меньше нуля, то решений нет begin t1 := (-b+Sqrt(d))/(2*a); // Вычисляем корни квадратного уравнения t2 := (-b-Sqrt(d))/(2*a); if (t1>0) and (d=0) then writeln('x = +-', Sqrt(t1)); // Вычисляем корни биквадратного уравнения if t1 > 0 then writeln('x1,2 = +-', Sqrt(t1)); if t2 > 0 then writeln('x3,4 = +-',Sqrt(t2)); if (t1 < 0) and (t2 < 0) then writeln('Нет решений!'); end; repeat until keypressed; end.
Да, без математики далеко не уедешь, даже если знаешь правил дорожного движения :-).
Вы уже, наверное, устали, поэтому будем закругляться. Домой я задам уже три задачи. Причем не самые простые.
Задача №25
Определить сумму четных строк и произведение нечетных столбцов массива размерностью 56. Вывести на экран таблицу и результаты.
Задача №26
Составить программу решения ввода всех четырехзначных чисел, в которых сумма двух левых разрядов равна сумме двух правых.
И самая элементарная:
Задача №27
Принять с клавиатуры и запомнить в массиве пять чисел. Затем для каждого из них вычислить Y=3_,14x^2 и Z=3,14(2x), где_ x — число из массива. Полученные результаты построчно вывести на экран.
Но не расстраивайтесь, ведь я мог дать задачки посложнее, причем — о ужас! — не три, а четыре, пять или даже шесть :-). И главное, не останавливайтесь на достигнутом; если что-то не получается — пишите.
