- •Алгоритм.
- •Множественный выбор switch.
- •Оператор do … while ( с постусловием ).
- •Do оператор ;
- •Оператор цикла for.
- •Использование операторов break и continue в циклах.
- •Функции ввода-вывода.
- •Общий вид программы.
- •Вложенные циклы.
- •Адреса и указатели.
- •Массивы.
- •Int a[10] ; // целочисленный вектор из 10 элементов.
- •Векторы.
- •Сортировка вектора.
- •Матрицы.
- •Строки.
- •Подпрограммы.
- •Директива препроцессора #define .
- •Области видимости.
- •Классы памяти.
- •Рекурсия.
- •Подготовка к зачету.
- •Структуры.
- •Int ball [4] ; // описание третьего поля – оценки.
- •Очередь.
- •Линейные списки.
- •Деревья.
- •Int n, k ; // ее размерности
- •Void print ( void ) // печать матрицы
- •Определение методов вне класса.
- •Частные и общие данные.
- •Конструктор.
- •Перегрузка операторов.
- •Неявный указатель *this.
- •Дружественные функции.
- •Класс множество.
- •Наследование.
- •Объекто-ориентированное программирование.
- •Список вопросов к экзамену.
- •Литература.
Адреса и указатели.
Главным объектом нашей работы на этом этапе является переменная. Перед работой с ней определяем ее имя и тип, можем сразу и проинициализировать ее, т. е. задать ей начальное значение. Все это выполняет оператор описания:
int m=10 ;
Каждая переменная имеет еще одну важную характеристику – адрес в памяти, его устанавливает транслятор, выделяя свободную ячейку. Язык С позволяет работать с адресами, именами и значениями любых объектов, в частности переменных.
По имени переменной можно извлечь адрес, используя операцию адресации:
&m – адрес переменной m, целочисленная константа без знака. Символическое изображение этого адреса &m - является константой типа указатель. Опишем переменную типа указатель:
int *pm , k ; // описание типа переменной pm означает, если взять значение расположенное по
// этому адресу, то оно будет целым. Осуществляет эту операцию *pm.
pm=&m ; // адрес целой переменной m присваивается переменной типа указатель pm.
k=*pm ; // извлекается значение, лежащее по адресу помещенному в pm и присваивается
// переменной k. Переменные m и k имеют одно и тоже значение.
Мы уже встречались с адресацией в операторе:
scanf (“%d” , &a) ;
В подпрограмму с именем scanf передается адрес незаполненной переменной, где по этому адресу будет помещено значение, введенное с экрана.
Еще раз сформулируем операции получения адреса и значения.
& - операция получения адреса, если за этим знаком следует имя переменной.
* - операция косвенной адресации ( обратная к извлечению адреса ), когда за этим знаком следует
указатель на переменную. Результатом является значение, извлеченное по данному адресу.
Распечатать адрес можно как целую переменную без знака, используя спецификацию %u.
printf (“%u” , pm) ; или так printf (“%u” , &m) ;
Массивы.
Массив – набор перенумерованных переменных одного типа, обозначенных одним именем.
Еще одно более сложное определение:
Массив - именованная структура данных прямого доступа.
Прямой доступ означает, что по указанному номеру можно извлечь сразу любой элемент.
Одномерный массив – вектор. Двумерный – матрица.
Описание массива:
Int a[10] ; // целочисленный вектор из 10 элементов.
float b[5][7] ; // вещественная матрица из 5 строк и 7 столбцов.
В памяти любые массивы располагаются последовательно и непрерывно. Матрицы располагаются цепочкой по строкам.
Существуют массивы и большей размерности 3-х, 4-х мерные, но используются они очень редко.
Представить себе такой массив легко, как набор перенумерованных книг. Укажем номер книги, страницы, строки и столбца, получим нужную информацию.
Работают с массивом, указывая его элементы – a[5] b[0][3].
Имя массива определяет адрес его нулевого элемента:
a одно и тоже с &a[0]
a+5 одно и тоже с &a[5]
*(a+5) одно и тоже с a[5].
Векторы.
Поработаем сначала с одномерными массивами.
Вектор можно проинициализировать:
int x[10]={ 1, 4, -6, 8, -1, 0, 0, 32, 100, -1} ;
Mожно описать и ввести с экрана:
int x[10] , i ;
for (i=0 ; i<10 ; i++)
scanf(“%d” , &x[i]) ;
Очень полезна эхо-печать:
for (i=0 ; i<10 ; i++)
printf(“%d ” , x[i]) ;
Обратите внимание, что отсчет элементов в любом массиве идет с 0, а не с 1. В нашем векторе 10 элементов, но первый – x[0], а последний –x[9].
Рассмотрим задачу: вычислить 10 чисел Фибоначчи.
, , .
int a[10] , i ;
a[0]=1 ; a[1]=1;
for (i=0 ; i<=7 ; i++)
a[i+2]= a[i]+a[i+1];
for (i=0 ; i<=9 ; i++)
printf(“%d ” , a[i]) ;
Еще одна задача: найти в векторе нулевой элемент, удалить его и придвинуть «хвост».
int dan[10]={5, 4, 7, -1, 0, 9, 4, -10, 9, 2} ;
int i=0 , k ;
while (dan[i]!=0) i++ ;
for ( k=i ; k<9 ; k++)
dan[k]=dan[k+1] ;
for ( k=0 ; k<=9 ; k++)
printf(“%d ” , dan[k]) ;
Вопросы: 1) Какая возникнет ошибка при «плохих» исходных данных – в векторе нет нуля?
2) Как изменится программа, если нужно задвинуть все имеющиеся нули?