В.л.бусько, а.г.корбит, т.м.кривоносова
В.Л.Бусько, А.Г.Корбит, Т.М.Кривоносова
Конспект лекций по курсу
ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
для студентов всех специальностей и всех форм обучения
Минск 2004
УДК 621.3.6 (075.8)
ББК22.193 Я73
С 35
Рецензент: канд. техн. наук, доцент, зав. кафедры ПОИТ БГУИР В.В.Бахтизин
Бусько В.Л., Корбит А.Г., Кривоносова Т.М.
Конспект лекций по курсу «Основы алгоритмизации и программирования» для студентов всех специальностей и всех форм обучения. - Мн.: БГУИР, 2004. - 89 с.: ил. 4.
ISBN
Общий курс программирования предполагает знакомство с устройством ПЭВМ, теорией кодирования и хранения данных в памяти; изучение и закрепление навыков разработки вычислительных алгоритмов решения задач; изучение языка программирования Си; освоение операционных систем, изучение и освоение различных технологий программирования при решении конкретных задач.
Усвоение этих разделов осуществляется при подготовке студентов информационного профиля. Для студентов радиотехнических специальностей в первую очередь необходимо получить навыки алгоритмизации и программирования, освоить способы решения, в первую очередь, вычислительных задач.
Настоящее пособие по курсу «Основы алгоритмизации и программирования» представляет собой конспект лекций по темам, охватывающим основные конструкции языка Си. Неотъемлемой частью данного пособия является лабораторный практикум [1], при выполнении которого студенты осваивают основные конструкции среды программирования и получают навыки алгоритмизации и решения задач на персональном компьютере.
УДК 621.3.6 (075.8)
ББК22.193 Я73
ISBN
ã Коллектив авторов, 2004
СОДЕРЖАНИЕ
Стр. | |
1. Введение | |
1.1. История создания ЭВМ | |
1.2. Структура ПЭВМ | |
1.3. Классификация языков программирования | |
1.4. Размещение данных и программ в памяти ПЭВМ | |
1.5. Программные модули | |
1.6. Ошибки | |
1.7. Функциональная и модульная декомпозиции | |
1.8. Файловая система хранения информации | |
1.9. Операционная система | |
2. Основные понятия и определения | |
2.1. Этапы решения задач на ЭВМ | |
2.2. Понятие алгоритма и способы его записи | |
2.3. Свойства алгоритмов | |
2.4. Способы описания алгоритмов | |
2.5. Графическое описание алгоритма | |
2.6. Основные символы схемы алгоритма | |
2.7. Пример простейшего линейного алгоритма | |
2.8. Немного истории | |
3. Синтаксис языка Cи | |
3.1. Алфавит языка | |
3.2. Лексемы | |
3.3. Идентификаторы и ключевые слова | |
3.4. Знаки операций | |
3.5. Литералы (константы) | |
3.6. Комментарии | |
4. Базовые типы объектов | |
4.1. Простейшая программа | |
4.2. Основные типы данных | |
4.3. Декларация (объявление) объектов | |
4.4. Данные целого типа (int) | |
4.5. Данные символьного типа (char) | |
4.6. Данные вещественного типа (float, double) | |
5. Константы в программах | |
5.1. Целочисленные константы | |
5.2. Константы вещественного типа | |
5.3. Символьные константы | |
5.4. Строковые константы | |
Стр. | |
6. Обзор операций | |
6.1. Операции, выражения | |
6.2. Арифметические операции | |
6.3. Операции присваивания | |
6.4. Сокращенная запись операции присваивания | |
6.5. Преобразование типов операндов арифметических операций | |
6.6. Операция приведения типа | |
6.7. Операции сравнения | |
6.8. Логические операции | |
6.9. Побитовые логические операции. Операции над битами | |
6.10. Операция , (запятая) | |
7. Обзор базовых инструкций языка С | |
7.1. Стандартная библиотека языка Си | |
7.2. Стандартные математические функции | |
7.3. Функции вывода данных на дисплей | |
7.4. Функции ввода информации | |
7.5. Ввод - вывод потоками | |
7.6. Дополнительные функции | |
8. Синтаксис операторов языка C | |
8.1. Условные операторы | |
8.2. Условная операция «? :» | |
8.3. Оператор выбора альтернатив (переключатель) | |
9. Составление циклических алгоритмов | |
9.1. Понятие цикла | |
9.2. Оператор с предусловием while | |
9.3. Оператор цикла с постусловием do – while | |
9.4. Оператор цикла с предусловием и коррекцией for | |
10. Операторы передачи управления | |
10.1. Оператор безусловного перехода goto | |
10.2. Оператор continue | |
10.3. Оператор break | |
10.4. Оператор return | |
11 . Указатели | |
11.1. Указатели | |
11.2. Операции над указателями (косвенная адресация) | |
12. Массивы | |
12.1. Понятие массива | |
12.2. Одномерные массивы | |
12.3. Многомерные массивы | |
12.4. Операция sizeof | |
12.5. Применение указателей | |
12.6. Указатели на указатели | |
12.7. Адресная функция | |
Стр. | |
13. Работа с динамической памятью | |
13.1. Пример создания одномерного динамического массива: | |
13.2. Пример создание двуxмерного динамического массива: | |
4. Строки в языке Си | |
14.1. Русификация под Visual | |
15. Функции пользователя | |
15.1. Декларация функции | |
15.2. Вызов функции | |
15.3. Операция typedef | |
15.4. Указатели на функции | |
15.5. Параметры командной строки функции main | |
15.6. Функции с переменным числом параметров | |
16. Классы памяти и области действия объектов | |
16.1. Классы памяти объектов в языке Cи | |
16.2. Автоматические переменные | |
16.3. Внешние переменные | |
16.4. Область действия переменных | |
17. Структуры, объединения, перечисления | |
17.1. Структуры | |
17.2. Декларация структурного типа данных | |
17.3. Создание структурных переменных | |
17.4. Вложенные структуры | |
17.5. Массивы структур | |
17.6. Размещение структурных переменных в памяти | |
17.7. Объединения | |
17.8. Перечисления | |
18. Файлы в языке С | |
18.1. Открытие файла | |
18.2. Закрытие файла | |
18.3. Запись - чтение информации | |
18.4. Текстовые файлы | |
18.5. Бинарные файлы | |
Список рекомендуемой литературы | |
Список используемой литературы | |
Приложение 1. Таблицы символов ASCII | |
Приложение 2. Операции языка Си | |
Приложение 3. Возможности препроцессора |
1. Введение
1.1. История создания ЭВМ
Проблема вычислений сопровождает человечество на всем историческом отрезке его существования. Первый счетный инструмент абак был известен еще в V веке до нашей эры в Египте, Финикии, Греции и представлял дощечку, покрытую слоем песка, на которой острой палочкой проводили линии и в получавшихся колонках по позиционному принципу размещали камешки. В древнем Риме абак назывался Calculi. От этого слова произошло в дальнейшем латинское calculatore (вычислять).
Первую счетную машину для выполнения сложения и вычитания сконструировал в 1623г. профессор математики и астрономии Тюбингенского университета В.Шинкард. Она была изготовлена в одном экземпляре и, сгорев во время пожара в 1624г., не оказала влияния на развитие идей счетной техники.
Биография механических счетных машин ведется от арифметической машины французского математика, физика и философа Б.Паскаля, созданной в 1642г. Над счетной машиной Б.Паскаль работал 12 лет и сделал около 50 действующих моделей. Первый арифмометр, выполняющий все четыре арифметических действия, был предложен в 1670г. немецким ученым Г.В.Лейбницем. В Беларуси первая суммирующая машина была изобретена и изготовлена в 1770г. в г. Несвиже Евной Якобсоном, часовым мастером и механиком.
Идею универсальной вычислительной машины с программным управлением впервые предложил в своем неосуществленном проекте в 1834 г. английский ученый Ч.Бэббедж. Ее структура совпадала по существу со структурой современных ЭВМ.
Отличительной особенностью электронных вычислительных машин (ЭВМ) от счетных машин является наличие устройства управления вычислениями и принцип хранения программы. Еще одной особенностью современных ЭВМ является применение двоичной системы счисления.
Двоичную арифметику разработал Г.В.Лейбниц. Он также предложил арифметизацию логики за 200 лет до создания алгебры Дж.Буля (1815). Как двоичная арифметика представляет все числа с помощью двух символов (0,1), так и булева алгебра оперирует с двумя понятиями (истина, ложь) и тремя операциями (и, или, не).
С помощью этих понятий можно смоделировать любые логические цепочки и построить 16 логических функций. На этой основе строятся все современные логические схемы различной сложности, реализуемые в ЭВМ.
Первая ЭВМ была создана в 1945г. (США), она представляла огромное сооружение, содержащее 18000 электронных ламп, 1500 реле и выполняла около 3000 умножений в секунду. Мировой парк ЭВМ к 1965г. насчитывал порядка 50 тысяч компьютеров, к началу 1975г. – более 200 тысяч.
Первые персональные ЭВМ (ПЭВМ) появились в начале 70-х годов. Скорость вычислений достигает 108 операций в секунду.
Структура ПЭВМ
ПЭВМ содержат клавиатуру, системный блок, и дисплей. Схема ПЭВМ представлена на рис. 1.
Рис.1.
В системном блоке ПЭВМ содержатся:
- центральный процессор (ЦП), который осуществляет управление работой и выполнение расчетов по программе;
- оперативное запоминающее устройство (ОЗУ), в котором во время работы компьютера располагаются выполняемые программы (при выключении компьютера - очищается);
- постоянное запоминающее устройство (ПЗУ), содержащее программы, необходимые для запуска компьютера;
- жесткий магнитный диск (ЖД), получивший название винчестер;
- дисковод (ГД) для сменных, гибких магнитных дисков (дискет);
- CD-Rom (СД) – устройство чтения компакт-дисков.
В системный блок встроены электронные схемы, управляющие работой различных устройств, входящих в состав компьютера. К системному блоку подключаются дисплей (монитор) для отображения информации, клавиатура для ввода данных и команд, устройство для визуального управления - «мышь», печатающее устройство - принтер, устройство для считывания и ввода графической информации - сканер.
Программные модули
Программист пишет программу на языке высокого уровня, т.е. наиболее удобном для записи алгоритма решения определенного класса задач. Исходный текст программы, введенный с помощью клавиатуры в память компьютера - исходный модуль (sourse code, в языке Си имеет расширение *.cpp).
Транслятор - программа, осуществляющая перевод текстов с одного языка на другой, т.е. транслятор переводит программу с входного языка системы программирования на машинный язык ЭВМ, на которой функционирует данная система или будет функционировать разрабатываемая программа; либо на промежуточный язык программирования, уже реализованный или подлежащий реализации. Одной из разновидностей транслятора является компилятор, обеспечивающий перевод программ с языка высокого уровня (приближенного к человеку) на язык более низкого уровня (близкий к ЭВМ), или машинозависимый язык.
Интерпретатор представляет собой программный продукт, выполняющий созданную программу путем одновременного анализа и реализации предписанных действий. При использовании интерпретатора отсутствует разделение на две стадии - перевод и выполнение.
Большинство трансляторов языка Си, с которыми мы будем работать - компиляторы.
Результат обработки исходного модуля компилятором - объектный модуль (object code, в языке Си имеет расширение *.obj). Он не может быть выполнен, т.е. это незавершенный вариант машинной программы, т.к., например, к нему должны быть присоединены модули стандартных библиотек. Здесь компилятор (compiler) - вид транслятора, представляющего программу-переводчик исходного модуля в язык машинных команд.
Исполняемый (абсолютный, загрузочный) модуль создает вторая специальная программа - «компоновщик». Ее еще называют редактором связей (Linker). Она и создает модуль, пригодный для выполнения на основе одного или нескольких объектных модулей.
Загрузочный модуль (Load module, расширение *.exe) – это программный модуль, представленный в форме, пригодной для загрузки его в память и выполнения.
Ошибки
Ошибки, допускаемые при написании программ, разделяют на синтаксические и логические.
Синтаксические ошибки - нарушение формальных правил написания программы на конкретном языке, обнаруживаются на этапе трансляции и могут быть легко исправлены.
Логические ошибки делят на ошибки алгоритма и семантические ошибки - могут быть найдены и исправлены только разработчиком программы.
Причина ошибки алгоритма - несоответствие построенного алгоритма ходу получения конечного результата сформулированной задачи.
Причина семантической ошибки - неправильное понимание смысла (семантики) операторов языка.
Операционная система
Вся работа компьютера осуществляется под управлением специальных программ, называемых операционной системой (ОС). С точки зрения пользователя ОС представляет широкий набор системных команд, задавая которые можно потребовать от ПЭВМ выполнения многих полезных процедур и действий.
Часть программ ОС предназначена для управления процессом выполнения задач. Имеется группа программ, так называемого администратора системы, позволяющая следить за работой группы пользователей в рамках системы. Важное место занимает блок программ, обеспечивающих обмен сообщениями между пользователями сети, в том числе через интернет.
Удобства, предоставляемые пользователю, существенно зависят от качества ОС, которые по мере совершенствования компьютеров постоянно развиваются.
В настоящее время наибольшее распространение имеют OC WindowsХХ и LinuxХХ.
2. Основные понятия и определения
Этапы решения задач на ЭВМ
Решение задачи на ЭВМ можно разбить на следующие этапы:
- математическая или информационная формулировка задачи;
- выбор метода (например, численного) решения поставленной задачи;
- построение алгоритма решения поставленной задачи;
- запись построенного алгоритма, т.е. написание текста программы;
- отладка программы - процесс обнаружения, локализации и устранения возможных ошибок;
- выполнение программы - получение требуемого результата.
Свойства алгоритмов
Дискретность - значения новых величин (данных) вычисляются по определенным правилам из других величин с уже известными значениями.
Определенность (детерминированность)- каждое правило из системы однозначно, а данные однозначно связаны между собой, т.е. последовательность действий алгоритма строго и точно определена.
Результативность (конечность) - алгоритм решает поставленную задачу за конечное число шагов.
Массовость - алгоритм разрабатывается так, чтобы его можно было применить для целого класса задач, например алгоритм вычисления определенных интегралов с заданной точностью.
Способы описания алгоритмов
Существует несколько способов описания алгоритмов. Наиболее распространенными являются словесное и графическое описания алгоритма.
Словесное описание алгоритма рассмотрим на конкретном примере: пусть необходимо найти наибольший общий делитель для двух целых положительных чисел a и b.
1) Сравнить a и b. Если a<b, то положить d=a; m=b, иначе d=b и m=a.
2) Разделить m на d. Обозначить остаток от деления r.
3) Если d=0, то это искомое число. Закончить вычисления. Иначе перейти к пункту 4.
4) Заменить значение m значением d.
5) Заменить d значение значением r.
6) Перейти к пункту 2.
Здесь алгоритм описан с помощью естественного языка, а объекты обработки, являющиеся числами, обозначены буквами.
Например, рассмотрим алгоритм решения квадратного уравнения вида a*x2+b*x+c=0:
1) вычислить D = b*b - 4 * a * c;
2) если D<0, то перейти к 4;
3) вычислить ; ;
4) конец.
Специальные символы
Соединитель - используется при обрыве линии и продолжении ее в другом месте (необходимо присвоить название).
Терминатор - вход из внешней среды или выход во внешнюю среду (начало или конец схемы программы).
Коментарий.
Пример простейшего линейного алгоритма
Наиболее часто в практике программирования требуется организовать расчет некоторого арифметического выражения при различных исходных данных. Например, такого:
при x>0 - вещественное, m - целое.
Разработка алгоритма обычно начинается с составления схемы. Продумывается оптимальная последовательность вычислений, при которой, например, отсутствуют повторения. При написании алгоритма рекомендуется переменным присваивать те же имена, которые фигурируют в заданном арифметическом выражении, либо иллюстрируют их смысл.
Для того чтобы не было "длинных" операторов, исходное выражение полезно разбить на ряд более простых. В нашей задаче предлагается схема вычислений, представленная на рис. 3.
Она содержит ввод и вывод исходных данных, линейный вычислительный процесс, вывод полученного результата. Заметим, что выражение вычисляется только один раз. Введя дополнительные переменные a,b,c, мы разбили сложное выражение на ряд более простых выражений.
Немного истории
Алгоритмический язык С был разработан в 1972 г. сотрудником фирмы AT&T Bell Laboratory Денисом Ритчи на базе языка В (автор К.Томпсон), который в свою очередь основывался на языке системного программирования BCPL. Первая версия языка была опубликована в книге авторов Д.Ритчи и Б.Кернигана и получила название стандарт K&R. Минимальная стандартная реализация, поддерживаемая любым компилятором, содержала всего 27 ключевых слов. Началось успешное развитие языка и чтобы избежать путаницы Американский институт стандартизации (American National Standart Institute) ввел в 1983 г. общий стандарт языка – ANSI стандарт.
Язык продолжает развиваться и в 1985 г. появляется язык С++, который в основном сохраняет все черты обычного С, но дополнен новыми существенными возможностями, которые позволили реализовать объектно-ориентированный стиль программирования.
Язык С отражает возможности современных компьютеров. Программы на С отличаются компактностью и быстротой исполнения. Структура С побуждает программиста использовать в своей работе нисходящее программирование, структурное программирование, пошаговую разработку модулей.
Области применения языка C - системное программирование и прикладные задачи с жесткими требованиями по скорости и памяти.
3. Синтаксис языка Cи
В языках программирования вместо номеров ячейкам памяти принято давать имена (идентификаторы), а содержимое ячеек называть переменными, или константами, в зависимости от того, изменяется значение в процессе работы или нет.
В языке Си фундаментальным понятием является инструкция (операция, оператор, функция), которая представляет собой описание определенного набора действий. Таким образом, программа, написанная на языке Си, состоит из последовательности инструкций.
Алфавит языка
Каждому из множества значений, определяемых одним байтом, - от 0 до 255, ‑ в таблице знакогенератора вычислительной машины ставится в соответствие символ. По системе кодировки фирмы IBM символы с кодами от 0 до 127, образующие первую половину таблицы знакогенератора, построены по стандарту ASCII и одинаковы на всех IBM-совместимых компьютерах. Вторая половина символов (коды 128 … 255) может отличаться на разных компьютерах. Обычно коды от 128 до 175 и от 224 до 239 используются для размещения символов национального алфавита, коды с 176 по 223 отводятся под символы псевдографики и коды с 240 по 255 – под специальные знаки (Приложение 1).
Алфавит языка Си включает:
- прописные и строчные буквы латинского алфавита, а также знак подчеркивания (код ASCII 95);
- арабские цифры от 0 до 9;
- специальные символы:
+(плюс) –(минус) *(звездочка) /(дробная черта) =(равно) >(больше) <(меньше) ;(точка с запятой) &(амперсант) [ ](квадратные скобки) { }(фигурные скобки) ()(круглые скобки) _(знак подчеркивания) (пробел) .(точка) ,(запятая) :(двоеточие) #(номер) %(процент) ~(поразрядное отрицание) ?(знак вопроса) !(восклицательный знак) \(обратный слеш).
- пробельные (разделительные) символы: пробел, символы табуляции, перевода строки, возврата каретки, новая страница и новая строка.
Лексемы
Из символов алфавита формируются лексемы языка – минимальные значимые единицы текста в программе:
- идентификаторы;
- ключевые (зарезервированные) слова;
- знаки операций;
- константы;
- разделители (скобки, точка, запятая, пробельные символы).
Границы лексем определяются другими лексемами, такими, как разделители или знаки операций, а также комментариями.
Знаки операций
Знак операции – это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и тернарные операции, по количеству участвующих в них операндов.
Литералы (константы)
Когда в программе встречается некоторое число, например 1, то это число называется литералом или литеральной константой. Константой, потому что мы не можем изменить его значение, и литералом, потому что буквально передает свое значение (от латинского literal – буквальный).
Литерал является неадресуемой величиной: хотя реально он, конечно, хранится в памяти машины, нет никакого способа узнать его адрес. Каждый литерал имеет определенный тип.
Комментарии
Еще один базовый элемент языка программирования – комментарий, – не является лексемой. Внутри комментария можно использовать любые допустимые на данном компьютере символы, а не только символы из алфавита языка программирования, поскольку компилятор комментарии игнорирует.
В Си комментарии ограничиваются парами символов /* и */, а в С++ был введен вариант комментария, который начинается символами // и заканчивается символом перехода на новую строку.
Базовые типы объектов
Простейшая программа
Программа написанная на языке Си состоит из одной или нескольких функций, причем одна функция обязательна имеет идентификатор (имя) main() – основная, главная. Ее назначение – управление всей работой программы (проекта). Данная функция, как правило, не имеет параметров и не возвращает результат, но наличие круглых скобок (как и для других функций без параметров) обязательно.
Общая структура программы на языке Си имеет вид:
<директивы препроцессора>
<определение типов пользователя – typedef>
<описание прототипов функций>
<определение глобальных переменных>
<функции>
В свою очередь, функции имеют такую структуру:
<класс памяти> <тип> < ID функции> (<объявление параметров>)
{ - начало функции
код функции
} - конец функции
Рассмотрим кратко основные части общей структуры программ.
Перед компиляцией программа на языке Си обрабатывается специальной программой – препроцессором, который работает под управлением директив.
Препроцессорные директивы начинаются с символа #, за которым следует наименование директивы, указывающее текущую операцию препроцессора.
Препроцессор решает ряд задач по предварительной обработке программы, основной из которых является «подключение» к программе так называемых заголовочных файлов (обычных текстов) с декларацией стандартных библиотечных функций, которые используются в программе. Наименование такой директивы: include (подключить), а общий формат ее использования:
#include < ID_файла.h>
где «h» – расширение заголовочных файлов.
Если идентификатор файла заключен в угловые скобки (< >), то поиск данного файла производится в стандартной директории с этими файлами, если же ID файла заключено в двойные кавычки (” ”), то поиск данного файла производится в текущей директории.
К наиболее часто используемым библиотекам относятся:
stdio.h - содержит стандартные функции файлового ввода-вывода;
conio.h - функции для работы с консолью (клавиатура, экран монитора);
math.h - математические функции.
Второе основное назначение препроцессора – это обработка макроопределений. Макроподстановка define (определить) имеет общий вид:
#define < ID > <строка>
Например: #define PI 3.1415927
В ходе препроцессорной обработки программы появление в тексте идентификатора PI везде заменяется значением 3.1415927.
Основные возможности препроцессора приведены в Приложении 3.
Рассмотрим небольшой пример, позволяющий понять самые простейшие приемы программирования на языке Си:
#include <stdio.h>
void main(void)
{ // Начало функции main
printf(“ Высшая оценка знаний - 10 !”);
} // Окончание функции main
Отличительным признаком функции служат круглые скобки ( ) после идентификатора функции, в которые заключается список аргументов. Если аргументы отсутствуют, указывают атрибут void - отсутствие значения. Перед ID функции обычно указывается тип возвращаемого ею результата, так как функция main() ничего не возвращает - в качестве результата указывается void.
Код функции представляет собой набор инструкций, каждая из которых оканчивается символом «;». В нашем примере одна инструкция - функция printf() выполняет форматный вывод данных на экран, в данном случае, указанную фразу.
Основные типы данных
Данные в языке Си разделяются на две категории: простые (скалярные), будем их называть базовыми, и сложные (составные) типы данных.
Основные типы базовых данных: стандартный целый (int), вещественный с одинарной точностью (float) и символьный (char).
В свою очередь, данные целого типа могут быть короткими (short), длинными (long), и без знаковыми (unsigned), а вещественные - с удвоенной точностью (double).
Сложные типы – массивы, структуры (struct), объединения или смеси (union), перечисление (enum).
Данные целого и вещественного типов находятся в определенных числовых диапазонах так как занимают разный объем оперативной памяти:
Таблица 1
Тип данных | Объем памяти (байт) | Диапазон значений |
сhar | -128 …127 | |
int | -32768…32767 | |
short | 2(1) | -32768…32767(-128…127) |
long | -2147483648…2147483647 | |
unsigned int | 0…65535 | |
unsigned long | 0…4294967295 | |
float | 3,14*10-38…3,14*1038 | |
double | 1,7 *10-308 1,7 *10308 |
4.3. Декларация (объявление) объектов
Все объекты, с которыми работает программа в Си необходимо декларировать, т.е. объявить компилятору об их присутствии в программе. При этом возможны две формы декларации:
- описание, не приводящее к выделению памяти;
- определение, при котором под объект будет выделен объем оперативной памяти, в соответствии с его типом; в этом случае объект можно сразу инициализировать, т.е. задать его начальное значение.
Кроме констант, которые можно задавать в исходном тексте, все объекты программы должны быть явно декларированы по следующему формату:
<атрибуты> <список ID объектов>;
элементы списка разделяются запятыми, а атрибуты - разделителями. Например: int i,j,k; float a,b;
Объекты программы в общем случае имеют следующие атрибуты:
<класс памяти> - характеристика способа размещения объектов в памяти (статическая, динамическая), определяет область видимости и время жизни переменной (по умолчанию - auto), данные атрибуты будут рассмотрены позже;
<тип> - характеристика механизма интерпретации данных, т.е. это совокупность информации о том, сколько объекту нужно выделить памяти, какой вид имеет представление информации и какие действия над ней допустимы (по умолчанию - int).
Класс памяти и тип – атрибуты необязательные и могут отсутствовать, тогда их значения установятся по умолчанию.
Примеры декларации простых объектов:
int i,j,k;
char r;
double gfd;
Рассмотрим основные базовые типы данных более подробно.
4.4. Данные целого типа (int)
Тип int - целое число, обычно соответствующее естественному размеру целых в используемой ЭВМ. Квалификаторы short и long, которые можно использовать с типом int, указывают на различные размеры целых, т.е. определяют размер памяти, выделяемый под переменные (табл.1).
Примеры: short int x;
long int x;
unsigned int x = 8; (декларация с одновременной инициализацией числом 8).
Атрибут int в таких ситуациях может быть опущен.
Атрибуты signed и unsigned показывают, как интерпретируется старший бит числа, как знак или как часть числа:
int | Знак | Значение числа | |
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | - номера битов |
unsigned int | Значение числа |
15 0 |
long | Знак | Значение числа |
30 0 |
unsigned long | Значение числа |
31 0 |
Если указан только атрибут int, это означает - short signed int.
4.5. Данные символьного типа (char)
Символьная переменная занимает в памяти 1 байт и представляется кодом от 0 до 255. Закрепление конкретных символов за кодами производится кодовыми таблицами.
Для персональных компьютеров наиболее распространена ASCII (American Standard Code for Information Interchenge) таблица кодов (Приложение 1). Данные типа char рассматриваются компилятором как "целые", поэтому возможно использование signed char (по умолчанию) - символы с кодами от -128 до +127 (т.е. только символы с кодами до 127) и unsigned char - символы с кодами от 0 до 255 (в том числе и русские).
Примеры:
char res, simv1, simv2;
char let = 's'; (декларация с одновременной инициализацией символом s).
4.6. Данные вещественного типа (float, double)
Данные вещественного типа в памяти занимают, соответственно, float - 4 байта; double - 8 байт; long double (повышенная точность) - 10 байт. Для размещения данных типа float обычно 8 бит выделено для представления порядка и знака и 24 бита под мантиссу.
Тип | Точность (мантисса) | Порядок |
float | 7 цифр после запятой | ± 38 |
double | ± 308 | |
Long double | ± 4932 |
Константы в программах
Константы - объекты, не подлежащие использованию в левой части оператора присваивания, т.к. константа - является неадресуемой величиной и, хотя она хранится в памяти ЭВМ, нет никакого способа узнать ее адрес. В языке Си константами являются:
- самоопределенные арифметические, символьные и строковые данные;
- идентификаторы массивов и функций;
- элементы перечислений.
Арифметические константы могут быть целого или вещественного типов.
Целочисленные константы
Общий формат: ±n (+ обычно не ставится).
Десятичные константы - последовательность цифр 0...9, первая из которых не должна быть 0. Например, 22 и 273 - обычные целые константы, если нужно ввести длинную целую константу, то указывается признак L(l) - 273L (273l). Для такой константы будет отведено – 4 байта. Обычная целая константа, которая слишком длинна для типа int рассматривается как long.
Существует система обозначений для восьмеричных и шестнадцатеричных констант.
Восьмеричные константы - последовательность цифр от 0 до 7, первая из которых должна быть 0, например: 020 = 16-десятичное.
Шестнадцатеричные константы - последовательность цифр от 0 до 9 и букв от A до F (a...f), начинающаяся символами 0Х (0х), например: 0X1F (0х1f) = 31-десятичное.
Восьмеричные и шестнадцатеричные константы могут также заканчиваться буквой L(l) - long, например, 020L или 0X20L.
Примеры целочисленных констант:
1992 13, 777 1000L - десятичные;
0777 00033 01l - восьмеричные;
0x123 0X00ff 0xb8000l - шестнадцатеричные.
Символьные константы
Символьная константа - это символ, заключенный в одинарные кавычки: 'A', 'х' (занимает 1 байт). Тип char ® целое int.
Так же используются специальные последовательности символов, это управляющие последовательности (escape-последовательности), основные их них:
\n | - новая строка; |
\t | - горизонтальная табуляция; |
\0 | - нулевой символ (пусто). |
При присваивании символьной переменной эти последовательности должны быть заключены в апострофы. Символьная константа '\0', изображающая символ 0 (нуль – пусто), часто записывается вместо целой константы 0, чтобы подчеркнуть символьную природу некоторого выражения.
Текстовые символы непосредственно вводятся с клавиатуры, а специальные и управляющие представляются в исходном тексте парами текстовых символов. Примеры представления специальных символов языка Си:
\\ - обратная косая черта; \' - апостроф;