Автор: Пользователь скрыл имя, 17 Января 2011 в 18:57, курс лекций
6 тем.
Дана прямоугольная матрица, элементами которой являются вещественные числа. Поменять местами ее строки следующим образом: первую строку с последней, вторую с предпоследней и т.д.
Указания
по решению задачи . Если в массиве n строк,
до 0 строку нужно поменять с n - 1,
1 строку – с n-2, i-тую строку - с n-i-1.
#include <iostream>
using namespace std;
float ** create(int &n, int &m)
{
cout <<"n=";
cin >>n;
cout <<"m=";
cin >>m;
float **mas=new int *[n];
for (int i=0; i<n; ++i)
mas[i]=new int [m];
for (int i=0; i<n; ++i)
for (int j=0; j<m; ++j)
{
cout<<"mas["<<i<<"]["<<j<<"]="
cin>>mas[i][j];
}
return mas;
}
int main()
{
int n, m;
cout <<"n=";
cin >>n;
cout <<"m=";
cin >>m;
float **a=create(n,m);
float * z ;
for ( int i =0; i <( n /2); ++ i ) //меняются местами все i -тую и ( n - i -1)-ую строки
{
z=a[i];
a[i]=a[n-i-1];
a[n-i-1]=z;
}
for (int i=0;i<n; ++i, cout<<endl) // вывод
for (int j=0;j<m; ++j)
cout<<a[i][j]<<"\t";
for (int i=0;i<n; ++i)
delete [] a[i];
delete [] a ;
return 0;
}
Замечание . Обратите внимание на то, что во время перестановки строк перебирает не все строки, а только половину. Если бы перебирались все строки, то никакой перестановки не произошло, и массив оставался бы неизменным. Подумайте почему.
Результат работы программы
n=3
m=4
Массив А n ´ m | Ответ |
2.4 -1.9 3.1 0.0
1.1 3.6 -1.2 3.7 -2.1 4.5 -1.7 4.9 |
-2.1 4.5 -1.7 4.9
1.1 3.6 -1.2 3.7 2.4 -1.9 3.1 0.0 |
6.7. Вставка и удаление элементов в массивах
При объявлении массива мы определяем его максимальную размерность, которая в дальнейшем изменена быть не может. Однако с помощью вспомогательной переменной можно контролировать текущее количество элементов,которое не может быть больше максимального.
Пример . Рассмотрим фрагмент программы:
int * a = new int [10];
int n=5;
for (int i=0; i<5;i++)
a[i]=i*i;
В этом случае массив можно представить следующим образом:
n = 5 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
а | 0 | 1 | 4 | 9 | 16 | случайное
число |
случайное
число |
случайное
число |
случайное
число |
случайное
число |
Так как во время описания был определен массив из 10 элементов, а заполнено только первые 5, то оставшиеся элементы будут заполнены случайными числами.
Что значит удалить из одномерного массива элемент с номером 3? Удаление должно привести к физическому «уничтожению» элемента с номером 3 из массива, при этом общее количество элементов должно быть уменьшено. В этом понимании удаления элемента итоговый массив должен выглядеть следующим образом
0 | 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | недопустимое состояние |
0 | 1 | 4 | 16 | случайное число | случайное число | случайное число | случайное число | случайное число |
Такое удаление для массивов невозможно, поскольку элементы массива располагаются в памяти последовательно друг за другом, что позволяет организовать индексный способ обращения к массиву.
Однако «удаление» можно смоделировать сдвигом элементов влево и уменьшением значения переменной, которая отвечает за текущее количество элементов в массиве, на единицу:
n=4 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
а | 0 | 1 | 4 | 16 | случайное число | случайное число | случайное число | случайное число | случайное число | случайное число |
В общем случае, если мы хотим удалить элемент массива с номером k (всего в массиве n элементов, а последний элемент имеет индекс n -1 ), то нам необходимо произвести сдвиг элементов,начиная с k +1 -го на одну позицию влево. Т.е. на k -ое место поставить k +1 -й элемент, на место k +1 – k +2 -й элемент, …, на место n -2 – n -1 -й элемент. После чего значение n уменьшить на 1. В этом случае размерность массива не изменится, изменится лишь текущее количество элементов, и у нас создастся ощущение, что элемент с номером k удален. Рассмотрим данный алгоритм на примере:
#include <iostream>
using namespace std ;
int main ()
{
int n ;
cout <<" n =";
cin >> n ; //ввели размерность массива
int * a = new int [ n ]; //создали и заполнили массив
for (int i=0; i<n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
int k ;
cout <<" k =";
cin >> k ; //ввели номер удаляемого элемента
if ( k <0 || k > n -1) // если номер отрицательный или больше номера последнего элемента,
cout <<" error "; //то выводим сообщение об ошибке, иначе
else
{
for (int i=k; i<n-1;i++)
a[i]=a[i+1]; // выполняем
n --; //уменьшаем текущую размерность массива
for ( int i =0; i < n ; i ++)
cout << a [ i ]<<"\ t ";//выводим измененный массив на экран
}
return 0;
}
Рассмотрим теперь операцию удаления в двумерном массиве. Размерность двумерного массива также зафиксирована на этапе объявления массива. Однако при необходимости можно «смоделировать»удаление целой строки в массиве, выполняя сдвиг всех строк, начиная с k-той на единицу вверх. В этом случае размерность массива не изменится, а текущее количество строк будет уменьшено на единицу. В качестве примера удалим из двумерного массива, строку с номером k.
#include <iostream>
using namespace std;
//функция создает и заполняем двумерный массив
int ** create(int &n, int&m)
{
cout <<"n=";cin >>n; cout <<"m="; cin >>m;
int **mas = new int *[n];
for (int i=0; i<n;++i)
mas[i]=new int [m];
for (int i=0; i<n; ++i)
for (int j=0; j<m; ++j)
{
cout<<"mas["<<i<<"]["<<j<<"]="
cin>>mas[i][j];
}
return mas;
}
//функция выводит двумерную матрицу на экран в виде таблицы
void print (int **mas, int n,int m)
{
for (int i=0; i<n; i++,cout<<endl)
for (int j=0; j<m; j++)
cout<<mas[i][j]<<"\t";
}
//функция освобождает память, выделенную под параметр массив
void deleteMas(int **mas, int n)
{
for (int i=0;i<n;i++)
delete [] mas[i];
delete [] mas;
}
int main()
{
int n, m, k;
int **a=create(n,m);
print(a,n,m);//выводим первоначальный массив
cout<<"k=";
cin>>k; //вводим номер строки для удаления
if (k<0 || k>n-1)
cout<<"error"; /*если номер строки отрицательный или больше номера
последнего элемента, то выводим сообщение об ошибке*/
else
{
delete [] a[k]; //освобождаем память, выделенную для k -той строки массива
for (int i=k; i<n-1; ++i)
a[i]=a[i+1]; //переадресум указатели, начиная с k-той строки
a[n-1]=NULL; //указатель на n-1 строку обнуляем
--n; //уменьшаем текущее количество строк
print(a,n,m); //выводим измененный массив
}
deleteMas(a, n); //освобождаем память
return 0;
}
Результат работы программы
n=4
m=4
k=1
Исходный массив А4´4 | Измененный массив А3´4 |
0 0 0 0
1 1 1 1 2 2 2 2 3 3 3 3 |
0 0 0 0
2 2 2 2 3 3 3 3 |
Аналогичным образом можно удалить k-тый столбец в двумерном массиве. Однако, т.к. нас нет указателей на столбцы массива, сдвиг столбцов нужно будет проводить поэлементно.
#include <iostream>
using namespace std;
int ** create(int &n, int&m)
{
cout <<"n=";
cin >>n;
cout <<"m=";
cin >>m;
int **mas=new int *[n];
for (int i=0; i<n;++i)