Учебное пособие по си
Язык Си в примерах/Факториал
Факториалом числа n называют произведение первых n натуральных чисел:
n ! = 1 ⋅ 2 ⋅ … ⋅ n = ∏ i = 1 n i . <\displaystyle n!=1\cdot 2\cdot \ldots \cdot n=\prod _^
Ниже мы рассмотрим примеры программ, содержащих вычисляющую факториал заданного числа функцию factorial .
Содержание
Определение функции factorial выше основано на следующей рекуррентной формуле:
n ! = n ⋅ ( n − 1 ) ! , 0 ! = 1.
Для вычисления факториала n ! эта функция вызывает саму себя с аргументом n − 1.
Тернарный оператор ( ? : ) в выражении ( n для возвращаемого значения ( return ) «обрывает» рекурсию, когда аргумент функции становится меньшим 2. В противном случае, функция factorial постоянно бы вызывала саму себя, и во время выполнения программы мы получили бы сообщение об ошибке «переполнение стека» или «превышена глубина рекурсии». Для того, чтобы этого не было, необходимо, чтобы при некоторых значения аргумента, функция не вызывала саму себя, а вычисляла свое значение «самостоятельно».
Идея рекурсии заключается в сведении задачи к этой же задаче, но для более простых случаев (например, для меньшего значения аргумента n ). Процесс сведения задачи к предыдущей должен когда-нибудь заканчиваться, поэтому рекурсивные функции для простейших входных данных должны «знать», чему они равны и не делать рекурсивных вызовов.
Возможность рекурсии ограничена предельной глубиной стека возврата. В некоторых случаях, однако, реализация языка программирования может самостоятельно свести рекурсию к итерации.
В примере ниже, мы воспользуемся хвостовой рекурсией, сведение которой к итерации хотя и не требуется стандартом, но все же реализуется, например, компилятором C, входящим в распространенный комплект GCC. Для этого, нам потребуется определить вспомогательную функцию factorial_1 , вычисляющую значение p n !, где p , n — аргументы функции.
Обратите внимание, что в этом примере мы не приводим ни определения функции main , ни директив препроцессора #include подключения используемых нами заголовков — их следует заимствовать из предыдущего примера.
Наконец, в варианте ниже мы вовсе исключим рекурсию из определения функции factorial , явно сведя ее к итерации.
В отличие от первого варианта (но аналогично варианту с хвостовой рекурсией) в данном примере нам потребовалась дополнительная локальная переменная. В случае «нехвостовой» рекурсии — роль такой переменной фактически играет растущий стек возврата. Отметим, впрочем, что в данной конкретной задаче это не столь важно.
Стандарт требует поддержки реализацией числовых типов разрядности 8, 16, 32 и 64 бит. [1] Несложно убедиться, однако, что уже 21! = 51 090 942 171 709 440 000 — что превышает предельные значения для 64-битового числа — как со знаком (9 223 372 036 854 775 807), так и без знака (18 446 744 073 709 551 615).
Если по каким-либо причинам требуется вычислить точные значения факториала для чисел от 21 и выше, следует использовать библиотеки операций с числами произвольной разрядности — как, например, GNU MP. [2]
ru.wikibooks.org
Язык Си в примерах/Учимся складывать
Разнообразные вычисления — моделирование, решение алгебраических и дифференциальных уравнений — это то, для чего и создавались первые компьютеры. Давайте и мы научимся использовать компьютер для вычислений. Начнём со сложения двух чисел.
Дано два разделенных пробельными символами целых чисел (в «текстовом» десятичном представлении) на стандартном вводе программы. Найти значение суммы (разности, произведения, частного от деления — если имеет смысл) этих двух чисел. Новые элементы языка переменные; тип double; операторы &, *, ? : контекста выражения и оператор if контекста утверждения; макроподстановка assert, функции printf, scanf.
В отличие от рассмотренной ранее простейшей программы, в данной задаче нам потребуются переменные — ячейки памяти, в которые функция ввода сохранит введенные пользователем числа, подлежащие сложению.
Как и в случае функций (в том числе main ), объявление переменных в Си предполагает указание их типов. Основные числовые типы языка — int (целое число фиксированной разрядности) и double (число с плавающей запятой.) Поскольку мы уже использовали тип int в описании функции main , применим его же в данной задаче.
Рассмотрим выполнение этой программы почти с ее завершения — вызова функции printf . [1] Данная функция выведет целое число в десятичной форме (согласно указателю преобразования %d ), завершая вывод переводом строки ( \n ).
Число, которое будет выведено, является результатом вычисления выражения a + b — или же, проще говоря, — суммой значений переменных a и b .
Вводимые пользователем числа помещаются в эти переменные функцией scanf , вызываемой в коде выше как scanf ( «%d%d» , & a , & b ) . [2] Здесь, как и в printf , используется указатель преобразования %d , означающий на этот раз считывание числа в десятичной форме (возможно — предваряемого пробелами). Поскольку указатель повторен дважды, два числа будут считаны и помещены в упомянутые в аргументах две переменные a и b . (Необходимый здесь унарный оператор & оставим пока без внимания.)
Как и printf , функция scanf объявлена в заголовке (англ. header ) stdio.h . [3]
В простейшей программе от действий пользователя не зависело ровным счетом ничего. Каким, однако, будет результат выполнения данной программы, если ввод пользователя не будет начат двумя числами в десятичной форме?
Для проверки соответствия ввода пользователя требованиям программы мы сохраняем ( = ) результат выполнения scanf — количество успешно измененных переменных — в целочисленной переменной с именем r ( int r ), после чего требуем равенства ее значения двум ( assert ( r == 2 ); .)
Действие макроподстановки assert заключается в вычислении выражения, переданного ей первым (и единственным) аргументом и аварийном завершении программы в случае, если полученное значение — ноль («логическая ложь».) [4]
Наконец, в самом начале функции main определены (помимо упомянутой уже r ) целочисленные переменные a и b . Их значение в начале выполнения функции main может быть произвольным, [5] но после успешного (что проверяется использованием assert ) завершения scanf они будут содержать два числа, которые удалось последовательно считать со стандартного ввода.
Рассмотренную выше программу несложно изменить для использования чисел с плавающей запятой.
Как видно, в этом случае изменяются лишь тип переменных a , b ( int → double ) и указатели преобразований ( %d → %lg .)
Здесь следует отметить, что в случае scanf совершенно идентично будут действовать указатели преобразований %lg , %lf и %le . Напротив, в случае printf не будет разницы между %lg и %g . Причины такого поведения мы также пока оставим без внимания.
Желающим изучить использование других числовых типов в этой задаче предлагается обратиться к разделу «Числовые типы» приложения.
Вызов функции в чем-то подобен отправке письма. Мы указываем на конверте имя функции, вкладываем в конверт копии значений, которые хотим передать, и отправляем письмо (вызываем функцию).
В некоторых случаях, однако, мы хотим получить от функции что-либо обратно. Иногда, для этого достаточно предусмотренного языком возвращаемого значения. Иначе, можно отправить функции своего рода конверт с обратным адресом (один или несколько). Именно для этого — для получения адреса л-значения — служит унарный оператор & .
Так, запись &a означает адрес ячейки памяти, выделенной для хранения значения переменной a , или же, проще, — ссылка (англ. reference ) на переменную a .
Справа от оператора & указывается л-значение (англ. lvalue . [6] Не вдаваясь в подробности отметим, что под л-значением понимают любое выражение, которое может стоять слева от оператора присваивания = . В частности, л-значением является любое выражение, состоящие из имени действительной в данном контексте (англ. scope ) переменной.
Для обращения к ячейке памяти по ссылке используется унарный оператор * . Так, выражение * ( & a ) = 1 полностью равнозначно a = 1 .
Стандарт C11 требует от реализации языка поддержки числовых типов разрядности 8, 16, 32 и 64 бит. [7] Если по каким-либо причинам в вычислениях требуется бо́льшая разрядность, следует использовать библиотеки операций с числами произвольной разрядности — как, например, GNU MP. [8]
В частности, благодаря GNU MP, пример ниже выведет сумму двух введенных чисел даже если любое из них — или результат сложения — превышает 2⁶⁴.
Код имеет следующие отличия от исходного варианта:
- ввод-вывод чисел произвольной разрядности выполняется функциями gmp_scanf и gmp_printf — определенными GNU MP и объявленными в gmp.h ; заголовок stdio.h не требуется;
- вместо оператора сложения + используется вызов функции mpz_add ( a , a , b ) ; в такой форме, действие функции подобно действию выражения a += b для переменных «встроенных» целочисленных типов;
- переменные GNU MP требуют обязательной инициализации, которая в примере выполнена функцией mpz_inits () ;
- тип используемых для вычисления переменных — mpz_t .
В программе ниже мы кроме суммы вычислим разность и произведение введенных чисел, а также, если второе число отлично от нуля, — частное от деления первого числа на второе.
В этой программе нам потребовался условный оператор контекста утверждения (англ. if statement ) — один из четырех (наряду с && , || и ? : ) условных операторов языка. Его синтаксис: [9]
Где тело-если-истинно и тело-если-ложно могут быть (каждый) единственным утверждением (завершаемым ; ), или же, как в примере выше, — < >-блоком.
В случае, если результат вычисления выражения — истина (другими словами — отличен от 0), выполняется тело-если-истинно ; в противном случае (и если используется else ) — тело-если-ложно .
Заметьте, что каждое простое утверждение (англ. statement ) завершается точкой с запятой. Одна из самых популярных синтаксических ошибок начинающих программистов — не ставить точку c запятой после утверждений.
Используя условный оператор контекста выражения (англ. conditional operator ), а также приняв во внимание тот факт, что printf проигнорирует «избыточные» аргументы (аргументы сверх количества, требуемого указателями преобразований в указанной первым аргументом строке формата), можно незначительно сократить код предыдущего примера.
В этом варианте, код вновь содержит те же самые строковые константы, что и в предыдущем, однако используется лишь один вызов функции printf — первым аргументом которой (в зависимости от значения переменной b ) окажется одна из этих констант.
Число 42, которое передается printf пятым аргументом в случае нулевого значения b , может быть произвольным. Поскольку в этом случае функция printf получает строку формата лишь с тремя указателями формата, фактически использованы будут лишь аргументы с первого (формат) по четвертый (произведение a и b ).
Общий синтаксис тернарного оператора ? : следующий: [10]
Где выражение вычисляется первым, после чего, если оно истинно (отлично от 0), вычисляется — и принимается результатом оператора в целом — выражение если-истинно ; в противном случае — если-ложно .
Язык Си в примерах/Сортировка
Задача «сортировки» (упорядочения) — одна из первых интересных и сложных задач теории алгоритмов. Общие принципы освещает статья «Алгоритмы сортировки», здесь же мы рассматриваем способы упорядочения посредством языка Си.
Один из простейших алгоритмов решения — метод «пузырька».
Понятно, что после первого «пробега» самый большой элемент массива окажется на последнем месте. После второго пробега мы будем уверены, что второй по величине элемент находится на предпоследнем месте.
Решив эту задачу, вы докажете, что метод «пузырька» решает задачу сортировки.
Два оператора for, в которых происходит сортировка, можно заменить на одну строку:
Это функция, описанная в стандартной библиотеке ANSI C и объявлена в заголовочном файле stdlib.h.
Поэтому в начале программы нужно добавить
Функцией qsort можно упорядочивать объекты любой природы. По сути, она предназначена упорядочивать множества блоков байтов равной длины. Второй аргумент функции — это число таких блоков, третий аргумент — длина каждого блока. Первый аргумент — это адрес, где находится начало первого блока (предполагается, что блоки в памяти расположены друг за другом подряд).
Четвёртый аргумент функции qsort — это имя функции, которая умеет сравнивать два элемента массива. В нашем случае это
В силу указанной универсальности функции сортировки, функция сравнения получает в качества аргумента адреса двух блоков, которые нужно сравнить и возвращает 1, 0 или -1:
положительное значение, если a > b 0, если a == b отрицательное значение, если a
Поскольку у нас блоки байт — это целые числа (в 32-битной архитектуре это четырёхбайтовые блоки), то необходимо привести данные указатели типа (const void*) к типу (int *) и осуществляется это с помощью дописывания перед указателем выражения «(const int*)». Затем нужно получить значение переменной типа int, которая лежит по этому адресу. Это делается с помощью дописывания спереди звездочки.
Таким образом, мы получили следующую программу
Ниже приведена программа, где память под массив выделяется динамически:
Функция malloc (от англ. memory allocation --- выделение памяти) делает запрос к ядру операционной системы по выделению заданного количества байт. Единственный аргумент этой функции — число байт, которое вам нужно. В качестве результата функция возвращает указатель на начало выделенной памяти. Указатель на начало выделенной памяти &mbsah — это адрес ячейки памяти, начиная с которого идут N байт, которые вы можете использовать под любые свои нужды. Всю память, которая была выделена с помощью функции malloc, нужно освобождать с помощью функции free. Аргумент функции free — это указатель на начало выделенной когда-то памяти.
Программа упорядочения строк в алфавитном порядке Править
Обратите внимание на сложное приведение типов.
Функция strcmp, объявленная в файле string.h имеет следующий прототип:
То есть функция получает два аргумента — указатели на кусочки памяти, где хранятся элементы типа char, то есть два массива символов, которые не могут быть изменены внутри функции strcmp (запрет на изменение задается с помощью модификатора const) [1] .
В то же время в качестве четвертого элемента функция qsort хотела бы иметь функцию типа
В языке Си можно осуществлять приведение типов являющихся типами функции. В данном примере тип
Этот самоучитель создан для тех, кто хочет освоить основы программирования на C++. Уроки рассчитаны, в первую очередь на новичков, но будут полезны и тем, кто уже имеет небольшой опыт в программировании. Мы начнем с основных принципов и закончим данный курс уже на более сложных примерах.
Первая программа на C++ — урок 1
В качестве среды разработки под Windows автор советует использовать Visual Studio 2008 (800 Мб), если у вас Windows XP, Visual Studio 2013 (6.5 Гб) для Windows 7 и выше, или Dev C++ 5 (41 Мб) для тех, у кого слишком медленный интернет для загрузки Visual Studio. Пользователям Unix-подобных систем, потребуется компилятор GCC и любой текстовый редактор, например Vim.
После того, как вы установили все необходимое, приступим к написанию первой программы.
Переменные и типы данных в C++ — урок 2
Из школьного курса математики мы все знаем, что такое переменные. В программировании принципы довольно схожи. Переменная — это «ячейка» оперативной памяти компьютера, в которой может храниться какая-либо информация.
Конструкция ветвления в C++ — урок 3
Встречаются ситуации, когда программе нужно выбрать, какую операцию ей выполнить, в зависимости от определенного условия.
К примеру, мы вводим с клавиатуры целое число. Если это число больше десяти, то программа должна выполнить одно действие, иначе — другое. Реализуем этот алгоритм на C++ с помощью конструкции ветвления.
Циклы в C++ — урок 4
Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. В этом уроке мы научимся программировать циклы на C++, после чего посчитаем сумму всех чисел от 1 до 1000.
Массивы в C++ — урок 5
Сегодня мы с поговорим о массивах. Вы уже знаете, что переменная — это ячейка в памяти компьютера, где может храниться одно единственное значение. Массив — это область памяти, где могут последовательно храниться несколько значений.
Возьмем группу студентов из десяти человек. У каждого из них есть фамилия. Создавать отдельную переменную для каждого студента — не рационально. Создадим массив, в котором будут храниться фамилии всех студентов.
Функции в C++ — урок 6
Сегодня мы поговорим о функциях в C++. Очень часто в программировании необходимо выполнять одни и те же действия. Например, мы хотим выводить пользователю сообщения об ошибке в разных местах программы, если он ввел неверное значение. без функций это выглядело бы так:
Указатели в C++ — урок 7
При выполнении любой программы, все необходимые для ее работы данные должныбыть загружены в оперативную память компьютера. Для обращения к переменным, находящимся в памяти, используются специальные адреса, которые записываются в шестнадцатеричном виде, например 0x100 или 0x200 .
Если переменных в памяти потребуется слишком большое количество, которое не сможет вместить в себя сама аппаратная часть, произойдет перегрузка системы или её зависание.
Динамические массивы в C++ — урок 8
В пятом уроке мы разобрали понятие массива. При объявлении, мы задавали массиву определенный постоянный размер.
Параметры командной строки в C++ — урок 9
При запуске программы из командной строки, ей можно передавать дополнительные параметры в текстовом виде.
Классы в C++ — урок 10
Весь реальный мир состоит из объектов. Города состоят из районов, в каждом районе есть свои названия улиц, на каждой улице находятся жилые дома, которые также состоят из объектов.
Практически любой материальный предмет можно представить в виде совокупности объектов, из которых он состоит. Допустим, что нам нужно написать программу для учета успеваемости студентов. Можно представить группу студентов, как класс языка C++. Назовем его Students .
code-live.ru
Язык СИ++ Учебное пособие
Предисловие
Язык программирования Си++ был разработан на основе языка Си Бьярном Страуструпом (Вjаrnе Stroustгuр) и вышел за пределы его исследовательской группы в начале 80-х годов [I]. На первых этапах разработки (1980 г.) язык носил условное название «Си с классами», а в 1983г. Рик Масситти придумал название «Си++», что образно отразило происхождение этого нового языка от языка Си. Язык Си++ является расширением (надмножеством) языка Си, поэтому программы, написанные на Си, могут обрабатываться компилятором языка Си++. Более того, в программах на языке Си++ можно использовать тексты на языке Си и обращаться к библиотечным функциям языка Си. Таким образом, одно из достоинств Си++ состоит в возможности использовать уже существующие программы на Си. Однако это не единственное достоинство языка. Как пишет его автор [2], язык Си++ был создан с учетом следующих целей: улучшить язык Си, поддержать абстракцию данных и обеспечить объектно-ориентированное программирование.
Настоящая работа посвящена синтаксису, семантике, технике и стилю построения программ языка Си++. Фундаментальным трудом по синтаксису и семантике языка Си++ является справочное руководство по языку (Проект стандарта АN51) М. Эллис и Б. Страуструпа Как всякий стандарт, работа [2] непригодна для первоначального знакомства с языком, что и отмечают в предисловии к русскому изданию сами авторы [2]: «. книга не предназначена для обучения технике и стилю программирования». В настоящее время на русском языке издано несколько хороших пособий по языку Си++ для тех, кто уже программирует на языке Си (см. библиографию). В отличие от этих пособий, в которых язык Си++ вводится как расширение своего предшественника Си, настоящая работа не требует от читателя знакомства с языком Си. Другими словами, материал книги по возможности «замкнут» и содержит всю необходимую информацию для фундаментального освоения языка Си++ как нового для читателя программирования. Например, книгу может изучать читатель, знакомый с языком Паскаль или Бейсик, или Фортран, или ПЛ/1 и т.п. Знакомство с языком Си никак не повредит читателю, но изложение материала этого не предполагает. Итак, язык Си++ излагается как новый язык, свойства которого раскрываются перед читателем постепенно. Здесь мы полностью следуем совету: «. программируя на Си++, нужно. не применять те средства языка, которые представляются вам неясными, как и те, с которыми вы еще не успели ознакомиться» [2].Несмотря на широкое распространение и популярность языка Си++ стандарты для него отсутствуют. Через несколько лет его практического использования стандартом де-факто стала спецификация языка. АТ&Т С++ ге1еаsе 2.0, разработанная в Ве11 laboratories фирмы AТ&Т под руководством автора языка Б. Страуструпа. Затем там же появилась усовершенствованная версия 3.0 языка Си++. В настоящее время в Американском национальном институте Стандартов (АNS1) существует комитет по языку Си++ (ХЗJIб). Изданное в 1990 году описание языка с комментариями [2] принято комитетом АNS1 в качестве исходного материала для стандартизации Си++. С тех пор рабочей группой WG21 комитета АN51 выпущено несколько предварительных версий стандарта. Последняя из них (но не окончательная) [34] датирована 26 мая 1994 г. (документ АNS1 X3JIG/94-0098). Весьма полная реализация соглашений по языку Си++ выполнена в широко распространенных компиляторах Тигbо С++ и Вог1аnd С++ фирмы Вог1аnd. Эти программные средства (на которые в тексте делаются ссылки ТС++ и ВС++) и соответствующая фирменная документация были использованы при подготовке настоящей работы. Приводимые в тексте программы в основном отлаживались и выполнялись в интегрированной среде Вог1аnd С++ 3.1 и Turbo С++ 1.01. Версии компиляторов Вог1аnd С++ 4.0 и Вог1аnd С++ 4.5 потребуются читателю только при использовании механизма обработки особых ситуаций (см. главу 12).Содержание пособия подробно отражено в оглавлении, поэтому не будем на нем останавливаться, а приведем только несколько пояснений. Изложение в начальных главах до некоторой степени конспективное, но все разбираемые вопросы сопровождаются примерами. При выборе примеров, оказалось, весьма непросто ограничиваться только уже рассмотренными средствами языка и «не забегать вперед». В тех случаях, когда новые конструкции появляются в примерах до их определения, они тщательно объясняются и комментируются. Тем самым читатель получает возможность неформального предварительно знакомства с некоторыми важными и широко используемыми конструкциями языка Си++, синтаксис которых описывается позже.
Несмотря на то, что в книге изложены практически все основные принципы, средства и механизмы языка Си++, необходимые для объектно-ориентированного программирования, мы не стали только ради моды наспех говорить о технологии объектно-ориентированного программирования СИ++. Здесь мы полностью следуем совету: «. программируя на Си++, нужно. не применять те средства языка, которые представляются вам неясными, как и те, с которыми вы еще не успели ознакомиться» [2].
Несмотря на широкое распространение и популярность языка Си++ стандарты для него отсутствуют. Через несколько лет его практического использования стандартом де-факто стала спецификация языка. АТ&Т С++ ге1еа5е 2.0, разработанная в Ве11 Laboratories фирмы АТ&Т под руководством автора языка Б. Страуструпа. Затем там же появилась усовершенствованная версия 3.0 языка Си++. В настоящее время в Американском национальном институте Стандартов (АNS1) существует комитет по языку Си++ (ХЗJI6). Изданное в 1990 году описание языка с комментариями [2] принято комитетом АN51 в качестве исходного материала для стандартизации Си++. С тех пор рабочей группой WG21 комитета АN51 выпущено несколько предварительных версий стандарта. Последняя из них (но не окончательная) [34] датирована 26 мая 1994 г. (документ АN51 X3JIG/94-0098). Весьма полная реализация соглашений по языку Си++ выполнена в широко распространенных компиляторах Тurbо С++ и Вог1аnd С++ фирмы Вог1аnd. Эти программные средства (на которые в тексте делаются ссылки ТС++ и ВС++) и соответствующая фирменная документация были использованы при подготовке настоящей работы. Приводимые в тексте программы в основном отлаживались и выполнялись в интегрированной среде Вог1аnd С++ 3.1 и Тurbо С++ 1.01. Версии компиляторов Вог1аnd С++ 4.0 и Вог1аnd С++ 4.5 потребуются читателю только при использовании механизма обработки особых ситуаций (см. главу 12).
Содержание пособия подробно отражено в оглавлении, поэтому не будем на нем останавливаться, а приведем только несколько пояснений. Изложение в начальных главах до некоторой степени конспективное, но все разбираемые вопросы сопровождаются примерами. При выборе примеров, оказалось, весьма непросто ограничиваться только уже рассмотренными средствами языка и «не забегать вперед». В тех случаях, когда новые конструкции появляются в примерах до их определения, они тщательно объясняются и комментируются. Тем самым читатель получает возможность неформального предварительного знакомства с некоторыми важными и широко используемыми конструкциями языка Си++, синтаксис которых описывается позже.
Для успешного усвоения материала пособия от читателя требуются знания основ информатики и некоторые навыки программирования на каком-либо алгоритмическом языке.Материал для главы 12, посвященной исключительным ситуациям, автору помог подобрать С. Г. Чернацкий. Им же написаны и отлажены некоторые программы, помещенные в главе 12.
В заключение предисловия несколько слов о той помощи, которую получил автор и за которую он глубоко признателен. Студенты факультета прикладной математики (ФПМ) Московского государственного институт» электроники и математики (МИЭМ), слушая лекции автора, своими вопросами и замечаниями помогли исправить некоторые шероховатости изложения материала. При печати и редактировании рукописи, а также при анализе результатов выполнения программ автору помогали коллеги по работе. Среди них особую благодарность считаю необходимым выразить В. Г. Воросколевской, Н. Н. Ионцеву, А. В. Утолину, С. Г. Чернацкому, О. В. Шехановой.
Глава 1. НЕФОРМАЛЬНОЕ ВВЕДЕНИЕ В СИ++
1.1. Простые программы на языке Си++
Начнем с объяснения структуры программ на языке Си++, мало обращая внимания на существование языка Си, точнее, не всегда явно отмечая степень преемственности.
Пример 1. Следуя классикам [1,3], приведем программу, выводя их на экран дисплея фразу Hello, Woгd! (Здравствуй, Вселенная!):
//HELLO.СРР — имя файла с программой.
include
main()
<
cout » «\nHellо, Wогd!\n»;
>
Результат выполнения программы:
Hello, World!
В первой строке текста программы — однострочный комментарий, начинающийся парой символов ‘// ‘, заканчивающийся неизображаемым символом «конец строки». Между этими разделителями может быть помещен произвольный текст. В данном примере указано имя файла hello.cpp, текст программы.
Во второй строке помещена команда (директива) препроцессора, обеспечивающая включение в программу средств связи со стандартными потоками ввода и вывода данных. Указанные средства находятся в файле с именем iostream.h (мнемоника: «i» (input) — ввод; (оutput) — вывод; stream — поток; «h» (head) — заголовок). Стандартным потоком вывода по умолчанию считается вывод на экран дисплея. (Стандартный поток ввода обеспечивает чтение данных от клавиатуры.) Третья строка является заголовком функции с именем.Любая программа на языке Си++ должна включать одну и только одну функцию с этим именем. Именно с нее начинается выполнение программы. Перед именем main помещено служебное слово void — спецификатор типа, указывающий, что функция main в данной программе не возвращает никакого значения. Круглые скобки после main требуются в соответствии с форматом (синтаксисом) заголовка любой функции. В них помещается список параметров. В нашем примере параметры не нужны и список пуст.
Тело любой функции — это заключенная в фигурные скобки последовательность описаний, определений и операторов. Каждое описание, определение или оператор заканчивается символом «точка с запятой» В теле функции main явных описаний и определений нет и есть только один оператор
cout и подключает к исходному тексту программы средства ясна с дисплеем (для поддержки операции С:\BOOK\HELLO.EXE
Здесь и далее обозначает нажатие клавиши Enter.
Пример 2. Для иллюстрации некоторых особенностей определения и инициализации переменных и массивов, а также ввода и вывода данных напишем программу вычисления должностного оклада в соответствии с заданным разрядам единой тарифной сетки (ETC) оплаты труда для работников бюджетных отраслей в Российской Федерации. (Установлена постановлением Правительства Российской Федерации №785 от 14 октября 1992 г. Отменена 27 февраля 1995 г.)
works.doklad.ru