Jump to content

Archived

This topic is now archived and is closed to further replies.

Bielik1991

Kalkulator macierzy - język C

Recommended Posts

Cześć, pokaze najpierw fragment kodu, a potem wyjasnie problem:

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

#define n 10

int wczytaj_z_pliku(float mac[n][n]) /* wczytanie macierzy z pliku do tablicy float */

{

int i, j; /* zmienne pomocnicze do petli */

char name[128]; /* tablica znakow */

printf("Podaj nazwe pliku: ");

scanf("%s", name); /* pobranie nazwy pliku */

FILE *plik = fopen(name, "rb");

if (plik == NULL) /* jesli nie da sie otworzyc */

{

printf("Nie mozna otworzyc pliku!\n");

return 0; /* wychodzimy z funkcji */

}

fflush(stdin); /*czyscimy bufor */

int roz = 0; /* rozmiar tablicy */

float tmp;

while (!feof(plik))

{ /* dopoki nie dotrzemy do konca pliku zczytujemy wartosci liczbowe, w ten sposob sprawdzamy ile mamy liczb, rozmiar tablicy to pierwiastek ze wszystkich liczb */

fscanf (plik, "%f", &tmp);

roz++;

}

fclose(plik); /* zamykamy plik */

plik = fopen(name, "rb"); /* ponownie otwieramy plik */

for (i = 1; i <= (int)sqrt(roz); i++) /* dla rozmiaru tablicy */

for (j = 1; j <= (int)sqrt(roz); j++)

{

fscanf(plik, "%f", &mac[j]); /* wczytujemy liczby do tablicy */

}

fclose(plik); /* zamykamy plik */

return (int)sqrt(roz); /* zwracamy rozmiar tablicy */

}

void zapisz_do_pliku(float mac[n][n], int rozm) // zapisanie do pliku */

{

.....

}

float pokaz_macierz (float mac[n][n], int roz)

{

int i=0;

int j=0;

for(i=0;i<roz;++i)

{

for (j=0;j<roz;++j)

printf("%d", mac[j]);

printf("\n");

}

}

float wyznacznik(float mac[n][n], int roz) /* argumentami sa macierz i jej rozmiar */

{

......

}

void odwrotna(float mac[n][n], int roz) /* obliczanie macierzy odwrotnej */

{

......

}

int main()

{

char wyb = '0'; /* wybor uzytkownika */

float mac[n][n]; /* macierz */

int roz = 0; /* rozmiar macierzy */

float wyzn; /* wyznacznik */

printf("Program liczy macierz odwrotna oraz wyznacznik macierzy.\nAby wykonac te operacje macierz musi byc kwadratowa\n");

roz = wczytaj_z_pliku(mac);

if (roz == 0) /* jesli rozmiar = 0 to taka macierz nie istnieje */

{

return 0;

}

pokaz_macierz (mac, roz);

printf("Wybierz opcje:\n");

printf("1. Oblicz wyznacznik macierzy\n");

printf("2. Stworz macierz odwrotna\n");

while(wyb!='1' && wyb!='2') /* dopoki nie podamy 1 lub 2 */

{

wyb = getchar(); /* pobranie wyboru z klawiatury */

fflush(stdin);

switch(wyb)

{

case '1':

wyzn = wyznacznik(mac, roz); /* obliczenie wyznacznika */

printf("Wyznacznik macierzy: %lf\n", wyzn); /* wypisanie wyznacznika */

break;

case '2':

odwrotna(mac, roz); /* obliczenie macierzy odwrotnej */

zapisz_do_pliku(mac, roz); /* zapisanie macierzy do pliku */

break;

default:

printf("Wybrales zla opcje. Sprobuj jeszcze raz\n");

}

}

printf("Do zobaczenia nastepnym razem\n");

getchar(); /* zatrzymanie programu */

}

Generalnie program odczytuje liczby z pliku tekstowego, ktore juz sa zapisane podobnie jak w macierzy i oblicza te rzeczy ktore ma obliczac. problem jest z funkcja pokaz_macierz (mac, roz). Mianowiccie po wywolaniu jej wyswietlaja mi sie jakies wartosci nie wiadomo skad. Wiekszosc programu napisalem sam,troche pomogl mi kolega,ale z tym nie moge dojsc co jest nie tak. prosze o pomoc. ten plik tekstowy to wyglada tak:

2 2 0

2 1 1

1 2 1

Link to comment
Share on other sites

Nie wiem czy to mi się opłaca teraz. Ja chce miec ta funkcje pokaz_macierz zeby sie upewnic jakie elementy posiada tablica, którą ja tworzę przez odczytanie liczb z pliku. Bo laborantka tak przejrzala ten kod i powiedziala mi, że muszę zrobić dynamiczna alokację pamięci przy pomoc funkcji malloc(). Pomoże ktoś? Tej funkcji pokaz_macierz to nawet moze nie byc.

Link to comment
Share on other sites

To wczytywanie z pliku jest dziwne. Masz ustalone, że macierze są kwadratowe? Masz ustalony konkretny format pliku?

Malloc alokuje tablicę jednowymiarową (aka ciągły obszar pamięci) o zadanym rozmiarze.

float * mac = malloc(roz * sizeof(float));

Odwołanie do elementu i, j:

mac[j * liczba_kolumn_aka_długość_wiersza + i]

Link to comment
Share on other sites



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...