Liczby parzyste (while)

0

Cześć
Mam taki kod:

 #include <iostream>

using namespace std;

int main()
{
    int i,g;

    cin >> g;
    i = 1;

    while(i <= g) cout << i++;

    cout << endl;
    return 0;
} 

Jego w miarę rozumiem, wiem co on robi i czemu. I teraz chciał bym go przerobić na coś co wyświetla mi liczby tylko parzyste. Szukałem już rozwiązań ale wszystkie zawierały elementy które są dla mnie nie jasne-użyte elementy w kodzie wykraczały za moją ubogą wiedzę. Według poradnika z którego się uczę, mając ten kod i wcześniejsze lekcje za sobą (if, else) powinienem być w stanie to przerobić.
Jeżeli ktoś z bardziej doświadczonych kolegów ma czas to proszę o napisanie takiego kodu na podstawie powyższego.

@Edit: Zrobiłem coś takiego:

 #include <iostream>

using namespace std;

int main()
{
 	unsigned int a,b;
 	
 	cin >> b;
 	a = 10;
 	if (b/2) do a+2; cout << b+2;
 	while(a <= b);
 	
 	cout << endl;
 	return 0;
}

Według mnie powinno działać... A jednak nie działa, czemu?

0

Najprostszy sposób to

 #include <iostream>

using namespace std;

int main()
{
    int i,g;

    cin >> g;
    i = 1;

    while(i <= g)
    {
        i++;
        cout << i++;

    }


    cout << endl;
    return 0;
}
 

możesz też skorzystać z % podaje on "resztę z dzielenia" jeśli wiec liczba%2==0, to jest parzysta (bo dzieli się przez 2 bez części ułamkowej)

0
sig napisał(a):

Najprostszy sposób to

 #include <iostream>

using namespace std;

int main()
{
    int i,g;

    cin >> g;
    i = 1;

    while(i <= g)
    {
        i++;
        cout << i++;

    }


    cout << endl;
    return 0;
}
 

możesz też skorzystać z % podaje on "resztę z dzielenia" jeśli wiec liczba%2==0, to jest parzysta (bo dzieli się przez 2 bez części ułamkowej)

Co bym nie wpisał to i tak mi wyskakuje 2. I chodziło mi o coś takiego, żeby pokazywało 10 kolejnych parzystych liczb...

0
rubesom napisał(a):

A jednak nie działa, czemu?

Bo ten kod nie ma sensu. Nie mówiąc o tym, że masz tam nieskończoną pętlę.

0
 #include <iostream>
 
using namespace std;
 
int main()
{
    int i,g;
 
    cin >> g;
    i = 100;
 
    while(g <= i)
    {
	 		
        g++;
        cout << g++;

    }
 
 
    cout << endl;
    return 0;
} 

Ten działa tylko, że ma problem z 2. A jak napisać z elementem %?

0

Grypa.. najprościej będzie

 
 #include <iostream>

using namespace std;

int main()
{
    int maks=0,minim=1; //ważne, zawsze nadawaj zmiennym początkowe wartości bo inaczej mogą byc w nich "losowe" liczby, więc jeśli przez pomyłkę nic tam nie wczytasz program będzie dawał błędne wyniki

    cin >> maks;
    if (minim%2==1) minim++; //jeśli min jest nieparzyste, zwiększ je o jeden
    for (int i=minim;i<=maks;i=i+2) cout << i << " "; // od i równego minim dopóki i jest mniejsze lub równe maks, dodawaj do i 2 a potem wyśwtietl i oraz spację coby liczby na siebie nie nachodziły

}




0
 #include <iostream>
 
using namespace std;
 
int main()
{
    int i,g;
 
    cin >> g;
    i = 100;
 
    while(g <= i)
    {
	 	if (g%2==0) cout << g++;	
        g++;
        cout << g++;
		
    }
 
 
    cout << endl;
    return 0;
} 

To działa ale potrzebuje wyjaśnienia, bo nie na efekcie mi zależy a bardziej na zrozumieniu. g++ powoduje, że do podanej liczby zostanie dodana wartość 1, w tym kodzie jest użyte 3 razy g++ (linijka przy ifie, pod ifem, i przy cout). Podając liczbę np. 2 program doda 3 razy 1? A może to g++ napisane przy cout mówi, że ma tylko coś wyświetlić i nie jest brane pod uwagę jako dodanie wartości do g, ponieważ 2+3=5, a program mi wypisuje od dwójki? Bardzo proszę o wyjaśnienie tej kwestii i sorki za zaniżanie wiedzy na forum.

0

lub tak:

#include <iostream>
 
using namespace std;
 
int main()
  {
   int g; 
   cin>>g;
   g>>=1; 
   for(i=1;i<g;++i) cout<<(i<<1)<<' ';
   cout<<endl;
   return 0;
  }
0
rubesom napisał(a):

To działa ale potrzebuje wyjaśnienia, bo nie na efekcie mi zależy a bardziej na zrozumieniu. g++ powoduje, że do podanej liczby zostanie dodana wartość 1, w tym kodzie jest użyte 3 razy g++ (linijka przy ifie, pod ifem, i przy cout). Podając liczbę np. 2 program doda 3 razy 1? A może to g++ napisane przy cout mówi, że ma tylko coś wyświetlić i nie jest brane pod uwagę jako dodanie wartości do g, ponieważ 2+3=5, a program mi wypisuje od dwójki? Bardzo proszę o wyjaśnienie tej kwestii i sorki za zaniżanie wiedzy na forum.

i++ w couta-ch są dodawane po wyświetleniu liczby, ze względu na kolejność wykonywania działań ( od lewej do prawej). Gdyby miał najpierw dodać a potem wyświetlać zamień oba na ++i (wtedy najpierw się doda, a potem wyświetli, Swoją drogą nie za duża tych i++?
Tak więc doda 1 3 razy, ale 2 razy po wyświetleniu liczby, wiec zwiększenie zobaczysz do dopiero jak następny raz ją wyświetlisz.

edit: zawsze dodawaj jakiś separator po wyświetleniu czegoś, z wyjątkiem szczególnych sytuacji kiedy robisz "sklejankę" z wartośći. Aczkolwiek to sytuacja tak rzadkie że nawykiem powinien być separator a nie jego brak.

edit2: nie nie działa dobrze, przy nieparzystym wyświetla też wartość o jeden większą od niego.

editowy ps linijka if (g%2==0) cout << g++ << " "; nigdy się nie wykona

1

Prosze:

#include <iostream>

int
main(int, char**) {

	int min, max;
	std::cin >> min >> max;
	for(int i = min; i < max; ++i)
		if(i % 2 == 0)
			std::cout << i << " ";

	return 0;
}

Po kolei:

int min, max;

Definicja dwoch zmiennych, poczatek i koniec zakresu.

std::cin >> min >> max;

Pobranie wartosci z wejscia konsoli i przypisanie jej zmiennym min, max. Wartosci te w czasie podawania musza byc oddzielone spacja. Potwierdza sie enterem.

for(int i = min; i < max; ++i)

Petla for:

  • definiuje zmienna lokalna i z wartoscia poczatkowa rowna wartosci min.
  • przed kazdym obiegu sprawdza czy warunek i < max jest spelniony, jesli tak wykonuje sie cialo petli.
  • po kazdym obiegu zwieksza wartosc zmiennej i o 1. Preinkrementacja.

Cialo petli:

if(i % 2 == 0)

Wykonanie dzialania i % 2 i porownanie wyniku z zerem. Dzialanie to zwraca reszte z dzielenia liczby pierwszej przez liczbe druga. Jesli liczba dzieli sie bez reszty zwraca zero. Co tez jest wynikiem pozadanym poniewaz szukamy liczb parzystych.

Cialo instrukcji warunkowej:

std::cout << i << " ";

Wyswietlenie zmiennej i oraz separatora w postaci spacji.

Przedrostki "std::" wystepuja ze wzgledu na obecnosc przestrzeni nazw w C++. std - nazwa przestrzeni, :: - operator zasiegu.

0

Przy min max też prościej z przesunięciem:

#include <iostream>
using namespace std;
 
int main()
  {
   int min,max; 
   cin>>min>>max;
   for(max>>=1,(++min)>>=1;min<=max;++min) cout<<(min<<1)<<' ';  // 18 20 - pokaże 18 20
   //for((++max)>>=1,(++min)>>=1;min<max;++min) cout<<(min<<1)<<' ';  // 18 20 - pokaże tylko 18
   cout<<endl;
   return 0;
  }
0
n0name_l napisał(a):

...
Cialo petli:

if(i % 2 == 0)

Wykonanie dzialania i % 2 i porownanie wyniku z zerem. Dzialanie to zwraca reszte z dzielenia liczby pierwszej przez liczbe druga. Jesli liczba dzieli sie bez reszty zwraca zero. Co tez jest wynikiem pozadanym poniewaz szukamy liczb parzystych.

...

Tylko tego miejsca nie rozumiem...

if(i % 2 == 0)

napisałeś, że "dzielenie liczby pierwszej przez drugą", zawsze ten zapis rozumiałem, że dzielimy zmienną przez 2 a nie drugą liczbę, czy jest ta jak napisałeś, że dzielimy przez liczbę drugą?
Gwoli ścisłości-program wyświetla tylko te liczby, które dzielą się przez 2 (bądź ja się mylę i jak napisałeś przez liczbę drugą :)), czyli nie parzyste są pomijane?
Wiem, że będę marudą ale jak zrobić, żeby wyświetlał liczby nie parzyste?

0

if(i % 2 != 0)

0

Napisalem: dzielimy liczbe pierwsza przez liczbe druga i zwraca reszte z tego dzielenia, czyt.
A % B
A <- liczba pierwsza
B <- liczba druga
Chodzilo tylko o kolejnosc.

Co do pytania to:
Skoro reszta z dzielenia przez 2 wynosi 0 lub 1, a 0 jest jesli liczba jest podzielna przez 2 bez reszty, to jaki warunek musi byc spelniony, zeby liczba byla nieparzysta ?
i % 2 == 1 v i % 2 != 0.

0

W końcu rozumiem, dziękuje wszystkim za pomoc.
Strasznie opornie mi to idzie ale od jutra, po końcu świata może będzie inaczej/lepiej :).

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