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

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

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

6 тем.

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

Лекции.doc

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

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

Указания  по решению задачи . Если в массиве строк, до 0 строку нужно поменять с n - 1,  
1 строку – с n-2i-тую строку - с 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
а 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 случайное число случайное число случайное число случайное число случайное число случайное число

В общем случае, если мы хотим удалить элемент массива  с номером (всего в массиве элементов, а последний элемент имеет индекс n -1 ), то нам необходимо произвести сдвиг элементов,начиная с k +1 -го на одну позицию влево. Т.е. на -ое место поставить k +1 -й элемент, на место k +1 – k +2 -й элемент, …, на место n -2 – n -1 -й элемент. После чего значение уменьшить на 1. В этом случае размерность массива не изменится, изменится лишь текущее количество элементов, и у нас создастся ощущение, что элемент с номером удален. Рассмотрим данный алгоритм на примере:

    #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) 

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