Методические указания для выполнения лабораторных работ и курсовой работы содержание

Вид материалаМетодические указания

Содержание


6Лабораторная работа № 5. Работа с указателями
3. Варианты заданий
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   12

6Лабораторная работа № 5. Работа с указателями


1. Цель работы


Цель работы – получить навыки работы с указателями в программах на языке «С».
  1. Указатели

Общие сведения

Указатель-это адрес памяти, распределенной для другой переменной. Если переменная объявлена как указатель, она может хранить адрес и таким образом указывать на другое значение. При объявлении переменной типа указатель необходимо указать тип данных, адреса которых будет содержать переменная, и имя указателя с предшествующей «*». Например, если указатель описан как

unsigned char *buf; , то переменная buf может указывать только на переменную типа unsigned char, а при увеличении этого указателя на единицу он будет указывать на соседний с первоначальным байт. если указатель описан как

int *buf; , то переменная buf может указывать только на переменную типа int, а при увеличении этого указателя на единицу он будет указывать на область памяти в два байта, которая расположена за первоначальной областью памяти такого же размера. Следует отметить, что сам указатель для обоих рассмотренных случаев может занимать одну и ту же область памяти (для ближнего указателя – это 2 байта, а для дальнего указателя – 4 байта).

Использование указателя для работы с массивом

Рассмотрим следующую конструкцию:

int *buf,mas[10];

buf=mas;

Последняя запись означает, что в переменной buf хранится теперь адрес на первый элемент массива (в языке «С» имя массива – это его адрес, и данная строчка эквивалентна следующей buf=&mas[0];).



mas[0]

mas[1]

mas[2]

mas[3]

mas[4]

mas[5]

mas[6]

mas[7]

mas[8]

mas[9]




Buf


Рис. 1

Теперь, если мы хотим, например, присвоить переменной «а» значение mas[0],это можно сделать через указатель buf:

а=*buf; .

Более того, посредством этого указателя можно «добраться » до любого элемента массива, прибавив тем или иным способом к значению указателя соответствующее число элементов. Например, присвоим посредством указателя переменной «а» значение mas[4].

Первый способ . a=*(buf+4);

Второй способ . buf=buf+4; a=*(buf);

Отличие заключается в том, что при использовании первого способа указатель buf по-прежнему указывает на первый элемент массива, при втором способе после операции присваивания он указывает на mas[4].

Приведем две программы, в которых задачи, ранее решенные другим способом (см. лабораторную работу № 3.), теперь решаются с помощью указателей.

1 программа. Значения элементов одномерного массива формируются датчиком случайных чисел.

#include

#include

#include

#include //это нужно для датчика случайных чисел

#include

void main()

{int mas[30],i,n,*buf_mas;

randomize();//инициализация датчика случайных чисел

printf(" Введите n<30");

scanf("%d",&n);

buf_mas=mas;

for(i=0;i
*buf_mas =random(299);// текущему элементу массива- //присваивается случайное значение в диапазоне 0..299.

//эта операция равносильна mas[i] =random(299);

}

}

2 программа. Значения элементов двухмерного массива формируются датчиком случайных чисел.

#include

#include

#include

#include //это нужно для датчика случайных чисел

#include

void main()

{int mas[8][10],i,n,*buf_mas;

randomize();//инициализация датчика случайных чисел

buf_mas=mas;

for(n=0;n<8;n++)

for(i=0;i<10;i++,buf_mas++){

*buf_mas =random(299);// текущему элементу массива- //присваивается случайное значение в диапазоне 0..299.

//эта операция равносильна mas[n][i] =random(299);

}

}

Преимущество указателей.

Работая с указателями на языке высокого уровня, мы реализуем логику работы на ассемблере, который практически является машинным языком, и, следовательно, пишем наиболее быстро выполняемые программные коды. То обстоятельство, что «С» обладает мощными средствами поддержки работы с указателями делает его, пожалуй, самым удобным языком высокого уровня для написания операционных систем, коды которой должны выполнятся максимально быстро. Кроме выигрыша в скорости применение указателей позволяет достичь большей гибкости, так как одному объекту можно сопоставить несколько указателей, умелое варьирование которыми позволяет реализовать весьма изощренные схемы обработки. Использование указателей (по сути дела косвенной адресации) позволяет также повысить «защищаем ость» объекта, так как в этом случае доступ к объекту осуществляется не напрямую, а через «перевалочный пункт» (указатель).

3. Варианты заданий

-Создать и заполнить случайными значениями двухмерный массив размером 20*20;

-Согласно варианту задания (с 1 по 17) распечатать часть этого массива, используя для перемещения по массиву только указатели.

1. Распечатать значения элементов массива из прямоугольной области 7*6, расположенной в центре массива.

2. Распечатать значения элементов массива из прямоугольной области 7*6, расположенной в нижнем правом углу массива.

3. Распечатать значения элементов массива из прямоугольной области 6*20, расположенной в центре массива.

4. Распечатать значения элементов массива из параллелограмма 7*6, расположенного в центре массива с углом наклона 45 град к горизонтали.

5. Распечатать значения элементов массива из параллелограмма 7*6, расположенного в центре массива с углом наклона -45 град к горизонтали.

6. Распечатать значения элементов массива из параллелограмма 7*6, расположенного в центре массива с углом наклона 30 град к горизонтали.

7. Распечатать значения элементов массива из параллелограмма 7*6, расположенного в центре массива с углом наклона -30 град к горизонтали.

8. Распечатать значения элементов массива из параллелограмма 7*6, расположенного в центре массива с углом наклона 60 град к горизонтали.

9. Распечатать значения элементов массива из параллелограмма 7*6, расположенного в центре массива с углом наклона -60 град к горизонтали.

10. Распечатать значения элементов массива из трапеции с высотой 4 и горизонталями 4 и 12, расположенной в центре массива.

11. Распечатать значения элементов массива из перевернутой трапеции с высотой 4 и горизонталями 10 и 6, расположенной в центре массива.

12. Распечатать значения элементов массива из трапеции, у которой два правых угла прямые и высота равна 5, а горизонтали - 4 и 9.

13. Распечатать значения элементов массива из трапеции, у которой два левых угла прямые и высота равна 5, а горизонтали - 4 и 9.

14. Распечатать значения элементов массива из равностороннего треугольника, находящегося в центре массива и стороной, равной 7.

15. Распечатать значения элементов массива из равностороннего опрокинутого треугольника, находящегося в центре массива и стороной, равной 7.

16. Распечатать значения элементов массива из треугольника с равносторонними катетами, равными 5, и диагональю, параллельной главной диагонали матрицы.

17. Распечатать значения элементов массива из треугольника с равносторонними катетами, равными 5, и диагональю, параллельной побочной диагонали матрицы.

Представляя шахматную доску как двухмерную матрицу, выполнить следующие ниже 4 задания (координаты позиций следует вводить с дисплея).

18. Установить какие поля на шахматной доске будут «битыми», если в позиции n0,m0, где 0
19. Установить какие поля на шахматной доске будут «битыми», если в позиции n0,m0, где 0
20. Установить какие поля на шахматной доске будут «битыми», если в позиции n0,m0, где 0
21. Установить какие поля на шахматной доске будут «битыми», если в позиции n0,m0, где 0