Стандартные алгоритмы работы с двумерными массивами
1.Ввод элементов массива с клавиатуры:
const int n=20;
int b[n][n];
int i;
for (i=0; i<n; i++)
for (j=0; j<n; j++) cin >> b[i][j];
2.Ввод элементов массива с помощью генератора случайных чисел:
const int n=20;
int b[n][n];
int i;
randomize();
for (i=0; i<n; i++)
for (j=0; j<n; j++) b[i][j]=random(100) - 50;
// генерирование случайных
// чисел в диапазоне [-50; 50].
3.Вывод элементов массива на экран:
const int n=20;
int b[n][n];
int i;
for (i=0; i<n; i++)
for (j=0; j<n; j++) cout << b[i][j];
4. Поиск максимального элемента в массиве и запоминание позиции максимального элемента в массиве:
const int n=20;
int b[n];
int i, n_imax, n_jmax;
max=b[0][0];
for (i=0; i<n; i++)
for (j=0; j<n; j++)
if (max >b[i][j]) { max = b[i][j]; n_imax=i; n_jmax=j }
cout <<”Максимальный элемент массива b[”
<<n_ imax<<“,”<<n_jmax<<”]=”<<max;
5. Поиск минимального элемента в массиве и запоминание позиции минимального элемента в массиве:
const int n=20;
int b[n];
int i, n_imin, n_jmax;
min=b[0][0];
for (i=0; i<n; i++)
for (j=0; j<n; j++)
if (min >b[i][j])
{
min = b[i][j]; n_imin=i; n_jmin=j;
}
cout <<”Минимальный элемент массива b[”<<n_ imin
<<”,”<<n_jmin<<”]=”<<min;
Пример. Программа определяет в целочисленной матрице номер строки, которая содержит наибольшее количество элементов, равных нулю.
#include <stdio.h>
int main(){
const int nstr = 4, nstb = 5; // размерности массива
int b[nstr][nstb]; // описание массива
int i, j;
for (i = 0; i<nstr; i++) // ввод массива
for (j = 0; j<nstb; j++) scanf("%d", &b[i][j]);
int istr = -1, MaxKol = 0;
for (i = 0; i<nstr: i++){ // просмотр массива по строкам
int Kol = 0:
for (j = 0; j<nstb; j++)
if (b[i][j] == 0)Kol++;
if (Kol > MaxKol){istr = i; MaxKol = Kol;}
}
printf(" Исходный массив:\п");
for (i = 0; i<nstr; i++){
for (j = 0; j<nstb; j++) printf("%d, b[i][j]);
printf("\n");
}
if (istr == -1) printf ("Нулевых элементов нет");
else printf("Hoмep строки: %d"? istr);
return 0;
}
Номер искомой строки хранится в переменной istr, количество нулевых элементов в текущей (i-й) строке – в переменной Kol, максимальное количество нулевых элементов – в переменной MaxKol. Массив просматривается по строкам, в каждой из них подсчитывается количество нулевых элементов (обратите внимание, что переменная Kol обнуляется перед просмотром каждой строки). Наибольшее количество и номер соответствующей строки запоминаются.
Для создания динамического многомерного массива необходимо указать в операции new все его размерности (самая левая размерность может быть переменной), например:
int nstr = 5;
int ** m = (int **) new int [nstr][10];
Более универсальный и безопасный способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, приведен ниже:
int nstr, nstb;
cout << " Введите количество строк и столбцов :";
cin >> nstr >> nstb;
int **а = new int *[nstr]; // 1
for (int i = 0; i<nstr; i++) // 2
a[i] = new int [nstb]; // 3
В операторе 1 объявляется переменная типа «указатель на указатель на int» и выделяется память под массив указателей на строки массива (количество строк – nstr). В операторе 2 организуется цикл для выделения памяти под каждую строку массива. В операторе 3 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из nstb элементов типа int (рис. 5.2).
Рис. 5.2. Выделение памяти под двумерный массив
Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции delete []. Указатель на константу удалить нельзя.
Для правильной интерпретации объявлений полезно запомнить мнемоническое правило: «суффикс привязан крепче префикса». Если при описании переменной используются одновременно префикс * (указатель) и суффикс [] (массив), то переменная интерпретируется как массив указателей, а не указатель на массив: int *р[10]; - массив из 10 указателей на int.
Лекция 6. Введение в обработку символов и строк
В этом разделе мы познакомимся с некоторыми типичными функциями стандартной библиотеки С, которые обеспечивают обработку строк. Обсуждаемая здесь техника подходит для разработки текстовых редакторов, лингвистических процессоров, программ верстки, систем компьютеризированного набора и других программных систем обработки текстов.
Дата добавления: 2015-10-09; просмотров: 995;