Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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

C

Формат:

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

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

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

2. Количество опций (частей) E lseIf в инструкции не ограничено, однако рекомендуется использовать не более 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

End If

'при x> y and z< > w переход к инструкции с меткой m1

End If

Else

x=4

End If

m1: z=5


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

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

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

Формат:

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

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

if (a> b){

x=a; y=b;

} else {

x=b; y=a;

}

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

Циклы

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

Обобщенная блок-схема цикла состоит из следующих блоков (см. раздел 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, n, 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 ‘или Until 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

PrLast=n-1; //Индекс предыдущей последней перестановки

while (PrLast> 0){

CurLast=0; //Индекс текущей последней перестановки

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

if (x[i]> x[i+1]){ //Есть перестановка

Buf=x[i]; x[i]=x[i+1]; x[i+1]=Buf; CurLast=i;

}

}

PrLast=CurLast;

}

Basic

PrLast=n-1 //Индекс предыдущей последней перестановки

Do While PrLast> 0

CurLast=0 //Индекс текущей последней перестановки

For i=0 To PrLast-1

If x(i)> x(i+1) Then //Есть перестановка

Buf=x(i): x(i)=x(i+1): x(i+1)=Buf: CurLast=i

End If

Next i

PrLast=CurLast

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 ];

}

}

Ограничение x 3.05 выбрано из-за возможных ошибок округления дробного значения параметра. При ограничении 3.0 нет гарантии выполнения цикла при x =3.

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. Найти длину первой подпоследовательности, состоящей только из положительных элементов.

pr= false;

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

if (x[ i ]> 0){

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

}

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

}

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

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

fl= true ; pr= false ;

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

if (x[ i ]> 0){

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

}

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

}

Инструкция 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 и continue

В языке 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.

Существуют также инструкции Exit Select, Exit Sub, Exit Function.

Кроме того, есть инструкция перехода к концу тела цикла

Continue { Do | For | While },

действующая так же, как инструкция continue языка С, для ближайшей содержащей ее инструкции цикла.

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

Это инструкции, которые разумно использовать при программировании развилок более, чем на 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 ; ]

}

}

Замечание. Для единства стиля рекомендуется записывать инструкцию 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 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?

ВВОД-ВЫВОД

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

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

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

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

Замечание. Для чтения с консоли и вывода на нее русских символов в средах Visual Studio и Turbo C++ следует установить кодовую страницу 1251 с помощью функций SetConsoleCP(1251) и SetConsoleOutputCP(1251) и # include < windows.h> .

Язык Си

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

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

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

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

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

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

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

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

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

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

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

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

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

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

d – модификатор длины; = h – при передаче значений типа short, = l –

для long и double, модификатор ll для типа long long в среде разработки MinGW C/C++ 4.8 не реализован.

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

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

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

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

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

Пример.

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

165< пробел> d 165

-165< Tab> d -165

+165< Enter> d 165

165 2hd 16

165 1hd 1

431921 ld 431921

-431921 4ld -431

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

Замечание. Внешнее представление – это последовательность вводимых символов (нажатых клавиш).

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

Пример.

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

2475 d 2475


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 412; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.318 с.)
Главная | Случайная страница | Обратная связь