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

Язык Си / Условные операторы в Си

 

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

Признаком разветвляющегося алгоритма является наличие операций проверки условия. Чаще всего для проверки условия используется условный оператор if.

 

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

Условный оператор if может использоваться в форме полной или неполной развилки.

Неполная развилка Полная развилка
1
2
3
4
if (Условие)
{
  БлокОпераций1;
}
1
2
3
4
5
6
7
8
if (Условие)
{
  БлокОпераций1;
}
else
{
  БлокОпераций2;
}
неполная развилка полная развилка

В случае неполной развилки если Условие истинно, то БлокОпераций1 выполняется, если Условие ложно, то БлокОпераций1 не выполняется.

В случае полной развилки если Условие истинно, то выполняется БлокОпераций1, иначе выполняется БлокОпераций2.

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

Основными операциями, проверяемыми внутри условного блока, являются операции отношения.
Пример на C:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
int main()
{
  int k;           // объявляем целую переменную k
  printf("k= ");   // выводим сообщение
  scanf("%d", &k); // вводим переменную k
  if (k >= 5)      // если k>5
    printf("%d >= 5", k); // выводим "ЗНАЧЕНИЕ >= 5"
  else             // иначе
    printf("%d < 5", k);  // выводим "ЗНАЧЕНИЕ < 5"
  getchar(); getchar();
  return 0;
}

Результат выполнения
Условный оператор

Оператор if может быть вложенным.

Пример на C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
#include <stdlib.h> // для использования функции system
int main() {
  int key;  // объявляем целую переменную key
  system("chcp 1251"); // переходим в консоли на русский язык
  system("cls");       // очищаем окно консоли
  printf("Введите номер пункта, 1 или 2: ");
  scanf("%d", &key);   // вводим значение переменной key
  if (key == 1)        // если key = 1
    printf("\n Выбран первый пункт"); // выводим сообщение
  else if (key == 2)   // иначе если key = 2
    printf("\n Выбран второй пункт"); // выводим сообщение
  else                 // иначе
    printf("\n Первый и второй пункты не выбраны"); // выводим сообщение
  getchar(); getchar();
  return 0;
}

Результат выполнения
Вложенный оператор if
Вложенный оператор if
Вложенный оператор if

При использовании вложенной формы оператора if опция else связывается с последним оператором if. Если требуется связать опцию else с предыдущим оператором if, внутренний условный оператор заключается в фигурные скобки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
#include <stdlib.h> // для использования функции system
int main() {
  int key;  // объявляем целую переменную key
  system("chcp 1251"); // переходим в консоли на русский язык
  system("cls");       // очищаем окно консоли
  printf("Введите номер пункта, 1 или 2: ");
  scanf("%d", &key);   // вводим значение переменной key
  if (key != 1) {      // если key не равен 1
    if (key == 2)    // если key равен 2
      printf("\n Выбран второй пункт"); // вывод сообщения
  }              // если key - не 1 и не 2, то ничего не выводится
  else // иначе, если key равен 1
    printf("\n Выбран первый пункт"); // вывод сообщения
  getchar(); getchar();
  return 0;
}

Результат выполнения
Вложенный оператор if
Вложенный оператор if
Вложенный оператор if

Логические операции в условных операторах

Условный оператор может проверять

  • одновременное выполнение всех условий (операция И - &&)
  • выполнение хотя бы одного из условий (операция ИЛИ - ||)
  • выполнение только одного из условий (операция исключающее ИЛИ - ^)

Пример на Си: Найти максимум из 3 чисел

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
  int a, b, c;
  printf("a=");
  scanf("%d", &a);
  printf("b=");
  scanf("%d", &b);
  printf("c=");
  scanf("%d", &c);
  if ((a >= b) && (a >= c))
    printf("Max = %d", a);
  else if ((b >= a) && (b >= c))
    printf("Max = %d", b);
  else
    printf("Max = %d", c);
  getchar();
  getchar();
  return 0;
}


Пример на С++: Найти максимум из 3 чисел
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
int main()
{
  int a, b, c;
  cout << "a=";
  cin >> a;
  cout << "b=";
  cin >> b;
  cout << "c=";
  cin >> c;
  if ((a >= b) && (a >= c))
    cout << "Max = " << a;
  else if ((b >= a) && (b >= c))
    cout << "Max = " << b;
  else
    cout << "Max = " << c;
  cin.get(); 
  cin.get();
  return 0;
}

Тернарные операции

Тернарная условная операция имеет 3 аргумента и возвращает свой второй или третий операнд в зависимости от значения логического выражения, заданного первым операндом. Синтаксис тернарной операции в языке Си

 
Условие ? Выражение1 : Выражение2;

Если выполняется Условие, то тернарная операция возвращает Выражение1, в противном случае - Выражение2.

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

Приведенный выше пример с использованием тернарных операций можно представить в виде

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
#include <stdlib.h> // для использования функции system
int main() {
  int key;  // объявляем целую переменную key
  system("chcp 1251"); // переходим в консоли на русский язык
  system("cls");       // очищаем окно консоли
  printf("Введите номер пункта, 1 или 2: ");
  scanf("%d", &key);   // вводим значение переменной key
  key == 1 ? printf("\n Выбран первый пункт") :
    (key == 2 ? printf("\n Выбран второй пункт") :
      printf("\n Первый и второй пункты не выбраны"));
  getchar(); getchar();
  return 0;
}


 

Оператор ветвления switch (оператор множественного выбора)

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

Общая форма записи

 
 
 
 
 
 
 
 
 
 
 
 
switch (ЦелоеВыражение)
{
  case Константа1: БлокОпераций1;
    break;
  case Константа2: БлокОпераций2;
    break;
  . . .
  case Константаn: БлокОперацийn;
    break;
  default: БлокОперацийПоУмолчанию;
    break;
}


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

  • вычисляется ЦелоеВыражение в скобках оператора switch;
  • полученное значение сравнивается с метками (Константами) в опциях case, сравнение производится до тех пор, пока не будет найдена метка, соответствующая вычисленному значению целочисленного выражения;
  • выполняется БлокОпераций соответствующей метки case;
  • если соответствующая метка не найдена, то выполнится БлокОперацийПоУмолчанию, описанный в опции default.

Альтернатива default может отсутствовать, тогда не будет произведено никаких действий.
Опция break; осуществляет выход из оператора switch и переход к следующему за ним оператору. При отсутствии опции break будут выполняться все операторы, начиная с помеченного данной меткой и кончая оператором в опции default.

Константы в опциях case должны быть целого типа (могут быть символами).

Пример: Вывести день недели по его номеру


Назад: Язык Си

Комментариев к записи: 30

  • Алексей
    Задание:Используя массив типа структура, составить программу, для вывода информации про мобильные телефоны (бренд, цена, цвет, память, модель). Определить телефоны какого цвета преобладают на складе. код :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #define _CRT_SECURE_NO_WARNINGS
    #include <Windows.h>
    #include <stdio.h>
    struct phone
    {
      char brend[20];
      char colour[20];
      char model[20];
      int price, memory;
    };
    void fil(struct phone mash);
    int main()
    {
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      struct phone a[5];
      for (int i = 0; i < 5; i++)
      {
        printf("Введіть бренд, ціна, колір, пам’ять, модель. \n");
        scanf("%s %d %s %d %s", a[i].brend, &a[i].price, a[i].colour, &a[i].memory, a[i].model);
      }
      printf("На складі є такі мобільні телефони: \n");
      for (int i = 0; i < 5; i++)
      {
        printf("Бренд[%s],ціна [%d],колір[%s],пам'ять[%d],модель[%s] \n", a[i].brend, a[i].price, a[i].colour, a[i].memory, a[i].model);
      }
      printf("найбільше телефонів за кольором\n");
      for (int i = 0; i < 5; i++)
        fil(a[i]);
      return 0;
    }
    void fil(struct phone mash)
    {
      
        printf("Бренд[%s],ціна [%d],колір[%s],пам'ять[%d],модель[%s] \n", mash.brend,mash.price,mash.colour,mash.memory,mash.model);
    }
    что нужно добавить , какой оператор чтобы если большинство телефонов были одинаковых цветов их бы выводило последним принтф в коде

    • Елена Вставская
      Отсортировать записи по цвету. Добавить поле или массив с количеством телефонов заданного цвета. Посчитать количество телефонов каждого цвета и заполнить это поле для каждого телефона. Потом отсортировать по количеству телефонов указанного цвета.

  • Робертo
    я не могу понять, почему мой код не работает. Посмотрите, пожалуйста.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>

    int main()
    {
        system("chcp 1251");
        int i=0, j, m, n, k;
    //заполнение квадратного массива с клавиатуры
        printf("Enter size: \n");
        scanf("%d", &m);
        printf("Enter shift: \n");
        scanf("%d", &n);
        printf("Enter 0 right or 1 down : \n");
        scanf("%d", &k);

        if (n>m){
        n = n-m*(int(n/m));}
        int a[100][100], b[100][100];
        for (i = 0; i < m; i++)
        {
            printf("Enter ", i + 1 " line\n");
            for (j = 0; j < m; j++)
        {
            printf("Enter matrix element: \n");
            scanf("%d", &a[i][j]);
        }
        }
    //вывод массива на экран
        for (i = 0; i < m; i++)
            {
                for (j = 0; j < m; j++)
                printf("%5d ", a[i][j]);
        printf("\n");
            }
    printf("\n");
    if ((k==0) || (k==1))
        {
            if (k==0)
        {
    // Блок A формирование нового массива со сдвигом враво
            for (i = 0; i < m; i++)
            for (j = 0; j < n; j++)
            b[i][j]=a[i][m-n+j];
            for (i = 0; i <m; i++)
            for (j = n; j < m; j++)
            b[i][j]=a[i][j-n];
        }
    if (k==1)
        {
    // Блок B формирование нового массива со сдвигом вниз
            for (i = 0; i < n; i++)
            for (j = 0; j < m; j++)
            b[i][j]=a[m-n+i][j];
            for (i = n; i <m; i++)
            for (j = 0; j < m; j++)
            b[i][j]=a[i-n][j];
        }
    // вывод нового массива на экран
        for (i = 0; i < m; i++)
            {
                for (j = 0; j < m; j++)
                printf("%5d ", b[i][j]);
    printf("\n");
    }
    }
    else printf("Input Error");
    system("pause");
    return 0;
    }

  • Задание 1. С клавиатуры вводится четырехзначное целое число. Определить, равна ли сумма двух первых цифр сумме двух последних. Результат выводится на экран в виде текстового сообщения. как написать эту прог на языке C

    • Елена Вставская
      Ввести число и найти его цифры:
      d1 = num%10;
      d2 = (num/10)%10;
      d3 = (num/100)%10;
      d4 = num/1000;
      Сложить попарно и сравнить суммы.

  • Здравствуйте Елена, помогите пожалуйста с заданием. (Все остальные условия задания я выполнила) Сделать проверку на возможные некорректные значения времени, переданные в функцию: а) Проверка что минуты не больше 59. Вот мой код:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include<stdio.h>
    void amPm (float hour);


    int main()
    {
      amPm(01.60);//проверка

      return 0;
    }
    void amPm (float hour)
    {
      if (hour < 00.00 || hour > 23.00)
        {
          printf("Error! Wrong hour \n");
                return;
        }
      if (hour < 12.00)
      {
        printf("Appropriate time has been introduced am \n");
           return;
      }

      else
        {
        printf("Appropriate time has been introduced pm\n");
        }
    }

  • Помогите пожалуйста исправить ошибку
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    int main ()
    {
      double x,y;

      if (x<0)    {printf("y=4*pow(x,5)+5*pow(x,4)-2*x+7");}
      else { if (x=0)
      {printf("y=2000");}  }
        else {
      if (x>0)   
      {printf("y=5*pow(x,4)-2*x+7");} 
    }
      return 0;
      }

    • Елена Вставская
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      #include <stdio.h>
      #include <conio.h>
      #include <math.h>
      int main ()
      {
      double x,y;

      if (x<0) {
      y=4*pow(x,5)+5*pow(x,4)-2*x+7;}
      else if (x==0)
      {y=2000;}
      else
      {y=5*pow(x,4)-2*x+7;}
      printf("%lf",y);
      return 0;
      }

  • Создание структуры множественного выбора с использованием вложенного оператора if и switch Быть знакомым с использованием булевых выражений Быть знакомым с реляционными операторами в C # Быть знакомым с логическими операторами в C #   Мероприятия: Али Ромман, руководитель производственной компании, хочет знать, какие сотрудники увеличили свое производство в этом году по сравнению с прошлым годом, чтобы она могла выдать им поощрительные грамоты и премии. Используя вложенную структуру if Создайте блок-схему, а затем напишите программу для следующего: Программа, которая принимает имя и фамилию каждого работника, количество произведенных единиц в этом году и количество произведенных единиц в прошлом году. Отображает имя и сумму бонуса. Бонусы будут распределены следующим образом: Если производство в этом году больше, чем в прошлом году, и производство в этом году: 999 единиц или меньше, бонус составляет $ 25 От 1000 до 2999 единиц, бонус $ 50 От 3000 до 5999 единиц, бонус 100 $ 6000 единиц и выше, бонус составляет $ 200   2. Перепишите решение действия 1, используя инструкцию switch Вопрос: Каков результат: (a | b && (! A)), если предположить, что a и b верны. Предположим, что num1 = 15.0 и num2 = 40.0, каковы результаты следующих операторов кода:
    1
    2
    3
    4
    5
    if (num1! = num2)

       {if (num1> num2)

               Console.WriteLine (num1 + «больше, чем» + num2);
           еще
    1
    2
    3
    Console.WriteLine (num1 + «меньше чем» + num2); }

    иначе Console.WriteLine (num1 + «равно» + num2);
    Пожалуйста, помогите мне

    • Елена Вставская
      (a | b && (! A)) истинно, если один из параметров a, b верен и А ложно.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      if (num1! = num2) // 15!=40

         {if (num1> num2) //15>40

                 Console.WriteLine (num1 + «больше, чем» + num2);

             else

                 Console.WriteLine (num1 + «меньше чем» + num2); }

      иначе Console.WriteLine (num1 + «равно» + num2);


    • Елена Вставская
      Здесь только getchar() два раза используется, чтоб консоль сразу не закрывалась.

  • Может-ли внутри else ещё if добавить с условиями и если да то как можно правильно их писать?

    • Елена Вставская
      Да, можно, но тогда необходимо использовать фигурные скобки.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      if(...)
      {...}
      else
      {
        if(...)
        {...}
        else
        {...}
      }

  • Зачем в первых трёх примерах в конце программы используется getchar() getchar(); ??

    • Елена Вставская
      Чтоб консоль сразу не закрывалась, и можно было в консоли Windows посмотреть результат решения задачи.

  • > Оператор if позволяет осуществить выбор только между двумя вариантами Правда? О_о


  • Александр
    Для начинающих лишь первая глава - "Структура" - понятна, а дальше не разбериха, все как-будто свалено в одну кучу. Самостоятельно изучить предложенный материал вряд ли возможно. Радостные отзывы как раз и видно под первой главой, а дальше они пропадают, видать народ не осилил предложенное. Взять хотя бы эту главу - "Условные операторы". Что это такое вообще, откуда они взялись ?! К тому же оказывается их несколько видов, а здесь об этом не говорится. Вот из другого источника - "Чтобы двигаться дальше надо четко представлять потенциальные возможности языка СИ. В его основе лежит базовое понятие "оператор". Из отдельных операторов, как из кирпичиков, строятся большие по объему программы." - И дальше приводятся 6 групп операторов - операторы присваиваний, операторы вызова функций, операторы описания,ветвлений, циклов, переходов. Особо ценно, когда материал представлен в виде схем, все это очень хорошо зрительно усваивается и понимается. Лишь плюс в том, что  все это красочно оформлено.

    • Владимир
      Дорогой пользователь! Чем хорош Интернет-ресурс? Не хочешь - не ходи. Вам, действительно, сюда не надо. А для чайников есть платные курсы - вперед... Кстати, слово неразбериха пишется слитно!

      • Александр
        Так, если это не для начинающих, а для кого тогда ? Зачем тогда в первой главе подробно "разжевывается" структура ? Учитывая, что она мне и так была понятна, а вы сюда заходите и учитесь, значит вы чайник ? И про платные курсы вам известно, а мне вот нет, прошли что-ли их уже ? И чему лично  вы здесь научились, чего нет в другой литературе ? Для каждой главы не хватает хотя бы небольшого вступления - в 10-15-ти предложениях обрисовать, что будет рассматриваться в этой главе и для чего это нужно. Возьмем главу " Операторы цикла в языке". Она начинается со слов "В языке Си следующие виды циклов:...". Ну, вот не упоминались они ранее в этой статье и вдруг появились нежданно негаданно, и в связи с этим опять море вопросов. А все потому, что нет, например, отдельной главы перед этим, где описываются все операторы сразу и как их в дальнейшем применять. Надо вообще сделать так, что каждый несведующий читатель, случайно попав неожиданно на любую главу, мог заинтересоваться и понять, что здесь происходит и о чем рассказывается, а не искать дополнительную литературу. Такие мои пожелания напоследок.

    • Эту прогу я написал спустя 4 дня самостоятельного освоения материала с самого нуля. Я НИЧЕГО не знал 4 дня назад. Так что самостоятельно обучится можно!!! //программа считает прожитые дни.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      #include <stdio.h>

      int main()
      {
          int age;
          int mounth;
          int total;
          char answer;
          
          printf("\t\tСколько вам лет?    ");
          scanf("%d", &age); 
      //пользователь вносит переменную age
          printf("\t\tСколько месяцев вам уже %d лет?    ", age);
          scanf("%d", &mounth);
          total = age * 365 + mounth * 31;
          printf("\t\tВы живете около %d дней \n \n", total);
          
          if(age >= 30)
              printf("\t\tсообщение 1 \n \n");
      //с помощью функции отделил неполную
      //развилку от полной
          if(age < 30)
          {
              printf("\t\tвопрос? Y / N   ");
              scanf("%s", &answer);
          if(answer == 'Y')
              printf("\t\tХорошо!\n\n");
          else
              printf("\t\tПлохо!\n\n");
          }    
          return 0;
      }

  • Дмитрий
    Постоянные проблемы с выводом русского языка в консоли(((......программа Dev-C++5.4.2

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *