Uproszczenie zapisu if

0

Jak mogę prościej to zapisać?

  if (y>=z)
    mniejsza = y;
  if (z>=y)
    mniejsza = z;
0

Oto cały kod.
Chciałbym zapisać go jakoś prościej.

if ((x>=y) && (x>=z)){
    najwieksza = x;
    {
        if (y>=z)
            mniejsza = y;
        if (z>=y)
            mniejsza = z;
    }
} else if ((y>=x) && (y>=z)){
    najwieksza = y;
    {
        if (x>=z)
            mniejsza = x;
        if (z>=x)
            mniejsza = z;
    }
} else if ((z>=x) && (z>=y)){
    najwieksza = z;
    {
        if (x>=y)
            mniejsza = x;
        if (y>=x)
            mniejsza = y;
    }
}
0
Po pierwsze to na moje slepe oko ten kod jest błędny: ```c if (y>=z) mniejsza = y; if (z>=y) mniejsza = z; ``` Nie wybiera najmniejszego tylko środkowy

Co do pytania jak uprościć tego wewnętrznego ifa to ja bym napisał:

mniejsza = (y < z) ? y : z
0

Kod ma wybierać największą liczbę i środkową.

mniejsza = (y < z) ? y : z

Możesz mi to wyjaśnić za co odpowiada ? oraz :

3

No to:

mniejsza = (y >= z) ? y : z

Możesz mi to wyjaśnić za co odpowiada ? oraz :

Operator trójargumentowy - skrócony zapis ifa, odpowiednik:

if (y >= z)
    mniejsza = y
else
    mniejsza = z;
2
#include <algorithm>

...

int najwieksza, srodkowa;

int tablica[3] = {x, y, z};
std::sort(tablica, tablica + 3);
najwieksza = tablica[2];
srodkowa = tablica[1];
1

W sumie masz tylko 2 sensownych warianty:

#include <iostream>
using namespace std;

int main()
{
	for(int w,x,y,z;cin>>x>>y>>z;)
	{
		cout<<"w1: ";
		if(x<=y)
		{
			if(x<=z)
			{
				if(y<=z) cout<<x<<' '<<y<<' '<<z;
				else cout<<x<<' '<<z<<' '<<y;
			}
			else cout<<z<<' '<<x<<' '<<y;
		}
		else
		{
			if(y<=z)
			{
				if(x<=z) cout<<y<<' '<<x<<' '<<z;
				else cout<<y<<' '<<z<<' '<<x;
			}
			else cout<<z<<' '<<y<<' '<<x;
		}
		cout<<endl;
		
		cout<<"w2: ";
		if(x>y) w=x,x=y,y=w;
		if(x>z) w=x,x=z,z=w;
		if(y>z) w=y,y=z,z=w;
		cout<<x<<' '<<y<<' '<<z;
		cout<<endl;
	}
	return 0;
}
0

@_13th_Dragon: Wszystko musi być z zastosowaniem if
Bez używania for

3
bifed85954 napisał(a):

Jak mogę prościej to zapisać?

  if (y>=z)
    mniejsza = y;
  if (z>=y)
    mniejsza = z;

Nie wiem czemu nazywa się mniejsza ale logicznie to masz to

mniejsza = std::max(y, z);
0
several napisał(a):
bifed85954 napisał(a):

Jak mogę prościej to zapisać?

  if (y>=z)
    mniejsza = y;
  if (z>=y)
    mniejsza = z;

Nie wiem czemu nazywa się mniejsza ale logicznie to masz to

mniejsza = std::max(y, z);

Mogę zrobić coś na zasadzie?

najwieksza = max(x, y, z);
najmniejsza = min(x, y, z);

posrednia != najwieszka && najmniejsza

0
bifed85954 napisał(a):

Kod ma wybierać największą liczbę i środkową.

mniejsza = (y < z) ? y : z

Możesz mi to wyjaśnić za co odpowiada ? oraz :

A z ilu liczb, inaczej co na wejściu?

1
bifed85954 napisał(a):

Mogę zrobić coś na zasadzie?

najwieksza = max(x, y, z);
najmniejsza = min(x, y, z);

posrednia != najwieszka && najmniejsza

Tak

#include <algorithm>

najwieksza = std::max({x,y,z});
0
lion137 napisał(a):
bifed85954 napisał(a):

Kod ma wybierać największą liczbę i środkową.

mniejsza = (y < z) ? y : z

Możesz mi to wyjaśnić za co odpowiada ? oraz :

A z ilu liczb, inaczej co na wejściu?

3 liczby są,
x, y, z
wybieramy największą liczbę i środkową

1

W obiektowym świecie, tak by to wyglądało

(pseudo kod):

class Triplet {
  public Triplet(int a, int b, int c) {
    this.a=a;
    this.b=b;
    this.c=c;
  }

  public int max() {
    return max(a, max(b, c));
  }

  public int min() {
    return min(a, min(b, c));
  }

  public int mid() {
    if ((b < a && a < c) || (c < a && a < b)) {
       return a;
    }
    if ((a < b && b < c) || (c < b && b < a)) {
       return b;
    }
    return c;
  }
}
0
TomRiddle napisał(a):

W obiektowym świecie, tak by to wyglądało

(pseudo kod):

...
  public int mid() {
    if ((b < a && a < c) || (c < a && a < b)) {
       return a;
    }
    if ((a < b && b < c) || (c < b && b < a)) {
       return b;
    }
    return c;
  }
}
  • 4-8 warunków aby określić środkowy! WTF?
    * Bez else co zwiększa ilość porównań! WTF?
  • Nie zawsze zwraca poprawny wynik! WTF?

Ktokolwiek to przeczyta, doprawdy nie tak wygląda obiektowy świat!

Jeżeli już mówimy obiektowości to coś w rodzaju:

class TripletA
{
	private:
	array<int,3> tb;
	static array<int,3> srt(int x,int y,int z)
	{
		if(x<=y)
		{
			if(x<=z)
			{
				if(y<=z) return {x,y,z};
				else return {x,z,y};
			}
			else return {z,x,y};
		}
		else
		{
			if(y<=z)
			{
				if(x<=z) return {y,x,z};
				else return {y,z,x};
			}
			else return {z,y,x};
		}
    }
    public:
	TripletA(int a,int b,int c):tb(srt(a,b,c)) {}
	int min()const { return tb[0]; }
	int mid()const { return tb[1]; }
	int max()const { return tb[2]; }
};

class TripletB
{
	private:
	int x,y,z;
	array<int,3> srt()const
	{
		if(x<=y)
		{
			if(x<=z)
			{
				if(y<=z) return {x,y,z};
				else return {x,z,y};
			}
			else return {z,x,y};
		}
		else
		{
			if(y<=z)
			{
				if(x<=z) return {y,x,z};
				else return {y,z,x};
			}
			else return {z,y,x};
		}
    }
    public:
	TripletB(int x,int y,int z):x(x),y(y),z(z) {}
	int min()const { return srt()[0]; }
	int mid()const { return srt()[1]; }
	int max()const { return srt()[2]; }
};

class TripletC
{
	private:
	array<int,3> tb;
	static int index(int x,int y,int z) { return (((x>y)<<2)|((y>z)<<1)|((z>x)<<0)); }
    public:
	TripletC(int x,int y,int z):tb{x,y,z} {}
	int index()const { return index(tb[0],tb[1],tb[2]); }
	int min()const { static int ord[]{0, 0, 2, 0, 1, 1, 2}; return tb[ord[index()]]; }
	int mid()const { static int ord[]{1, 1, 0, 2, 2, 0, 1}; return tb[ord[index()]]; }
	int max()const { static int ord[]{2, 2, 1, 1, 0, 2, 0}; return tb[ord[index()]]; }
};
0
LukeJL napisał(a):

Po co zakładać kilka wątków o tym samym?
https://4programmers.net/Forum/C_i_C++/360565-warunek_if_2_najwieksze_liczby?p=1842142

Bo od tego jest forum, zeby pytania zadawac, a my nie jestesmy druga elektroda. W tym dziale zawsze byl i bedzie smietnik, trzeba z tym jakos zyc

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