Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Краткие сведения о написании и использовании пользовательских подпрограмм




Пример 3.

Пример 2.

Пример 1.

Следует отметить, что в среде Microsoft Visual Studio 6.0 единственное ограничение при описании переменных - их суммарный объем (глобальных или локальных для функции) не может быть более 4Гб.

Краткие сведения о типе данных массив и работе с ним.

Теоретическая часть.

Лабораторная работа №3.

Остановки процесса проверки, если для проверяемого числа найден хотя бы один делитель, отличный от 1 и от самого числа.

Отсутствия деления проверяемого числа на 1 и на само себя.

Рекомендации по выполнению лабораторной работы.

Оптимизация алгоритма решаемой задачи производится за счет:

§ уменьшения количества перебираемых чисел (на основании того, что данное число НЕ МОЖЕТ БЫТЬ простым);

§ уменьшения количества делителей, используемых для определения того простое ли число;

 

 


Цель работы: Изучить тип данных массив и основные приемы для работы с переменными этого типа. Изучить синтаксис написание подпрограмм. Научиться применять тип данных массив и подпрограммы при написании программ.

 

 

Массив – это структурированной тип данных, который представляет собой совокупность однотипных элементов. На языке C++ тип данных массив описывается следующим образом:

 

typedef тип_дан_элемента Имя_типа [кол-во элементов массива];

 

где тип_дан_элемента – тип данных элемента массива. При этом нумерация элементов всегда идет от 0 до количества элементов – 1. Количество элементов должно быть натуральным числом и может быть задано непосредственно числовым значением, через макроопределение (директива #define) и с использованием немодифицируемой переменной (описанная с ключевым словом const).

Это общий вид описания типа данных одномерного массива (эквивалентен математическому понятию «вектор»), но количество размерностей массива может быть 2 (эквивалентно математическому понятию «матрица»), 3 и т.д. В таком случае в описании для каждого измерения идет количество элементов в квадратных скобках, например:

typedef int CubeType[3][3][3];

Таким образом был описан тип данных 3-ехмерного массива с базовым типом данных int (тип данных элемента), в котором в каждом измерении 3 элемента, следовательно, итоговое количество элементов в массивах такого типа будет равно 3*3*3 = 27 и переменные такого типа будут занимать 27 * 4 (размер типа int) = 108 байт.

Примеры описания массивов:

 

typedef int ArType[12];

ArType A1, A2;

char B[5], C[5];

 

В примере 1 описан тип данных ArType и переменные этого типа A1 и A2. Этот массив имеет 12 элементов, а каждая из переменных A1 и A2 занимает, соответственно, 12*4 = 48 байт. Также описаны переменные B и C, которые являются массивами символов (char) из 5 элементов. Таким образом, описание массивов допускается сразу при описании переменных (хотя для повышения читабельности программы и упрощения ее модификации рекомендуется описывать пользовательские типы).

Для массивов в целом недопустимо применение операторов присваивания, сравнения, арифметических, побитовых и логических.

Следует отметить, что при описании переменных типа массив можно сразу задавать начальные значения для элементов (для переменных с классом памяти auto - они по умолчанию не определены), как это показано в примере 2.

 

#define N 5

typedef int ArType[N];

ArType A1 = {1, 2, 3, 4, 5}, A2 = {11, 12, 13};

float F2[3] = {1.0, 2.234, 5.321}, F3;

char c1[5] = {’a’, ’b’, ’c’, ’d’, ’e’}, c2[5] = ”abcd”;

 

В примере 2 для массива F2 заданы начальные значения элементов, а для массива F3 - нет, что также допустимо. Следует обратить внимание, что в массиве A2 заданы значения только для первых 3-ех элементов. Остальные элементы получат значение 0 соответствующего типа данных. При работе с массивами символов следует обратить внимание, что их инициализация может проходить как по общим правилам (массив c1 в примере 2), так и с помощью строковой константы (массив c2 в примере 2). При этом в случае необходимости использовать массив символов как строку нужно обеспечить, чтобы среди символов массива был символ с ASCII кодом 0 (признак окончания строки). В противном случае стандартные функции по работе со строками не смогут корректно определить конец строки.

При работе с массивами нельзя использовать номера индексов, которые для данного массива не существуют: отрицательные или большие либо равные количеству элементов массива. Для статических (когда память под переменную выделяется в процессе компиляции) массивов такое обращение может и не вызвать явной ошибки при работе с программой (может и не произойти аварийного останова программу с сообщением об ошибке типа «Программа выполнила недопустимую операцию… Обратитесь к разработчику»). Однако в результате обращения к элементам по несуществующим индексам могут быть повреждены соседние с массивом данные, что может привести к неконтролируемой работе программы.

Рассмотрим простой пример работы с массивами: пусть требуется написать программу, которая выводит на экран сумму всех нечетных элементов массива. Элементы массива вводятся с клавиатуры.

 

#include <stdio.h>

int main()

{

#define N 5

typedef unsigned char basetype;

typedef basetype ArNum[N];

ArNum Numbers;

printf ("Enter %i integer number >=0 and <= 255\n", N);

for (int i = 0, Sum = 0; i < N; i++)

{

printf("Enter element number %i: ", i + 1);

scanf("%hu", &Numbers[i]);

if (Numbers[i] & 1)

Sum += Numbers[i];

}

printf("The sum of even elements of array is %u\n", Sum);

return 0;

}

 

Следует обратить внимание на то, что:

1. Для получения доступа к определенному элементу массива необходимо указать переменную типа массив, после которой в квадратных скобках указывается выражение, при вычислении которого получается нужный индекс. Индексом также может быть значение переменной, целочисленная константа или выражение.

2. В результате вычисления значения выражения Numbers[i] & 1 производится побитовая операция «и» над значением текущего элемента массива и 1. В результате выполнения этой операции все биты, кроме последнего, всегда будут равны 0. Значение последнего бита будет 1 для нечетного числа (т.к. единица в самом младшем бите двоичного представления числа означает, что при его разложении на сумму степеней двойки в ней будет присутствовать слагаемое , что однозначно показывает на нечетность числа), и 0 – для четного.

 

При работе с массивами в некоторых случаях удобно использовать следующие функции. Их прототипы описаны следующим образом:

1. void *memmove(void *dest, const void *src, size_t count). Эта функция копирует из источника (src) в приемник (dest) count байт (тип данных size_t эквивалентен unsigned int), причем src и dest являются бестиповыми указателями, поэтому в качестве них можно использовать адреса любые массивов и классов (class, struct, union). Если при копировании произойдет частичное наложение областей памяти источника и приемника, то эта функция гарантировано обеспечивает считывание данных из этой области перед записью в нее новой информации. Функция возвращает указатель на dest. Для использования этой функции необходимо подключить файл string.h. Например, для массивов B и C из примера 1 можно с помощью следующего вызова этой функции выполнить копирование 4-ех элементов (со 1-ого по 4-ый, т.к. нумерация начинается от нуля) из массива C в массив B (на место элементов 0-3):

memmove(&B[1], C, 4);

еще один пример:

memmove(B + 1, B, 4);

копирование 4-ех элементов (со 1-ого по 4-ый) из массива B в массив B (на место элементов 0-3):

2. void *memcpy(void *dest, const void *src, size_t count). Работает аналогично memmove. Отличия: не гарантирует правильной работы в случае частичного наложения областей памяти источника и приемника; функцию также можно использовать при подключении memory.h.

3. void *memset(void *dest, int c, size_t count). Эта функция заполняет в приемнике (dest), который является, как и для предыдущих функций, бестиповым указателем, count байт значением c. Функция возвращает указатель на dest. Для использования этой функции необходимо подключить файл string.h или memory.h. Например, можно заполнить символом ‘0’ все элементы массива B из примера 1 следующим вызовом этой функции:

memset(B, ’0’, 5);

 

 

В языке C++ существует возможность создавать подпрограммы. Подпрограммы – это часть основной программы, которая решает одну из подзадач и может быть многократно использована (вызвана) в теле основной программы.

Программы, написанные на C++, в отличие от языка Паскаль, могут использовать только один вид подпрограмм: функции. Однако, можно написать функцию, которая не будет возвращать значение через свое имя (тип возвращаемого значения - void).

Функция имеет имя и необязательный список аргументов. Описание заголовка функции может быть отделено от написания тела функции (на самом деле перед описанием тела функции необходимо будет повторить описание заголовка). Такая необходимость возникает в случае, когда, например, в функции func1 вызывается функция func2, а в функции func2 - func1. Описывать функции (заголовок и тело) внутри тела функции запрещено.

Общий вид (с некоторыми сокращениями) описания заголовка (прототипа) функции:

inline тип_возвр_значения <имя функции>(Type1 Var1, Type2 Var2, …, TypeN VarN);




Поделиться с друзьями:


Дата добавления: 2017-01-14; Просмотров: 784; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.