Программы, содержащие одномерные и двумерные массивы, подпрограммы
Главная цель настоящего занятия – обзор всего изученного материала и подготовка к предстоящей обязательной контрольной работе. Это подведение итогов по узловым вопросам элементов программирования: ветвления, циклы, массивы, подпрограммы.
Вместе с тем преподавателям очень бы хотелось максимально заинтересовать сильных студентов, обеспечить их “достойными” задачами. Лучшая форма этого занятия – индивидуальное программирование и индивидуальные консультации, комментирование готовых программ.
Вам прелагается для индивидуальной разработки ряд разнообразных текстовых задач. Вы можете консультироваться друг с другом, с преподавателем, использовать свои наработки, сделанные Вами на предыдущих занятиях
Задачи для подготовки к контрольной работе. Проанализируйте каждую из этих задач, составьте алгоритм, запишите программу на бумаге, отладьте на ПК, удостоверившись в ее правильной работе.
Два вектора заданы своими координатами на плоскости. Выдать сообщение: какой угол образуют эти векторы: острый, тупой или прямой.
Координаты точки А(х;у) заданы случайно, причем –10<x<10 и –10<у<10. Определить, в какой четверти находится точка и ее расстояние до начала координат.
Заданы три случайных числа из отрезка [-5;5]. Выдать сообщение: есть ли среди них противоположные.
Между заданными числами a и b случайно определено число с. Выдать сообщение: к какому числу оно ближе на числовой прямой, к a или к b.
Координаты точки А(х;у) заданы случайно, причем –10<x<10 и –10<у<10. Определить, принадлежит ли точка кругу с радиусом 7.
Заданы три целых случайных числа из отрезка [-15;10]. Вывести на печать эти числа в порядке возрастания.
Заданы два случайных положительных числа из интервала (10; 50). Что больше: их среднее арифметическое или среднее геометрическое?
Задана величина угла d в градусах. Определить в какой четверти он находится.
Игральный кубик подбросили 10 раз. Какую сумму Вы набрали?
По введенным катетам прямоугольного треугольника определить его площадь и гипотенузу.
Пользователем заданы координаты двух точек А и В. Найдите площадь круга, диаметром которого является отрезок АВ.
Дано комплексное число z = a + bi. Найдите его модуль и аргумент.
Дано действительное a и натуральное n. Вычислить сумму
Провести подсчет числа трехзначных чисел делящихся на 13.
Дана функция y = f(x) на отрезке [a;b]. Равномерно разбив этот отрезок на 16 частей, напечатать значения “х” и f(x)
Найти произведение 5 сомножителей, которые являются членами числовой последовательности an =
Определить сумму: s = . (an = )
Найти сумму 16 слагаемых числовой последовательности с общим членом an =
Просуммируйте n слагаемых числовой последовательности с общим членом
Провести подсчет суммы двузначных целых чисел делящихся на 14.
Вычислить произведение 5 членов последовательности с общим членом: an = .
Найти произведение 7 сомножителей, которые являются членами числовой последовательности an =
Определить сумму n членов числовой последовательности с общим членом an = .
Найти сумму по заданному n:
Задан одномерный целочисленный массив х(n), содержащий положительные и отрицательные элементы. Посчитать количество элементов кратных 3.
Задан одномерный целочисленный массив х(16), содержащий положительные и отрицательные элементы. Найти среднее арифметические четных элементов.
В одномерном целочисленном массиве d(n) первую половину элементов заменить единицами, вторую нулями.
В массиве х(12) найти сумму элементов больших половины максимального элемента.
Массив a(n) заполнен случайными числами из промежутка [0;1]. Каких элементов больше: которые меньше 0,5 или тех, которые больше 0,5
В одномерном массиве a(n), заполненном положительными и отрицательными числами, вычислить сумму элементов, которые превышают элемент равный -2.
Дан одномерный массив. Напечатать индексы и количество элементов, равных нулю. Если таких элементов нет, сделать соответствующее сообщение.
Задан одномерный целочисленный массив a(n), содержащий положительные и отрицательные элементы. Вывести на печать вместе с индексами положительные элементы.
В одномерном целочисленном массиве х(n) первые 2 и последние 2 элемента заменить на противоположные по знаку.
В произвольном одномерном массиве подсчитать количество четных элементов, имеющих четные индексы.
Задан массив, состоящий из натуральных чисел взятых из интервала (1; 6). Определить, сколько элементов этого массива равны 3.
Выяснить есть ли в одномерном массиве a(8), элементы которого принадлежат интервалу (1; 10), элементы равные своему индексу и вывести их на печать.
Двумерный массив x(n,n) заполнен случайными целыми числами из промежутка (-9; 9). Создать и распечатать одномерный массив, содержащий элементы, превышающие среднее арифметическое элементов двумерного массива.
В двумерном массиве z(n,m) только положительные элементы: 1< z(n,m) < 11. Вывести на печать элементы, значения которых равны сумме индексов
Двумерный массив x(n,m) заполнен случайными целыми числами из промежутка (-10; 12). Элементы, превышающие среднее арифметическое элементов массива заменить на 0.
Из максимальных значений строк двумерного массива d(n,n) создать и распечатать одномерный массив y(n).
Двумерный массив r(n,m) заполнен случайными целыми числами из промежутка (-4;7). Вывести на печать значение и индексы первого отрицательного элемента.
Задана матрица g(n,m).Найти среднее арифметическое максимальных элементов строк.
Задана матрица w(n,m). Поменять местами k-ую и s-ую строки. Естественно, k и s меньше n. Если это не так, предложить пользователю задать новые значения k и s.
В квадратной матрице s(n,n), заполненной только натуральными числами, найти произведение элементов, расположенных над главной диагональю.
Сформировать и распечатать двумерный массив z(n,n), по следующему принципу: на главной диагонали -1, над ней – элементы, равные сумме индексов, под ней – нули.
Из элементов квадратной матрицы u(n,n) сформировать, распечатать два одномерных массива: в одном – четные элементы u(n,n), в другом – элементы, сумма индексов которых четна.
Задана матрица p(n,m). Найти суммы положительных и отрицательных элементов каждой строки.
Задана матрица q(n,m), элементы которой принадлежат промежутку (1;12). В каждой строке найти количество элементов, принадлежащих отрезку [3;7].
Эти задачи, возможно, чуть более сложны. Если уверены в своих силах, приложите свои программистские способности к их программной реализации, считайте, что Вы готовитесь к олимпиаде.
1.1.Заданы два случайных целых числа из отрезка [2;30]. Вывести на печать их общие делители или напечатать сообщение, что общих делителей эти числа не имеют.
1.2.Пользователь задает координаты центров и радиусы двух окружностей. Выяснить взаимное положение этих окружностей.
2.1.Задана функция f(x) на отрезке [a;b]. Напечатать n ее значений на этом отрезке.
2.2 Числовая последовательность задана формулой общего члена an = t/(i2 + 1), где t – константа, i изменяется от 1 до n. Найти сумму n слагаемых. Значения t и n задает пользователь.
3.1.Задан одномерный целочисленный массив a(n), содержащий положительные и отрицательные элементы. Вывести индексы и значения противоположных элементов, если таковых нет, вывести соответствующее сообщение.
3.2.Заполнить одномерный массив a(12) следующим образом: элементам, стоящим на четных местах присвоить значение 2, элементам, индекс которых кратен трем, присвоить значение 0, второе условие приоритетно. Распечатать массив.
1.Предложить популярную занимательную задачу. Известно, что число дней, прошедших после 1 марта 1700 года вычисляется по формулам:
для января и февраля n = [
365,25(g – 1)]
+ [
30,6(m + 13)]
+ d - 612049
для всех остальных месяцев n = [
365,25g]
+ [
30,6(m + 1)]
+ d – 612049,
где d, m, g – соответственно день, месяц, год. Легко определяется и день недели:
w = n MOD 7, день n будет воскресенье при w = 0, понедельник -1, вторник – 2, среда – 3, четверг – 4, пятница – 5, суббота – 6.
Предложить организовать защиту от неправильного ввода дней и месяцев, например, чтобы программа не принимала 31,04,2008 или 29,02,2007 и т.д. Организовать три подпрограммы: вычисление количества дней для января и февраля и для остальных месяцев, в которые входим с d, m, g, а выходим с n, а также подпрограмму определения дня недели. И поставить ряд задач: в какой день Вы родились, сколько дней прожили, в какой день недели Ю. Гагарин полетел в космос и т.д.
2.Стенные часы отбивают удар каждые полчаса и количество часов от 1 до 12. Составить программу подсчета количества ударов за сутки.
3.В пределах от 1 до 1000 напечатать все пары простых чисел отличающихся на два.
4.Задан двумерный массив, содержащий целочисленные положительные, отрицательные и нулевые элементы. Переставить все нулевые элементы в конец двумерного массива.
5.Есть ли в пределах первых 1000 натуральных чисел числа, сумма делителей которых, включая единицу, но исключая само число, равна этому числу?
6.Натуральные простые нечетные числа, отличающиеся на 2, называются близнецами, например, 17 и 19, 29 и 31 и т.д. Напечатать пары близнецов в пределах 1000.
7. Когда-то в СССР молодые люди играли в спортлото: в карточке – натуральные числа от 1 до 49. Играющий вычеркивал 6 чисел направлял в тиражную комиссию. Пусть 6 (естественно, разных) из 49 вычеркнет Ваша программа.
8.Помогите преподавателям математики! Преподаватель вводит 4 числа, являющихся решением системы 4-х линейных уравнений с 4-мя неизвестными. Пусть Ваша программа распечатает расширенную матрицу системы, состоящую из коэффициентов при неизвестных и столбца свободных членов (который напечатать другим цветом). Значения целых коэффициентов при неизвестных берите из отрезка (-8;10). Например, преподаватель ввел: x1 = -2, x2 = 3; x3 = -1; x4 = 1.
Ваша программа должна напечатать, например:
10 -1 0 1 -22 Преподаватель легко напишет систему уравнений (уже зная ее
-1 4 -2 -8 8 решение):
-6 -4 9 6 -3
2 7 -2 0 19
9.Фигура в системе координат ограничена осью ох, y = Cosx при . Используя метод случайных чисел найти ее площадь, выдавая промежуточные результаты для n кратных 1000. Вычисление значений функции организуйте в подпрограмме.
10.Объем жидкости, налитой в шарообразный резервуар диаметром d, вычисляется по формуле: v = , где h – высота налива жидкости, приняв, например, d = 1метр, составить калибровочную таблицу определения объема жидкости в этом резервуаре с шагом, например, 5 см. Объем выражать в литрах.
11.И еще одна занимательная задача. Еще пифагорейцы назвали два натуральных числа дружественными (или содружественными), если сумма делителей каждого из них (включая единицу, но исключая само число) равна другому числу. Легко проверить, что число 6 “дружит” само с собой, к таким числам относится число 28. возникает вопрос: существуют ли различные числа, обладающие таким свойством? Древние пифагорейцы нашли без ЭВМ. Сможете ли вы отыскать пары таких чисел (в пределах 1000), составив оригинальную программу?
Вот мой вариант такой программы. Но очень “медленный” алгоритм. Придумайте другой, чтобы программа работала быстро.
SCREEN 9: COLOR 14, 1
t = 0
PRINT TAB(10); : INPUT "На каком промежутке ищем дружественные числа"; a, b FOR i = a TO b
FOR j = a TO b si = 0: sj = 0
FOR k = 1 TO j / 2:
IF j / k = j \ k THEN sj = sj + k
NEXT k
FOR k = 1 TO i / 2
IF i / k = i \ k THEN si = si + k
NEXT k
IF sj = i AND si = j THEN PRINT j, i: t = 1: i = j + 1 NEXT j, i
IF t = 0 THEN PRINT "На промежутке "; a; b; "таковых нет"
12.А возможно ли в одной программе обрабатывать символьные и числовые массивы? Рассмотрим занимательную задачу. Пусть в мясном киоске реализуются мясопродукты, расфасованные по 1 кг. Указана цена 1 кг. У покупателя – пользователя d рублей. Составим программу, определяющую, какое максимальное количество килограммов каждого вида продуктов он может приобрести на свои d рублей и какую сдачу он получит при этом.
SCREEN 9: COLOR 14, 1
DIM a$(6), c(6)
DATA свинины,105,говядины,115,баранины,95
DATA сала,80,колбасы,87,фарша,78
FOR i = 1 TO 6: READ a$(i), c(i): PRINT a$(i); " "; c(i): NEXT i
10 INPUT "Сколько у Вас денег"; d
t = 0
FOR k = 1 TO 6: m = 0
20 m = m + 1: w = c(k) * m: sd = d - w
IF sd < c(k) AND d >= c(k) THEN
PRINT "На ваши "; d; " рублей Вы можете купить"; m; "кг, ";
PRINT a$(k); " ваша сдача"; sd; "руб": t = 3
END IF
IF sd >= c(k) THEN 20
NEXT k
IF t = 0 THEN
PRINT "На ваши несчастные"; d; " рублей Вы ничего не сможете купить" END IF
PRINT TAB(10); "Следующий - любая клавиша": DO: LOOP WHILE INKEY$ = "" :GOTO 10
Обратите внимание на то, как в одном цикле присваиваются значения элементам символьного и числового массивов.
Что Вы повторили и закрепили на занятии №20?
Повторили методику решения типовых задач на обработку одномерных и двумерных массивов;
Проанализировали смысл и содержание десятка самых разнообразных задач
Рассмотрели задачи, рекомендованные для подготовки к контрольной работе;
Провели самооценку собственной готовности к контрольной работе;
Уяснили смысл предлагаемых задач для выполнения на контрольной работе;
Самостоятельно и в микроколлективах программно реализовали предложенные задачи;
Рассмотрели более сложные задачи в целях подготовки к предстоящей олимпиаде.
Знаете ли Вы, что абстракция через спецификацию - это прием программирования, позволяющий абстрагироваться от процесса вычислений описанных в теле процедуры, до уровня знания того, что данная процедура делает. Это достигается путем задания спецификации, описывающей эффект ее работы, после чего смысл обращения к данной процедуре становится ясным через анализ этой спецификации, а не самого тела процедуры. Мы пользуемся абстракцией через спецификацию всякий раз, когда связываем с процедурой некий комментарий, достаточно информативный для того, чтобы иметь возможность работать без анализа тела процедуры. Абстракция через спецификацию позволяет абстрагироваться от процесса вычислений описанных в теле процедуры, до уровня знания того, что данная процедура делает. Это достигается путем задания спецификации, описывающей эффект ее работы, после чего смысл обращения к данной процедуре становится ясным через анализ этой спецификации, а не самого тела процедуры. Мы пользуемся абстракцией через спецификацию всякий раз, когда связываем с процедурой некий комментарий, достаточно информативный для того, чтобы иметь возможность работать без анализа тела процедуры.