Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
алгоритмы.rtf
Скачиваний:
2
Добавлен:
31.07.2019
Размер:
188.8 Кб
Скачать

15. Директива #include

Директива #include дает указание компилятору читать еще один исходный файл — в дополнение к тому файлу, в котором находится сама эта директива. Имя исходного файла должно быть заключено в двойные кавычки или в угловые скобки. Например, обе директивы

#include "stdio.h"

#include<stdio.h>

дают компилятору указание читать и компилировать заголовок для библиотечных функций системы ввода/вывода.

Файлы, имена которых находятся в директивах #include, могут в свою очередь содержать другие директивы #include. Они называются вложенными директивами #include. Количество допустимых уровней вложенности у разных компиляторов может быть разным. Однако в стандарте С89 предусмотрено, что компиляторы должны допускать не менее 8 таких уровней. А в стандарте С99 предусмотрена поддержка не менее 15 уровней вложенности.

Способ поиска файла зависит от того, заключено ли его имя в двойные кавычки или же в угловые скобки. Если имя заключено в угловые скобки, то поиск файла проводится тем способом, который определен в компиляторе. Часто это означает поиск определенного каталога, специально предназначенного для хранения таких файлов. Если имя заключено в кавычки, то поиск файла проводится другим способом. Во многих компиляторах это означает поиск файла в текущем рабочем каталоге. Если же файл не найден, то поиск повторяется уже так, как будто имя файла заключено в угловые скобки.

Обычно большинство программистов имена стандартных заголовочных файлов заключают в угловые скобки. А использование кавычек обычно приберегается для имен специальных файлов, относящихся к конкретной программе. Впрочем, твердого и простого правила, по которому кавычки требуется использовать именно таким образом, не существует.

В С-программе директиву #include можно использовать не только для указания имени файла, содержащего обычный исходный текст программы, но и для указания заголовка. В языке С определен набор стандартных заголовков, содержащих необходимую информацию о различных библиотеках этого языка. Заголовок — это стандартный идентификатор, который может соответствовать имени файла, а может и не соответствовать ему. Таким образом, заголовок является просто абстракцией, которая гарантирует наличие некоторой информации. Однако на практике в языке С заголовки почти всегда являются именами файлов.

16. Структура программы

Все программы на языке СИ содержат директивы препроцессора, описания, определения, выражения, операторы и функции.

-Директива препроцессора.

Директива препроцессора-это команда препроцессора языка СИ (который автоматически вызывается на первом шаге компиляции программы). Две наимболее общих директивы препроцессора-это директива #define, которая подставляет текст вместо заданного идентификатора, и директива #include, которая включает в программу текст внешнего файла.

-Описания.

Описание устанавливает имена и атрибуты переменных, функций и типов, используемых в программе. Глобальные переменные описываются вне функций и действуют от конца описания до конца файла. Локальная переменная описывается внутри функции и действует от конца описания до конца функции.

-Определение.

Определение устанавливает содержимое переменной или функции. Опеределение также отводит память, требуемую для переменных и фунций. -Выражение.

Выражение-это комбинация операций и операндов, которое принимает единственное значение.

-Оператор.

Операторы управляют порядком выполнения программы на языке СИ. -Функция.

Функция-это набор описаний, определений, выражений и операторов, которое выполняет определенную задачу. Тело функции заключено в фигурные скобки. В языке СИ функции могут быть вложены друг в друга. -Функция main (главная).

Все программы на языке СИ, там где начинается выполнение программы, имеют функцию с именем main. Фигурные скобки, в которые заключено тело функции main, определяют начало и конец программы.

-Пример: Основная структура СИ-программы.

/* директивы препроцессора */

#include<stdio.h> /* подключение стандартного заголовочного

файла СИ */

#define PI 3.14 /* определение символьной константы */

floatarea; /* глобальное описание */

intsquare (int); /* прототип функции */

main()

{ /* начало функйииmain и программы */

int_radiussquared; /* локальное описание */

intradius = 3; /* описание и инициализация */

radius_squared = square (radius); /* передача значения функции */

area = PI * radius_squared; /* оператор присваивания */

printf ("area: %6.2f\n", area);

} /* конец функции main и программы */

square (r) /* заголовок функции */

intr_squared; /* описания, известные только */

/* для функции square */

r_squared = r * r;

return (r_squared); /* возврат значения в вызывающее выражение */

}

17. Форматированный вывод на экран. Форматированный ввод с клавиатуры

Для организации ввода-вывода в Си++ можно использовать средства языка Си (conio. h). Однако в Си++ существует стандартная библиотека классов, ориентированная на организацию потокового ввода-вывода. Классы ввода-вывода образуют иерархию по принципу наследования. Базовым в этой иерархии является класс io s (исключение составляют лишь классы буферизированных потоков). В классе ios объединены базовые данные и методы для ввода-вывода. Прямыми потомками класса ios являются классы istream и ostream. Класс istream — это класс входных потоков; ostream — класс выходных потоков. Потомком этих двух классов является iostream — класс двунаправленных потоков ввода-вывода. С этим классом мы уже много раз имели дело, подключая его к программам с помощью головного файла iostream.h .Объект cout принадлежит к классу ostream и представляет собой поток вывода, связанный с дисплеем. Объект cin принадлежит классу istream и является потоком ввода, связанным с клавиатурой. Оба эти объекта наследуются классом iostream. Знак << обозначает перегруженную операцию вставки символов в поток вывода cout , a >> — знак операции извлечения из потока ввода cin. Для организации форматированного потокового ввода-вывода в Си++ существуют два средства:

• применение функций-членов класса ios для управления фла­гами форматирования;

• применение функций-манипуляторов.

18. Потоковый ввод – вывод в C++

Библиотека потоков C++ предоставляет набор классов для управления вводом-выводом. Непосредственно в язык C++ (как и в язык Си) средства ввода-вывода не входят. В программах часто используется препроцессорная директива

#include<iostream.h>

Назначение указанного в директиве заголовочного файла — связать компилируемую программу с одной из основных частей библиотеки ввода-вывода, построенной на основе механизма классов. Эта библиотека почти стандартная, так как включена практически во все компиляторы C++. Однако о стандарте здесь можно говорить только неформально: библиотека создана после появления языка. Она разрабатывалась в некотором смыс­ле независимо от создания языка, не входит в формальное опи­сание языка и написана на языке C++.

Потоки ввода-вывода

Библиотека обеспечивает программиста механизмами для извлечения данных из потоков и для помещения данных в пото­ки. Каждый поток (за исключением строковых) ассоциируется при помощи операционной системы с определенным внешним устройством. При обмене с потоком используется вспомогатель­ный участок памяти, называемый буфером потока. При вводе данных они сначала помещаются в буфер и только затем переда­ются выполняемой программе. При выводе — данные заполня­ют буфер перед передачей внешнему устройству. Заполнение и очистку буферов операционная система выполняет без явного участия программиста, поэтому поток в прикладной программе можно рассматривать как последовательность байтов, не зави­сящую от конкретных устройств, с которыми ведется обмен данными.

Все потоки библиотеки последовательные, т.е. в каждый момент для потока определены позиции записи и (или) чтения, которые после обмена перемещаются по потоку на длину пере­данной порции данных.

В зависимости от реализуемого направления передачи дан­ных потоки делят на три группы:

· входные, из которых читается информация;

· выходные, в которые вводятся данные;

· двунаправленные, допускающие как чтение, так и запись.

В соответствии с особенностями обслуживаемого устройст­ва потоки принято делить на следующие группы:

· стандартные, для передачи данных от клавиатуры и к дис­плею (во всех предыдущих программах использовались по­токи данной группы);

· файловые, при размещении данных на внешнем носителе (например, диск, магнитная лента);

· строковые, позволяющие размещать данные потока в памяти (символьный массив или строка) и пользоваться при этом всеми средствами, предоставляемыми библиотекой потоков (например, форматный ввод-вывод данных).

19. Условный оператор

Оператор if используется для того, чтобы определить действия программы при различных условиях. Например у нас есть число. И если оно четное нам нужно его удвоить, а иначе разделить пополам. Для написания подобной программы и используется оператор if.

В самой простой вариации он будет иметь следующую форму

?

1

2 if(<условие>) <действие>;

В этом случае если условие выполняется , то программа совершит некоторое действие. Например:

?

1

2 if(a == 2) cout<< a;

Здесь мы видим, что если некоторая переменная a станет равной 2, то программа её выведет. Для сравнения числа с 2 мы используем двойное равно ==. В С++ двойное равно == используется для любых сравнительных операций. А чтобы проверить переменную на неравенство какому-либо числу надо написать !=. 

?

1

2 if(a != 2) cout<< a;

В таком варианте программа выведет a, только если a не равно 2.

Теперь поговорим о более сложных вариациях оператора if.

Что если мы захотим при невыполнении основного условия сделать что-нибудь другое? Для этого используется структура if() ;else ;

Например:

?

1

2 if(a == 2) cout<< a;

elsecout<< 0;

Здесь, если число равно 2, то программа его выведет, а иначе выведет 0.

А что если при невыполнении первого условия нам нужно проверять еще что-то? Приведем пример из жизни. Если на улице солнечно то мы можем одеть футболку. А если нет? То мы еще должны посмотреть на улице просто пасмурно, или идет дождь, или может даже снег. Для подобных ситуаций в программировании мы можем использовать структуру 

if() ;elseif() ; else ;

?

1

2

3

4

5 if(a > 100) cout<< 3;

elseif(a > 50) cout<< 2;

elseif(a >= 0) cout<< 1;

elsecout<< 0;

Здесь, если a больше 100 то программа выведет 3, а иначе будет смотреть другие варианты. Если число больше 50, то выведет 2, больше или равно 0 выведет 1, а если число отрицательно выведет 0.

Примечание:

-Любое условие в С++ заключается в круглые скобки()

-Для сравнения переменных используются сравнительные символы >, <, ==, != (больше, меньше, равно, не равно)

-перед else всегда ставится точка с запятой

20. Оператор выбора.

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

CaseStatement = case ExpressionofCase {"|" 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.

21. Цикл с предусловием

Цикл 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.

intNdigits=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 раз (с использованием целочисленного деления) эквивалентно отбрасыванию последней цифры этой переменной.

22.Цикл с постусовием

Цикл "пока" с постусловием отличается от цикла с предусловием тем, что сначала выполняется блок цикла, а потом проверяется условие. Если условие истинно, то цикл будет выполнен еще раз, и так до тех пор, пока условие будет истинно. Синтаксис цикла с постусловием такой (обратите внимание на обязательную точку с запятой после условия):

     do

     {

         Блок инструкций

     }

     while (условие);

Поскольку условие проверяется после выполнения тела цикла, то блок цикла с постусловием всегда будет выполнен хотя бы один раз, независимо от истинности условия. Это может привести к ошибкам, поэтому использовать цикл while с постусловием следует только тогда, когда это действительно упрощает алгоритм.

23.Цикл с параметром

Цикл с параметром [for]

fo Цикл с параметром [for]

for (выражение 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;}r (выражение Цикл с параметром [for]

for (выражение 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;} 1; выражение 2; выражение 3)

оператор;

Выражение 1 – для инициализации параметра (вычисляется только один раз перед началом выполнения цикла)

Выражение 2 – для проверки условия окончания цикла (выполняется перед каждым шагом цикла)

Выражение 3 – для модификации параметра (вычисляется в конце каждого выполнения тела цикла, используется для коррекции значения параметра цикла)

Пример вычисления суммы n целых чисел:

#include<iostream.h>

voidmain()

{ int i, Summa ,n;

cout<<’\n’<<»Сколько целых элементов надо сложить? «;

cin>>n;

Summa=0;

for (i=1;i<=n;i++)

Summa+=i;

cout<<’\n’<<»Сумма: «<<Summa;}

24. Оператор continue

Оператор continue, как и оператор break, используется только внутри операторов цикла, но в отличие от него выполнение программы продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного оператора. Формат оператора следующий:

continue;

Пример:

intmain() { inta,b; for (a=1,b=0; a<100; b+="a,a++)" { if (b%2) continue; ... /* обработка четных сумм */ } return 0; }

Когда сумма чисел от 1 до а становится нечетной, оператор continue передает управление на очередную итерацию цикла for, не выполняя операторы обработки четных сумм.

Оператор continue, как и оператор break, прерывает самый внутренний из объемлющих его циклов.

25.Оператор Goto

Использование оператора безусловного перехода goto в практике программирования на языке программирования С настоятельно не рекомендуется, так как он затрудняет понимание программ и возможность их модификаций.

Формат этого оператора следующий:

gotoимя-метки; ... имя-метки: оператор;

Оператор goto передает управление на оператор, помеченный меткой имя-метки. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной, т.е. одно имя-метки не может быть использовано для разных операторов программы. Имя-метки - это идентификатор.

Любой оператор в составном операторе может иметь свою метку. Используя оператор goto, можно передавать управление внутрь составного оператора. Но нужно быть осторожным при входе в составной оператор, содержащий объявления переменных с инициализацией, так как объявления располагаются перед выполняемыми операторами и значения объявленных переменных при таком переходе будут не определены.