Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
vaclavik.thomas:10.2.2015 22:46

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 Valkovič:10.2.2015 23:10

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
Odpovídá na vaclavik.thomas
Drahomír Hanák:11.2.2015 9:09

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
11.2.2015 9:09
Avatar
vaclavik.thomas:11.2.2015 11:19

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
Tvůrce
Avatar
Odpovídá na vaclavik.thomas
David Novák:11.2.2015 13:07

#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:11.2.2015 13:35

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:11.2.2015 16:16

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:11.2.2015 23:22

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
Tvůrce
Avatar
Odpovídá na vaclavik.thomas
David Novák:12.2.2015 7:47

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
12.2.2015 9:07
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
David Novák:12.2.2015 9:10

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:12.2.2015 9:36

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
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.