Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dzialania na plikach i na macierzach

Ostatnio zmodyfikowano 2017-06-09 17:42
Autor Wiadomość
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.

C/C++
#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 ] );
            //    printf("%lf :", a[i][j]);
           
        }
        //    printf("\n");
    }
    //----------------------------------------------------
    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 ] );
            //    printf("%lf :", b[i][j]);
           
        }
        //    printf("\n");
    }
   
   
    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 ]


---------------------------------------


C/C++
#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 ); //ilosc znakow w pliku
   
    char * buffor =( char * ) malloc( size * sizeof( char ) ); //dyn alokacja pamieci
    fseek( we, 0, SEEK_SET ); //powrot do poczatku pliku
    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;
}
P-162290
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.
P-162292
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
           
P-162297
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.

C/C++
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;
}
P-162299
« 1 »
  Strona 1 z 1