Bielik1991 Posted January 18, 2011 Report Share Posted January 18, 2011 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 More sharing options...
[Ekspert] Hakken Posted January 18, 2011 Report Share Posted January 18, 2011 moze niech mac bedzie tablica globalna? latwiej ci sie bedzie odwloywac i nie ebdziesz musial sie bawic w cale to zwracanie i pobieranie jej do funkcji... Link to comment Share on other sites More sharing options...
Bielik1991 Posted January 18, 2011 Author Report Share Posted January 18, 2011 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 More sharing options...
gus Posted January 19, 2011 Report Share Posted January 19, 2011 float pokaz_macierz (float mac[n][n], int roz) printf("%d", mac[j]); Macierz posiada elementy typu float, a ty drukujesz je jako typ całkowity. Powinieneś dać %f zamiast %d. Link to comment Share on other sites More sharing options...
[Ekspert] Mormegil Posted January 19, 2011 Report Share Posted January 19, 2011 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 More sharing options...