Funkcja zamieniajaca elemenrty w wierszu W tablicy ( pierwsza z ostatnia w wierszu, druga z przedostatnia w wierszu itd )

0

Czesc!

Staram sie stworzyc funkcje, która najpierw sprawdza czy krancowe elementy w wierszu sa dodatnie, jeśli tak to zeby zamienić pierwsza liczbę z ostatnia, druga z przedostatnia itd.
Ponizej wklejam moja funkcje:
Niestety do if dziala wszystko ok, tzn sprawdza czy suma krancowych elementow w wierszu w Tablicy jest dodatnie a potem niestety zamienia w dziwny sposob liczby w wierszu.
Moze ktos widzi gdzie robie blad.

void funkcja_zmieniajaca(double tablica[][k])
{
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			double suma = 0;
			suma += tablica[i][0];
			suma += tablica[i][k - 1];
			if (suma > 0)
			{
				int schowek;
				schowek = tablica[i][j];
				tablica[i][j] = tablica[i][k - (i + 1)];
				tablica[i][k - (i + 1)] = schowek;
			}
		}
	}
}

Caly program

#include <iostream>
#include <cstdlib>										
#include <iomanip>


using namespace std;

const int w = 5;										// wielkosc tablicy TAB[w][k]
const int k = 5;										// wielkosc tablicy TAB[w][k]

void losowanie_liczb_w_tablicy(double [][k], double ,double );
void drukowanie_tablicy(string,double[][k], int, int);
void drukowanie_sumy_elementow_obwodu(string,double[][k],int);
void funkcja_zmieniajaca(double[][k]);

int main()
{
	const double X = 10;
	const double D = 10;
	const double G = 100;
	double A[w][k] = {};
	double B[w][k] = {};
	
	srand(time(0));

	losowanie_liczb_w_tablicy(A,-X,X);
	losowanie_liczb_w_tablicy(B, D, G);
	drukowanie_tablicy("Tablica A",A,5,1);
	drukowanie_tablicy("Tablica B",B,7,2);
	drukowanie_sumy_elementow_obwodu("Tablicy A",A,1); 
	drukowanie_sumy_elementow_obwodu("Tablicy B",B,2);
	funkcja_zmieniajaca(A);
	drukowanie_tablicy("Tablica A", A, 5, 1);

	system("pause");
	return 0;
}
void losowanie_liczb_w_tablicy(double tablica[][k], double poczatek_przedzialu, double koniec_przedzialu)
{
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			tablica[i][j] = poczatek_przedzialu + (koniec_przedzialu - poczatek_przedzialu) * rand() / double(RAND_MAX);
		}
	}
}
void drukowanie_tablicy(string tekst,double tablica[][k], int szerokosc, int dokladnosc)
{
	cout << "***************" << tekst << "***************" << endl;
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			cout << fixed << setprecision(dokladnosc) << setw(szerokosc) << tablica[i][j] << "\t";
		}
		cout << endl;
	}
	cout << endl;
}
void drukowanie_sumy_elementow_obwodu(string tekst,double tablica[][k],int dokladnosc)
{
	double suma = 0;
	for (int j = 0; j < k; j++)
	{
		suma += tablica[0][j];
	}
	for (int j = 0; j < k; j++)
	{		
		suma += tablica[w -1][j];
	}
	for (int i = 1; i < w-1; i++)
	{
		suma += tablica[i][0];
		suma += tablica[i][k - 1];
	}
	
	cout << fixed << setprecision(dokladnosc) << "Suma " << tekst << " wynosi = " << suma << endl;
}
void funkcja_zmieniajaca(double tablica[][k])
{
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			double suma = 0;
			suma += tablica[i][0];
			suma += tablica[i][k - 1];
			if (suma > 0)
			{
				int schowek;
				schowek = tablica[i][j];
				tablica[i][j] = tablica[i][k - (i + 1)];
				tablica[i][k - (i + 1)] = schowek;
			}
		}
	}
}
1

Miałes tam chyba rekordową liczbę bugów, jak na funkcję kilku linijkową :), warunek kompletnie błędny (na to, że dwie liczby są dodatnie), umieszczony w pętli (zamiast przed), tymczasowa wartość typu int (?!?), zamiana nie tych indeksów, zły warunek stopu wewnętrznej pętli, coś pominąłem? :), po poprawie:

void swap(double ar[][k], int ind, int a, int b) {
	double tmp = ar[ind][a];
	ar[ind][a] = ar[ind][b];
	ar[ind][b] = tmp;
}

void funkcja_zmieniajaca(double tablica[][k])
{	
    for (int i = 0; i < w; i++)
    {	
	   if (tablica[i][0] * tablica[i][k - 1] > 0 && tablica[i][0] > 0) {
         for (int j = 0; j < k / 2 ; j++) 
         {
           swap(tablica, i, j, k - (j + 1));
		 }
       }
    }
}
0
lion137 napisał(a):

Miałes tam chyba rekordową liczbę bugów, jak na funkcję kilku linijkową :), warunek kompletnie błędny (na to, że dwie liczby są dodatnie), umieszczony w pętli (zamiast przed), tymczasowa wartość typu int (?!?), zamiana nie tych indeksów, zły warunek stopu wewnętrznej pętli, coś pominąłem? :), po poprawie:

void swap(double ar[][k], int ind, int a, int b) {
	double tmp = ar[ind][a];
	ar[ind][a] = ar[ind][b];
	ar[ind][b] = tmp;
}

void funkcja_zmieniajaca(double tablica[][k])
{	
    for (int i = 0; i < w; i++)
    {	
	   if (tablica[i][0] * tablica[i][k - 1] > 0 && tablica[i][0] > 0) {
         for (int j = 0; j < k / 2 ; j++) 
         {
           swap(tablica, i, j, k - (j + 1));
		 }
       }
    }
}

Dzięki za odpowiedz !!
i już chciałem dodawać swoje rozwiązanie na forum.
tak wyglada moj kod po poprawie,

void funkcja_zmieniajaca(double tablica[][k])
{
	for (int i = 0; i < w; i++)
	{
		double suma = 0;
		suma += tablica[i][0];
		suma += tablica[i][k - 1];
		if (suma > 0)
		{
			for (int j = 0; j < k - j ; j++)
			{
				double schowek;
				schowek = tablica[i][j];
				tablica[i][j] = tablica[i][k - (j + 1)];
				tablica[i][k - (j + 1)] = schowek;
			}
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1