For (выражение1; выражение2; выражение3)

оператор1;

где выражение1, выражение2, выражение3 – необязательные элементы.

Оператор цикла for работает следующим образом:

1) вычисляется выражение1, если оно присутствует;

2) вычисляется выражение2, если оно присутствует. Если полученное значение нуль, то цикл прекращается, в противном случае выполняется тело цикла – ²оператор1²;

3) вычисляется выражение3, если оно присутствует;

4) переход к пункту 2.

Например,

// тело цикла – пустой оператор

for ( i=0; i<100; i++ );

// бесконечный цикл

for ( ; ; ) s = 0;

// бесконечный цикл

for ( i=10; i>6; i++ ) s = 0 ;

Пример. Найти произведение f = 200*198*196*….*2:

# include <stdio.h>

void main() {

int i, f = 1;

for ( i = 200; i >=2; i -= 2) f * = i;

printf(²f = %d², f);}

Синтаксис оператора цикла while имеет вид:

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

Оператор цикла while выполняет следующие действия:

· cначала вычисляется выражение в круглых скобках;

· если полученное значение не равно нулю, то выполняется ²оператор1², представляющий собой тело цикла, в противном случае цикл прекращается.

Является циклом с предусловием (решение о прохождении цикла принимается до выполнения тела цикла).

Пример. Даны натуральные числа: 1,2, 3, …. n. Найти сумму чисел, кратных 3.

# include <stdio.h>

void main( )

{

int i, n, s ;

printf (²Введите n\n ²);

scanf ( ²%d², &n);

i=1; s = 0;

while ( i <= n)

{

if ( i % 3 == 0 ) s += i; i ++ ;

}

printf ( “\n s=%d” , s );

}

Синтаксис оператора цикла do…while следующий:

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

Оператор цикла do…while является циклом с постусловием, так как проверка выражения в круглых скобках осуществляется после выполнения тела цикла – ²оператора1².

Цикл do…while прекращается, когда выражение в круглых скобках станет равным нулю.

Тело цикла do…while будет выполнено хотя бы один раз.

Пример. Вычислить n! = 1*2*3*…..*n;

# include <stdio.h>

void main( )

{

int i, n, k ;

printf (²Введите n\n ²);

scanf ( ²%d², &n);

i=1; k=1;

do

{ k *= i; i ++ ; }

while ( i <= n);

printf ( “\n n!=%d” , k );

}

Оператор switch

Оператор switch, как и условные операторы, используется для ветвления программы в зависимости от значения некоторого выражения.

Синтаксис этого оператора имеет вид:

Switch (выражение)

{ case выражение 1: операторы_1;

case выражение 2: операторы_2;

case выражение n: операторы_n

default: операторы_d; }

где выражение 1, выражение 2,..., выражение n – константные выражения целого типа.

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

Если не будет обнаружено ни одного совпадения, то выполняется оператор(ы) в цепи, помеченной ключевым словом default.

Впрочем, последняя может и отсутствовать в операторе switch. Работа переключателя приведена на рисунке 2.4.

For (выражение1; выражение2; выражение3) - student2.ru

Рис. 2.4. Схема работы оператора switch

Операторы прерывания break и continue

Оператор прерывания break имеет следующий вид:

break;

Оператор прерывает выполнение операторов while, do, forиswitch и передает управление следующему за ними оператору.

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

В отличии от оператора break оператор прерывания continue прерывает не выполнение самих операторов while, doили for, а только их текущую итерацию и имеет вид:

continue;

Пример

По номеру дня недели напечатать его название.

# include <stdio.h>

void main( )

{ int n ;

printf (²Введите номер дня недели \n ²);

scanf ( ²%d², &n);

switch (n)

{ case 1: printf (²Понедельник²); break;

case 2: printf (²Вторник²); break;

case 3: printf (²Среда²); break;

………………………………………

………………………………………

case 7: printf(²Воскресенье²); break;

default: printf(²Неверный номер дня недели²); }

}

Оператор break используется здесь для исключения последующих функций printf() после первого совпадения значения переменной n с константами 1, 2,…7.

Блок-схема оператора switch для решения вышеуказанной задачи приведена ниже.

For (выражение1; выражение2; выражение3) - student2.ru

Пример

Напечатать таблицу умножения.

# include <stdio.h>

void main()

{

int i, j ;

for ( i=1; i<10; i++ )

{

for ( j=1; j<10; j++ )

printf (“%d*%d=%2d\t “, i, j, i*j ) ;

printf (“\n”) ;

}

}

For (выражение1; выражение2; выражение3) - student2.ru

Массивы

Массив – это упорядоченная совокупность однородных компонент.

Массивы описываются следующим образом:

тип имя_массива [размер] ;

где: тип – определяет тип компонент массива,

размер – выражение целого типа, определяющее количество компонент описываемого массива.

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

При описании массивы могут быть инициализированы, например,

float m[5] = {1.2, 3.01, 0.2, -1.1, 5.0};

Возможно и такое описание массива:

int m[ ] = { 1, 4, 2, 3, 7, 3 } ;

В соответствии с синтаксисом в языке Си существуют только одномерные массивы, однако элементами одномерного массива, в свою очередь, могут быть массивы. Поэтому двумерный массив определяется как массив массивов.

Аналогично определяются многомерные массивы. Стандарт языка Си требует, чтобы транслятор мог обрабатывать определения массивов с размерностью до 31.

Например, конструкция float b[5][3]; описывает двумерный массив с именем b, содержащий пять элементов, каждый из которых содержит по три элемента..

Инициализирование двумерных массивов может быть различным:

int a[2][3] = { 1, 5, 6, 9, 7, 8 } ;

int a[2][3] = {{ 1, 5, 6}, {9, 7, 8}} ;

int a[ ][ ] = {{1, 5, 6}, { 9, 7, 8}} ;

Одномерные массивы символов представляют собой строки. Строки должны заканчиваться специальным нуль-символом ¢\0¢.

Инициализация строки может осуществляться по-разному:

char s1[ 6] = {¢L¢, ¢i¢, ¢n¢, ¢u¢, ¢x¢, ¢\0¢};

char s1[ 6] = ²Linux²;

Для ввода массивов используются циклы for.

1) Одномерные массивы:

float a[7] ; int i ;

for ( i=0; i<7; i++ )

{ printf (“ a[%d] = ”, i+1) ;

scanf (“ %f “, &a[i] ) ; }

2) Двумерные массивы:

float a[4][5] ; int i , j ;

for ( i=0; i<4; i++ )

for ( j=0; j<5; j++ )

{ printf (“ a[%d][%d] = ”, i+1, j+1) ;

scanf (“ %f ”, &a[i][j] ) ; }

3) Ввод строк:

a) char str[20] ; scanf ( “ %s “, str ) ;

b) char str[20] ; gets ( str ) ;

В первом случае ввод идет до первого пробела, во втором – можно вводить и пробелы, конец ввода определяется нажатием клавиши “Enter”.

Пример

Вычислить среднее геометрическое положительных элементов целочисленного массива X[12].

void main()

{

int X[12], i, k=0; float sg=1;

for ( i=0; i<12; i++ )

{ printf (“ X[%d] = ”, i+1) ;

scanf (“ %d “, &X[i] ) ;

if (X[i] >0 ) { sg *= X[i] ; k++ ; }

}

sg = pow (sg , 1./k ) ;

printf (“среднее геометрическое = %f “, sg);

}

For (выражение1; выражение2; выражение3) - student2.ru

Пример

Найти сумму целых положительных чисел, меньших 50 и кратных 4 из целочисленного массива С[3][7].

void main()

{

int С[3][7], i, j, s=0;

for ( i=0; i<3; i++ )

for ( j=0; j<7; j++ )

{ printf (“ C[%d][%d] = ”, i+1, j+1 ) ;

scanf (“ %d “, &C[i][j] ) ;

if ( C[i][j] >0 && C[i][j]<50 && C[i][j]%4==0 )

s + = C[i][j] ;

}

printf (“сумма = %d “, s ) ;

}

For (выражение1; выражение2; выражение3) - student2.ru

Функции

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

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

Определение функции содержит:

тип_функции имя_функции (спецификация_формальных параметров)

{ определения_объектов;

исполняемые_операторы;

}

При этом имеет место следующее:

1. Формальные параметры могут отсутствовать.

2. Тело функции – это составной оператор или блок.

3. Переменные, объявленные в теле функции, являются локальными; переменные, объявленные вне функций, являются глобальными.

4. Определения функций не могут быть вложенными.

5. В теле функции может использоваться оператор return для возврата из функции результата. Оператор return может вернуть не более одного значения.

6. Тип функции определяется типом, возвращаемого ею значения. Если функция не вырабатывает значения, то она должна быть объявлена типом void. Если тип функции не объявлен, то по умолчанию она имеет тип int.

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

8. Обращение к функции (иначе говоря, вызов функции) имеет вид:

имя_функции (список фактических параметров)

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

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

9. Функция может иметь несколько операторов return. Например,

float min (float a, float b)

{ if (a<=b) return a; else return b; }

Пример.

Вычислить среднее значение функции y(x)=5x3 + x2 + x в точках a, b, (a+b)/2, где a = 3, b = 4.

Программу можно составить двумя способами: 1) без использования прототипа функции; 2) с использованием прототипа:

Способ.

# include <stdio.h>

# include <math.h>

float y( float x )

{ return 5* pow( x, 3 ) + x * x + x ; }

void main( )

{

float a = 3, b = 4, s = 0 ;

s = ( y(a) + y(b) + y((a+b)/2) ) / 3. ;

printf( “среднее значение y(x) равно %f “, s);

}

Способ.

# include <stdio.h>

# include <math.h>

/*Прототип функции y(x) */

float y( float x ) ;

void main( )

{

float a = 3, b = 4, s ;

s = ( y(a) + y(b) + y((a+b)/2) ) / 3. ;

printf(“среднее значение y(x) равно %f “, s );

}

float y( float x )

{ return 5* pow( x, 3 ) + x * x + x ; }

Блок-схема для каждой функции чертится отдельно. Для вызова функции используется блок «предопределенный процесс».

For (выражение1; выражение2; выражение3) - student2.ru For (выражение1; выражение2; выражение3) - student2.ru

Пример (параметрами функции являются одномерные массивы).

Заданы три случайные величины X [5] , Y [7], Z [9]. Используя функцию для расчета математического ожидания, найти математические ожидания заданных случайных величин.

Для расчета математического ожидания используется следующая формула: For (выражение1; выражение2; выражение3) - student2.ru

# include <stdio.h>

float mo( float A[ ], int n )

{

int i;

float s=0;

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

s+=A[ i ] ;

s \ = n;

return s;

}

void main( )

{

float mx, my, mz, X[5] = {3,4,5.3,2,4.1},

Y[7] = {4,5,5,3,4,3,7},

Z[9] = {5,6,5,7,6,7,5,6,4 } ;

mx = mo( X, 5 );

my = mo( Y, 7 );

mz = mo( Z, 9 );

printf ( “мат.ожидание X равно %f “, mx ) ;

printf ( “мат.ожидание Y равно %f “, my ) ;

printf ( “мат.ожидание Z равно %f “, mz ) ;

}

For (выражение1; выражение2; выражение3) - student2.ru For (выражение1; выражение2; выражение3) - student2.ru

ДОМАШНЕЕ ЗАДАНИЕ

Наши рекомендации