Контрольные вопросы для подготовки и самостоятельной работы
1 Дайте определение указателю.
2 Какой синтаксис объявления указателя?
3 С какими модификаторами может быть использован указатель?
4 Чем отличается (*) в объявлении указателя и в выражении, где он используется?
5 Что такое операция обращения по адресу?
6 Что такое операция взятия адреса?
7 Как бы Вы присвоили адрес переменной с плавающей точкой salary указателю с именем pt_sal?
8 Обязательно ли инициализировать указатель при его объявлении?
9 В чём особенности использования указателя на тип void?
10 Для чего применяется константа NULL?
11 Что такое динамическое выделение памяти, где она выделяется и с помощью каких функций?
12 Можно ли присваивать указатели одного типа?
13 Как осуществить приведение типа указателя?
14 Объясните примеры, приведенные в теоретической части.
Лабораторная работа №9
Массивы. Селективная обработка массивов
(2 часа)
Цель работы: изучить работу с массивом как с составным типом данных, приёмы ввода и вывода данных, обработку одномерных массивов.
Теоретические сведения
Массив - это набор объектов (элементов) одинакового типа, доступ к которым осуществляется прямо по индексу в массиве. Обращение к массивам в С реализовано с помощью указателей (pointers).
Массив в С можно объявить следующим образом:
[Класс_памяти>] <Тип_данных> <Имя_массива> [<Размер_массива>];
<Размер_массива> может быть задан константным выражением.
Доступ к элементам массива происходит следующим образом:
<Имя_массива>[<Значение_индекса>], т.е., используя имя массива и индекс от 0 до (<Размер_массива> -1), т.е. на единицу меньше, чем < Размер_массива>.
|
Пример объявления массива:
char name[20];
int grad[125];
float b[30];
Массив имеет имя (name), которое является указателем на тип элементов массива и адресует первый элемент с индексом (Æ). Имя массива фактически является константным указателем, ссылающимся на начальный адрес данных, с которого расположен сам массив и может быть использовано как указатель. Обращение к элементам может осуществляться следующим образом name[0] -1-ый элемент массива, name[1]- 2-ой элемент, name[19] – последний 20-ый элемент.
При трансляции программы компилятор отводит место под объявленный массив статически, т.е. в области данных участок памяти, выделенный для массива, не может быть динамически изменен. Размер выделяемой памяти под массив можно определить по следующей формуле:
(sizeof(тип)*<Размер_массива>) байтов.
Массив размещается последовательно в памяти, т.е. каждая следующая ячейка расположена сразу после предыдущей.
В С не включены стандартные операторы, которые осуществляют работу с массивами, как стандартными типами данных. Чтобы скопировать данные из одного массива в другой необходимо организовать функцию, тело которой должно иметь примерно следующий вид:
for(i=0; i<rasm; i++) mas2[i] = mas1[i];
где rasm - размер массивов, соответствующий указанному в их объявлении
# define rasm 20
int mas2[rasm], mas1[rasm];
Пример
/* ЗАНЯТИЕ N 9
Выполнил студент группы......... Петров Ю.В.
Применение массивов при работе с переменными
различных типов (int,float), изменение значений
переменных. Примеры приемов работы с массивами */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 15
#define M 10
|
int p[N], x[N], i, j, j1, count=0;
int y[N*2], z[N]={15,37,10,-20,-10,25,27,30,89,67,\
24,-6,22};
int *pi=y; //Два последних элемента z[N] равны 0
float *pf, mf[N];
void main()
{ clrscr(); randomize();
pf=mf;
printf("Исходный массив p[]: \n");
for (i=0;i<N;i++)
{ p[i]=random(81)-40; //Инициализация с помощью функции
printf("%4d",p[i]); //random() в интервале +40...-40
if (p[i]>0) //Выбор элементов >0 в массив х[]
{ x[count]=p[i];
mf[count]=x[count]/5.5;
count++;
}
}
printf("\n");
printf("Исходный массив z[j]: \n");
for (i=0;i<N;i++) printf("%4d",z[i]);
printf("\nРабочий массив x[count]>0 из p[i]: \n");
for (i=0;i<count;i++) printf("%4d",x[i]);
j=0;//Выбор элементов в массив у[] из z[] и р[] по условиям
for (i=0;i<N;i++)
{if (z[i]>=-M && z[i]<=(M+N) && (z[i]%2==0))
{ *pi = z[i]; pi++; j++;}
if (p[i]>=-M && p[i]<=(M+N) && (p[i]%2==0))
{ *(y+j)=p[i]; pi++; j++;}
}
j1=j;
printf("\nРабочий массив y[j] из z[i] и р[i] по условиям \n");
printf(" -M<y[j]<(M+N) и четное:\n");
for (i=0;i<j1;i++) printf("%4d",y[i]);
printf("\nРабочий массив mf[j]=x[j]/5.5 \n");
for (i=0;i<count;i++) printf("%6.4f ",*(pf+i));
//Сортировка массива x[]
for (i=0;i<count;i++)
for (j=i;j<count;j++)
if (x[i]<x[j])
{int c=x[i];x[i]=x[j];x[j]=c;
}
else continue;
//Сортировка массива у[]
for (i=0;i<j1;i++)
for (j=i;j<j1;j++)
if (y[i]<y[j])
{int c=y[i];y[i]=y[j];y[j]=c;
}
else continue;
printf("\nСортированный массив x[]: \n");
for (i=0;i<count;i++)
printf("%4d",x[i]);
printf("\nСортированный массив y[]: \n");
for (i=0;i<j1;i++)
printf("%4d",y[i]);
getch();
}
/*
Исходный массив p[]:
32 37 -34 11 30 8 -11 -38 6 -21 -27 -23 -30 -19 -29
Исходный массив z[j]:
15 37 10 -20 -10 25 27 30 89 67 24 -6 22 0 0
Рабочий массив x[count]>0 из p[i]:
32 37 11 30 8 6
Рабочий массив y[j] из z[i] и р[i] по условиям
-M<y[j]<(M+N) и четное:
10 -10 8 6 24 -6 22 0 0
Рабочий массив mf[j]=x[j]/5.5
5.8182 6.7273 2.0000 5.4545 1.4545 1.0909
Сортированный массив x[]:
37 32 30 11 8 6
Сортированный массив y[]:
24 22 10 8 6 0 0 -6 -10 */
|
Ход работы
1 Изучить теоретические сведения.
2 В соответствии с индивидуальным заданием разработать алгоритм инициализации массива, селективной обработки массива.
3 Разработать и набрать программу, отладить её на компьютере, изучить работу операторов.
4 Получить результаты.
5 Оформить отчет.
6 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.