realbestriven Temat założony przez niniejszego użytkownika |
Dzialania na plikach i na macierzach » 2017-06-09 13:18:18 Mam oto taki program mnożący macierz przez macierz... jednakże za Chiny ludowe nie wiem czemu nie może mi sie udać mnożenie macierzy przez wektor. #include "stdafx.h" #pragma warning (disable: 4996) #pragma warning (disable: 4244) #include<stdio.h> #include<stdlib.h> #include<string.h> void mnozenie( double ** tab, double ** bab );
int n, m, o, p; FILE * we, * wy; int main() { int i, j; double ** a; double ** b; we = fopen( "dane.txt", "r" ); wy = fopen( "wynik.txt", "w" ); fscanf( we, "%d %d", & n, & m ); fscanf( we, "%d %d", & o, & p ); a =( double ** ) malloc( n * sizeof( double * ) ); for( i = 0; i < n; i++ ) { a[ i ] =( double * ) malloc( m * sizeof( double ) ); } for( i = 0; i < n; i++ ) { for( j = 0; j < m; j++ ) { fscanf( we, "%lf", & a[ i ][ j ] ); } } b =( double ** ) malloc( o * sizeof( double * ) ); for( i = 0; i < o; i++ ) { b[ i ] =( double * ) malloc( p * sizeof( double ) ); } for( i = 0; i < o; i++ ) { for( j = 0; j < p; j++ ) { fscanf( we, "%lf", & b[ i ][ j ] ); } } mnozenie( a, b ); return 0; } void mnozenie( double ** tab, double ** bab ) { int i, j, k; double czesc = 0; double wszystko = 0; double ** c; c =( double ** ) malloc( n * sizeof( double * ) ); for( i = 0; i < n; i++ ) { c[ i ] =( double * ) malloc( p * sizeof( double ) ); } for( i = 0; i < n; i++ ) { for( j = 0; j < p; j++ ) { c[ i ][ j ] = 0; for( k = 0; k < o; k++ ) { c[ i ][ j ] += tab[ i ][ k ] * bab[ k ][ j ]; } } } for( i = 0; i < n; i++ ) { for( j = 0; j < p; j++ ) { printf( "%lf ", c[ i ][ j ] ); fprintf( wy, "%lf ", c[ i ][ j ] ); } printf( "\n" ); fprintf( wy, "\n" ); } }
[ / i ]
--------------------------------------- #include "stdafx.h"
#pragma warning (disable: 4996) #include <string.h> #include <stdio.h> #include <stdlib.h> #include <windows.h>
int main() { SetConsoleCP( GetACP() ); SetConsoleOutputCP( GetACP() ); FILE * we = fopen( "we.txt", "r" ); FILE * wy = fopen( "wy.txt", "w" ); fseek( we, 0, SEEK_END ); int size = ftell( we ); char * buffor =( char * ) malloc( size * sizeof( char ) ); fseek( we, 0, SEEK_SET ); char tab[ 14 ]; char c; int i = 0; int j = 0; while(( buffor[ j ] = getc( we ) ) != EOF ) { if( buffor[ j ] == '\n' ) { i++; } j++; } buffor[ j ] = '\0'; printf( "%d", i ); printf( "%s", buffor ); return 0; }
|
|
czaffik |
» 2017-06-09 14:00:03 Bo coś źle robisz?
Staraj się pokazać kod w przyjaźniejszej formie, najpierw wstaw między znaczniki [cpp]...[/cpp].
Pokaż przykład który nie wymaga wczytywania z pliku (no chyba że masz problemy z wczytywaniem z pliku) bo nie wiadomo co tam trzymasz, same podwójne wskaźniki i malloci są wystarczająco odstraszające, przy okazji będziesz miał pewność że dane z pliku są dobrze wczytywane, albo nie.
|
|
mateczek |
» 2017-06-09 16:27:16 Aby pomnożyć macierze, macierz B musi mieć tyle wierszy ile kolumn ma macierz A (wg ogólnej definicji mnożenia macierzy). Co rozumiesz przez "mnożenie przez wektor" ?? CZy chodzi o taką sytuację?? 1 2 3 3 1 34 1 2 3 1 X 3 = 24 1 1 1 1 4 13 5
|
|
czaffik |
» 2017-06-09 17:42:26 Masz coś nie tak z indeksowaniem, ale co jak i gdzie to nie wiem. Z takim kodem daleko nie zajedziesz, za łatwo się w nim pogubić można. struct Matrix { int rows; int cols; double ** data; void create(); void clear(); };
void Matrix::create() { int i = 0; data =( double ** ) malloc( rows * sizeof( double * ) ); for( i = 0; i < rows; i++ ) data[ i ] =( double * ) malloc( cols * sizeof( double ) ); }
void Matrix::clear() { int i = 0, j = 0; for( i = 0; i < rows; i++ ) { for( j = 0; j < cols; j++ ) { data[ i ][ j ] = 0.0; } } }
void mnozenie( Matrix a, Matrix b ) { int i = 0, j = 0, k = 0; Matrix c; c.rows = a.rows; c.cols = b.cols; c.create(); c.clear(); for( i = 0; i < c.rows; i++ ) { for( j = 0; j < c.cols; j++ ) { for( k = 0; k < c.rows; k++ ) { c.data[ i ][ j ] += a.data[ i ][ k ] * b.data[ k ][ j ]; } } } }
int main() { Matrix a; Matrix b; a.rows = 2; a.cols = 2; a.create(); a.data[ 0 ][ 0 ] = 2.0; a.data[ 0 ][ 1 ] = 2.0; a.data[ 1 ][ 0 ] = 1.0; a.data[ 1 ][ 1 ] = 2.0; b.rows = 2; b.cols = 1; b.create(); b.data[ 0 ][ 0 ] = 2.0; b.data[ 1 ][ 0 ] = 4.0; mnozenie( a, b ); return 0; }
|
|
« 1 » |