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

Tworzenie i operacje na macierzach

Object Storage Arubacloud
+4 głosów
9,633 wizyt
pytanie zadane 10 kwietnia 2015 w C i C++ przez pulpet112 Użytkownik (760 p.)

Witam!

Na wstepie chcialbym zaznaczyc ze dopiero zaczym swoja przygode z programowaniem w C dlatego moje pytanie moze byc banalne, jednak nie znalazlem w sieci dobrze opisanego problemu z ktorym sie zmagam.

Chcialbym umiec stworzyc program, ktory utworzy maciez o zadanych rozmiarach, skladajaca sie liczb podanych z klawiatury przez uzytkownika. Po utworzeniu np dwoch macierzy, program moglby je pomnozyc i wyswietlic wynik. Albo pomnozyc pewna macierz przez wektor. Jak to zrobic?

Kolejna sprawa to napisanie kodu ktory stworzy konkretna macierz, chocby taka:

Dodam ze orientuje sie co to sa tablice i jak sie je wykorzystuje. Podejrzewam ze tutaj trzeba bedzie uzyc wskaznikow, jednak zrozumienie jak dzialaja te drugie - sprawia mi spore klopoty. Bylbym wdzieczny za lopatologiczne wytlumaczenie, co to jest.

Z gory dzieki za kazda odpowiedz

Pozdrawiam

4 odpowiedzi

0 głosów
odpowiedź 10 kwietnia 2015 przez Mateusz Dalgiewicz Mądrala (5,270 p.)
Witam,
http://edu.i-lo.tarnow.pl/inf/alg/001_search/0068.php Tu masz wszystko opisane krok po kroku, miłej lektury ;) a w razie problemów pisz to postaramy sie pomóc :)
komentarz 11 kwietnia 2015 przez pulpet112 Użytkownik (760 p.)
czytalem troche wczesniej ta strone ale o ile dzieki niej zrozumialem tablice jednowymiarowe, to wielowymiarowych czy wskaznikow juz nie. faktycznie mozna tam znalesc kod do mnozenia maciezy i jej wypelniania jednak nie w C a w C++, poza tym ja chcialbym zrozumiec a nie tylko skopiowac kod ;)
0 głosów
odpowiedź 10 kwietnia 2015 przez Daniel Mazur Obywatel (1,160 p.)
Polecałbym raczej stworzenie tablicy dwu wymiarowej. Dotychczas pewnie robiłeś tylko jedno wymiarową, a tu się okazuje że można zrobić tablice która ma więcje wymiarów np. trój wymiarową, dwu wymiarową. Tablice dwu wymiarową deklaruje się bardzo podobnie do jedno wymiarowej tylko ze podaje się drugi argument np.

bool Tablica[5, 5]

To jest twoja macierz. Wystarczy przypisać odpowiednie wartości.
komentarz 11 kwietnia 2015 przez pulpet112 Użytkownik (760 p.)
wiem, ze musze uzyc tablicy dwuwymiarowej, pytanie brzmi jak ja wypelnic?
komentarz 11 kwietnia 2015 przez Daniel Mazur Obywatel (1,160 p.)
bool Tablica[5, 5] ={1,0,0,0,1
komentarz 11 kwietnia 2015 przez Daniel Mazur Obywatel (1,160 p.)

bool Tablica[5, 5] ={1,0,0,0,1

                                0,1,0,1,0

                                0,0,1,0,0

                                0,1,0,1,0

                                1,0,0,0,1}

komentarz 11 kwietnia 2015 przez Daniel Mazur Obywatel (1,160 p.)
Jak to nie zadziała można po kolei:

bool Tablica[5, 5]

Tablica[0, 0] = true;

Tablica[0, 1] = false;

Tablica[0, 2] = false;

Tablica[0, 3] = false;

Tablica[0, 3] = true;

Tablica[1, 0] = false;

Tablica[1, 1] = true;

i tak dalej...
komentarz 11 kwietnia 2015 przez pulpet112 Użytkownik (760 p.)
po kolei wypelniac faktycznie mozna bez problemu. ale jak zrobic to w petli? w jaki sposob zmieniac indeksy poszczegolnych wymiarow po kazdym obiegu petli tak aby wypelnic wszystkie pola tablicy?

jesli sie tego dowiem to juz bede wiedzial jak stworzyc program ktory umozliwia uzytkownikowi prowadzenie wlasnych liczb do macierzy
komentarz 11 kwietnia 2015 przez Daniel Mazur Obywatel (1,160 p.)
cout << "Podaj liczbe kolumn: ";
int a;
cin>>a;
cout << Podaj liczbe wierszy: ";
int b;
cin >>b;
*Tablica= new bool [a, b];
for(int i=0; i<a;i++)
{
int d=0;
cout << "Podaj wartosc Tablicy ["<<i<<", "<<d<<"] (true / false): ";
cin>> Tablica[i, d];
if(i == a-1)
{
d++;
i=0;
}
}

Powinno zadziałać. Jeżeli będzie jakiś problem zmiń linijke i=0; na i=-1;
komentarz 11 kwietnia 2015 przez niezalogowany
Tutaj masz przykład. Program wczytuje od Ciebie wartości macierzy a potem wypisuje

#include <stdio.h>

int main (){
int i,j;
int macierz[3][3]; //deklaracja macierzy 3x3

for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++){ //wypelnia kolejno wiersze
                scanf("%d", &macierz[i][j]);
        }

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

 return 0;
 }
komentarz 11 kwietnia 2015 przez pulpet112 Użytkownik (760 p.)

@Daniel Mazur  

niestety program nie dziala. Nie znam dokladnie skladni w C++ ale wywalalo mi blad przy *Tablica wiec wczesniej zadeklarowalem: bool*Tablica; i juz nie ma bledow ale program nie dziala...

komentarz 12 kwietnia 2015 przez Daniel Mazur Obywatel (1,160 p.)

Jest to problem związany z alokowaniem tablicy. Tablica dodawana w ten sposób: bool Tablica[] musi miec na starcie podane jakies wartosci jej rozmiaru np. bool Tablica[1,2], natomiast jeżeli chcesz mieć tablice o rozmiarach podanych instrukcja cin to trzeba ja zaalokować dynamicznie: *wskaźnik = new typ zmiennej [rozmiar lub zmienna];.

Spróbuj to poprawić na *Tablica = new bool[b][a];

Napisz czy działa.

komentarz 13 kwietnia 2015 przez pulpet112 Użytkownik (760 p.)

@Daniel Mazur   " [Error] 'Tablica' was not declared in this scope" - taki mam komunikat błędu dla tego wiersza.

0 głosów
odpowiedź 11 kwietnia 2015 przez Maciej Socha Użytkownik (580 p.)
edycja 11 kwietnia 2015 przez Maciej Socha

Jakiś czas temu pisałem program mnożący macierze. Znajdziesz go poniżej wraz z dokłdanym zaznaczeniem co i w którym miejscu się dzieje.

Zacznijmy od początku.

Tablice w C++ to zarezerwowane miejsce w pamięci, które nazwijmy to niefahowo jest prostokątnym, poziomym elementem. Aby zrobić tablicę dwuwymiarową z dynamicznym przydziałem pamięci musisz skorzystać ze wskaźników, ponieważ musimy połączyć ze sobą nasze "prostokąty", które dla nas po połączeniu będą tablicą dwuwymiarową. Dodam, że w pamięci dalej pozostają poziomymi prostokątami, które gdzieś tam się znajdują niekonicznie obok siebie.

Poprzez wskaźnik, którego symbolem jest gwiazdka (*) odwołujesz się do adresu w pamięci, w którym przechowywany jest każdy z naszych "prostokątów".

PS. Napisanie tego to prosta sprawa, ale wytłumaczenie...hmm z tym już dużo gorzej. W razie niejasności postaram się odpowiedzieć na Twoje pytania ;)

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
	int **A, **B, **C;
	int k1, w1;
	int k2, w2;
	int w3, k3;
	int i, j, k, s;

	// odczytujemy wymiary macierzy
	cout << "Wprowadz ilosc wierszy macierzy A:" << endl;
	cin >> w1;
	cout << "Wprowadz ilosc kolumn macierzy A:" << endl;
	cin >> k1;
	cout << "Wprowadz ilosc wierszy macierzy B:" << endl;
	cin >> w2;
	cout << "Wprowadz ilosc kolumn macierzy B:" << endl;
	cin >> k2;

	if (k1 != w2) 
		cout << "Mnozenie macierzy niemozliwe";
	else {
// tworzymy macierze o odpowiednich rozmiarach
		
	//Macierz A
		A = new int *[w1];
		for (i = 0; i < k1; i++)
		{
			A[i] = new int[k1];
		}
	//Macierz B
		B = new int *[w2];
		for (i = 0; i < k2; i++)
		{
			B[i] = new int[k2];
		}
	//Macierz C
		C = new int *[w1];
		w3 = w1;
		k3 = k2;
		for (int i = 0; i < k3; i++)
		{
			C[i] = new int[k3];
		}
		cout << "Wprowadz dane macierzy A" << endl;
		// odczytujemy dane dla macierzy A
		for (i = 0; i < w1; i++)
			for (j = 0; j < k1; j++)
			cin >> A[i][j];

		cout << "Wprowadz dane macierzy B" << endl;
		// odczytujemy dane dla macierzy B
		for (i = 0; i < w2; i++)
			for (j = 0; j < k2; j++)
			cin >> B[i][j];
		cout << endl;
		cout << "Mnozymy:" << endl;
		// mnozymy macierz A przez B i wynik umieszczamy w C
		for (i = 0; i < w3; i++)
		{
			for (j = 0; j < k3; j++)
			{
				s = 0;
				for (k = 0; k < w1; k++)
				{

					s += A[i][k] * B[k][j];
					C[i][j] = s;
				}
			}
		}
		// wyprowadzamy wynik mnozenia z C
		cout << "C = A x B:\n";
		for (i = 0; i < w3; i++)
		{
			for (j = 0; j < k3; j++) cout << setw(6) << C[i][j];
			cout << endl;
		}
		
		// zwalniamy pamiec zajeta przez macierze
		for (i = 0; i < k1; i++)
			delete[] A[i];
			
		for (i = 0; i < k2; i++)
			delete[] B[i];
			
		for (int i = 0; i < k3; i++)
			delete[] C[i];
			
		delete[] A, B, C;
	}
	
	getchar();
	cin.ignore();
	return 0;
}

 

0 głosów
odpowiedź 25 maja 2015 przez isza Początkujący (450 p.)
Tu mam program do tej konkretnej macierzy z Twojego obrazka.
 

#include <iostream>
using namespace std;

 main()

{

const int n=5,m=n;

double a[n][m];

int i,j,x=4;

for(i=0;i<=n-1;i++)
for(j=0;j<=m-1;j++)

  {

   if((i==j)||((i+j)==x))
    a[i][j]=1;

    else
    a[i][j]=0; }

 

 

///////////////////////////////////////////////////////////////////////

///////////////////////////

 

///////////////////////////////////////////////////////////////////////

////////////////////////

for(i=0;i<=n-1;i++)

{

for(j=0;j<=m-1;j++)

cout<<a[i][j]<<"\t";

cout<<endl;

}

}

Podobne pytania

+2 głosów
1 odpowiedź 513 wizyt
pytanie zadane 14 kwietnia 2015 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 939 wizyt
pytanie zadane 2 listopada 2017 w C i C++ przez Kamil Duljas Użytkownik (990 p.)
0 głosów
1 odpowiedź 382 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...