Статьи

Контрольные заявления в C, часть 1

Добро пожаловать в следующий выпуск нашей серии, Основы C.

Управляющие операторы позволяют нам определять поток управления программой; т.е. порядок, в котором должны выполняться инструкции в программе. Они позволяют принимать решения, выполнять задачи повторно или переходить от одного раздела кода к другому.

В Си есть четыре типа управляющих операторов:

  1. Заявления о принятии решений
  2. Выбор заявления
  3. Итерации
  4. Прыжки

Заявление о принятии решения: заявление if-else

Оператор if-else используется для проведения логического теста, а затем для выполнения одного из двух возможных действий в зависимости от результата теста (т. Е. Является ли результат истинным или ложным).

Синтаксис:

if (condition) { statements } else { statements } 

Если условие, указанное в операторе if, имеет значение true, операторы внутри блока if выполняются, а затем элемент управления передается в оператор сразу после блока if. Даже если условие ложно и отсутствует блок else, управление передается в оператор сразу после блока if.

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

Следующая программа проверяет, является ли введенный номер положительным или отрицательным.

 #include<stdio.h> int main( ) { int a; printf("n Enter a number:"); scanf("%d", &a); if(a>0) { printf( "n The number %d is positive.",a); } else { printf("n The number %d is negative.",a); } return 0; } 

Следующая программа сравнивает две строки, чтобы проверить, равны они или нет.

 #include <stdio.h> #include <string.h> int main( ) { char a[20] ,  b[20]; printf("n Enter the first string:"); scanf("%s",a); printf("n Enter the second string:"); scanf("%s",b); if((strcmp(a,b)==0)) { printf("nStrings are the same"); } else { printf("nStrings are different"); } return 0; } 

Вышеупомянутая программа сравнивает две строки, чтобы проверить, являются ли они одинаковыми или нет. Для этого strcmp функция strcmp . Он объявлен в файле string.h как:

int strcmp(const char *s1, const char *s2);

Он сравнивает строку, на которую указывает s1 со строкой, на которую указывает s2 . Функция strcmp возвращает целое число, большее, равное или меньшее нуля, соответственно, поскольку строка, на которую указывает s1 , больше, равна или меньше строки, на которую указывает s2 .

Поэтому в приведенной выше программе, если две строки a и b равны, функция strcmp должна возвращать 0. Если она возвращает 0, строки совпадают; иначе они разные.

Вложенные заявления if и if-else

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

Общий формат вложенного оператора if-else:

 if(condition1) { // statement(s); } else if(condition2) { //statement(s); } . . . . else if (conditionN) { //statement(s); } else { //statement(s); } 

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

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

 #include<stdio.h> int main( ) { int a, b,c; a=6,b= 5, c=10; if(a>b) { if(b>c) { printf("nGreatest is: " , a); } else if(c>a) { printf("nGreatest is: ", c); } } else if(b>c)     //outermost if-else block { printf("nGreatest is: " , b); } else { printf( "nGreatest is: " , c); } return 0; } 

Вышеупомянутая программа сравнивает три целых числа и печатает наибольшее. Первый оператор if сравнивает значения a и b . Если a>b верно, управление программой передается в оператор if-else, вложенный в блок if, где b сравнивается с c . Если b>c также верно, значение a печатается; иначе сравниваются значения c и a , и если c>a имеет значение true, значение c печатается. После этого остальная часть лестницы if-else обойдется.

Однако, если первое условие a>b ложно, элемент управления напрямую передается в самый внешний блок else-if, где значение b сравнивается с c (поскольку a не является наибольшим). Если b>c — истина, значение b печатается, иначе значение c печатается. Обратите внимание на вложенность, использование фигурных скобок и отступ. Все это требуется для поддержания ясности.

Заявление о выборе: Заявление о распределительной коробке

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

Синтаксис:

 switch (expression) { case value1: code segment1; break; case value2: code segment2; break; . . . case valueN: code segmentN; break; default: default code segment; } 

Значение этого выражения либо генерируется во время выполнения программы, либо читается как пользовательский ввод. Случай, значение которого совпадает со значением выражения , выбирается и выполняется. Необязательная метка по умолчанию используется для указания сегмента кода, который будет выполняться, когда значение выражения не совпадает ни с одним из значений регистра.

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

Пример: программа для печати дня недели.

 #include<stdio.h> int main( ) { int day; printf("nEnter the number of the day:"); scanf("%d",&day); switch(day) { case 1: printf("Sunday"); break; case 2: printf("Monday"); break; case 3: printf("Tuesday"); break; case 4: printf("Wednesday"); break; case 5: printf("Thursday"); break; case 6: printf("Friday"); break; case 7: printf("Saturday"); break; default: printf("Invalid choice"); } return 0; } 

Это очень простая программа, которая объясняет работу конструкции switch-case. В зависимости от числа, введенного пользователем, соответствующий случай выбирается и выполняется. Например, если пользовательский ввод 5, тогда будет выполнен случай 5. Оператор break присутствующий в случае 5, приостановит выполнение оператора switch после случая 5, и элемент управления будет переведен в следующий оператор после switch, который:

return 0;

Также возможно встроить составные операторы в случае оператора switch. Эти составные операторы могут содержать управляющие структуры. Таким образом, также возможно иметь вложенный переключатель, встроив его в кейс.

Все программы, написанные с использованием оператора switch-case, также могут быть написаны с использованием оператора if-else. Тем не менее, в программировании имеет смысл использовать оператор if, когда вам необходимо выполнить какое-либо действие после оценки некоторых простых или сложных условий, которые могут включать комбинацию реляционных и логических выражений (например, (if((a!=0)&&(b>5)) ).

Если вам нужно выбрать из большой группы значений, оператор switch будет выполняться намного быстрее, чем набор вложенных ifs. Переключатель отличается от if в этом переключателе, может проверять только равенство, тогда как if может вычислять любой тип логического выражения.

Оператор switch должен использоваться, когда нужно сделать выбор из заданного набора вариантов. Инструкция переключения регистра обычно используется в приложениях на основе меню . Наиболее распространенное использование оператора switch-case — в обработке данных или обработке файлов. Большая часть обработки файлов включает в себя общие функции: создание файла, добавление записей, удаление записей, обновление записей, печать всего файла или некоторых выборочных записей. Следующая программа дает представление о том, как оператор регистра переключателя может использоваться при обработке данных. Он не включает в себя код для обработки файлов, поскольку мы можем обсудить обработку файлов в C только после того, как изучим сложные понятия, такие как указатели, структуры и объединения.

Пример: оператор регистра переключателя, используемый при обработке файла данных.

 #include<stdio.h> int main() { //create file &set file pointer . int choice; printf("n Please select from the following options:"); printf("n 1. Add a record at the end of the file."); printf("n 2. Add a record at the beginning of the file:"); printf("n 3. Add a record after a particular record:"; printf("nPlease enter your choice:(1/2/3)?"); scanf("%d",&choice); switch(choice) { case 1: //code to add record at the end of the file break; case 2: //code to add record at the beginning of the file break; case 3: //code to add record after a particular record break; default: printf("n Wrong Choice"); } return 0; } 

Приведенный выше пример switch-case обычно включает в себя размещение конструкции switch-case внутри итерационной конструкции, например, do-while. В нашем следующем посте мы обсудим эти итерационные утверждения.