Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Microsoft_Visual_C++..doc
Скачиваний:
18
Добавлен:
29.10.2018
Размер:
691.2 Кб
Скачать

Пример 10 Операции над указателями

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

int Dec =10;

int *Ptr;

using namespace System;

int main(array<System::String ^> ^args)

{

// присваивание указателю Ptr адреса переменной Dec

Ptr=&Dec;

*Ptr = *Ptr+3;

// вывод на экран значений *ptr, ptr и &Dec

printf("\n%d\n",*Ptr);

printf("%d\n",Ptr);

printf("%d\n",&Dec);

getch();

return 0;

}

Тестирование:

Операции ++ и -- значение указателя увеличивают или уменьшают на длину типа, на который ссылается используемый указатель:

int *ptr, a[10];

ptr=&a[5];

ptr++; /* равно адресу элемента a[6] */

ptr--; /* равно адресу элемента a[5] */

В бинарных операциях сложения и вычитания могут участвовать указатель и величина типа int. При этом результатом операции будет указатель на исходный тип, а его значение будет на указанное число элементов больше или меньше исходного:

int *ptr1, *ptr2, a[10];

int i=2; ptr1=a+(i+4); /* равно адресу элемента a[6]*/

ptr2=ptr1-i; /* равно адресу элемента a[4]*/

В операции вычитания могут участвовать два указателя на один и тот же тип. Результат такой операции имеет тип int и равен числу элементов исходного типа между уменьшаемым и вычитаемым, причем если первый адрес младше, то результат имеет отрицательное значение:

int *ptr1, *ptr2, a[10];

int i;

ptr1=a+4;

ptr2=a+9;

i=ptr1-ptr2; /* равно 5 */

i=ptr2-ptr1; /* равно -5 */

Пример 11 Сравнение указателей

Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=",">, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).

int *ptr1, *ptr2, a[10];

ptr1=a+5;

ptr2=a+7;

if (prt1>ptr2) a[3]=4;

В данном примере значение ptr1 меньше значения ptr2 и поэтому оператор a[3]=4 не будет выполнен.

6 Связь между массивом и указателем

 

Указатели позволяют эффективно организовать работу с массивами. Действительно, обозначение массива представляет собой скрытую форму использования указателей. Например, имя массива определяет также его первый элемент, т.е. если arr[][] массив, то arr==&arr[0][0].

Пример 12

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

int arr [4][2];

int *ref1,*ref2;

using namespace System;

int main(array<System::String ^> ^args)

{

arr[0][0] =11;

arr[0][1] =12;

arr[1][0] =21;

arr[1][1] =22;

arr[2][0] =31;

arr[2][1] =32;

arr[3][0] =41;

arr[3][1] =42;

ref1=(int*)arr;

ref2=(int*)arr;

printf("\n%d \n", arr);

printf("\n%d %d %d %d %d \n", *ref1,ref1,ref2,*ref2,*(arr[0]));

ref1++;

ref2=&arr[0][0]+1;

printf("%d %d %d %d %d\n", *ref1,ref1,ref2,*ref2,*(arr[1]));

ref1++;

ref2=&arr[0][0]+2;

printf("%d %d %d %d %d\n", *ref1,ref1,ref2,*ref2,*(arr[2]));

ref1++;

ref2=&arr[0][0]+3 ;

printf("%d %d %d %d %d\n", *ref1,ref1,ref2,*ref2,*(arr[3]));

ref1++;

ref2=&arr[0][0]+4;

printf("%d %d %d %d %d\n", *ref1,ref1,ref2,*ref2,*(arr[4]));

getch();

return 0;

}

Тестирование:

Имя массива является адресом его первого элемента.

Задачи

Одномерные массивы

    1. Пригодность детали оценивается по размеру В, который должен соответствовать интервалу (А+s, А-s). Определить имеются ли в партии из N деталей бракованные. Если да, то подсчитать их количество, иначе выдать отрицательный результат.

    2. При поступлении в вуз абитуриенты, получившие «двойки» на первом экзамене, ко второму не допускаются. В массиве res[n] записаны оценки экзаменующихся, полученные на первом экзамене. Подсчитать, сколько человек не допущено ко второму экзамену.

    3. Написать программу, которая определяет количество учеников в классе, чей рост превышает средний.

    4. Составить программу, которая вычисляет среднюю (за неделю) температуру воздуха.

    5. Задан целочисленный одномерный массив а состоящий из n элементов. Написать программу подсчета количества ненулевых элементов массива.

    6. Задан целочисленный одномерный массив а состоящий из n элементов. Написать программу вычисления суммы, разности и произведения наибольшего и наименьшего элементов массива.

Двумерные массивы

    1. Написать программу транспонирования матрицы АТ. Если в матрице А поменять местами столбцы со строками, то получим транспонированную матрицу АТ. Каждый элемент транспонированной матрицы определяется по формуле

aijT = aji, i=1,2,...,n; j=1,2,...,m.

Транспонирование матрицы реализовать двумя способами.

Первый способ – имя транспонированной матрицы не совпадает с именем исходной матрицы, т.е. когда исходная и транспонированная матрицы хранятся в разных областях памяти.

Второй способ – выполнить транспонирование в той же области памяти, где располагается исходная матрица, т.е. когда транспонированная матрица должна иметь такое же имя, как и исходная (например, для экономии памяти).

    1. Написать программу умножения матриц.

При умножении каждый элемент матрицы-произведения определяется как сумма произведений элементов строки матрицы-множимого на соответствующие элементы столбца матрицы-множителя. Например, если требуется вычислить С=А*В, где А и В – матрицы, то каждый элемент матрицы С определяется по формуле:

сi,j = aik *b kj, i=1,2,...,n; j=1,2,...,l ; k=1,2,...,m

где

n – число строк матрицы А;

l – число столбцов матрицы В;

m – число столбцов матрицы А и строк матрицы В. Из формулы следует, что перемножать можно только такие матрицы, у которых число столбцов матрицы-множимого равно числу строк матрицы множителя, т.е. [aij]n*m*[bij]m*l= [cij]n*l.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]