суббота, 16 июля 2011 г.

С++: Работа с матрицами

Увидев, какое задание на вторую лабораторную приготовил мне преподаватель, я немного ужаснулся... Тогда я мог только нарисовать матрицу, но никак не мог даже представить, какие операции надо будет сделать, чтобы написать лабораторную..

Но это было недолго..Пораскинув мозгами, я и мой однокурсник (да..признаюсь..лабу делал не я один) написали более - менее рабочую программку. Вот задание и код:

/*1.   Даны действительная матрица размера n x (n+1), действительные числа a1, ..., an+1, b1, ..., bn+1,
натуральные числа p, q, (p n, q n+1). Образовать новую матрицу размера (n+1) x (n+2)
вставкой после строки с номером p данной матрицы новой строки с элементами a1, ..., an+1 и
последующей вставкой после столбца с номером q нового столбца с элементами b1, ..., bn+1 .


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

 Разработать алгоритм решения задачи обработки двумерного массива, хранящегося в динамической области памяти.
 Реализовать алгоритм на языке С++ с помощью функций с параметрами:
 1) функция выделения памяти для размещения массива, возвращающая указатель на указатель на массив;
 2) функция ввода массива (в качестве параметров выступают указатель на указатель на массив и его размерность)
 3) функция вывода массива (в качестве параметров выступают указатель на указатель на массив и его размерность);
 4) функция (функции) расчета (может быть с типом, т.е. возвращает значение результата или void-функция);
 5) 1) функция освобождения памяти. В главной функции должны быть объявлены указатели, реализованы вызовы функций
 и вывод результатов на экран. Условие задачи выбрать из файла Приложение1.doc (Задача 2) по номеру в журнале.
*/
#include <iostream>
#include <stdlib.h>
using namespace std;

/////////////////////////////////////////////////////
//Выделение памяти под  матрицу
double **createMatrix(int k,int n){
       double **matrix = new double *[k];
        for (int i = 0; i < k; i++){
             matrix[i] = new double [n];
        }    
       return matrix;
}
/////////////////////////////////////////////////////
//Выделение памяти под динамически массив
double *takeMassiv (int k)
{
       double *massiv = new double [k+2];
       return massiv;
}
/////////////////////////////////////////////////////
//Ниже представлены функции удаления динамических массивов и матриц
void deleteMatrix (int k, double **matrix){
       for (int i = 0; i < k; i++) delete matrix[i];
       delete [] matrix;
}
////
void massivDelete(double *massiv)
{
       delete[]massiv; massiv=NULL;
}
////////////////////////////////////////////////////
///Следующие три функции 
//inputMatrix - заполнение выделеной пямяти под матрицу числами                                     
//inputMassiv - заполнение выделеной памяти под массив числами                                   
//outputMatrix - вывод матрицы на экран консоли
void inputMatrix(int k,int n, double **matrix){
       cout << "Введите элементы матрицы:" << endl;
       for (int i = 0; i < k; i++){
             for (int j = 0; j < n; j++){
                    cout << " a[" << i+1 << "," << j+1 << "] = ";
                    cin >> matrix[i][j];
             }
       }
}
////
void inputMassiv(int k, double *massiv){
       cout << "Введите элементы 2х масивов а и b:" << endl;
       for (int i = 0; i < k+1; i++){
             cout << " №[" << i+1 << "] = ";
                    cin >> massiv[i];
       }
}
////
void outputMatrix(int k,int n, double **matrix){
       cout << "Ваша матрица:" << endl;
       for (int i = 0; i < k; i++){
             for (int j = 0; j < n; j++){
                    cout << " " << matrix[i][j] << " ";
             }
             cout << endl;
       }
}
///////////////////////////////////////////////////////
//Перед вами функция обработки матрицы, тоисть
//создание новой матрицы k+1 x k+2, куда после р-строки ставится *massiv1
//а после q столбца ставится *massiv2
double ** matrixProcessing(int k,int n, double **matrix,int p,int q, double *massiv1, double *massiv2)
{
       double **newMatrix = createMatrix(k+1,k+2);//создание новой матрицы
       int i,j;
       for(i=0; i<k;i++) {  //цикл копирования в новую матрицу данных из старой
             for(j=0;j<k+1;j++){
                    newMatrix[i][j]=matrix[i][j];
             }
       }
       for(i=k; i>p;i--) { //цикл с убыванием
             for(j=0;j<k+1;j++){//котобый создает пустую строку после строки с номером р
                    newMatrix[i][j]=matrix[i-1][j];
             }
       }

       for(j=0;j<k+1;j++){
             newMatrix[p][j]=massiv1[j];//заполнение пустой строки массивом *massiv1
       }

    for(i=0; i<k+1;i++) { //создание пустого столбца
             for(j=k+1;j<k+1;j--){
                    newMatrix[i][j]=matrix[i][j-1];
             }
       }

    for(i=0; i<k+1;i++) { //заполнение его *massiv2
             newMatrix[i][q]=massiv2[i];
       }
       cout << "Матрица обработана!" << endl;
       return newMatrix;
 }

void main(){
       setlocale(LC_ALL,"Russian");


int k,n,p,q;
cout<<"Число строк матрицы = ";
cin>>k;
cout<<"Число столбцов матрицы = ";
cin>>n;
      
       //Выделение памяти
       double **uMatrix = createMatrix(k,k+1);
       double **newMatrix = createMatrix(k+1,k+2);
       double *masiv1 = takeMassiv(k);
       double *masiv2 = takeMassiv(k);;
      
       //Ввод матрицы
       inputMatrix(k,n,uMatrix);
       //Вывод матрицы
       outputMatrix(k,n,uMatrix);
       //ввод масивов
       inputMassiv(k,masiv1);
    inputMassiv(k,masiv2);


cout<<"Число p = ";
cin>>p;
cout<<"Число q = ";
cin>>q;

       //Обработка матрицы
       newMatrix=matrixProcessing(k,n,uMatrix,p,q,masiv1,masiv2);
 
    //Вывод матрицы
       outputMatrix(k+1,n,newMatrix);

       //Освобождение памяти
       deleteMatrix(k,newMatrix);
       deleteMatrix(k,uMatrix);
       massivDelete(masiv1);
       massivDelete(masiv2);
       cin.get();
       cin.get();
}

Вот результат работы программы:
 P.S. Была небольшая неразбериха с k и n, но в конечном результате все работает

Комментариев нет:

Отправить комментарий