Организация циклов с помощью оператора 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));
}
|
< Дальше >
|