while ((ch=getch ( )) !='q'); /* getchar() – получает символ из потока,
getch() – получает символ с консоли без отображения */
}
Управляющие операторы (break, continue, goto).
Оператор break. Для выхода из цикла до его завершения используется оператор break. Если оператор break находится внутри некоторого вложенного цикла, его действие распространяется только на самый внутренний цикл, в котором он непосредственно находится, этот оператор вызывает немедленный выход из самого внутреннего из объемлющих его циклов или переключателей.
#define n 10
main ( )
{ int B[LIM], i, j;
int A[LIM][LIM];
- - - - - - - - - - - - - -
for (i=0; i<LIM; i++) {
B[i]=0
for (j=0; j<LIM; j++)
if (A[i][j]<0) {
B[i]=1; break; } } }
Оператор continue. Иногда нужно не выходить из цикла, а продолжить ряд операторов в теле цикла и начать его заново. В этом случае можно применить оператор continue. Он вызывает начало следующего итерации объемлющего цикла while, for, do while. В операторах цикла while и do while это означает, что сразу же выполняется проверяющая часть, а в цикле for управление передается на этап повторной инициации.
k=0;
for (i=0;i<LIM; i++)
for (j=0; j<LIM; j++){
if (A[i][j]>0)
continue;
A[i][j]=A[i][j]*A[i][j];
k=k+1; }
Оператор goto. В языке Си в отличие от других языков оператор goto используют редко. Его формат:
goto метка;
где метка – любой идентификатор.
Оператор goto можно использовать, если нужно выйти из вложенного набора циклов при обнаружении каких-то ошибок, например, покинуть сразу два цикла. Оператор break непосредственно нельзя использовать, так как он позволяет выйти только из самого внутреннего цикла.
while (funct>0)
{ for (i=1; i<100; i++)
{ <совокупность операторов>
if (большая ошибка)
goto help;
операторы; }
операторы; }
операторы; }
операторы;
help: устранение ошибки.
Основная литература: 1осн[134-153], 2осн[211-255], 3осн[57-63],
Дополнительная литература: 10доп[28-41]
Контрольные вопросы:
1. В каких случаях используются операторы цикла for, while, do/while?
2. Назовите операцию, которая используется для организации составных операций?
3. В чем заключается различие между операторами while и do/while?
4. В каком случае можно использовать оператор goto, а оператор break нельзя?
5. Какая процедура соответствует конструкции выхода из цикла?
Тема 4. Массивы. Разработка программ с использованием одномерных и двумерных массивов.
Массивы представляют собой структуры данных, состоящие из логически связанных элементов данных одного и того же типа. Массивы являются «статическими» объектами в том смысле, что их размер остается одним и тем же в процессе выполнения программы.
Объявление массивов. Массив является группой ячеек памяти, логически связанных в том отношении, что все они имеют одно и то же имя и один и тот же тип. Для обращения к элементу массива необходимо указать имя массива и номер позиции этого элемента в массиве. Первый элемент в любом массиве имеет нулевой порядковый номер. Номер позиции элемента, содержащейся внутри квадратных скобок ([]), более формально называют индексом. Индекс должен быть целым числом или целочисленным выражением. Скобки, в которые заключается индекс массива, на самом деле рассматриваются в качестве операции языка Си, они имеют тот же самый приоритет, что и круглые скобки. При объявлении массива необходимо указать имя массива, тип каждого элемента и число элементов массива. При помощи одного объявления можно зарезервировать память для нескольких массивов, например:
int b[100], x[27];
В программе, приведенной ниже, используется структура повторения for для инициализации нулями элементов целочисленного массива n из десяти элементов.
/* Инициализация массива */
#include <stdio. h>
main()
{ int n[10], i;
for (i=0; i<=9; i++)
n[i]=0; /* инициализация массива */
for (i=0; i<=9; i++) /* вывод элементов массива */
printf(“%3d%10d\n”, i, n[i]);
return 0; }
Результат программы:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Элементы массива также могут инициализироваться при объявлении массива путем помещения вслед за его объявлением знака равенства и списка (заключенного в фигурные скобки) инициализирующих значений, разделенных запятыми. Программа, приведенная ниже, инициализирует целочисленный массив десятью значениями.
/* Инициализация массива при объявлении */
#include <stdio. h>
main()
{ int i, n[10]={2, 27, 64, 18, 95, 14, 90, 70, 6, 3};
for (i=0; i<=9; i++)
printf(“%3d”, n[i]);
return 0; }
Результат программы:
2 27 64 18 95 14 90 70 6 3
Если инициализирующих значений меньше, чем элементов массива, остающиеся элементы автоматически инициализируются нулями. Например, элементы массива n можно было бы инициализировать нулями посредством объявления
int n[10]={0};
которое явно инициализирует нулем первый элемент и автоматически инициализирует нулями оставшиеся девять элементов, поскольку инициализирующих значений меньше, чем элементов в массиве. Необходимо помнить, что массивы не инициализируются нулями автоматически. Программист должен инициализировать по крайней мере первый элемент, чтобы оставшиеся элементы были автоматически заполнены нулями.
Если размер массива не включается в его объявление со списком инициализирующих значений, то число элементов в массиве будет равно числу элементов в списке инициализации.
Массивы в Си могут иметь несколько индексов. Многомерные массивы часто применяются для предоставления таблиц, состоящих из значений, упорядоченных по строкам и столбцам. Для идентификации конкретного элемента таблицы мы должны указать два индекса: первый, идентифицирующий строку элемента, и второй, идентифицирующий столбец. Такие таблицы или массивы называются двумерными массивами.
Многомерный массив, подобно одномерному, может быть инициализирован при его объявлении. Например, двумерный массив b[2][2] может быть объявлен и инициализирован посредством
int b[2][2]={{1, 2}, {3, 4}};
Значения группируются в фигурных скобках по строкам. Таким образом, 1 и 2 инициализируют b[0][0] и b[0][1], 3 и 4 инициализируют b[1][0] и b[1][1]. Если для данной строки недостаточно инициализирующих значений, оставшиеся ее элементы инициализируются нулями. Таким образом, объявление
int b[2][2]={{1}, {3, 4}};
инициализировало бы b[0][0] единицей, b[0][1] нулем, b[1][0] тройкой и b[1][1] четверкой.
Следующая программа демонстрирует инициализацию двумерных массивов при их объявлении. В программе объявляются три массива с двумя строками и тремя столбцами (каждый состоит из шести элементов). Объявление массива а1 предусматривает шесть инициализирующих значений в двух подсписках. Первый подсписок инициализирует первую строку массива значениями 1, 2 и 3; второй подсписок инициализирует вторую строку массива значениями 4, 5 и 6. Если из списка инициализирующих значений массива а1 убрать фигурные скобки, в которые заключен каждый подсписок, компилятор автоматически проинициализирует элементы первой строки, а затем элементы второй строки. Объявление массива а2 предусматривает пять инициализирующих значений. Инициализирующие значения присваиваются сначала первой строке, затем второй строке. Элемент а2[1][2] инициализирован нулем. Объявление массива а3 предусматривает три инициализирующих значения в двух подсписках. Соответственно элементы а3[0][2], а3[1][1] и а3[1][2] инициализируются нулями. Для вывода элементов каждого массива в программе вызывается функция printarray.
/* Инициализация многомерного массива */
#include <stdio. h>
void printarray(int [][3]);
main()
{ int a1[2][3] = {{1, 2, 3}, {4, 5, 6}}, a2[2][3] = {1, 2, 3, 4, 5}, a3[2][3] = {{1, 2}, {4}},
printf(“Массив А1”);
printfarray(a1);
printf(“Массив А2”);
printfarray(a2);
printf(“Массив А3”);
printfarray(a3);
printf(“\n”);
return 0; }
void printarray(int a[][3]);
{ int i, j;
for (i=0; i<=1; i++)
{ for (j=0; j<=2; j++)
printf(“%d ”, a[i][j]);
printf(“\n”); }
}
Результат программы:
Массив А1
1 2 3
4 5 6
Массив А2
1 2 3
4 5 0
Массив А3
1 2 0
4 0 0
Основная литература: 1осн[223-253], 2осн[244-255]
Дополнительная литература: 10доп[41-46]
Контрольные вопросы:
1. Как осуществляется ввод и вывод одномерного массива?
2. Как осуществляется ввод и вывод двумерного массива?
3. При каком условии можно передать все элементы одного массива другому массиву?
4. Каким образом можно сравнить два массива?
5. Приведите примеры инициализации одномерных и двумерных массивов.
Тема 5. Функции в Си. Создание и использование функций.
В языке Си все программы рассматриваются как функции. Обычно программы на этом языке состоят из большого числа небольших функций. Для каждой из используемых функций приводится описание и определение функции (Описание функции дает информацию о типе функции и о порядке следования параметров. При определении функции указываются конкретные операторы, которые необходимо выполнить). Функции должны иметь тот же тип, что и значения, которые они возвращают в качестве результатов. По умолчанию предполагается, что функции имеют тип int. Если функция имеет другой тип, он должен быть указан и в вызывающей программе, и в самом определении функции.
Рассмотрим описание функций: можно использовать два различных стиля описания функций (классический и современный стиль). В первом случае формат описания функции следующий:
тип имя_функции ();
Эта спецификация описывает имя функции и тип возвращаемого значения.
Современный стиль используется в конструкциях расширенной версии Си, предложенной ANSI. При описании функций в этой версии Си используются специальные средства языка, известные под названием «прототип функции». Описание функции с использованием ее прототипа содержит дополнительно информацию о ее параметрах:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |


