Алгоритм и структура данных. 1 Базовый процедурноориентированный алгоритмический язык
Скачать 1.16 Mb.
|
Программирование различных структур алгоритмовПрограммирование линейных структур алгоритмов. Программирование разветвляющихся структур. Программирование циклических структур алгоритмов (на примерах задач численного анализа, обработки числовых массивов, задач упорядочения компонент массивов). Программирование ввода-вывода массивов. Массив — структура данных, хранящая набор значений (элементов массива), идентифицируемых по индексу или набору индексов, принимающих целые (или приводимые к целым) значения из некоторого заданного непрерывного диапазона. Одномерный массив можно рассматривать как реализацию абстрактного типа данных — вектор. В некоторых языках программирования массив может называться также таблица, ряд, вектор, матрица. Строковые данные В информатике, строковый тип (англ. string «нить, вереница») — тип данных, значениями которого является произвольная последовательность (строка) символов алфавита. Каждая переменная такого типа (строковая переменная) может быть представлена фиксированным количеством байтов либо иметь произвольную длину. Программирование задач обработки символьных данных Управление электронными документами во многих сферах деятельности является очень важной задачей. В связи с этим VB предоставляет различные механизмы как для работы с текстовыми документами, так и для обработки их содержимого. Наиболее общим типом документов является неформатированный текстовый файл, который состоит из слов, букв, цифр и специальных символов различного назначения. Известно, что наряду с числовыми данными компьютер может хранить и обрабатывать текстовую информацию. Это, например, тексты документов MS Word, текстовые поля форм VS, текстовые поля баз данных и др. Наиболее часто используемой операцией, которая применяется, например, при упорядочивании данных, является сортировка, т. е. символьные данные сравниваются между собой. В программировании, прежде чем сравнить один символ с другим, он должен быть преобразован в число с помощью таблицы ASCII (American Standard Code for Information Interchange - Американский стандартный код для обмена информацией). Поддерживает кодирование 128 буквенно-цифровых символов. Первые 32 кода базовой таблицы, начиная с нулевого, отданы разработчикам аппаратных средств (в первую очередь производителям компьютеров и печатающих устройств). В этой области размещаются так называемые управляющие коды, которым не соответствуют никакие символы языков, и, соответственно, эти коды не выводятся ни на экран, ни на устройства печати, но используются для функций управления (например, возврата каретки или возврата на один символ). Национальные стандарты кодировочных таблиц включают международную часть кодовой таблицы без изменений, а во второй половине содержат коды национальных алфавитов, символы псевдографики и некоторые математические знаки. Начиная с кода 32 по код 127 размещены коды символов английского алфавита, знаков препинания, цифр, арифметических действий и некоторых вспомогательных символов. Базовая таблица кодировки ASCII показана в табл. 9.1-1. Функции и рекурсивные функции Необходимость использования функций Фу́нкция в программировании, или подпрограмма — фрагмент программного кода, к которому можно обратиться из другого места программы. В большинстве случаев с функцией связывается идентификатор[en], но многие языки допускают и безымянные функции. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была вызвана. При написании программ среднего и высокого уровня сложности возникает потребность в их разбиении на части. Разбиение большой программы на меньшие части позволяет уменьшить риск возникновения ошибок, повышает читабельность программного кода благодаря его структурированию. Кроме того, если некоторый программный код повторяется несколько раз (или есть близким по смыслу), то целесообразно организовать его в виде функции, которую потом можно вызывать многократно используя ее имя. Таким образом, происходит экономия памяти, уменьшение исходного кода программы, и т.п.. Функция – это часть программы, которая имеет следующие свойства или признаки: есть логически самостоятельной частью программы; имеет имя, на основании которого осуществляется вызов функции (выполнение функции). Имя функции должно соответствовать правилам создания идентификаторов языка C++; может содержать список параметров, которые передаются ей для обработки или использования. Если функция не содержит списка параметров, то такая функция называется функцией без параметров; может возвращать (не обязательно) некоторое значение. В случае, если функция не возвращает никакого значения, тогда указывается ключевое слово void; имеет собственный программный код, который расположен между фигурными скобками { }. Программный код решает задачу, поставленную на эту функцию. Программный код функции, реализованный в фигурных скобках, называется «тело функции». Использование функций в программах дает следующие преимущества: компактная организация программы путем удобного вызова программного кода по его имени, который в программе может встречаться несколько раз (повторяться); экономия памяти, размера исходного и исполнительного кода и т.д.; уменьшение риска возникновения ошибок для больших наборов кодов; повышение читабельности программного кода. Синтаксис объявления функции Общая форма описания функции выглядит следующим образом: типимя_функции(список_параметров или void) { тело_функции [return] (выражение); } где тип – тип значения, возвращаемого функцией. Если поле «тип» содержит ключевое слово void, то функция не возвращает никакого значения; имя_функции – это непосредственно имя функции. По этому имени осуществляется вызов программного кода, реализованного в теле_функции. Кроме того, имя_функции есть указателем на эту функцию. Значением указателя есть адрес точки входа в функцию; список_параметров – параметры, которые передаются в функцию. Функция может получать любое число параметров. Если описывается функция без параметров, то в скобках указывается ключевое слово void; тело_функции – набор операторов программного кода, реализующих алгоритм вычисления внутри функции; return (выражение) – ключевое слово return указывает, что функция возвращает значение заданное в (выражение). Слово return может встречаться в нескольких местах тела функции в зависимости от алгоритма (повторяться). Ключевое слово void при работе с функциями При использовании в качестве возвращаемого типа функции ключевое слово указывает, void что функция не возвращает значение. При использовании для списка параметров функции указывает, void что функция не принимает параметров. При использовании в объявлении указателя указывает, void что указатель является универсальным. Тип void — это самый простой тип данных, который означает «отсутствие любого типа данных». Следовательно, переменные не могут быть типа void:
Тип void, как правило, используется в трех случаях: Использование №1: Указать, что функция не возвращает значение:
Использование №2: Указать, что функция не имеет никаких параметров (перешло из языка Cи):
Указание типа void как «никаких параметров» является пережитком, сохранившимся еще со времен языка Cи. Следующий код равнозначен и более предпочтителен для использования в языке C++: Указатель типа void (или «общий указатель») — это специальный тип указателя, который может указывать на объекты любого типа данных! Объявляется он как обычный указатель, только вместо типа данных используется ключевое слово void:
Аргументы функции Во многих случаях нам нужно будет передавать данные в вызываемую функцию, чтобы она могла с ними как-то взаимодействовать. Например, если мы хотим написать функцию умножения двух чисел, то нам нужно каким-то образом сообщить функции, какие это будут числа. В противном случае, как она узнает, что на что перемножать? Здесь нам на помощь приходят параметры и аргументы. Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет caller (вызывающий объект). Параметры указываются при объявлении функции в круглых скобках. Если их много, то они перечисляются через запятую, например: int add(int a, int b) Аргумент функции — это значение, которое передается из caller-а в функцию и которое указывается в скобках при вызове функции в caller-е:
Обратите внимание, аргументы тоже перечисляются через запятую. Количество аргументов должно совпадать с количеством параметров, иначе компилятор выдаст сообщение об ошибке. При вызове функции, все её параметры создаются как локальные переменные, а значение каждого из аргументов копируется в соответствующий параметр (локальную переменную). Этот процесс называется передачей по значению. Например:
Передача массива в функцию Особенность передачи массивов в функции в языке Си в том, что передается не сам массив, а адрес массива, который хранится в локальном указателе на него. Это можно сделать по-разному, но результат будет одинаковый: void some_function(int array[]); void some_function(int *array); При этом обязательно нужно указать тип элемента массива. Размер массива в функцию автоматически не передается, поэтому если размер массива заранее (на этапе компиляции) не оговорен, то нужно передать параметр, который содержит количество элементов в массиве, например number_of_elements: void some_function(int array[], int number_of_elements); Следующая программа передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов: show_array.c#include void show_array (int array [], int number_of_elements) { for (int i = 0; i < number_of_elements; i++) { printf("%d\t", array[i]); } printf("\n"); } int main() { int little_numbers[5] = {1, 2, 3, 4, 5}; int big_numbers[3] = {1000, 2000, 3000}; show_array(little_numbers, 5); show_array(big_numbers, 3); } Массив просто передается в функцию по имени (а его имя — это адрес первого элемента), а также указывает параметр, который сообщает функции количество элементов, содержащихся в массиве: show_array(little_numbers, 5); Изменение массива из функцииВозможно ли поменять значения элементов из функции? Ответ положительный — да, это возможно, причем ничего дополнительно для этого указывать не нужно, так как в функцию передается адрес массива, а не сами значения, то и доступ происходит к тем же самым элементам, а не к их копиям. Следующая программа использует функцию get_values, чтобы присвоить три значения массиву numbers: values_from_keyboard.c#include void read_array(int array[], int number_of_elements) { for(int i = 0; i < number_of_elements; i++) { printf("Введите значение №%d: ", i); scanf("%d", &array[i]); } } int main() { int numbers[3] = {0, 0, 0}; read_array(numbers, 3); //массив будет изменен! printf("Значения массива\n"); for (int i = 0; i < 3; i++) { printf("numbers [%d] \n", i); } return 0; } Перегрузка функций В широком смысле перегрузка (overloading) — это возможность одновременно использовать несколько функций с одним именем. Компилятор различает их благодаря тому, что они имеют разный набор параметров. В точки вызова компилятор анализирует типы аргументов и определяет, какая конкретно функция должна быть вызвана. В русскоязычной литературе иногда можно встретить термин «совместное использование», но, похоже, он не прижился. |