Tablice, maksymalny i minimalny element - uporządkowanie

0

Witam,

Mam napisać program który znajduje wartość największą i najmniejszą w każdym wierszu tablicy i zamienia ją miejscami z pierwszą i ostatnią, tak aby największa liczba w każdym wierszu była po lewej a najmniejsza po prawej.

Zrobiłem takie coś ale nie działa jak należy, bo zamiast zamienić miejscami wartości to ją podstawia i to jeszcze nie do końca dobrze.

#include <stdio.h>
#define N 4
#define M 4
int main()
{
int tab[N][M] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int w,k;
double max, min;
for(w=0;w<N;w++)
{
for(k=0;k<M;k++)
{
max = tab[w][0];
min = tab[w][0];
if(max<tab[w][k])
{max = tab[w][k];
tab[w][0] = max;}
else if(min>tab[w][k])
min = tab[w][k];
tab[w][M-1] = min;

}
}

Powinno wyglądać tak:
4 | 2 | 3 | 1
8 | 6 | 7 | 5
12 | 10 | 11 | 9
16 | 14 | 15 | 13

A wygląda tak:
3 | 2 | 3 | 2
7 | 6 | 7 | 6
11 | 10 | 11 | 10
15 | 14 | 15 | 14

Proszę o pomoc gdzie coś pomieszałem i jak zrobić żeby zmieniało miejscami wartości a nie podstawiało.
Elementy w tabeli na początku mogą być dowolne, nie muszą być po kolei(1,2,3...) tak jak dałem.

1

Bo nadpisujesz indexy zamiast zamieniać.

if(max<tab[w][k])
{
    max = tab[w][k]; // dobrze.. przypisujesz do maxa aktualny, ale..
    tab[w][0] = max; // tu źle - przypisujesz pierwszemu indexowi maxa, zacierając go, a poprzedni zostaje jaki był
}

BTW w ogóle co to za formatowanie??

Musisz zamienić indexy. Piszesz w C czy C++? Jak w C++ to masz taką funkcję swap(int, int); która zamienia dwie wartości, jak w C to sam sobie taką napisz (aczkolwiek w C też może być taka, powinna być w <algorithm>):

void swap(int i, int j) 
{
   int t = i;
   i = j;
   j = t;
}

I teraz trzeba ją wstawić w odpowiednie miejsce:

#include <stdio.h>
#include <algorithm>
#define N 4
#define M 4

int main()
{
    int tab[N][M] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
    int w, k;
    double max, min;
    for(w = 0; w < N; w++)
    {
        for(k = 0; k < M; k++)
    {
    max = tab[w][0];
    min = tab[w][0];
    if (max<tab[w][k])
    {
        max = tab[w][k];
        swap(tab[w][k], tab[w][0]);
    }
    else if (min > tab[w][k])
    {
        min = tab[w][k];
        swap(tab[w][k], tab[w][M - 1]);
    }
}
0

Piszę w C.
Nie wiem co robię źle, ale dalej nie działa

#include <stdio.h>
#include <algorithm>
#define N 4
#define M 4
void swap(int i, int j)
{
   int t = i;
   i = j;
   j = t;
}
int main()
{
    int tab[N][M] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
    int w, k;
    double max, min;
    for(w = 0; w < N; w++)
    {
        for(k = 0; k < M; k++)
    {
    max = tab[w][0];
    min = tab[w][0];
    if (max<tab[w][k])
    {
        max = tab[w][k];
        swap(tab[w][k], tab[w][0]);
    }
    else if (min > tab[w][k])
    {
        min = tab[w][k];
        swap(tab[w][k], tab[w][M - 1]);
    }
}
}

Chyba że wkleiłem w złe miejsce, mam jeszcze pytanie czy da się to zrobić bez dodatkowych bibliotek i jak to najprościej zrobić, sorry za głupie pytania ale jestem mniej niż początkujący.

1

Jeśli piszesz w c, to nie ma czegoś takiego jak biblioteka algorithm, ani zawarty w niej swap.
Customowy swap w c wyglądałby tak:

void swap(int* a, int* b)
{
	int t=*a;
	*a=*b;
	*b=t;
}

a jego zastosowanie

int a=12,b=5;
swap(&a,&b);

Z racji że w c nie ma referencji, to argumenty do swapa musimy przekazać jako wskaźniki do nich.

0

Ok, dzięki, czyli mam teraz:

#include <stdio.h>
#define N 4
#define M 4
void swap (int *x, int* y)
{
int t;
t=*x;
*x=*y;
*y=t;
}
int main()
{
    int tab[N][M] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
    int w, k;
    double max, min;
    for(w = 0; w < N; w++)
    {
        for(k = 0; k < M; k++)
    {
    max = tab[w][0];
    min = tab[w][0];
    if (max<tab[w][k])
    {
        max = tab[w][k];
        swap(&tab[w][k], &tab[w][0]);
    }
    else if (min > tab[w][k])
    {
        min = tab[w][k];
        swap(&tab[w][k], &tab[w][M - 1]);
    }
}
    }

Ale w dalszym ciągu nie wiem czemu mi nie działa, wypisuje:

4 | 1 | 2 | 3
8 | 5 | 6 | 7
12 | 9 | 10 | 11
16 | 13 | 14 | 15

0

Nie działa dlatego, że <rozpisz sobie to w notatniku co po kolei się dzieje> są zamieniane, ale nie jest uwzględnione to, że wiersz się zmienia po zamianie i przez to pozycje wartości są gdzie indziej, więc nie są dobrze porównywane. Musiałbyś kilkakrotnie przejść po wierszu, aż zostanie "posortowany", max na lewo, min na prawo.

Można inaczej zrobić. Przeszukać najpierw cały wiersz, znaleźć max i min, zapamiętać ich pozycję i dopiero zamienić pozycje.

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