Лекции по программированию

Автор: Пользователь скрыл имя, 17 Января 2011 в 18:57, курс лекций

Описание работы

6 тем.

Работа содержит 1 файл

Лекции.doc

— 615.00 Кб (Скачать)

        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 ]; //выделяем память под новую строку массива и заполняем ее

Информация о работе Лекции по программированию