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

Sumowanie liczb parzystych

Object Storage Arubacloud
0 głosów
7,406 wizyt
pytanie zadane 28 października 2018 w C i C++ przez Paweł123 Nałogowiec (33,500 p.)
edycja 28 października 2018 przez Patrycjerz

Witam, mam takie zadanie 

Napisz program, który przy użyciu pętli sumuje liczby parzyste z przedziału od x
do y, gdzie wartości x i y są podane przez użytkownika oraz 10 <= x < y <= 100.

Napotkałem błąd podczas sumowania liczb parzystach

#include <iostream>
#include <conio.h>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	
	int x=0, y=0, suma=0, sumap=0;
	
		
	 cout << "Podaj liczbe X w przedziale od 11-99: ";
	 cin>>x;
	 
	 if(x<=10 || x>= 100){
	 	
	 	cout << "Podaj liczbe "<<x<<" nie miesci sie w przedziale od 11-99: "<<endl;
	  	cout << "Podaj liczbe X jeszcze raz: ";
	 	cin>>x;
	 	
	 	
	 	while(x<=10 || x>= 100){
	  	
	  	cout << "Podaj liczbe "<<x<<" nie miesci sie w przedziale od 11-99: "<<endl;
	  	cout << "Podaj liczbe X jeszcze raz: ";
	 	cin>>x;
	  	
	 	 }
	 	
	 }
	 
	 cout << "Podaj liczbe Y w przedziale od "<<x<<"-99: ";
	 cin>>y;
	 
	 if(y<=x || y>= 100){
	 	
	 	cout << "Podaj liczbe "<<y<<" nie miesci sie w przedziale od "<<x<<"-99: "<<endl;
	  	cout << "Podaj liczbe Y jeszcze raz: ";
	 	cin>>y;
	 	
	 	
	 	while(y<=x || y>= 100){
	  	
	  	cout << "Podaj liczbe "<<y<<" nie miesci sie w przedziale od "<<x<<"-99: "<<endl;
	  	cout << "Podaj liczbe Y jeszcze raz: ";
	 	cin>>y;
	  	
	 	 }
	 	
	 }
	 
	 //sumowanie liczb z zakresy od x do y podane przez uzytkownika
	 for(int i=x; i<=y; i++)
	 {
	 	suma=suma+i;
	 	
	 }
	 cout<<"suma: "<<suma;
	
	suma=sumap;
	//sumowanie liczb parzystych z zakresy od x do y podane przez uzytkownika
	 if(sumap%2==0){
	 	
		 for(int i=x; i<=y; i++){
	 		
		 	sumap=sumap+i;
		 
		}
		  
	 }
	cout<<"sumap: "<<suma;
	 
	
	
	getch();
	return 0;
}

czy mógłby mnie ktoś naprowadzić jak to zrobić?

 

1 odpowiedź

0 głosów
odpowiedź 28 października 2018 przez Benek Szeryf (91,010 p.)
edycja 28 października 2018 przez Benek
 
Najlepsza

Strasznie przekombinowałeś. Wykorzystaj wzór na sumę pierwszych N liczb parzystych i własność rzutowania liczb zmiennoprzecinkowych na liczby całkowite:

#include <iostream>

int sumEvenIntegersFromOne(int integer)
{
    int halfInteger;
    halfInteger = int(0.5*integer);

    return halfInteger*(halfInteger + 1);
}

int main()
{
    int lower, upper;

    std::cout << "Podaj dolny przedzial: ";
    std::cin >> lower;
    std::cout << "Podaj gorny przedzial: ";
    std::cin >> upper;
    std::cout << "Suma wynosi: " << sumEvenIntegersFromOne(upper) - sumEvenIntegersFromOne(lower - 1) << '\n';

    return 0;
}

 

komentarz 28 października 2018 przez Paweł123 Nałogowiec (33,500 p.)

Ok, dzięki.

Twój kod jest o wiele lepszy, ale jeszcze nie miałem czegos takiego jak halfInteger, int sumEvenIntegersFromOne(int integer). 

Więc zrobię po swojemu, ale dzięki za pomoc i tak laugh

komentarz 28 października 2018 przez Benek Szeryf (91,010 p.)

To są tylko nazwy, które sam wymyśliłem. Równie dobrze możesz to nazwać a, b, c, choć nie polecam, bo jak wrócisz do kodu za parę tygodni, to nie będziesz wiedział, co te zmienne przechowują i oznaczają.

sumEvenIntegersFromOne to nazwa funkcji, która sumuje naturalne liczby parzyste począwszy od 1. halfInteger to zmienna pomocnicza, która przechowuje połowę wartości ze zmiennej integer. Od biedy możesz te wzory wrzucić do głównej funkcji, a sumEvenIntegersFromOne usunąć całkowicie. Aczkolwiek funkcje są dość prostym zagadnieniem i pewnie lada moment je poznasz.

komentarz 28 października 2018 przez Paweł123 Nałogowiec (33,500 p.)
ok, dziękuje za wytłumaczenie ;D
komentarz 28 października 2018 przez manjaro Nałogowiec (37,390 p.)
Nie chcę się czepiać ale to chyba najgorsze możliwe rozwiązanie.

Sto razy wydajniej jest to zrobić w zwykłej pętli for albo while.

Oczywiście nie można użyć wzoru na sumę ciągu arytmetycznego co byłoby optymalne.
komentarz 28 października 2018 przez Benek Szeryf (91,010 p.)

Oczywiście nie można użyć wzoru na sumę ciągu arytmetycznego co byłoby optymalne.

Oczywiście tak to jest zrobione. A poza tym uzasadnij, jak już się czepiasz.

komentarz 28 października 2018 przez manjaro Nałogowiec (37,390 p.)

Bo nie od dziś wiadomo że rekurencja jest złym rozwiązaniem. W niektórych firmach wręcz jest zakaz używania rekurencji. To po pierwsze.

A po drugie to dla kogoś kto nie wie jak zrobić prostą pętlę proponujesz rekurencję co jest o wiele bardziej skomplikowane.

Najprościej to zrobić tak

#include <iostream>
using namespace std;

int main(){
   int x,y,suma=0;
    cout << "Podaj dolny przedział: ";
    cin >> x;
    cout << "Podaj górny przedział: ";
    cin >> y;

    for (int i=x;i<=y;i+=2) {
        suma+=i;
    }

    cout << "Suma wynosi: " << suma << endl;
    return 0;
}

 

komentarz 28 października 2018 przez Benek Szeryf (91,010 p.)
Jaka rekurencja, o czym Ty piszesz?

Zresztą skąd miałem wiedzieć, że autor wątku nie wie, czym jest funkcja. Nie napisał tego wprost. Twój kod nie zadziała, gdy użytkownik poda nieparzysty x, więc jest błędny.
komentarz 28 października 2018 przez manjaro Nałogowiec (37,390 p.)

|O przepraszam mój błąd to nie rekurencja. Tak namieszałeś z nazwami funkcji i zmiennych że pomyliłem. Ale w takim razie jest jeszcze gorzej bo tam nie ma wcale pętli ;) A w treści jest napisane że ma być to liczone w pętli.

Słusznie zauważyłeś niedoskonałość mojego kodu, już poprawiłem

#include <iostream>
using namespace std;

int main(){
    int x,y,suma=0;
    cout << "Podaj dolny przedział: ";
    cin >> x;
    cout << "Podaj górny przedział: ";
    cin >> y;
    
    if (x%2==1) x+=1;
    if (y%2==1) y-=1;

    for (int i=x;i<=y;i+=2) {
        suma+=i;
    }

    cout << "Suma wynosi: " << suma << endl;
    return 0;
}

 

1
komentarz 29 października 2018 przez niezalogowany

@Benek lepiej od razu użyć dzielenia dla intów:

int halfInteger = integer / 2;

Podobne pytania

0 głosów
3 odpowiedzi 6,222 wizyt
0 głosów
2 odpowiedzi 1,278 wizyt
pytanie zadane 24 listopada 2020 w C i C++ przez Wolv63 Użytkownik (630 p.)
0 głosów
2 odpowiedzi 3,111 wizyt
pytanie zadane 1 grudnia 2017 w Java przez Patrycja Ły Początkujący (270 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...