[C] Funkcja zamieniająca miejscami dwa wiersze macierzy

Witam. Nie wiem za bardzo jak wyglądać ma funkcja w moim programie która zamieniałaby np. dwa pierwsze wiersze wczytanej macierzy.

Byłbym wdzięczny za pomoc.

Mój kod programu:

#include 

#include 

#include 

#include 


void wczytajMacierz(int n, int tab[100][100])

{

	int i, j;


	for(i=0; i
		for(j=0; j
		{

			printf("Podaj element tab[%d][%d]: ", i, j);

			scanf("%d", &tab[i][j]);

		}

}


void wypiszMacierz(int n, int tab[100][100])

{

	int i, j;

	for(i=0; i
	{

		for(j=0; j
			printf("%4d", tab[i][j]);

		printf("\n");

	}

}


int zamianaWierszy(int n, int tab[100][100])

{

	int i, j;



	return 1;

}


int main()

{

	int tab1[100][100];

	int n;


	printf("Podaj wielkosc macierzy: ");

	if(!(scanf("%d", &n)==1 && getchar()=='\n'))

		printf("Zle dane!!");

	printf("\n");


	wczytajMacierz(n, tab1);

	printf("\n");

	wypiszMacierz(n, tab1);

	printf("\n");

	zamianaWierszy(n, tab1);



	getch();

	return 0;


}

Użyj zmiennej tymczasowej :slight_smile:

No tak właśnie myślałem, ale nie wiem za bardzo jak jej użyć.

Optymalnie będzie zamienić referencje. Po jednej dereferencji dobierzesz się do adresów wskazujących na poszczególne wiersze, wystarczy, że je zamienisz. Nie przepisuj przypadkiem całego wiersza wyraz po wyrazie, bo to bez sensu.

Zbiór parametrów przekazywanych do funkcji proponuje rozszerzyć o jakieś r1, r2 <- które wiersze maja być ze sobą zamienione.

Dzięki wielkie za pomoc, pomogła.

#include 

#include 

#include 

#include 


void wczytajMacierz(int n, int tab[100][100])

{

   int i, j;


   for(i=0; i
      for(j=0; j
      {

         printf("Podaj element tab[%d][%d]: ", i, j);

         scanf("%d", &tab[i][j]);

      }

}


void wypiszMacierz(int n, int tab[100][100])

{

   int i, j;

   for(i=0; i
   {

      for(j=0; j
         printf("%4d", tab[i][j]);

      printf("\n");

   }

}


int zamianaWierszy(int n, int tab[100][100])

{

	int tab_pomoc[100];

	int w1, w2;


	printf("Podaj, ktore wiersze chcesz zamienic:\n");

	printf("Wiersz: ");

	if(!(scanf("%d",&w1))==1 && getchar()=='\n')

	{

		printf("\nChujowe dane.\n");

		return 0;

	}


	printf("Z wierszem: ");

	if(!(scanf("%d", &w2))==1 && getchar()=='\n')

	{

		printf("\nChujowe dane.\n");

		return 0;

	}

	printf("\n");


	--w1;

	--w2;


	for(int i=0;i
	{

		tab_pomoc[i]=tab[w1][i];

		tab[w1][i]=tab[w2][i];

		tab[w2][i]=tab_pomoc[i];

	}


	wypiszMacierz(n, tab);

}


int main()

{

   int tab1[100][100];

   int n;


   printf("Podaj wielkosc macierzy: ");

   if(!(scanf("%d", &n)==1 && getchar()=='\n'))

      printf("Zle dane!!");

   printf("\n");


   wczytajMacierz(n, tab1);

   printf("\n");

   wypiszMacierz(n, tab1);

   printf("\n");

   zamianaWierszy(n, tab1);



   getch();

   return 0;


}

Zrobiłeś dokładnie tak, jak mówiłem, żebyś nie robił. Naiwne O(|r|), podczas gdy można dla wierszy wykonać to w czasie O(1), “przepinając” odpowiednio referencje. Ehh, życie… a raczej nierozumienie wskaźników.