Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭВМ 1-3 лабы.rtf
Скачиваний:
33
Добавлен:
01.04.2015
Размер:
2.67 Mб
Скачать

4. Программы с ветвлением

4.1. Логический тип данных

Переменные логического типа описываются с помощью идентифика-тора bool. Они могут иметь два значения: false (ложь) или true (истина), под них выделяется один байт памяти. Внутренняя форма представления значения false – 0 (ноль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1.

Свои значения переменные логического типа получают обычно в результате выполнения операций сравнения (отношения):

<=

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

<

меньше

==

равно

>=

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

>

больше

!=

не равно

Помимо операций отношения в языке C/C++ существуют три логические операции: ! – отрицание, && – логическое И, || – логическое ИЛИ.

Рассмотрим таблицу истинности

x

y

!x

x&&y

x||y

0

0

1

0

0

0

1

1

0

1

1

0

0

0

1

1

1

0

1

1

Здесь 0 – false, 1 – true.

4.2. Логическое выражение

Логические операции, операции отношения и арифметические операции часто встречаются в одном выражении – такие выражения называются логическими. В логическом выражении принят следующий приоритет операций:

  1. !;

  2. &&, *, /, %;

  3. ||, +, -;

  4. операции сравнения.

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

Примеры

Обычная запись

Запись на C++

0<x≤1

(x>0&&x<=1)

(-2≤x<0)V(2<x≤4)

(x>-2&&x<0||x>2&&x<=4)

(x2+y2≤1)∩(y>|x|)

(sqr(x)+sqr(y)<=1&&y>abs(x))

(y>x2)∩(y<9)

(y>sqr(x)&&y<9)

Пример программы

#include <stdio.h>;

void main()

{

int f1, f2, a, Ok;

printf(”a=”); scanf(”%i”,&a);

f1=1; f2=a>7;

Ok=!(f1&&f2);

printf(”Ok=%i\n”,Ok);

}

Вопрос. Какие значения примут переменные f2 и Ok после выполнения программы, если мы введем значение a=8?

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

До сих пор мы писали программы, которые выполняют свои операторы (команды) в том порядке, в каком они расположены. Чтобы изменить последовательность выполнения различных частей программы, применяют условный оператор. Условный оператор позволяет выполнять или пропускать операторы программы в зависимости от некоторого условия.

Существует два вида условного оператора:

  • неполная форма условного оператора

if (<логическое выражение>) <оператор>

Выполнение условного оператора начинается с вычисления значения логического выражения. Если логическое выражение принимает значение true, выполняется <оператор>. Если же логическое выражение принимает значение false, то <оператор> не выполняется.

Примеры

1) if (x<0) Printf(”%f - отрицательное число”,x);

2) if (x>=0&&x<1) f=1/(1+pow(x,2));

Если надо пропустить или выполнить несколько операторов подряд, используется составной оператор:

{<оператор1>; <оператор2>; <оператор3>;}

Составной оператор – это последовательность операторов, перед которой стоит символ {, а после – }. После закрывающей фигурной скобки точка с запятой не ставится.

Пример

if (a>100) {b=b-10; c-=10;}

Если a>100, то значения переменных b и c уменьшаются на 10.

  • полная форма условного оператора

if (<логическое выражение>) <оператор1>; else <оператор2>

Примеры

1) if (x<y) x=2*x; else {y=x; x++;}

2) if (a>b) {max=a; min=b;}

else {max=b; min=a;}

Примеры программ

1. Составить программу вычисления значения функции

Обсуждение. Заданная функция определена на всей числовой прямой и при x≤0 принимает значение x2+1, при x>1 принимает значение 1+x, а в остальной области – значение 1+√x.

#include <stdio.h>;

#include <math.h>;

void main()

{ float x,f;

printf("x="); scanf("%f",&x);

if (x<=0) f=pow(x,2)+1; else

if (x>1) f=1+x; else f=1+sqrt(x);

printf("f(%.1f)=%f\n",x,f);

}

2. Составить программу, проверяющую принадлежность точки с координатами (x,y) заштрихованной области

Рис. 1.

Обсуждение. Заштрихованная область лежит внутри круга радиуса 2, описываемого уравнением x*x+y*y=4 и при x≥0 лежит выше прямой y=x, а при x<0 ниже прямой y=x, т.е. точка (x,y) заштрихованной области удовлетворяют условию

(x*x+y*y<=4)&&((x>=0)&&(y>=x)||(x<0)&&(y<=x)).

#include <stdio.h>;

void main()

{

float x,y;

printf("x y="); scanf("%f%f",&x,&y);

if (x*x+y*y<=4&&(x>=0&&y>=x||x<0&&y<=x))

printf("YES\n");else printf("NO\n");

}

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

Обсуждение. Обозначим первую цифру заданного четырехзначного числа переменной a, вторую – b, третью – c, четвертую – d. Так как первая цифра четырехзначного числа определяет тысячные, первая цифру находим делением нацело (/) на 1000 (отбрасываем последние три цифры), для определения второй цифры отбросим две последние цифры (N/100) и из полученного двузначного числа получим последнюю цифру (b=N/100%10) и т.д.

#include <stdio.h>;

void main()

{

int N, a, b, c, d;

printf("N="); scanf("%i",&N);

a=N/1000;

b=N/100%10;

c=N/10%10;

d=N%10;

if (a==d&&b==c) printf("YES\n");

else printf("NO\n");

}

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

Обсуждение. Високосным является год, номер которого делится на 4, но если номер года оканчивается на два нуля, то номер високосного года должен делиться еще и на 400. Например, 1700 – не високосный год, 2000 – високосный год.

#include <stdio.h>;

void main()

{

int year;

printf("year="); scanf("%i",&year);

if (year%100>0&&year%4==0||year%400==0)

printf("YES\n"); else printf("NO\n");

}

6. Составить программу, которая проверяет, можно ли из отрезков a, b и c построить треугольник.

Обсуждение. Используется неравенство треугольника: длина любой стороны треугольника меньше суммы длин двух других его сторон.

#include <stdio.h>;

void main()

{

float a, b, c;

printf("a b c="); scanf("%f%f%f",&a,&b,&c);

if (a<b+c&&b<a+c&&c<a+b) printf("YES\n");

else printf("NO\n");

}

7. Составить программу определения принадлежности точек A1(x1,y1), A2(x2,y2) и A3(x3,y3) одной прямой.

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

Уравнение прямой проходящей через две точки:

.

Приведем данное уравнение к общему виду Ax+By+C=0. Легко получить, что A=y2-y1, B=x1-x2, C=-A∙x1-B∙y1. Подставив координаты третьей точки в общее уравнение, ответим поставленной задаче.

#include <stdio.h>;

void main()

{

float x1,y1,x2,y2,x3,y3,A,B,C;

printf("x1 y1=");scanf("%f%f",&x1,&y1);

printf("x2 y2=");scanf("%f%f",&x2,&y2);

printf("x3 y3=");scanf("%f%f",&x3,&y3);

A=y2-y1; B=x1-x2; C=-A*x1-B*y1;

if (A*x3+B*y3+C==0) printf("YES\n"); else printf("NO\n");

}

8. Написать программу решения системы линейных уравнений

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

Если d=dx=dy=0, то система имеет бесконечно много решений.

Если d=0, dx≠0, dy≠0то система не имеет решения.

Если d≠0, то x=dx/d, y=dy/d.

#include <stdio.h>

#include <math.h>

void main()

{

float a1, b1, c1, a2, b2, c2, x, y, dx, dy, d;

printf("a1 b1 c1="); scanf("%f%f%f",&a1,&b1,&c1);

printf("a2 b2 c2="); scanf("%f%f%f",&a2,&b2,&c2);

d=a1*b2-a2*b1; dx=c1*b2-c2*b1; dy=a1*c2-a2*c1;

if (d==0&&dx==0&&dy==0) printf("Бескон. много реш.!");

else

if (d==0) printf("Решения нет!");

else

{

x=dx/d; y=dy/d;

printf("x=%0.3f y=%0.3f\n",x,y);

}

}

9. Поле шахматной доски определяется парой символов: первый символ – номер вертикали (a(97), b(98), c(99), d(100), e(101), f(102), g(103), h(104)- в скобках указаны коды соответствующих символов), второй - номер горизонтали (при счете снизу вверх). Составить программу определения: бьет ли белый слон черного коня?

Обсуждение. Слон бьет по диагонали. Две фигуры лежат на одной диагонали, если разность абсцисс и ординат фигур по абсолютной величине равны (см. рис.2). На рисунке представлены два случая расположения слона на шахматной доске. В первом случае разность равна 3, во втором – 4.

Рис.2

#include <stdio.h>;

#include <math.h>;

void main()

{

char Cx, Kx; int Cy, Ky;

printf("slon : "); scanf("%c%d",&Cx,&Cy);

printf("Korolb: "); scanf(" %c%d",&Kx,&Ky);

if (abs(Cx-Kx)==abs(Cy-Ky)) printf("YES\n");

else printf("NO\n");

}

Ведущий пробел в формате второго оператора scanf “подавляет” нажатие клавиши Enter после ввода координат слона .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]