Программирование на языке Си
Покупка
Основная коллекция
Тематика:
Программирование на C и C++
Издательство:
Сибирский федеральный университет
Автор:
Царев Роман Юрьевич
Год издания: 2014
Кол-во страниц: 108
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-7638-3006-4
Артикул: 621792.01.99
Изложены основы языка программирования Си. Рассмотрены все аспекты его применения при программной реализации алгоритмов. Описаны такие типы данных, как массивы, структуры, файлы, и возможности языка Си по работе с ними. Приведены сведения о конструкциях циклов, существующих в языке Си. Показана работа с динамически выделяемой памятью и указателями. Изложение сопровождается примерами на языке Си.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство образования и науки Российской Федерации Сибирский федеральный университет Р. Ю. Царев ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ СИ Рекомендовано УМО РАЕ по классическому университетскому и техническому образованию в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлениям подготовки: 090900.62 – «Безопасность компьютерных систем», 220100.62 – «Системный анализ и управление», 220200.62 – «Автоматизация и управление», 220400.62 – «Управление в технических системах», 220700.62 – «Автоматизация технологических процессов и производств», 230100.62 – «Информатика и вычислительная техника», 230200.62 – «Информационные системы», 230400.62 – «Информационно-управляющие системы», 231000.62 – «Программная инженерия», 231300.62 – «Прикладная математика», 080801.62 – «Прикладная информатика (в экономике)» (рег. № 450 от 14.03.2014) Красноярск СФУ 2014
УДК 004.438Си(07) ББК 32.973.22я73 Ц181 Р е ц е н з е н т ы: А. Н. Антамошкин, д-р техн. наук, проф. Красноярского государственного аграрного университета; С. И. Сенашов, д-р физ.-мат. наук, проф. Сибирского государственного аэрокосмического университета им. акад. М. Ф. Решетнёва Царев, Р. Ю. Ц181 Программирование на языке Си : учеб. пособие / Р. Ю. Царев. – Красноярск : Сиб. федер. ун-т, 2014. – 108 с. ISBN 978-5-7638-3006-4 Изложены основы языка программирования Си. Рассмотрены все аспекты его применения при программной реализации алгоритмов. Описаны такие типы данных, как массивы, структуры, файлы, и возможности языка Си по работе с ними. Приведены сведения о конструкциях циклов, существующих в языке Си. Показана работа с динамически выделяемой памятью и указателями. Изложение сопровождается примерами на языке Си. Предназначено для студентов направлений подготовки бакалавров: 090900.62 – «Безопасность компьютерных систем», 220100.62 – «Системный анализ и управление», 220200.62 – «Автоматизация и управление», 220400.62 – «Управление в технических системах», 220700.62 – «Автоматизация технологических процессов и производств», 230100.62 – «Информатика и вычислительная техника», 230200.62 – «Информационные системы», 230400.62 – «Информационноуправляющие системы», 231000.62 – «Программная инженерия», 231300.62 – «Прикладная математика», 080801.62 «Прикладная информатика (в экономике)». Электронный вариант издания см.: http://catalog.sfu-kras.ru УДК 004.438Си(07) ББК 32.973.22я73 © Сибирский федеральный ISBN 978-5-7638-3006-4 университет, 2014
ВВЕДЕНИЕ Процесс развития компьютеров тесно связан с совершенствованием языков программирования. Они предназначены для формализации описания математических и иных методов, при помощи которых достигается решение вычислительных задач. Существует несколько подходов к программированию. Наибольшее распространение получило так называемое алгоритмическое программирование, основой которого является подробное описание процесса решения задачи. Алгоритмическое программирование, чаще всего, является первым шагом в освоении компьютера, когда целью человека становится переход от простого пользователя к активному участнику взаимодействия с компьютерами. Наряду с алгоритмическим программированием используются и другие подходы. В частности, языки декларативного программирования подразумевают описание цели вычислений. Процесс в данном случае отходит на второй план и остается скрытым не только от пользователя, но и от программиста. Этот подход удобен, однако требует большего опыта и знаний, используемых для описания цели решения. Поскольку функционирование ЭВМ на аппаратном уровне близко по идеологии к алгоритмическим принципам, можно утверждать, что среды программирования на неалгоритмических языках являются надстройками, в какой-либо форме преобразующими текст выполняемой программы в алгоритмические инструкции микропроцессора. В процессе эволюции алгоритмических языков был разработан принцип структурного программирования. Программы, выполненные в соответствии с этим принципом, обладают удобочитаемостью, легкостью отладки и дополнения. Современные алгоритмические языки программирования поддерживают данный принцип, чем обеспечивается простота переноса программ с одного языка на другой без существенного изменения синтаксиса и пересмотра алгоритма. В данном учебном пособии описан язык программирования высокого уровня – язык Си. Это достаточно выразительный язык, предназначенный для широкого круга задач и содержащий современные механизмы управления вычислительным процессом и работы с данными. В то же время язык Си достаточно прост, что определяет его популярность среди программистов. Язык Си включает в себя те управляющие конструкции, которые рекомендуются теоретическим и практическим программированием. Его структура предполагает использование программистами нисходящего проектирования, структурного программирования и пошаговую разработку модулей. Результатом такого подхода является надежная и читабельная программа. Структура языка Си позволяет наилучшим образом использовать возможности современных компьютеров, а программы на языке Си отличаются компактностью и быстротой исполнения.
1. АЛГОРИТМИЧЕСКИЙ ПОДХОД К ПРОГРАММИРОВАНИЮ Алгоритм является наиболее важной составляющей процесса создания программы, записанной на алгоритмическом языке, в частности, на языке Си. Алгоритм – одно из основных понятий математики и кибернетики. Всякая попытка использования компьютера для решения каких-либо задач начинается с построения алгоритма. Строго говоря, алгоритм – это конечный набор предписаний, определяющий решение задачи посредством конечного количества операций. Также алгоритм можно определить, как способ решения вычислительных и других задач, точно предписывающий, как и в какой последовательности получить результат, однозначно определяемый исходными данными. С точки зрения программирования, алгоритм – это средство описания абстракции вычислительного процесса. В процессе эволюции различных языков программирования были выявлены общие черты и элементы, присущие многим языкам. На самом высоком уровне абстракции можно говорить, что элементами алгоритма являются: операторы присвоения; вызовы вспомогательных алгоритмов и функций; операторы условного ветвления; операторы циклов. На основе элементов перечисленных выше типов можно сконструировать большинство последовательностей операций, направленных на решение практических задач. Однако часто построение алгоритма является очень сложной задачей, требующей оригинальных решений. Проблема в том, что при обычном описании на естественном языке многие детали как очевидные остаются за кадром. Однако если мы формулируем формальное предписание, которое должно быть истолковано компьютером однозначно и не содержать неопределенности, нужно предусмотреть все возможные варианты развития событий, все варианты возможных данных и правильно на них реагировать. А для этого необходимо иметь адекватные средства для описания элементарных шагов алгоритма и его структуры. Алгоритмы удобно изображать в форме блок-схем. Блок-схема представляет собой изображение на бумаге. Элементарное действие алгоритма изображается текстом в одном блоке схемы, а линии, соединяющие блоки, указывают последовательность работы блоков. Поскольку реально выбор того или иного продолжения работы зачастую зависит от данных, поступивших на обработку, очередной блок может иметь не одно, а несколько продолжений, и для него необходимо указывать, каким условиям соответ
ствует то или иное продолжение. Принято проверки такого рода выделять в отдельный блок специального типа (условный блок). Обычный блок имеет одно продолжение, условный блок – несколько продолжений, соответствующих различным вариантам проверки условия. Иногда для удобства условный блок заключается в ромбовидные рамки. Тем или иным образом зачастую выделяют и другие типы блоков: овальные – начало и конец алгоритма, косые – ввод данных, прямоугольные – операции присваивания. Понятие о программах и программировании Компьютер ничего не делает сам, все его действия обусловлены заложенными в него инструкциями. Если не вдаваться в детали, то компьютер знает, какие вычисления ему нужно делать при тех данных, которые получены им из внешней среды. Набор инструкций, задающих эти действия, называются программами. Программа – это набор машинных команд, которые следует выполнить компьютеру для реализации того или иного алгоритма. То есть программа – это форма представления алгоритма для выполнения его машиной. Программировать в широком смысле значит составить такое предписание для компьютера, чтобы он совершил то целенаправленное действие, которое от него ожидается. Причем обязателен один важный аспект этого процесса – повторяемость (составленная программа может выполняться неоднократно). Современные программы дискретны и состоят из отдельных элементарных операций – команд. Команда позволяет компьютеру в каждой ситуации однозначно и правильно выполнить определенное действие. Весь процесс программирования в общем случае подразумевает, прежде всего, формулировку цели программы, затем анализ содержания задачи и, наконец, создание программы для компьютера. Для этого программист должен уметь учитывать все случаи, которые могут встретиться в процессе работы программы, и предусмотреть для них правильное действие. Стадии разработки программ Многие начинающие программисты ошибочно полагают, что процесс решения задачи на ЭВМ состоит только в написании текста программы. Такая иллюзия возникает во многом из-за простоты учебных задач, когда метод решения давно известен и не вызывает сомнений в правильности. Если же речь идет об иных задачах, требуется строгая и детальная разработка вычислительного процесса (рис. 1). Работа над решением начинается с постановки задачи. На данном этапе происходит анализ входных данных (исходной информации), а также характеристик, входящих в состав результата вычислений.
На следующем этапе, называемом методом решения, проводится построение последовательности математических формул, обеспечивающих вычисление требуемых характеристик на основе исходных данных. Параллельно происходит разработка взаимодействия вычислительного процесса с пользователем. Целью данного этапа является описание пользовательского интерфейса программы. Рис. 1. Стадии разработки программ Следующий этап резюмирует проведенные ранее формализации и является основой для будущей программы. Результат этого этапа заключается в составлении алгоритма на специальном абстрактном языке программирования. Такой алгоритм затем можно преобразовать в программу на любом алгоритмическом языке. После формализации алгоритма следует этап разработки программы на выбранном языке программирования. В нашем случае таким языком является язык программирования Си. Если сложность выполняемой задачи невелика и заранее известен язык, на котором будет реализована программа, этапы разработки алгоритма и программы могут быть объединены. В этом случае сразу за разработкой математического метода и интерфейса пользователя программист может приступить к написанию программы. Однако для начинающих программистов настоятельно рекомендуется предварительное написание алгоритма или, по крайней мере, его четкое представление. Необходимо ясно представлять себе последовательность шагов, направленных на решение какой-либо задачи. И уже после формирования алгоритма приступать к написанию кода. Этап отладки обязательно следует за этапом написания программы. Ошибки, допущенные в ходе разработки программы, должны быть диагностированы и исправлены. Пример простой программы на языке Си Единственный способ освоить новый язык программирования – писать на нем программы. Рассмотрим пример первой программы, которая по традиции должна напечатать слова: hello, world. Программа вывода на экран строки "hello, world" на языке Си имеет вид: Постановка задачи Метод решения Интерфейс пользователя Алгоритм решения Программа Отладка
#include <stdio.h> main() { printf("hello, world"); } В первой строке программы находится директива include, которая указывает компилятору, что необходимо подключить библиотеку stdio.h. Библиотека stdio.h представляет собой файл, в котором описаны функции ввода/вывода, в том числе используемая в нашей программе функция вывода на экран printf. Все программы на языке Си начинаются с того, что подключаются библиотеки, содержащие функции, используемые в программе. Вторая строка содержит вызов функции main(). Работа любой программы на языке Си начинается с выполнения этой функции. Ее название зарезервировано специально для этой цели. Следом, в фигурных скобках {}, идет тело функции main, содержащее собственно программу, написанную программистом. В нашем примере это вызов функции вывода на экран. Таким образом, данную программу можно рассматривать как канву для написания всех других программ в дальнейшем. И подобно этой программе они будут состоять из: 1. директивы подключения библиотеки (или библиотек); 2. "главной" функции программ языка Си – main(); 3. тела функции main(), содержащей текст программы.
2. ФУНКЦИИ ВВОДА И ВЫВОДА Для организации интерфейса с пользователем предусмотрены базовые возможности потокового (консольного) ввода/вывода. Наиболее универсальными функциями ввода/вывода являются функции printf() и scanf(), входящие в библиотеку stdio.h. Формат этих функций во многом схож. Рассмотрим функцию printf(). Эта функция использует "управляющую строку" и набор "аргументов". Инструкции, передаваемые функции printf() в управляющей строке, зависят от типа данных аргумента. Например, при выводе на экран целого числа применяется формат %d, в то время как для переменных с плавающей точкой используется формат %f. Если же на экран выводится только текст, то кроме строки, заключенной в кавычки других аргументов нет. Результатом выполнения следующей программы: #include <stdio.h> main() { int i; // объявление i, как переменной целого типа float x; // объявление x, как переменной с плавающей точкой i = 10; x = 3.75; printf("Пример вывода на экран\n"); printf("целого числа i = %d\n", i); printf("и числа с плавающей точкой x = %f\n ", x); } будет следующий текст, выведенный на экран дисплея: Пример вывода на экран целого числа i = 10 и числа с плавающей точкой x = 3.75 В данной программе сначала объявляются переменные, которые будут использоваться в дальнейшем, имеющие целый тип (int) и десятичный с плавающей точкой (float). Это же отмечено в комментариях, которые идут после двойной косой черты (//). Комментарии используются для записи каких-либо заметок, полезных самому программисту. Здесь можно оставлять любые пояснения, в процессе работы программы они игнорируются. После того, как переменным присвоены значения, выполняется вывод на экран. При первом вызове функции printf() на экран выводится
только текст "Пример вывода на экран". Также в этой строке программы содержится управляющий символ "\n", он отвечает за переход на следующую строку и возврат в крайнее левое положение. Без этого символа весь текст выводился бы на экран в одну строку. Две заключительные строки программы выводят на экран текст и значения переменных. Можно сказать, что при выводе на экран символы формата заменяются значениями переменных. Так, %d заменяется значением переменной i, равным 10, а %f – значением переменной x, т. е. 3.75. В одном вызове функции printf() может быть несколько символов форматирования. Например, последние две строчки можно заменить одной: printf("целого числа i=%d\n и числа с плавающей точкой x=%f\n ", i, x); Результат выполнения программы был бы тем же. В общем виде формат, указываемый при обращении к функции printf(), выглядит следующим образом: printf(управляющая строка, аргумент1, аргумент2, …); Аргумент1, аргумент2 и т. д. – это печатаемые параметры, которые могут быть переменными (i, x), константами (25, 3.14159) или даже выражениями, которые будут вычислены перед выводом на экран (2*3, i+5). Управляющая строка – это строка символов, показывающая, как должны быть напечатаны параметры. Таким образом, можно заключить, что управляющая строка содержит информацию двух различных видов: 1. Символы, печатаемые текстуально. 2. Идентификаторы данных, называемые также "спецификациями преобразования". Каждому аргументу из списка, следующего за управляющей строкой, должна соответствовать одна спецификация преобразования. Ниже приводятся спецификациями преобразования и тип выводимой информации: %d – десятичное целое число (int); %f – число с плавающей точкой (float или double); %c – отдельный символ (char); %s – строка символов; %e – число с плавающей точкой (float или double), экспоненциальная запись; %g – используется вместо %e или %f, если он короче (float или double); %o – восьмеричное число без знака (int); %x – шестнадцатеричное число без знака (int); %u – десятичное число без знака (int).