Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 25.11.2008 | Доступ: свободный | Студентов: 9229 / 1177 | Оценка: 4.06 / 3.66 | Длительность: 21:16:00
Лекция 6:

Основные синтаксические конструкции языка C

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

5.8. Дополнительные операторы управления циклом

К числу дополнительных средств управления циклами относятся операторы break (от англ. – прервать) и continue (от англ. – продолжить).

С помощью оператора break организуется досрочное окончание цикла с передачей управления оператору, следующему непосредственно за концом цикла. Пусть, например, нам предстоит суммирование элементов массива a до тех пор, пока не встретится первое отрицательное значение:

for(s=0,j=0; j<n; j++)
    { if(a[j]<0) break;
      s += a[j];
    }

Однако если оператор break употреблен во внутреннем цикле, то с его помощью нельзя выйти за пределы внешнего даже в том случае, когда кажется, что тело внешнего цикла кончается там же, где и тело внутреннего. На самом деле, в конце каждого цикла незримо присутствуют системные вставки, обеспечивающие нормальный выход из цикла. В частности, такие вставки возвращают память, выделенную под переменные, объявленные в заголовке цикла. Кроме того, здесь же находятся команды, возвращающие управление в начало цикла при необходимости повторения итераций.

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

for(s=0.0,j=0,k=0; j<n; j++)
    { if(a[j]<=0) continue;
      s += a[j];
      k++;  //счетчик количества положительных слагаемых
    }
  if(k>0) s=s/k;

5.9. Оператор выбора (переключатель)

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

cin >>x>>y;	//ввод операндов
  cin >> ch;	//ввод символа операции
  if(ch=='+') {z=x+y; goto m;}
  if(ch=='-') {z=x-y; goto m;}
  if(ch=='*') {z=x*y; goto m;}
  if(ch=='/' && y!=0) {z=x/y; goto m;}
  cout << "Эта операция не определена"<<endl;
  z=0;
m:
  cout << "Result="<<z<< endl;

Примерно такую же функциональность обеспечивает фрагмент программы с переключателем switch:

cin >>x>>y;	//ввод операндов
  cin >> ch;	//ввод символа операции
  switch(ch)
  {
    case '+': z=x+y; break;
    case '-': z=x-y; break;
    case '*': z=x*y; break;
    case '/': if(y!=0) {z=x/y; break;}
    default : cout << "Эта операция не определена"<<endl; z=0;
  }
  cout << "Result="<<z<< endl;

После служебного слова switch (от англ. – переключатель) в круглых скобках записывается переключающее выражение, которое может быть целочисленным или символьным. Тело переключателя всегда является составным оператором и заключается в фигурные скобки. Вслед за служебным словом case (от англ. – случай) записывается константа, с которой сравнивается значение переключающего выражения. Если совпадение обнаружено, то управление передается оператору, отделенному от константы двоеточием. На его месте может оказаться либо один оператор, либо цепочка операторов. И в том, и в другом случае эти действия должны завершаться оператором break, передающим управление оператору, расположенному вслед за переключателем.

Если значение переключающего выражения не совпадает с указанной константой, то из тела переключателя выбирается следующая строка, начинающаяся со служебного слова case, и проверки продолжаются. Самой последней строкой переключателя может быть строка, начинающаяся со служебного слова default. На нее управление попадает только в том случае, когда значение переключающего выражения не совпадает ни с одной из предусмотренных констант. В этом случае выполняются операторы, отделенные от слова default двоеточием. В переключателе может и не быть строки с непредусмотренной ситуацией, тогда в случае несовпадения значения переключающего выражения ни с одной из заданных констант переключатель ничего не делает, т.е. срабатывает как пустой оператор.

Отсутствие оператора break в качестве завершающего действия какой-либо группы приведет к тому, что начнут выполняться операторы, принадлежащие следующей группе (в этом случае никакой проверки на совпадение со следующей константой уже не происходит – часть следующей строки "case c:" просто игнорируется).

5.10. Обращения к функциям

Обращение к функциям, не возвращающим значение, выглядит следующим образом:

namef(a1,a2,...);

Здесь

  • namef – имя вызываемой функции;
  • a1, a2, ... – список фактических параметров

Если формальный параметр в заголовке функции объявлен как значение, то соответствующим ему фактическим параметром может быть выражение такого же типа. Если формальный параметр объявлен как указатель, то на месте соответствующего ему фактического параметра может находиться только адрес данного такого же типа. Исключение составляют формальные параметры, объявленные с помощью нетипизированного указателя void *, им могут соответствовать адреса переменных любого типа. Для одиночных (скалярных) переменных адрес формируется из имени переменной с предшествующим ему символом &. Для массивов адресом считается имя массива. Например:

char str[80];
  int x;
........
  scanf("%d %s",&x,str);

Однако если нам предстоит ввод в определенный элемент массива, то нужно указывать его адрес. Например, &str[5] или str+5:

scanf("%c",&str[5]);
  scanf("%c",str+5);

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

void swap(int &a,int &b)
{ int tmp=a;
  a=b; b=tmp;
}
..........
  swap(x,y);

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

y=a*fin1(x,-2)+b;

В этом случае сначала будет вычислено значение операнда fin1(x,-2), которое затем будет использовано при подсчете значения выражения.

Второй вариант заключается в игнорировании возвращаемого значения. Пример подобного рода – использование функции scanf. Вообще говоря, кроме своей основной миссии (ввод данных, поступающих с терминала), она возвращает количество полей ввода, обработанных без ошибок. Для организации тщательного контроля за вводимыми данными это значение может оказаться полезным. Однако в большинстве практических программ на языке C вы вряд ли обнаружите обращение следующего вида:

k=scanf("%d %s",&x,str);

5.11. Комментарии в программах

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

В языках C, C++ предусматривается две разновидности комментариев – многострочные и однострочные.

Многострочные комментарии начинаются с пары символов " /* " и заканчиваются такой же парой, записанной в обратном порядке – " */ ". Комментарий подобного рода вовсе не обязан содержать несколько строк. Он, в частности, может находиться в любом месте программной строки, например, для исключения из рассмотрения компилятора фрагмента формулы:

y=sin(/*x+*/0.25)*q;

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

Однострочный комментарий начинается вслед за парой символов " // " и продолжается до конца программной строки. Обычно с его помощью записывается комментарий к текущей строке или исключается фрагмент текущей строки из области обслуживания компилятором.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Alexey Ku
Alexey Ku

Попробуйте часть кода до слова main заменить на 

#include "stdafx.h" //1

#include <iostream> //2
#include <conio.h>

using namespace std; //3

Александр Талеев
Александр Талеев

#include <iostream.h>
#include <conio.h>
int main(void)
{
int a,b,max;
cout << "a=5";
cin >> a;
cout <<"b=3";
cin >> b;
if(a>b) max=a;
else max=b;
cout <<" max="<<max;
getch();
return 0;
}

при запуске в visual express выдает ошибки 

Ошибка    1    error C1083: Не удается открыть файл включение: iostream.h: No such file or directory    c:\users\саня\documents\visual studio 2012\projects\проект3\проект3\исходный код.cpp    1    1    Проект3

    2    IntelliSense: не удается открыть источник файл "iostream.h"    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    1    1    Проект3

    3    IntelliSense: идентификатор "cout" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    6    1    Проект3

    4    IntelliSense: идентификатор "cin" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    7    1    Проект3

при создании файла я выбрал пустой проект. Может нужно было выбрать консольное приложение?

 

 

 

Александр Штефанов
Александр Штефанов
Беларусь, Гомель, Белорусский университет транспорта
Gulyora Satqulova
Gulyora Satqulova
Ангилья, London