ПЕРЕВОД ДЮЙМОВ В САНТИМЕТРЫ Печать

   Рассмотрим программу, которая печатает таблицу соответствия дюймов сантиметрам. Соотношение между дюймами и сантиметрами следующее: 1 дюйм = 2.54 сантиметра.

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

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

Вывести заголовок таблицы.

Установить текущее значение, равное начальному значению.

Пока текущее значение не больше конечного значения,

повторять:

      вычислить значение в сантиметрах, соответствующее

      текущему значению:

      вывести текущее значение и соответствующее ему

      значение в сантиметрах;

      увеличить текущее значение на шаг приращения.

    

    Записанный нами текст является не чем иным, как алгоритмом, в соответствии с которым должна выполняться наша программа. Для того чтобы получить программу, нам нужно перевести этот алгоритм на язык программирования. Давайте посмотрим на алгоритм и выясним, можем ли мы перевести каждое предложение в операторы языка Си. Первое предложение начинается со слова «Вывести ...», значит, ему будет соответствовать вызов функции вывода языка Си (например. printf(...)). Предложение, начинающееся со слов «Установить ... равное ...» соответствует оператору присваивания. После слова «установить» указана переменная, которая получает новое значение, а после слова «равное» указан способ его вычисления. Предложение «Пока ... повторять ...» соответствует конструкции цикла, в которой тело цикла (указанное после слова «повторять») повторяется до тех пор, пока остается истинным условие (указанное после слова «пока»). Предложение, начинающееся со слова «вычислить ...», может соответствовать любому вычислению или вызову подпрограммы. В нашем случае необходимо вычисление по формуле, поэтому фраза «вычислить...» будет соответствовать оператору присваивания. Предложение, начинающееся со слова «увеличить ...». соответствует операции увеличения значения языка Си (или операции присваивания).

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

текущее значение;

начальное значение;

конечное значение;

значение в сантиметрах;

шаг приращения.

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

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

 

Имя в алгоритме

Перевод

Имя переменной

текущее значение

current value

CurVal

начальное значение

start value

StartVal

конечное значение

end value

EndVal

значение в сантиметрах

value in centimetre

VallnCen

шаг приращения

step

Step

Теперь мы можем записать программу на Си по приведенному алгоритму. Программа 2 /* Перевод дюймов в сантиметры */

#include <stdio.h>
main()
{
float StartVal;  /* начальное значение */
float EndVal;  /*конечное значение    */
float Step;       /* шаг приращения    */
float CurVal;   /* текущее значение    */
float VallnCen; /* значение в сантиметрах */
StartVal = 1.;
EndVal = 10.;
Step      =1.;
/* вывод заголовка таблицы */
printf("Дюймы Сантиметры/n");
CurVal = StartVal;
while  (CurVal <= EndVal)
 {
 VallnCen = CurVal * 2.54;
 printf("%5.0f %7.3f/n", CurVal, VallnCen);
 CurVal += Step;
 }
}

Теперь давайте рассмотрим программу и разберем незнакомые нам операторы. Эта программа, как и предыдущая, начинается с комментария, в котором коротко говорится о назначении программы. Затем идет директива препроцессора #inc!ude <stdio.h>, которая включает в текст программы описание функций стандартной библиотеки ввода/вывода. Наша программа состоит из одной функции с именем main() без параметров (мы уже говорили о том. что так обязательно должна называться функция Си, с которой начинается выполнение программы).

Дальше идут описания переменных, используемых в программе. Все переменные имеют один и тот же тип float - вещественный тип данных. Его значения занимают четыре байта памяти, лежат в диапазоне от 1Е-37 до 1Е+37 и представляют значения с точностью 1Е-5. Кроме указанного типа, в языке Си используется еще один встроенный тип данных double - вещественный тип данных двойной точности, значения которого занимают четыре байта памяти, лежат в диапазоне от 1Е-307 до 1Е+307 и представляют значения с точностью 1Е-9. Вещественные константы в языке Си принадлежат типу double.

Описание переменных выглядит следующим образом: сначала пишется спецификатор типа, а затем через запятую (.) список переменных. Заканчивается описание, как и все операторы языка Си, точкой с запятой (;).

<спецификатор типа> <идентификатор>. <идентификатор> ...;

Тип данных переменных задается спецификатором типа (мы знаем пока лишь две из них - float и double). По мере рассмотрения новых примеров мы разберем и другие спецификаторы типов. Все переменные, используемые в программе на Си. обязательно должны быть описаны. Все описания должны предшествовать выполняемым операторам.

После описаний переменных идут выполняемые операторы. В нашей программе выполняемые операторы начинаются с трех операторов присваивания, в которых переменные получают значения соответствующих вещественных констант.

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

В качестве знака операции присваивания используется знак равенства (=). Операция присваивания имеет два операнда. Левым операндом может являться переменная, а правым - любое выражение языка Си. Очевидно, что соблюдение порядока операндов обязательно, и их перестановка приведет к ошибке.

Выражение образуемое операцией присваивания, записывается следующим образом:

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

Значением этого выражения является значение левого операнда после выполнения операции присваивания. Кроме того, она имеет побочный эффект, который заключается в том. что изменяется значение переменной, указанной в левой части выражения.

Если в выражении несколько операций присваивания идут подряд, то они выполняются справа налево (обратите на это внимание).

Примеры:

х = (у * 23) / h:
count = count + 1;
z = (m = 5)+ 11;
a = b = с = 0;
a = (b = (c = 0));

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

Следующая строка программы 2 - оператор цикла с предусловием. Называется он так потому, что условие выполнения цикла проверяется перед выполнением тела цикла. В общем виде оператор записывается следующим образом:

while (<выражение){ <оператор1>

<оператор N> }

Операторы 1-N называются телом цикла. Выполнение оператора происходит следующим образом. Сначала вычисляется значение выражения. Если оно истинно, то выполняется тело цикла (операторы 1-N). Затем опять вычисляется значение выражения и т. д. до тех пор. пока значение выражения истинно. Как только оно станет ложным, выполнение программы продолжится с оператора, следующего за циклом. Если выражение ложно с самого начала, то тело цикла не выполняется ни разу.

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

while (<выражение>)
{
<оператор>
...
<оператор N>
}

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

Составной оператор может использоваться везде, где может использоваться простой оператор.

Например:

{
      х = 1;
      у = 2;
      z = 3;
}

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

 

 

           Таблица 1                                                                                                            Таблица 2

Знак

Название операции

Знак

Название операции

==

!=

<

<=

>

>=

равно

не равно

меньше

меньше или равно

больше

больше или равно

!

&&

||

логическое «НЕ»

логическое «И»

логическое «ИЛИ»

 

 

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

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

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

Операции отношения приведены в таблице 1. Логические операции показаны в таблице 2.

Выполнение логических операций «И» и «ИЛИ» отличается от выполнения этих операций в других языках.

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

Аналогично осуществляется и выполнение операции «ИЛИ». Вычисляется значение первого операнда. Если оно истинно, то и все выражение получает-значение истина: если же оно ложно, то вычисляется значение второго операнда, и значение всего выражения определяется по нему.

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

Тело оператора цикла содержит в нашем случае три оператора. Первый, оператор присваивания, в котором вычисляется значение в сантиметрах, соответствующее текущему значению в дюймах. Для этого переменной, содержащей значение в сантиметрах, присваивается значение произведения текущего значения и 2,54.

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

 

Таблица 3

 

Знак

Название операции

-

изменение знака

+

сложение

-

вычитание

*

умножение

/

деление

%

взятие по модулю

 

(вычисление остатка от деления)

 

 

Все операции, кроме первой, бинарные, т.е. имеют два операнда. Операция изменения знака - унарная, т. е. имеет один операнд.

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

К третьему относится оператор увеличения значения переменной на значение выражения, указанного справа от знака равенства. Эта операция имеет следующий формат

<переменная> += <выражение>

и эквивалентна следующему оператору присваивания:

<переменная> = <переменная> + (<выражение>)

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

Дюймы         Сантиметры



1

2.540

2

5.080

3

7.620

4

10.160

5

12.700

6

15.240

7

17.780

8

20.320

9

22.860

10

25.400