Od najmniejszej do najwiekszej

0

Napisz program, który prosi użytkownika o podanie trzech liczb całkowitych, które następnie wyświetla w kolejności od najmniejszej do największej.

#include <iostream>
using namespace std;
int main()
{
	cout << "Podaj trzy liczby calkowite:\n";
	int first;
	int second;
	int third;
	cin >> first >> second >> third;
	
	if (first < second < third) cout << second << third << first;
	
	return 0;
}

Jak tu zrobić, żeby się prawidłowo wyświetlało w kolejności od najmniejszej do największej? Siedzę nad tym już z godzinę czasu próbowałem na wiele sposobów i d...

Muszę operować na ifach - tylko to mam w tym rozdziale, bez for etc.

0

Jak są 3 liczbyto można rozważyć wszystkie warunki, jak jest wiecej elementów, to poszukaj cos o sortowaniu tablic.

0

Coś w tym stylu

if (first < second < third);
	if (first < third < second);
	if (second < first < third);
	if (second < third < first);
	if (third < first < second);
	if (third < second < first);

Jak potem z tego właściwie wyprowadzić cout? Bo sam powyższy zapis oczywiście nie wyświetla nic.

0

Zapisz liczby do tablicy, posortuj ją algorytmem sortowania (algorytmy sortowanie -> google) i wyświetl tablicę.

0

Nie mam jeszcze tablic, sortowania, etc w rozdziale. A te zadanie jest z książki od Stroustrupa teoria i praktyka.

0
#include <iostream>
#include <array>
#include <algorithm>
#include <iterator>
using namespace std;

using table = array<int, 3>;

table sorted(const table &input){
	int a = input[0], b = input[1], c = input[2];
	if(a > b) swap(a, b);
	if(a > c) swap(a, c);
	if(b > c) swap(b, c);
	
	return {a, b, c};
}

template <class T, std::size_t N>
ostream& operator<<(ostream& o, const array<T, N>& arr){
    copy(arr.cbegin(), arr.cend(), ostream_iterator<T>(o, " "));
    return o;
}

template<typename T1, typename T2>
void assert_equal(const T1 &lhs, const T2 &rhs){
	if(!(lhs == rhs)){
		cout << "Assertion failed!\n";
		cout << "lhs: " << lhs << ", rhs: " << rhs << endl;
	}
}

int main() {
	table expected = {1, 2, 3};
	
	table arg = expected;
	do{
		cout << "( " << arg << ")\n";
		assert_equal(sorted(arg), expected);
	}while(next_permutation(begin(arg), end(arg)));

	return 0;
}

http://ideone.com/CMHTgc

Pod siebie oczywiście możesz wyrzucić wszystko, zostawić tylko swapowanie i wyświetlić wynik.

0

Kto Ci to każe robić na ifach? To jest czyste szaleństwo, są od tego gotowe metody.

0

W książce tak mam napisane i to nie byle jakiej bo od Stroustrupa

Nadal nic nie działa, a wrzucone powyżej rozwiązania wykraczają a) poza moją wiedzę, b) nie czytałem o nich, bo to dopiero 2 rozdział. I jedynie co mogę z niego wykorzystać przy tym programie to if

0

Zimny Młot, źle zrozumiałeś idee tych ćwiczeń.
Masz rozwiązać to zadanie samodzielnie (najlepiej w kilku wersjach) na podstawie tego co przeczytałeś w tych dwóch rozdziałach, jeżeli zaś się nie udaje to czytasz raz jeszcze.

Wersji:

  • Minimum kodu
  • Minimum zamian
  • Minimum sprawdzeń, brak zamian, tylko wyświetlasz w pewnej kolejności.
5

@gogolon też tak uważam, OP jest początkujący i chciał tylko operować na prostych ifach, a tu dostaje ostream iterator, referencje, template i jakieś next_permutacje tylko żeby pokazać jakim to ja jestem wielkim programistą :) A sam jeszcze wczoraj się oburzał jak proponowałem lambdę do programu sprawdzającego czy podana liczba jest mniejsza większa czy taka sama jak druga.

0

Z tymi lambdami to też był "prowizoryczny test", wiadomo że na co dzień się tego raczej nie stosuje, użyłem ich tylko dlatego żeby mieć inne rozwiązanie niż pozostali.

0

@_13th_Dragon przejrzałem jeszcze raz dość solidnie oba rozdziały, w tym, że pierwszy to trzy strony "Witaj, świecie" więc tam nie bardzo mam co szukać. Skupiłem się zatem na właściwym rozdziale i nie mogę znaleźć nic co mogłoby mi pomóc w rozwiązaniu tego zadania poza tym przykładem:

int main()
{
    cout << "Podaj dwa imiona.\n";
    string first;
    string second;
    cin >> first >> second; // Wczytuje dwa łańcuchy.
    if (first == second) cout << "Podano dwa takie same imiona.\n";
    if (first < second)
        cout << first << " jest w kolejności alfabetycznej przed " << second <<'\n';
    if (first > second)
        cout << first << " jest w kolejności alfabetycznej za " << second <<'\n';
}

Reszta to zliczanie powtarzających się słów, inicjacja i przypisywanie mało konkretów, do których mógłbym się odnieść.

Powiedz mi czy idę w dobrym kierunku?

#include <iostream>
using namespace std;
int main()
{
	int first, second, third;
	cout << "Podaj trzy liczby:\n";
	cin >> first >> second >> third;
	
	if (first < second < third) cout << first << second << third;
	if (third < second < first) cout << first << second << third;
	
	return 0;
}
0

Lambda w tamtym przypadku była całkowicie poprawnym rozwiązaniem i dorabianie do tego teorii, bo komuś nie pasują lambdy, to już przesada. Za to proponowanie takich zaawansowanych technik i to w takiej ilości, początkującemu, jest już uzasadnione prawda?

0

To już nie moja wina, że anonimy nie mogą na tej stronie pisać komentarzy. A tę przepychanke zacząłeś wczoraj sam, w bardzo chamski sposób krytykując moje poprawne rozwiązanie.

0

Jakby ktoś nie wiedział o co chodzi to od tego się zaczęło:

1.PNG

Rozwiązanie poprawne, dla takich samych liczb zwraca "takie same", jak x jest mniejsze od y zwraca True a jak większe to False. Jak uważasz że niepoprawne to napisz błędy jakie ci wypisuje kompilator. To, że rozwiązanie nie jest idealnie zgodne z wymaganiami OP to zupełnie coś innego niż prawidłowość programu samego w sobie.

0

Polecam Ci otworzyć rozdział 6 pt. Pisanie Programu masz tam kilka cennych wskazówek na pierwszych stronach, które może Ci pomogą w zrozumieniu przez rozłożenie problemu i stopniowe budowanie rozwiązania. Zawsze możesz napisać sobie pseudokod, który następnie będziesz przetwarzał w kod.

0

Kurde dalej nie wiem... nic nie wychodzi

0

Masz pod dwie liczby, pod trzecią napisz sobie sam

#include <iostream>
using namespace std;
int main()
{
	cout << "Wprowadz dwie liczby\n";
	int jeden, dwa;
	cin >> jeden >> dwa;

	if (jeden < dwa)
	cout << jeden << ' ' << dwa << ' ';
	
	if (jeden > dwa) 
	cout << dwa << ' ' << jeden << ' ';
	
}
0

@PrzemolPrzemol tak to każdy potrafi :D

0
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
	int size = 3;
	
	int *arr = new int[size];
	cout<<"podaj "<<size<<" liczby"<<endl;
	for (int i=0; i<3; i++){
		cin >> arr[i];
	}
	sort(arr, arr + size);
	for (int i=0; i<size; i++){
		cout <<arr[i]<<" ";
	}
	
	
	
	// your code goes here
	return 0;
}
2

Może jeszcze taka wersja do kompletu:

#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
  {
   vector<double> tb(3);
   cout<<"Podaj "<<tb.size()<<" liczby: ";
   copy_n(istream_iterator<double>(cin),tb.size(),tb.begin());   
   sort(tb.begin(),tb.end());
   copy(tb.begin(),tb.end(),ostream_iterator<int>(cout," "));
   return 0;
  }
0

Dzięki ale to musi być najwidoczniej wykonane tak jak @PrzemolPrzemol bo żadnych z wskazanych przez Was instrukcji praktycznie w tym rozdziale nie ma.

Czyli program ten napisać trzeba poprzez ręczne uwzględnienie wszelkich możliwych sytuacji, które zajdą w programie. Jakieś dziwne.

0

@Pijany Szczur to Ty jeszcze nie napisałeś tego programu od południa?

0

Niedawno dopiero wszedłem na kompa ale dalej coś nie tak mi wychodzi z trzecią liczbą według kodu @PrzemolPrzemol. Dwa pierwsze warianty działają pięknie, no trzecią jak uwzględniam to źle mi wychodzi.

0

;)

W kodzie, który Ci udostępniłem

#include <iostream>
using namespace std;
int main()
{
	cout << "Wprowadz dwie liczby\n";
	int jeden, dwa;
	cin >> jeden >> dwa;
	
	if (jeden < dwa)
	cout << jeden << ' ';
	
	if (jeden > dwa) 
	cout << dwa << ' ';

	if (dwa < jeden)
	cout << jeden << ' ';
	
	if (dwa > jeden)
	cout << dwa << ' ';
	
	return 0;
}

Masz uwzględnione możliwe działania dla JEDEN i DWA. Więc uwzględnij teraz możliwe warianty liczby DWA dla jeden i trzy. I TRZY dla jeden i dwa.
Można by to zrobić o wiele prościej, jak już poprzednicy wrzucili ale sam przejrzałem rozdział w tej książce i faktycznie trochę inaczej tego nie można zrobić na podstawie wiedzy z tego rozdziału.

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