В языке программирования С используются несколько конструкций для принятия решений:
if;switch;Для прерывания программного цикла при некотором условии применяется утверждение (оператор) break, для продолжения итераций цикла при выполнении некоторых условий применяется утверждение (оператор) continue, для выхода из функции при выполнении некоторых условий применяется оператор return, для перехода к заданному месту программы применяется оператор goto, хотя считается, что в программировании не существует ситуаций, в которых нельзя обойтись без оператора goto [2; 3]. Утверждение break применяется также в switch.
Общая форма записи оператора if:
if (expression) program statement;
В операторе if используется результат вычисления условия, заключенного в круглые скобки, на основе которого принимается решение. Результат вычисления условия expression может быть арифметическим или логическим. Если результат выполнения условия expression будет истинным, то возможно выполнить несколько утверждений типа program statement. Для этого следует использовать фигурные скобки, например:
if (expression)
{
program1 statement1;
program2 statement2;
...
}
Общая форма записи конструкции if–else:
if (expression) program1 statement1; else program2 statement2;
Если выполняется условие expression, то будет выполняться фрагмент программы program1 statement1, в противном случае будет выполняться program2 statement2.
Каждое из утверждений может быть множественным. В таком случае применяются фигурные скобки:
if (expression)
{
program1 statement1;
program2 statement2;
...
}
else
{
program33 statement33;
program34 statement34;
...
}
Форма записи конструкции if–else if–else if–...–else:
if (expression1) program1 statement1; else if (expression2) program2 statement2; else if (expression3) program3 statement3; ... else program statement;
Приведенная конструкция используется для выбора возможных ситуаций, когда проверяются условия expression1, expression2, expression1,... . Соответственно будут выполняться действия program1 statement1, program2 statement2, program3 statement3 и т.д. В случае, когда ни одно из условий не выполняется, выполняются действия, прописанные после оператора else.
В случае выполнения множественных действий применяются фигурные скобки для каждого из утверждений:
if (expression1)
{
program1 statement1;
...
}
else if (expression2)
{
program2 statement2;
...
}
else if (expression3)
{
program3 statement3;
...
}
...
else
{
program statement;
...
}
Общая форма записи оператора switch:
switch (expression) {
case value1:
program statement;
...
break;
case value2:
program statement;
...
break;
...
case valuen:
program statement;
...
break;
default:
program statement;
...
break;
}
Выражение заключенного в круглые скобки оператора последовательно сравнивается со значениями value1, value2,..., valuen, которые должны быть простыми константами или константными выражениями. В том случае, когда одно из этих значений равно значению, выполняются утверждения, которые следуют за данным значением.
Утверждение break сигнализирует об окончании выполнения утверждений и приводит к выходу из оператора switch. Утверждение break ставится в конце каждого варианта выбора. Если этого не сделать, то выполнение последовательности утверждений перейдет в следующий вариант выбора и будет выполняться до тех пор, пока не встретится утверждение break [4.1].
Специальный дополнительный вариант default будет выполнен в том случае, когда не будет найдено ни одного совпадения.
Операторы if и switch той или иной синтаксической конструкции существуют практически во всех языках программирования (в первую очередь языках высокого уровня), и их часто называют операторами ветвления.
В отличие от других операторов языка С, которые могут быть унарными или бинарными, специфический
Общий формат записи
условие ? выражение_1 : выражение_2
Если в результате вычисления условия будет получено значение TRUE (истина, не нуль), то выполняется выражение_1, и результатом выполнения FALSE (ложь, т.е. нуль), то выполняется выражение_2, и результатом выполнения выражение_2.
Оператор или утверждение break служит для немедленного выхода из цикла, будь то while, for или do–while. После выхода из цикла выполнение программы продолжается с утверждения (фрагмента программы), непосредственно следующего за циклом.
Если оператор break встречается во вложенном цикле (вложенных циклах), то будет прекращено выполнение того цикла, в котором этот оператор встретился.
Необходимость в использовании оператора прерывания break в теле цикла возникает тогда, когда условие продолжения итераций нужно проверять не в начале цикла (как в циклах while и for ) и не в конце тела цикла (как в цикле do–while ), а в середине тела цикла [4.2].
Формат записи оператора break:
break;
Оператор или утверждение continue служит для перехода к следующей итерации цикла [4.2].
Оператор continue противоположен по действию оператору break. Оператор continue позволяет в любой точке тела цикла ( while, for или do–while ) прервать текущую итерацию и перейти к проверке continue (ключевым словом), автоматически пропускаются.
Формат записи оператора continue:
continue;
Сейчас во многих языках программирования goto не используется. Однако в языке программирования С он имеет место. Применение оператора goto не является хорошим стилем программирования. Но в некоторых случаях его применение бывает уместно. Иногда, при умелом использовании, оператор goto может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы [4.2].
Для оператора goto всегда необходима метка. Метка – это идентификатор с последующим двоеточием. Метка должна находиться в той же функции, что и оператор goto, переход в другую функцию невозможен.
Общий формат записи оператора goto:
goto метка; . . . метка: заданные действия.
Метка может находиться как до, так и после оператора goto. С помощью оператора goto можно не только выходить из цикла, но и организовать цикл.
Логические
| широкая ячейка | ||
|---|---|---|
| № п/п | Оператор | Операция |
| 1) | И | |
| 2) | || | ИЛИ |
| 3) | ! | НЕ, отрицание |
Ниже приведены
Наивысший !
> >= < <=
== !=
Низший ||
Как и в арифметических выражениях, для изменения порядка выполнения операций сравнения и логических операций можно использовать круглые скобки.
Результат любой операции сравнения или логической операции есть 0 (нуль) или 1.
Пример 1. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных (не комплексных) корней на основе только операторов if. Вид квадратного уравнения:
Как известно, квадратное уравнение будет иметь вещественные корни, если его дискриминант будет неотрицательным, т.е. когда
$$D=b^2-4ac\geqslant0.$$Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void) {
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2 + b*x + c = 0\n");
printf("\n\t Enter the coefficient a: ");
scanf_s("%f", a);
printf("\t Enter the coefficient b: ");
scanf_s("%f", b);
printf("\t Enter the coefficient c: ");
scanf_s("%f", c);
D = b*b - 4*a*c;
if (D >= 0 a != 0) {
x1 = -b/(2*a) + (float)sqrt(D)/(2*a);
x2 = -b/(2*a) - (float)sqrt(D)/(2*a);
printf("\n\t The roots of the equation:\n\t x1 = %1.4f, x2 = %1.4f\n", x1, x2);
}
if (D < 0)
printf("\n\t The roots of complex\n");
if (a == 0 b != 0) {
x = -c/b;
printf("\n\t As a = %1.0f,\n\t the solution of the equation is: %1.4f\n", a, x); }
printf("\n Press any key: ");
_getch();
return 0;
}
Возможный результат выполнения программы показан на рис 4.1.
(рис 4.1) Результат решения квадратного уравненияВ программе последовательно проверяются условия с помощью операторов if. В последнем случае, когда коэффициент а = 0, квадратное уравнение вырождается и превращается в линейное уравнение. Решение в этом случае очевидно.
В программе применены функции scanf_s() вместо стандартной функции scanf() языка С. Это сделано для того, чтобы по этим функциям не было предупреждений (warning) в MS Visual Studio 2008.
Кроме того, в программу подключена библиотека math.h для действий с математическими функциями, например, sqrt().
В первом операторе if применено логическое условие И ( ) для проверки того, что дискриминант не равен отрицательному значению и одновременно чтобы первый коэффициент квадратного уравнения не был равен нулю. Аналогичное условие прописано и для последнего оператора if.
Задание 1
float перед функцией sqrt().Пример 2. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных корней на основе конструкции if–else. Вид квадратного уравнения:
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void)
{
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2 + b*x + c = 0\n");
printf("\n\t Enter the coefficient a: ");
scanf_s("%f", a);
printf("\t Enter the coefficient b: ");
scanf_s("%f", b);
printf("\t Enter the coefficient c: ");
scanf_s("%f", c);
D = b*b - 4*a*c;
if (D >= 0 a != 0 b != 0) {
x1 = -b/(2*a) + (float)sqrt(D)/(2*a);
x2 = -b/(2*a) - (float)sqrt(D)/(2*a);
printf("\n\t The roots of the equation:\n\t x1 = %1.4f, x2 = %1.4f\n", x1, x2);
}
else {
if (a == 0 b != 0) {
x = -c/b;
if (c != 0)
printf("\n\t As a = %1.0f,\n\t the solution of the equation is: %1.4f\n", a, x);
else
printf("\n\t As a = %1.0f and c = %1.0f,\n\t the solution of the equation is: %1.0f\n", a, -x);
}
if (D < 0)
printf("\n\t The roots of complex\n");
}
printf("\n Press any key: ");
_getch();
return 0;
}
В программе использованы вложенные операторы if.
Результат выполнения программы при исключительной ситуации показан на рис 4.2.
(рис 4.2) Выполнение программы с двумя нулевыми коэффициентами Задание 2
sqrt().int. В отчет вставьте возможный результат выполнения программы.if–else.Пример 3. Напишите программу классификации введенного с терминала символа на основе конструкции if–else if–else [4.1].
Символы (одиночные) будем считать как строчные и прописные буквы латинского алфавита, цифры от 0 до 9, и специальные символы.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void) {
char c;
// Ввод одиночного символа
printf("\n\t Enter a single character: ");
scanf_s("%c", c);
if ( c >= 'a' c <= 'z' )
printf("\n\t This is a small letter\n");
else if ( c >= 'A' c <= 'Z')
printf("\n\t This is a capital letter\n");
else if ( c >= '0' c <= '9')
printf("\n\t This figure (digit)\n");
else
printf("\n\t This is a special character\n");
printf("\n Press any key: ");
_getch();
return 0;
}
Результат выполнения программы показан на рис 4.3.
(рис 4.3) Результат классификации символаЗадание 3
if–else if–else.Пример 4. Напишите программу расчета простого арифметического выражения на основе оператора switch.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main (void) {
float value1, value2;
char operat;
printf("\n\t Printed on the keyboard expression: ");
scanf_s("%f%c%f", value1, operat, sizeof(char), value2);
switch (operat) {
case '+':
printf("\n\t Result: %1.4f\n", value1 + value2);
break;
case '-':
printf("\n\t Result: %1.4f\n", value1 - value2);
break;
case '*':
printf("\n\t Result: %1.4f\n", value1 * value2);
break;
case '/':
if (value2 == 0.0)
printf("\n\t Division by zero.\n");
else
printf("\n\t Result: %1.4f\n", value1 / value2);
break;
default:
printf("\n\t Unknown arithmetic operator\n\t error or enter a number. Break!\n");
break;
} // End switch
printf("\n Press any key: ");
_getch();
return 0;
}
В программе использована полная форма оператора switch. Оператор break инициирует немедленный выход из оператора switch. Возможно использование вложенных операторов switch.
Возможный результат выполнения программы показан на рис 4.4.
(рис 4.4) Расчет простого арифметического выраженияЗадание 4
"==".if–else if–else.Пример 5. Напишите программу вычисления двух целых случайных чисел и определения наибольшего из них. Определение наибольшего числа произведите с помощью
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // Для функций случайных чисел
#include <time.h>
int main (void) {
int a, b, maxab;
unsigned int some;
long int L;
L = (long) time(NULL);
some = (unsigned) L/2;
srand(some);
a = rand();
b = rand();
printf("\n\t Random numbers: a = %d; b = %d\n", a, b);
// Оператор условия для определения максимального числа
maxab = (a > b) ? a : b;
printf("\n\t Maximum number: %d\n", maxab);
printf("\n Press any key: ");
_getch();
return 0;
}
В программе использованы функции генерации псевдослучайных чисел rand() и задания исходного srand(). Указанные функции входят в стандартную библиотечную функцию stdlib.h. Функция time() входит в библиотечную функцию time.h, которая поддерживает функции, обращающиеся к системному времени.
Для переменных L и some выполнено приведение типов.
При каждом обращении к функции rand() возвращается целое в интервале между нулем и значением RAND_MAX, которое в любой реализации должно быть не меньше числа 32 767 [4.2]
Возможный результат выполнения программы показан на рис 4.5.
(рис 4.5) Результат определения максимального числа Задание 5
define N X, где Х – номер компьютера, за которым выполняется лабораторная работа.Пример 6. Используя
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main (void) {
int x;
printf("\n\t Enter a whole number between 1 and 12: ");
scanf_s("%d", x);
switch (x > 0 x < 3 ? 1 :
x == 12 ? 1 :
x > 2 x < 6 ? 2 :
x > 5 x < 9 ? 3 :
x > 8 x < 12 ? 4 :
x > 12 || x < 1 ? 5 : 5)
{
case 1 :
printf("\n\t This Winter\n");
break;
case 2 :
printf("\n\t This Spring\n");
break;
case 3 :
printf("\n\t This Summer\n");
break;
case 4 :
printf("\n\t This Autumn\n");
break;
case 5 :
printf("\n\t This is a mistake (Error)\n");
}
printf("\n Press any key: ");
_getch();
return 0;
}
В программе три месяца зимы кодируются цифрой 1, три месяца весны –цифрой 2, три месяца лета – цифрой 3, три месяца осени – цифрой 4. Если введенная цифра не входит в целочисленный интервал [1; 12], то эта ситуация кодируется цифрой 5.
Возможный результат выполнения программы показан на рис 4.6.
(рис 4.6) Результат программы по определению времени годаЗадание 6
Пример 7. Напишите программу распечатки четных целых чисел от 0 до 30.
#include <stdio.h>
#include <conio.h>
int main (void)
{
int x;
printf("\n\t Even numbers from 0 to 30:\n\n");
for (x = 0; x < 31; x++) {
if ( x % 2 ) continue;
printf("\t\t %3d\n", x);
}
printf("\n Press any key: ");
_getch();
return 0;
}
В программе в качестве проверки условия использовано деление по модулю ( х%2 ). Если остаток от деления числа х не равен нулю, то утверждение (оператор, инструкция) continue передает управление непосредственно инструкции, проверяющей условное выражение, после чего циклический процесс продолжается. С помощью программы выводятся только четные числа, а при обнаружении нечетного числа происходит преждевременный переход к следующей итерации цикла, и функция printf() опускается. Функция printf() включена в тело цикла оператора for.
Результат выполнения программы показан на рис 4.7.
(рис 4.7) Результат вывода четных чисел Задание 7
for примените цикл while. Объясните действие инструкции continue.for примените цикл do–while. Объясните действие инструкции continue.continue. Подсчитайте число итераций оператора цикла.Пример 8. Напишите программу подсчета суммы трех чисел из трех вложенных циклов и, если сумма делится без остатка на число 3, то прекратите сравнение чисел и выйдите из циклов с последующей распечаткой этой суммы и слагаемых. Первый цикл начинается с 51 до 1, второй цикл – с 41 до 1, третий цикл – с 1 до 50. Первый цикл изменяется через 7 единиц, второй цикл изменяется на 1, третий цикл изменяется на 7 единиц.
Программный код решения примера с оператором goto:
#include <stdio.h>
#include <conio.h>
int main (void) {
int a, b, c, i, j, k;
a = b = c = 0;
for (i = 51; i >= 1; i -= 7 )
for (j = 41; j >= 1; --j )
for (k = 1; k <= 50; k += 7)
if ( ((i + j + k) % 3 == 0) (i < 51) (j < 41))
{a = i; b = j; c = k;
goto sum3;
}
sum3:
printf("\n\t The sum (%d?+?%d?+?%d) is equal %d\n", a, b, c,
a + b + c);
printf("\n Press any key: ");
_getch();
return 0; }
В программе использовано декрементирование (уменьшение на единицу) переменной j в форме --j. Переменная i с каждой итерацией цикла уменьшается на 7 единиц. Переменная k с каждой итерацией цикла увеличивается на 7 единиц. После оператора if включены фигурные скобки для выполнения нескольких действий при выполнении заданного условия оператора if.
Результат выполнения программы показан на рис 4.8.
(рис 4.8) Итеративный подсчет числовой суммы, делящейся на 3Примечание. Оператор goto нельзя применять для перехода в тело цикла, т.е. метка не должна быть внутри оператора цикла. Метка может появиться текстуально до или после оператора goto.
Задание 8
goto примените оператор break. Произвести также подсчет числа итераций каждого из циклов. Сравните с аналогичными результатами предыдущего пункта задания.for примените операторы while. Выполните действия двух предыдущих пунктов задания.'w'. Используйте оператор goto. Предусмотрите отступ от левого края дисплея.Пример 9. Напишите программу распечатки на консоль простых чисел из диапазона от 2 до N, где N – число, вводимое пользователем с клавиатуры, которое не превосходит, например, 1000.
Как известно, простое число – это целое положительное число больше единицы, которое не делится без остатка ни на одно другое целое положительное число, кроме единицы и самого себя. Единица не считается простым числом.
Возможный программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // для exit()
#define Nmax 50
int main (void) {
int i, j;
int ok, in;
int N;
printf("\n Enter an integer from 2 to %d: ", Nmax);
in = scanf_s("%d", N);
if (in == 0 || N < 2 || N > Nmax)
{
printf("\n Error input. Press any key: ");
_getch();
exit(1);
}
printf("\n Prime numbers from 2 to %d:\n\n", N);
for ( i = 2; i <= N; i++ )
{
ok = 1;
for ( j = 2; j < i; j++ )
if ( (i%j) == 0 )
ok = 0;
if ( ok )
printf(" %3d", i);
}
printf("\n\n Press any key: ");
_getch();
return 0;
}
В программе с помощью оператора if осуществляется проверка правильности ввода данных с клавиатуры. Кроме того, этим же оператором проверяется остаток от деления двух чисел и условной истинности, когда переменная ok не равна нулю. С помощью препроцессорной директивы define определяется верхняя допустимая граница для простых чисел.
Пример выполнения программы показан на рис 4.9.
(рис 4.9) Пример вывода на консоль простых чиселЗадание 9
for примените оператор while.if, else.if?break и continue?switch после метки case не использовать оператор break?switch не поставить метку default и условие переключения не совпадет ни с одной меткой case?В языке программирования С используются несколько конструкций для принятия решений:
if;switch;Для прерывания программного цикла при некотором условии применяется утверждение (оператор) break, для продолжения итераций цикла при выполнении некоторых условий применяется утверждение (оператор) continue, для выхода из функции при выполнении некоторых условий применяется оператор return, для перехода к заданному месту программы применяется оператор goto, хотя считается, что в программировании не существует ситуаций, в которых нельзя обойтись без оператора goto [2; 3]. Утверждение break применяется также в switch.
Общая форма записи оператора if:
if (expression) program statement;
В операторе if используется результат вычисления условия, заключенного в круглые скобки, на основе которого принимается решение. Результат вычисления условия expression может быть арифметическим или логическим. Если результат выполнения условия expression будет истинным, то возможно выполнить несколько утверждений типа program statement. Для этого следует использовать фигурные скобки, например:
if (expression)
{
program1 statement1;
program2 statement2;
...
}
Общая форма записи конструкции if–else:
if (expression) program1 statement1; else program2 statement2;
Если выполняется условие expression, то будет выполняться фрагмент программы program1 statement1, в противном случае будет выполняться program2 statement2.
Каждое из утверждений может быть множественным. В таком случае применяются фигурные скобки:
if (expression)
{
program1 statement1;
program2 statement2;
...
}
else
{
program33 statement33;
program34 statement34;
...
}
Форма записи конструкции if–else if–else if–...–else:
if (expression1) program1 statement1; else if (expression2) program2 statement2; else if (expression3) program3 statement3; ... else program statement;
Приведенная конструкция используется для выбора возможных ситуаций, когда проверяются условия expression1, expression2, expression1,... . Соответственно будут выполняться действия program1 statement1, program2 statement2, program3 statement3 и т.д. В случае, когда ни одно из условий не выполняется, выполняются действия, прописанные после оператора else.
В случае выполнения множественных действий применяются фигурные скобки для каждого из утверждений:
if (expression1)
{
program1 statement1;
...
}
else if (expression2)
{
program2 statement2;
...
}
else if (expression3)
{
program3 statement3;
...
}
...
else
{
program statement;
...
}
Общая форма записи оператора switch:
switch (expression) {
case value1:
program statement;
...
break;
case value2:
program statement;
...
break;
...
case valuen:
program statement;
...
break;
default:
program statement;
...
break;
}
Выражение заключенного в круглые скобки оператора последовательно сравнивается со значениями value1, value2,..., valuen, которые должны быть простыми константами или константными выражениями. В том случае, когда одно из этих значений равно значению, выполняются утверждения, которые следуют за данным значением.
Утверждение break сигнализирует об окончании выполнения утверждений и приводит к выходу из оператора switch. Утверждение break ставится в конце каждого варианта выбора. Если этого не сделать, то выполнение последовательности утверждений перейдет в следующий вариант выбора и будет выполняться до тех пор, пока не встретится утверждение break [4.1].
Специальный дополнительный вариант default будет выполнен в том случае, когда не будет найдено ни одного совпадения.
Операторы if и switch той или иной синтаксической конструкции существуют практически во всех языках программирования (в первую очередь языках высокого уровня), и их часто называют операторами ветвления.
В отличие от других операторов языка С, которые могут быть унарными или бинарными, специфический
Общий формат записи
условие ? выражение_1 : выражение_2
Если в результате вычисления условия будет получено значение TRUE (истина, не нуль), то выполняется выражение_1, и результатом выполнения FALSE (ложь, т.е. нуль), то выполняется выражение_2, и результатом выполнения выражение_2.
Оператор или утверждение break служит для немедленного выхода из цикла, будь то while, for или do–while. После выхода из цикла выполнение программы продолжается с утверждения (фрагмента программы), непосредственно следующего за циклом.
Если оператор break встречается во вложенном цикле (вложенных циклах), то будет прекращено выполнение того цикла, в котором этот оператор встретился.
Необходимость в использовании оператора прерывания break в теле цикла возникает тогда, когда условие продолжения итераций нужно проверять не в начале цикла (как в циклах while и for ) и не в конце тела цикла (как в цикле do–while ), а в середине тела цикла [4.2].
Формат записи оператора break:
break;
Оператор или утверждение continue служит для перехода к следующей итерации цикла [4.2].
Оператор continue противоположен по действию оператору break. Оператор continue позволяет в любой точке тела цикла ( while, for или do–while ) прервать текущую итерацию и перейти к проверке continue (ключевым словом), автоматически пропускаются.
Формат записи оператора continue:
continue;
Сейчас во многих языках программирования goto не используется. Однако в языке программирования С он имеет место. Применение оператора goto не является хорошим стилем программирования. Но в некоторых случаях его применение бывает уместно. Иногда, при умелом использовании, оператор goto может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы [4.2].
Для оператора goto всегда необходима метка. Метка – это идентификатор с последующим двоеточием. Метка должна находиться в той же функции, что и оператор goto, переход в другую функцию невозможен.
Общий формат записи оператора goto:
goto метка; . . . метка: заданные действия.
Метка может находиться как до, так и после оператора goto. С помощью оператора goto можно не только выходить из цикла, но и организовать цикл.
Логические
| широкая ячейка | ||
|---|---|---|
| № п/п | Оператор | Операция |
| 1) | И | |
| 2) | || | ИЛИ |
| 3) | ! | НЕ, отрицание |
Ниже приведены
Наивысший !
> >= < <=
== !=
Низший ||
Как и в арифметических выражениях, для изменения порядка выполнения операций сравнения и логических операций можно использовать круглые скобки.
Результат любой операции сравнения или логической операции есть 0 (нуль) или 1.
Пример 1. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных (не комплексных) корней на основе только операторов if. Вид квадратного уравнения:
Как известно, квадратное уравнение будет иметь вещественные корни, если его дискриминант будет неотрицательным, т.е. когда
$$D=b^2-4ac\geqslant0.$$Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void) {
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2 + b*x + c = 0\n");
printf("\n\t Enter the coefficient a: ");
scanf_s("%f", a);
printf("\t Enter the coefficient b: ");
scanf_s("%f", b);
printf("\t Enter the coefficient c: ");
scanf_s("%f", c);
D = b*b - 4*a*c;
if (D >= 0 a != 0) {
x1 = -b/(2*a) + (float)sqrt(D)/(2*a);
x2 = -b/(2*a) - (float)sqrt(D)/(2*a);
printf("\n\t The roots of the equation:\n\t x1 = %1.4f, x2 = %1.4f\n", x1, x2);
}
if (D < 0)
printf("\n\t The roots of complex\n");
if (a == 0 b != 0) {
x = -c/b;
printf("\n\t As a = %1.0f,\n\t the solution of the equation is: %1.4f\n", a, x); }
printf("\n Press any key: ");
_getch();
return 0;
}
Возможный результат выполнения программы показан на рис 4.1.
(рис 4.1) Результат решения квадратного уравненияВ программе последовательно проверяются условия с помощью операторов if. В последнем случае, когда коэффициент а = 0, квадратное уравнение вырождается и превращается в линейное уравнение. Решение в этом случае очевидно.
В программе применены функции scanf_s() вместо стандартной функции scanf() языка С. Это сделано для того, чтобы по этим функциям не было предупреждений (warning) в MS Visual Studio 2008.
Кроме того, в программу подключена библиотека math.h для действий с математическими функциями, например, sqrt().
В первом операторе if применено логическое условие И ( ) для проверки того, что дискриминант не равен отрицательному значению и одновременно чтобы первый коэффициент квадратного уравнения не был равен нулю. Аналогичное условие прописано и для последнего оператора if.
Задание 1
float перед функцией sqrt().Пример 2. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных корней на основе конструкции if–else. Вид квадратного уравнения:
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void)
{
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2 + b*x + c = 0\n");
printf("\n\t Enter the coefficient a: ");
scanf_s("%f", a);
printf("\t Enter the coefficient b: ");
scanf_s("%f", b);
printf("\t Enter the coefficient c: ");
scanf_s("%f", c);
D = b*b - 4*a*c;
if (D >= 0 a != 0 b != 0) {
x1 = -b/(2*a) + (float)sqrt(D)/(2*a);
x2 = -b/(2*a) - (float)sqrt(D)/(2*a);
printf("\n\t The roots of the equation:\n\t x1 = %1.4f, x2 = %1.4f\n", x1, x2);
}
else {
if (a == 0 b != 0) {
x = -c/b;
if (c != 0)
printf("\n\t As a = %1.0f,\n\t the solution of the equation is: %1.4f\n", a, x);
else
printf("\n\t As a = %1.0f and c = %1.0f,\n\t the solution of the equation is: %1.0f\n", a, -x);
}
if (D < 0)
printf("\n\t The roots of complex\n");
}
printf("\n Press any key: ");
_getch();
return 0;
}
В программе использованы вложенные операторы if.
Результат выполнения программы при исключительной ситуации показан на рис 4.2.
(рис 4.2) Выполнение программы с двумя нулевыми коэффициентамиЗадание 2
sqrt().int. В отчет вставьте возможный результат выполнения программы.if–else.Пример 3. Напишите программу классификации введенного с терминала символа на основе конструкции if–else if–else [4.1].
Символы (одиночные) будем считать как строчные и прописные буквы латинского алфавита, цифры от 0 до 9, и специальные символы.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void) {
char c;
// Ввод одиночного символа
printf("\n\t Enter a single character: ");
scanf_s("%c", c);
if ( c >= 'a' c <= 'z' )
printf("\n\t This is a small letter\n");
else if ( c >= 'A' c <= 'Z')
printf("\n\t This is a capital letter\n");
else if ( c >= '0' c <= '9')
printf("\n\t This figure (digit)\n");
else
printf("\n\t This is a special character\n");
printf("\n Press any key: ");
_getch();
return 0;
}
Результат выполнения программы показан на рис 4.3.
(рис 4.3) Результат классификации символаЗадание 3
if–else if–else.Пример 4. Напишите программу расчета простого арифметического выражения на основе оператора switch.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main (void) {
float value1, value2;
char operat;
printf("\n\t Printed on the keyboard expression: ");
scanf_s("%f%c%f", value1, operat, sizeof(char), value2);
switch (operat) {
case '+':
printf("\n\t Result: %1.4f\n", value1 + value2);
break;
case '-':
printf("\n\t Result: %1.4f\n", value1 - value2);
break;
case '*':
printf("\n\t Result: %1.4f\n", value1 * value2);
break;
case '/':
if (value2 == 0.0)
printf("\n\t Division by zero.\n");
else
printf("\n\t Result: %1.4f\n", value1 / value2);
break;
default:
printf("\n\t Unknown arithmetic operator\n\t error or enter a number. Break!\n");
break;
} // End switch
printf("\n Press any key: ");
_getch();
return 0;
}
В программе использована полная форма оператора switch. Оператор break инициирует немедленный выход из оператора switch. Возможно использование вложенных операторов switch.
Возможный результат выполнения программы показан на рис 4.4.
(рис 4.4) Расчет простого арифметического выраженияЗадание 4
"==".if–else if–else.Пример 5. Напишите программу вычисления двух целых случайных чисел и определения наибольшего из них. Определение наибольшего числа произведите с помощью
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // Для функций случайных чисел
#include <time.h>
int main (void) {
int a, b, maxab;
unsigned int some;
long int L;
L = (long) time(NULL);
some = (unsigned) L/2;
srand(some);
a = rand();
b = rand();
printf("\n\t Random numbers: a = %d; b = %d\n", a, b);
// Оператор условия для определения максимального числа
maxab = (a > b) ? a : b;
printf("\n\t Maximum number: %d\n", maxab);
printf("\n Press any key: ");
_getch();
return 0;
}
В программе использованы функции генерации псевдослучайных чисел rand() и задания исходного srand(). Указанные функции входят в стандартную библиотечную функцию stdlib.h. Функция time() входит в библиотечную функцию time.h, которая поддерживает функции, обращающиеся к системному времени.
Для переменных L и some выполнено приведение типов.
При каждом обращении к функции rand() возвращается целое в интервале между нулем и значением RAND_MAX, которое в любой реализации должно быть не меньше числа 32 767 [4.2]
Возможный результат выполнения программы показан на рис 4.5.
(рис 4.5) Результат определения максимального числаЗадание 5
define N X, где Х – номер компьютера, за которым выполняется лабораторная работа.Пример 6. Используя
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main (void) {
int x;
printf("\n\t Enter a whole number between 1 and 12: ");
scanf_s("%d", x);
switch (x > 0 x < 3 ? 1 :
x == 12 ? 1 :
x > 2 x < 6 ? 2 :
x > 5 x < 9 ? 3 :
x > 8 x < 12 ? 4 :
x > 12 || x < 1 ? 5 : 5)
{
case 1 :
printf("\n\t This Winter\n");
break;
case 2 :
printf("\n\t This Spring\n");
break;
case 3 :
printf("\n\t This Summer\n");
break;
case 4 :
printf("\n\t This Autumn\n");
break;
case 5 :
printf("\n\t This is a mistake (Error)\n");
}
printf("\n Press any key: ");
_getch();
return 0;
}
В программе три месяца зимы кодируются цифрой 1, три месяца весны –цифрой 2, три месяца лета – цифрой 3, три месяца осени – цифрой 4. Если введенная цифра не входит в целочисленный интервал [1; 12], то эта ситуация кодируется цифрой 5.
Возможный результат выполнения программы показан на рис 4.6.
(рис 4.6) Результат программы по определению времени годаЗадание 6
Пример 7. Напишите программу распечатки четных целых чисел от 0 до 30.
#include <stdio.h>
#include <conio.h>
int main (void)
{
int x;
printf("\n\t Even numbers from 0 to 30:\n\n");
for (x = 0; x < 31; x++) {
if ( x % 2 ) continue;
printf("\t\t %3d\n", x);
}
printf("\n Press any key: ");
_getch();
return 0;
}
В программе в качестве проверки условия использовано деление по модулю ( х%2 ). Если остаток от деления числа х не равен нулю, то утверждение (оператор, инструкция) continue передает управление непосредственно инструкции, проверяющей условное выражение, после чего циклический процесс продолжается. С помощью программы выводятся только четные числа, а при обнаружении нечетного числа происходит преждевременный переход к следующей итерации цикла, и функция printf() опускается. Функция printf() включена в тело цикла оператора for.
Результат выполнения программы показан на рис 4.7.
(рис 4.7) Результат вывода четных чиселЗадание 7
for примените цикл while. Объясните действие инструкции continue.for примените цикл do–while. Объясните действие инструкции continue.continue. Подсчитайте число итераций оператора цикла.Пример 8. Напишите программу подсчета суммы трех чисел из трех вложенных циклов и, если сумма делится без остатка на число 3, то прекратите сравнение чисел и выйдите из циклов с последующей распечаткой этой суммы и слагаемых. Первый цикл начинается с 51 до 1, второй цикл – с 41 до 1, третий цикл – с 1 до 50. Первый цикл изменяется через 7 единиц, второй цикл изменяется на 1, третий цикл изменяется на 7 единиц.
Программный код решения примера с оператором goto:
#include <stdio.h>
#include <conio.h>
int main (void) {
int a, b, c, i, j, k;
a = b = c = 0;
for (i = 51; i >= 1; i -= 7 )
for (j = 41; j >= 1; --j )
for (k = 1; k <= 50; k += 7)
if ( ((i + j + k) % 3 == 0) (i < 51) (j < 41))
{a = i; b = j; c = k;
goto sum3;
}
sum3:
printf("\n\t The sum (%d?+?%d?+?%d) is equal %d\n", a, b, c,
a + b + c);
printf("\n Press any key: ");
_getch();
return 0; }
В программе использовано декрементирование (уменьшение на единицу) переменной j в форме --j. Переменная i с каждой итерацией цикла уменьшается на 7 единиц. Переменная k с каждой итерацией цикла увеличивается на 7 единиц. После оператора if включены фигурные скобки для выполнения нескольких действий при выполнении заданного условия оператора if.
Результат выполнения программы показан на рис 4.8.
(рис 4.8) Итеративный подсчет числовой суммы, делящейся на 3Примечание. Оператор goto нельзя применять для перехода в тело цикла, т.е. метка не должна быть внутри оператора цикла. Метка может появиться текстуально до или после оператора goto.
Задание 8
goto примените оператор break. Произвести также подсчет числа итераций каждого из циклов. Сравните с аналогичными результатами предыдущего пункта задания.for примените операторы while. Выполните действия двух предыдущих пунктов задания.'w'. Используйте оператор goto. Предусмотрите отступ от левого края дисплея.Пример 9. Напишите программу распечатки на консоль простых чисел из диапазона от 2 до N, где N – число, вводимое пользователем с клавиатуры, которое не превосходит, например, 1000.
Как известно, простое число – это целое положительное число больше единицы, которое не делится без остатка ни на одно другое целое положительное число, кроме единицы и самого себя. Единица не считается простым числом.
Возможный программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // для exit()
#define Nmax 50
int main (void) {
int i, j;
int ok, in;
int N;
printf("\n Enter an integer from 2 to %d: ", Nmax);
in = scanf_s("%d", N);
if (in == 0 || N < 2 || N > Nmax)
{
printf("\n Error input. Press any key: ");
_getch();
exit(1);
}
printf("\n Prime numbers from 2 to %d:\n\n", N);
for ( i = 2; i <= N; i++ )
{
ok = 1;
for ( j = 2; j < i; j++ )
if ( (i%j) == 0 )
ok = 0;
if ( ok )
printf(" %3d", i);
}
printf("\n\n Press any key: ");
_getch();
return 0;
}
В программе с помощью оператора if осуществляется проверка правильности ввода данных с клавиатуры. Кроме того, этим же оператором проверяется остаток от деления двух чисел и условной истинности, когда переменная ok не равна нулю. С помощью препроцессорной директивы define определяется верхняя допустимая граница для простых чисел.
Пример выполнения программы показан на рис 4.9.
(рис 4.9) Пример вывода на консоль простых чиселЗадание 9
for примените оператор while.if, else.if?break и continue?switch после метки case не использовать оператор break?switch не поставить метку default и условие переключения не совпадет ни с одной меткой case?Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.