Программирование на языке C в Microsoft Visual Studio 2010

Принятие решений. Условные операторы в языке С

Разбить на страницы
Показывать лекцию целиком

Теоретическая часть

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

  • оператор if;
  • оператор switch;
  • условный оператор ? (оператор условия) [4.1].
  • Для прерывания программного цикла при некотором условии применяется утверждение (оператор) break, для продолжения итераций цикла при выполнении некоторых условий применяется утверждение (оператор) continue, для выхода из функции при выполнении некоторых условий применяется оператор return, для перехода к заданному месту программы применяется оператор goto, хотя считается, что в программировании не существует ситуаций, в которых нельзя обойтись без оператора goto [2; 3]. Утверждение break применяется также в теле оператора switch.

    4.1. Оператор if

    Общая форма записи оператора if:

    if (expression)
    program statement;

    В операторе if используется результат вычисления условия, заключенного в круглые скобки, на основе которого принимается решение. Результат вычисления условия expression может быть арифметическим или логическим. Если результат выполнения условия expression будет истинным, то возможно выполнить несколько утверждений типа program statement. Для этого следует использовать фигурные скобки, например:

    if (expression)
    {
    program1 statement1;
    program2 statement2;
    ...
    }

    4.2. Конструкция if–else

    Общая форма записи конструкции 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;
    ...
    }

    4.3. Конструкция if–else if–else if–...–else

    Форма записи конструкции 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;
    ...
    }

    4.4. Оператор switch

    Общая форма записи оператора 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 той или иной синтаксической конструкции существуют практически во всех языках программирования (в первую очередь языках высокого уровня), и их часто называют операторами ветвления.

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

    В отличие от других операторов языка С, которые могут быть унарными или бинарными, специфический оператор условия является тернарным оператором. Это означает, что у него может быть три операнда [4.1].

    Общий формат записи оператора условия:

    условие ? выражение_1 : выражение_2

    Если в результате вычисления условия будет получено значение TRUE (истина, не нуль), то выполняется выражение_1, и результатом выполнения оператора условия будет значение, полученное при вычислении этого выражения. Если в результате вычисления условия будет получено значение FALSE (ложь, т.е. нуль), то выполняется выражение_2, и результатом выполнения оператора условия будет значение, полученное при вычислении выражение_2.

    Оператор условия часто описывают как оператор ?. Тернарный оператор условия ? наиболее часто используется для присвоения переменной одного из двух значений в зависимости от некоторого условия.

    4.6. Оператор break (от английского – прерывать)

    Оператор или утверждение break служит для немедленного выхода из цикла, будь то while, for или do–while. После выхода из цикла выполнение программы продолжается с утверждения (фрагмента программы), непосредственно следующего за циклом.

    Если оператор break встречается во вложенном цикле (вложенных циклах), то будет прекращено выполнение того цикла, в котором этот оператор встретился.

    Необходимость в использовании оператора прерывания break в теле цикла возникает тогда, когда условие продолжения итераций нужно проверять не в начале цикла (как в циклах while и for ) и не в конце тела цикла (как в цикле do–while ), а в середине тела цикла [4.2].

    Формат записи оператора break:

    break;

    4.7. Оператор continue (от английского – продолжать)

    Оператор или утверждение continue служит для перехода к следующей итерации цикла [4.2].

    Оператор continue противоположен по действию оператору break. Оператор continue позволяет в любой точке тела цикла ( while, for или do–while ) прервать текущую итерацию и перейти к проверке условий продолжения цикла. В соответствии с результатами проверки либо заканчивается выполнение цикла, либо начинается новая итерация. При этом все утверждения (фрагменты программы), которые следуют за оператором continue (ключевым словом), автоматически пропускаются.

    Формат записи оператора continue:

    continue;

    4.8. Оператор goto

    Сейчас во многих языках программирования оператор безусловного перехода типа goto не используется. Однако в языке программирования С он имеет место. Применение оператора goto не является хорошим стилем программирования. Но в некоторых случаях его применение бывает уместно. Иногда, при умелом использовании, оператор goto может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы [4.2].

    Для оператора goto всегда необходима метка. Метка – это идентификатор с последующим двоеточием. Метка должна находиться в той же функции, что и оператор goto, переход в другую функцию невозможен.

    Общий формат записи оператора goto:

    goto метка;
    .
    .
    .
    метка: заданные действия.

    Метка может находиться как до, так и после оператора goto. С помощью оператора goto можно не только выходить из цикла, но и организовать цикл.

    Логические операторы отношения приведены в табл. 4.1.

    широкая ячейка
    № п/п Оператор Операция
    1) И
    2) || ИЛИ
    3) ! НЕ, отрицание

    Ниже приведены операции отношений в убывающей последовательности приоритетов [4.2]:

    Наивысший        !
                    >  >=  <  <=
                    ==  !=
                    
    Низший        ||

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

    Результат любой операции сравнения или логической операции есть 0 (нуль) или 1.

    Практическая часть

    Пример 1. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных (не комплексных) корней на основе только операторов if. Вид квадратного уравнения:

    $$ax^2+bx+c=0.$$

    Как известно, квадратное уравнение будет иметь вещественные корни, если его дискриминант будет неотрицательным, т.е. когда

    $$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. Вид квадратного уравнения:

    $$ax^2+bx+c=0.$$

    Программный код решения примера:

    #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

  • Сформируйте одно условие ввода букв как прописных, так и строчных с последующим выводом: This is an alphabetic character.
  • Напишите программу циклического ввода символов и вывода результата их классификации до момента нажатия цифры 10*Х, где Х – номер компьютера, за которым выполняется лабораторная работа.
  • Напишите программу решения квадратного уравнения с применением конструкций 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.
  • Напишите программу деления суток на "Morning" (утро), "Day" (день), "Afternoon" (послеобеденное время), "Evening" (вечер), "Night" (ночь). Время ввода задается пользователем с клавиатуры.
  • Пример 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

  • При выводе максимального числа предусмотрите сообщение об имени числа, т.е. a или b.
  • В цикле сформируйте вектор десяти случайных чисел из интервала [0;1] и выведите на дисплей.
  • Для задания системного времени примените директиву define N X, где Х – номер компьютера, за которым выполняется лабораторная работа.
  • Примените оператор условия ? для определения абсолютного значения вещественного числа, которое должно вводиться пользователем с клавиатуры.
  • Пример 6. Используя оператор условия ? и переключатель switch напишите программу определения времени года по вводимым числам от 1 до 12, считая, что цифра 1 соответствует январю, цифра 2 – февралю и т.д.

    Программный код решения примера:

    #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

  • Проверьте программу по вводимым вещественным числам. Объясните результат.
  • Проверьте программу по вводимым буквам или знаков, имеющихся на клавиатуре. Объясните результат.
  • В программе вместо 5-го пункта, т.е. вместо case 5, примените операцию default.
  • Напишите программу определения времени года по вводимым числам без операторов условия ?.
  • Пример 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. Подсчитайте число итераций оператора цикла.
  • Сделайте вывод четных чисел из интервала от Х до 10*Х, где Х – номер компьютера, за которым выполняется лабораторная работа. Подсчитайте сумму четных чисел.
  • Измените условие для вывода четных чисел.
  • Пример 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.
  • В программе примите допустимое число Nmax, равное 9999. Предусмотрите при этом форматированный вывод на консоль простых чисел построчно, по 15 чисел в каждой строке. Используйте тернарный оператор ?:.
  • Предыдущий пункт задания выполните с помощью операторов if, else.
  • Контрольные вопросы

  • Как организуются множественные действия в операторе условия if?
  • Какой формат записи имеет тернарный оператор условия?
  • Какой оператор условия рекомендуется использовать для программирования меню?
  • В чем различие и сходство между операторами break и continue?
  • Как можно обеспечить выход из вложенных циклов?
  • Как можно организовать переходы в различные точки программы на С?
  • Какие логические операторы отношения используются в языке С?
  • Что произойдет, если в операторе switch после метки case не использовать оператор break?
  • Что произойдет, если в операторе switch не поставить метку default и условие переключения не совпадет ни с одной меткой case?
  • Страницы:

    Теоретическая часть

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

  • оператор if;
  • оператор switch;
  • условный оператор ? (оператор условия) [4.1].
  • Для прерывания программного цикла при некотором условии применяется утверждение (оператор) break, для продолжения итераций цикла при выполнении некоторых условий применяется утверждение (оператор) continue, для выхода из функции при выполнении некоторых условий применяется оператор return, для перехода к заданному месту программы применяется оператор goto, хотя считается, что в программировании не существует ситуаций, в которых нельзя обойтись без оператора goto [2; 3]. Утверждение break применяется также в теле оператора switch.

    4.1. Оператор if

    Общая форма записи оператора if:

    if (expression)
    program statement;

    В операторе if используется результат вычисления условия, заключенного в круглые скобки, на основе которого принимается решение. Результат вычисления условия expression может быть арифметическим или логическим. Если результат выполнения условия expression будет истинным, то возможно выполнить несколько утверждений типа program statement. Для этого следует использовать фигурные скобки, например:

    if (expression)
    {
    program1 statement1;
    program2 statement2;
    ...
    }

    4.2. Конструкция if–else

    Общая форма записи конструкции 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;
    ...
    }

    4.3. Конструкция if–else if–else if–...–else

    Форма записи конструкции 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;
    ...
    }

    4.4. Оператор switch

    Общая форма записи оператора 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 той или иной синтаксической конструкции существуют практически во всех языках программирования (в первую очередь языках высокого уровня), и их часто называют операторами ветвления.

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

    В отличие от других операторов языка С, которые могут быть унарными или бинарными, специфический оператор условия является тернарным оператором. Это означает, что у него может быть три операнда [4.1].

    Общий формат записи оператора условия:

    условие ? выражение_1 : выражение_2

    Если в результате вычисления условия будет получено значение TRUE (истина, не нуль), то выполняется выражение_1, и результатом выполнения оператора условия будет значение, полученное при вычислении этого выражения. Если в результате вычисления условия будет получено значение FALSE (ложь, т.е. нуль), то выполняется выражение_2, и результатом выполнения оператора условия будет значение, полученное при вычислении выражение_2.

    Оператор условия часто описывают как оператор ?. Тернарный оператор условия ? наиболее часто используется для присвоения переменной одного из двух значений в зависимости от некоторого условия.

    4.6. Оператор break (от английского – прерывать)

    Оператор или утверждение break служит для немедленного выхода из цикла, будь то while, for или do–while. После выхода из цикла выполнение программы продолжается с утверждения (фрагмента программы), непосредственно следующего за циклом.

    Если оператор break встречается во вложенном цикле (вложенных циклах), то будет прекращено выполнение того цикла, в котором этот оператор встретился.

    Необходимость в использовании оператора прерывания break в теле цикла возникает тогда, когда условие продолжения итераций нужно проверять не в начале цикла (как в циклах while и for ) и не в конце тела цикла (как в цикле do–while ), а в середине тела цикла [4.2].

    Формат записи оператора break:

    break;

    4.7. Оператор continue (от английского – продолжать)

    Оператор или утверждение continue служит для перехода к следующей итерации цикла [4.2].

    Оператор continue противоположен по действию оператору break. Оператор continue позволяет в любой точке тела цикла ( while, for или do–while ) прервать текущую итерацию и перейти к проверке условий продолжения цикла. В соответствии с результатами проверки либо заканчивается выполнение цикла, либо начинается новая итерация. При этом все утверждения (фрагменты программы), которые следуют за оператором continue (ключевым словом), автоматически пропускаются.

    Формат записи оператора continue:

    continue;

    4.8. Оператор goto

    Сейчас во многих языках программирования оператор безусловного перехода типа goto не используется. Однако в языке программирования С он имеет место. Применение оператора goto не является хорошим стилем программирования. Но в некоторых случаях его применение бывает уместно. Иногда, при умелом использовании, оператор goto может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы [4.2].

    Для оператора goto всегда необходима метка. Метка – это идентификатор с последующим двоеточием. Метка должна находиться в той же функции, что и оператор goto, переход в другую функцию невозможен.

    Общий формат записи оператора goto:

    goto метка;
    .
    .
    .
    метка: заданные действия.

    Метка может находиться как до, так и после оператора goto. С помощью оператора goto можно не только выходить из цикла, но и организовать цикл.

    Логические операторы отношения приведены в табл. 4.1.

    широкая ячейка
    № п/п Оператор Операция
    1) И
    2) || ИЛИ
    3) ! НЕ, отрицание

    Ниже приведены операции отношений в убывающей последовательности приоритетов [4.2]:

    Наивысший        !
                    >  >=  <  <=
                    ==  !=
                    
    Низший        ||

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

    Результат любой операции сравнения или логической операции есть 0 (нуль) или 1.

    Практическая часть

    Пример 1. Напишите программу решения квадратного уравнения с проверкой на наличие вещественных (не комплексных) корней на основе только операторов if. Вид квадратного уравнения:

    $$ax^2+bx+c=0.$$

    Как известно, квадратное уравнение будет иметь вещественные корни, если его дискриминант будет неотрицательным, т.е. когда

    $$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. Вид квадратного уравнения:

    $$ax^2+bx+c=0.$$

    Программный код решения примера:

    #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

  • Сформируйте одно условие ввода букв как прописных, так и строчных с последующим выводом: This is an alphabetic character.
  • Напишите программу циклического ввода символов и вывода результата их классификации до момента нажатия цифры 10*Х, где Х – номер компьютера, за которым выполняется лабораторная работа.
  • Напишите программу решения квадратного уравнения с применением конструкций 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.
  • Напишите программу деления суток на "Morning" (утро), "Day" (день), "Afternoon" (послеобеденное время), "Evening" (вечер), "Night" (ночь). Время ввода задается пользователем с клавиатуры.
  • Пример 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

  • При выводе максимального числа предусмотрите сообщение об имени числа, т.е. a или b.
  • В цикле сформируйте вектор десяти случайных чисел из интервала [0;1] и выведите на дисплей.
  • Для задания системного времени примените директиву define N X, где Х – номер компьютера, за которым выполняется лабораторная работа.
  • Примените оператор условия ? для определения абсолютного значения вещественного числа, которое должно вводиться пользователем с клавиатуры.
  • Пример 6. Используя оператор условия ? и переключатель switch напишите программу определения времени года по вводимым числам от 1 до 12, считая, что цифра 1 соответствует январю, цифра 2 – февралю и т.д.

    Программный код решения примера:

    #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

  • Проверьте программу по вводимым вещественным числам. Объясните результат.
  • Проверьте программу по вводимым буквам или знаков, имеющихся на клавиатуре. Объясните результат.
  • В программе вместо 5-го пункта, т.е. вместо case 5, примените операцию default.
  • Напишите программу определения времени года по вводимым числам без операторов условия ?.
  • Пример 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. Подсчитайте число итераций оператора цикла.
  • Сделайте вывод четных чисел из интервала от Х до 10*Х, где Х – номер компьютера, за которым выполняется лабораторная работа. Подсчитайте сумму четных чисел.
  • Измените условие для вывода четных чисел.
  • Пример 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.
  • В программе примите допустимое число Nmax, равное 9999. Предусмотрите при этом форматированный вывод на консоль простых чисел построчно, по 15 чисел в каждой строке. Используйте тернарный оператор ?:.
  • Предыдущий пункт задания выполните с помощью операторов if, else.
  • Контрольные вопросы

  • Как организуются множественные действия в операторе условия if?
  • Какой формат записи имеет тернарный оператор условия?
  • Какой оператор условия рекомендуется использовать для программирования меню?
  • В чем различие и сходство между операторами break и continue?
  • Как можно обеспечить выход из вложенных циклов?
  • Как можно организовать переходы в различные точки программы на С?
  • Какие логические операторы отношения используются в языке С?
  • Что произойдет, если в операторе switch после метки case не использовать оператор break?
  • Что произойдет, если в операторе switch не поставить метку default и условие переключения не совпадет ни с одной меткой case?
  • Вернуться к учебному плану