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

Macierz - problem z wpisaniem liczb

Mały hosting, OGROMNE możliwości
0 głosów
283 wizyt
pytanie zadane 25 października 2016 w C i C++ przez ewazdomu Początkujący (320 p.)

Witam, chcę wczytać z pliku .txt macierz kwadratowa zapisaną jak poniżej i gdy próbuję odczytać wartości elementów to np. dla macierzy o rozmiarze 3 zamiast 9 elementów pojawia się 18, próbowałem rozwiązać ten problem sam ale nie udało się mi się. Może ktoś zauważy czemu dopisywane są nowe elementy? 

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

int read();
int size();
int det(int** matrix, int s);

int main()
{
    int s;
    int **m ;
    m = read();
    s = size();
    printf("Rozmiar = %i\n\n", s);


    printf("Wyznacznik wynosi: ",det(m, s));

    return 0;

}
int size()
{
    FILE* f;
    int size;

    f = fopen("matrix.txt", "r");
    if (f == NULL) {
        printf("Blad otwarcia pliku liczby.txt\n");
        return 1;
    }

    printf("Pomyslnie wczytano macierz\n");
    fscanf(f, "%d", &size);

    return size;
}
int read()
{

    FILE* f;
    int liczba, i, j, size;

    f = fopen("matrix.txt", "r");
    if (f == NULL) {
        printf("Blad otwarcia pliku liczby.txt\n");
        return 1;
    }

    fscanf(f, "%d", &size);

    int** matrix;

    matrix = malloc(size * sizeof(int*));
    for (i = 0; i < size; i++) {
        matrix[i] = malloc(size * sizeof(int));
    }

    printf("Sizeof matrix: %ld \n", sizeof(matrix));
    for (; feof(f) == 0;) {
        for (i = 0; i < size; i++) {
            for (j = 0; j < size; j++) {
                fscanf(f, "%i", &liczba);
                matrix[i][j] = liczba;
                printf("%i\t", liczba);
            }
            printf("\n");
        }
    }

    printf("Macierz zostala wypelniona: \n");
    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            printf("%i\t", matrix[i][j]);
        }
        printf("\n");
    }

    fclose(f);

/*    for (i = 0; i < size; i++)
    {
        free(matrix[i]);
    }
    free(matrix);
*/
    return **matrix;
}

int det(int** matrix, int s)
{
    int i = 0, j = 0;
    if(s==1)
        return matrix[i][j];
    if(s==2)
        return matrix[0][0] * matrix[1][1] - matrix[0][0] * matrix [1][1];

}

 

1 odpowiedź

0 głosów
odpowiedź 25 października 2016 przez draghan VIP (106,230 p.)
W funkcji read() masz o jednego fora za dużo przy wczytywaniu danych z pliku. Warunek eof powinieneś sprawdzać w innym miejscu.

Pytania poza konkursem.
Dlaczego Twoje funkcje read() i det() są typu int, skoro mają zwracać wskaźnik int**?
Dlaczego osobno wczytujesz z pliku sam rozmiar macierzy, skoro już na etapie wywołania funkcji read() rozmiar masz dostępny?

Podobne pytania

0 głosów
0 odpowiedzi 608 wizyt
pytanie zadane 23 lutego 2020 w C i C++ przez Michał2019 Nowicjusz (170 p.)
0 głosów
0 odpowiedzi 742 wizyt
pytanie zadane 25 listopada 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 2,572 wizyt
pytanie zadane 24 kwietnia 2016 w C i C++ przez ancyk96 Nowicjusz (120 p.)

93,717 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,262 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...