Автор: Пользователь скрыл имя, 17 Января 2011 в 18:57, курс лекций
6 тем.
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, intn)
{
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>m-1)
cout<<"error";
else
{
for (int j=k; j<m-1; ++j) // выполняем
for( int i=0; i<n;++i)
a[i][j]=a[i][j+1];
--m;//уменьшаем текущее количество столбцов в массиве
print(a,n,m);//выводим измененный массив
}
deleteMas(a, n);
return 0;
}
Результат работы программы
n=4
m=4
k=1
Исходный массив А4´4 | Измененный массив А4´3 |
0123
0123 0123 0123 |
023
023 023 023 |
Вернемся к массиву, определенному в самом первом примере. И подумаем теперь, что значит добавить элемент в одномерный массив в позицию с номером k? В этом случае все элементы, начиная с k-ого, должны быть сдвинуты вправо на одну позицию. Однако сдвиг нужно начинать с конца, т.е. на первом шаге на n -е место поставить n -1-ый элемент, потом на n -1-ое место поставить n -2-й элемент, …, наконец, на k +1 место вставить k -й элемент. Таким образом, копия k -го элемента будет на k +1-м месте и на k -е место можно поставить новый элемент. Затем необходимо увеличить текущее количество элементов на 1.
Рассмотрим массив из примера 1 и в качестве k зададим значение равное 3. В этом случае массив будет выглядеть следующим образом:
k=3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
а | 0 | 1 | 4 | 9 | 9 | 16 | случайное
число |
случайное
число |
случайное
число |
случайное
число |
Теперь в позицию с номером 3 можно поместить новое значение. А текущее количество элементов в массиве становится равным 6. Подумайте, почему сдвиг нужно выполнять с конца массива, а не с начала, как мы это делали в случае удаления элемента из массива.
Рассмотрим программную реализацию данного алгоритма:
#include <iostream>
using namespace std;
int main()
{
int n;
cout<<"n=";
cin>>n; //ввели текущую размерность массива
int m =2* n ; //определили максимальную размерность массива
int *a=new int [ m ]; //создали и заполнили массив
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 || n+1>m)
cout <<" error "; /*если введенный номер отрицательный, больше номера последного значимого элемента в массиве или после вставки размерность массива станет больше допустимой, то выдаем сообщение об ошибке, иначе */
else
{
int x ;
cout <<" x =";
cin >> x ; //вводим значение для вставки
for (int i=n; i>k;i--)
a[i]=a[i-1]; // выполняем
a [ k ]= x ; //записываем в позицию k значение х
n ++; //увеличиваем текущую размерность массива
for ( int i =0; i < n ; i ++)
cout << a [ i ]<<"\ t ";//выводим измененный массив
}
return 0;
}
Теперь рассмотрим добавление столбца в двумерный массив. Для этого все столбцы после столбца с номером k передвигаем на 1 столбец вправо. Затем увеличиваем количество столбцов на 1. После этого копия столбца с номером k будет находиться в столбце с номером k+1. И, следовательно, 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 [2* 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 ); //создаем и заполняем матрицу а
int m 2=2* m ; // m - текущее количество столбцов, m 2 –максимально возможное
print ( a , n , m ); //выводим первоначальный массив
cout <<" k ="; cin >> k ; //вводим номер столбца для добавления
if ( k <0 || k > m -1 || m +1> m 2)
cout <<" error "; /*если введенный номер столбца отрицательный, больше номера последного значимого столбца в массиве или после вставки столбца размерность массива станет больше допустимой, то выдаем сообщение об ошибке, */
else
{
for ( int j = m ; j > k ; -- j ) // иначе выполняем поэлементный сдвиг столбцов
for( int i=0; i<n;++i)
a[i][j]=a[i][j-1];
++ m ; //увеличиваем текущее количество столбцов в массиве
for ( int i =0; i < n ; ++ i ) //вводим новые данные в k-тый столбец
{
cout<<"a["<<i<<"]["<<k<<"]=";
cin>>a[i][k];
}
print ( a , n , m ); //выводим измененный массив
}
deleteMas(a, n);
return 0;
}
Результат работы программы
n=4
m=4
k=1
Исходный массив А4 ´ 4 | Содержимое нового столбца | Измененный массив А4 ´ 5 |
0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 |
9
9 9 9 |
0 9 1 2 3
0 9 1 2 3 0 9 1 2 3 0 9 1 2 3 |
Аналогичным образом можно провести вставку новой строки в двумерный массив. Однако, если вспомнить, что двумерный массив – это одномерный массив указателей на одномерные массивы, например, целых чисел. То поэлементный сдвиг строк можно заменить на сдвиг указателей.
# include < iostream >
using namespace std;
int ** create(int &n, int&m)
{
cout <<"n=";
cin >>n;
cout <<"m=";
cin >>m;
int ** mas = new int *[2* 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 ); //создаем и заполняем матрицу а
int n 2=2* n ; // n - текущее количество строк, n 2–максимально возможное
print ( a , n , m ); //выводим первоначальный массив
cout <<" k =";
cin >> k ; //вводим номер строки для добавления
if (k<0 || k>n-1 ||n+1>n2)
cout<<"error";
else
{
for (int i=n; i>k; --i)
a[i]=a[i-1]; // выполняем
++ n ; //увеличиваем текущее количество строк в массиве
a [ k ]= new int [ m ]; //выделяем память под новую строку массива и заполняем ее