[C] tablice wymiarowe

misiekprezes
Użytkownik
Użytkownik
Posty: 74
Rejestracja: 3 cze 2009, o 09:14
Płeć: Mężczyzna
Podziękował: 3 razy

[C] tablice wymiarowe

Post autor: misiekprezes »

witam mam taki problem...
potrzebuję stworzyć program który wykonuje działanie na macierzach...
można prosić o jakąś pomoc? jak wpisywać dane do macierzy... czy tak samo będzię sie robiło dla liczb zespolonych?
Awatar użytkownika
Sokół
Użytkownik
Użytkownik
Posty: 451
Rejestracja: 17 wrz 2006, o 19:22
Płeć: Mężczyzna
Lokalizacja: Zielona Góra
Podziękował: 15 razy
Pomógł: 55 razy

[C] tablice wymiarowe

Post autor: Sokół »

Macierz to zwyczajna tablica dwuwymiarowa, w c++ nie ma osobnego typu dla liczb zespolonych. Dobrze by było zdefiniować typ strukturalny, który by składał się z części rzeczywistej i urojonej.

Wpisywanie danych możesz zrobić w dwóch zagnieżdżonych pętlach, jedna będzie przechodzić po kolejnych komórkach w wierszu, a druga po kolejnych wierszach.

Do tablicy odwołujesz się w sposób tab[kolumna][wiersz] albo tab[wiersz][kolumna], to od Ciebie zależy jak zorganizujesz te dane.

-- czwartek, 15 kwietnia 2010, 21:51 --

stworzywszy typ strukturalna np. Complex, z polem na część rzeczywistą i urojoną stworzyłbyś tablicę takich typów.
misiekprezes
Użytkownik
Użytkownik
Posty: 74
Rejestracja: 3 cze 2009, o 09:14
Płeć: Mężczyzna
Podziękował: 3 razy

[C] tablice wymiarowe

Post autor: misiekprezes »

a moglbys mi pomoc, jak dokladnie wpisywać te dane do tablicy za pomoca struktur...
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C] tablice wymiarowe

Post autor: kadiii »

jak dokladnie wpisywać te dane do tablicy za pomoca struktur.
Nie za pomocą struktur tylko wpisujesz dane do tablicy struktur. Tablica to na poziomie logicznym uporządkowany indeksem zbiór danych - przy czym te dane moga być zarówno standardowym typem jak np. int, double, float itp. jak i typem zdefiniowanym przez ciebie np. jakąś strukturą.
Masz więć strukturę definującą zmienną zespoloną

Kod: Zaznacz cały

struct Copmpex{
 float Re;
 float Im; 
};
Dalej tworzysz tablicę dwuwymiarową takich struktur:

Kod: Zaznacz cały

struct Complex matrix[10][10]; <- statyczna deklaracja, dynamicznie, czyli ze zmiennym rozmiarem za pomocą malloc.
I teraz wpisujesz do tych structur dane:

Kod: Zaznacz cały

for(i=0;i<10;i++)
 for(j=0;j<10;j++)
   scanf("%f %f",&matrix[i][j].Re,&matrix[i][j].Im);
misiekprezes
Użytkownik
Użytkownik
Posty: 74
Rejestracja: 3 cze 2009, o 09:14
Płeć: Mężczyzna
Podziękował: 3 razy

[C] tablice wymiarowe

Post autor: misiekprezes »

ja potrzebuje dynamiczną tablicę...
stworzyłem tą tablicę i tę funkcję ale nie działa...-- 17 kwi 2010, o 16:38 --moglbys mi pokazac jak stworzyc ta tablice struktur dwuwymiarowa, i jak wprowadzac do niej dane....
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C] tablice wymiarowe

Post autor: kadiii »

Napisz tutaj swój cały kod. Powiem ci co masz xle zrobione i podowiem jak zrobić dynamiczna alokację.
misiekprezes
Użytkownik
Użytkownik
Posty: 74
Rejestracja: 3 cze 2009, o 09:14
Płeć: Mężczyzna
Podziękował: 3 razy

[C] tablice wymiarowe

Post autor: misiekprezes »

to jest mój kod:

Kod: Zaznacz cały

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

struct complex {
    double re;
    double im;
};

int main()
{
int x,y,i,j,a,b;
int **macierz;

printf("Podaj wymiary macierzy (x spacja y): ");
scanf("%d %d",&x,&y);

//dynamiczne utworzenie macierzy
 struct complex macierz[x][y];
macierz=(int**)malloc(sizeof(int*)*y);
for(i=0;i<y;i++)
macierz[i]=(int*)malloc(sizeof(int)*x);

//wyzerowanie macierzy
for(i=0;i<y;i++)
for(j=0;j<x;j++)
macierz[i][j]=0;

for (i=0;i<x;i++)
	for (j=0;j<y;j++)
		{
		printf("podaj liczbe: ");
		scanf("%f,%f", &macierz[i][j].re, &macierz[i][j].im);
		}



printf("Wypisanie macierzy:\n");
for(i=0;i<y;i++)
{
for(j=0;j<x;j++)
printf("%d",macierz[i][j]);
putchar('\n');
}


return 0;


} 
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C] tablice wymiarowe

Post autor: kadiii »

"Trochę" namieszałeś.

Kod: Zaznacz cały

//dynamiczne utworzenie macierzy
struct complex macierz[x][y];
macierz=(int**)malloc(sizeof(int*)*y);
for(i=0;i<y;i++)
macierz[i]=(int*)malloc(sizeof(int)*x);
Pierwsza linijka ma oznaczać zadeklaruj mi tablicę chociaż nie podam ci rozmiaru? Pozostała część jest ok tyle, że chcesz mieć tablicę struktur a nie liczb całkowitych.

Kod: Zaznacz cały

//wyzerowanie macierzy
for(i=0;i<y;i++)
for(j=0;j<x;j++)
macierz[i][j]=0;
Skoro będziesz wypełniał tablicę to po co ja zerować, ale jak już chcesz to musisz zerować konkretne pole w strukturze a nie niewiadomo co - musi być

Kod: Zaznacz cały

macierz[i][j].re=0;
macierz[i][j].im=0;
Dalej piszesz

Kod: Zaznacz cały

printf("%d",macierz[i][j]);
nie dość że próbujesz wypisać całą strukturę a nie konkretną wartość pola(tak prosto sie nie da, musisz powiedzieć jakie pole chcesz wypisać) to jeszcze namawiasz funkcje printf żeby wcisnęła to w liczbę całkowitą (%d)?
Tak na koniec to jak cos zaalokujesz w pamieci to warto to potem usunąć choc coraz wiecej ide robi to za nas to jednak jest to dobry zwyczaj - służy do tego funkcja free.
Oto poprawiony kod - pozmieniałem tez trochę wpisywanie i wypisywanie żeby było wygodniej.

Kod: Zaznacz cały

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

struct complex 
{
    float re;
    float im;
};



int main()
{
struct complex ** macierz;
int x,y,i,j;

printf("Podaj wymiary macierzy (x spacja y): ");
scanf("%d %d",&x,&y);

//dynamiczne utworzenie macierzy
macierz=(struct complex **)malloc(y*sizeof(struct complex*));
for(i=0;i<y;i++)
macierz[i]=(struct complex *)malloc(x*sizeof(struct complex));

for (i=0;i<x;i++)
   for (j=0;j<y;j++)
      {
       printf("podaj liczbe(a+bi): ");
       scanf("%f+%fi", &macierz[i][j].re, &macierz[i][j].im);
      }

printf("Wypisanie macierzy:\n");
for(i=0;i<y;i++)
{
 for(j=0;j<x;j++)
 {
  printf("%.2f+%.2fi",macierz[i][j].re,macierz[i][j].im);
  putchar(' ');
 }
 putchar('\n');
}
for(i=0;i<y;i++)
    free(macierz[i]);
  free(macierz);

 return 0;
} 
misiekprezes
Użytkownik
Użytkownik
Posty: 74
Rejestracja: 3 cze 2009, o 09:14
Płeć: Mężczyzna
Podziękował: 3 razy

[C] tablice wymiarowe

Post autor: misiekprezes »

działa:) trochę zmieniłem wpisywanie do macierzy...
teraz aby np dodawać dwie macierze to musze wykorzystać struktury które wykorzystuje się do dodawania dwóch liczb zespolonych, tak?
jakbym czegoś nie wiedział mogę pytać?
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C] tablice wymiarowe

Post autor: kadiii »

musze wykorzystać struktury które wykorzystuje się do dodawania dwóch liczb zespolonych
Coś żeś się uparł do rozumienia struktury jako jakiegos mechanizmu. Tu jest to synonim rekordu, obiektu etc. .
Musisz stworzyć własna funkcję, która jako parametry pobierze dwie struktury typu complex i zwróci strukturę wynikową. Tak byłoby oczywiście najlepiej - można nie używać żadnych funkcji i sumować odpowiednie pola odpowiednich struktur, tylko, że tracimy element strukturalizacji. taki przykładowy nagłówek funkcji:

Kod: Zaznacz cały

struct complex wynik DodajZesp(struct complex a,struct complex b) 
jakbym czegoś nie wiedział mogę pytać?
A czemu miałbys nie móc
misiekprezes
Użytkownik
Użytkownik
Posty: 74
Rejestracja: 3 cze 2009, o 09:14
Płeć: Mężczyzna
Podziękował: 3 razy

[C] tablice wymiarowe

Post autor: misiekprezes »

qrcze nie wiem... nic mi nie wychodzi...
nie wiem jak to zrobić...

-- 20 kwi 2010, o 07:48 --

moglbys spojrzec czy jest wszystko ok?
a moglbys pomoc mi podzielić mi to na funkcje...

Kod: Zaznacz cały

//main.c
#include <stdio.h>
#include <stdlib.h>
#include "macierzenag.h"

/*struct complex
{
    float re;
    float im;
};*/



int main()
{
/*struct complex ** macierz;
int x,y,i,j;*/

printf("Podaj wymiary macierzy1 (x spacja y): ");
scanf("%d %d",&x,&y);

//dynamiczne utworzenie macierzy1
macierz1=(struct complex **)malloc(y*sizeof(struct complex*));
for(i=0;i<y;i++)
macierz1[i]=(struct complex *)malloc(x*sizeof(struct complex));

for (i=0;i<x;i++)
   for (j=0;j<y;j++)
      {
       printf("podaj liczbe(a,b) na miejscu [%d%d]: ",(i+1),(j+1));
       scanf("%f,%f", &macierz1[i][j].re, &macierz1[i][j].im);
      }


printf("Podaj wymiary macierzy2 (x spacja y): ");
scanf("%d %d",&w,&z);

//dynamiczne utworzenie macierzy2
macierz2=(struct complex **)malloc(z*sizeof(struct complex*));
for(i=0;i<z;i++)
macierz2[i]=(struct complex *)malloc(w*sizeof(struct complex));

for (i=0;i<w;i++)
   for (j=0;j<z;j++)
      {
       printf("podaj liczbe(a,b) na miejscu [%d%d]: ",(i+1),(j+1));
       scanf("%f,%f", &macierz2[i][j].re, &macierz2[i][j].im);
      }



//wypisanie macierzy1
printf("Wypisanie macierzy1:\n");
for(i=0;i<y;i++)
{
for(j=0;j<x;j++)
{
  printf("%.2f+%.2fi",macierz1[i][j].re,macierz1[i][j].im);
  putchar(' ');
}
putchar('\n');
}

//wypisanie macierzy2
printf("Wypisanie macierzy2:\n");
for(i=0;i<z;i++)
{
for(j=0;j<w;j++)
{
  printf("%.2f+%.2fi",macierz2[i][j].re,macierz2[i][j].im);
  putchar(' ');
}
putchar('\n');
}

//wypisanie dodania macierzy
printf("Wypisanie dodania macierzy:\n");
for(i=0;i<z;i++)
{
for(j=0;j<w;j++)
{
  printf("%.2f+%.2fi",(macierz1[i][j].re+macierz2[i][j].re),(macierz1[i][j].im+macierz2[i][j].im));
  putchar(' ');
}
putchar('\n');
}


/*for(i=0;i<y;i++)
    free(macierz[i]);
  free(macierz);
*/
return 0;
} 
ODPOWIEDZ