Основы программирования. Учебное пособие
.pdf
Министерство образования и науки Российской Федерации НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
В.П. ХИЦЕНКО
ОСНОВЫ
ПРОГРАММИРОВАНИЯ
Утверждено Редакционно-издательским советом университета в качестве учебного пособия
НОВОСИБИРСК
2015
1
УДК 004.42(075.8) Х 529
Рецензенты:
канд. техн. наук, доцент Ю.В. Тракимус, канд. техн. наук, доцент И.Л. Еланцева
Работа подготовлена на кафедре прикладной математики
Хиценко В.П.
Х 529 Основы программирования: учебное пособие / В.П. Хиценко. – Новосибирск: Изд-во НГТУ, 2015. – 83 с.
ISBN 978-5-7782-2706-4
В настоящем учебном пособие излагаются основные понятия и приемы программирования на стандартном языке Си. Пособие содержит большое количество примеров решения задач и может быть рекомендовано как для подготовки к занятиям по основам программирования, так и для самостоятельного изучения курса. Предназначено для студентов I курса факультета прикладной математики и ин-
форматики.
|
УДК 004.42(075.8) |
ISBN 978-5-7782-2706-4 |
Хиценко В.П., 2015 |
|
Новосибирский государственный |
|
технический университет, 2015 |
2
ТЕМА 1
ПРОСТЫЕ ТИПЫ. ЭЛЕМЕНТАРНЫЕ ОПЕРАТОРЫ
1.1. ПЕРЕМЕННАЯ
Одним из основных понятий языка программирования является переменная. Переменная – это простейший объект программы, над которым можно выполнить некоторое действие. С каждой переменной связывается значение, которое она имеет в данный момент. Переменной дается имя и задается ее тип. Имя используется для обращения к переменной, чтобы получить ее значение или изменить его. Тип определяет совокупность информации:
1)о множестве допустимых значений переменной данного типа;
2)о множестве допустимых операций над значением данного типа;
3)о размере оперативной памяти (ОП), выделенной для хранения значения;
4)о представлении значения в выделенной ему области памяти (внутреннее представление значения);
5)о структуре значения.
По структуре значения все типы принято делить на простые типы и сложные. Значение простого типа является величиной, неделимой ни на какие части. Операции выполняются над этим неделимым значением. Например, целое число – значение простого типа. Целое число может состоять из нескольких разрядов (сотен, десятков, единиц), но действие можно выполнять над числом, а не над его отдельными разрядами. Если, например, требуется выполнить действие над разрядом десятков целого числа, то его сначала надо выделить из числа. Значение сложного типа составляется из отдельных частей (элементов или компонентов значения), операции выполняются над отдельными элементами сложного значения (иногда, как исключение из правила, в язык программирования включаются операции над всем сложным значением в целом). Простые типы это типы, которые позволяют предста-
3
вить в ОП компьютера наиболее распространенную и простую информацию: числа, символы, логические значения. Простые типы полностью определенные в языке программирования называют базовыми. Базовым типам даются имена, которые используются при определении переменной (а также константы). В языке Си определены следующие простые базовые типы:
1)для представления целых чисел: целый короткий – char, целый полный – int, целый длинный – long; каждый из целочисленных типов может быть определен либо как знаковый signed либо как беззнаковый unsigned (по умолчанию signed);
2)для представления действительных чисел: вещественный одинарной точности – float, вещественный двойной точности – double;
3)для представления символов используется целый тип, короткий или полный;
4)для представления логических значений целый короткий.
Чтобы использовать в программе переменную ее надо определить, т. е. дать ей имя и указать тип. Определение переменной используется транслятором для выделения ей памяти (величину, которой выделена память, принято называть объектом), размер участка выделяемой памяти и интерпретация содержимого, а также допустимые операции зависят от указанного типа. Простейшая форма определения переменной:
тип имя_переменной;
или
тип список имен переменных;
Примеры определения переменных: char cc;
unsigned int number, a1, n; int sign;
float x1, y1, x2, y24;
1.2. ВЫРАЖЕНИЕ
Значение, задаваемое переменной, как правило, является результатом каких-то вычислений. Правило вычисления значения задается выражением. Выражение состоит из операций и операндов. Операции определяют действия (элементарные операции: арифметические, логические, отношения и т. д., а также операции, описанные в виде функ-
4
ций), выполняемые над операндами. Операндом выражения может быть константа, переменная, выражение. Выражение, входящее как операнд в другое выражение может быть первичным выражением, таким как, например, вызов функции или выражением, заключенным в круглые скобки.
Результат вычисления значения выражения зависит от порядка выполнения операций (как правило, операции выполняются в порядке их написания слева направо) и их приоритета. Для задания правильного порядка вычислений используются скобки, они повышают приоритет операции (но для операций, обладающих свойством коммутативности, не гарантируют определенный порядок вычисления).
При выполнении операции, как правило, происходит преобразование типов ее операндов к общему типу. Основные правила преобразования по умолчанию:
все операнды типа float преобразуются к типу double;
если один операнд имеет тип long double, то второй операнд преобразуется к типу long double;
если один операнд имеет тип double, то второй операнд преобразуется к типу double;
если один операнд имеет тип unsigned long, то второй операнд преобразуется к типу unsigned long;
если один операнд имеет тип long, то второй операнд преобразуется к типу long;
если один операнд имеет тип unsigned int, то второй операнд преобразуется к типу unsigned int;
все операнды типа char преобразуются к типу int;
все операнды типа unsigned char преобразуются к типу unsigned int; иначе оба операнда имеют тип int;
если один операнд имеет тип float, а второй целый тип, то второй операнд преобразуется к типу float.
Тип значения выражения имеет тип результата последней выполняемой операции в этом выражении.
Примеры записи выражений:
1) A + b |
15.5 – x * sin (y) |
k / 3 *(a + b) |
i % 2 |
2)a – b > 0.75 (x1 + x2)*3 == 17.5 a + b > c && a + c > b && b + c > a
Впримерах 1 результатом выражения будет числовое значение, так как последняя выполняемая операция – это арифметическая операция;
5
в примерах 2 результатом будет логическое значение, так как последняя выполняемая операция – это операция отношения (>, ==) или логическая операция (&&).
1.3. ЭЛЕМЕНТАРНЫЕ СРЕДСТВА ПРОГРАММИРОВАНИЯ
Для управления последовательностью вычислений в программе служат управляющие структуры или в терминах языка программирования операторы управления вычислениями (или кратко операторы). Оператор это единица действия (точка с запятой является признаком конца оператора). Простейшие операторы:
1) Оператор – выражение <выражение>;
Действие заключается в вычислении значения выражения.
Пример оператора-выражения: a++;
Выполнение этого оператора состоит в увеличении значения переменной a на единицу.
2) Оператор присваивания В простейшем случае общий вид оператора присваивания:
V = E;
Здесь V – имя переменной, а E – выражение. В операторе присваивания используется операция присваивания = .
Пример оператора присваивания: c = a * b;
Действие такого оператора можно описать следующими словами: " с присвоить а умноженное на b ". Значение, присваиваемое переменной с, равняется произведению текущих значений переменных а и b.
При присваивании значение выражения из правой части оператора присваивания преобразуется к типу переменной из левой части. Приведение целочисленного значения (правой части оператора присваивания) в вещественное (левой части оператора присваивания) осуществляется с точностью предусмотренной аппаратурой. Если некоторое целочисленное значение не может быть точно представлено как вещественное, то младшие значащие разряды теряются, т. е. происходит потеря точности. Приведение вещественного значения к целому типу
6
выполняется путем отбрасывания дробной части, т. е. также происходит потеря точности.
3) Оператор ввода Ввод и вывод осуществляется посредством использования функций
ввода/вывода, входящих в состав стандартной библиотеки языка Си. Необходимые функции (точнее их прототипы) содержатся в файле stdio.h, который должен быть подключен к программе директивой
#include < stdio.h>. Для любой программы на языке Си всегда доступны три стандартных файла (потока): stdin – файл ввода, stdout – файл вывода, stderr – файл сообщений об ошибках. По умолчанию они связываются с пользовательским терминалом. Эти файлы открываются при входе в программу и закрываются при выходе из нее.
Для задания значений переменным (в которые записываются исходные данные решаемой задачи) используется оператор (функция) форматного ввода scanf:
scanf (управляющая строка [,список аргументов]);
Функция scanf читает данные из стандартного потока stdin в переменные, адреса которых задаются в списке аргументов. Аргументы в списке перечисляются через запятую. Управляющая строка задается как строковая константа. В простом случае управляющая строка состоит из одной или более спецификаций преобразования (формата). Спецификация преобразования в простом случае имеет вид: %C, где C – символ преобразования, % – признак спецификации формата. Спецификация формата определяет форму представления в файле вводимого значения и должна соответствовать типу переменной, которой будет присвоено это вводимое значение.
Каждому вводимому значению в управляющей строке функции scanf должна соответствовать спецификация. В списке аргументов перед именами переменных необходимо ставить символ &. Этот символ означает операцию "взять адрес" переменной. При вводе управляющая строка рассматривается слева направо и, когда встречается первая спецификация формата, значение первого входного поля файла преобразуется согласно этой спецификации во внутреннее представление и записывается по адресу первой переменной списка аргументов. Согласно второй спецификации преобразуется значение второго входного поля и помещается по адресу второй переменной и так далее до конца управляющей строки. В файле ввода числовые значения переменных должны быть разделены пробелом.
7
Пример оператора форматного ввода: scanf (" %d %d %d ",&x, &y, &z);
Первое значение из входного потока рассматривается как целое число и преобразуется в соответствии с %d к типу int, затем помещается в ОП по адресу переменной x, аналогично преобразуются следующие два значения и помещаются в ОП по адресам переменных y и z соответственно.
4) Оператор вывода Для вывода результатов работы программы используется оператор
(функция) форматного вывода printf:
printf (управляющая строка [,список аргументов]);
Управляющая строка может содержать символы, которые нужно вывести, управляющие символы и спецификации формата. Аргументы в списке перечисляются через запятую. Аргумент задается константой, переменной или выражением. Общий вид спецификации преобразования: % [-] [dd] [. pp] C, где C – символ или пара символов, определяющих преобразование выводимого значения; символ ′-′ означает, что выводимое значение должно быть в поле вывода выровнено влево. По умолчанию оно выравнивается вправо; dd – десятичное целое число, задающее минимальный размер поля, т. е. число позиций, занимаемых выводимым значением. Если размер поля недостаточен для значения, оно, тем не менее, будет выведено полностью; если размер поля больше, в избыточных позициях по умолчанию будут пробелы; pp – десятичное целое число, указывающее для плавающих типов, количество цифр после десятичной точки.
Пример оператора форматного вывода:
printf ("\nВозраст Эрика - %d. Его доход $ %.2f ", age, income);
Предполагается, что целой переменной age (возраст) и вещественной переменной income (доход) присвоены какие-то значения.
Управляющий символ ′\n′ переводит курсор на новую строку в выходном файле. Последовательность символов "Возраст Эрика -" будет выведена с начала новой строки. Символы %d – это спецификация для целой переменной age, в соответствии с ней значение переменной будет преобразовано в десятичное число, и выведено после символов "Возраст Эрика -". Следующая часть управляющей строки ". Его до-
8
ход $ % .2f " – это выводимый текст и спецификация (символ преобразования) формата для вещественного значения переменной income. А также указание формата для вывода только двух цифр после десятичной точки. Например, будет выведено:
Возраст Эрика – 27. Его доход $ 2345.55
5) Составной оператор (или последовательность) Структурная схема последовательности:
S1 
S2
...
Sn
где Si – любой оператор.
На языке Си любая последовательность операторов, заключенная в фигурные скобки, является составным оператором. Концом составного оператора служит сама закрывающаяся скобка. Внутри составного оператора каждый оператор должен ограничиваться символом ′;′.
Пример составного оператора:
{ I+= a; c = a * b; n++; }
Составной оператор может использоваться везде, где синтаксис языка допускает применение одного оператора, а необходимо выполнить несколько. Составной оператор называется оператором блоком, если кроме операторов он содержит определения переменных или констант.
1.4.ЗАДАЧИ И РЕШЕНИЯ
1.Определить необходимые переменные и записать на языке Си выражение, истинное при выполнении указанного условия и ложное в противном случае:
1) x принадлежит отрезку [2, 5] или [-1, 1];
float x;
x >= 2 && x <= 5 x >= -1 && x <= 1 2) x лежит вне отрезков [2, 5] и [-1, 1];
float x;
x < -1 x > 1 && x < 2 x > 5
9
3) хотя бы одно из чисел x, y, z положительно;
float x, y, z;
x > 0 y > 0 z > 0
4) целые n и k имеют одинаковую четность;
int n, k;
n % 2 == k % 2 5) 0 < x < 1;
float x;
x > 0 && x < 1
2. Определить необходимые переменные и записать на языке Си следующие формулы:
а) (1 + x)2 ; |
б) 1 x ; |
в) │a + bx │ ; |
a) float x; |
(1 + x)* (1 + x) |
|
б) float x; |
sgrt (1 + x) |
|
в) float x, a, b; |
fabs (a + b * x) |
|
3. Определить необходимые переменные и записать оператор присваивания, в результате выполнения которого будет вычислено значение формулы:
а) cos2 x3 ; |
б) log2 |
x |
; |
в) 8 x8 8x |
; |
|
|||||
|
5 |
|
|
|
|
а) float x, y; |
y = cos (x * x * x) * cos (x * x * x); |
|
|||
б) float x, y; |
y = log (x / 5); |
|
|
||
в) float x, y; |
y = pow (x*x*x*x*x*x*x*x + pow (8, x), 1.0 / 8); |
||||
4. Определить необходимые переменные и записать оператор присваивания, в результате выполнения которого переменная получает значение истина, если выполняется указанное условие, и значение ложь в противном случае:
1) числа x, y, z равны между собой;
float x, y, z, t; |
t = x == y && y == z; |
2) из чисел x, y, z только два равны между собой;
float x, y, z, t;
t = x == y && x != z x == z && x != y y == z && x != y;
10
