Diskuze: Matice násobení, sčítání - C++
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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)
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\documents\visual studio 2013\projects\matice2\matice2\source.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;
}
#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
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.
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();
}
}
}
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";
}
}
v C bys použil scanf nebo ekvivalent.. co přesně použít v C++ netuším
ale určitě existuje nějaká obdoba..
Libor: Jo, to vypadá logicky
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..
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;
Zobrazeno 12 zpráv z 12.