Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_1_Книги).doc
Скачиваний:
7
Добавлен:
03.05.2019
Размер:
1.04 Mб
Скачать

Int a[10]; FunArr1(a, 10,…);

так и динамический:

int *d; int n; cin>>n; d= new int[n]; FunArr1(d, n, …);

В случае с матрицей это не совсем так. Пусть объявлена статическая матрица

const Nc=5, Mc=10; int C[Nc][Mc];

Передать её в функцию нельзя, то есть вызов

FunMatr(C, Nc, Mc);

приведёт к ошибке компиляции.

Пример. (+).

Передача матрицы в функцию с помощью указателей. Кроме этого здесь дополнительно показано, как передать формат стандартной функции вывода printf в качестве параметра функции.

void MyFun1 (int **X, int , int ); // или void MyFun1 (int *X[],int , int );

void MyFun2 (int *X[],int , int ); //или void MyFun2 (int **X,int , int );

void MyPrint (int **X, int , int, int, char* );

int main()

{

/* Создание “полностью” динамической матрицы, которая объявляется как динами­ческий массив из N указателей. Обе размерности – переменные.*/

int ** A; int N=3, M=4;

A=new int *[N];

for (int i=0; i<N; i++) A[i]=new int [M];

/* В функцию передаём полностью динамическую матрицу. */

MyFun1(A,N,M);

/* Сначала выводим указанный текст, а затем матрицу A размерности N*M по формату “%5d” */

MyPrint(A,N,M,5,"\n The first test\n");

//Удаляем матрицу

for (int i=0;i<N;i++) delete[]A[i];

delete[]A;

/* Создание “частично” динамической матрицы, которая объявляется как статический массив указателей фиксированной размерности Nconst. Другими словами, количество “строк” фиксировано (Nconst), а количество элементов в строке произвольное: M2 – не константа, а переменная (см. 5.3) */

const Nconst=8; int M2=6;

int *B[Nconst];

/* Для такой полудинамической матрицы B=new int *[Nconst]; не надо. Будет ошибка!!!!!!! */

for (int i=0; i<Nconst; i++)

B[i]=new int [M2];

/* Передаём полудинамическую матрицу */

MyFun2(B,Nconst,M2);

MyPrint(B,Nconst,M2,3,"\n \nThe second test\n");

//Удаляем матрицу B

for (int i=0;i<Nconst;i++)

delete[]B[i];

getch(); return 0;

}

void MyFun1 (int **X, int n, int m)

// или void MyFun1 (int *X[], int n, int m)

{

for (int i=0; i<n; i++)

for (int j=0;j<m;j++)

X[i][j]=(i+1)*(j+1);

// Перестановка 0-й и (n-1)-й строк

int* t;

t=X[0]; X[0]=X[n-1]; X[n-1]=t;

}

void MyFun2 (int *X[], int n, int m)

// или void MyFun2 (int **X, int n, int m)

/* Определяем элементы матрицы. */

{

for (int i=0; i<n; i++)

for (int j=0;j<m;j++)

if (i%2) X[i][j]=(i+1)-(j+1);

else X[i][j]=(i+1)+(j+1);

}

void MyPrint (int **X, int n , int m, int L, char* t )

{

// Формируем формат “%Ld”, где L – переданное в функцию целое число…

char AnyFormat[10],

StrL[3];

/* … для хранения переведенного в строку c помощью встроенной функции itoa целого числа L */

strcpy(AnyFormat, "%");

strcat(AnyFormat,itoa(L,StrL,10));

strcat(AnyFormat,"d");

puts(t);

for (int i=0; i<n; i++)

{

for (int j=0;j<m;j++)

printf(AnyFormat,X[i][j]);

cout<<endl;

}

}

§5. Динамический массив строк (+).

По аналогии с динамической матрицей можно создать динамический массив строк. Для этого объявляем динамический массив указателей как указатель на указатель символа:

char **s;

Объявляем и определяем количество строк:

int n; cin>>n;

Аналогично резервируем память для массива указателей на строки

s=new char*[n];

В цикле резервируем память для каждой строки. Размер её определяем с помощью вспомогательной строки t, длина которой, а, значит и длина каждой строки, не более 40 символов:

char *t; t=new char[40];

for(int i=0; i<n; i++)

{ gets(t);

s[i]=new char[strlen(t)];

strcpy(s[i], t);

}

Работу с таким массивом рассмотрим на примере сортировки массива строк.

for(int j=0; j<n; j++)

for(int i=0; i<n-1; i++)

if (s[i][0]>s[i+1][0]) //Сравнение первых символов строк

//if (strcmp(s[i],s[i+1])>0) // или сравнение двух строк

{ // Перестановка двух строк

strcpy(t,s[i]); // копирование s[i] в t

strcpy(s[i],s[i+1]);

strcpy(s[i+1],t);

}

for(int i=0;i<n;i++) puts(s[i]); // Вывод строк

//Освобождение памяти особенностей не имеет.

for (int i=0; i<n;i++)

delete []s[i]; // Удаление каждой строки из памяти

delete []s; // Удаление массива указателей из памяти

delete []t; // Удаление вспомогательной строки из памяти

В качестве повторения заметим, что два варианта сравнения

if (s[i][0]>s[i+1][0])

и

if(strcmp(s[i],s[i+1])>0) …

выполняются по-разному. В первом случае сравниваются только первые символы соседних в массиве строк и независимо от результата следующие символы в сравнении не участвуют. С помощью функции strcmp выполняется сравнение так, как было описано в теме “строки” (см. §5 главы 2).