лаба по Си с использованием массивов. Лаба_2. Цель Научиться решать задачи с использованием массивов. Вариант задания
![]()
|
1 2 Цель Научиться решать задачи с использованием массивов. Вариант задания Вариант 12 Известен день недели, который приходится на 1 января текущего года. Программа должна найти все “черные вторники” и “черные пятницы” текущего года (то есть – 13 числа). Теория Массив — упорядоченный набор элементов, каждый из которых хранит одно значение, идентифицируемое с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа, а в качестве индексов выступают целые числа. В языке Си существуют статические массивы, число элементов в которых должно быть известно в момент компиляции программы, и динамические массивы, размер которых задается в процессе выполнения программы, то есть может зависеть от входных данных. Эти два типа отличаются только методом создания массива, в данной лабораторной работе рассматривались статические массивы. Способы объявления статических массивов Объявление статического массива отличается от объявления обычной переменной только указанием количества элементов массива. Например, следующее объявление означает, что именем points называется массив из 100 действительных чисел. double points[100]; Объявление массива может быть совмещено с присвоением значений его элементам. Например, double points[] = {1.0, 3.14, -1.2, 12.65}; создает массив из четырех действительных чисел с указанными значениями. В данном случае число элементов массива в квадратных скобках не указывается. Компилятор самостоятельно вычисляет длину по списку начальных значений Работа с элементами массиваДля доступа к элементу массива достаточно знать его имя и порядковый номер элемента. В языке Си элементы массива индексируются начиная с нуля, то есть в массиве из двух элементов корректными являются индексы 0 и 1. Если массив имеет имя array, то его k-й элемент записывается как array[k]. Это выражение может использоваться как для получения значения элемента массива, так и для его изменения, если оно стоит в левой части оператора присваивания. Рассмотрим для примера следующую программу. #define NPOINTS 100 int main() { double points[NPOINTS]; int k; points[0] = 0.1; for(k=1; k < NPOINTS; k++) { points[k] = 0.1 + points[k-1]; } return 0; } Эта программа заполняет массив действительных чисел значениями 0, 0.1, 0.2 и так далее. Отметим, что макропеременная NPOINTS используется как при объявлении массива, так и в качестве верхней границы цикла по всем его элементам. Если размер массива нужно будет изменить, то достаточно исправить одну строчку в программе (#define). Представление массива в памяти и адресная арифметикаВ памяти ЭВМ элементы массива записаны последовательно без пропусков. Имя массива является указателем на его начальный элемент (с индексом 0). Поскольку в массиве все элементы имеют одинаковый тип, то зная адрес начала массива (A), размер одного элемента (size) и индекс k можно вычислить адрес размещения k-ого элемента: A + k*size. Если требуется получить значение k-ого элемента массива, то достаточно выполнить одно умножение (k*size), одно сложение (A + k*size) и загрузить значение из памяти по только что вычисленному адресу. Таким образом, обращение к элементу массива очень эффективно и сложность этой операции не зависит от величины индекса k: получение (или изменение) значения нулевого элемента столь же эффективно, как и миллионного. Обратной стороной последовательно хранения элементов в памяти является сложность вставки нового значения с сохранением порядка следования элементов. Например, если в массив нужно добавить новое значение по индексу 0, то чтобы "освободить" место все элементы массива придется сдвинуть на одну позицию. Ясно, что сложность этой операции зависит от длины массива. Чем больше длина, тем дольше выполняется это действие. Анализ задачи и алгоритм Анализ задачи Входные данные: два числа, заданных пользователем. Одно указывает на день недели, выпадающий на 1 января, а второе на то, является ли год високосным. Результат: число чёрных вторников и пятниц в году. Метод решения: сформировав дополнительный массив, мы можем осуществить циклический перебор всех дней года и зафиксировать необходимые нам. Выделенные подзадачи: так как количество дней в году может варьироваться, был добавлен блок для корректировки массива под високосный год. Алгоритм решения задачи Описание программной реализации Используемые переменные M [12] – массив данных, содержащий информацию о количестве дней в каждом месяце; days – целочисленная переменная для хранения дат; start – целочисленная переменная, фиксирующая день недели; i – целочисленная переменная для счётчика месяцев в году; black – целочисленная переменная для фиксации чёрных вторников и пятниц; year - целочисленная переменная тип года. Используемые функции Для реализации построенного алгоритма на языке Си были использованы следующие стандартные функции: printf ("Input string\n") – вывод на экран; scanf_s ("%d", &a) – запись данных в переменную; if ( a > b ) {} – выполнение блока при соблюдении условия; for ( i=0 ; i<12 ; i++) {} – циклическое выполнение блока, пока соблюдается заданное условие, с последующим изменением счётчика. Пример работы программы Тест №1 Введены параметры текущего года: 12> 1 2 |