Если это значение равно нулю (ложь) – то сообщение:
Эти величины не равны между собой
Хотя и в этом случае обе переменные будут иметь одинаковые значения.
Часто встречающиеся ошибки программирования
1. Использование else безпервой ветви:
if (n > m)
Else...
2. Использование открывающей фигурной скобки { без закрывающей } и наоборот.
3. Отсутствие точки с запятой перед словом else:
if (n > m)
a=1
else a=0;
4. Точка с запятой после условия:
if (n > m);
a=1;
else a=0;
5. Отсутствие точки с запятой перед закрывающей фигурной скобкой } или наличие точки с запятой после нее:
if (c < 2.5)
{
a=sin(c);
b=fabs(c);
};
Else
{
a=cos(c);
b=1.0/c
}
Пример
Задан график функции f(x) – полуокружность радиуса R = 1:
Определить:
1. Значение функции y при заданном значении аргумента x.
2. Площади фигур слева и справа от линии разреза.
По теореме Пифагора:
Площадь фигуры слева от линии разреза определяется суммой площадей прямоугольного треугольника
s1 = 0,5 x y
и сектора
s2 = 0,5 R2 (α – sin α), где α – центральный угол в радианах,
причем
α = arcsin(y/R).
Площадь всей фигуры (полукруга) определяется выражением
S = πR2/2.
Программа решения задачи:
#include <stdio.h>
#include <conio.h>
#include <math.h>
Int main()
{
const float Pi=3.1415926536;
float x, y, s_left, s_right, alfa, sin_alfa, segment;
printf(“\nx= ”);
scanf(“%f”, &x);
if (x<=1.0) // первый участок
{
y=sqrt(1.0 - (x - 1.0) * (x - 1.0));
if (x<=0.0)
y=0.0;
}
Else
{ // второй участок
y=sqrt(1.0 - (x - floor(x)) * (x - floor(x)));
if (x>=2.0)
y=0.0;
}
if (x==1.0) // двойной знак равенства!
{
s_left=0.7854;
s_right=0.7854;
}
if (x<1.0) // первый участок
{
sin_alfa=y;
if (sin_alfa!=1.0)
alfa=atan(sin_alfa/sqrt(1.0 - sin_alfa*sin_alfa));
else alfa=Pi/2.0;
segment=0.5*(alfa - sin_alfa);
s_left=segment + 0.5*x*y;
s_right=Pi/2.0 - s_left;
} //x<1.0
if (x>1.0) // второй участок
{
x=2.0-x;
sin_alfa=y;
if (sin_alfa!=1.0)
alfa=atan(sin_alfa/sqrt(1.0 - sin_alfa*sin_alfa));
else alfa=Pi/2.0;
segment=0.5*(alfa - sin_alfa);
s_left=segment + 0.5*x*y;
s_right=Pi/2.0 - s_left;
} //x>1.0
printf(“\ny=%6.3f”, y);
printf(“\n s_left=%6.3f”, s_left);
printf(“\n s_right=%6.3f”, s_right);
return 0;
}
Переключатель
Часто приходится делать выбор не между двумя, а между несколькими путями решения задачи. Такую ситуацию называют переключателем:
В языке Си переключатель реализуется оператором:
Switch (селектор)
{
case метка-1: оператор-1;
break;
case метка-2: оператор-2;
break;
case метка-3: оператор-3;
break;
.................
default: оператор-n;
}
где switch – служебное слово переключатель,
case – служебное слово вариант,
селектор – переменная или выражение целого типа (обязательно ставится в скобках);
метка-1, метка-2,… – метки вариантов – значения селектора – целые числа, символы или имена констант,
break – служебное слово прервать,
default – служебное слово по умолчанию (не обязательно).
Действия оператора:
1) вычисляется значение селектора;
2) это значение отыскивается среди меток вариантов;
3) выполняется оператор, стоящий за найденной меткой;
4) если далее стоит оператор break, то осуществляется выход из переключателя, иначе выполняется следующий оператор в нем;
5) если метка не найдена, то выполняется оператор, стоящий за словом default.
В любой ветви оператора switch могут стоять несколько меток вариантов, разделенных двоеточием:
Switch (селектор)
{
case метка-1: case метка-2: case метка-3: оператор-1;
break;
case метка-4: case метка-5: оператор-2;
break;
case метка-6: оператор-3;
break;
.................
default: оператор-n;
}
Эту структуру можно представить в следующем виде:
Switch (селектор)
{
case метка-1:
case метка-2:
case метка-3: оператор-1;
break;
case метка-4:
case метка-5: оператор-2;
break;
case метка-6: оператор-3;
break;
.................
default: оператор-n;
}
Внимание! Метки вариантов не должны повторяться!
Если в переключателе убрать операторы break, то после выполнения оператора, стоящего за найденной меткой вариантов, выполняются все оставшиеся операторы, в том числе и оператор после слова default:
int i;
printf(“\nВведите цифру:”);
scanf(“%d”, &i);
Switch (i)
{
case 0: printf(“\nЭто цифра ноль”);
case 1: case 2: printf(“\nЭто цифра один или два”);
default: printf(“\nЭто неизвестная цифра”);
}
При вводе цифры 0 на экран будут выведены сообщения:
Это цифра ноль
Это цифра один или два
Это неизвестная цифра
Для того, чтобы после выполнения нужной ветви оператора switch другие операторы не выполнялись, каждая ветвь должна заканчиваться оператором break:
int i;
printf(“\nВведите цифру:”);
scanf(“%d”, &i);
Switch (i)
{
case 0: printf(“\nЭто цифра ноль”);
break;
case 1: case 2: printf(“\nЭто цифра один или два”);
break;
default: printf(“\nЭто неизвестная цифра”);
}
В этом случае после ввода цифры 0 на экран будет выведено только одно сообщение:
Это цифра ноль
Если в каждой ветви switch стоит не по одному, а по нескольку операторов, то необходимо брать их в фигурные скобки:
Switch (селектор)
{
case метка-1:
{
оператор;
оператор;
оператор;
break;
}
case метка-2:
{
оператор;
оператор;
break;
}
.................
default:
{
оператор;
оператор;
}
}
Для улучшения читаемости программы необходимо использовать сдвиг операторов.
Можно использовать вложенные операторы switch, при этом в разных операторах могут быть одинаковые метки вариантов:
Switch (n)
{
case 0: оператор;
break;
Case 1: switch (m)
{
case 0: оператор;
break;
case 1: оператор;
break;
default: оператор;
}
case 3: оператор;
break;
.................
default: оператор;
}
Пример: по заданному номеру месяца года определить количество дней в нем.
В этом переключателе всего три ветви:
#include <stdio.h>
#include <conio.h>
#include <math.h>
Int main()
{
int month;
printf(“\nВведите номер месяца: ”);
scanf(“%d”, &month);
Switch (month)
{
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12: printf(“\n31 день”);
break;
case 4: case 6: case 9:
case 11: printf(“\n30 дней”);
break;
case 2: printf(“\n28 дней”);
break;
default: printf(“\nТакого месяца нет\n”);
}
return 0;
}