Министерство общего и профессионального образования

Томский политехнический университет

Программирование на языке С++.

Часть 1

Учебное пособие

Томск 1999 г.

УДК 681.3.06(035.5)

Триханова на языке С++. Часть I: Учебное пособие.- Томск: Изд. ТПУ, 199с.

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

Пособие подготовлено на кафедре вычислительной техники ТПУ и предназначено для студентов специальности 220100 "Электронные вычислительные машины, системы, комплексы и сети" Центра дистанционного образования.

Печатается по постановлению Редакционно-издательского Совета Томского политехнического университета

РЕЦЕНЗЕНТЫ:

Н., к. п.н., доцент кафедры прикладной информатики факультета информатики Томского государственного университета

С.,   к. т.н., доцент кафедры конструирования Томского университета систем управления и радиоэлектроники

Темплан 1999

Ó Томский политехнический университет, 1999

ПРЕДИСЛОВИЕ

Язык программирования С++ был разработан на основе языка С Бьярном Страуструпом (Bjarne Stroustrup) и вышел за пределы его исследовательской группы в начале 80-х годов. Язык С++ является надмножеством языка Си, поэтому программы, написанные на языке Си могут обрабатываться компилятором языка С++. В программах на языке С++ можно использовать тексты на языке С и обращаться к библиотечным функциям языка Си. Язык С++ был создан с учетом следующих целей: улучшить язык Си, поддержать абстракцию данных и обеспечить объектно-ориентированное программирование.

НЕ нашли? Не то? Что вы ищете?

Через несколько лет практического использования языка С++ стандартом языка де-факто стала спецификация языка АТ&Т С++ release 2.0, разработанная под руководством автора языка Б. Страуструпом в Bell Laboratories фирмы AT&T. Затем там же появилась усовершенствованная версия 3.0 языка С++. В настоящее время в Американском Национальном Институте Стандартов (ANSI) существует комитет по языку С++ (X3J16). Изданное в 1990 году описание языка с комментариями принято комитетом ANSI в качестве исходного материала для стандартизации С++. Последняя версия стандарта (но не окончательная) датирована 26 мая 1994г.

Весьма полная реализация соглашений по языку С++ выполнена в широко распространённых компиляторах Turbo C и Borland C++ фирмы Borland International. Turbo C и Borland C++ поддерживают стандарты языков соответственно Си и С++, разработанные ANSI, но содержат и ряд дополнительных языковых средств и библиотечных функций.

Большинство пользователей осваивают Borland C++ для того, чтобы пользоваться преимуществами объектно-ориентированных средств языка С++.

В настоящее время широкое распространение получила интегрированная среда программирования Borland C++, поддерживающая объектно-ориентированный язык программирования С++. Мы будем использовать версию 3.1.

1. ВВЕДЕНИЕ В С++

1.1. Интегрированная среда программирования Borland C++

Системы программирования на языке С++ – Borland C++ включают в себя:

интегрированную среду программирования (Integrated Development Environment - IDE), называемую далее просто IDE или интегрированной средой;

компилятор исходного текста программы;

редактор связей (компоновщик);

библиотеки заголовочных файлов;

библиотеки функций;

программы-утилиты.

Интегрированная среда (IDE) – это программа, имеющая встроенный редактор текстов, подсистему работы с файлами, систему помощи (далее Help-система или просто Help), встроенный отладчик, подсистему управления компиляцией и редактированием связей, а также компилятор и редактор связей. Другими словами, IDE даёт возможность получить. EXE-файл, не используя другие программы. Borland C++ имеет два варианта IDE: BC. EXE для работы в реальном режиме; BCX. EXE для работы в защищённом режиме.

Кроме встроенного в интегрированную среду компилятора, Borland C++ имеет ещё один компилятор, называемый компилятором командной строки (файл BCC. EXE). Компилятор командной строки – это полный компилятор, поддерживающий все возможности системы программирования. Компилятор командной строки по умолчанию после завершения компиляции автоматически вызывает редактор связей. Редактор связей имеет имя файла TLINK. EXE. В настоящий момент редактор связей TLINK. EXE практически полностью совместим с редактором связей LINK. EXE фирмы Microsoft.

Среди характерных особенностей интегрированной среды Borland C++ можно выделить мощную оконную систему с возможностью передвижения и изменения размера окон, поддержку манипулятора “мышь”, многооконный текстовый редактор, окна диалогов, различные меню.

Прежде чем начать работу в IDE, следует проверить и при необходимости выставить нужные опции.

Меню Options включает команды Compiler, Transfer…, Make…, Linker…, Application…, Debugger…, Directories… Все опции имеют значение по умолчанию, ”впечатанные” в программу интегрированной среды и изменяемые с помощью программы настройки IDE.

Для того, чтобы работать в IDE, прежде всего, требуется задать директории, используемые текстовым редактором, компилятором и компоновщиком. Для этого используется команда Directories.

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

Работа IDE Borland C++ с файлами проектов удобна и проста. Все необходимые для этого команды (Open project…, Close project.., Add item…, Delete item, Local option…, Include files…) включены в меню Project.

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

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

Встроенный отладчик IDE позволяет:

1)выполнить программу по шагам;

2)выполнить программу до заданной строки, называемой точкой останова;

3)проследить изменения заданных переменных программы и при необходимости установить для них новые значения.

В ходе отладки программы можно сразу вносить изменения в ее текст. После каждого изменения отладчик запрашивает подтверждение на продолжение сеанса отладки или предлагает повторную компиляцию программы.

Возможностей встроенного отладчика IDE, в большинстве случаев достаточно для поиска и устранения практически всех типов смысловых ошибок. Но существует несколько случаев, когда необходимо использовать внешний турбо – отладчик TD. EXE.

Первый случай - использование регистровых псевдопеременных. Второй - это тщательная проработка программных деталей при оптимизации производительности программы и ее размера. Третий случай – это отладка резидентно завершающихся программ. И четвертый случай имеет место, когда причина ошибки неясна даже после тщательного исследования поведения программы средствами встроенного отладчика.

Borland C++ включает богатейшие библиотеки функций для управления файлами, выполнения ввода-вывода и многих других действий. Подавляющее большинство этих функций следует ANSI-стандарту языка Си, т. е. полностью совместимыми по типу параметров и возвращаемым значениям с другими системами программирования на Си, в частности Microsoft C. Прототипы, символические константы и другие макро, связанные с библиотечными функциями, объединяют в заголовочные файлы, которые по традиции имеют расширение имени файла. h.

Набор текста программы осуществляется встроенным или любым другим текстовым редактором. По традиции файлы, содержащие исходные тексты программ на языке Си, имеют раширение имени файла. С, а на языке С++ - .СРР. Текст программы может состоять из одного или нескольких файлов.

К программам-утилитам относят ассемблер (TASM. EXE), совместимый в настоящий момент с макроассемблером фирмы Microsoft, препроцессор (CPP. EXE), отладчик (TD. EXE) и связанные с ним файлы (драйверы, программы удаленной отладки и т. п.), программу профилирования (TPROF. EXE) и связанные с ней файлы, программу формирования объектных библиотек (TLIB. EXE) и многие другие полезные программы.

1.2. Структура программы на языке С++

Программы на С++ обычно состоят из большого числа исходных файлов, каждый из которых содержит описания типов, функций, переменных и констант. Чтобы имя можно было использовать в разных исходных файлах для ссылки на один и тот же объект, оно должно быть описано как внешнее.

Пример:

extern double sqrt (double);

extern istream cin;

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

Пример:

Если описание sqrt хранится в заголовочном файле для стандартных математических функций math. h, и нужно извлечь квадратный корень из числа 4, можно написать:

#include <math. h>

//…….

x=sqrt (4);

Рассмотрим структуру программы в С++ на примере:

//Prim1_1.cpp

// HELLO. CPP -имя файла с программой.

# include < iostream. h >

void main ( )

{

cout << "\nHELLO, WORLD!\n";

}

В первой строке программы – однострочный комментарий, начинающийся парой символ ‘//‘, заканчивающийся неизображаемым символом “конец строки”. Между этими разделителями может быть помещен произвольный текст. Комментарии объясняют, что происходит в программе. Комментарии используются для того, чтобы описать назначение раздела кода, объяснить предложение или разъяснить тот или иной специфический ход. Они облегчают чтение программы. Строки комментариев игнорируются компилятором; он просто пропускает их, преобразуя программу на С++ в машинный код.

Во второй строке помещена команда (директива) препроцессора, обеспечивающая включение в программу средств связи со стандартными потоками ввода и вывода данных. Указанные средства находятся в файле с именем iostream. h (мнемоника:”i”(input) –ввод; “o”(output) –вывод; stream –поток; “h”(head) – заголовок). Стандартным потоком вывода по умолчанию считается вывод на экран дисплея.

Инструкции, включающие файлы заголовков, следует помещать в начало файла.

Широкие возможности языка С++ обеспечиваются библиотеками функций, которые поставляются вместе с компилятором. Функцией называют последовательный набор инструкций для решения специальной задачи. Библиотека - это отдельный файл, прилагающийся к компилятору и содержащий функции для решения распространенных задач.

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

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

Тело любой функции – это заключенная в фигурные скобки последовательность описаний, определений и операторов. Каждое описание, определение или оператор заканчивается символом “точка с запятой“. В теле функции main явных описаний и определений нет и есть только один оператор

cout << "\ n HELLO, WORLD!\n";

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

Структура программы:

main() Функция, означающая начало

{ программы - точку входа

...; здесь начинается функция

...;

...;

}

Пример:

//Prim1_2.cpp

#include <stdio. h>

main()

{

puts(“У меня все в порядке”);

puts(“А у тебя”);

return(0);

}

В примере использована функция вывода строки puts.

1.3. Алфавит языка

В алфавит языка С++ входят:

прописные и строчные буквы латинского алфавита;

цифры 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;

специальные знаки:

“ { } , | [ ] ( ) + - / % \ ; ‘ : < == > _ ! & # ~ . * ^ ? =

Из символов алфавита формируются лексемы языка:

идентификаторы;

ключевые (служебные, иначе зарезервированные ) слова;

константы;

знаки операций;

разделители (знаки пунктуации).

Лексема – это одна из смысловых единиц (имен, констант, зарезервированных слов и т. д.) во входном тексте для компилятора. Лексический анализатор разделяет входной текст, представляемый в виде потока знаков, на группы лексем.

1.4. Имена

Имя ( идентификатор ) состоит из последовательности букв и цифр. Первый символ должен быть буквой. Символ подчерка _ считается буквой. С++ не налагает ограничений на число символов в имени, но некоторые части реализации находятся вне ведения автора компилятора (в частности, загрузчик), и они такие ограничения налагают. Некоторые среды выполнения также делают необходимым расширить или ограничить набор символов, допустимых в идентификаторе. В качестве имени не могут использоваться ключевые слова С++.

Примеры имен:

Hello this_is_a_most_unusually_long_name

DEFINED foO bAr u_name

var0 var1 CLASS

Примеры последовательностей символов, которые не могут использоваться как идентификаторы:

012 $sys class 3var

pay. due foo~bar. name if

Буквы в верхнем и нижнем регистрах считаются различными, поэтому Count и count – различные имена, но вводить имена, лишь незначительно отличающихся друг от друга, нежелательно.

1.5. Директивы препроцессора #include и #define

Получение исполняемой программы из исходного текста на языке С++ происходит в несколько этапов. На самом первом этапе с исходным текстом программы работает специальная программа – препроцессор. Основная цель препроцессора – закончить формирование исходного текста программы на С++. Затем окончательный текст программы подвергается компиляции. Компиляция завершается генерацией объектного файла. После этого компоновщик формирует загрузочный модуль.

Обычно препроцессор вызывается компилятором автоматически. Однако для упрощения отладки программы Borland C++ включают в себя автономную программу препроцессора CPP. EXE. Результатом ее работы является окончательно сформированный препроцессором файл со всеми включенными файлами и другими выполненными директивами препроцессора.

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

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

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

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

Рассмотрим директивы препроцессора #include и #define.

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

Существуют следующие формы директивы:

#include <спецификация_файла>

#include “спецификация_файла”

Препроцессор заменяет директиву #include содержимым заданного файла. Первая форма директивы предполагает, что подключается “стандартный” заголовочный файл, имеющий по традиции расширение. h. Он будет отыскиваться в “стандартных” директориях, то есть в тех директориях, положение которых задано компилятору заранее. Если имя подключаемого файла задано в двойных кавычках, поиск файла выполняется по маршруту, указанному спецификацией файла. Если файл там не найден, просматриваются те же директории, что и в случае задания имени файла в угловых скобках.

Директива #define определяет макрос; общий вид записи директивы:

#define идентификатор_макро тело_макро

Препроцессор просматривает исходный текст и заменяет каждое вхождение лексемы “идентификатор_макро” на лексему (совокупность лексем) “тела_макро”. Расширению не подвергаются лексемы, входящие в состав строковых литералов, комментариев и символьных констант.

Пример:

//Prim1_3.cpp

#define HI “Hello, dear”

#define EMPTY /*пример пустого тела макро*/

#define BLANK …

#define YES 1

puts (HI); /* расширяется в puts (“Hello, dear”);*/

strcmp(buf, BLANK); /*расширяется в strcmp(buf, “”);*/

puts(“EMPTY”); /* расширение не выполняется внутри” ” */

/*Ни HI, ни EMPTY , ни BLANK не расширяются в комментариях*/

Как частный случай, директива #define может описывать те или иные числовые константы, которые часто называют символическими.

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

Разрешается описывать макросы с параметрами. Для этого макрос следует описывать так:

#define идентификатор_макро (список аргументов ) тело_макро;

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

Пример:

//Prim1_4.cpp

/*”заливает” экран в текстовом режиме цветом color*/

#include<dos. h>

#define FILI SCREAN (color)_AX=0x0600; /

_SX=0x0000; /

_DX=0x184f; /

_BH=color; /

geninterrupt(0x10);

FILI SCREAN(0x1f); /* синий фон, яркие белые буквы */

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

Используя знаки ## в макросах с параметрами, можно указать компилятору удалить все знаки между символами ##, в том числе и сами символы ##. В результате два формальных параметра сольются, образуя единую лексему. Так можно компоновать, например, идентификаторы или предложения языка С++ из отдельных слов.

В теле макроса с параметрами перед формальным параметром может быть помещен одиночный символ #. Он служит указанием компилятору преобразовать фактический аргумент в строку символов.

//Prim1_5.cpp

#define PRN(number) printf(#number"=%d\n",number);

int scale=25, param=10;

PRN(scale); /*на экране будет напечатано : scale=25*/

PRN(param); /* на экране будет напечатано : param=10*/

При расширении, например, макро PRN(scale) будет заменено строкой printf("scale""=%d/n", scale), но два расположенных в одной строке без разделителей строковых литерала рассматриваются как один, то есть программа выполняет обращение к функции печати.

2. ОСНОВНЫЕ ТИПЫ ДАННЫХ И ИХ ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ

2.1. Переменные и константы

Данные, обрабатываемые компьютером, - это константы и переменные. Все переменные в языке С++ должны быть описаны явно. Описание переменной включает спецификацию типа, имя переменной, ряд необязательных модификаторов, задающих или особенности внутреннего представления переменно, или класс её хранения. При описании возможно задание начального значения переменной (инициализация переменной). Тип константы распознаётся компилятором по её записи в программе.

Понятие «тип» - одно из фундаментальных для любого языка программирования. В С++ все типы разбиваются на 4 категории: «пустой» тип (void); скалярный тип; тип «функция»; агрегированный тип (агрегат).

К скалярным относят арифметические типы, перечисления, указатели, ссылочный тип (reference type). К агрегированным типам относят массивы, структуры и объединения и классы.

Кроме того, типы могут быть разделены на основные (фундаментальные) и производные (derived). К основным типам относят void, char, int, float, и double вместе с вариантами short, long, signed и unsigned, применимыми к некоторым из них.

В С++ есть набор основных типов, которые соответствуют наиболее общим основным единицам памяти компьютера и наиболее общим основным способам их использования:

char, short int, int, long int для представления целых различных размеров;

float, double для представления чисел с плавающей точкой;

unsigned char, unsigned short int, unsigned int, unsigned long int для представления беззнаковых целых, логических значений, битовых массивов и т. п.

Производные типы - это указатели и ссылки на другие типы, массивы, функции, классы, структуры и объединения.

2.2. Данные типа int

Тип «целое» (integer) включает данные типа char, short, int И long вместе с их вариантами signed и unsigned. Данные типа int (переменные и константы) могут быть в одной из следующих возможных форм, указанных в табл.1.

Таблица 1

Данные типа int для компилятора Borland C++ 3.1

Тип

Размер,

Бит

Диапазон представления чисел

Минимум

Максимум

Unsigned int

Short int

Int

Long

Unsigned long

16

16

16

32

32

0

-2

0

65 535

32 767

32 767

2

4

Как следует из таблицы, short int и int являются синонимами. Синонимами являются типы unsigned int и unsigned.

Язык С++ поддерживает IEEE – стандарт внутреннего представления данных типа int (рис.1).

Int

S

Значение числа

15

14 0

unsigned int

Значение числа

15 0

long int

S

Значение числа

31

30 0

long unsigned

Значение числа

31 0

S - знаковый разряд числа

Рис.1. IEEE - стандарт внутреннего представления данных типа int

В компьютере с 16-ти разрядным процессором данные типа int занимают 2-а байта памяти (машинное слово), данные типа long занимают 4-ре байта. Старший бит знаковых типов int, short int, long int хранит знак числа. Если он равен нулю, число положительное, если он равен единице – число отрицательное. Положительные числа хранятся в памяти и вступают в операции в прямом коде, т. е. в обычном двоичном представлении числа. Отрицательные числа хранятся в памяти компьютера в дополнительном коде. Приведем правило получения дополнительного кода:

модуль отрицательного числа записывается в прямом коде в битах 14-0 или 30-0 «прижатым» вправо. В неиспользуемые старшие биты записываются нули;

в знаковый разряд бит 15 или 31 записывается 1;

формируется обратный код битов 14-0 или 30-0; для этого нуль заменяется единицей, а единица нулем;

к обратному коду числа прибавляется единица.

Например, обратный код числа –33 в формате int:

15

14 0

1

000.0000.0010.0001

Прямой код

1

111.1111.1101.1110

Обратный код

+

1

1

111.1111.1101.1111

Дополнительный код FFDEh

Константы типа int могут задаваться в десятичной, восьмеричной и шестнадцатеричной системой счисления. Признаком константы в шестнадцатеричной системе счисления являются 0х (0Х) в качестве первых ее символов. Запись такой константы может содержать цифры от 0 до 9, а также символы шестнадцатеричных цифр A-F. Любая константа, начинающаяся с нуля, рассматривается компилятором как заданная в восьмеричной системе счисления.

Если в записи константы встречается суффикс L (l), компилятор интерпретирует константу как long. Суффикс U(u) явно указывает на константу типа unsigned. Разрешается комбинировать оба суффикса в любом порядке, например 976LU.

При отсутствии суффиксов L(l) или U(u) точный тип константы определяется по ее записи (табл.2). Отрицательные константы получаются применением операции «унарный минус» к соответствующей положительной константе.

Переменная типа int объявляется с использованием ключевых слов unsigned, int, short, long. Синонимами будут сочетания ключевых слов: signed int и int; unsigned int и unsigned; short, sort int и signed short int; unsigned short и unsigned short int; long, long int и signed long int; unsigned long и unsigned long int.

При описании переменной ей может быть задано начальное значение. Например:

int i=0xabcd, j=04567, k=1;

Таблица 2

Целые константы и их тип при отсутствии суффиксов для компилятора

Borland C++ 3.1

Записанное значение константы

Тип, принимаемый компилятором

Десятичные константы:

От 0 до

Отдо 2

От 2 до 4

> 4

Int

Long

Unsigned long

Генерируется ошибка

Восьмеричные константы:

От 00 до 077777

От 0100000 до 0177777

От до

От до

>

Int

Unsigned int

Long

Unsigned long

Генерируется ошибка

Шестнадцатиричные константы:

От 0x0000 до 0x7FFF

От 0x8000 до 0xFFFF

От 0x10000 до 0x7FFFFFFF

От 0x до 0xFFFFFFFF

> 0xFFFFFFFF

Int

Unsigned int

Long

Unsigned long

Генерируется ошибка

Если в описании опущен тип, он предполагается int. Например:

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7