Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17110 / 2712 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 7:

Выбор вариантов

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Операция условия: ?:

В языке Си имеется короткий способ записи одного из видов оператора if-else. Он называется "условным выражением" и использует операцию условия - ?:. Эта операция состоит из двух частей и содержит три операнда. Рассмотрим, как можно найти абсолютное значение числа:

x = (y < 0) ? -y : y;

Все, что находится между знаком = и символом "точка с запятой" представляет собой условное выражение. Смысл этого оператора заключается в следующем: если y меньше 0, то x=-y ; в противном случае x=y. В терминах оператора if-else данный оператор мог выглядеть так:

if (y < 0) x=-y;
else x=y;

В общем виде условное выражение можно записать следующим образом:

выражение1 ? выражение2 : выражение3

Если выражение1 истинно (не равно нулю), то значением всего условного выражения является величина выражение2 ; если выражение1 ложно (равно 0 ), то значение всего условного выражения - величина выражение3.

! Условное выражение удобно использовать в тех случаях, когда имеется некоторая переменная, которой можно присвоить одно из двух возможных значений. Использование условных выражений не является обязательным, поскольку тех же результатов можно достичь при помощи оператора if-else. Однако условные выражения более компактны, и их применение обычно приводит к получению более компактного машинного кода.

Множественный выбор

Когда в программе нужно осуществить выбор одного из нескольких вариантов, мы можем сделать это, используя конструкцию if-else if-else_...else Во многих случаях оказывается более удобным применять оператор switch.

Оператор switch (переключатель) используется для разветвления программы по нескольким направлениям. Он имеет следующую форму:

switch(e) {
  сase c1: s1; break;
  case c2: s2; break;
  ...
  case ck: sk; break;
  default: s(k+1);
}

где

  1. e - целое выражение (или выражение, которое может быть преобразовано в целое выражение);
  2. ci - целое выражение с постоянным значением (или выражение, которое может быть преобразовано к такому выражению);
  3. si обозначает операторы, число которых может быть больше или равно нулю.

Метки ci, обозначающие альтернативы case, должны быть уникальными; двух одинаковых меток быть не может. Только одна альтернатива может получить префикс default.

Результатом выполнения оператора switch является выбор альтернативы с меткой ci, которая равна значению выражения переключателя e ; в этом случае выполняются операторы si. В случае, если выражение переключателя не равно ни одному из выражений альтернатив case, то выполняются операторы s(k+1) ; при отсутствии альтернативы default не выполняется ни одна из альтернатив оператора switch.

Пример:

/* Реализация работы калькулятора. Сначала задается 
число - сколько раз нужно подсчитать. Вводятся 
левый операнд, операция, правый операнд. Оператор 
выбора определяет, какой оператор должен работать. 
Результат выводится на экран. */
#include <stdio.h>
#include <conio.h>
#include <process.h>
main()
{
  float a,b;
  char opr;
  float result=0;
  int I,i=0;
  clrscr();
  printf("Сколько раз будете считать?:\n");
  scanf("%d",&I);
  printf("Введите операнд, операцию, операнд:\n");
  while(i<I) {
    i++;
    scanf("%f%c%f",&a,&opr,&b);
    switch(opr) {
      case '+': result=a+b; break; 
      case '-': result=a-b; break; 
      case '*': result=a*b; break; 
      case '/': result=a/b; break; 
      default:
        printf("Ошибка. Неверен знак операции "); 
        exit(1); /* функция берется 
                из заголовочного 
                файла process.h*/
    }
    textcolor (15); /* функция берется из
                 заголовочного файла conio.h*/
    cprintf("Результат равен %g\n",result); 
    if (i<I)
    printf("Введите операнд, операцию, операнд\n"); 
    else
    {
      textcolor(12);
        /* функция берется из заголовочного файла
           conio.h */
      cprintf("Конец работы\n"); 
        /* текст печатается красным цветом*/
    }
  }
  getchar () ;
  exit(0); 
    /* функция берется из заголовочного файла
       process.h */
}
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Анастасия Небыкова
Анастасия Небыкова
Россия, Москва, МГУ, 2017
Вадим Ратьков
Вадим Ратьков
Россия, Красноярск, СФУ ИППС