ПРОЕКТИРОВАНИЕ ПРОГРАММ ПРОСТЕЙШЕЙ СТРУКТУРЫ




 

Цель работы

 

Изучение базовых элементов текста программы, основных типов данных и операций с ними.

 

Методические указания

 

Структура программы

 

Текст программы на языке Турбо Си состоит из описания одной или более функций, одна их которых обязательно называется main. И именно ей передается управление из оперативной системы при запуске программы. Функция - это коллективное имя для некоторой группы описаний и операторов, заключенных в фигурные скобки { и } и являющихся телом функции. В общем случае текст программы имеет следующий вид:

 

# директивы процессора

main ()

{ тело функции main }

func 1 ()

{ тело функции func 1 }

func 2

{ тело функции func 2}

 

Структура каждой, в том числе и главной, функции будет ясна из текста

следующей программы:

/*простая программа */

# include <stdio.h>

# define PRINT printf(²***************/n²);

main ()

{ int a, b, s;

PRINT

printf(² Введите два целых числа через пробел Þ ²);

scanf (² %d %d², &a, &b);

s = a + b;

printf (² Сумма = %d², s);

PRINT

}

 

Результат вычислений этой программы на экране отобразится в следующем виде:

 

***************

Введите два целых числа через пробел Þ 5 7

Сумма = 12

 

***************,

где подчеркнутые символы (включая пробел между 5 и 7) вводятся с клавиатуры.

В примере программы присутствуют директивы процессора:

 

# include <stdio.h>,

включающая в текст программы информацию о библиотечных функциях ввода scanf и вывода printf, и

 

#define PRINT printf (²***************\n²),

заменяющая любое отдельное вхождение символов print f (²***************\n²); оператор описания целых переменных с именами a, b, s; операторы вывода print f и scan f и оператор присваивания s = a + b.

Символы %d означают формат ввода/вывода целого числа, а - \n - перевод на новую строку.

В тексте программы могут быть комментарии, обрамляемые символами /* (начало комментария) и */ (конец комментария). Пробелы, символы табуляции и перевода на новую строку при компиляции программы игнорируются, но они позволяют выбрать любую наглядную форму набора текста программы.

 

2. Данные

2.1. Стандартные типы данных

 

Выполнение программы означает выполнение компьютером описанных в тексте программы операций над носителями информации - данными. Некоторые данные устанавливаются до выполнения программы и сохранят свои значения неизменными в процессе выполнения. Это ²константы². Другие данные могут изменяться, или им могут быть присвоены значения. Они называются ²переменными². Множество допустимых операций и результат их выполнения полностью определяются типами данных.

В языке определены восемь ключевых слов, указывающих на стандартные типы данных: int (целый), long (длинный), short (короткий), unsigned (беззнаковый), char (символьный), float (действительный), double (действительный двойной точности), enum (перечисленный). Допустимые имена стандартных типов, размеры требуемый памяти в битах диапазон возможных значений данного типа приведены в таблице.

 

Имя типа Размер Точность Диапазон
Unsigned char     0 255
Char     -128 127
Enum     -32768 32767
Unsigned short     0 65535
Short     -32768 332767
Unsigned int     0 65535
Int     -32768 32767
Unsigned long     0 4294967295
Long     -2147483648 2147483647
Float   7 8 3.4.10-38 3.4.1038
Double     1.7.10-308 1.7.10308
Long double   18 20 3.4.10-4932 1.1.104932

 

В графе точность указано максимально возможное количество значащих цифр в десятичном представлении данных этого типа.

 

2.2.Константы

 

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

Десятичная целая константа состоит из цифр от 0 до 9 и не начинается с нуля (например, 26, 11, 1997).

Восьмеричная целая константа состоит из цифр от 0 до 7 и начинается с нуля, например, 0347, ее десятичное значение равно 3.82 + 4.81 + 7.80 = 231.

Шестнадцатеричная целая константа состоит из цифр от 0 до 9 и от А до F (или от а до f) (символы от А до F или от а до f обозначают цифрами от 10 до 15). Она начинается парой символов 0Х или 0х, например: число 0х 1b 2f, значение которого равно 1.163 + 11.162 + 2.161 +15.160 = 6959.

Длинная целая константа может быть в десятичной, восьмеричной и шестнадцатеричной формах и отличается от других целых констант символом l или L в конце. Например, 36171l, 076L, 0х2fl.

Константа с плавающей точкой состоит из целой части, десятичной точки, дробной части, символа экспоненты в виде е или Е и показателя степени в виде целой константы (возможно, со знаком). При этом могут отсутствовать целая или дробная часть, десятичная точка, символ экспоненты и показатель степени. Например, 5.92, 3.1415926, 2.3Е9,.358Е-6, 307Е-5.

Символьная константа состоит из одного символа кода ASCII, заключенного в апострофы:’a’, ’ж’, ’2’, ‘?’. Для специальных символов, в частности не имеющих графического представления, определены следующие константы:

 

‘\a’ Звуковой сигнал;
‘\b’ Забой символа предыдущей позиции;
‘\f’ Перевод формата;
‘\n’ Переход в начало следующей строки;
‘\r’ Переход в начало текущей строки;
‘\t’ Горизонтальная табуляция;
‘\v’ Вертикальная табуляция;
‘\\’ Обратный слеш;
‘\’’ Апостроф;
‘\’’’ Кавычка;
‘\0’ Признак окончания строки;

 

Строковая константа состоит из последовательности символов кода ASCII, заключенной в кавычки (например, ²a b c d 2 5²). Она обязательно располагается на одной строке. При выводе строковой константы на экран обозначения специальных символов используются по прямому назначению. Например, при выводе строковой константы ²\n a b c d \n 2 f a ² на экране будут отображены две строки:

a b c d

a

 

2.3. Имена

 

Особую гибкость программам придает возможность задания имен программным объектам - типам, переменным, константам, функциям и т.д. Имя состоит из прописных и строчных латинских букв, цифр от 0 до 9 и символа подчеркивания ²_², оно начинается только с буквы или символа подчеркивания. Длина имени может быть любой, но некоторые компиляторы различают имена только по тридцати двум первым символам. Прописные и строчные буквы считаются различными. Например, имена Y и y различны. В качестве имени нельзя использовать ключевые слова языка. Имя должно быть уникальным и использоваться только внутри той части программы, в которой оно объявлено или описано.

Ключевые слова, участвующие в задании имени, определяют способы употребления объекта с этим именем.

Имена переменных описываются оператором:

 

<имя типа> <имя 1> <имя 2>,...,

 

в котором <имя типа> должно быть описано заранее либо быть стандартным. Допускается описание с одновременной специализацией переменной:

 

<имя типа> <имя > = <выражение>,...,

 

где выражение может иметь значение типа, совместимого с <имя типа>.

Примеры описания имен переменных:

 

int i, j = 0, k;

float x = 1.,y, z;

char c;

 

Переменные с именами i, j, k описаны как целочисленные, причем установлено исходное значение для переменной j. Переменные x, y, z описаны действительным типом, и установлено исходное значение 1 для переменной x. Переменная С может принимать символьные (например, c = ’q’;) и целочисленные значения из диапазона -128 127 (например, с = -17;).

Описание имен констант от описания имен переменных отличается ключевым словом const и обязательной инициализацией значением выражения:

 

const <имя типа> <имя> = <выражение>,...;

 

Например, описания

const double pi = 3.1415926535897932385;

const char q = ‘?’;

 

гарантируют, что значения программных объектов pi и q в процессе выполнения программы останутся неизменными.

 

3. Основные операции, выражения и операторы

 

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

 

3.1. Арифметические операции и выражения

 

В языке определены знаки операций сложения (+), вычитания (-), умножения (*), деления (/) и взятие остатка от целочисленного деления (%). Деление целого числа на целое дает целочисленный результат (например, значение 9/5 равно 1). Значение выражения a % b (a и b целого типа) равно остатку от деления a на b (например, значение 9 % 5 равно 4).

Определены также две нетрадиционные операции: увеличения (++) и уменьшения (--) на единицу. Эти операции имеют префиксную (++n или --n) и постфиксную (n++ или n--) формы записи. В первом случае операнд вначале изменяется, а затем используется в выражении. Во втором случае операнд вначале используется в выражении, а затем изменяется.

Например, оператор присваивания

 

s = a + b ++;

 

означает ²вычислить сумму a + b, присвоить ее переменной s и увеличить значение переменной b на единицу². А оператор

 

s = a + ++b;

 

означает, ²увеличить значение переменной b на единицу, вычислить сумму a + b и присвоить ее переменной s².

Операции увеличения /старшинства имеют очень высокий уровень старшинства; только круглые скобки обладают более высоким приоритетом. Например, выражение a * b ++ означает (a) * * (b ++), а не (a * b) ++. Но такое старшинство не влияет на порядок вычислений. Например, во фрагменте:

y = 2; n = 3; m =(y + n++)*6;

 

сначала вычисляется значение m (m = 30) и лишь затем увеличивается значение переменной n (n = 4). Старшинство операций в этом примере означает, что операция ++ имеет отношение только к переменной n.

Арифметические выражения могут состоять из более простых выражений. Например, в выражении a *(b +с / d) / 20 можно выделить выражение c / d: a *(b +(z = с / d) / 20. Порядок вычисления определяется приоритетами операций. В первую очередь вычисляется все, что заключено в скобки; внутри скобок действуют обычные правила: старший приоритет у унарной операции изменения знака операнда на противоположный, ниже находятся операции умножения и деления и последними выполняются операции сложения и вычитания. Если две операции имеют равный уровень приоритета, то они выполняются слева направо. Исключением является оператор присваивания, который выполняется справа налево.

 

3.2.Операторы

 

Операторы служат законченными инструкциями для компьютера. На наличие оператора указывает символ ²; ², стоящий в конце оператора. Поэтому n = 4 - это всего лишь выражение, которое может быть частью более сложного выражения. Но n = 4; является оператором.

Оператор

int printf (const char *format,...);

является объявлением, поскольку отсутствует описание тела функции.

Оператор

int j;

является оператором описания, поскольку он не только объявляет переменную с именем j, но и описывает, что она может иметь только целочисленные свойства в определенном диапазоне.

Оператор

j = 2;

является оператором присваивания.

Оператор

printf (²\n % f², x);

называется оператором вызова функции printf.

 

3.3.Преобразование типов

 

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

Если операция выполняется над данными двух различных типов, обе величины приводятся к ²низшему²и выглядят так: long double, double, float, long, int, short, char. Применение ключевого слова unsigned повышает ранг соответствующего типа.

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

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

Если преобразование типов требуется условиями задачи, то разумно использовать ²операции приведения²:

 

(<имя типа>) <операнд>

 

Например, в следующем фрагменте используется автоматическое преобразование к типу int (операция приведения к типу int):

 

int m, n;

m = 1.6 + 1.7;

n = (int) 1.6 + (int) 1.7;

 

В результате имеем: m = 3 и n = 2.

 

3.4.Операция присваивания

 

Оператор присваивания имеет синтаксис:

 

a = b = c =... = <выражение>;

 

где a, b, c,... - имена переменных. При его выполнении сначала вычисляется значение <выражения>, а затем оно присваивается переменным в порядке справа налево. Например, после выполнения следующего фрагмента программы:

 

int i; float x, y; y = i = x = 7. / 2;

 

переменные примут значения x = 3.5, i = 3, y = 3.

Оператор присваивания может комбинироваться с большинством бинарных (двуxоперандных) операций. Например, n+ = 1; означает

n = n + 1; причем в первом операторе обращение к переменной n происходит только один раз.

Полный список комбинированных операций присваивания имеет вид:

+ =, - =, * =, / =, % =, >> =, << =, & =, ^ =, |=.

 

Операция присваивания может быть частью выражения. Например, в выражении

 

(r = sqrt (x + x + y* y)) < a

 

сначала вычисляется значение переменной r, а затем сравнивается с операндом a.

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

 

r = sqrt (x + x + y* y) < a

 

компилятором воспринимается как

 

r = (sqrt (x + x + y* y) < a).

 

4. Примеры выполнения задания

 

Составить программу для вычисления значения целочисленной переменной y по формуле

 

y = 25 + 6,8x / (x2 + 0,08) при x = 0,1.

 

Программа имеет следующий вид:

 

# include <stdio.h>

# define FIO ²Сидоров Иван Петрович²

# define gr ²студент группы 111²

# define Lr ²Лабораторная работа 1²

void main ()

{

const float x = 0.1;

int y;

printf (²\n \n %s \n %s %s², Lr, gr, FIO);

printf (²\n Исходный параметр x = % f², x);

y = 25 + 6,8*x / (x*x*x + 0.08);

printf (²\n Результат y = %d ², y);

}

 

В операторах вызова функции printf спецификаторы преобразования %s и %f означают форматы вывода соответственно строки и действительного числа. Выполнение программы завершается выдачей на экран следующих строк:

 

Лабораторная работа 1

Студент группы 111 Сидоров Иван Петрович

Исходный параметр x = 0.100000

Результат y = 32

 

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

Какова структура программы на языке Турбо Си?

Каковы правила записи имен программных объектов?

Какие типы констант вам известны?

Какие стандартные типы значений вам известны?

Какие арифметические операции вы знаете?

Каков порядок выполнения арифметических операций?

Назовите простейшие виды операторов.

Каков порядок автоматического преобразования типов?

Какие отличия между операцией и оператором присваивания?

Установлены значения переменных n и k: n = 2, k =2. Каковы значения n и k после выполнения любого из следующих операторов:

n * = ++k+ ++k;

n / = ++k + k--;

n + = ++k - --k;

n - = --k * ++k;

 

Варианты заданий

 

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

 

 

Варианты

 

1.

2.

3. 3,5 - 4.8 - 21,7 + 13,5.

4. 0,3036: (-0,23).

5.

6.

7.

8. 1,365: (0,21)

9. 5x + 7y,

10. 5x - 7y,

11.

12.

13.

14.

15. 8x - 3y,

16. 8x - 3y,

17.

18.

19.

20.

21.

22.

23.

24.

25.

 

Лабораторная работа № 2

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: