Методические указания для выполнения лабораторных работ и курсовой работы содержание

Вид материалаМетодические указания

Содержание


3Лабораторная работа № 2. Условные операторы
Составные операторы
Адресные операторы
Условные операторы
Операторы отношения
Дополнительные сведения о выражениях
Оператор "запятая"
3.Варианты заданий
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   12

3Лабораторная работа № 2. Условные операторы


1. Цель работы


Целью работы является изучение форматов условных операторов и отработка приемов и навыков их использования в программах на языке «С».

2. Операции

Присваивание, как, например, в выражении ratio=a/b или ch=getch(), является одной из основных операций. В языке Си присва­ивание обозначается одним знаком равенства /=/; значение с правой стороны присваивается переменой с левой стороны.

Присвоения можно связывать таким образом: sum=a=b. В таком случае вычисление производится справа налево, т.е. значение b будет присвоено переменной, а затем будет присвоено переменной sum, при этом все три переменные получат одно и то же значение (первоначальное значение переменой b). Следует отметить, что оператор присваивания существенно отличается от знака "=", применяемого в математике. Например, в математике выражение а=а+5: не имеет смысла, тогда как в программе это означает, что прежнее значение "а" увеличивается на 5.

Унарные и бинарные операции

Язык Си поддерживает стандартный набор бинарных арифметических операций:

- умножение /*/

- деление (/)

- взятие остатка (%)

- сложение (+)

- вычитание (-)

Турбо-Си поддерживает операцию унарного минуса (a+(-b)), кото­рая выполняет дополнение до двух, а также, в качестве расширения по стандарту ANSI, операцию унарного плюса: (a+(+b)).

Операторы инкремента /++/ и декремента /--/

В языке Си имеются также некоторые специфические унарные и бинарные операторы. Наиболее широко известны из них операторы инкремента /++/ и декремента /--/. При помощи одного такого оператора можно добавить единицу к любому значению или вычесть из любого значения единицу. Сложение или вычитание могут производиться в середине выражения, кроме того, можно определить, будут ли они выполняться до или после вычисления всего выражения. Рассмотрим две сле­дующие строки программы:

sum = a + b ++;

sum = a + ++b;

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

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

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


Побитовые операторы

В языке Си имеются следующие операторы для работы на битовом уровне:

- сдвиг влево (<<)

- сдвиг вправо (>>)

- И (&)

- ИЛИ (I)

- исключающее ИЛИ ()

- НЕ (~)

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

#include

#include

#include

#include

void main()

{char n1=31,n2=15,n3=63;

n1=n1&4;

n2=(n2|128)>>4;

n3=(n331)<<1;

printf("n1= %04x n2= %04x n3= %04x ",n1,n2,n3);

}


Постарайтесь определить результаты, которые должна вывести эта программа, прежде чем вы ее запустите. Обратите внимание на использование спецификаторов размера поля для выравнивания выводимой информации: спецификатор %04X говорит о том, что мы хотим распеча­тать ведущие нули, что поле печати имеет ширину 4 разряда и выводи­мый результат распечатывается в шестнадцатеричном виде /основание 16/.

Составные операторы

Язык Си позволяет использовать сокращенную запись выражений со многими операторами. Все описанные выше операторы /унарные, бинар­ные, инкремента и декремента/ могут быть скомбинированы с операто­ром присваивания. Практически любое выражение вида:

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

может быть заменено на следующее: <переменная><оператор>=<выражение>;

Адресные операторы

Язык Си поддерживает два адресных оператора: оператор взятия адреса & и косвенный оператор *.

Оператор & возвращает адрес переменной: если sum есть перемен­ная типа int, тогда &sum есть адрес /ячейка памяти/ этой переменной. Таким образом, если msg есть ссылка на переменную типа char, тогда *msg есть символ, на который указывает msg. Напечатайте сле­дующую программу и изучите полученные результаты:

Первая строка выводит два значения: значение переменой sum /8/ и адрес этой переменной, присвоенный ей компилятором. Вторая строка также выводит два значения: символ, на который указывает msg/H/ и значение переменной, которое является адресом этого символа /этот адрес также присвоен компилятором/.

Условные операторы

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

Операторы отношения

Операторы отношения позволяют сравнивать два значения, резуль­тат операции зависит от того, истинно или ложно сравнение. Если сравнение ложно, значение результата равно нулю, если истинно, зна­чение равно единице. Список операторов отношения языка Си:

> больше чем

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

< меньше чем

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

== равно

!= не равно

Зачем необходимо знать, истинна какая-либо величина или ложна? Запустите программу, которая приведена ниже, и посмотрите, что получится, если в качестве второго значения вы введете ноль.

#include

#include

#include

#include

void main()

{int n1,n2,n3 ;

scanf("%d,%d",&n1,&n2);//ввод двух переменных целого типа

n3=n2/n1;

printf("%d результат = ",n3); //вывод результата деления

}


Программа напечатает сообщение об ошибке Divide by zero /Деление на ноль/ и остановится. Те­перь проделайте в ней нижеследующие изменения и запустите ее снова:

#include

#include

#include

#include

void main()

{int n1,n2,n3 ;

scanf("%d,%d",&n1,&n2);//ввод двух переменных целого типа

if(n2==0){

printf("отношение неопределено ");

getch(); // программа ждет ввода любого символа

}

else {

n3=n1/n2;

printf("%d результат = ",n3); //вывод результата деления

getch(); // программа ждет ввода любого символа

}

}


Оператор, находящийся на двух следующих за вызовом функции scanf строках называется условным оператором if. Он читается следу­ющим образом: "Если значение выражения n2==0 истинно, немедленно вызвать функцию printf. Если значение этого выражения ложно, прис­воить переменой n3 значение выражения n1/n2, за тем вызвать функ­цию printf."

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

Логические операторы

Имеется три логических оператора: И /&&/, ИЛИ /\\/ и НЕ /!/. Их необходимо отличать от описанных выше побитовых операторов /&,I,~/. Логические операторы работают с логическими значениями /true и false/, позволяя составлять выражения отношения.

Чем они отличаются от соответствующих побитовых операторов?

- Логические операторы дают результат или равный 1 /истина/ или 0 /ложь/, тогда как побитовые операторы производят соответствующие действия над каждым битом;

- Логические операторы && и || являются "короткозамкнутыми". Предположим, имеется выражение: expI&& exp2. Если exp1 ложно, тогда ехр2 вычисляться не будет. Точно также имея выражение ехр1 || exp2, мы не вычислим exp2, если exp1 истинно.

Дополнительные сведения о выражениях

Прежде чем мы перейдем к циклам, скажем еще несколько слов о выражениях. Выражения типа (а == 0.0) и (а <= c*p) достаточно проз­рачны. Однако язык Си позволяет писать куда более загадочные вещи. Мы не будем изощряться в загадочности, но приведем, все же, некоторые примеры.

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

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

Например, выражение (sum=5+3) имеет значение 8, поэтому выра­жение ((sum=5+3) <=10) всегда будет давать значение true, т.к. 8<=10. Следующий пример более экзотичен:

#include

#include

#include

#include

void main()

{char ch;

_begin:

if(((ch=getch()) == 'g`){

printf(""Quitting, huh?");

getch(); // программа ждет ввода любого символа

}

else {

printf Good move ");

getch(); // программа ждет ввода любого символа

goto _begin; // отправляемся на метку _begin;

}

}


Вы догадались, что здесь происходит? Когда программа встречает выражение ((ch=getch()) == 'g`), она останавливается, ждет пока вы не нажмете любую клавишу, присваивает символ, соответствующий этой клавише, переменной ch и затем сравнивает этот символ с буквой g.

Если они совпадают, тогда на экране появляется сообщение "Quitting, huh?" /Выходим, а?/, в противном случае распечатывается сообщение "Good move ..." /Попробуем еще .../.

Оператор "запятая"

Оператор "запятая" может использоваться для помещения сложного выражения в круглые скобки. Выражения будут вычисляться слева нап­раво, все выражение примет значение последнего вычисленного выраже­ния. Например, если имеются две переменные oldch и ch, обе типа char, тогда выражение

(oldch=ch, ch=getch())

производит следующие действия: значение переменной ch присваивается переменной oldch, затем принимается символ с клавиатуры, и он прис­ваивается переменной ch, затем все выражение принимает значение пе­ременной ch. Например:

Оператор if

Обратите внимание на оператор if в предыдущем примере. Оператор If имеет следующий формат:

if(значение)

выражение1;

else

выражение2;

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


Два замечания по поводу оператора if-else.

Во-первых, вторая часть оператора /else выражение2/ является необязательной; ниже приведен пример такого оператора if:

if (значение)

выражение1;

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

Во-вторых, иногда, если конкретное выражение истинно или лож­но, бывает нужно выполнить не одно действие, а несколько. Для этого используется составной оператор. Составной оператор состоит из левой фигурной скобки /{/, нескольких выражений, каждое из которых заканчивается точкой с запятой /;/ и правой фигурной скобки /}/. (см. предыдущие программы)

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

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

_______________________________________________________________________________

1.

--Ввести переменные х, у, z (x - целое, у - вещественное, z-вещественное).

Если х<0, то z=(x+5)*y; y=(z-3)*x; z=y/z;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________.

2.

--Ввести переменные х, у, z (x-целое, у - вещественное, z - вещественное).

Если х<0, то z=(x-5)*y; y=(z+63)*x; z=y*z;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

3.

--Ввести переменные х, у, z (x-целое, у - вещественное, z-вещественное).

Если х<-5, то z=(x-5)*y; y=(z+23)*x;

если -5=
если x>10, то z=x*x+y*y-x*y;.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

.

_______________________________________________________________________________

4.

--Ввести переменные х, у, z (x-целое, у - целое, z-вещественное).

Если х<0, то z=(x-5)*y; y=(z+33)/x; z=y*x;

если 0=
если x>10, то z=x*x+y*y-y/x:.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

5.

--Ввести переменные х, у, z (x-целое, у-вещественное, z- целое).

Eсли х<0, то z=(x-5)*y; y=(z-63)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

6.

--Ввести переменные х, у, z (x-целое, у - вещественное, z-вещественное).

Если х<0, то z=(x-5)*y; y=(z+63)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y-z;.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

7.

--Ввести переменные х, у, z (x-целое, у-вещественное, z-вещественное).

Если х<0, то z=(x-5)*y; y=(z+3)/x; z=y/x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________8.

--Ввести переменные х, у, z (x-целое, у - целое, z-вещественное).

Если х<0, то z=(x-5)/y; y=(z+63)*x; z=y/x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

9.

--Ввести переменные х, у, z (x - целое, у - вещественное, z - целое).

Если х<0, то z=(x-5)*y; y=(z+63)*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

10.

--Ввести переменные х, у, z (x-целое, у-вещественное, z-вещественное).

Eсли х<0, то z=(x-8)*y; y=(z+43)/x;

если 0=
если x>10, то z=x*x+y*y. z=y*x;

Вывести у и z.

-- Решить ту же задачу, используя оператор switch


_______________________________________________________________________________

11..

--Ввести переменные х, у, z (x-целое, у - целое, z-вещественное).

Если х<0, то z=(x-5)*y; y=(z+63)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

12.

--Ввести переменные х, у, z (x-целое, у-вещественное, z- целое).

Eсли х<0, то z=(x-5)*y; y=(z+63)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

13.

--Ввести переменные х, у, z (x-целое, у-вещественное, z-вещественное).

Если х<0, то z=(x-5)*y; y=(z+63)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y-z.

Вывести у и z.

--Решить ту же задачу, используя оператор switch_.

_______________________________________________________________________________

14.

--Ввести переменные х, у, z (x-целое, у - целое, z-вещественное).

Если х<0, то z=(x-5)*y; y=(z+63)*x;

если 0=
если x>10, то z=x*x+y*y=z/y.

Вывести у и z.

-- Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

15.

--Ввести переменные х, у, z (x-целое, у- целое, z-вещественное).

Eсли х<0, то z=(x-5)*y; y=(z+6)/x; z=y*x;

если 0=
если x>10, то z=x*x+y*y ; y=(z+63)*x; .

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

16..

--Ввести переменные х, у, z (x-целое, у-вещественное, z- целое).

Eсли х<0, то z=(x-5)*y; z=y*x;

если 0=
если x>10, то z=x*x+y*y. y=(z+63)*x;

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

17.

--Ввести переменные х, у, z (x-целое, у-вещественное, z-вещественное).

Если х<0, то z=(x-7)/y; y=(z+51)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y. y=(z+63)*x;

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

18.
  1. --Ввести переменные х, у, z (x-целое, у- целое, z-вещественное).

Eсли х<0, то z=(x-5)*y; y=(z+63)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

--Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

19.
  1. --Ввести переменные х,у,z(x-целое,у-вещественное,z- целое).

Eсли х<0, то z=(x-5)*y; z=y*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

-- Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

20.
  1. --Ввести переменные х, у, z(x-целое, у-вещественное, z-вещественное).

Если х<0, то z=(x-5)*y; y=(z+63)*x; z=y*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

-- Решить ту же задачу, используя оператор switch

_______________________________________________________________________________

21.
  1. --Ввести переменные х, у, z(x-целое, у - целое, z-вещественное).

Если х<0, то z=(x-5)*y; z=y*x;

если 0=
если x>10, то z=x*x+y*y.

Вывести у и z.

-- Решить ту же задачу, используя оператор switch

______________________________________________________________________________