• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Język C. Program do wyznacznika macierzy kwadratowej

0 głosów
2,023 wizyt
pytanie zadane 11 października 2015 w Inne języki przez Mateep Użytkownik (850 p.)

WItam czy mogłby ktoś mi pomóc z tym zadaniem??
kompletnie nie wiem jak się zabrać :( najgorsza chyba allokacja tablicy 2 wymiarowej.

 Napisac w jezyku C program obliczajacy wyznacznik macierzy kwadratowej
o dowolnym rozmiarze. Macierz powinna byc wczytywana z pliku tekstowego 
o nastepujacej strukturze:
 
N
a11 a12 .. a1n
a21 a22 .. a2n
....................
an1 an2 .. ann

1 odpowiedź

+2 głosów
odpowiedź 11 października 2015 przez draghan VIP (105,900 p.)
wybrane 11 października 2015 przez Mateep
 
Najlepsza

Pokażę Ci, jak zaalokować tablicę 2D o wymiarze NxN. Czytałem, że można tego dokonać w pojedynczym wywołaniu malloc, ale nie jestem na tyle otrzaskany z C - mój sposób na pewno działa, a tamtego to nie próbowałem.

Zwróć uwagę na miejsce alokacji zewnętrznego wymiaru tablicy: spójrz jak obliczona jest ilość pamięci potrzebnej do przechowania każdej z pod-tablic.

I nie bagatelizuj znaczenia zwalniania pamięci!!!

#include <stdlib.h>
#include <stdio.h>

unsigned get_N()
{
    // wczytanie N z pliku, gdzie N to liczba wierszy (i kolumn)
    // u mnie tylko makieta funkcji
    return 4;
}

void clean(double **table, unsigned size)
{
    unsigned i;
    for(i = 0; i < size; ++i)
    {
        free(table[i]);
    }
    free(table);
    table = NULL;
}

int main()
{
    unsigned N = get_N();

    /*
        Część alokacyjną umieściłbym dla porządku w jakichś zewnętrznych funkcjach.
        Ale jako że ten program ma tylko pokazywać alokację macierzy NxN, to niech
        zostanie w main(). ;)
    */

    // alokacja odpowiedniej ilości wierszy z rzutowaniem na docelowy typ:
    double **table = (double**)malloc(N * sizeof(double*));
    if (table == NULL)
    {
        printf("Blad podczas alokacji tablicy - wymiar zewnetrzny.");
        return EXIT_FAILURE;
    }

    // alokacja każdego wiersza:
    unsigned i;
    for (i = 0; i < N; ++i)
    {
        table[i] = (double*)malloc(N * sizeof(double));
        if (table[i] == NULL)
        {
            printf("Blad podczas alokacji tablicy - wymiar wewnetrzny [%d].", i);
            clean(table, i); // zwalniamy przydzieloną pamięć (ilość dotąd zaalokowanych wymiarów wynosi i)
            return EXIT_FAILURE;
        }
    }

    // ...operacje na macierzy... U mnie też jakieś makietowe, przykładowe.
    // zapisanie doń wartości:
    unsigned j;
    for(i = 0; i < N; ++i)
        for(j = 0; j < N; ++j)
        {
            table[i][j] = i * j;
        }
    // wydruk zawartości:
    for(i = 0; i < N; ++i)
    {

        for(j = 0; j < N; ++j)
            printf("%lf ", table[i][j]);
        printf("\n");
    }

    clean(table, N);
    return EXIT_SUCCESS;
}

 

komentarz 11 października 2015 przez Mateep Użytkownik (850 p.)
Wielkie dzięki!  bardzo pomocna odpowiedź!!
komentarz 11 października 2015 przez draghan VIP (105,900 p.)
Cieszę się, że mogłem pomóc. Owocnej nauki! :)

Podobne pytania

0 głosów
2 odpowiedzi 1,981 wizyt
pytanie zadane 9 października 2015 w C i C++ przez Mateep Użytkownik (850 p.)
0 głosów
1 odpowiedź 75 wizyt
pytanie zadane 20 września 2021 w JavaScript przez qax Mądrala (7,300 p.)
0 głosów
0 odpowiedzi 78 wizyt
pytanie zadane 23 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (7,870 p.)

86,484 zapytań

135,239 odpowiedzi

300,481 komentarzy

57,230 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...