deklaracja macierzy w C

0

Witam, w temacie programowania jestem totalnie zielona .. nie ogarniam tego .. a mam niestety do napisania program który oblicza macierze najpierw 2x2 a później 3x3.. i jest tam dodawanie, odejmowanie, mnożenie oraz odwrotność macierzy ale to mniejsza z tym .. chodzi o sam początek .. nie umiem zadeklarować macierzy tak aby uruchamiając program to ja mogłabym wpisywać wartości jakie mają się pojawić w danej macierzy ... jak to zrobić ? za pewnie to jest banalnie łatwe .. ale nie dla mnie , proszę o pomoc ...

0

Masz już jakiś kod?

2

Kusi mnie by podać linka do kodu dla podobnego tematu, ale jestem przeciwnikiem gotowców.
Dam tylko mały fragment, jako wskazówkę:

// deklaracje z nagłówka:
struct MMatrixDouble;
typedef struct MMatrixDouble *MMatrixDoubleRef;

void MMatrixDoubleFree(MMatrixDoubleRef m);
MMatrixDoubleRef MMatrixDoubleCreate(int rowCount, int columCount);
MMatrixDoubleRef MMatrixDoubleCreateMul(MMatrixDoubleRef a, MMatrixDoubleRef b);
double MMatrixDoubleGet(MMatrixDoubleRef m, int row, int column);
void MMatrixDoubleSet(MMatrixDoubleRef m, int row, int column, double v);
int MMatrixDoubleGetRows(MMatrixDoubleRef m);
int MMatrixDoubleGetColumns(MMatrixDoubleRef m);
void MMatrixDoubleFPrint(MMatrixDoubleRef m, FILE *f);
void MMatrixDoubleFScan(MMatrixDoubleRef m, FILE *f);
MMatrixDoubleRef MMatrixDoubleCreateFScan(int rowCount, int columCount, FILE *f);

// definicje w *.c
struct MMatrixDouble
{
    int rowCount;
    int columnCount;
    double m[];
};

void MMatrixDoubleFScan(MMatrixDoubleRef m, FILE *f)
{
    double *a = m->m;
    for (int row = 0; row < m->rowCount; ++row) {
        for (int col = 0; col < m->columnCount; ++col) {
            fscanf(f, "%lg", a);
            ++a;
        }
    }
}

MMatrixDoubleRef m = MMatrixDoubleCreate(4, 4);
MMatrixDoubleFScan(matrix, stdin);
0
badumts napisał(a):

Masz już jakiś kod?

coś tam próbowałam ale jest jakis błąd ..
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include <stdlib.h>

int main()
{
int i,j;
int x1,x2,x3,x4;
int macierzA[2][2]={x1,x2,
x3,x4};

for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
printf("%-4d",macierzA[i][j]);
printf("\n");
}

getch();
return 0;
}

1

Chodzi Ci o taki zapis?

int macierzA[2][2]={
    {1, 2},
    {3, 4},
};
0

tak tylko chciałabym żeby móc wprowadzać dane do macierzy po uruchomieniu programu (nie wiem czy jasno się wyrażam :/ jeśli nie to przepraszam )

1
int macierzA[2][2];

macierzA[0][0]=1;
macierzA[0][1]=2;
macierzA[1][0]=3;
macierzA[1][1]=4;

lub w pętli (podobnie jak wypisujesz).

0

@amebaumyslowa1234 co ty potrzebujesz konkretnie?
Rozumiem, że chcesz wyczytać macierz ze standardowego wejścia. Pytanie czy rozmiar macierzy masz ustalony sztywno, czy też jest wczytywany ze standardowego wejścia?

Do poczytania: http://www.cplusplus.com/reference/cstdio/scanf/

0

49351211_2221677237872172_1606254198893051904_n.jpg

mam taki projekcik do zrobienia i po prostu nie wiem jak zacząć znaczy sie to co wysłałam wcześniej to próbowałam ale no jak już pisałam jestem zerem w tej działce i nie mam w ogóle pomysłu na to

0

i nie oczekuje że ktoś to za mnie zrobi tylko po prostu potrzebuje jakichkolwiek rad, wskazówek jak to zrobić, jak zacząć , cokolwiek ...

1

Macierze najlepiej się implementuje na tablicach. Można próbować tablic ze wskaźników jak wskazywano u góry, ale to rozwiązanie kiepsko się skaluje, lepiej zrobić jedną tablicę, np:

int macierz[szer * wys];

wówczas dostęp do elementu o współrzędnych x,y (numeracja od zera):

macierz[x + y*szer];

aby wykonać coś dla każdego elementu macierzy zwykle robimy wówczas:

for(int y = 0; y < wys; y++) {
    for(int x = 0; x < szer; x++) {
        // tu jakaś akcja
    }
}

możemy tam wstawić cokolwiek, wczytać element (prawdopodobnie funkcją scanf), wypisać element (prawdopodobnie printf), czy też zmienić wartość. Np. zakładając że mamy 2 macierze: A i Bo tym samym rozmiarze i chcemy dodać B do A:

for(int y = 0; y < wys; y++) {
    for(int x = 0; x < szer; x++) {
        A[x + y*szer] += B[x + y*szer];
    }
}

To absolutna podstawa. Z czasem powinnaś dążyć do rozwiązania, które proponuje @MarekR22, ono pozwala odseparować przeliczanie adresów, unikając duplikowania kodu i robienia głupich błędów, ale na początek skup się na podstawach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1