Организация циклов с помощью оператора for 
";


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Организация циклов с помощью оператора for



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

for(выражение1; выражение2; выражение3) оператор;

В одной строке этот оператор определяет сразу три составляющие, отделяемые друг от друга точкой с запятой: а) начальное значение параметра цикла(выражение1), б) условие оканчания цикла (выражение2), в) закон изменения параметра цикла(выражение3). Формально этот оператор эквиалентен последовательности операторов

выражение1; while(выражение2) { оператор; выражение3;)

В следующей программе (пример 4.4) оператор for служит для организации и печати последовательных чисел Фибоначчи, не превосходящих m. Проверка k<=m происходит перед каждым (в том числе и перед первым) выполнением тела цикла. Тело цикла выполняется, если проверочное выражение истинно. Затем следует изменение параметра: k=k+1; этот оператор, кстати, формирует очередное число Фибоначчи, а оператор j=k-j; хранит предыдущее.

Пример 4.4

/*числа Фибоначчи*/ #include <stdio.h> main() { int m, k, j=1; printf("введи m\n"); scanf("%d",&m); for(k=1;k<=m;k=k+j) { printf("%d",k); j=k-j; } }

Как и в операторе while, тело цикла for может состоять из единственного оператора или из нескольких, заключенных в скобки. Следующяя программа (пример 4.5) предназначена для печати гистопрограммы длин читаемых слов (признак конца слова - пробел, запятая или "\n"). Оператор for управляет циклом, состоящим по сути из одного оператора if, так что скобки можно было бы опустить. Для построения гистопрограммы выбран символ, внутреннее представление которого в коде ASCII численно равно 220.
В скобках после ключевого слова for можно размещать выражения. Однако выражение1 и выражение3 не обязаны присваивать начальное значение и изменять параметр цикла, а выражение2 не обязано быть проверкой условия. Но компилятор всегда интерпретирует выражение2 как истинну или ложь (ложь- двоичный нуль, истина - все остальное). Любое из трех может быть опущено, хотя точка с запятой должна остаться. Допускается даже такой вырожденный случай: for(;;);. Он означает бесконечный цикл, так как пропущенное выражение2 всегда трактуется как истина.

Пример 4.5

#include <stdio.h> main() { char str[24]; int i,n=0; printf("введистроку:\n"); while((str[n++]=getchar())!='\n'; printf("%d\n",n); for(i=0;i<n;i++) { if(str[i]!=' ' && str[i]!=',' && str[i]!= '\n') printf("%c",220); else printf("\n"); } }

В Си есть еще операция ", " (запятая), которая чаще всего используется в операторе for. Пара выражений, разделенных запятой, вычисляются слева направо. В каждой из трех составляющих оператора for можно помещать несколько выражений, разделенных запятыми. Этот прием часто используют, например, для синхронного изменения двух индексов при обработке массивов. В качестве примера приведем функцию substr, которая позволяет из задонной строки s1 выделить подстроку s2 указанной длины L, начиная с k-го по порядку символа (нумерация символов начинается с нуля). Функция принимает также параметр m- общее кол-во символов в исходной строке, чтобы контролировать возможный выход за ее пределы(пример 4.6).

Пример 4.6

/*выделение подстроки*/ substr(char s1, char s2, int l, int k, int m) { int j,i; if(l+l>=m)k=m-l-1; for(i=1,j=0;i<l+k;i++.j++) s2[j]=s1[i]; } #include <stdio.h> main() { char str[80], str2[80]; int k,l,m=0; printf("ведите строку"); while((str1[m++]=getchar())!='\n'); printf("\n"); /*m сохраняет свое значение*/ printf("введите l и k\n"); scanf("%d %d",&l, &k); substr(str1,str2,l,k,m); printf("%s\n",str2); }

Преимущество оператора for - компактность и объединение в одной строке трех операторов управления циклом - особенно заметно проявляется во вложенных циклах. Очередная прогрпмма(пример 4.6) предназначена для упорядочения целых чисел по возрастанию. Функция sor реализует один из наиболее простых алгоритмов сортировки - метод "пузырька".

Пример 4.6

/*СОРТИРОВКА */ #include <stdio.h> main() { extern int sor(); int i,n; static a[10]={10,1,9,2,8,3,7,4,6,5}; n=10; sor(a,n); for(i=0; i<n; i++) printf(" %d",a[i]); } /*________________*/ int sor(int x[], int n) { int i,j,z; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(x[i]>x[j]) { z=x[i]; x[i]=x[j]; x[j]=z; } return; }

Еще один пример со вложенными циклами демонстрирует программа (пример 4.7). Она использует одну полезную при обработке текстов функцию index. Функция index определяет, входит ли в некоторую строку s1 заданная подстрока s2 и выдает положение (индекс) в строке s1, начиная с которого строка s2 содержится в s1. Если s2 не входит в s1, то функция возращает '-1'.

Пример 4.7

/*индекс строки */ index(s1,s2) char s1[],s2[]; { int i,j,k; for(i=0;s1[i]!='\0'; i++) { for(j=i,k=0;s2[k]!='\0' && s1[j]==s2[k]; j++,k++); if(s2[k]=='\0') return(i); } return(-1); } char str1[]="информатика" chra str2[]="форма" #include <stdio.h> main() { printf("%d\n",index(str1,str2)); }


Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 100; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.39.74 (0.004 с.)