СИ. Программирование на языке CC Часть Структурное программирование
Скачать 1.65 Mb.
|
МИНИСТЕРСТВО ТРАНСПОРТА РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ АГЕНСТВО ВОЗДУШНОГО ТРАНСПОРТА ФГБОУ ВПО «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» КАФЕДРА ИНФОРМАТИКИ Ю. В. Земсков Программирование на языке C/C++ Часть Структурное программирование Учебное пособие Санкт-Петербург 2012 Земсков Ю.В. Программирование на языке C/C++. Часть I. Структурное программирование. Учебное пособие СПб университет ГА. СПб., Рецензенты СПб университет гражданской авиации, 2012 — 3 Содержание. Основные сведения о языке C/C++ 5 1.1. Алгоритмические языки 1.2. Состав языка 1.3. Переменные и именованные константы 1.4. Стандартные типы данных 1.5. Интегрированная среда разработки программ 1.5.1. Microsoft Visual Studio 16 1.5.2. Dev-C++ 18 1.6. Простейшая программа на языке C 19 1.7. Область действия переменных 1.8. Ввод-вывод числовых значений 1.9. Выражения и математические функции 1.10. Контрольные вопросы. Потоки ввода-вывода, условные операторы, циклы. Потоки ввода-вывода 42 2.2. Системы счисления. Кодирование чисел 2.3. Логические выражения 2.4. Условные операторы 2.5. Операторы цикла 2.6. Контрольные вопросы. Массивы и указатели. Одномерные статические массивы 3.2. Указатели. Динамические массивы 3.3. Сортировка элементов массива 3.4. Двумерные массивы 3.5. Контрольные вопросы. . . . . . . . . . . . . . . . . . . . . . . . 102 — 4 — 4. Модульное программирование. Функции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4.2. Параметры функций. . . . . . . . . . . . . . . . . . . . . . . . . 115 4.3. Многофайловые проекты. . . . . . . . . . . . . . . . . . . . . . 127 4.4. Шаблоны функций. . . . . . . . . . . . . . . . . . . . . . . . . 128 5. Символы, строки, структуры, файлы. Символы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 5.2. Строки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 5.3. Пользовательские типы данных. . . . . . . . . . . . . . . . . . 137 5.4. Работа с файлами. . . . . . . . . . . . . . . . . . . . . . . . . . 141 6. Основы объектно-ориентированного программирования. Классы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Список литературы 147 Книги по C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Книги по C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сборники задач. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Предметный указатель — 5 — 1. Основные сведения о языке C/C++ 1.1. Алгоритмические языки Алгоритм — конечный набор правил, который определяет последовательность операций для решения конкретного множества задач Алгоритмический язык — формальный язык, используемый для записи, реализации или изучения алгоритмов Язык программирования — формальная знаковая система, предназначенная для записи компьютерных программ Программа — совокупность данных и команд, предназначенных для реализации определённого алгоритма Программирование — научная и практическая деятельность по созданию программ ГОСТ Язык программирования определяет набор лексических, синтаксических и семантических правил, задающих внешний вид программы и действия, которые выполнит компьютер поде управлением. Синтаксис устанавливает правила построения всех элементов языка и описывает структуру программы как набор символов (обычно говорят безотносительно к содержанию. Семантика определяет смысли правила использования каждой синтаксической конструкции. Любой язык программирования является алгоритмическим языком, ноне всякий алгоритмический язык пригоден для использования в качестве языка программирования. Машинный код. Программа, непосредственно выполняемая процессором компьютера, представляет собой последовательность нулей и единиц, одни участки которой кодируют команды, а другие — данные. Подобная последовательность называется машинным кодом. Язык ассемблера представляет собой удобную для восприятия человеком форму записи машинных команд. Между машинным кодом и кодом на языке ассемблера существует взаимно — 6 однозначное соответствие. Программа, которая переводит текст с языка ассемблера в машинный код, называется ассемблером. Для каждого процессора имеется свой набор машинных команд и, следовательно, свой ассемблер. Далеко не всегда для написания программы требуется иметь полный контроль над процессором. Чаще всего на первый план выходят такие задачи, как быстрое написание читаемого и переносимого кода. Для этих целей были созданы языки высокого уровня. Язык программирования высокого уровня язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков — это абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понима- ния. Программа, написанная на языке высокого уровня, состоит из инструкций операторов. Каждый оператор языка высокого уровня соответствует последовательности из нескольких низкоуровневых инструкций (машинных команд). Парадигмы программирования. Языки высокого уровня, предназначенные для решения сходных задач сходными методами принято разделять на группы, называемые парадигмами. Парадигма программирования — это совокупность идей и понятий, определяющих стиль написания программ. В рамках каждой парадигмы существуют свои соглашения о том, какие подходы применяются при решении различных типов задач, как оформлять программный код и т. д. Все языки программирования делятся на две группы декларативные и императивные. Программа на императивном языке программирования с математической точки зрения представляет собой общее решение поставленной — 7 задачи, иными словами, ответ на вопрос как делать. Это последовательность команд, которые должен выполнить исполнитель. Программа на декларативном языке программирования является сочетанием формализованной в рамках языка программирования задачей и всех необходимых для её решения теорем, проще говоря, ответ на вопрос что делать?». В рамках императивной парадигмы существуют несколько подходов к разбиению задач на подзадачи основные из них процедурное программирование и объектно-ориентированное программирование. Эти два подхода рассматриваются, соответственно, впервой и второй части настоящего пособия. Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. В соответствии сданной методологией любая программа представляет собой структуру, построенную из трёх типов базовых конструкций (рис последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие. В программе базовые конструкции могут быть вложены друг в друга произвольным образом. Фрагменты программы, представляющие собой логически целостные вычислительные блоки (в том числе, повторяющиеся фрагменты) могут оформляться в виде так называемых подпрограмм процедур или функций). Язык C Си императивный язык программирования. Основные сферы его применения — системное программирование (практически всё современное системное ПО написано на C) и создание прикладных программа б в Рис. 1.1. Базовые конструкции структурного программирования а) последовательное исполнение б) ветвление в) цикл с предусловием С одной стороны, это язык программирования высокого уровня, поддерживающий методику структурного программирования. С другой стороны, этот язык обеспечивает возможность создавать системные программы, которые до него приходилось писать на языке ассемблера. Первым системным программным продуктом, разработанным с помощью C, стала операционная система. Поэтому нередко в литературе язык C называют языком среднего уровня. Стандарт языка C был утвержден в 1983 г. Американским национальным институтом стандартов (ANSI) и получил название ANSI С. Трансляция: интерпретация и компиляция. Есть два способа выполнения программы компьютером она может быть подвергнута компиляции или интерпретации. В простейшем случае интерпретатор читает исходный текст программы по строкам, выполняет инструкции, описанные в этой строке, и затем переходит к следующей. Так, например, работали ранние версии языка Basic. В языках типа Java исходный текст программы сначала конвертируется в промежуточную форму (байт-код), а затем уже интерпретируется при выполнении программы. Компилятор конвертирует программу в объектный код, то есть транслирует исходный текст программы в форму, более пригодную для непосредственного выполнения компьютером. Объектный код также называют двоичным или машинным кодом он зависит оттого, для какой платформы (какого — 9 процессора) производится компиляция программы. В общем случае интерпретируемая программа выполняется медленнее, чем скомпилированная. Программа, написанная на любом языке программирования, может как компилироваться, таки интерпретироваться, однако многие языки изначально созданы для выполнения преимущественно одним из этих способов. При разработке языка С/С++ его конструкции оптимизировались для компиляции. Трансляция — преобразование программы, представленной на одном языке программирования, в программу на другом языке, в определённом смысле равносильную первой. Таким образом, компилятор — это транслятор, который преобразует программы в машинный языка интерпретатор — это транслятор, осуществляющий пооператорную (покомандную) обработку и выполнение исходной программы. Состав языка Составными элементами исходного текста программы на языке C являются лексемы, выражения и операторы. Для их написания используются символы, образующие алфавит языка. Каждый элемент языка определяется синтаксисом и семантикой. Как уже отмечалось, синтаксические определения устанавливают правила построения элементов языка, а семантика определяет их смысли правила использования. Алфавит. Алфавит языка C/C++ включает прописные и строчные латинские буквы и знак подчёркивания; — арабские цифры от 0 до 9; — специальные знаки пробельные символы пробел, символ табуляции, символ перехода на новую строку — 10 В комментариях, строках и символьных константах (см. ниже) допускаются любые другие символы, например, буквы русского алфавита. Лексемы. Из символов алфавита формируются лексемы — минимальные (элементарные неделимые) единицы языка программирования, имеющие самостоятельный смысл идентификаторы — имена программных объектов ключевые (зарезервированные) слова знаки операций константы разделители (скобки, точка, запятая, пробельные символы). Идентификаторы. В идентификаторе (имени) программного объекта могут использовать только латинской буквы, символ подчёркивания и цифры. Первым символом идентификатора должна быть латинская буква или символ подчёркивания (ноне цифра. Прописные и строчные буквы различаются, те и это три разных идентификатора. Пробелы внутри имён не допускаются. Ключевые слова. Ключевые слова — это зарезервированные идентификаторы, которые имеют специальное значение. Эти имена должны использовать только в том смысле, в каком они определены стандартом языка C/C++: asm else new this auto enum operator throw bool explicit private true break export protected try case extern public typedef catch false register typeid char float reinterpret_cast typename class for return union const friend short unsigned const_cast goto signed using continue if sizeof virtual default inline static void — 11 — delete int static_cast volatile do long struct wchar_t double mutable switch while dynamic_cast namespace В различных реализациях компилятора C/C++ список зарезервированных слов может быть расширен. Константы (литералы). Константы служат для представления неизменяемых величин. Обычно их называют литералами, чтобы не путать с именованными константами (см. раздел. Различают целые, вещественные, символьные и строковые литералы. Десятичные константы состоят из цифр 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 и 9 ; они не должны начинаться с нуля (кроме случая нулевой константы. Примеры: 21 , 0 Восьмеричные константы состоят из цифр от 0 до 7 ; они начинаются с цифры. Пример: 025 Шестнадцатеричные константы состоят из цифр от 0 до 9 и из букв A , B , C , D , E , F (строчные и прописные не различаются они начинаются символами или. Примеры: 0x15 , 0xFE08 Двоичные константы начинаются символами или, далее могут следовать только цифры 0 или 1 . Примеры: 0b11011010 , 0B00010110 Вещественные десятичные константы имеют дробную часть, которая отделяется от целой части точкой. Они могут быть записаны в формате с фиксированной точкой или в экспоненциальной форме (в виде мантиссы и порядка. Примеры: 35.18 , 3.518e1 Символьные константы состоят из одного (или двух) символов, окружён- ного апострофами (одиночными кавычками, например. Вместо символа можно писать его шестнадцатеричный код. Некоторые символы имеют специальное значение переход на новую строку (перевод строки горизонтальная табуляция (для построения таблиц — 12 — ’\’’ — апостроф (одиночная кавычка символ двойной кавычки символ обратный слэш» (обратная косая черта); и другие. Строковые константы состоят из произвольного числа любых символов, окружённых двойными кавычками, например: "Привет!" Комментарии. Комментарии либо начинаются знаком двойной слэш» // и продолжаются до конца строки, либо заключаются символами-скобками /* и Вложенные комментарии-скобки (те. комментарии внутри комментариев) в большинстве реализаций языка C не разрешены. Переменные и именованные константы Для хранения информации, обрабатываемой программой, используются переменные и именованные константы. Переменная — это именованная область памяти, используемая для хранения данных, которые могут быть изменены программой. У переменной есть имя, тип и значение. Тип переменной определяет 1) внутреннее представление данных в памяти компьютера, в том числе, размер памяти, отводимый для хранения значения 2) множество допустимых значений 3) набор допустимых операций, которые можно выполнять с переменной. Именованная константа — это именованная область памяти, используемая для хранения данных, которые не могут быть изменены программой. Все переменные и константы в языке C/C++ должны быть описаны перед первым использованием. Описание может быть сделано в форме объявления или определения. Объявление информирует компилятор о классе памяти и типе переменной определение содержит, кроме этого, указание компилятору выделить память для хранения значения данной переменной. В наших первых — 13 простых программах объявления переменных будут являться одновременно и определениями. Различие между ними мы увидим в разделе 4 Формат описания переменной или константы: [ класс_памяти ] тип идентификатор [ инициализатор ]; Элементы описания, указанные в квадратных скобках, могут быть опуще- ны. Необязательный класс памяти может принимать значения auto , extern , static , register . Мы рассмотрим их позже (см. с. 24 ). Модификатор const показывает, что значение переменной изменить нельзя (те. она является константой). Правила именования программных объектов были описаны в разделе 1.2 Инициализатор позволяет присвоить переменной начальное значение. Для констант наличие инициализатора обязательно. Инициализатор записывается после знака равенства = значение или в круглых скобках ( значение ) Подробно о типах переменных мы поговорим в следующем разделе, а пока нам достаточно знать, что в языке C/C++ могут использоваться переменные целого типа int или вещественного типа Пример описания целой переменной: int i ; Пример описания вещественной константы double a = Водном операторе можно описывать (и, при необходимости, инициализировать) несколько переменных одного типа, разделяя их запятыми 5, k ; double x = 3.0, y ; Ещё один способ определить именованную константу — директива препроцессора, например — 14 — # d e f i n Знак присваивания в этом случае не используется. Точка с запятой после директивы не ставится. Константы, определённые через, принято писать заглавными буквами. Стандартные типы данных В языке C все типы делятся на простые (их также называют стандартными, базовыми или основными) и составные. Для описания шести стандартных типов данных в языке C используются следующие ключевые слова целое число (занимает в памяти 2 байта для разрядных систем байта для разрядных символ (1 байт расширенный символ (обычно 2 байта логическое значение ( true или false , 1 байт вещественное число (4 байта вещественное число двойной точности (8 байт). К имени типа может добавляться один из следующих модификаторов короткий длинный со знаком беззнаковый. Например: long или просто long ) — целое число двойной точности байта short или просто signed short ) — короткое целое со знаком (2 байта). В таблице 1.1 приведены сведения об основных типах языка C. — 15 Таблица 1.1. Стандартные типы данных Тип Диапазон значений Размер, байт bool true и char −128 . . . 127 1 unsigned char 0 . . . 255 1 signed short int −32 768 . . . 32 767 2 unsigned short int 0 . . . 65 535 2 signed long int −2 147 483 648 . . . 2 147 483 647 4 unsigned long int 0 . . . 4 294 967 295 4 float ±3.4𝑒 − 38 . . . ± 3.4𝑒 + 38 4 double ±1.7𝑒 − 308 . . . ± 1.7𝑒 + 308 8 long double ±3.4𝑒 − 4932 . . . ± 3.4𝑒 + 4932 Чтобы узнать количество байт, занимаемых конкретным типом данных, используется функция sizeof() . Например, вызов sizeof(float) вернёт значение По умолчанию все целочисленные типы, а также тип char считаются знаковыми, те. модификатор signed можно опускать. Вещественные константы по умолчанию имеют тип Числовым константам, встречающимся в программе, приписывается тот или иной тип в соответствии сих видом тип можно указать явно с помощью суффиксов: ∙ L или или или Например, константа 15L будет иметь тип signed long int и занимать 4 байта. Можно указывать несколько невзаимоисключающих суффиксов — 16 в произвольном порядке, например, 10UL или 10LU для константы типа unsigned long int |