Avatar
vaclavik.thomas:

Ahoj :)

Potřeboval bych poradit, jak napsat kód pro násobení a sčítání matice 3x3 s použitím tříd, metod, dědění.

Editováno 10.2.2015 22:48
 
Odpovědět 10.2.2015 22:46
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

Konkrétní problém? Nikdo to tady za tebe neudělá.
Pokud nevíš jak implementovat matici, tak je to pouze dvourozměrné pole (případně jednorozměrné s dopočtem řádků).
Sčítání/násobení provedeš projitím všech prvků v poli a jejich sečtením/vyná­sobením s prvkem o stejných souřadnicích ve druhé matici.
Dědičnost mě v tomto případě nenapadá, nevidím důvod ji do toho zapojovat.

Nahoru Odpovědět 10.2.2015 23:10
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na vaclavik.thomas
Drahomír Hanák:

Sčítání matic (A + B, kde A, B je matice o rozměrech m x n) je jednoduchá úloha, kterou by měl zvládnout i začátečník. Pseudokód:

Pro 0 <= i < m
  Pro 0 <= j < n
    A[i][j] = A[i][j] + B[i][j]

Násobení matic je o něco složitější, ale základní implementace je také dost jednoduchá. Viz http://en.wikipedia.org/…ltiplication Pokud máš matice rozdílné velikosti (A: m x n, B: a x b), musí platit n = a, výsledná matice (C) bude mít rozměry m x b

Pro 0 <= i < m
  Pro 0 <= j < b
    C[i][j] = 0
    Pro 0 <= k < n
       C[i][j] = C[i][j] + A[i][k] * B[k][j]

V C++ si pak můžeš vytvořit třídu, která akorát bude mít to pole jako vlastnost a příp. přetíží operátory +, * (http://en.cppreference.com/…ge/operators)

 
Nahoru Odpovědět  +1 11.2.2015 9:09
Avatar
vaclavik.thomas:

Díky za rady :) Zkoušel jsem to a píše mi chybu:

Error 1 error C1083: Cannot open include file: 'matice.h': No such file or directory c:\users\tom\do­cuments\visual studio 2013\projects\ma­tice2\matice2\sou­rce.cpp 1 1 Matice2

matice.h

#pragma once
#include <iostream>
using namespace std;

class matice
{
public:
        void vypocet();
        matice();
        ~matice();
};

matice.cpp

#include "matice.h"
#include <conio.h>
#include <windows.h>
#include <iostream>


matice::matice()
{
}


matice::~matice()
{
}

void matice::vypocet()
{
        int aMatrix[3][2] = { { 1, 4 }, { 2, 5 }, { 3, 6 } };
        int bMatrix[2][3] = { { 7, 8, 9 }, { 10, 11, 12 } };
        int product[3][3] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };

        for (int row = 0; row < 3; row++) {
                for (int col = 0; col < 3; col++) {

                        for (int inner = 0; inner < 2; inner++) {
                                product[row][col] += aMatrix[row][inner] * bMatrix[inner][col];
                        }
                        std::cout << product[row][col] << "  ";
                }
                std::cout << "\n";
        }
}

source.cpp

#include <matice.h>
#include <conio.h>
#include <iostream>

using namespace std;

void main(void) {


        matice _matice;
        _matice.vypocet();

        getchar();
        return 0;
}
Editováno 11.2.2015 11:19
 
Nahoru Odpovědět 11.2.2015 11:19
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na vaclavik.thomas
David Novák:

#include <matice.h>
neměl bys to taky mít #include "matice.h" jako v matice.cpp?

a máš ten soubor matice.h ve správném místě? případně (teoreticky) by se mohlo stát, že k němu nemáš práva (občas se pod windows stane) a tudíž ho to nemůže includovat.. Ale vzhledem k tomu, že ho očividně otevíráš a edituješ, tak to nebude ten případ :D

Editováno 11.2.2015 13:10
Nahoru Odpovědět 11.2.2015 13:07
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
vaclavik.thomas:

David Novák:

Díky. Máš pravdu :)

V matice.cpp jsem použil #include <matice.h> místo #include "matice.h".

Program již funguje. Děkuji za rady.

 
Nahoru Odpovědět 11.2.2015 13:35
Avatar
vaclavik.thomas:

Měl bych ještě dotaz :)

Chtěl bych použít zadaný vstup od užitatele ze třídy matice::scitani a použít ho u třídy matice::nasobeni místo těch konstant.

Jak to zapsat?

#include "matice.h"
#include <conio.h>
#include <windows.h>
#include <iostream>

using namespace std;

matice::matice()
{
}


matice::~matice()
{
}

void matice::nasobeni()
{


        int aMatrix[2][2] = { { 1, 2 }, { 1, 2 } };
        int bMatrix[2][2] = { { 3, 4 }, { 3, 4 } };
        int product[2][2] = { { 0, 0 }, { 0, 0 } };

        for (int row = 0; row < 2; row++) {
                for (int col = 0; col < 2; col++) {

                        for (int inner = 0; inner < 2; inner++) {
                                product[row][col] += aMatrix[row][inner] * bMatrix[inner][col];
                        }
                        std::cout << product[row][col] << "  ";
                }
                std::cout << "\n";
        }
}

void matice::scitani()
{
        {

                const int row = 2, col = 2;

                cout << "Rozměry matic : " << row << " X " << col << "\n" << endl;

                int first[row][col], second[row][col];


                int i, j;
                for (i = 0; i<row; i++){

                        cout << "Vložte hodnoty první matice pro řádek: " << i + 1 << endl;
                        for (j = 0; j<col; j++){
                                cin >> first[i][j];
                        }

                }

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

                        cout << "Vložte hodnoty druhé matice pro řádek: " << i + 1 << endl;

                        for (j = 0; j<col; j++){
                                cin >> second[i][j];

                        }

                }

                // Výsledek
                for (i = 0; i<row; i++){

                        for (j = 0; j<col; j++){
                                first[i][j] = first[i][j] + second[i][j];

                        }

                }

                cout << "\n\n\t\tVýsledek pro sečtení:" << endl;
                for (i = 0; i<row; i++){
                        cout << endl;
                        for (j = 0; j<col; j++){
                                cout << "\t\t" << first[i][j] << "    ";


                        }
                        cin.get();
                }



        }
}
Editováno 11.2.2015 16:18
 
Nahoru Odpovědět 11.2.2015 16:16
Avatar
vaclavik.thomas:

Resp. jak můžu pořešit vstup od uživatele z klávesnice do této třídy? (Místo těch konstant).

void matice::nasobeni()
{


       int aMatrix[2][2] = { { 1, 2 }, { 1, 2 } };
       int bMatrix[2][2] = { { 3, 4 }, { 3, 4 } };
       int product[2][2] = { { 0, 0 }, { 0, 0 } };

       for (int row = 0; row < 2; row++) {
               for (int col = 0; col < 2; col++) {

                       for (int inner = 0; inner < 2; inner++) {
                               product[row][col] += aMatrix[row][inner] * bMatrix[inner][col];
                       }
                       std::cout << product[row][col] << "  ";
               }
               std::cout << "\n";
       }
}
Editováno 11.2.2015 23:23
 
Nahoru Odpovědět 11.2.2015 23:22
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na vaclavik.thomas
David Novák:

v C bys použil scanf nebo ekvivalent.. co přesně použít v C++ netuším :D
ale určitě existuje nějaká obdoba..

Nahoru Odpovědět 12.2.2015 7:47
Chyba je mezi klávesnicí a židlí.
Avatar
Nahoru Odpovědět  +1 12.2.2015 9:07
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tým ITnetwork
Avatar
David Novák:

Libor: Jo, to vypadá logicky :D

vaclavik.thomas: tak si říkám.. neměl by sis projet nějaký tutoriál pro začátečníky? řešení vstupu/výstupu je celkem základní znalost.. ;)

Nahoru Odpovědět 12.2.2015 9:10
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
vaclavik.thomas:

David Novák: Tutoriály pro začátečníky objektového programování v C++ si procházím na tomto webu :) Hodně mi to pomohlo, ale raději se zeptám i v diskuzi.

Libor Šimo: Díky použiju cin >> std;

 
Nahoru Odpovědět  +1 12.2.2015 9:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.