15. Вложенные циклы.
Существует возможность организовать цикл внутри тела другого цикла. Такой цикл будет называться вложенным циклом. Вложенный цикл по отношению к циклу в тело которого он вложен будет именоваться внутренним циклом, и наоборот цикл в теле которого существует вложенный цикл будет именоваться внешним по отношению к вложенному. Внутри вложенного цикла в свою очередь может быть вложен еще один цикл, образуя следующий уровень вложенности и так далее. Количество уровней вложенности как правило не ограничивается.
Полное число исполнений тела внутреннего цикла не превышает произведения числа итераций внутреннего и всех внешних циклов. Например взяв три вложенных друг в друга цикла, каждый по 10 итераций, получим 10 исполнений тела для внешнего цикла, 100 для цикла второго уровня и 1000 в самом внутреннем цикле.
Одна из проблем, связанных с вложенными циклами — организация досрочного выхода из них. Для этого есть оператор досрочного завершения цикла(break).
16. Одномерные массивы.
Массив (array) - набор объектов одинакового тип, имеющих одно имя, доступ к которым осуществляется по индексам. Количество индексов определяет размерность.
Размерность Размерность массива — количество индексов, которые необходимо задать одновременно для доступа к элементу массива.
задается константой вот так:
int a[5];
Элементы массива запоминаются в памяти последовательно.
a[0]
a[1]
. . .
a[4]
Если использовать индекс вне заданного диапазона, например a[-2], то это приведет к ссылке на область памяти, не принадлежащую массиву, что может вызвать серьезные ошибки. Если, конечно, такая цель не ставилась.
Реализация ввода элементов массива:
int a[5], i;
for( i=0; i<5; i++ )
{
printf( "\n эл-т %d: ", i );
scanf( "%d", &a[i] );
}
Свойства одномерного массива:
один и тот же тип
все элементы в памяти располагаются друг за другом
индекс первого элемента - 0
имя массива определяет адрес начала массива (адрес первого элемента - const)
Инициализация массива при описании:
int x[4] = { 5, 2, 1, 8 };
// размерность можно не указывать:
int x[] = { 5, 2, 1, 8, 9, 75 };
17. Двумерные массивы.
Элементы многомерных массивов располагаются таким образом, что последний индекс изменяется в первую очередь.
Вот схематично с доски:
[ ] x[0][0]
[ ] x[0][1]
[ ] x[1][0]
[ ] x[1][1]
18. Типовые действия с массивами.
Инициализация с помощью присваивания:
//это типа так? может и так...
int a[5];
a[0] = 11;
a[1] = 25;
. . .
а можно и при инициализации:
int a[5] = { 1, 4, 9, 16, 25 };
Инициализация с помощью функции ввода:
//думаю, имеется ввиду scanf(), getch() или что-то в этом роде:
int a[5], i;
for( i=0; i<5; i++ )
{
printf( "\n эл-т %d: ", i );
scanf( "%d", &a[i] );
}
перестановка элементов (сортировка):
существует дофига способов сортировки, нам давали вот этот:
#include <stdio.h>
main()
{
int i,j,t; // временные переменные
int forsort[10]; // это сам массив
int size=10; // это размер массива
// -------------------------------------
// ввод элементов:
// -------------------------------------
for( i=0; i<size; i++ )
{
printf( "\n forsort[%d]: ", i );
scanf( "%d", &forsort[i] );
}
// -------------------------------------
// сортировка:
// -------------------------------------
for( i=0; i<size-1; i++ )
{
for( j=i+1; j<size; j++ )
{
if( forsort[i] > forsort[j] )
{
t = forsort[i];
forsort[i] = forsort[j];
forsort[j] = t;
}
}
}
// -------------------------------------
// выводим сие чудо:
// -------------------------------------
for( i=0; i<size; i++ )
printf( "\n%d", forsort[i] );
getch(); // чтоб успеть все это прочитать ^^^
return 0; /* а это потому что мейн целый ( main() <=> int main() ) и
он по-хорошему должен что-то возвращать целое. например,
ноль. а можно написать void main() и ничего не возвращать.
*/
}
Характеристики массива:
здесь все проще, чем в сортировке.
#include <stdio.h>
main()
{
int i, j; // временные переменные
int array[10]; // это сам массив
int size = 10; // а это размер массива
int summ = 0;
int max = 0;
int bz = 0;
// -------------------------------------
// ввод элементов:
// -------------------------------------
for( i=0; i<size; i++ )
{
printf( "\n array[%d]: ", i );
scanf( "%d", &array[i] );
}
// -------------------------------------
// считаем сумму:
// -------------------------------------
for( i=0; i<size; i++ )
summ += array[i];
printf( "\nSumm: %d", summ );
// -------------------------------------
// считаем среднее (исходя из суммы):
// -------------------------------------
printf( "\nMean: %f", (float)summ/(float)size );
// -------------------------------------
// находим максимальный элемент
// -------------------------------------
max = array[0];
for( i=0; i<size; i++ )
max = array[i] > max ? array[i] : max;
/*
К.О.: эту фигню наверху можно представить немного
по-другому, а именно:
if( array[i] > max )
max = array[i];
else
max = max;
но, естественно, max = max это не айс, поэтому:
if( array[i] > max )
max = array[i];
вообщем, мой вариант короче, но он мб не всем понятен.
*/
printf( "\nMax: %d", max );
// -------------------------------------
// есть ли в массиве отрицательные числа
// -------------------------------------
bz = 0; // изначально - нет. проверим:
for( i=0; i<size && !bz; i++ )
if( array[i] < 0 )
bz = 1;
printf( "\nElements below zero: %s", bz ? "Found" : "No one" );
/* важный момент:
в проверку добавляем && !bz, чтобы цикл прекратился сразу,
как только найдено хоть одно отрицательное число. так-то.
*/
getch(); // чтоб успеть все это прочитать ^^^ */
return 0;
}