Алгоритмизация и программирование. Учебное пособие для студентов направления подготовки 09.03.02 Информационные системы и технологии
.pdf
Совокупность описаний и операторов, объединённых общим алгоритмом, составляют программу. Данные, с которыми работает программа, необходимо описывать. Переменные в программировании, как и в математике, обозначаются специальными символами – идентификаторами.
Идентификаторы – это имена в программах, необходимые для обращения к программным объектам и для их различия между собой.
Применяются особые правила написания имен в программах:
имя должно начинаться с буквы;
имя должно содержать только буквы, знак подчеркивания и цифры;
прописные и строчные буквы не различаются;
длина имени практически не ограничена.
Среди всех возможных идентификаторов существуют ключевые (зарезервированные) имена, которые имеют специальные значения для компилятора. Имена, которые создает программист, не должны совпадать с ключевыми.
21
Глава 3. ВВЕДЕНИЕ В СЕМЕЙСТВО
ЯЗЫКОВ ПРОГРАММИРОВАНИЯ С/С++
§ 1. Алфавит языка С/С++.
Язык С был разработан Д. Ритчи в Bell Laboratories (США) в 1972 году как универсальный язык системного программирования в связи с разработкой операционной системы UNIX. К концу 70-х годов язык С преобразовался в то, что теперь считают «традиционным С» или «классическим С». Он относится к процедурной парадигме программирования, которая заключается в том, что любая задача непосредственно моделируется набором алгоритмов. В 1989 году был утвержден стандарт языка С.
Язык программирования общего назначения C++ был разработан Бьерном Страуструпом в начале 80-х годов в Bell Laboratories и является своего рода расширением языка С. Поэтому большинство конструкций ANSI C являются законными для С++, причем смысл их не меняется. При этом C++ поддерживает разные парадигмы программирования (процедурную и объектную), но в сравнении с его предшественником, языком С, наибольшее внимание уделено поддержке объектно-ориентированного и обобщенного программирования. Можно сказать, что С++ – это гибридный язык. Он предоставляет возможность программировать и в стиле С, и в объектно-ориентированном стиле, и в обоих стилях сразу. В 1998 году был принят стандарт языка С++.
Программа на С++ состоит из одного или нескольких файлов. С логической точки зрения файл транслируется за несколько проходов. Первый проход состоит в препроцессорной обработке, на которой происходит включение файлов и макроподстановка. Работа препроцессора управляется с помощью команд, являющихся строками, первый символ которых, отличный от пробела, есть #. Результат работы препроцессора – это последовательность лексем, которую называют единицей трансляции.
Алфавит языка С содержит:
•латинские строчные и прописные буквы: A, B, C, …, Z, a, b, …, z;
•специальный символ: «_» (подчеркивание);
•русские строчные и прописные буквы: А, Б, …, Я, а, б, …, я;
Обратите внимание, что одинаковые прописные и строчные буквы считаются различными символами, так как имеют различные коды.
•арабские цифры 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
•другие специальные символы (табл. 2);
22
Табл. 2 Специальные символы
Символ |
Наименование |
Символ |
Наименование |
Символ |
Наименование |
|
, |
запятая |
/ |
дробная черта |
[] |
квадратные |
|
скобки |
||||||
|
|
|
|
|
||
. |
точка |
\ |
обратная черта |
% |
процент |
|
(слеш) |
||||||
|
|
|
|
|
||
; |
точка |
~ |
тильда |
< и > |
больше и мень- |
|
с запятой |
ше |
|||||
|
|
|
|
|||
: |
двоеточие |
* |
звездочка |
& |
амперсанд |
|
|
|
|
|
|
|
|
? |
вопросительный |
+ |
Плюс |
# |
номер |
|
знак |
||||||
|
|
|
|
|
||
‘ |
апостроф |
- |
минус |
^ |
логическое «не» |
|
|
|
|
|
|
|
|
! |
восклицательный |
( ) |
круглые скобки |
= и != |
равно и не равно |
|
знак |
||||||
|
|
|
|
|
||
| |
вертикальная |
{} |
фигурная скобка |
“ |
кавычки |
|
черта |
||||||
|
|
|
|
|
• неотображаемые символы: пробел (нельзя использовать внутри идентификаторов и зарезервированных слов), табуляция, переход на новую строку.
Кэлементарным конструкциям (лексемам) относятся следующие понятия:
•идентификаторы (имена);
•служебные (ключевые) слова;
•символьные, строковые и числовые константы;
•знаки операций;
•комментарии;
•разделители (знаки пунктуации).
Обратите внимание, язык программирования С++ плохо совместим с русскими символами, поэтому при работе рекомендуется использовать английские символы при вводе.
Идентификатором (именем) называется последовательность цифр, букв и специальных символов. Первый символ идентификатора должен быть строчной или прописной буквой латинского алфавита или символом «_».
Пример. Следующие идентификаторы считаются различными: mol и MOL, K101P и k101p.
Идентификатор не должен совпадать с ключевыми (зарезервированными) словами или именами функций библиотеки языка и может иметь практически любую длину. Иденти-
23
фикатор создается на этапе объявления (описания) переменной, функции, структуры и т.д., затем он может быть использован в последующих операторах программы.
Идентификатор может состоять из нескольких слов, разделенных символом подчеркивания (extr_function), или каждое следующее слово – с прописной буквы (Extr Function).
Имена переменных могут начинаться со знака подчеркивания (_box) или даже с двух знаков подчеркивания (__mix). Однако лучше этого избегать, чтобы не вызывать конфликт со стандартными системными переменными, имеющими такую же форму записи.
Служебные (ключевые) слова – это зарезервированные идентификаторы, наделенные определенным смыслом.
Обратите внимание, что трансляторы языка С/С++ воспринимают только служебные слова, записанные строчными буквами.
Ключевые слова для С/С++ выписаны в табл 3.
Табл. 3 Ключевые слова для С/С++
auto |
break |
case |
char |
|
|
|
|
const |
continue |
default |
do |
|
|
|
|
double |
else |
enum |
extern |
|
|
|
|
float |
for |
gotо |
if |
|
|
|
|
int |
long |
register |
return |
|
|
|
|
short |
signed |
sizeof |
static |
|
|
|
|
struct |
switch |
typedef |
union |
|
|
|
|
unsigned |
void |
volatile |
while |
|
|
|
|
Ключевые слова только для С++ отмечены в табл. 4.
Табл. 4 Ключевые слова для С++
asm |
bool |
catch |
explicit |
|
|
|
|
const_cast |
delete |
dynamic_cast |
mutable |
|
|
|
|
false |
friend |
virtual |
private |
|
|
|
|
namespace |
new |
operator |
throw |
|
|
|
|
protected |
public |
reinterpret_cast |
typename |
|
|
|
|
static_cast |
template |
this |
using |
|
|
|
|
true |
try |
typeid |
class |
|
|
|
|
24
В языке программирования С и С++ используют константы – именованный элемент программы, не меняющий свое значение. Константы бывают числовые, символьные и строковые.
Числовые константы обычно записываются в десятичной системе счисления (а также в шестнадцатиричной или восьмеричной), могут быть целыми и вещественными (действительными).
Вещественные числа записываются в форме десятичной дроби с точкой: 28.6, 0.65, –0.018, 4.0
или в экспоненциальной форме, с использованием десятичного порядка:
•3.14e1 (это означает 3,14·101),
•3.14e5 (т.е. 3,14·105),
•3.14e-3 (т.е. 3,14·10-3),
•-1e6 (т.е. -106),
•-1e-6 (т.е. -10-6),
где е – основание десятичной системы счисления.
Символьная константа – это лексема, состоящая из отображаемого символа (‘A’, ‘8’, ‘+’) или комбинации нескольких неотображаемых символов, начинающихся с символа ‘\’ и заключенных в апострофы, которые называются управляющими последовательностями:
•‘\n’ (перевод на новую строку);
•‘\t’ (табуляция);
•‘\’’ (одиночная кавычка);
•‘\”’ (двойная кавычка);
•‘\\’ (обратная косая черта).
Строковая константа определяется как последовательность символов, заключенная в кавычки (“Makeevka city”).
Модификатор, указывающий, что переменная является константой, – ключевое слово
const.
Пример. const int func=5;
Константе ничего нельзя присвоить, так как она гарантировано не меняется. Поэтому следующее выражение ошибочно:
Пример. func=5; // ошибка
25
Определение константы без её инициализации также вызовет ошибку компиляции:
Пример. const double pi; // ошибка: неинициализированная константа
Знаки операций определяют действия над данными и могут представляться как одним символом (+, *, = и т.д.), так и группой символов (++, +=, *=, == и т.д.).
Комментарии используются для соответствующего пояснения в тексте программы и формируются как последовательность символов, ограниченная слева и справа знаками «/*» и «*/» соответственно
/* многострочный комментарий
……………….. */
или только слева знаками «//»:
// однострочный комментарий (до конца текущей строки). Всё, что написано в самом комментарии, компилятором игнорируется.
Разделители (знаки пунктуации) используются для различных целей, от организации текста программы до определения заданий, которые будут выполнены компилятором или откомпилированной программой:
( ) [ ] { } , ; : … * = #.
Любая программа на С++ обязательно включает в себя функцию main( ), с которой и начинает свое выполнение. Тело функции заключают в фигурные скобки { } – это обозначение составного оператора. Точка с запятой «;» завершает каждый оператор, каждое определение (кроме определения функции) и каждое описание. Любое допустимое выражение, заканчиваемое символом «;» воспринимается как оператор. Двоеточие «:» служит для отделения метки от помеченного ею оператора.
§ 2. Типы данных и переменные.
Любая программа работает с данными. Они могут быть различных типов.
Тип данных – это форма представления существующих и обрабатываемых в языке программирования данных (целые, вещественные числа, символы, строки и т.д.).
Тип данных определяет:
возможный диапазон значений констант, переменных, выражений, функций, принадлежащих к данному типу;
26
внутреннюю форму представления данных в компьютере (с фиксированной или с плавающей точкой);
объем памяти, занимаемый данными;
операции и функции, которые могут выполняться над величинами, принадлежащими к данному типу.
На основе типов данных описываются (объявляются) переменные.
Переменная – это символическое обозначение ячейки оперативной памяти программы, в которой хранятся данные. Доступ к значению переменной возможен через её имя, а к участку памяти, который она занимает – по её адресу.
Все переменные, которые будут использоваться в программе, должны быть заранее описаны (объявлены). Это позволяет выделить необходимый участок памяти, размер которого зависит от типа переменной. Тип переменной в процессе реализации программы не меняется.
Типы данных бывают базовыми (системными) и пользовательскими.
Базовые типы данных – это встроенные типы значений в языке программирования, соответствующие стандартным формам представления данных в компьютере.
В отличие от некоторых других языков, в С++ нет одного универсального базового типа, а есть множество фундаментальных (системных) типов. Компилятор распознает эти базовые типы данных и по определенным встроенным правилам работает с ними.
Пользовательские типы данных – это типы, которые определяет пользователь. У компилятора нет встроенных сведений о таких типах данных. Он работает с пользовательскими типами во время компиляции по тем правилам, которые задает пользователь.
Базовые типы данных определены стандартом языка С++, их не нужно определять в начале программы. Они делятся на три основные категории: целочисленные (целые числа), с плавающей запятой (числа, которые могут содержать дробную часть) и тип void (пустой набор значений).
Целочисленные типы данных (числа с фиксированной точкой). Для представления це-
лых чисел в языке С используются следующие целочисленные типы: |
|
|
||||
|
int i; /* целое число со знаком, занимает в памяти стандартное машинное сло- |
|||||
|
во (2 или 4 байта – в зависимости от архитектуры компьютера), диапазон зна- |
|||||
|
чений, соответственно, |
|
|
|
|
|
|
-32768 (215) … +32767 |
или |
-2147483648 (231) … +2147483647 |
*/ |
||
|
unsigned u; /* целое число без знака, слово, диапазон значений |
|
||||
|
0 … 65535 (216) |
или |
0 … 232 |
*/ |
|
|
long l; // целое число со знаком, двойное слово
27
unsigned long ul; // целое число без знака, двойное слово
short s; // целое число со знаком, короткое слово
char c; // целое число, байт, диапазон значений -128 … + 127
unsigned char uc; // целое число без знака, байт, диапазон значений 0 … 255. Одной из форм представления целого является перечисляемый тип enum – тип дан-
ных, множество значений которого является ограниченным списком идентификаторов.
Вещественные типы данных (числа с плавающей точкой):
float – обычной точности (занимает в памяти 4 байта);
double – двойной (занимает 8 байтов);
long double – повышенной (12 байтов).
Символьные данные представляются целочисленным типом данных char.
Логический тип Boolean обозначается bool и может принимать два значения true или false, которые являются служебными словами.
Тип void является специальным типом. Множество его значений пусто, что указывает на отсутствие типа. Используется для объявления функций, которые не возвращают никакого значения. В языке C существует два варианта начала программы. В случае int main(), если программа успешно выполнилась, функция возвращает целое число 0, в противном случае – другое значение. Начало программы void main() означает, что функция не возвращает никакого значения.
§ 3. Структура программы. Ввод и вывод данных.
Одним из способов изучения языка программирования является представление его на примерах составления простейших программ с подробным разбором их содержания. В данном пособии будут рассмотрены различные задачи с математической моделью решения, описанием алгоритма, написанным кодом и видом кода в компиляторе языка С++, а также результатом реализации программы.
Программа на языке С/С++ – это совокупность одного или нескольких модулей, каждый из которых является самостоятельным файлом, содержащим одну или несколько функций. Под словом «функция» здесь понимается «подпрограмма», «процедура» или «функция», используемые в других языках программирования.
Структура программы включает в себя лексические элементы (лексемы):
•константы (литералы);
•зарезервированные слова;
•идентификаторы;
•знаки операций и ограничители (разделители).
28
Любая программа начинается с директив препроцессора (с символа #) – программного инструмента, изменяющего код программы для последующей компиляции. Например, к директивам препроцессора подключения заголовочного файла относят #include <stdio.h> и #include <iostream>. Обмен данными реализуется с помощью библиотеки функций вводавывода. Перечень заголовочных файлов языка С++ приведён в Приложении 2.
Опишем некоторые директивы подробнее. В стандартной библиотеке языка программирования С для ввода/вывода данных классически использовали заголовочный файл <stdio.h>. В директиве #include <stdio.h> описаны функции printf() и scanf().
#include <stdio.h>
Функция printf() позволяет выводить на дисплей данные всех типов, работать со списком из нескольких аргументов и определять способ форматирования данных. Многоцелевая функция scanf() дает возможность вводить данные любых типов. Функция puts() осуществляет вывод информации на экран.
Пример. Фразу «Hello everyone!» с использованием библиотеки <stdio.h> можно вывести на экран двумя способами:
puts(“Hello everyone!”); или строковая переменная:
#define MESSAGE “Hello everyone!” puts(MESSAGE);
Вданном примере используется директива #define для создания текстовой константы.
Вязыке программирования С++, кроме функций из языка С, определена собственная объектно-ориентированная система ввода-вывода – библиотека классов <iostream>. Для её использования необходимо применить директиву #include <iostream>.
#include <iostream>
Данная библиотека объявляет объекты, управляет чтением из стандартных потоков и записью в них.
29
Потоки ввода-вывода данных cin и cout открываются автоматически при запуске программы. Для их использования применяют специально определенные операции:
•занести в поток данные – символ >> – выделяет данные из входного потока и помещает в указанные переменные;
•получить из потока данные – символ << – помещает значения указанных пе-
ременных в поток.
При работе с библиотекой <iostream> применяют директиву using namespace std, которая позволяет использовать имена из стандартного пространства имен std без явного указания префикса std:: перед именами.
Пример. Фразу «Hello everyone!» с использованием библиотеки <iostream> можно вывести на экран так:
cout<< “Hello everyone!”;
Во многих учебных изданиях до сих пор чаще встречается описание примеров с использованием стандартной библиотеки <stdio.h>, однако, на большинстве интернетресурсах, посвященных программированию на языке С++, используют класс ввода/вывода <iostream>. В данном издании будут использоваться оба варианта. При этом авторы не ограничивают читателей в применении одного или другого способа ввода/вывода данных, допуская оба.
После указания директив препроцессора определяется главная функция int main(), с которой начинается выполнение программы. В фигурных скобках { } записывается тело функци – действия, которые она выполняет. Далее размещается блок определения (объявления) переменных, за ними следуют операторы функции. Операторы задают действия, которые выполняются над переменными. Все переменные должны быть определены перед их использованием. Каждое объявление переменной или оператора всегда завершается точкой с запятой. Этот символ «;» указывает на конец оператора, а не конец строки.
§ 4. Операции и выражения.
Операции являются элементарными неделимыми действиями, которые могут быть выполнены над данными (операндами). Операция над одним операндом называется унарной, над двумя – бинарной. Операнды представляются переменными, константами или выражениями. Операции и выражения определяют безусловную последовательность действий.
30
