Операции над целыми числами

Е. А. АЛЬТМАН

ОСНОВЫ ЯЗЫКА С

ОМСК 2012

Министерство транспорта Российской Федерации

Федеральное агентство железнодорожного транспорта

Омский государственный университет путей сообщения

––––––––––––––––

Е. А. Альтман

Основы языка С

Утверждено редакционно-издательским советом университета

в качестве методических указаний к лабораторным работам
по дисциплинам «Программирование», «Технология программирования»

Омск 2012

УДК 004.43

ББК 32.973-018.1

А58

Основы языка С: Методические указания к лабораторным работам по дисциплинам «Программирование» и «Технологии программирования» / Е. А. Альтман, А.В. Александров, Н.Г. Ананьева, Н.Е. Актаев; Омский гос. ун-т путей сообщения. Омск, 2012. 44 с.

В методических указаниях рассматриваются основные типы данных, операторы и библиотеки языка программирования С; указатели, массивы и структуры, а также операции для работы с ними; функции, оформление и тестирование функций. Для выполнения лабораторных работ предлагается использование компилятора gcc в составе пакета MinGW. Вопросы алгоритмизации не изучаются и будут рассмотрены в последующих семестрах.

Методические указания предназначены для студентов 1-го курса направлений «080500 ­– Бизнес-информатика», «220400 – Управление в технических системах», «221000 – Мехатроника и робототехника», «230100 – Информатика и вычислительная техника» и «230400 ­– Информационные системы и технологии» изучающих дисциплины «Программирование» и «Технология программирования».

Библиогр.: 1 назв., Рис. 9.

Рецензенты: канд. техн. наук, доцент Ю.М Елизарова;    
© Омский гос. университет путей сообщения, 2012

ОГЛАВЛЕНИЕ

Введение. 6

Лабораторная работа 1 Изучение среды программирования. 7

1.1. Теоретические сведения. 7

1.1.1. Среда программирования. 7

1.2. Задание к работе. 10

1.3. Содержание отчета. 10

1.4. Контрольные вопросы.. 10

Лабораторная работа 2 Переменные и операции над ними. 11

2.1. Теоретические сведения. 11

2.1.1. Основные определения. 11

2.1.2. Операции над целыми числами. 13

2.1.3. Вещественные числа и операции над ними. 16

2.2. Задание к работе. 18

2.3. Содержание отчета. 18

2.4. Контрольные вопросы.. 18

Лабораторная работа 3 Конструкция выбора, логические и другие операции. 19

3.1. Теоретические сведения. 19

3.1.1. Конструкция выбора и составная инструкция. 19

3.1.2. Операторы отношения и логические операторы.. 21

3.1.3. Остальные операторы.. 22

3.2. Задание к работе. 23

3.3. Содержание отчета. 24

3.4. Контрольные вопросы.. 24

Лабораторная работа 4 Конструкции циклов. 24

4.1. Теоретические сведения. 24

4.1.1. Цикл while. 24

4.1.2. Цикл for 25

4.1.3. Конструкция в конструкции. 26

4.2. Задание к работе. 27

4.3. Содержание отчета. 28

4.4. Контрольные вопросы.. 28

Лабораторная работа 5 Массивы и структуры.. 29

5.1. Теоретические сведения. 29

5.1.1. Пример массива. 29

5.1.2. Свойства массивов. 30

5.1.3. Строки. 31

5.1.4. Структуры.. 32

5.2. Задание к работе. 33

5.3. Содержание отчета. 34

5.4. Контрольные вопросы.. 34

Лабораторная работа 6 Указатели. 34

6.1. Теоретические сведения. 34

6.1.1. Указатели. 34

6.1.2. Операции с указателями. 35

6.1.3. Указатели и массивы.. 36

6.1.4. Указатели и структуры.. 37

6.2. Задание к работе. 37

6.3. Содержание отчета. 38

6.4. Контрольные вопросы.. 38

Лабораторная работа 7 Функции. 39

7.1. Теоретические сведения. 39

7.1.1. Функции. 39

7.1.2. Использование указателей для передачи результата и аргумента. 40

7.2. Задание к работе. 41

7.3. Содержание отчета. 41

7.4. Контрольные вопросы.. 41

Введение

В методических указаниях описываются цикл лабораторных работ, которые проводятся в 1 семестре на 1 курсе по дисциплине «Программирование» (для отдельных направлений дисциплина называется «Технология программирования»).

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

При изучения языка С рекомендуется использовать компилятор GCC. В Unix-подобных системах этот компилятор поставляется вместе с операционной системой, для Windows можно использовать его портированный вариант – MinGW. Этот компилятор поддерживает стандарт ANSI C, поэтому все рассматриваемые примеры должны работать и в других средах.

В рамках рассматриваемого цикла не рекомендуется использовать интегрированные среды разработки (IDE), такие, как, например, Visual Studio. Во-первых, особенности работы такой среды не связаны с языком программирования, а их изучение отнимает время. Во-вторых, имеющиеся в среде возможности автоматизации некоторых операций полезны профессиональным программистам, а при обучении будут скорее мешать, поскольку операция, сделанная компьютером за студента, студентом не освоится.

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

Основной литературой к циклу лабораторных работ является книга [1], написанная авторами языка С. Она выдержала много изданий на многих языках и является классикой. На данном этапе изучения программирования не рекомендуется использовать другие книги, в которых часто смешивается описание языка, алгоритмы и другие элементы разработки программного обеспечения.

Для проверки освоения теоретических знаний и практических навыков в курсе используются тесты. Тесты проводятся во время проведения лабораторных работ.

Лабораторная работа 1
Изучение среды программирования

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

Теоретические сведения

Среда программирования

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

Этот компилятор является основным для бесплатных Unix-подобных систем, и может использоваться в них без установки дополнительного программного обеспечения. Для работы под Windows нужно установить один из портов этого компилятора – MinGW (простой вариант, рекомендуется к применению) или CygWin.

Кроме компилятора, для работы понадобится текстовый редактор, предпочтительно с подсветкой синтаксиса и с возможностью работы с различными кодировками. Не следует путать текстовые редакторы с текстовыми процессорами, такими, как, например MS Word. Текстовые процессоры добавляют к видимому тексту непонятную компилятору дополнительную информацию по оформлению текста и не подходят для набора исходного кода программ. В Linux системах, как правило, есть встроенный редактор (например, gedit), для Windows рекомендуется скачать какой-либо бесплатный, например notepad++.

Программы, набранные под одной операционной системой, должны компилироваться и запускаться под другой. Проблема может возникнуть с кодировкой русских букв. В командной строке Windows программы, по-умолчанию, должны выводить буквы в кодировке DOS (OEM 866), под Linux, скорее всего, UTF-8. Также, некоторые текстовые редакторы могут понимать не все кодировки.

Далее опишем процесс создания программы под операционной системой Windows (под Linux все делается аналогичным образом и у человека, использующего эту систему, проблем возникнуть не должно).

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

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

Операции над целыми числами - student2.ru

Рис. 1 Пример исходного кода программы

В рассмотренном примере есть главная функция «main()». Эта функция будет вызываться при запуске программы. Все действия, которые должны быть выполнены в программе, заключены в так называемые операторные скобки, которые в языке С обозначаются с помощью фигурных скобок (во 2 строке – открывающая скобка, в 4 – закрывающая). В нашей программе одно действие – функция «printf("Hello, world!");», которая печатает на экран сообщение, записанное в кавычках.

Компиляция и запуск программы выполняются из командной строки. В старых версиях операционной системы (например, в Windows XP) нужно нажать кнопку «пуск», выбрать меню «запуск программ» и в открывшемся окне набрать и выполнить команду «cmd». В новых версиях нужно нажать кнопку с эмблемой Windows, а команду «cmd» нужно набрать в поле поиска программ и файлов.

В открывшемся окне нужно перейти в каталог с компилятором. Для перехода на нужный диск следует набрать имя диска и двоеточие. Чтобы перейти в каталог, нужно выполнить команду «cd полный_путь_к_компилятору» (курсивом отмечается параметр, вместо которого нужно подставить собственное значение). Для того чтобы подняться на каталог более высокого уровня, можно воспользоваться командой «cd ..». Пример приведен на рис. 2.

Операции над целыми числами - student2.ru

Рис. 2 Пример перехода в каталог с компилятором

Компилятор запускается командой «gcc имя_файла». Файл с программой обычно находится в другом каталоге, поэтому нужно указывать полное имя файла, например: «D:\MinGW\bin>gcc d:/work/prog1.c», где «D:\MinGW\bin>gcc d:/work/prog1.c» это приглашение к вводу команды, которое выводит компьютер, а жирным выделена команда, которою следует ввести с клавиатуры.

По умолчанию программа скомпилируется в тот же каталог с именем «a.exe». Чтобы ее запустить, достаточно набрать имя файла, например, «D:\MinGW\bin>a».

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

Часто удобно указать имя программы, которая должна быть скомпилирована. Делается это с помощью опции «-o» компилятора: «D:\MinGW\bin>gcc d:/work/prog1.c -o d:/work/myprog.exe».

Если исходный текст программы находится в нескольких файлах, то для его компиляции исходные файлы можно указать через пробел: «D:\MinGW\bin>gcc d:/work/hello.c d:/work/test.c -o d:/work/myprog.exe».

Чтобы не набирать при компиляции длинные строки, можно вызывать ранее введенные в командной строке команды с помощью клавиши «стрелка вверх».

Если вы хотите, чтобы программа выдавала сообщения на русском языке, то для исходного кода в текстовом редакторе нужно установить кодировку DOS (OEM 866), например, как показано на рис. 3.

Операции над целыми числами - student2.ru

Рис. 3 Установка корректной кодировки

Задание к работе

1) Создать на учебном компьютере свою папку.

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

3) Изменить программу так, чтобы она выводила на экран приветствие автору программы (например, «Здравствуй, Вася»).

4) Создать свою учетную запись на сервере тестирования

5) Пройти пробный тест

Содержание отчета

Отчет должен содержат описание всех выполненных действий (команд) и рисунки, показывающие результат этих действий. Количество действий должно быть не меньше количества глаголов в пункте 1.2.

Контрольные вопросы

1) Как в командной строке перейти в нужный каталог?

2) Каким образом можно скомпилировать программу?

3) Как запустить скомпилированную программу?

4) Как в системе тестирования обозначаются варианты ответов на вопрос в том случае, если нужно выбрать только один из них?

5) Как в системе тестирования обозначаются варианты ответов на вопрос в том случае, если можно выбрать несколько правильных вариантов?

Лабораторная работа 2
Переменные и операции над ними

Цель работы: изучение понятий «переменная» и «тип» языка С, встроенных типов и операций над ними, основных функций библиотеки ввода-вывода.

Теоретические сведения

Основные определения

Рассмотрим исходный код программы, приведенный на рис 4.

Операции над целыми числами - student2.ru

Рис. 4 Пример программы

Во 2 строке находится функция «main()», которая выполняется при вызове программы. В 3 и 10 строках находятся операторные (фигурные) скобки, группирующие команды, которые должна выполнить эта функция.

Рассматриваемая программа просит пользователя ввести целое число, а после этого печатает на экране это число увеличенное на 2.

Число, которое ввел пользователь, компьютер должен сохранить в памяти, чтобы потом с ним можно было выполнять какие-либо действие. Для того чтобы знать, о каком именно сохраненном в памяти числе идет речь, месту в памяти дается имя (например, в нашей программе это имя «a»). Часть памяти, которая имеет имя и служит для хранения какого-либо значения, называется переменная.

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

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

В строке 4 программы приведен пример объявления переменной. При объявлении сначала указывается тип переменной, а затем, через пробел, ее имя. В конце строки ставиться знак «;», чтобы указать, что действие закончено. Законченное действие, оканчивающееся точкой с запятой, называется инструкцией. В программе мы использовали тип «int». Переменные такого типа позволяют хранить целые числа и выполнять над ними соответствующие действия.

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

В 6 строке вызывается функция, записывающая число, введенное пользователем, в переменную «a». На данном этапе мы не будем разбирать подробно, как она работает, достаточно запомнить эту строчку и использовать ее, если нужно ввести число в программу.

В 7 строке функция печати вызывается с двумя аргументами, перечисленными через запятую. Первый аргумент – текст сообщения для печати. Этот текст должен изменяться в зависимости от значения переменной «a». Поэтому в тексте есть специальная пометка ­– «%i». Встретив знак процента, функция печати текста должна понять, что нужно печатать не символ «i», а целое число, указанное во втором аргументе. Вторым аргументом мы передали переменную «a», поэтому вместо символов «%i» будет напечатано ее значение.

В 8 строке переменная «a» увеличивается на 2. Обратите внимание, что с точки зрения математики эта строка лишена смысла, число не может равняться самому себе увеличенному на 2. В этой записи знак «=» не означает, что левые и правые части выражения равны, а означает, что нужно подсчитать значение выражения справа от знака равно, и записать его в переменную, записанную слева от этого знака.

Знаки «+» и «=» являются операторами. Значения, над которыми выполняет свое действие оператор, называется операндами. С точки зрения программиста оператор отличается от функции только формой записи. Аргументы функции указываются в скобках, а операнды оператора записываются с двух сторон от него. Функция обычно имеет записанное буквами имя, а оператор обозначается специальными символами. Поэтому операторы позволяют записывать арифметические выражение почти так, как это принято в математике.

Рассмотренная строка (8) позволяет понять, почему именованное место в памяти называется переменной. Действие в этой строке буквально изменило содержимое этого места в памяти.

В выражениях помимо переменных могут участвовать и константы. Например, число «2» в этой строке тоже будет храниться в памяти компьютера, но оно не измениться в течение всего времени выполнения программы.

В 9 строчке мы опять вызываем функцию печати, чтобы она напечатала измененное значение переменной «a».

Осталось рассмотреть 1 строку. В ней находится директива компилятора. Директивы обозначают те действия, которые компилятор должен выполнить во время компиляции программы, а не во время исполнения. Директивы обычно начинаются с символа «#».

Директива «include» подгружает в программу код, находящийся в указанном далее файле. Этот код позволяет использовать функции из библиотеки «stdio», описанной в файле «stdio.h». Библиотека – это набор функций, которые может вызывать программист. Например, в библиотеке «stdio» находятся функции для ввода и вывода значений на экран или в файл, такие как «printf» и «scanf». Эта библиотека является стандартной для языка С, и многие компиляторы (например, GCC) подключают ее автоматически (т.е. 1 строку можно убрать).

Последним термином, который нужно определить, является термин идентификатор. Идентификатор – это набор букв, цифр и других символов, служащий именем переменных, функции и других элементов языка. На этот набор накладываются определенные ограничения. В языке С идентификатор должен начинаться с буквы или с символа подчеркивания и не совпадать с ключевыми словами. Строчные и прописные буквы в языке С считаются различными (переменные «a» и «A» – разные).

Операции над целыми числами

Рассмотрим задачу. В банкомате имеются купюры достоинством 1000, 500, 100 и 50 рублей. Пользователь попросил выдать некоторую сумму денег наиболее крупными купюрами. Будем считать, что в банкомате купюр каждого номинала больше, чем может потребоваться, и что пользователь ввел корректную сумму, которую можно выдать с помощью имеющихся денег. Нужно написать программу, которая бы рассчитала количество банкнот каждого номинала.

Решение задачи приведено на рис. 5.

Операции над целыми числами - student2.ru

Рис. 5 Пример программы

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

Компилятор языка С не понимает русского языка и будет считать этот комментарий синтаксической ошибкой. Для того, чтобы компилятор не обращал внимание на текст, написанный для программиста, его нужно отметить с помощью специальных символов. В первой строке программа написаны символы («/*»), которые обозначает начало комментария, а в 4 строке, – символы обозначающие конец комментария («*\»).

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

Функции в 8 и 9 строках предлагают пользователю ввести сумму и записывают ее в переменную «a».

В 10 строке печатается сообщение пользователю. В конце сообщения написаны символы «\n». Обратная наклонная черта («\») означает, что следующий за ней символ не следуют печатать, а следует воспринимать как специальную команду. В частности «\n» означает, что нужно последующий вывод на экран производить со следующей строки. Символы «\n» полезно запомнить, поскольку они позволяют упорядочить вывод на экран в учебных программах. С остальными аналогичными символами мы ознакомимся позднее.

Первым шагом нам нужно определить, какое количество банкнот по 1000 рублей потребуется для выплаты этой суммы. Очевидно, что для этого нужно разделить сумму на 1000. В языке С оператор деления записывается с помощью прямой наклонной черты «/». В 11 строке в переменную «b» записывается результат деления «a» на 1000.

Результат деления может быть как целым числом, так и иметь дробную часть или остаток. Переменная «b» может хранить только целое (без дроби и остатка), поэтому в языке С операция деления, выполненная над целыми числами, возвращает только результат деления, а остаток просто отбрасывается.

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

В 12 строке программа печатает количество 1000-ых банкнот. В ней не показано никаких новых особенностей языка С, однако не лишним будет вспомнить значение цепочек символов «%i» и «/n».

В 13 строке мы находим сумму, которую осталось выплатить после того, как мы отдали 1000-ые банкноты. Нетрудно догадаться, что операторы «–» и «*» означают вычитание и умножение соответственно. Интерес в этой строке представляет порядок действий. Как и в математике, выполняющие арифметические действия операторы имеют приоритеты. Операторы с более высоким приоритетом будут выполняться первыми. Так, у оператора умножения приоритет выше, чем у оператора сложения, потому сначала будет выполнено умножение, а потом сложение. Если при составлении выражения нет уверенности в приоритетах операторов, то порядок действий, как и в математических выражениях, можно указать с помощью круглых скобок.

В строках 14 и 15 повторяются ранее рассмотренные действия, но уже для банкнот достоинством 500 рублей. В 16 строке мы видим новый оператор «%», который находит остаток от деления.

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

Мы рассмотрели все арифметические операторы над целыми числами типа «int». Есть и другие операторы, например, логические, которые будут рассмотрены в следующих лабораторных работах.

В заключении отметим, что этот тип может иметь квалификаторы, которые уточняю сведения о типе. Квалификатор «short» указывает на то, что переменная будет принимать небольшие значения, и для нее можно отвести меньше места, а квалификатор «long», наоборот, говорит о том, что значением переменной может быть очень большим. Квалификатор «unsigned» применяется в том случае, если переменная будет принимать только положительные значения. Квалификатор указывается перед именем типа, например, можно сделать такое объявление: «long int a;».

Объем памяти, занимаемый переменной того или иного типа памяти, зависит от используемого компилятора. Определить объем занимаемой памяти в байтах можно с помощью директивы sizeof. Например, выражение «sizeof(int)» эквивалентно константе, равной размеру переменной целого типа.

Наши рекомендации