Mam na laboratoria do oddania program, a raczej dwa połączone. Napisane już troche mam natomiast po wywaleniu błędu stanęłam w martwym punkcie. Nie mam dodatkowych konsultacji z prowadzącym, musimy tylko oddawać gotowe projekty. Tutaj treści polecen:
A tutaj udostępniam mój program:
plik header.h
#ifndef HEADER_H
#define HEADER_H
#include <iostream>
#include <cstdio>
using namespace std;
class Macierz {
public:
float** matrix; // tab dwuwymiarowa
int m;
int n;
Macierz(); // Konstr domyslny
Macierz(const int m, const int n); // Konstrukt tworzacy macierz o zadanych rozmiarach
Macierz(double** matrix, int n, int m); // Konstr twarzacy macierz na podstawie tab przekazanej jako arg
Macierz(const Macierz& obj); // Konstr kopiujacy
~Macierz(); // Destruktor
void changeDims(int m, int n); // Funkcja mieniajaca rozmiar
int lcols(); // Fun zwaracaca ilosc kolumn
int lrows(); // Fun zwracajaca ilosc wierszy
void generateMacierz(); // fun generuja macierz z przecialu 0.0 do 1.0
void printMacierz(); // fun wypisujaca macierz na ekranie
Macierz& operator=(const Macierz& other);
Macierz operator+(const Macierz& matrix);
Macierz operator-(const Macierz& matrix);
Macierz operator*(const float n);
Macierz operator*(const Macierz& matrix);
Macierz& operator*=(const float n);
Macierz& operator*=(const Macierz& matrix);
Macierz& operator+=(const Macierz& matrix);
Macierz& operator-=(const Macierz& matrix);
bool operator==(const Macierz& other);
bool operator!=(const Macierz& other);
float* operator[](int n);
float operator()(int m, int n);
friend std::ostream& operator<<(std::ostream& os, const Macierz& matrix);
friend std::istream& operator>>(std::istream& is, const Macierz& matrix);
};
Macierz operator+(const Macierz& matrix1, const Macierz& matrix2) {
Macierz outMacierz(matrix1.m, matrix1.n);
for (int i = 0; i < matrix1.m; i++) {
for (int j = 0; matrix1.n; j++) {
outMacierz.matrix[i][j] = matrix1.matrix[i][j] + matrix1.matrix[i][j];
}
}
return outMacierz;
}
Macierz operator-(const Macierz& matrix1, const Macierz& matrix2) {
Macierz outMacierz(matrix1.m, matrix1.n);
for (int i = 0; i < matrix1.m; i++) {
for (int j = 0; matrix1.n; j++) {
outMacierz.matrix[i][j] = matrix1.matrix[i][j] - matrix1.matrix[i][j];
}
}
return outMacierz;
}
#endif
plik fun cpp
#include "header.h"
#include <cstdio>
using namespace std;
//Domyslny konstruktor
Macierz::Macierz() { matrix = NULL; }//m,n 0
// Konstruktor tworzacy macierz o zadnych rozmiarach
Macierz::Macierz(const int m, const int n) {
double** matrix = new double* [m];
for (int i = 0; i < m; i++) matrix[i] = new double[n];
}
// Konstr twarzacy macierz na podstawie tab przekazanej jako arg
Macierz::Macierz(double** matrix, int m, int n) {
/*double***/ matrix = new double* [m];
for (int i = 0; i < m; i++) {
matrix[i] = new double[n];
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = matrix[i][j];
}
}
}
// Konstr kopiujacy
Macierz::Macierz(const Macierz& obj) {
this -> m = obj.m;
this -> n = obj.n;//alokacja
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
{
matrix[i][j] = obj[i][j] ;//odwrotnie
}
}
cout << "konstruktor kopiujacy działa" << endl;
}
// Destruktor
Macierz::~Macierz()
{
for (int i = 0; i < m; i++)
{
delete[] matrix[i];
}
delete[] matrix;
}
// Fun zwaracaca ilosc kolumn
int Macierz::lcols() {
return this->m;
}
// Fun zwracajaca ilosc wierszy
int Macierz::lrows() {
return this->n;
}
// Funkcja mieniajaca rozmiar pamieci
void Macierz::changeDims(int m, int n) {
this->m = m;
this->n = n;
this->matrix = (float**)realloc(this->matrix, m * sizeof(float*));
for (int i = 0; i < m; i++) {
if (this->matrix[i] != nullptr) this->matrix[i] = (float*)realloc(this->matrix[i], n * sizeof(float));
else this->matrix[i] = (float*)malloc(n * sizeof(float));
}
}
// fun generuja macierz z przecialu 0.0 do 1.0
void Macierz::generateMacierz() {
srand(time(NULL));
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
this->matrix[i][j] = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
}
}
}
// fun wypisujaca macierz na ekranie
void Macierz::printMacierz() {
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
cout << this->matrix[i][j] << " " << endl;
}
cout << endl;
}
}
Macierz& Macierz::operator=(const Macierz& other) {
if (this == &other) return *this;
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
this->matrix[i][j] = other.matrix[i][j];
}
}
return *this;
}
Macierz Macierz::operator+(const Macierz& matrix) {
Macierz outMacierz(this->m, this->n);
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
outMacierz.matrix[i][j] = this->matrix[i][j] + matrix.matrix[i][j];
}
}
return outMacierz;
}
Macierz Macierz::operator-(const Macierz& matrix) {
Macierz outMacierz(this->m, this->n);
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
outMacierz.matrix[i][j] = this->matrix[i][j] - matrix.matrix[i][j];
}
}
return outMacierz;
}
Macierz Macierz::operator*(const float n) {
Macierz outMacierz(this->m, this->n);
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
outMacierz.matrix[i][j] = this->matrix[i][j] * n;
}
}
return outMacierz;
}
Macierz Macierz::operator*(const Macierz& other) {
Macierz outMacierz(this->m, other.n);
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
outMacierz[i][j] = 0;
for (int k = 0; k < other.m; k++) {
outMacierz[i][j] += this->matrix[i][k] * other.matrix[k][j];
}
}
}
return outMacierz;
}
Macierz& Macierz::operator*=(const Macierz& other) {
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
this->matrix[i][j] *= other.matrix[i][j];
}
}
return *this;
}
Macierz& Macierz::operator+=(const Macierz& matrix) {
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
this->matrix[i][j] += matrix.matrix[i][j];
}
}
return *this;
}
Macierz& Macierz::operator-=(const Macierz& matrix) {
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
this->matrix[i][j] -= matrix.matrix[i][j];
}
}
return *this;
}
Macierz& Macierz::operator*=(const float n) {
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
this->matrix[i][j] *= n;
}
}
return *this;
}
bool Macierz::operator==(const Macierz& other) {
if (this->m != other.m || this->n != other.n) return false;
for (int i = 0; i < this->m; i++) {
for (int j = 0; j < this->n; j++) {
if (this->matrix[i][j] != other.matrix[i][j]) return false;
}
}
return true;
}
bool Macierz::operator!=(const Macierz& other) {
if (this->m != other.m || this->n != other.n) return true;
for (int i = 0; i < this->m; i++) {
for (int j = 0; this->n; j++) {
if (this->matrix[i][j] != other.matrix[i][j]) return true;
}
}
return false;
}
std::ostream& operator<<(std::ostream& os, const Macierz& matrix) {
for (int i = 0; i < matrix.m; i++) {
for (int j = 0; j < matrix.n; j++) {
std::cout << matrix.matrix[i][j] << " ";
}
std::cout << endl;
}
return os;
}
std::istream& operator>>(std::istream& is, const Macierz& matrix) {
for (int i = 0; i < matrix.m; i++) {
for (int j = 0; j < matrix.n; j++) {
is >> matrix.matrix[i][j];
}
}
return is;
}
float* Macierz::operator[](int n) {
if (n < 0 || n >= this->m) return nullptr;
return this->matrix[n];
}
float Macierz::operator()(int m, int n) {
if (m < 0 || m >= this->m || n < 0 || n >= this->n) return FLT_MAX;
return this->matrix[m][n];
}
plik matrix.cpp
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <float.h>
#include <string>
#include <cstdio>
#include "header.h"
using namespace std;
int main() {
int m = 2;
int n = 2;
double** matrix = new double* [m];
for (int i = 0; i < m; i++) {
matrix[i] = new double[n];
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = 10;
}
}
Macierz m1(m, n);
m1.generateMacierz();
Macierz m2(matrix, m, n);
Macierz m3(m1);
std::cout << " Macierz m1\n" << m1 << std::endl;
std::cout << " Macierz m2\n" << m2 << std::endl;
std::cout << " Macierz m3\n" << m3 << std::endl;
std::cout << "Kolumny: " << m1.lcols() << std::endl;
std::cout << "Wiersze: " << m1.lrows() << std::endl << std::endl;
std::cout << " Macierz m1" << std::endl;
m1.printMacierz();
std::cout << std::endl;
Macierz m5(2, 2);
m5 = m1;
std::cout << " m5\n" << m5 << std::endl;
std::cout << " m2+m1\n" << m2 + m1 << std::endl;
std::cout << " m2-m1\n" << m2 - m1 << std::endl;
std::cout << " m1*5\n" << m1 * 5 << std::endl;
std::cout << " m2*m2\n" << m2 * m2 << std::endl;
m1 += m2;
std::cout << " m1+=m2\n" << m1 << std::endl;
m1 -= m2;
std::cout << " m1-=m2\n" << m1 << std::endl;
bool are_equal = (m1 == m2);
std::cout << " m1 i m2 sa rowne:\n" << are_equal << std::endl;
bool are_not_equal = (m1 != m2);
std::cout << "\n m1 i m2 nie sa rowne: \n" << are_not_equal << std::endl;
std::cout << "\n m2[1][1]\n" << m2[1][1] << std::endl;
std::cout << "\n m2(1,1)\n" << m2(1, 1) << std::endl;
Macierz m6(2, 2);
std::cout << "\nWpisz macierz 6: ";
std::cin >> m6;
std::cout << m6;
}
Może będzie chciało sie komuś w rzucić to w kompilator dojść do tych błędów, a jeśli nie to dołączam
Z góry dzięki za zainteresowanie!