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

Pliki binarne i tablice

Object Storage Arubacloud
0 głosów
165 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez no_cable Nowicjusz (120 p.)
edycja 4 marca 2018 przez no_cable

Witam potrzebuję pomocy w napisaniu programu. Jestem początkujący w tych sprawach wiec proszę o wyrozumiałość smiley Poniżej zamieszczam zadanie i pliki.

 

W dwóch plikach binarnych zapisana jest: liczba całkowita typu int, określająca stopień macierzy kwadratowej, a następnie jej  elementy  (zapisane  wierszami, typ int).  Jeśli stopień  obu  macierzy  jest  taki  sam,  to  wyświetl  na  ekranie wartości  elementów  obu  macierzy  z  podziałem  na  wiersze  i  kolumny.Następnie oblicz i wyświetl iloczyn obu macierzy.Jeśli stopnie macierzy nie są sobie równe to wyświetl komunikat błędu.

PLIKI

Edit

zacząłem coś takiego:

#include <stdio.h>

int main(void)
{
	
 int N;
 int M;
 int tab[N][M];
 int i,j;
 int macierz3;
 FILE *macierz;
 macierz = fopen("m2.dat","rb");

FILE* macierz2;
 macierz2 = fopen("m4.dat","rb");


 fread(&N,sizeof(int),1,macierz);
  fread(&M,sizeof(int),1,macierz2);
 
 while (feof(macierz) == 0)
 {
 	fread(&i,sizeof(int),1,macierz);
  fread(&j,sizeof(int),1,macierz2);
 	
}
 		for (i=0; i<N; i++)
 for (j=0; j<M; j++)
 {
 macierz3=tab[i][j];
 printf("\n");
 	printf("%d  ",macierz3);
 }
 
 fclose(macierz2);
 fclose(macierz);
 return 0;
}

 

1
komentarz 4 marca 2018 przez Secrus Nałogowiec (32,880 p.)
Pokaż co już sam zrobiłeś. Gotowców na tym forum nie dostaniesz. Spróbuj sam, jak się zatniesz to zadaj konkretne pytanie i wtedy na pewno ktoś pomoże :)

2 odpowiedzi

0 głosów
odpowiedź 4 marca 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
int tab[N][M];

Na tym etapie zmienne N i M mają nieokreślone wartości. Rozmiar tablicy nie zmieni się tylko dlatego, że gdzieś dalej w kodzie te zmienne zmienią wartość. Poza tym czemu chcesz tworzyć tablicę o rozmiarze NxM w tym zadaniu?

Ogólnie cały kod jest do napisania od nowa. Zacznij od wczytania obu macierzy z tych plików i zrób to w dwóch osobnych pętlach, a nie w jednej, bo macierze mogą być różnych rozmiarów.

0 głosów
odpowiedź 7 marca 2018 przez mikusv Nowicjusz (140 p.)

Ja napisałem coś takiego ale niestety występuję błąd przy obliczaniu iloczynu macierzy. Mógłby ktoś poradzić/poprawić co jest nie tak zmienić ?

 

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



void pisz_macierz(int N,FILE *strumien){
int x,a,b;
    fread(&x,sizeof(int),1,strumien);
 while (feof(strumien) == 0)
 {
for (a=0; a<N; a++) {
for (b=0; b<N; b++){
fread(&x,sizeof(int),1,strumien);
printf("%d ",x);
}
printf("\n");
}
 }

}
int mnozenie(int N,FILE *strumien1,FILE *strumien2){
int a,b,p,i,j,k;
int tab1[N][N],tab2[N][N],tab3[N][N];
	fread(&a,sizeof(int),1,strumien1);
 while (feof(strumien1) == 0)
 {
for (i=0; i<N; i++) {
for (j=0; i<N; j++){
fread(&a,sizeof(int),1,strumien1);
	tab1[i][j]=a;
}
printf("\n");
}
}

	fread(&b,sizeof(int),1,strumien2);
while (feof(strumien2) == 0)
 {
for (i=0; i<N; i++) {
for (j=0; i<N; j++){
fread(&b,sizeof(int),1,strumien2);
tab2[i][j]=b;
}
printf("\n");
}
}

printf("Wynik mnozenia macierzy:\n");
for (i=0; i<N; i++) {
for (j=0; i<N; j++){
	p=0;
	for(k=0;k<N;k++)
	p=p+(tab1[i][k]*tab2[k][j]);
}
tab3[i][j]=p;
}


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

void sprawdz_macierz(int x,int y,FILE *strumien1,FILE *strumien2){
    int N,c,v;
if(x==y){
    printf("Macierze maja taki sam stopien \n");
  pisz_macierz(x,strumien1);
    printf("\n");
   pisz_macierz(y,strumien2);
  printf("\n");
  mnozenie(x,strumien1,strumien2);
    }
    else{
    printf("Macierze sa rozne stopniem \n ");
    }
}

int main(void)
{
char znak;
int wybor;
FILE *macierz1;
FILE *macierz2;
FILE *macierz3;
FILE *macierz4;
macierz1=fopen("m1.dat","rb"); //otwarcie strumieni
macierz2=fopen("m2.dat","rb");
macierz3=fopen("m3.dat","rb");
macierz4=fopen("m4.dat","rb");

     if (macierz1 == NULL || macierz2 == NULL || macierz3 == NULL || macierz4 == NULL) //kontrola otwarcia
    {
        printf("Blad otwarcia pliku!\n");
        return -1;
    }

   int a,b,c,d;
    fread(&a,sizeof(int),1,macierz1); //odczytanie stopni macierzy
    fread(&b,sizeof(int),1,macierz2);
    fread(&c,sizeof(int),1,macierz3);
    fread(&d,sizeof(int),1,macierz4);

    do
    {
        printf(" MACIERZE \n");
        printf("Wybierz co chcesz porownac:\n");
        printf("1-Porowanj macierz 1 z 2\n");
        printf("2-Porowanj macierz 1 z 3\n");
        printf("3-Porowanj macierz 1 z 4\n");
        printf("4-Porowanj macierz 2 z 3\n");
        printf("5-Porowanj macierz 2 z 4\n");
        printf("6-Porowanj macierz 3 z 4\n");
        printf("7-Wyjscie\n");
         printf("Wybierz numer: ");
         scanf("%d" ,&wybor);
         printf("\n");
         switch (wybor)
         {
             case 1:
             {
               sprawdz_macierz(a,b,macierz1,macierz2);
             }
             break;
             case 2:
             {
                 sprawdz_macierz(a,c,macierz1,macierz3);
             }
             break;
             case 3:
             {
                 sprawdz_macierz(a,d,macierz1,macierz4);
             }
             break;
             case 4:
             {
                 sprawdz_macierz(b,c,macierz2,macierz3);
             }
             break;
             case 5:
             {
                 sprawdz_macierz(b,d,macierz2,macierz4);
             }
             break;
             case 6:
             {
                 sprawdz_macierz(c,d,macierz3,macierz4);
             }
             break;
             case 7:{
             return 0;
             }
         }

         printf("\nCzy chcesz zakonczyc sprawdzanie macierzy: t/n? ");
         scanf("%s" ,&znak);
         system ("cls");


    }
    while (znak != 't');


fclose(macierz4);
fclose(macierz3);
fclose(macierz2);
fclose(macierz1);
system("Pause");
 return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 74 wizyt
pytanie zadane 9 marca 2019 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 111 wizyt
0 głosów
1 odpowiedź 108 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...