Инструкция If. Пустая инструкция 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Инструкция If. Пустая инструкция



Реализует базовую вычислительную структуру – развилку.

C

Формат:

if (<выражение>)<инструкция 1>;

[ else <инструкция 2>;]

Если <выражение> принимает значение true (¹0), то выполняется <инструкция 1>. Если <выражение> принимает значение false (=0), то выполняется <инструкция 2>. По правилам языка в каждой ветви должна быть только одна инструкция. В качестве любой из инструкций может использоваться другая инструкция if. Такие инструкции называют вложенными. Инструкции, входящие в состав инструкции if, для удобства чтения текста принято сдвигать вправо на 4-5 позиций.

Примеры.

if (a>b) if (x*x+y*y>r*r)z=0;

c=a;

else x+1, если x<0 if (x<0)

c=b; y= y=x+1;

1-x, если x>=0 else

y=1-x;

Вложенные if

if (x>y) x*x-5, если x<0

if (z==0) y= Öx+3, если 0<=x<=5

x=5; x-7, если x>5

Else

x=-5; if (x<0)

else y=x*x-5;

if (z>10) else

y=5; if (x<=5)

else y= sqrt (x)+3;

y=-5; else

y=x-7;

Пустая инструкция (есть только в языке C) имеет вид:;.

Пример.

if (x>y)

if (z==w)

if (w<p)

y=1;

Else

p=q; // При x>y && z!=w переход к инструкции с меткой m1

else; // Пустая инструкция

Else

x=4;

m1:z=5;

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

Basic

Используются 2 формы инструкции if.

Однострочная форма.

Формат:

if <условие> then [<инструкции>] [ else <инструкции>]

Замечания.

1. Эта форма инструкции if записывается в одну строку.

2. Инструкции за словом then могут отсутствовать только при наличии в инструкции if слова else.

3. Инструкций за словами then и else может быть более одной. В этом случае они отделяются друг от друга символом ": ".

Пример.

if x*x+y*y>r*r then z=0;

if a>b then c=a: d=b else c=b: d=a

Блочная форма ("цепочка").

Формат:

if <условие 1> [ then ]

[<инструкции>]

[ elseIf <условие 2> [ then ]

[<инструкции>]

]...

[ else

[<инструкции>]

]

End if

Замечания.

1. Слово if этой формы должно быть первым в строке. Слово then можно не записывать. При переходе к строке, следующей за строкой со словом if или elseif оно будет вставлено автоматически.

2. Количество опций (частей) elseif в инструкции не ограничено, однако рекомендуется использовать не более 3, поскольку текст становится плохо читаем. Для программирования большего числа альтернатив существует другая инструкция, описанная ниже в данном разделе.

3. Форма обязательно должна заканчиваться инструкцией end if.

4. При выполнении производится последовательная проверка условий. Как только какое-либо из них принимает значение true, выполняются следующие за соответствующим словом then инструкции и управление передается на инструкцию, следующую за инструкцией end if. Если не будет истинно ни одно из условий, то выполняются инструкции, следующие за словом else.

5. В состав внутренних инструкций в свою очередь могут входить другие инструкции if любой формы.

6. Транслятор отличает эту форму по отсутствию в строке после слова then других инструкций, не входящих в инструкцию if. Допустим только комментарий.


Примеры. Вычислить:

x*x-5, если x<0

y= Öx+3, если 0<=x<=5

x-7, если x>5


if x<0 then

y=x*x-5

elseif x<=5 then

y= sqrt (x)+3

else

y=x-7

End if


Вложенные инструкции:

if x>y then

if z=w then

if w<p then

y=1

Else

p=q 'при x>y and z<>w пе

реход к инструкции с

меткой m1

end if

end if

Else

x=4

End if

m1:z=5


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

Составная инструкция

В языке Basic такой инструкциинет по той же причине, что и пустой инструкции.

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

Формат:

{<инструкция>;[<инструкция>;]...}

Пример. Найти x=max(a, b), y=min(a, b).

if (a>b){

x=a; y=b;

} else {

x=b; y=a;

}

Циклы

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

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

Примеры. Программирование циклов без использования инструкции цикла.

Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

C

u=v=0; i=0; // Инициализация цикла

begin: if (i>=100) goto end; // Условие окончания

if (a[ i ]>0)u+=a[ i ]; if (a[ i ]<0)v+=a[ i ]; // Тело цикла

i++; // Изменение условия

goto begin; // Переход к началу

end:;

Basic

u=0: v=0: i=0 ' Инициализация цикла

begin: if i>=100 then goto konec ' Условие окончания

if a(i)>0 then u+=a(i) ' Тело

if a(i)<0 then v+=a(i) ' цикла

i+=1 ' Изменение условия

goto begin ' Переход к началу

konec:..................................

Дано: {ai}, i=1...100. Найти y=max{ai} и его номер.

С

MaxElem=a[0]; NumbMaxElem=i=1; // Инициализация цикла

Begin: if (i>=100) goto End; // Условие окончания

if (MaxElem<a[ i ]){ // Тело

MaxElem=a[ i ]; NumbMaxElem=i+1; //

} // цикла

i++; // Изменение условия

goto Begin; // Переход к началу

End:;

Basic

MaxElem=a(0): NumbMaxElem=1: i=1 ' Инициализация цикла

Begin: if i>=100 goto Konec ' Условие окончания

if MaxElem<a(i) then MaxElem=a(i): NumbMaxElem=i+1' Тело цикла

i+=1 ' Изменение условия

goto Begin ' Переход к началу

Konec:...........................................

Различают циклы с пред условием (тело цикла может ни разу не выполняться)и пост условием (тело цикла выполняется хотя бы 1 раз).

Пример. Цикл с постусловием.

MaxElem=a(0): NumbMaxElem=1: i=1

Begin: if MaxElem<a(i) then MaxElem=a(i): NumbMaxElem=i+1

i+=1

if i<100 goto Begin

Konec:...........................................

Циклы с предусловием

Наиболее употребительный тип инструкции цикла. Существует несколько форм таких инструкций и в языке C, и в языке Basic. Назовем их условно циклы while и циклы for.

Циклы while

C

Формат:

while (<условие>)<инструкция>;

Эквивалентная схема:

label: if (<условие>)<инструкция>; goto label;

...........................................................................

Замечания.

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

2. Для того, чтобы цикл когда-либо закончился (не произошло зацикливания), необходимо в теле цикла изменять переменные, входящие в условие.

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

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

Пример. Найти Sxn/n!,n=1,2,..., пока |un|>5e-6.

Рекуррентное соотношение: un/un-1=xn*(n-1)!/xn-1*n!=x/n àun=un-1*x/n

s=0;

u=n=1;

while (fabs (u)>5e-6){

u *= x/n;

s += u;

n++;

}

Basic

Формат:

do while <условие>

<инструкции>

loop

Пример. Тот же.

s=0: u=1: n=1

do while abs (u)>5e-6

u *= x/n

s += u

n += 1

Loop

Допустима другая разновидность этой инструкции:

do until <условие>

<инструкции>

loop

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

Пример.

s=0: u=1: n=1

do until abs (u)<=5e-6

u *= x/n

s += u

n += 1

Loop

Есть еще 1 инструкция, более похожая на инструкцию языка C:

while <условие>

<инструкции>

End while

Работает так же, как инструкция do while... loop. Различие между ними будет рассмотрено ниже.

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

- число повторений тела цикла не определено;

- неизвестна закономерность повторений или она сложна.

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

Циклы for

C

Формат:

for ([<выражение 1>];[<выражение 2>];[<выражение 3>])[<инструкция>];

Эквивалентная схема

<выражение 1>;

while (<выражение 2>){

<инструкция>

<выражение 3>;

}

Замечания.

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

2. Тело цикла – одна инструкция, которая может отсутствовать.

Примеры.

Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

u=v=0;

for (i=0; i<100; i++){

if (a[ i ]>0)u+=a[ i ]; if (a[ i ]<0)v+=a[ i ];

}

Найти Sxn/n!,n=1,2,..., пока |un|>5e-6.

s=0;

u=1;

for (n=1; fabs (u)>5e-6; n++){

u *= x/n;

s += u;

}

Определить число цифр натурального числа n.

for (k=0; n!=0; n/=10)k++;

Найти первый отрицательный элемент массива. Если его нет, то ответ = 0.

for (i=0; i<100 && a[ i ]>=0; i++); // Тело цикла отсутствует

if (i==100){

y=0;

} else {

y=a[ i ];

}

Замечания.

1. Как видно из примеров, почти все циклы используют для своей организации некоторую переменную, которую называют параметром или счетчиком цикла. См. переменные i, n, k, i в порядке следования примеров. Эту переменную не рекомендуется изменять в теле цикла, поскольку логика алгоритма становится запутанной.

2. После окончания цикла параметр сохраняет последнее присвоенное значение. В последнем примере i равно 100, если отрицательных элементов в массиве нет, или равно индексу первого по порядку следования в массиве отрицательного элемента.

3. Это наиболее универсальная форма инструкции цикла.

Basic

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


Формат:

for <счетчик>=<начало> to <конец> [ step <шаг>]

<инструкции>

next [<счетчик>]

Эквивалентная схема:

<счетчик>=<начало>

do while <шаг> < 0 and <счетчик> >= <конец> or _

<шаг> >=0 and <счетчик> <= <конец>

<инструкции>

<счетчик> += <шаг>

loop

Замечания.

1. <счетчик> - переменная (без индексов!) числового типа, <начало>, <конец>, <шаг> - арифметические выражения.

2. Если опция (часть инструкции) step отсутствует, то шаг равен 1.

3. Отсутствие <счетчика> в инструкции next не влияет на работу цикла, являясь, по существу, дополнительным комментарием, особенно при вложенных циклах, о которых речь пойдет ниже.

4. Значение <счетчика> после окончания цикла равно последнему присвоенному значению (как в языке C).

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

Пример. Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

u=0: v=0

for i=1 to 100

if a(i)>0 then u += a[i]: if a(i)<0 then v += a(i);

next i

Циклы с постусловием

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

C

Формат:

do <инструкция> while <условие>;

Эквивалентная схема:

label: <инструкция>;

if (<условие>) goto label;

Пример. Дано: {ai}, i=1...100. Найти Sai и Pai.

s=i=0;

p=1;

do { s += a[ i ];

p *= a[ i ];

i++;

} while (i<100);


Basic

Формат:

do

<инструкции>

loop { while | until } <условие>

Пример. Тот же.

s=0: i=0

p=1

do

s += a(i)

p *= a(i)

i += 1

loop while i<100

Вложенные циклы

Суть: инструкция тела цикла есть другая инструкция цикла.

Примеры.

1.Умножение матриц. C=A*B, где:

{aik}, i=1... m, k=1... n; {bkj}, k=1...n, j=1... l; {cij}, i=1...m, j=1...l cij=Saik*bkj

C

for (i=0; i<m; i++){

for (j=0; j<l; j++){

c[ i ][ j ]=0;

for (k=0; k<n; k++){

c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ];

}

}

}

Basic

for i=0 to m-1

for j=0 to l-1

c(i, j)=0

for k=0 to n-1

c(i, j) += a(i, k)*b(k, j)

next k

next j

next I

2.Сортировка по неубыванию элементов массива методом "пузырька".

C

pr=1; // pr – признак наличия перестановки: 1- есть перестановка, 0 - нет

while (pr){

pr=0;

for (i=0; i<n-1; i++){

if (a[ i ]>a[ i+1 ]){ // Сравнение "соседей"

b=a[ i ]; a[ i ]=a[ i+1]; a[ i+1]=b; pr=1;//Произошла перестановка

}

}

}


Basic

pr= true ' pr – признак наличия перестановки: 1- есть перестановка, 0 - нет

do while pr

pr= false

for i=1 to n-1

if a(i)>a(i+1)) ' Сравнение "соседей"

b=a(i): a(i)=a(i+1): a(i+1)=b: pr= true 'Произошла перестановка

end if

next i

Loop

3.Цикл с вещественным(дробным) параметром. Вычислить значение функции P(x)=anxn+an-1xn-1+...+a1x+a0 при изменении x от 2 до 3 с шагом dx=0.1.

Схема Горнера – вычисление полинома (многочлена): вывод формулы.

a3x3+a2x2+a1x+a0= (a3x+a2)x2+a1x+a0= ((a3x+a2)x+a1)x+a0

C

j=-1;

for (x=2; x<3.05; x+=.1){ // Формирование массива значений

j++;

p[ j ]=0; // Вычисление значения полинома для заданного x

for (i=n; i>=0; i--){

p[ j ]=p[ j ]*x+a[ i ];

}

}

Basic

j=-1

for x=2 to 3.05 step 0.1 ' Формирование массива значений

j=j+1

p(j)=0 ‘ Вычисление значения полинома для заданного x

for i=n to 0 step -1

p(j)=p(j)*x+a(i)

next i

next x

4. Дана матрица {aik}, i,k=1...10. Найти {bi}, i=1...10, где

1, если в i-й строке диагональный элемент максимален

bi=

0, если нет

C

for (i=0; i<10; i++){

for (k=0; k<10 && a[ i ][ k ]<=a[ i ][ i ]; k++);

if (k==10){

b[ i ]=1;

} else {

b[ i ]=0;

}

}

Basic

for i=0 to 9

k=0

do while k<=10 and a(i,k)<=a(i,i)

k += 1

Loop

if k=10 then b(i)=1 else b(i)=0

next i

Управляемые переходы

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

В языке C есть 2 инструкции управляемых переходов.

Инструкция break

Передает управление инструкции, непосредственно следующей за инструкцией цикла или switch (см. ниже).

Формат:

break;

Эквивалентная схема:

for (e1; e2; e3){ for (e1; e2; e3){

.......................................................................

if (<условие>) break; if (<условие>) goto exit;

.......................................................................

} }

......................... exit:...................

Пример. Дано {xi}, i=1...30. Найти длину первой подпоследовательности, состоящей только из положительных элементов.

for (pr=kol=i=0; i<30; i++){

if (x[ i ]>0){

kol++; if (!pr)pr=1;

}

if (x[ i ]<=0 && pr) break;

}

Замечание. Почти всегда без инструкции break можно обойтись.

Пример. Тот же.

fl=1;

for (pr=kol=i=0; i<30 && fl; i++){

if (x[ i ]>0){

kol++; if (!pr)pr=1;

}

if (x[ i ]<=0 && pr)fl=0;

}

Инструкция continue

Вызывает переход в конец тела цикла (точнее, к вычислению выражения 3, затем к проверке условия выполнения цикла (выражение 2) в инструкции for или непосредственно к проверке условия в инструкциях while и do).

Формат:

continue;

Эквивалентная схема:

for (e1; e2; e3){ for (e1; e2; e3){

.......................................................................

if (<условие>) continue; if (<условие>) goto next;

.......................................................................

} next:;

......................... }


Пример. Обработка положительных элементов массива.

for (i=0; i<n; i++){ for (i=0; i<n; i++){

if (a[ i ]<=0) continue; if (a[ i ]>0){/* Обработка a[ i ]>0 */

/*Обработка a[ i ]>0 */..................................................

................ }

} }

Инструкции exit

В языке Basic имеется семейство инструкций exit, которые действуют аналогично инструкции break в языке C. Каждая инструкция должна находиться внутри соответствующей сложной инструкции и действует только на нее. В рассмотренном ниже примере используется инструкция exit for.

Пример. Дано {xi}, i=1...30. Найти длину первой подпоследовательности, состоящей только из положительных элементов.

pr= false: kol=0

for i=0 to 29

if x(i)>0 then

kol += 1: if not pr then pr= true

End if

if x(i)<=0 and pr then exit for

next

Замечание. Если используются вложенные циклы do, for или while, а в теле самого внутреннего цикла инструкция exit, то exit do действует только на цикл do, exit for – только на цикл for, exit while – только на цикл while.

Многоальтернативный выбор

Это инструкции, которые разумно использовать при программировании развилок более, чем на 3 ветви.

Инструкция switch (язык С)

Формат:

switch (<выражение>) <инструкция>

Выражение должно быть целого типа.

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

switch (<выражение>){

case <постоянное выражение>:[ case <пост. выражение>:]... [<инструкция>]

[ case <пост. выражение>:[ case <пост. выражение>:]... [<инструкция>]]…

[ default: <инструкция>]

}

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

Схема выполнения инструкции следующая.

1. Вычисляется выражение в инструкции switch. Его иногда называют тестовым.

2. Выполняется проверка на равенство значения тестового выражения и значений меток в предложениях case в порядке их следования в теле инструкции switch.

3. Как только такая метка будет найдена, управление передается инструкции, следующей за ней.

4. Если не произойдет совпадение значения ни с одной из меток case, управление передается инструкции за меткой default, если она присутствует.

5. Если такой ветви нет, то управление передается инструкции, следующей за инструкцией switch, т.е. тело ее просто пропускается.

Правила и рекомендации.

1. Предложения case и default могут записываться в произвольном порядке, однако рекомендуется располагать так, как показано выше.

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

3. Метки не влияют на порядок выполнения следующих инструкций, т.е. если в процессе выполнения switch будет выбрана 1 из ветвей case, то продолжится выполнение инструкций последующих ветвей case или default. Если необходимо прекратить выполнение после какой-либо ветви, следует использовать инструкцию break, которая передаст управление инструкции, следующей за switch.

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

5. Значения меток в теле switch должны быть уникальными, поскольку управление передается в первую по записи ветвь, метка которой совпадет с тестовым значением. Следовательно, переход в другую ветвь с такой же меткой физически недостижим.

Пример. Дан символьный массив {xi}, i=1...30. Подсчитать количество символов разрядки, цифр (каждой по отдельности) и остальных символов.

for (i=0; i<10; i++)digit[ i ]=0; // Массив для подсчета "вхождений" каждой цифры

for (empty=other=i=0; i<30; i++){

switch (x[i]){

case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': digit[x[ i ]-'0']++; break;

case ' ': case '\n': case '\t':empty++; break;

default: other++; [ break;]

}

}

5.8.2. Инструкция select case (язык Basic)

Формат:

select [ case ] <тестовое выражение>
case <список выражений>

[<инструкции>]
[
case <список выражений>

[<инструкции>]]...
[
case else

[<инструкции>]

]

end select

<список выражений>:=<выражение>[,<выражение>]...

<выражение>:={<выражение>|<выражение> to <выражение>| is <оператор сравнения><выражение>}

<оператор сравнения>:={>|>=|<|<=|=|<>}

Правила и рекомендации.

1. Тестовое выражение – числовое или строчное выражение.

2. Предложение case else аналогично предложению default в языке C.

3. Выражения в теле инструкции могут быть произвольными (допустимы переменные) в отличие от языка C.

4. Метка типа <выражение> проверяется на точное сравнение с тестовым значением.

5. Метка типа <выражение> to <выражение> представляет собой замкнутый диапазон значений, при попадании в который тестового значения выполняется переход на соответствующую ветвь, например, 5 to 10.

6. Метка типа is <оператор сравнения><выражение> есть открытый диапазон допустимых значений, например, is < MaxSize. Ключевое слово is может опускаться. После завершения инструкции case или case else оно будет вставлено перед оператором сравнения.

7. В отличие от языка C при попадании управления на какую-либо ветвь инструкции выполняются до следующего предложения case или end select, а не переходят дальше.

8. Ключевое слово case в инструкции select может опускаться.

Пример. Тот же.

for i=0 to 9

digit(i)=0

Next

emp=0: other=0

for i=0 to 29

select case x(i)

case “0” to “9”

digit(x(i)-“0”) += 1

case “ “, “\n”, “\t”

emp += 1

Case else

other += 1

End select

Next

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

Вопросы для самопроверки

1. Какие преимущества имеет инструкция присваивания языка C перед аналогичной инструкцией языка Basic?

2. Какой новый объект программы позволяет выполнить инструкцию goto?

3. Допустим ли выход из тела цикла с помощью инструкции goto?

4. Можно ли реализовать разветвление алгоритма более, чем на 2 ветви?

5. Почему необходимо в языке C наличие пустой инструкции?

6. В чем смысл составной инструкции?

7. Можно ли организовать цикл, не используя инструкцию цикла?

8. В чем преимущество циклов с предусловием?

9. Можно ли изменять конечное значение счетчика цикла внутри тела цикла в инструкции for языка Basic? А в инструкции for языка C?

10. Чему равно значение счетчика цикла после его окончания? Отличается ли это правило для языков Basic и C?

11. В чем разница в действиях инструкций break и continue языка C?

12. Происходит ли выход из инструкции switch по достижения конца ветви case? А в инструкции select языка Basic?

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

1. Можно ли считать запись i ++; инструкцией присваивания?

2. Можно ли использовать в качестве метки целое число? Если можно, то в каком языке?

3. Как выполняется помеченная инструкция, если она достигнута не с помощью инструкции goto, а в естественном порядке выполнения программы?

4. Почему в языке Basic не нужны пустая и составная инструкции?

5. Можно ли в однострочной форме инструкции if языка Basic выполнить разветвление более, чем на 2 ветви?

6. Перечислите блоки обобщенной блок-схемы цикла.

7. Какова функция <выражения 3> инструкции for языка C?

8. Когда разумно использовать цикл с постусловием?

9. Когда форма do until языка Basic удобней, чем форма do while?

10. Может ли инструкция exit do завершить цикл for?

11. Могут ли иметь одинаковые значения выражения в ветвях case инструкций switch и select?

ВВОД-ВЫВОД

Ввод-вывод в языке Basic в данном разделе не рассматриваем.

Ввод-вывод – это передача данных между переменными программы в оперативной памяти и внешней средой.

Ввод – это передача: внешняя среда à оперативная память, вывод – оперативная память à внешняя среда.

Здесь рассмотрим только форматный обмен, т.е. обмен с преобразованием данных. В языке C обмен данных производится с помощью функций, прототипы которых хранятся в файле stdio.h.

Основными функциями форматного ввода-вывода являются: printf – вывод на экран, scanf – ввод с клавиатуры.

Формат обращения к ним:

{ scanf | printf }(<управляющая строка>[, < список -данных>]);

Управляющая строка

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

Формат одной спецификации:

% [<флаги>][ W ][. D ][ l ]<тип>

Флаги для функции printf (для функции scanf они не используются):

- данное прижимается к левой границе поля вывода, если выводи-

мое значение имеет меньше символов, чем размер поля вывода;

+ число всегда выводится со знаком;

<пробел> вместо знака числа: <пробел> для чисел > 0, - для чисел <0.

W – размер поля данного в символах (байтах).

D – обычно характеризует точность представления значения при выводе, при вводе не используется.

l – модификатор длинных значений; употребляется при передаче значений типа long и double.

<тип> - это собственно спецификация, определяющая тип передаваемого значения.

6.1.1. Спецификация d (целые десятичные числа)

Ввод. Формат спецификации: %[W][l]d

Значения при вводе разделяются символами разрядки. Если до появления символа разрядки будет считано W символов и в спецификации присутствует параметр W, то ввод данного значения закончится.

W – максимальное число считываемых символов.

Пример.

Внешнее представление Спецификация Значение в памяти

165<пробел> d 165

-165<Tab> d -165

+165<Enter> d 165

165 2d 16

165 1d 1

431921 ld 431921

-431921 4ld -431

+431921<пробел> 10ld 431921

Вывод. Формат спецификации: %[<флаги>][W][.D][l]d, где D – минимальное число выводимых символов. Если длина выводимого значения превышает W символов, то действие параметра W игнорируется и значение выводится полностью. Если его длина меньше W символов, то выводимое значение располагается в крайних правых позициях поля вывода. Если при этом использован флаг -, то значение располагается в крайних левых позициях поля. Если длина значения меньше D символов, то значение дополняется слева нулями.

Пример.

Значение в памяти Спецификация Внешнее представление

2475 d 2475

2475 +d +2475

2475 <пробел>d <пробел>2475

-2475 d -2475

-2475 +d -2475

-2475 <пробел>d -2475

-2475 3d -2475

2475 10d ______2475

2475 +10d _____+2475

2475 -10d 2475______

2475 -+10d +2475_____

2475 10.4d ______2475

-12 10.4d ______-012

-12.4d -012

-12.0d -12

3 5.0d ____3

-478126 10ld ___-478126

-478126 -10ld -478126___

478126 +-10ld +478126___

6.1.2. Спецификация f (десятичные числа с плавающей точкой)

Ввод. Формат спецификации: %[W][l]f.

Форма представления одного значения:

[+|-][ a ][. b ][<порядок>], где a целая часть, b – дробная часть.

<порядок>:= [ e | E ][+|-]<целое без знака>

Длина мантиссы >= 1 цифры.

Вводимое значение может представляться как в обычной, так и в показательной форме. Очевидно, что какая-то из необязательных опций должна присутствовать. Для значений в показательной форме символ e (10 в степени) можно не задавать. Тогда необходимо задать знак числа.

Пример.

Внешнее представление Спецификация Значение в памяти

-2.347e-5 f -2.347e-5

-236.485 f -2.36485e+2

2e10 f 2e10

.345 f 0.345

-2. f -2.0

461.2347 %5f%3f 461.2 347

-94.56e-5 f -9.456e-4

-94.56+5 f -9.456e+6

 

Вывод. Значение выводится в обычной форме.

Формат спецификации: %[W] [.D][ l ] f, где D – число знаков после символа десятичной точки.

По умолчанию D =6. При D =0 десятичная точка не выводится. Если число дробных разрядов больше D, то результат округляется, если меньше, то значение дополняется справа нулями. Значение, как при спецификации d, выводится полностью, что при неправильной оценке величины выводимого значения приводит к очень длинным числам.

Пример.

Значение в памяти Спецификация Внешнее представление

-385.476 f -385.476000

2. f 2.000000

1e-7 f 0.000000

1e15 f 1000000000000000.000000

-385.476 10f -385.476000

-385.476 15f ____-385.476000

2.5 10.4f ____2.5000

-6.48756 10.4f ___-6.4876

-0.34844 6.4f -0.3484

38.56.0f 39

0.000346 10.5f ___0.00035

6.1.3. Спецификация e (десятичные числа с плавающей точкой)

Ввод. Полностью аналогичен спецификации f, поэтому для ввода ее можно не использовать.

Вывод. Значение выводится в показательной форме в нормализованно



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 359; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.221.46.132 (0.432 с.)