Алгоритм – это понятное и точное предписание исполнителю, совершить последовательность действий направленных на достижение указанной цели, или решение поставленной задачи.
Основные понятия алгоритмизации.
Алгоритм – это понятное и точное предписание исполнителю, совершить последовательность действий направленных на достижение указанной цели, или решение поставленной задачи.
Свойства алгоритмов:
Конечность – обязательность завершения каждого из действий и всего алгоритма в целом
Дискретность – алгоритм состоит из отдельных шагов, которые называются командами
Понятность – алгоритм должен быть понятен исполнителю
Однозначность – алгоритм представляет из себя набор команд, исполняющихся однозначно, по строго определенным правилам
Результативность
Правилност
Массовость
Основные типы алгоритмов
Линейный – все действия выполняются последовательно
Ветвление – при выполнении,Э или не выполнении какого либо условия, выполняется то или инная последовательность действий
Циклический – многократное повторение действий в алгоритме при разных значений входящих в ней переменных
Комбинированый – состоящий из предыдущих типов
Служебные слова
Служебные слова представляют собой идентификаторы, имеющие специальное значение для компиляторов языков Си/С++. Их нельзя использовать как имя переменной. Ниже приведен список служебных слов языка C++:
asm case const delete dynamic cast auto catch const cast do else bool char continue double enum | protected return static template try vmion void. extern friend int explicit 32 export for Inline virtual while | new public short static_cast this typedef unsigned volatile false goto long operator register signed break default | struct throw typeid using wchar t float if xmitable private sizeof switch true typename |
Трансляторы языков Cu/C++, соответствующие требованиям стандарта ANSI, воспринимают только служебные слова, записанные строчными буквами.
Напоминаем, что не следует использовать имена объектов (идентификаторы), совпадающие со служебными словами.
Основные понятия типов данных
Тип данного указывает компилятору языка C++, сколько памяти надо выделить для размещения объекта. Кроме того, он указывает компилятору каким образом надо интерпретировать значение, содержащееся в объекте. Тип объекта указывается в определении объекта с помощью служебного слова (слов) - спецификации типа. Предусмотрено следующие основные (стандартные) типы данных:
Обычно определяют пять фундаментальных типов данных:
Char – символьный тип
Int – целое
Float – с плавающей точкой
Double – двойной точности
Void – без значения
На основе этих типов формируется другие типы данных.
Размер этих типов данных для разных процессоров и компиляторов могут быть разными. Однако объект типа char всегда занимает 1 байт, а размер объекта int обычно совпадают с размером слова в конкретной среде программирования.
Необходимо помнить что стандарт Си обуславливает только минимальный диапазон значений каждого типа данных, но не размер байта
Описание переменных
Все переменные перед использованием следует описать. Они не должны быть предварительно проинициализированы. Неинициализированные переменные содержат непредсказуемые значения.
Все переменные перед использованием следует описать. Они не должны быть предварительно проинициализированы. Неинициализированные переменные содержат непредсказуемые значения.
-Типы данных.
Описания содержат спцификатор типа, за которым следует список переменных, данного типа. Переменные в списке должны отделяться друг от друга запятыми.
-Область действия.
Местоположение описания переменной опеределяет сферу влияния переменной.
Глобальные переменные описываются вне функций. К ним можно обращаться из любого места внутри исходного файла, в котором они описаны. Они также доступны из других исходных модулей. Глобальные переменные обычно описываются в начале программного текста перед функцией main и после директив #include.
Локальные переменные описываются внутри функции и известны только в той функции, в которой они описаны.
Локальные переменные всегда описываются в начале функции перед выполняемыми операторами.
-Требования к памяти.
Ниже приведены требования к памяти для основных типов данных:
Тип Память в байтах Диапозон
Char 1 байт от -128 до 127
Int
Short 2 байта от -32,768 до 32,767
Long 4 байта от -2,147,482,648 до 2,147,482,647
Unsined
Описание констант
Восьмеричная константа состоит из обязательного нуля и одной или нескольких восьмеричных цифр (среди цифр должны отсутствовать восьмерка и девятка, так как эти цифры не входят в восьмеричную систему счисления).
Шестнадцатеричная константа начинается с обязательной последовательности 0х или 0Х и содержит одну или несколько шестнадцатеричных цифр (цифры представляющие собой набор цифр шеснадцатеричной системы счисления: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
Если требуется сформировать отрицательную целую константу, то используют знак "-" перед записью константы (который будет называться унарным минусом). Например: -0x2A, -088, -16 .
Каждой целой константе присваивается тип, определяющий преобразования, которые должны быть выполнены, если константа используется в выражениях.
Операции отношений
Равно,
!= не равно.
Логические операции
Операции присваивания
То, что присваивание в Си является операцией, а не оператором, оказывается, наверное, самой большой неожиданностью для знатоков Паскаля. А между тем это действительно так! Знак операции присваивания =. Следствием отмеченного факта является то, что присваивание, как любой другой знак операции, может несколько раз входить в выражение. Например:
а=ю=с=х+у;
Присваивание имеет самый низкий приоритет (ниже только у операции «запятая»). Кроме того, операция присваивания — правоассоциативная. Это значит, что несколько подряд расположенных присваиваний выполняются справа налево. Поэтому в приведенном выше выражении первой выполнится операция сложения, затем переменной с присвоится значение суммы, затем это значение присвоится переменной / > и в конце — переменной а. В языке Си имеются дополнительные операции присваивания, совмещающие присваивание с выполнением других операций. Среди них: +=, -=, /=, *=, %=. Приоритет у них такой же, как и у простого присваивания.
9. Операции явного преобразования типа
Применение этой операции имеет следующий формат:
(имя_типа) операнд
Результатом операции является целое число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Последняя определяется также по типу результата выражения. Хотя по форме записи это похоже на функцию, однако sizeof является именно операцией. Ее приоритет выше, чем у бинарных арифметических операций, логических операций и отношений.
Операция «запятая» и «?»
Операция «запятая». Эта необычная операция используется для связывания нескольких выражений в одно. Несколько выражений, разделенных запятыми, вычисляются последовательно слева направо. В качестве результата такого совмещенного выражения принимается значение самого правого выражения. Например, если переменная х имеет тип int , то значение выражения (х=3, 5*х) будет равно 15, а переменная х примет значение 3.
Операция «условие ?:». Это единственная операция, которая имеет три операнда. Формат операции:
Данная операция реализует алгоритмическую структуру ветвления. Алгоритм ее выполнения следующий: первым вычисляется значение выражения 1, которое обычно представляет собой некоторое условие. Если оно истинно, т. е. не равно 0, то вычисляется выражение 2 и полученный результат становится результатом операции. В противном случае в качестве результата берется значение выражения 3.
12. Операция получения адреса (&) и раскрытия ссылки(*)
Указатель — это адрес объекта в памяти. Переменная типа "указатель" (или просто переменная-указатель) — это специально объявленная переменная, в которой хранится указатель на переменную определенного типа. В языке С указатели служат мощнейшим средством создания программ и широко используются для самых разных целей. Например, с их помощью можно быстро обратиться к элементам массива или дать функции возможность модифицировать свои аргументы. Указатели широко используются для связи элементов в списках, в двоичных деревьях и в других динамических структурах данных.
Первый из них — оператор &, это унарный оператор, возвращающий адрес операнда в памяти[12]. (Унарной операцией называется операция, имеющая только один операнд.) Например, оператор
m = &count;
записывает в переменную m адрес переменной count. Этот адрес представляет собой адрес ячейки памяти компьютера, в которой размещена переменная. Адрес и значение переменной — совершенно разные понятия. Выражение "&переменная" означает "адрес переменной". Следовательно, инструкция m = &scount; означает: "Переменной m присвоить адрес, по которому расположена переменная count;".
Допустим, переменная count расположена в памяти в ячейке с адресом 2000, а ее значение равно 100. Тогда в предыдущем примере переменной m будет присвоено значение 2000.
Второй рассматриваемый оператор * является двойственным (дополняющим) по отношению к &[13]. Оператор * является унарным оператором, он возвращает значение объекта, расположенного по указанному адресу. Операндом для * служит адрес объекта (переменной). Например, если переменная m содержит адрес переменной count, то оператор
q = *m;
записывает значение переменной count в переменную q. В нашем примере переменная q получит значение 100, потому что по адресу 2000 записано число 100, причем этот адрес записан в переменной m. Выражение "* адрес" означает "по адресу". Наш фрагмент программы можно прочесть как "q получает значение, расположенное по адресу m".
К сожалению, символ операции раскрытия ссылки совпадает с символом операции умножения, а символ операции получения адреса — с символом операции поразрядного И. Необходимо помнить, что эти операторы не имеют никакого отношения друг к другу. Операторы * и & имеют более высокий приоритет, чем любая арифметическая операция, кроме унарного минуса, имеющего такой же приоритет.
Если переменная является указателем, то в объявлении перед ее именем нужно поставить символ *, он сообщит компилятору о том, что это указатель на переменную данного типа. Например, объявление указателя на переменную типа char записывается так:
char *ch;
Необходимо понимать, что ch — это не переменная типа char, а указатель на переменную данного типа, это совершенно разные вещи. Тип данных, на который указывает указатель (в данном случае это char), называется базовым типом указателя[14]. Сам указатель является переменной, содержащей адрес объекта базового типа. Компилятор учтет размер указателя в архитектуре компьютера и выделит для него необходимое количество байтов, чтобы в указатель поместился адрес. Базовый тип указателя определяет тип объекта, хранящегося по этому адресу.
В одном операторе объявления можно одновременно объявить и указатель, и переменную, не являющуюся указателем. Например, оператор
int x, *y, count;
Директива #define
Директива #define определяет идентификатор и последовательность символов, которая будет подставляться вместо идентификатора каждый раз, когда он встретится в исходном файле. Идентификатор называется именем макроса, а сам процесс замены — макрозаменой[1]. В общем виде директива выглядит таким образом:
#define имя_макроса последовательность_символов
Обратите внимание, что в этом выражении нет точки с запятой. Между идентификатором и последовательностью символов последовательность_символов может быть любое количество пробелов, но признаком конца последовательности символов может быть только разделитель строк.
Предположим, например, что вместо значения 1 нужно использовать слово LEFT (левый), а вместо значения 0 — слово RIGHT (правый). Тогда можно сделать следующие объявления с помощью директивы #define:
#define LEFT 1
#define RIGHT 0
В результате компилятор будет подставлять 1 или 0 каждый раз, когда в вашем файле исходного кода встречается идентификатор соответственно LEFT или RIGHT. Например, следующий код выводит на экран 0 1 2:
printf("%d %d %d", RIGHT, LEFT, LEFT+1);
После определения имя макроса можно использовать в определениях других имен макросов. Вот, например, код, определяющий значения ONE (один), TWO (два) и three (три):
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
Макроподстановка — это просто замена какого-либо идентификатора связанной с ним последовательностью символов. Поэтому если требуется определить стандартное сообщение об ошибке, то можно написать примерно следующее:
#define E_MS "стандартная ошибка при вводе\n"
/* ... */
printf(E_MS);
Теперь каждый раз, когда встретится идентификатор E_MS, компилятор будет его заменять строкой "стандартная ошибка при вводе\n". Для компилятора выражение printf() на самом деле будет выглядеть таким образом:
printf("стандартная ошибка при вводе\n");
Если идентификатор находится внутри строки, заключенной в кавычки, то замены не будет. Например, при выполнении кода
#define XYZ это проверка
printf("XYZ");
Программисты, пишущие программы на языке С, в именах определяемых идентификаторов часто используют буквы верхнего регистра. Если разработчики программ следуют этому правилу, то тот, кто будет читать их программу, с первого взгляда поймет, что будет происходить макрозамена. Кроме того, все директивы #define обычно лучше всего помещать в самом начале файла или в отдельном заголовочном файле, а не разбрасывать по всей программе.
Имена макросов часто используются для определения имен так называемых "магических чисел" (встречающихся в программе). Например, имеется программа, в которой определяется массив и несколько процедур, получающих доступ к этому массиву. Вместо того чтобы размер массива "зашивать в код" в виде константы, этот размер можно определить с помощью оператора #define, а затем использовать это имя макроса везде, где требуется размер массива. Таким образом, если требуется изменить этот размер, то потребуется изменить только соответствующий оператор#define, a затем перекомпилировать программу. Рассмотрим, например, фрагмент программы
#define MAX_SIZE 100
/* ... */
float balance[MAX_SIZE];
/* ... */
for(i=0; i<MAX_SIZE; i++) printf("%f", balance[i]);
/* ... */
for(i=0; i<MAX_SIZE; i++) x =+ balance[i];
Размер массива balance определяется именем макроса MAX_SIZE, и поэтому если этот размер потребуется в будущем изменить, то надо будет изменить только определение MAX_SIZE. В результате при перекомпиляции программы все обращения к этому имени макроса, находящиеся после измененного определения, будут автоматически изменены.
Директива #include
Директива #include дает указание компилятору читать еще один исходный файл — в дополнение к тому файлу, в котором находится сама эта директива. Имя исходного файла должно быть заключено в двойные кавычки или в угловые скобки. Например, обе директивы
#include "stdio.h"
#include <stdio.h>
Файлы, имена которых находятся в директивах #include, могут в свою очередь содержать другие директивы #include. Они называются вложенными директивами #include. Количество допустимых уровней вложенности у разных компиляторов может быть разным. Однако в стандарте С89 предусмотрено, что компиляторы должны допускать не менее 8 таких уровней. А в стандарте С99 предусмотрена поддержка не менее 15 уровней вложенности.
Способ поиска файла зависит от того, заключено ли его имя в двойные кавычки или же в угловые скобки. Если имя заключено в угловые скобки, то поиск файла проводится тем способом, который определен в компиляторе. Часто это означает поиск определенного каталога, специально предназначенного для хранения таких файлов. Если имя заключено в кавычки, то поиск файла проводится другим способом. Во многих компиляторах это означает поиск файла в текущем рабочем каталоге. Если же файл не найден, то поиск повторяется уже так, как будто имя файла заключено в угловые скобки.
Обычно большинство программистов имена стандартных заголовочных файлов заключают в угловые скобки. А использование кавычек обычно приберегается для имен специальных файлов, относящихся к конкретной программе. Впрочем, твердого и простого правила, по которому кавычки требуется использовать именно таким образом, не существует.
В С-программе директиву #include можно использовать не только для указания имени файла, содержащего обычный исходный текст программы, но и для указания заголовка. В языке С определен набор стандартных заголовков, содержащих необходимую информацию о различных библиотеках этого языка. Заголовок — это стандартный идентификатор, который может соответствовать имени файла, а может и не соответствовать ему. Таким образом, заголовок является просто абстракцией, которая гарантирует наличие некоторой информации. Однако на практике в языке С заголовки почти всегда являются именами файлов.
Структура программы
Все программы на языке СИ содержат директивы препроцессора, описания, определения, выражения, операторы и функции.
-Директива препроцессора.
Директива препроцессора-это команда препроцессора языка СИ (который автоматически вызывается на первом шаге компиляции программы). Две наимболее общих директивы препроцессора-это директива #define, которая подставляет текст вместо заданного идентификатора, и директива #include, которая включает в программу текст внешнего файла.
-Описания.
Описание устанавливает имена и атрибуты переменных, функций и типов, используемых в программе. Глобальные переменные описываются вне функций и действуют от конца описания до конца файла. Локальная переменная описывается внутри функции и действует от конца описания до конца функции.
-Определение.
Функция-это набор описаний, определений, выражений и операторов, которое выполняет определенную задачу. Тело функции заключено в фигурные скобки. В языке СИ функции могут быть вложены друг в друга. -Функция main (главная).
Main()
{ /* начало функйии main и программы */
int_radius squared; /* локальное описание */
int radius = 3; /* описание и инициализация */
radius_squared = square (radius); /* передача значения функции */
area = PI * radius_squared; /* оператор присваивания */
printf ("area: %6.2f\n", area);
} /* конец функции main и программы */
square (r) /* заголовок функции */
int r_squared; /* описания, известные только */
/* для функции square */
r_squared = r * r;
return (r_squared); /* возврат значения в вызывающее выражение */
}
Потоки ввода-вывода
Библиотека обеспечивает программиста механизмами для извлечения данных из потоков и для помещения данных в потоки. Каждый поток (за исключением строковых) ассоциируется при помощи операционной системы с определенным внешним устройством. При обмене с потоком используется вспомогательный участок памяти, называемый буфером потока. При вводе данных они сначала помещаются в буфер и только затем передаются выполняемой программе. При выводе — данные заполняют буфер перед передачей внешнему устройству. Заполнение и очистку буферов операционная система выполняет без явного участия программиста, поэтому поток в прикладной программе можно рассматривать как последовательность байтов, не зависящую от конкретных устройств, с которыми ведется обмен данными.
Все потоки библиотеки последовательные, т.е. в каждый момент для потока определены позиции записи и (или) чтения, которые после обмена перемещаются по потоку на длину переданной порции данных.
В зависимости от реализуемого направления передачи данных потоки делят на три группы:
· входные, из которых читается информация;
· выходные, в которые вводятся данные;
· двунаправленные, допускающие как чтение, так и запись.
В соответствии с особенностями обслуживаемого устройства потоки принято делить на следующие группы:
· стандартные, для передачи данных от клавиатуры и к дисплею (во всех предыдущих программах использовались потоки данной группы);
· файловые, при размещении данных на внешнем носителе (например, диск, магнитная лента);
· строковые, позволяющие размещать данные потока в памяти (символьный массив или строка) и пользоваться при этом всеми средствами, предоставляемыми библиотекой потоков (например, форматный ввод-вывод данных).
Условный оператор
Оператор if используется для того, чтобы определить действия программы при различных условиях. Например у нас есть число. И если оно четное нам нужно его удвоить, а иначе разделить пополам. Для написания подобной программы и используется оператор if.
В самой простой вариации он будет иметь следующую форму
?
if(<условие>) <действие>; |
В этом случае если условие выполняется , то программа совершит некоторое действие. Например:
?
if(a == 2) cout << a; |
Здесь мы видим, что если некоторая переменная a станет равной 2, то программа её выведет. Для сравнения числа с 2 мы используем двойное равно ==. В С++ двойное равно == используется для любых сравнительных операций. А чтобы проверить переменную на неравенство какому-либо числу надо написать !=.
?
if(a != 2) cout << a; |
В таком варианте программа выведет a, только если a не равно 2.
Теперь поговорим о более сложных вариациях оператора if.
Что если мы захотим при невыполнении основного условия сделать что-нибудь другое? Для этого используется структура if() ; else ;
Например:
?
if(a == 2) cout << a; else cout << 0; |
Здесь, если число равно 2, то программа его выведет, а иначе выведет 0.
А что если при невыполнении первого условия нам нужно проверять еще что-то? Приведем пример из жизни. Если на улице солнечно то мы можем одеть футболку. А если нет? То мы еще должны посмотреть на улице просто пасмурно, или идет дождь, или может даже снег. Для подобных ситуаций в программировании мы можем использовать структуру
if() ; else if() ; else ;
?
if(a > 100) cout << 3; else if(a > 50) cout << 2; else if(a >= 0) cout << 1; else cout << 0; |
Здесь, если a больше 100 то программа выведет 3, а иначе будет смотреть другие варианты. Если число больше 50, то выведет 2, больше или равно 0 выведет 1, а если число отрицательно выведет 0.
Примечание:
-Любое условие в С++ заключается в круглые скобки()
-Для сравнения переменных используются сравнительные символы >, <, ==, != (больше, меньше, равно, не равно)
-перед else всегда ставится точка с запятой
Оператор выбора.
Условный оператор позволяет выбрать в зависимости от значений предохранителей, являющихся логическими выражениями, одну из нескольких последовательностей операторов, образующих альтернативные варианты.
CaseStatement = case Expression of Case {"|" Case} [else StatementSequence] end.
Case = [CaseLabelList ":" StatementSequence].
CaseLabelList = CaseLabels {"," CaseLabels}.
CaseLabels = ConstExpression [".." ConstExpression].
В операторе выбора также допускается несколько вариантов (альтернативных последовательностей операторов). При этом с каждым вариантом связывается свой (отличный от других) элемент разбиения всех возможных значений условия на непустые (попарно не пересекающиеся) подмножества так называемых меток вариантов. Условие должно быть целого типа, литерного типа или типа перечисления (см. гл. 4). При выполнении оператора выбора условие осуществляет выбор варианта -- выполняется тот альтернативный оператор, среди меток вариантов которого есть константа, совпадающая с текущим значением условия (если такой метки не окажется, то фиксируется ошибка в программе).
Например, оператор выбора
case X of
'=' : K:=0
|'*', ' + ' : K:=1
|'-' : K:=2
else K:=3
end
Равносилен оператору
if X = ' = ' then K := 0
elsif (X = '*') or (X = '+') then K := 1
elsif X = '-' then K := 2
else K:=3
end.
Цикл с предусловием
Цикл while ("пока") с предусловием
Цикл while с предусловием позволяет выполнить одну и ту же последовательность действий пока проверяемое условие истинно. При этом условие записывается до тела цикла и проверяется до выполнения тела цикла.
При выполнении цикла while сначала проверяется условие. Если оно ложно, то цикл не выполняется и управление передается на следующую инструкцию после тела цикла while. Если условие истинно, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, работа цикла завершится и управление передастся следующей инструкции после цикла.
Синтаксис цикла while ("пока") c предусловием такой:
While (условие)
{
Блок инструкций
}
Следующий фрагмент программы напечатает на экран квадраты всех целых чисел от 1 до 10:
int i=1;
while (i<=10)
{
cout<<i*i<<endl;
++i;
}
В этом примере переменная i внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i будет равно 11, поскольку именно при i==11 условие i<=10 впервые перестанет выполняться.
В следующем примере цикл используется для того, чтобы найти количество знаков в десятичной записи целочисленной переменной i.
int Ndigits=0;
while(n!=0)
{
Ndigits=Ndigits+1;
n=n/10;
}
Внутри цикла значение переменной n уменьшается в 10 раз до тех пор, пока она не станет равна 0. Уменьшение целочисленной переменной в 10 раз (с использованием целочисленного деления) эквивалентно отбрасыванию последней цифры этой переменной.Цикл while с предусловием позволяет выполнить одну и ту же последовательность действий пока проверяемое условие истинно. При этом условие записывается до тела цикла и проверяется до выполнения тела цикла.
При выполнении цикла while сначала проверяется условие. Если оно ложно, то цикл не выполняется и управление передается на следующую инструкцию после тела цикла while. Если условие истинно, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, работа цикла завершится и управление передастся следующей инструкции после цикла.
Синтаксис цикла while ("пока") c предусловием такой:
while (условие)
{
блок инструкций
}
Следующий фрагмент программы напечатает на экран квадраты всех целых чисел от 1 до 10:
int i=1;
while (i<=10)
{
cout<<i*i<<endl;
++i;
}
В этом примере переменная i внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i будет равно 11, поскольку именно при i==11 условие i<=10 впервые перестанет выполняться.
В следующем примере цикл используется для того, чтобы найти количество знаков в десятичной записи целочисленной переменной i.
int Ndigits=0;
while(n!=0)
{
Ndigits=Ndigits+1;
n=n/10;
}
Внутри цикла значение переменной n уменьшается в 10 раз до тех пор, пока она не станет равна 0. Уменьшение целочисленной переменной в 10 раз (с использованием целочисленного деления) эквивалентно отбрасыванию последней цифры этой переменной.
Цикл с постусовием
Цикл "пока" с постусловием отличается от цикла с предусловием тем, что сначала выполняется блок цикла, а потом проверяется условие. Если условие истинно, то цикл будет выполнен еще раз, и так до тех пор, пока условие будет истинно. Синтаксис цикла с постусловием такой (обратите внимание на обязательную точку с запятой после условия):
do
{
Блок инструкций
}
while (условие);
Поскольку условие проверяется после выполнения тела цикла, то блок цикла с постусловием всегда будет выполнен хотя бы один раз, независимо от истинности условия. Это может привести к ошибкам, поэтому использовать цикл while с постусловием следует только тогда, когда это действительно упрощает алгоритм.
Цикл с параметром
Цикл с параметром [for]
fo Цикл с параметром [for]
Void main()
{ int i, Summa ,n;
cout<<’\n’<<»Сколько целых элементов надо сложить? «;
cin>>n;
Summa=0;
for (i=1;i<=n;i++)
Summa+=i;
cout<<’\n’<<»Сумма: «<<Summa;}r (выражение Цикл с параметром [for]
Void main()
{ int i, Summa ,n;
cout<<’\n’<<»Сколько целых элементов надо сложить? «;
cin>>n;
Summa=0;
for (i=1;i<=n;i++)
Summa+=i;
cout<<’\n’<<»Сумма: «<<Summa;} 1; выражение 2; выражение 3)
оператор;
Выражение 1 – для инициализации параметра (вычисляется только один раз перед началом выполнения цикла)
Выражение 2 – для проверки условия окончания цикла (выполняется перед каждым шагом цикла)
Выражение 3 – для модификации параметра (вычисляется в конце каждого выполнения тела цикла, используется для коррекции значения параметра цикла)
Пример вычисления суммы n целых чисел:
#include <iostream.h>
void main()
{ int i, Summa ,n;
cout<<’\n’<<»Сколько целых элементов надо сложить? «;
cin>>n;
Summa=0;
for (i=1;i<=n;i++)
Summa+=i;
cout<<’\n’<<»Сумма: «<<Summa;}
Оператор continue
Оператор continue, как и оператор break, используется только внутри операторов цикла, но в отличие от него выполнение программы продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного оператора. Формат оператора следующий:
continue;
Пример:
int main() { int a,b; for (a=1,b=0; a<100; b+="a,a++)" { if (b%2) continue; ... /* обработка четных сумм */ } return 0; }
Оператор Goto
Использование оператора безусловного перехода goto в практике программирования на языке программирования С настоятельно не рекомендуется, так как он затрудняет понимание программ и возможность их модификаций.
Формат этого оператора следующий:
goto имя-метки; ... имя-метки: оператор;
Оператор goto передает управление на оператор, помеченный меткой имя-метки. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной, т.е. одно имя-метки не может быть использовано для разных операторов программы. Имя-метки - это идентификатор.
Любой оператор в составном операторе может иметь свою метку. Используя оператор goto, можно передавать управление внутрь составного оператора. Но нужно быть осторожным при входе в составной оператор, содержащий объявления переменных с инициализацией, так как объявления располагаются перед выполняемыми операторами и значения объявленных переменных при таком переходе будут не определены.
Определение функции
Определение функции состоит из двух частей: заголовка и тела. Заголовок определяет имя функции, ее тип и формальные параметры, тело определяет действия над данными, выполняемые функцией. Возращающее функцией значение передается в вызывающюю программу опрератором return (выражение). Значение "выражения" и есть результат функции (возращаемого значения). Если в нашей программе функция физически следует за вызывающей ее функцией main, то надо в последней объявить функцию внешней с помощью описателя extern: extern int fun(); или еще проще int fun();. В противном случае при компиляции будет выдана ошибка. Всякая функция имеет вид:
[тип] имя([список формальных параметров]) описания формальных параметров; { описания; операторы; } |
Здесь квадратные скобки указываютя, что заключенная в них конструкция может отсутствовать. По умолчанию тип функции целый. Описание формальных параметров расположено между списком параметров и левой скобкой. Каждое описание заканчивается точкой с запятой. Формальные параметры функции полностью локализированы в ней и недоступны для других функций. Аргументы функции передаются по значению, а не их адреса.
Прототип функции
Прототипом функции в языке Си или C++ называется объявление функции, которое не содержит тело функции, но указывает имя функции, арность, типы аргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса.
В прототипе имена аргументов являются необязательными, тем не менее, необходимо указывать тип вместе со всеми модификаторами (например, указатель ли это или константный аргумент).
В качестве примера, рассмотрим следующий прототип функции:
int foo(int n);
Этот прототип объявляет функцию с именем «foo», которая принимает один аргумент «n» целого типа и возвращает целое число. Определение функции может располагаться где угодно в программе, но определение требуется только в случае её использования.
Для обеспечения возможности контроля компилятором типов данных языка Си используются сопровождающие эту библиотеку include-файлы. Кроме определений и объявлений библиотечных функций как макро include-файлы содержат объявления функций со списками типов аргументов. Списки типов аргументов дают возможность компилятору контролировать обращение к библиотечным функциям. Это может быть полезным для обнаружения ошибок в программе, возникающих в результате несоответствия между типами фактических и формальных аргументов функций. Однако можно не использовать контроль типов аргументов.
К списку стандартных include-файлов библиотеки Си могут
быть добавлены новые include-файлы, содержащие списки типов аргументов для всех функций библиотеки Си.
Вызов библиотек СИ
Вызов Библиотек языка СИ Прежде чем вызвать процедуру библиотеки Си из программы
пользователя, нужно ее объявить в этой программе. Все библиотеч-
ные проце<