Статьи

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

В предыдущей статье об управляющих операторах мы обсуждали оператор принятия решений if-else и switch-case оператора выбора. В этой статье мы продолжим обсуждение управляющих операторов и обсудим итерационные операторы для while и do-while .

Итерационные заявления

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

1. для заявления

Оператор for или цикл for многократно выполняет набор инструкций, составляющих тело цикла for, пока не будет выполнено определенное условие.

Синтаксис:

for(initialization; termination; increment/decrement) { //statements to be executed } 

Цикл for состоит из трех выражений:

  • Выражение инициализации , которое инициализирует индекс цикла . Индекс цикла контролирует действие цикла. Выражение инициализации выполняется только один раз, когда начинается цикл.
  • Выражение завершения , которое представляет условие, которое должно быть истинным, чтобы цикл продолжил выполнение.
  • Выражение приращения / убывания выполняется после каждой итерации, чтобы обновить значение индекса цикла.

Следующая программа использует цикл for для печати ряда: 0,1,1,2,3,5,8,13… до n членов.

 #include<stdio.h> int main() { int i,n, a, b, sum=0;  printf("Enter the number of terms:");  scanf("%d",&n);  a=0; b=1;  printf("%dn %d",a,b); for(i=2;i<n;i++)   { sum=a+b;  printf("n%d",sum);  a=b;  b=sum;  }  return 0; } 

Если первые два элемента 0 и 1 исключены, видно, что каждый из следующих элементов в серии является суммой предыдущих двух элементов. Например, третий элемент является суммой первых двух элементов (0 + 1), четвертый элемент является суммой второго и третьего элементов (1 + 1 = 2), пятый элемент является суммой третьего и четвертые элементы (1 + 2 = 3) и так далее. Поэтому каждый раз это сумма предыдущих двух элементов, которая печатается. Предыдущее значение b становится новым значением a а предыдущее значение sum становится новым значением b . Вновь вычисленная сумма становится следующим элементом и впоследствии печатается. Эти шаги выполняются многократно до тех пор, пока индекс цикла i не достигнет на единицу меньше количества терминов, введенных пользователем. Циклический индекс i начинается с 2, так как первые два члена уже напечатаны. Он также может варьироваться от 0 до 1 меньше, чем n-2, как:

 for(i=0;i<(n-2);i++) 

или от 1 до n-2 как:

 for(i=1; i<(n-2);i++) 

Оператор for очень универсален и может быть записан четырьмя различными способами:

1. Пропуск выражения инициализации

В этом случае индекс цикла инициализируется перед циклом for. Таким образом, цикл for принимает следующую форму:

 i=0;/*initialization*/ for(; condition;increment/decrement expression)  {  //statements to be executed } 

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

2. Отказ от условия

В этом случае условие указывается внутри тела цикла for, обычно с использованием оператора if. Операторы while или do-while также могут использоваться для указания условия. Таким образом, цикл for принимает следующую форму:

 for(initialization; ; increment/decrement expression)  { condition //statements to be executed } 

Снова видно, что точка с запятой, которая завершает условие, присутствует в операторе for. Следующая программа объясняет, как условие может быть опущено:

 #include<stdio.h> int main()  { int i,n, a, b, sum=0;  printf("Enter the number of terms:");  scanf("%d",&n); a=0; b=1;  printf("%dn %d",a,b);  for(i=2; ;i++)  {  if(i==(n-1)) //condition specified using if statement  break;  sum=a+b; printf("n%d",sum); a=b;  b=sum;  }  return 0; } 

3. Пропуск выражения увеличения / уменьшения:

В этом случае выражение увеличения / уменьшения записывается внутри тела цикла for.

Пример:

 #include<stdio.h>  int main()  { int i,n, a, b, sum=0;  printf("Enter the number of terms:");  scanf("%d",&n); a=0; b=1;  printf("%dn %d",a,b);  for(i=2;i<n;)  { sum=a+b; printf("n%d",sum);  a=b;  b=sum;  i++;  //increment expression }  return 0;  } 

4. Опуская все три выражения:

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

 for(;;)  { //statements } 

2. В то время как заявление

Оператор while выполняет блок операторов несколько раз, пока выполняется определенное условие.

 while (condition)  { //statement(s) to be executed } 

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

Пример: программа для вычисления суммы цифр числа (например, 456; 4 + 5 + 6 = 15)

 #include<stdio.h>  int main() { int n, a,sum=0;   printf("n Enter a number:");  scanf("%d", &n);   while(n>0)   { a=n%10; //extract the digits of the number  sum=sum+a; //sum the digits  n=n/10; //calculate the quotient of a number when divided by 10. }  printf("n Sum of the digits=t %d",sum); return 0; } 

Приведенная выше программа использует цикл while для вычисления суммы цифр числа. Например, если число равно 456, цикл while вычислит сумму за четыре итерации следующим образом. Было бы полезно помнить, что% дает остаток и / частное.

Итерация 1: n> 0 Условие истинно (n = 456)

а = п% 10 = 6;

сумма = сумма + а = 6;

n = n / 10 = 45; Новое значение n составляет 45.

Итерация 2: n> 0 Условие истинно (n = 45)

а = п% 10 = 5;

сумма = сумма + а = 6 + 5 = 11;

n = n / 10 = 4; Новое значение n равно 4.

Итерация 3: n> 0 Условие истинно (n = 4)

а = п% 10 = 4;

сумма = сумма + а = 11 + 4 = 15;

n = n / 10 = 0; ew значение n равно 0.

Итерация 4: n> 0 Условие ложно (n = 0).

После четвертой итерации управление выходит из цикла while и печатает сумму, равную 15.

Пример 2: Программа для проверки, является ли введенный номер палиндромом или нет.

Палиндром — это число, которое остается неизменным, когда его цифры читаются или пишутся справа налево или наоборот, например, 343 — это палиндром, а 342 — нет. Следующая программа работает по логике: если обратный номер совпадает с исходным, то введенный номер является палиндромом, в противном случае это не так.

 #include<stdio.h>  int main()  { int a, n,m, reverse=0;  printf("n Enter a number:");  scanf("%d", &n); m=n; while(n>0) {  a=n%10; reverse=reverse*10 +a;  n=n/10;  }  if (m== reverse) {  printf(" n The number is a palindrome.");  } else  { printf("n The number is not a palindrome."); } return 0; } 

Вышеуказанная программа использует почти ту же логику, что и программа, касающаяся суммы цифр. Как было видно в этой программе, n становится 0 в последней итерации. Однако нам нужно сравнить исходное значение n с обратным числом, чтобы определить, палиндром это или нет. Следовательно, значение n было сохранено в m до входа в цикл while. Значение m позже сравнивается с reverse чтобы определить, является ли введенное число палиндромом или нет.

Цикл while работает следующим образом:

Пусть n = 343;

Итерация 1: a = n% 10 = 3;

обратная = обратное * 10 + а = 0 * 10 + 3 = 3;

п = п / 10 = 34;

Итерация 2: a = n% 10 = 4;

обратная = обратное * 10 + а = 3 * 10 + 4 = 34;

п = п / 10 = 3;

Итерация 3: a = n% 10 = 3;

обратная = обратное * 10 + а = 34 * 10 + 3 = 343;

п = п / 10 = 0;

Итерация 4: n> 0 условие ложно (n = 0).

Управление выходит из цикла while.

3. Цикл do-while

Оператор do-while оценивает условие в конце цикла после выполнения блока операторов хотя бы один раз. Если условие истинно, цикл продолжается, иначе он завершается после первой итерации.
Синтаксис:

 do { //statements to be executed;  } while(condition); 

Обратите внимание на точку с запятой, которая завершает оператор do-while. Разница между while и do-while состоит в том, что цикл while является циклом с управлением входом — он проверяет условие в начале цикла и не будет выполняться ни разу, если условие ложно, тогда как цикл do-while является контролируемый выходом цикл — он проверяет условие в конце цикла после завершения первой итерации.

Для многих приложений более естественным является тестирование продолжения цикла в начале, а не в конце цикла. По этой причине оператор do-while используется реже, чем оператор while.

Большинство программ, работающих с while, также могут быть реализованы с использованием do-while. Следующая программа вычисляет сумму цифр таким же образом, за исключением того, что она использует цикл do-while:

 #include<stdio.h> int main() { int n, a,sum=0; printf("n Enter a number:"); scanf("%d", &n); do  { a=n%10; sum=sum+a; n=n/10; }while(n>0); printf("n Sum of the digits=t %d",sum); return 0; } в #include<stdio.h> int main() { int n, a,sum=0; printf("n Enter a number:"); scanf("%d", &n); do  { a=n%10; sum=sum+a; n=n/10; }while(n>0); printf("n Sum of the digits=t %d",sum); return 0; } 

Однако оператор do-while следует использовать только в ситуациях, когда цикл должен выполняться хотя бы один раз, независимо от того, выполняется ли условие.

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

 #include<stdio.h>  int main() {  //create file &set file pointer .  int choice; char ch;   printf("n Main Menu ");  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); do  {   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");  }  printf(" Do you want to continue updating records(y/n)?");  scanf("%c", ch);  }while (ch=='y'||ch=='Y');    return 0;  } 

В следующей статье будут обсуждаться операторы перехода: перейти, прервать, продолжить и вернуться.