- •5В070300 «Информационные системы»
- •Введение
- •Содержание отчета
- •Лабораторная работа № 1
- •1 Порядок выполнения лабораторной работы:
- •Постановка задачи
- •Методические указания
- •2 . Пример
- •Лабораторная работа № 2
- •1 Содержание работы
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •2. Пример
- •Лабораторная работа№ 3
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •Часть вторая: Оператор выбора
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •Группа а Таблица 7
- •Группа в
- •2. Примеры
- •Лабораторная работа№ 4
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •2 Примеры
- •For (выражение1; выражение2;выражение3) {операторы; }
- •Лабораторная работа№ 5
- •1 Порядок выполнения лабораторной работы:
- •Задание
- •2. Примеры
- •3. Сортировка элементов массива
- •Сортировка выбором
- •3.2. Сортировка вставкой
- •3.3. Сортировка методом прямого выбора
- •3.4. Сортировка методом обмена
- •4. Указатели и одномерные массивы
- •Лаборатоная работа № 6
- •1 Порядок выполнения лабораторной работы:
- •2. Методические указания
- •3. Указатели и двумерные массивы
- •Лабораторная работа № 7
- •1 Порядок выполнения лабораторной работы:
- •Задание на строки
- •2.Краткие теоретические сведения
- •Лаборатоная работа № 8
- •1 Порядок выполнения лабораторной работы:
- •2. Теоретические сведения
- •Год рождения – 1978
- •Лабораторная работа № 9
- •1 Порядок выполнения лабораторной работы:
- •2. Примеры
- •Лабораторная работа № 10
- •1 Порядок выполнения лабораторной работы:
- •1.3. Задание для выполнения
- •2. Примеры
- •Лабораторная работа № 11
- •1 Порядок выполнения лабораторной работы:
- •1.3. Задание для выполнения
- •Лабораторная работа № 12
- •1 Порядок выполнения лабораторной работы:
- •2. Краткие теоретические сведения Объектно-ориентированный подход
- •Сущности и Объекты
- •Система типов
- •Инкапсуляция
- •Пример класса
- •Создание объектов. Конструкторы и деструктор
- •Наследование
- •Перегрузка функций
- •Полиморфизм
- •Функции-друзья
- •Абстрактные классы
- •Дополнительные возможности
- •Индивидуальные задания
- •2.1. Пример решения задания
- •Int windForce; // Сила ветра в баллах
- •Int startHeight; // Начальная высота
- •Int fuel; // Запас топлива
- •Результат выполнения программы:
- •Разновидности списков
- •Контрольные вопросы
- •Задание
- •Литература
- •Лабораторная работа № 9 Тема: Множества в Паскале.
- •Общие сведения
- •Лабораторная работа № 8 Тема: Применение записей в составлении программ.
- •Теоретические сведения
- •Задание
- •Контрольные вопросы.
- •Литература.
- •Список использованной литературы
4. Указатели и одномерные массивы
Указатель – это переменная, которая содержит адрес переменной. Так как указатель – это адрес некоторого объекта, то через него можно обращаться к данному объекту.
В СИ существует тесная связь между указателями и массивами. Любой доступ к элементу массива, осуществляемый операцией индексирования, может быть выполнен при помощи указателя.
Декларация
int a[10];
определяет массив а размера 10, т.е. блок из десяти последовательных объектов, представленных на рисунке, с именами a[0], a[1], … ,a[9].
З
апись
a[i] отсылает нас к i-му элементу массива.
Если ра есть указатель, т.е. определен
как
int *pa; , то в результате присваивания
pa = &a[0];
pa будет указывать на нулевой элемент массива а; иначе говоря, ра будет содержать адрес элемента a[0] (см. рис.). Теперь присваивание
x=*pa;
будет копировать содержимое а[0] в х.
Если ра указывает на некоторый элемент массива, то ра+1 по определению указывает на следующий элемент (см. рис.).Таким образом, если ра указывает на a[0], то *(ра+1) есть содержимое a[1], ра+1 – адрес a[1], *(ра+i) – содержимое a[i].
Поскольку имя массива есть не что иное как адрес его начального элемента, присваивание
pa=&a[0];
можно также записать в следующем виде:
pa = a;
Так как ра – указатель , то в выражениях его можно использовать с индексом, то есть запись pa[i] эквивалентна записи *(pa+i). Элемент массива одинаково разрешается изображать и в виде указателя со смещением, и в виде имени массива с индексом.
Между именем массива и указателем, выступающим в роли имени массива, существует одно различие. Указатель – это переменная, поэтому можно написать pa=a или pa++. Но имя массива не является переменной, и запись типа a=pa не допускается.
Следует также различать выражения *(a+2) и *a+2:
*(а+2) – значение третьего элемента массива а;
*а+2 – добавление числа 2 к значению первого элемента массива.
Пример 4.1. Вывести значения одномерного массива обычным способом и с использованием указателей.
Фрагмент программы:
/*объявление и инициализация массива*/
int a[6]={10,20,30,40,50,60};
int i, *p;
/*вывод массива обычным способом*/
for (i=0;i<6;i++)
Label1->Caption=Label1->Caption+IntToStr(a[i])+" ";
p=a;
/*вывод массива с использованием указателя*/
for (p=&a[0];p<=&a[5];p++)
Label2->Caption=Label2->Caption+IntToStr(*p)+" ";
/*еще один вариант с использованием указателя*/
for (p=&a[0],i=0;i<6;i++)
Label3->Caption=Label3->Caption+IntToStr(p[i])+" ";
Дадим еще некоторые пояснения. Операция р++ увеличивает значение указателя на единицу. Если p=&a[i], то после операции р++ в р содержится адрес элемента a[i+1].
Пример 4.2. Найти среднее арифметическое массива, состоящего из шести элементов, с использованием указателя.
int a[6]={10,20,30,40,50,60};
int i, *p;
float s;
p=a; /*указатель получает значение адреса нулевого элемента массива*/
for (s=0,i=0;i<6;i++)
s+=*(p+i); /*получение суммы элементов массива*/
s=s/6; /*среднее арифметическое массива*/
Label1->Caption=Label1->Caption+FloatToStr(s)+" ";
Пример 4.3. Задан одномерный массив S, состоящий из десяти элементов вещественного типа. Вывести значения элементов этого массива в обратном порядке.
Операция р++ увеличивает значение указателя на единицу. Если p=&a[i], то после операции р++ в р содержится адрес элемента a[i+1].
{int s[10];
int *p, i;
randomize();
/*заполнение массива случайными числами*/
for (i=0;i<10;i++)
StringGrid1->Cells[i][0]=IntToStr(rand () % 99 - 25);
/*вывод элементов массива*/
for (i=0; i<10;i++)
s[i]=StrToInt(StringGrid1->Cells[i][0]);
p=&s[9]; /*указатель получает значение адреса последнего элемента массива*/
/*вывод элементов в обратном порядке*/
for (i=0; i<10;i++)
StringGrid2->Cells[i][0]=*(p-i);
/* вывод элементов в обратном порядке другим способом */
for (i=0, p=&s[9]; p>=&s[0]; p--, i++)
StringGrid3->Cells[i][0]= *p;
}
Пример 4.4. Вывести на экран значения нулевого, второго и четвертого элементов массива.
{ /*объявление и инициализация массива а*/
int a[]={10,20,30,40,50,60};
int *p, i;
/*вывод значений нулевого, второго и четвертого элементов*/
for (p=a, i=0; p+i<=a+4; p++, i++)
Label1->Caption= Label1->Caption + *(p+i) + " "; }
В цикле происходит одновременное увеличение указателя р и индекса i на единицу, вследствие чего на экран после нулевого элемента выводится второй, и затем четвертый.
