• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy można w ten sposób skrócić kod?

Mały hosting, OGROMNE możliwości
+1 głos
1,386 wizyt
pytanie zadane 15 stycznia 2021 w C i C++ przez rain.deer Początkujący (430 p.)

Hej,

zaczęłam dziś przerabiać książkę C++ Primer, 5th ed. i jest tam zadanie 1.19, w którym chodzi o to, żeby użytkownik wpisał dwie liczby różniące się od siebie i następnie program ma wypisać uszeregowane od najmniejszej liczby, które znajdują się między tymi wypisanymi liczbami.

Stworzyłam taki kod jak poniżej i zastanawiam się, czy można, tak jak to zrobiłam, pozostawić "body" pętli if puste? Inaczej musiałabym wpisywać w nie tą pętlę while, co dałoby aż 2 jej wywołania w paru linijkach kodu. Program działa, przynajmniej u mnie. smiley

#include <iostream>

int main()
{
	int small = 0, big = 0;
	std::cout << "Please input 2 integers: ";
	std::cin >> small >> big;

	if (small < big) {
	
	}
	else {
		int temp = small;
		small = big;
		big = temp;
	}
		
	while (small <= big)
	{
		std::cout << small << std::endl;
		++small;
	}

		return 0;
}

 

komentarz 15 stycznia 2021 przez Tomek Sochacki Ekspert (227,510 p.)

a po co ten pusty blok if? Tego if można zapisac jako:

if (small >= big) {
    int temp = small;
    small = big;
    big = temp;
}

 

komentarz 15 stycznia 2021 przez rain.deer Początkujący (430 p.)

@Tomek Sochacki, faktycznie, wtedy cały kod diametralnie się upraszcza smiley

komentarz 15 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
btw możesz tutaj użyć std::swap, lub z racji, że to liczby xor swap
komentarz 15 stycznia 2021 przez rain.deer Początkujący (430 p.)

Jeszcze nie znam tego sposobu. Pokombinuję.smiley

komentarz 15 stycznia 2021 przez VBService Ekspert (256,580 p.)
edycja 16 stycznia 2021 przez VBService

[ edit ]

#include <iostream>

int main() {
   ...
   if (small > big)
       std::swap(small, big);
   ...
}

 

1
komentarz 16 stycznia 2021 przez jkdfklgdf Nałogowiec (32,020 p.)

@rain.deer, pamiętaj, że if to nie pętla ;) Możesz powiedzieć "warunek" lub wyrażenie warunkowe, ale nie pętla

1
komentarz 16 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)

@VBService,

a te <bits/stdc++.h> to za jakie grzechy?

1
komentarz 16 stycznia 2021 przez VBService Ekspert (256,580 p.)

@NewEraOfPeace, ach słusznie, pisałem coś innego w między czasie i zostało w edytorze i bezmyślnie zaznaczyłem przy kopiowaniu. wink

1
komentarz 16 stycznia 2021 przez rain.deer Początkujący (430 p.)

@Milesq, to był taki niefortunny skrót myślowy. Faktycznie przecież w "if" nic się nie zapętla.

3 odpowiedzi

+2 głosów
odpowiedź 15 stycznia 2021 przez SzkolnyAdmin Szeryf (90,290 p.)

A nie lepiej zapytać się odwrotnie?

if (small > big) {
    int temp = small;
    small = big;
    big = temp;
 }

 

komentarz 15 stycznia 2021 przez rain.deer Początkujący (430 p.)

@SzkolnyAdmin, faktycznie lepiej.smiley

+1 głos
odpowiedź 15 stycznia 2021 przez VBService Ekspert (256,580 p.)
edycja 16 stycznia 2021 przez VBService

wink [ edit ]

@mokrowski

a ^= b ^= a ^= b;
...

    if (small > big) //swapping using bitwise operator
        small ^= big ^= small ^= big;

    while (small < big - 1)
        std::cout << ++small << std::endl;

...
...

    if (small > big)
        std::swap(small, big);

    while (small < big - 1)
        std::cout << ++small << std::endl;

...

 

komentarz 16 stycznia 2021 przez rain.deer Początkujący (430 p.)

Twoje rozwiązanie rewelacyjnie skraca kod. Dziękuję smiley

+1 głos
odpowiedź 16 stycznia 2021 przez mokrowski Mędrzec (158,960 p.)

A żeś się zafiksował na tym swapowaniu... Po co?

#include <iostream>
#include <algorithm>
 
int main()
{
    int a = 0, b = 0;
    std::cout << "Please input 2 integers: ";
    std::cin >> a >> b;
    for(auto i = std::min(a, b) + 1; i < std::max(a, b); ++i) {
	    std::cout << i << '\n';
    }
}

Poza tym...

a ^= b ^= a ^= b;

.. ma jeszcze krótszy kod zmiany wartości zmiennych. Niemniej jednak nie generuje to wydajnego kodu asemblera na większości platform.

Podobne pytania

+1 głos
1 odpowiedź 919 wizyt
pytanie zadane 7 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,490 p.)
+1 głos
2 odpowiedzi 904 wizyt
+1 głos
2 odpowiedzi 495 wizyt

93,719 zapytań

142,632 odpowiedzi

323,264 komentarzy

63,266 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...