75661

Моделювання представлення в пам’яті векторів і таблиць

Лабораторная работа

Информатика, кибернетика и программирование

Розробити спосіб економного зберігання в пам’яті розріджених матриць (таблиць). Розробити процедури і функції для забезпечення доступу (читання-запис) до елементів матриці. В контрольному прикладі забезпечити читання і запис всіх елементів матриці. Оцінити час виконання операцій.

Украинкский

2015-01-24

204.8 KB

14 чел.

Міністерство  освіти  і  науки України

Вінницький національний технічний університет

Інститут інформаційних технологій та комп’ютерної інженерії

Кафедра ПЗ

Лабораторна робота №1 варіант №9

з дисципліни Алгоритми та структури даних

Виконала: ст. гр. 1 ПІ-13б                            Лілик Л. С.

Перевірив:                                                       Власюк В. Х.

Вінниця, 2013

Тема: моделювання представлення в пам’яті векторів і таблиць.

Мета: набуття навичок розміщення в пам’яті векторів і таблиць

Завдання:

Розробити спосіб економного зберігання в пам’яті розріджених матриць (таблиць). Розробити процедури і функції для забезпечення доступу (читання-запис) до елементів матриці. В контрольному прикладі забезпечити читання і запис всіх елементів матриці. Оцінити час виконання операцій.

Варіант № 9.

Всі елементи  парних стовпчиків – нульові.

Хід роботи

Створюємо клас Matrix, що відповідатиме за об’єкт типу «матриця». Для нього організовуємо відповідні методи доступу до окремих елементів, виводу на екран усієї матриці, виводу окремих елементів, зміни окремих елементів. У конструкторі матриці вводяться користувацькі значення. На місці парних стовпчиків елементи ще на етапі конструктора занулюються, і значення, які вводить користувач, не присвоюються. Всі наступні функції використовують методи класу для доступу до елементів матриці, зміни та виводу їх. При цьому постійно виконується перевірка чи елемент не нульовий. Всі операції виконуються лише над ненульовими елементами.

Створено функції множення поточної матриці на користувацьку, що за замочування створюється такої ж розмірності. Матриці перемножуються поелементно: значення кожного елемента множиться на значення відповідного елемента другої матриці. В результаті нові значення «записується» у поточну матрицю. Таким чином змінюються знову ж таки лише ненульові елементи матриці (в непарних стовпчиках). За умови множення на нульову матрицю (всі елементи якої дорівнюють нулю) поточна матриця отримує значення «0» для всіх елементів. Але в подальшому можна змінити елементи з непарних стовпчиків (хоча їх значення й дорівнюює нулю).

Використання показників та оперування ненульовими елементами значно зменшують обсяг пам’яті, необхідний для виконання програми.


Блок-схема програми

Лістинг фрагментів програми

// Lab-1_9.cpp

#include "stdafx.h"

class Matrix

{

public:

int row;

int col;

int *(**A);   // arr of columns

 

Matrix(int _row, int _col):row(_row), col(_col) // constructor

{

 A = new int**[row];

 for (int i=0; i<row; ++i)

 {

  A[i]=new int*[col];

  for (int j=0; j<col; ++j)

  {

   cout<<"A["<<i+1<<"]"<<"["<<j+1<<"] = ";

   int a;

   cin>>a;

   if((j%2)==0)

   {

    A[i][j]=new int;

    *A[i][j]=a;

   }

   else

   {

    A[i][j]=0;

   }

  }

 }

}

Matrix(void){} // default constructor

~Matrix()  // destructor

{

}

void Print()  // output matrix

{

 for (int i=0; i<row; ++i)

 {

  for (int j=0; j<col; ++j)

  {

   

   if (A[i][j] != 0)

    cout<<*A[i][j]<<"  ";

   else

   {

    cout<<0<<"  ";

   }

  }

  cout<<endl;

 }

}

int PureAccess(int r, int c) // provides acces to the element

{

 if (A[r-1][c-1] != 0)

  return *A[r-1][c-1];

}

void PureChange(int r, int c, int value)  // changes the element

{

 if (A[r-1][c-1] != 0)

 {

  A[r-1][c-1]=new int;

  *A[r-1][c-1]=value;

 }

 

}

void AccessElem(int r, int c) // output of elements by coordinates

{

 if (r<=row&&c<=col&&r>0&&c>0)

 {

  cout<<"A["<<r<<"]"<<"["<<c<<"] = ";

  if (A[r-1][c-1] != 0)

   cout<<*A[r-1][c-1];

  else

  {

   cout<<0<<"  ";

  }

 }

 else

  cout<<"\nThese coordinates are invalid!\n\n";

}

 

void ChangeElem(int r, int c) // changing of element by its coordinate

{

 if (r<=row&&c<=col&&r>0&&c>0)

 {

  int value=-1;

  cout<<"\nInput new element value: ";

  cin>>value;

  if (A[r-1][c-1] != 0)

   PureChange(r,c, value);

  else

   cout<<"You can not change NULL element.\n";

 }

}

};

int r=0;

int c=0;

int command=0;

int rowG=0;

int colG=0;

void OutputByCoord(Matrix *Arr) // output of the element by its coordinates

{

cout<<"Input number of row: ";

cin>>r;

cout<<"Input number of column: ";

cin>>c;

Arr->AccessElem(r, c);

}

void Change(Matrix *Arr)  // Changes element of the matrix

{

OutputByCoord(Arr);

Arr->ChangeElem(r, c);

Arr->Print();

}

void Mult(Matrix *M, Matrix *Mul) // multiplies elements of two matrix

{

for (int i=0; i<rowG; ++i)

 for (int j=0; j<colG; ++j)

  M->PureChange(i+1, j+1, (Mul->PureAccess(i+1, j+1)*M->PureAccess(i+1, j+1)));

 

cout<<"\nThe new matrix is:\n";

M->Print();

}

int ComList ()  //  the list of commands

{

cout<<"\n\n\t~~~ MAIN MENU ~~~\n";

cout<<"\n - To output the element by its coordinates press 1. ";

cout<<"\n - To change the element press 2. ";

cout<<"\n - To multiply two matrix press 3. ";

cout<<"\n - To exit the menu 123.\n ";

   cin>>command;

cout<<"\nYour command is "<<command<<endl;

return command;

}

 

void MenuExit()  

{

cout<<"\n\nBack to the MAIN MENU. Press any key...\n";

 getch();

}

void Multiplication(Matrix *M)

{

Matrix *Mul;

cout<<"\nInput elements of matrix for multiplication:\n";

Mul = new Matrix(rowG, colG);

Mul->Print();

Mult(M, Mul);

delete Mul;

}

void Menu(Matrix * M)

{

ComList();

while (command != 123)  // while (command != (exit condition) )

{

 switch(command)

 {

  case 1:

   {

    cout<<"\n\t Output the element by its coordinates:\n";

     OutputByCoord(M);

    MenuExit(); break;

   }

  case 2:

   {

    cout<<"\n\t Changing the element:\n";

     Change(M);

    MenuExit(); break;

   }

  case 3:

   {

    cout<<"\n\t Multiplication:\n";

     Multiplication(M);

    MenuExit(); break;

   }

  default: cout<<"\nERROR! Your command is wrong. Please try again. \nPress any key: ";

        getch();

 }

ComList();

}

}

int _tmain(int argc, _TCHAR* argv[])

{

int row=0;

int col=0;

cout<<"Enter array size:\n";

cout<<"Number of rows = ";

cin>>row;

cout<<"Number of columns = ";

cin>>col;

cout<<"\nInput elements:\n";

Matrix *M;

M = new Matrix(row, col);

M->Print();

 

rowG=row;

colG=col;

cout<<"\nTo display the menu press 1.\nTo exit press any other numeric key.\n";

int a=0;

cin>>a;

if(a==1)

 Menu(M);

 

delete M;

 

cout<<endl<<endl;

return 0;

}

 Результат виконання

Складність алгоритму

Складність алгоритму дорівнює ( 11n2+5 )Т, де Т - час виконання.

Висновки

 

Набули навичок розміщення в пам’яті векторів і таблиць. У ході виконання лабораторної роботи було використано спосіб економного зберігання в пам’яті розріджених матриць (таблиць), розроблено процедури і функції для забезпечення доступу (читання-запис) до елементів матриці. Забезпечено читання і запис всіх елементів матриці.


 

А также другие работы, которые могут Вас заинтересовать

72473. ВОЛНОВЫЕ МЕХАНИЧЕСКИЕ ПЕРЕДАЧИ 609 KB
  Генератор устроен так чтобы деформированное гибкое колесо прижималось к внутренней цилиндрической поверхности жесткого колеса с силой достаточной для передачи нагрузки за счет сил трения. При вращении генератора волна перемещений бежит по окружности гибкого колеса.
72474. Подшипники. Назначение и классификация 473.5 KB
  Подшипники служат опорами для валов и вращающихся осей. Они воспринимают радиальные и осевые нагрузки, приложенные к валу, и передают их на раму машины. При этом вал должен фиксироваться в определенном положении и вращаться вокруг заданной геометрической оси.
72475. ПОДШИПНИКИ КАЧЕНИЯ. ОБЩИЕ СВЕДЕНИЯ И КЛАССИФИКАЦИЯ 975.5 KB
  Применение подшипников качения позволило заменить трение скольжения трением качения. Конструкция подшипников качения позволяет изготовлять их в массовых количествах как стандартную продукцию что значительно снижает стоимость производства.
72476. ЧЕРВЯЧНЫЕ ПЕРЕДАЧИ 380 KB
  Существенное отличие червячной передачи от зубчатой заключается в том, что окружные скорости червяка и колеса не совпадают как по величине, так и по направлению. Они направлены друг к другу под углом перекрещивания.
72477. ОСОБЕННОСТИ РАСЧЕТА ПЛАНЕТАРНЫХ ПЕРЕДАЧ 307.5 KB
  Планетарными называют передачи, включающие в себя зубчатые колеса с перемещающимися осями (рис.10.1,а). Передача состоит из центрального колеса с наружными зубьями, центрального колеса b с внутренними зубьями и водила Н, но котором укреплены оси сателлитов g.
72478. ПЕРЕДАТОЧНОЕ ОТНОШЕНИЕ ОДНОСТУПЕНЧАТЫХ И МНОГОСТУПЕНЧАТЫХ ЗУБЧАТЫХ ПЕРЕДАЧ 181 KB
  Масса и габариты редуктора в значительной степени зависят от того, как распределено общее передаточное отношение по ступеням передачи. Лучшие показатели имеют редукторы, у которых диаметры колес (а не шестерен) всех ступеней близки между собой.
72479. МЕХАНИЧЕСКИЕ ПЕРЕДАЧИ 785.5 KB
  Передача состоит из двух шкивов закрепленных на валах и ремня охватывающего шкивы. В зависимости от формы поперечного сечения ремня различают: плоскоременную рис. Основные преимущества ременной передачи: возможность передачи движения на значительное расстояние до 15 м и более...
72480. ЗУБЧАТЫЕ ПЕРЕДАЧИ 740.5 KB
  По форме профиля зуба различают: эвольвентные и круговые передачи. Наиболее распространен эвольвентный профиль зуба, предложенный Эйлером в 1760 году. Он обладает целым рядом существенных, технологических и эксплутационных преимуществ.
72481. РАСЧЕТ ЦИЛИНДРИЧЕСКИХ ПЕРЕДАЧ 426.5 KB
  Преимущественное применение получили колеса с круговыми зубьями. Они менее чувствительны к нарушению точности взаимного расположения колес, их изготовление проще и производится на специальных станках для нарезания и шлифования этих колес в условиях как массового...