С++: Л/р№1 Массивы и указатели
Лабораторная работа № 1
<br/>Массивы и указатели (4 часа)(Добавлено... см внизу)
<br/>Цель работы: изучение правил работы с указателями и массивами.
<br/><br/>Порядок выполнения работы
<br/>1.Провести анализ примеров. Программы из примеров копируются в файлы С++ и выполняются.
<br/>2.Выполнить задания.
<br/>3.Защитить выполненную работу.
<br/><br/>Контрольные вопросы
<br/>1.Как работают программы примеров?
<br/>2.Перечислить преимущества индексации массивов с помощью указателей.
<br/><br/>Примеры
<br/><br/>Пример 1. Демонстрация способов применения указателей.
<br/><br/>Пример программы, иллюстрирующей размер "шага" указателя в адресной арифметике.
<br/>#include <stdio.h>
<br/>void main(void)
<br/>{
<br/> int * ptr1 = (int *) 100;
<br/> int * ptr2 = (int *) 2...
Лабораторная работа № 1
Массивы и указатели (4 часа)(Добавлено... см внизу)
Цель работы: изучение правил работы с указателями и массивами.
Порядок выполнения работы
1.Провести анализ примеров. Программы из примеров копируются в файлы С++ и выполняются.
2.Выполнить задания.
3.Защитить выполненную работу.
Контрольные вопросы
1.Как работают программы примеров?
2.Перечислить преимущества индексации массивов с помощью указателей.
Примеры
Пример 1. Демонстрация способов применения указателей.
Пример программы, иллюстрирующей размер "шага" указателя в адресной арифметике.
Примечание.
Если к указателю, описанному как type * ptr; , прибавляется или отнимается константа N, значение ptr изменяется на N * sizeof(type). Разность двух указателей type * ptrl, * ptr2 - это разность их значений, поделенная на sizeof(type).
В частности, арифметические операции над указателями типа char * (размер типа равен 1) выполняются как над обычными целыми числами с той лишь разницей, что значения, участвующие в операции, - это адреса в оперативной памяти. Однако для других типов указателей это не так.
Так как указатель имеет тип int * (длина типа 2 байта), то "единица изменения" указателя и "единица измерения разности" равны двум байтам. Для других типов указателей такие же вычисления дают следующий результат:
для long * и float *
ptr2=160, ptr1=104, ptr2-ptr1=14.
для double *
ptr2=120, ptrl=108, ptr2-ptr1=1.
для long double *
ptr2=100, ptr1=IIO, ptr2-ptrl=-1.
Такие правила арифметических операций с указателями вытекают из того, что указатель в Си неявно рассматривается как указатель на начало массива однотипных элементов. Продвижение указателя вперед или назад совпадает с увеличением или уменьшением индекса элемента.
Интерпретирует байт по адресу FFFFEh BIOS ПЗУ.
Примечание.
В примере демонстрируется способ использование модификаторов типа указателей на данные, в частности far. Использование far-указателей позволяет обращаться к любому байту адресного пространства компьютера. Весьма популярное применение far-указателя - непосредственный доступ к памяти видеоадаптера или специальным областям BIOS. В примере выполняется определения типа архитектуры персонального компьютера (известно, что предпоследний байт памяти по физическому адресу FFFFEh (ПЗУ BIOS) содержит индикатор архитектуры персонального компьютера (значение FFh соответствует компьютеру IBM PC, FEh - компьютеру IBM PC XT, FDh - компьютеру IBM PCjr, FCh - компьютеру IBM PC AT).
Пример 2. Демонстрация описания и использования трехмерного массива.
Демонстрация описания и использования трехмерного массива.
Примечание.
В тексте программы помещены синонимы для доступа к элементам массива либо через индексы, либо с использованием указателей. Для доступа через указатели могут выбираться различные "точки отсчета":
1) указатель-константа, задаваемый именем массива;
2) указатель-константа на начало отдельного слоя;
3) указатель-константа на начало строки элементов слоя.
Задания
Задание 1.
Создать программу, в которой:
- с клавиатуры вводится двумерный массив-матрица (размерность массива произвольная);
- в массиве определяются все седловые точки (седловая точка - это элемент, являющийся одновременно минимальным в строке и максимальным в столбце)
Рекомендации:
- используется цикл for;
- индексацию проводить двумя способами, с использованием как указателей, так и индексов.
Выполнение задания:
По материалам ОмГУПС, все права защищены...
-------->>>>> Добавлено... <<<<<-----------
Dilon прислал свой вариант. На его взляд лучше читаемый... да и на мой взгляд тоже
Я вижу свою прогу только когда пишу... потом трудно понять, если забыл...
Массивы и указатели (4 часа)(Добавлено... см внизу)
Цель работы: изучение правил работы с указателями и массивами.
Порядок выполнения работы
1.Провести анализ примеров. Программы из примеров копируются в файлы С++ и выполняются.
2.Выполнить задания.
3.Защитить выполненную работу.
Контрольные вопросы
1.Как работают программы примеров?
2.Перечислить преимущества индексации массивов с помощью указателей.
Примеры
Пример 1. Демонстрация способов применения указателей.
Пример программы, иллюстрирующей размер "шага" указателя в адресной арифметике.
#include <stdio.h>
void main(void)
{
int * ptr1 = (int *) 100;
int * ptr2 = (int *) 200;
ptr1++; /* физически значение указателя увеличивается на 2 */
ptr2 -= 10; /* физически значение указателя уменьшается на 20 */
printf("ptr2=%d, ptr1=%d, ptr2-ptr1=%d\n", ptr2, ptr1, ptr2-ptr1);
} Примечание.
Если к указателю, описанному как type * ptr; , прибавляется или отнимается константа N, значение ptr изменяется на N * sizeof(type). Разность двух указателей type * ptrl, * ptr2 - это разность их значений, поделенная на sizeof(type).
В частности, арифметические операции над указателями типа char * (размер типа равен 1) выполняются как над обычными целыми числами с той лишь разницей, что значения, участвующие в операции, - это адреса в оперативной памяти. Однако для других типов указателей это не так.
Так как указатель имеет тип int * (длина типа 2 байта), то "единица изменения" указателя и "единица измерения разности" равны двум байтам. Для других типов указателей такие же вычисления дают следующий результат:
для long * и float *
ptr2=160, ptr1=104, ptr2-ptr1=14.
для double *
ptr2=120, ptrl=108, ptr2-ptr1=1.
для long double *
ptr2=100, ptr1=IIO, ptr2-ptrl=-1.
Такие правила арифметических операций с указателями вытекают из того, что указатель в Си неявно рассматривается как указатель на начало массива однотипных элементов. Продвижение указателя вперед или назад совпадает с увеличением или уменьшением индекса элемента.
Интерпретирует байт по адресу FFFFEh BIOS ПЗУ.
#include<stdio.h>
void main(void)
{
char * messages[] =
{
"IBM PC",
"IBM PC XT",
"IBM PCjr",
"IBM PC AT",
"не опознан",
};
char far * ptr = (char far *) 0xF000FFFEL;
char index;
index = * ptr ^ 0xFF;
printf("Тип компьютера, сообщаемый BIOS-ом: %s\n",
index <= 3 ? messages[index] : messages[4]);
} Примечание.
В примере демонстрируется способ использование модификаторов типа указателей на данные, в частности far. Использование far-указателей позволяет обращаться к любому байту адресного пространства компьютера. Весьма популярное применение far-указателя - непосредственный доступ к памяти видеоадаптера или специальным областям BIOS. В примере выполняется определения типа архитектуры персонального компьютера (известно, что предпоследний байт памяти по физическому адресу FFFFEh (ПЗУ BIOS) содержит индикатор архитектуры персонального компьютера (значение FFh соответствует компьютеру IBM PC, FEh - компьютеру IBM PC XT, FDh - компьютеру IBM PCjr, FCh - компьютеру IBM PC AT).
Пример 2. Демонстрация описания и использования трехмерного массива.
Демонстрация описания и использования трехмерного массива.
#include<stdio.h>
void main(void)
{
int i, j, k;
char array[][2][21] = /* массив из 2 "слоев" по 2 строки и
21 столбцу в каждом слое */
{
{
"0-й слой 0-я строка", /* инициализация первого слоя */
"0-й слой 1-я строка", /* строковыми литералами */
},
{ /* посимвольная инициализация второго слоя */
{
'1', '-', 'й', ' ', 'с', 'л', 'о', 'й', ' ',
'0', '-', 'я', ' ', 'с', 'т', 'р', 'о', 'к', 'а', '\0'
},
{
'1', '-', 'й', ' ', 'с', 'л', 'о', 'й', ' ',
'1', '-', 'я', ' ', 'с', 'т', 'р', 'о', 'к', 'а', '\0'
},
}
};
printf("Размер массива array равен %d байт\n", sizeof(array));
printf("Размер слоя массива array равен %d байт\n", sizeof(array[0]));
printf("Размер строки массива array равен %d байт\n", sizeof(array[0][0]));
printf("Размер элемента массива array равен %d байт\n", sizeof(array[0][0][0]));
/*
Доступ к ASCIIZ-строкам через указатели на строки
*/
for(i=0; i < 2; i++)
for(j=0; j < 2; j++)
puts(array[i][j]); /* являются синонимами: */
/* puts(*(array+i)+j); или */
/* puts(*(*(array+i)+j)); */
/*
Посимвольный вывод элементов массива на экран.
*/
for(i=0; i < 2; i++)
for(j=0; j < 2; j++)
{
for(k=0; array[i][j][k]; k++)
putchar(array[i][j][k]); /* являются синонимами: */
/* putchar(*(array[i][j]+k)); или */
/* putchar(*(*(array[i]+j)+k)); или */
/* putchar(*(*(*(array+i)+j)+k)); */
putchar('\n');
}
}
Примечание.
В тексте программы помещены синонимы для доступа к элементам массива либо через индексы, либо с использованием указателей. Для доступа через указатели могут выбираться различные "точки отсчета":
1) указатель-константа, задаваемый именем массива;
2) указатель-константа на начало отдельного слоя;
3) указатель-константа на начало строки элементов слоя.
Задания
Задание 1.
Создать программу, в которой:
- с клавиатуры вводится двумерный массив-матрица (размерность массива произвольная);
- в массиве определяются все седловые точки (седловая точка - это элемент, являющийся одновременно минимальным в строке и максимальным в столбце)
Рекомендации:
- используется цикл for;
- индексацию проводить двумя способами, с использованием как указателей, так и индексов.
Выполнение задания:
#include<stdio.h>
#include<conio.h>
#define mm 4
#define nm 4
void main()
{
int i,imx,jmx,ixx,j,n=nm,m=mm;
float a[mm] [nm]={{9,8,7,6},
{8,4,6,5},
{1,0,5,-3},
{0,2,4,-2}},mi_ma,ma_mi;
clrscr();
/*
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("Введите А[%i][%i]=",i,j);
scanf("%f",&*(*(a+i)+j));
}
}
//vvod opuskalsya dlya otladki
*/
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf(" %g ",*(*(a+i)+j));
}
puts("");
}
for(i=0;i<n;i++)
{
mi_ma=*(*(a+i)+0);
for(j=0;j<m;j++)
{
if(*(*(a+i)+j)<mi_ma)
{
mi_ma=*(*(a+i)+j);
imx=i;
jmx=j;
}
else;
}
ixx=i;
i=0;
ma_mi=*(*(a+i)+jmx);
for(j=jmx;i<n;i++)
{
if(*(*(a+i)+j)>ma_mi)
{
ma_mi=*(*(a+i)+j);
}
else;
}
if(ma_mi==mi_ma)
{
printf("a=%gi=%i j=%i\n",mi_ma,imx+1,jmx+1);
}
else;
i=ixx;
}
getch();
} По материалам ОмГУПС, все права защищены...
-------->>>>> Добавлено... <<<<<-----------
Dilon прислал свой вариант. На его взляд лучше читаемый... да и на мой взгляд тоже
//by Dilon, все защищено по понятиям и все такое
#include "stdio.h"
#include "conio.h"
#define nn 4
#define kk 4
void main()
{
int i=0,j=0,min=0,max=0,p=0,k=0,l=0;
int m[nn][kk]={{1,-50,3,2},{0,-60,34,4},{3,-70,9,5},{4,-80,10,3}};
//for(i=0;i!=nn;i++) {
//for(j=0;j!=kk;j++)scanf("%d",&m[i][j]);
//}
while (k<=kk) {
min=m[k][0];
for (j=0;j<nn;j++) {
if (m[k][j]<min) {
min=m[k][j];
p=j;
}
}
max=m[0][p];
for (i=0;i<kk;i++){
if (m[i][p]>max) {
max=m[i][p];
l=i;
}
}
if (min==max) printf("%d",m[l][p]);
k++;
}
getch();
}
Лента материалов
Правила размещения комментариев
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.


Сейчас обсуждают