Основные конструкции языка С++.Циклы

Автор работы: Пользователь скрыл имя, 28 Января 2013 в 17:23, реферат

Описание

Вычислительный процесс с многократным повторением однотипных вы-числений для различных значений обрабатываемых величин (переменных) назы-вается циклическим, повторяющиеся участки вычисления - циклами, изменяю-щиеся в цикле величины - переменные цикла.

Работа состоит из  1 файл

Цикл.docx

— 68.32 Кб (Скачать документ)

11.Основные конструкции  языка С++.Циклы., 08/09/2007


К списку статей

Вычислительный  процесс с многократным повторением  однотипных вы-числений для различных значений обрабатываемых величин (переменных) назы-вается циклическим, повторяющиеся участки вычисления - циклами, изменяю-щиеся в цикле величины - переменные цикла. Для организации циклов необходимо в алгоритмах предусмотреть: 
1.подготовку цикла: задание начальных значений переменным цикла перед его выполнением; 
2.тело цикла, действия, повторяемые в цикле для различных значений перемен-ных цикла; 
3.модификацию (изменение) значений переменных цикла перед каждым его повторением; 
4.управление циклом: проверку условия продолжения или окончания цикла. 
Цикл FOR. 
Цикл for в C++ отличается большей гибкостью, поскольку с его помощью можно организовать как фиксированные, так и условные итерации. 
for (< инициализация переменных управления циклом>; 
<проверка продолжения цикла>; 
< модификация переменных управления циклом, часто их приращение или  уменьшения>) 
     <оператор>;  

Пример: 
for (i=0, i<10; i++) 
cout << "i=" <Оператор for имеет три компоненты, каждый из которых необязателен. Пер-вый компонент инициализирует переменные управления циклом. Второй - это условие, которое проверяет, будет ли цикл выполнять следующую итерацию, по-следний компонент - приложение, которое изменяет переменные управления циклом; часто это просто операции инкримента и / или декримента.

// Программа рассчитывает  сумму и  
// среднее значение ряда целых чисел, используя 
// цикл for. 
# include  
int main (.) 

int count=0; 
double sum=00; 
int first, last, temp; 
cout << "Введите первое целое:"; 
cin >> first; 
cout << "Введите последнее целое:"; 
cin >> last; 
if (first > last) 
  { temp = first;  
     first = last; 
     last = temp; 
   } 
for (int i=first; i<=last; i++) 

count ++; 
sum + = (double) i; 

cout << "сумма целых чисел" 
<< first << "go" << last << "=" 
<< sum << endl; 
cout << "среднее значение" << sum/count  
return 0; 

Открытые циклы, использующие циклы for. 
Если оставить все три компонента цикла пустыми, результатом будет от-крытый цикл. (open loop). 
C++ позволяют выходить из них следующими способами: 
1.Оператор break вызывает переход к выполнению кода, следующего за текущим циклом, во многом подобен тому, как он  мог бы быть использован, чтобы про-должить выполнение вне оператора switch. Используйте оператор break, если вы хотите выйти из цикла и продолжить работу, оставшейся части программы. 
2.Оператор return осуществляет возврат из текущей функции (включая main). О return и функциях далее. 
3.Оператор throw вызывает генерацию исключения. Это используется, если произошла ошибка, и вы можете продолжать выполнение оставшейся части программы без какого-либо обработчика ошибок. Однако, применяйте этот метод с осторожностью; исключения предназначены для использования в не-штатных обстоятельствах - в случае ошибок. 
4.В самых чрезвычайных случаях выйти из программы можно с помощью функ-ции exit (STDLIB.H). Эту функцию используют только в крайней необходи-мости, когда не остается никакой надежды на восстановления работоспособ-ности программы. Функция exit прекратит выполнение итерации и приведет к выходу из программы. 
//Программа, демонстрирующая преобразования цикла for для эммуляции непре-деленного цикла. 
#include  
#include  
  int main ( ) 
    { 
        char ch; 
        double x,y; 
//цикл for с пустыми компонентами 
 for ( ; ; ) 
   { 
     cout      if (x:=0) 
        { 
           y=1/x; 
           cout << "1/"<< x << "="<           cout << "Продолжить выч.?  y/n"; 
           cin >> ch; 
           if (toupper (ch):="r ") 
           break; 
        } 
      else 
       //отобразить сообщение об ошибке 
        cout << "ошибка " <   } 
    return 0; 
 } 
Цикл  do - while. 
Цикл  do - while в C++ - это условный цикл.  
Условный цикл выполняется до тех пор, пока условие имеет значение true. Это условие проверяется в конце цикла. 
Пример: 
  int i=2; 
  do { cout <  } while (++i<11);  
//  Программа, демонстрирующая использование цикла do-while 
# include  
# include  
 int main () 
  { 
 char ch; 
 double x,y; 
   do //цикл do-while выполняет вычисления 
    { 
 do //цикл собирает числа 
   { 
     cout <     cin >>x; 
     it (x= =0); 
      cout <<"Ошибка!"<     } while (x= =0); 
   y=1/x; 
   cout << "1/" <   cout >>"Продолжить? (y/n)"; 
   cin >> ch; 
  } while ( toypper (ch)=="y"); 
  return 0; 
    } 
Цикл while. 
Цикл while в C++ - второй условный цикл, в котором операции выполняют-ся до тех пор, пока условие имеет значение true. Т.о. цикл while может не выпол-нить ни одной операции, если проверяемое условие изначально имеет значение false.

Пример: 
//Вычисляет x в степени n 
double pwr = 1; 
while (n-- >0) 
   pwr *=x; 
cout // значение ряда целых чисел используя цикл while. 
  # include  
int main (  ) 

  int count = 0; 
  double sum = 0.0; 
  int first, last, temp; 
cout << "Введите первое целое: "; 
cin <<  first ; 
cout << "Введите последнее целое: "; 
cin >> last; 
  if (first > last) 
      { 
         temp = first; 
         first = last; 
         last = temp; 
      } 
cout << "Сума целых чисел" 
          << first << "to" << last << "="; 
while  
   { 
      count ++; 
      sum + = (double) first ++; 
    } 
cout << sum << endl; 
cout << "среднее значение"<< 
return 0; 
}

 

 

 

 

 

 

 

 

 

 
 

В языках C/C++ цикл while обычно используется в тех случаях, когда число повторений цикла заранее не известно. Он является циклом с предусловием, как и цикл for. Другими словами, программа проверяет истинность условия цикла до того, как начать следующую итерацию.  
 
Поэтому, в зависимости от начального условия, цикл может выполняться несколько раз или не выполняться вообще. Цикл while имеет следующий синтаксис:  
 
while(условие) выражение; 
  
Если тело цикла состоит из нескольких строк, необходимо использовать фигурные скобки: 
 
while(условие) ( выражение1; выражение2; выражениеЗ; выражение-п; }  
 
В следующей программе на языке С создается цикл, в котором на экран выводится двоичный эквивалент знакового целого числа. Цикл выполняется до тех пор, пока в результате побитового сдвига переменной ivalue не будет протестирован каждый ее бит. 
  
/* 
 * while.с  
* В этой программе на языке С демонстрируется использование цикла while.  
*/ #include #define WORD 16 #define ONE_BYTE 8 int main() { int ivalue = 256,ibit_position = 1; 
 unsigned int umask = 1;  
printf("Число%d\n", ivalue);  
printf("имеет следующий двоичный эквивалент: ");  
while(ibit_position <= WORD) { if((ivalue>> (WORD - ibit_position)) & umask) /* сдвигаем каждый */ printf("l"); 
/* бит на нулевую 
 */ else /* позицию и сравниваем  
*/ printf("0"); 
/* число с константой 
 */ if(ibit_position == ONE_BYTE)  
/* umask */ printf (" ");  
ibit_position++; return(0); }  
 
Данная программа начинается с описания двух констант, WORD и ONE_BYTE, значения которых при необходимости можно модифицировать. Первая из них определяет длину в битах анализируемого числа, а вторая — позицию, после которой следует поставить пробел, чтобы отделить на экране одну группу разрядов от другой. В цикле while осуществляется поочередный (от старшего к младшему) сдвиг битов переменной ivalue в первую позицию, сравнение полученного числа со значением переменной umask (маска младшего разряда) и вывод нуля или единицы в зависимости от результата. 
  
В следующей программе пользователю предлагается задать имена файлов для ввода и вывода данных. Цикл whilе используется для чтения данных из одного файла с одновременной записью их в другой файл, причем размер файлов изначально не известен.  
 
/*  
* fwhile.с  
* В этой программе на языке С цикл while используется  
* при работе с файлами. В программе демонстрируются  
* дополнительные возможности файлового ввода/вывода. */ 
#include #define MAX_CHARS 30 int main() { int c;  
FILE *ifile, *ofile; 
 char szi_file_name [MAX_CHARS] , szo_file_name[MAX_CHARS] ; 
 printf("Введите имя исходного файла: ");  
scanf("%s",szi_file_name);  
if((ifile= fopen(szi_file_name, "r">>== NULL)  
{ printf("\nФайл%s не может быть открыт", szi_file_name);  
return(0); printf ("Введите имя выходного файла: ");  
scanf("%s", szo_f ile_name) ;  
if ((oflie = fopen(szp_file_name, "w")) == NULL)  
{ printf ("\nФайл %s не может быть открыт", szo_f ile_name) ;  
return (0); while ((с= fgetc(ifile)) != EOF) fputc(c,of ile) ; return(0); } 
  
В программе также показано использование функций файлового ввода-вывода данных, таких как fopen ( ) , fgetc( ) и fputc( ) (более подробно об этих функциях см. в главе "Ввод-вывод в языке С").


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Циклы в  языках С и C++. Цикл do/while.

 
 

В цикле do/while истинность условия проверяется после выполнения очередной итерации, а не перед этим. Другими словами, тело цикла гарантированно будет выполнено хотя бы один раз. Как вы помните, циклы for и while с предусловием могут вообще остаться невыполненными, если условное выражение сразу возвратит значение false.  
 
Таким образом, цикл do/while следует использовать тогда, когда некоторое действие в программе необходимо выполнить в любом случае, по крайней мере один раз. 
  
Цикл do/while имеет следующий синтаксис:  
 
do . выражение;  
while(условие) ;  
 
Если тело цикла состоит более чем из одной строки, необходимо ставить фигурные скобки: 
  
do{ выражение1; выражение2; выражениеЗ; выражение-n ; } while(условие);  
 
В следующем примере цикл do/while используется для получения от пользователя строки текста:  
 
//  
// dowhile.cpp  
// В этой программе на языке C++ демонстрируется  
// использование цикла do/while.  
// #include #define LENGTH 80 int main() { char cSentence [LENGTH] ; 
int iNumChars = 0, iNumWords = 1;  
do{ cout << "Введите предложение : ";  
cin.getline (cSentence, LENGTH);  
} while (cSentence [0]== '\0');  
while (cSentence [iNumChars] != '\0')  
{ if (cSentence [iNumChars] !=''&& cSentence [iNumChars] != '\t'&& (cSentence [iNumChars+1] == ' ' || cSentence [iNumChars+1] == '\t'|| cSentence [iNumChars+1] == '\0')) iNumWords++;  
iNumChars++;  
cout<< "Вы ввели " << iNumChars<< " символов\n"; cout<< "Вы ввели " << iNumWords<< " слов"; return(0); }  
 
В цикле do/while запрос будет повторяться до тех пор, пока пользователь не введет хотя бы один символ. При простом нажатии клавиши [Enter] функция getline( ) возвращает символ null, в таком случае цикл повторяется.  
 
Как только в массив будет записана строка, цикл завершится и программа произведет подсчет количества введенных символов и слов.

 
     

Другие другие материалы на сайте по теме: Циклы в языках С и C++. Цикл do/while.


 


 

 

 

 

Циклы в  языках С и C++. Цикл for.

 
 

Цикл for имеет следующий синтаксис:  
 
for(инициализирующее_выражение;.  
условное_выражение;  
модифицирующее_выражение) выражение;  
 
При обнаружении в программе цикла for первым выполняется инициализирующее_выражение, в котором обычно устанавливается счетчик цикла. Это происходит только один раз перед запуском цикла. Затем анализируется условное_выражение, которое также называется условием прекращения цикла. Пока оно равно true, цикл не прекращается.  
 
Каждый раз после всех строк тела цикла выполняется модифицирующее_выражение, в котором происходит изменение счетчика цикла. Как только проверка условного_выражения даст результат false, все строки тела цикла и модифицирующее_выражение будут пропущены и управление будет передано первому выражению, следующему за телом цикла.  
 
Если тело цикла содержит более одной команды, следует использовать фигурные скобки и руководствоваться определенными правилами оформления, чтобы сделать текст программы более понятным: 
  
for (инициализирующее_выражение;  
условное_выражение;  
модифицирукщее_выражение) { выражение1; 
 выражение2; выражениеЗ; выражение-n; }  
 
Давайте рассмотрим некоторые примеры использования цикла for. В следующем фрагменте вычисляется сумма ряда целых чисел от 1 до 5. Предполагается, что переменные isum и ivalue имеют тип int: 
  
isum = 0; for (ivalue = .1; ivalue <= 5; ivalue++) isum += ivalue;  
 
Сначала переменной isum присваивается нулевое значение, после чего запускается цикл for, который начинается с присваивания переменной ivalue значения 1. Эта операция выполняется только один раз. Затем проверяется условие ivalue<= 5. Поскольку на первом шаге цикла это выражение равно true, к переменной isum прибавляется текущее значение переменной ivalue — единица. По завершении выполнения последней строки цикла (в данном случае единственной) переменная ivalue увеличивается на единицу. 
  
Этот процесс будет повторяться до тех пор, пока значение переменной ivalue не достигнет 6, что приведет к завершению цикла. В программе на языке C++ приведенный фрагмент будет записан следующим образом (найдите одно отличие):  
 
isum = 0; for (intivalue = 1;  
ivalue <= 5; ivalue-м-) isum += ivalue;  
 
В C++ допускается объявление переменных прямо в строке инициализации цикла for. Тут затрагивается достаточно важный вопрос: где вообще следует размещать все объявления переменных? В C++ переменные можно создавать непосредственно перед той строкой, где они впервые используются.  
 
Поскольку в нашем случае переменная ivalue используется только внутри цикла, ее объявление в цикле не нарушает стройности программы. Но рассмотрим такой пример:  
 
int isum = 0;  
for(intivalue = i; ivalue <= 5;  
ivalue++) isum += ivalue;  
 
Подобное объявление переменной isum можно назвать плохим стилем программирования, если ее применение неограничивается данным циклом. Желательно все объявления локальных переменных собирать сразу после заголовка функции, к которой они относятся, так как это повышает удобочитаемость программы и облегчает ее отладку. 
  
Значение счетчика цикла for вовсе не обязательно должно меняться только на единицу. В следующем примере вычисляется сумма ряда нечетных чисел от 1 до 9:  
 
iodd_sum = 0; for(iodd_value = 1; 
 iodd_value <— 9; iodd_value += 2);  
iodd_sum += iodd_value;  
 
Здесь счетчиком цикла является переменная iodd_value, и ее значение на каждом шаге увеличивается на 2. Кроме того, счетчик цикла может не только увеличиваться, но и уменьшаться, В следующем примере с помощью цикла for организуется считывание строки символов в массив саrrау, а затем с помощью другого цикла for эта строка выводится на экран в обратном порядке: 
  
/*  
* forloop.cpp  
* В этой программе на языке C++ демонстрируется использование  
* цикла for для работы с массивом символов.  
*/ #include  
#define CARRAY_SIZE 10 int main()  
{ int ioffset; char carray[CARRAY_SIZE]; 
 for(ioffset = 0; ioffset < CARRAY_SIZE; ioffset++) carray[ioffset] = getchar();  
for(ioffset = CARRAY_SIZE - 1; ioffset >= 0; ioffset—) putchar(carray[ioffset]);  
return(0); }  
 
В первом цикле for переменной ioffset присваивается начальное значение 0, поскольку адресация элементов массива начинается с нуля. Затем происходит считывание символов по одному до тех пор, пока значение переменной ioffset не станет равным размеру массива. Во втором цикле for, в котором элементы массива выводятся на экран в обратном порядке, переменная ioffset инициализируется номером последнего элемента массива и по ходу цикла уменьшается на единицу.  
 
Цикл будет выполняться до тех пор, пока переменная ioffset не примет значение 0. При работе с вложенными циклами for обращайте внимание на правильную расстановку фигурных скобок, чтобы четко определить границы каждого цикла: 
  
/*  
* nsloopl.с  
* В этой программе на языке С демонстрируется важность  
* правильной расстановки фигурных скобок во вложенных циклах.  
*/ #include int main() { int iouter_val, iinner_val;  
for (iouter_val = 1;  
iouter_val <= 4;  
iouter val++) ( printf ("\n%3d-- ",iouter_val) ;  
for (iinner_val = 1; iinner_val <= 5; 
 iinner_val++) printf ("%3d",iouter_val * iinner_val) ;  
return(0); }  
 
В результате выполнения программы будут выведены следующие данные: 1 — 12345.. 2 — 2 4 6 8 10 3 — 3 б 9 12 15 4 — 4 8 12 16 20 А теперь представим, что внешний цикл записан без фигурных скобок:  
 
/*  
* nsloop2.c 
 * В этой программе на языке С демонстрируется, что произойдет, если при  
* задании внешнего цикла не поставить фигурные скобки.  
*/ #include int main () int iouter_val, iinner_val; for(iouter_val = 1;  
iouter_val <= 4; iouter_val++) printf("\n%3d-", iouter_val);  
for(iinner_val = >>1; iinner_val <= 5;  
iinner_val++) printf("%3d", iouter_val * iinner_val);  
return(0); 
  
Выводимые данные будут выглядеть совершенно иначе: 
 
1 -- 2 -- 3 -- 4 -- 5 10 15 20 25 
  
Если тело внешнего цикла не будет выделено фигурными скобками, то к первому циклу будет отнесена только следующая за ним строка с функцией printf(). Только после того как функция printf() будет вызвана четыре раза подряд, начнется выполнение следующего цикла for. Во внутреннем цикле будет использовано самое последнее значение переменной iouter_val, т.е. 5, на основе которого будет сгенерирован и выведен очередной функцией printf() соответствующий ряд чисел.  
 
Очень часто решение использовать или не использовать фигурные скобки в конструкциях со вложенными циклами принимается на основе того, насколько проще для понимания станет текст программы. Посмотрите на следующие два примера и попытайтесь определить, будет ли результат их выполнения одинаковым.  
 
Вот первый пример: 
  
/*  
* nsloop3.c  
* Еще одна программа на языке С, демонстрирующая использование фигурных скобок  
* в конструкциях со вложенными циклами.  
*/ #include int main () { int iouter_val, iinner_val;  
for(iouter_val = 1; iouter_val <= 4; iouter_val++)  
{ for(iinner_val = 1; iinner_val <= 5; iinner_val++) printf("%3d", iouter_val * iinner_val);  
} return(0); }  
 
Запишем эту же программу несколько иначе: 
 
 /* 
 * nsloop4. 
c *  
 
Видоизмененный вариант предыдущей программы.  
 
*/ #include int main() { int iouter_yal, iinner_val; 
 for(iouter_val = 1; iouter_val <= 4; iouter_val++) for(iinner_val = 1; 
 iinner_val <= 5; iinner_val++) printf("%3d", iouter_val * iinner_val);  
return(0); }  
 
В обоих случаях на экран будет выводиться одна и та же последовательность:  
 
1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20  
 
В рассмотренных программах после строки, задающей внешний цикл, сразу следует строка внутреннего цикла. При этом весь внутренний цикл, независимо от того, состоит ли он из одной или нескольких строк, будет восприниматься как одно выражение.  
 
Поэтому без фигурных скобок, ограничивающих внешний цикл, вполне можно было обойтись. Но их можно установить с целью повышения удобочитаемости программы.

 
     

Другие другие материалы на сайте по теме: Циклы в языках С и C++. Цикл for.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Инструкции  выбора в С++. Инструкция if/else.

 
 

Инструкция if /else позволяет выборочно выполнять одно из двух действий в зависимости от условия.  
 
Ниже показан синтаксис данной инструкции:  
 
if (условие) выражение1;  
else выражение2;  
 
Если проверка условия дает результат true, то выполняется выражение1, в противном случае — выражение2. 
  
Рассмотрим пример: 
  
if (ckeypressed — UP) iy_pixel_coord++;  
else iy_pixel_coord--;  
 
В этом фрагменте выполняется увеличение или уменьшение текущей горизонтальной координаты указателя мыши в зависимости от значения переменной ckeypressed предполагается, что она содержит код нажатой клавиши. 
 
Если операторная часть ветви if или else содержит не одно выражение, а несколько, необходимо заключать их в фигурные скобки, как показано в следующих примерах: 
  
if(условие) { выражение1;  
выражение.?; 
 выражениеЗ; } .  
else выражение 4;  
if (условие) ( выражение1;  
else { выражение2; выражениеЗ;  
выражение4 ;  
if (условие) { выражение1;  
выражение2; выражениеЗ;  
} else { выражение 4;  
выражение5;  
выражение 6; }  
 
Обратите внимание, что после закрывающей фигурной скобки точка с запятой не ставится. 
 
В следующем примере демонстрируется использование инструкции if /else: 
  
/*  
* crapif.c  
* В этой программе на языке С демонстрируется использование  
* инструкции if /else.  
*/ #include int main () { char c; int ihow_many, i, imore;  
while (imore == 1) { printf ("Введите название товара: ");  
if (scanf ("%c",&c)!= EOF) { while (c != '\n') scanf ("%c",&c) ;  
printf ("Сколько заказано? "); scanf ("%d",&ihow_many) ;  
scanf ("%c",&c) ; for(i= 1; i <= ihow_many; i++) printf ("*"); printf ("\n"); } else imore = 0 ;}  
return(0); }  
 
Эта программа предлагает пользователю ввести название товара, и, если не получен признак конца файла [Ctrl+C] (EOF), то название будет прочитано буква за буквой, пока не встретится символ конца строки (генерируется при нажатии клавиши [Enter]). В следующей строке отобразится надпись "Сколько заказано?", после которой необходимо ввести число заказанных единиц товара. Затем в цикле for на экран выводится ряд звездочек, количество которых соответствует введенному числу. При обнаружении признака конца файла программный блок ветви if пропускается и выполняется строка программы в ветви else.  
 
В этой строке устанавливается нулевое значение флага imore, что служит признаком завершения программы.

 
     

Другие другие материалы на сайте по теме: Инструкции выбора в С++. Инструкция if/else.


 

Информация о работе Основные конструкции языка С++.Циклы