» Poradna » Programy

Nasobení matic v C

Odpovědět  |  Zobrazit bez stromu  |  Upozornit redakci  |  nových odpovědí: 10/10
 |   |  Microsoft Windows 7 Chrome 45.0.2454.101  |  [90.178.90.---]

Zdravím všechnyPotřeboval bych pomoct s programem. Potřebuji vynásobit 2 matice, ale ppořed mi to nefunguje mam v tom trochu chaos dekuji vsem za pomoc.main.c#include <stdio.h>#include <stdlib.h>#include "header.h"int main(){Tmatice matice;Tmatice matrix;Tmatice mat_vys; matrix=read2(); matice=read(); print(matice); printf("\n"); print(matrix); printf("\n"); soucin(matice,matrix); smazat(matice); printm(mat_vys); return 0;}header.h#ifndef HEADER_H_INCLUDED#define HEADER_H_INCLUDEDtypedef unsigned int uint;typedef struct matice{ double **m; int radky; int sloupce;} Tmatice;Tmatice init(int radky,int sloupce);Tmatice read();Tmatice read2();Tmatice soucin();void print(Tmatice m);void printm(Tmatice m);void smazat(Tmatice m);#endif // POLE_H_INCLUDEDfce.c#include "header.h"#include <stdio.h>#include <stdlib.h>Tmatice init(int radky,int sloupce){ double**m=malloc(radky*sizeof(double*)); for(int i=0; i<radky; i++) { m[i]=malloc(sloupce*sizeof(double)); } Tmatice matice= {.m=m,.radky=radky,.sloupce=sloupce}; return matice;}Tmatice read2(){ int radky,sloupce; FILE* f = fopen("matice2.txt","r"); if(f==NULL) printf("Nepodarilo se otevrit."); if(fscanf(f,"%d %d",&radky,&sloupce)!=2||radky<1||sloupce<1) printf("Chyba v parametrech"); Tmatice matrix = init(radky,sloupce); for(int r=0; r<radky; r++) { for(int s=0; s<sloupce; s++) fscanf(f,"%lf",&matrix.m[r][s]); }return matrix;}Tmatice read(){ int radky,sloupce; FILE* f = fopen("matice.txt","r"); if(f==NULL) printf("Nepodarilo se otevrit."); if(fscanf(f,"%d %d",&radky,&sloupce)!=2||radky<1||sloupce<1) printf("Chyba v parametrech"); Tmatice m = init(radky,sloupce); for(int r=0; r<radky; r++) { for(int s=0; s<sloupce; s++) fscanf(f,"%lf",&m.m[r][s]); }return m;}void print(Tmatice m){ for(int radky=0; radky<m.radky; radky++) { for(int sloupce=0; sloupce<m.sloupce; sloupce++) { printf("%g ",m.m[radky][sloupce]); } printf("\n"); }}void printm(Tmatice m){ for(int radky=0; radky<m.radky; radky++) { for(int sloupce=0; sloupce<m.sloupce; sloupce++) { printf("%g ",m.m[radky][sloupce]); } printf("\n"); }}Tmatice soucin(Tmatice m){ Tmatice mat_vys = init(m.radky,m.sloupce); for(int r; r<m.radky;r++) { for(int s; s<m.sloupce;s++) { mat_vys.m[r][s]=mat_vys.m[r][s] + m.m[r][s]*m.m[s][r]; } } return mat_vys;}void smazat(Tmatice m){ for(int i; i< m.radky;i++) free(m.m[i]);}Dekuji za rady.

Odpovědi na otázku

 | Linux Firefox 41.0

Sorry, tohle fakt číst nebudu. Hoď to s normálním formátováním na pastebin. A vzhledem k faktu že jde o domácí úkol to zároveň vhodně okomentuj a sděl kde je podle tebe chyba, nebo co to dělá špatně.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Linux Firefox 41.0

resp. předpokládám že jde o domácí úkol. Jinak bys dávno použil nějakou normální knihovnu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 7 Chrome 38.0.2103.0

Takovehle chaos ani nemá TOP09 v účtenkách

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 45.0.2454.101  |  [77.92.199.---]

Sám jsi chaos, za tohle tazatel nemůže, tento web prostě maže mezery na začátku řídků.Kódy se postují tady:http://paste.ofcode.org/http://pastebin.com/

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Linux Firefox 41.0

Částečně může, tapetovat tělo příspěvku celým zdrojákem prostě prasárna je nehledě na to jestli to formátuje korektně nebo ne.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Linux Firefox 41.0

Mimochodem, teď jsem to zběžně proletěl a na formátování bych pracoval nehledě na to co ořeže poradna.>double**m=malloc(radky*sizeof(double*));Mezerník fakt není nepřítel.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Linux Firefox 41.0

Poprvé v životě vidím - u dronika který není zcela oprávněný :D Je to nečitelný bordel.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Opera 9.80

Psát kód do poradny nejde. Je to hrozně nepřehledné. Jestli chceš pomoct tak to dej třeba na pastebin s nějakým odsazováním ať jsou na první pohled vidět cykly, podmínky, funkce - prostě kde začínají a končí. http://pastebin.com/ a dej sem odkaz.Ale tak v rychlosti tam vidím pár chyb.1) Tmatice soucin(Tmatice m)Pro násobení matic vždy potřebuješ dvě matice, které budeš násobit. Ale u té funkce máš jen jeden parametr. Chybí ti tam ta druhá matice. No a v tom kódu pro násobení taky.2) Podle kódu to vypadá na jazyk C, takže vždy a všude musíš nastavit počáteční hodnotu proměnné, protože nula to fakt být nemusí.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Linux Firefox 41.0

Ono by to šlo prohnat automatickým formátováním a nějakým „beautify“ skriptem (na C++ používám Artistic style), ale přeci jen, je slušnost zadat dotaz čitelně (A s komentáři). Jinak ano, ta funkce je divná a k proměnným bez hodnoty: GCC inicializuje integer s nulovou hodnotou, ale Clang tam prskne jakýkoliv bordel co na tom místě zrovna byl v paměti.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Linux Chrome 44.0.2403.155  |  [213.215.67.---]

nie som ziadny odborni na ce, ale neviem preco si subor kde mas implementacie nenazval 'header.c'. Ale teraz k veci, si asi prvy clovek, ktoremu sa podarilo vynasobit matice so zlozitostou O(n^2). Ak by to fungovalo daj to patentovat, na tom trhnes miliony. Matice sa nasobia nejako takto A[r][s] = B[r][k] * C[k][s].

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Matrix, Void, Double



Určitě si přečtěte