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

[c++] Program do znajdowania liczby najbliżej średniej

VPS Starter Arubacloud
0 głosów
694 wizyt
pytanie zadane 18 kwietnia 2019 w C i C++ przez Ebay_05 Początkujący (400 p.)
edycja 18 kwietnia 2019 przez Ebay_05

Dzień dobry!

Chciałam poprosić o pomoc w wyszukaniu usterki w moim kodzie. Czytając kody innych programistów nie bardzo mogę znaleźć odpowiedź.

#include <iostream>

using namespace std;

float a,b,c,d,e,s;

int main()
{
    cout<<"Podaj piec liczb:"<<endl;
    cin>>a>>b>>c>>d>>e;

    s=(a+b+c+d+e)/5;

    cout<<"Srednia: "<<s<<endl;

    float r1,r2,r3,r4,r5,n; //obliczanie różnicy i szukanie najmniejszej

    r1=s-a;
    r2=s-b;
    r3=s-c;
    r4=s-d;
    r5=s-e;

    //Odtąd

    n=r1; //przypisanie do najmniejszej
    if (n<r2) n=b;
    if (n<r3) n=c;
    if (n<r4) n=d;
    if (n<r5) n=e;

    //Dotąd

    cout<<"Liczba najblizej sredniej: "<<n<<endl;

}

 

Wydaje mi się, że problem może tkwić przy porównywaniu różnic.

Byłabym też dozgonnie wdzięczna za uwagi co do czytelności kodu, co bym mogła zrobić, żeby był lepszy.

 

komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)
Zastanawiam się też nad problemem z "n=r1", gdyż wyświetli się różnica a nie liczba. czy pomogłoby dodanie po if'ach linijki z takim kodem: "r1=a"?
komentarz 18 kwietnia 2019 przez dawidek08 Początkujący (290 p.)
return 0;. nie powinien na końcu być? W końcu funkcja ma zwrócić inta.
komentarz 18 kwietnia 2019 przez Teslum_369 Gaduła (4,190 p.)
Ale gdzie tak naprawdę leży problem? Przy Liczba najblizej sredniej?
komentarz 18 kwietnia 2019 przez Teslum_369 Gaduła (4,190 p.)

@dawidek08 Niektóre kompilatory tego nie wymagają i domyślnie "same sobie to dopisują"

komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)

@Karol_Tesla, w pewnym momencie powinien być błąd, ponieważ przy przykładzie z liczbami 1,2,3,4,5 program cyfrę 2 przypisuje jako najbliższą średniej (a średnia to 3).

komentarz 18 kwietnia 2019 przez Teslum_369 Gaduła (4,190 p.)
Czyli odwołując się do tego przykładu z liczbami 1,2,3,4,5 oczekujesz, żeby program wypisał liczbę "3" jako najbliższa średniej tak?
komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)
Tak, bo ona jest najbliżej średniej, prawda?

2 odpowiedzi

+1 głos
odpowiedź 18 kwietnia 2019 przez anm Użytkownik (780 p.)
wybrane 26 kwietnia 2019 przez Ebay_05
 
Najlepsza

Jest problem, ponieważ przypisujesz nie różnicę a liczbę wczytaną z klawiatury. 

Jeżeli warunek się spełni ( a nie spełni się, ponieważ jest zła konstrukcja pkt.1) to przypisujesz nie różnicę, a liczbę ale o tym niżej. (pkt. 3)

1) Załóżmy, że wybieramy 1,2,3,4,5

    n=fabs(r1);               //różnica jest równa 2 => n=2
    if (n<fabs(r2)) n=b;     // 2<1 fałsz więc n=2 (n=r1)
    if (n<fabs(r3)) n=c;    // jw.                    
    if (n<fabs(r4)) n=d;   // jw.
    if (n<fabs(r5)) n=e;  // nadal n=2 więc 2<2 tutaj nadal nie spełnia więc na 1 ifie się zatrzymało (spełniłoby się dla <=)

Trochę o znaku:

2) Jaki ma być warunek? Jeżeli 'n' jest większe to wtedy 'n' powinien być tą liczbą dla której sprawdzamy warunek ( z tym, że nie do końca patrz pkt. 3)

if (n>fabs(r3)) n=b;  //z założenia - n=r1 więc n=2, więc jeżeli(2>0) i to jest prawda więc teraz n będzie najmniejszy i przypiszemy mu wartość b

3) Kolejna sprawa,

jeżeli dla n przypiszesz wartość b czyli 3 to już to nie jest do końca dobry zamysł, ponieważ nie porównujesz średniej tylko liczbę ze średnią. Jeżeli już, to powinnaś zrobić np. if (n>fabs(r3)) n=r3;

Należałoby dodać jeszcze jedną zmienną która przechowa, która to jest wartość.

    if (n>fabs(r2)) {u=b;n=r2;}    
    if (n>fabs(r3)) {u=c;n=r3;}
    if (n>fabs(r4)) {u=d;n=r4;}
    if (n>fabs(r5)) {u=e;n=r5;}

Koncepcja jak najbardziej słuszna, drobne błędy w wykonaniu. Jeżeli chodzi o ulepszenie - nie widzisz tutaj czynności powtarzalnych?

Starałem się wytłumaczyć jak najprościej ale czasami się nazbyt rozpiszę, więc daj znać czy jest to klarowne enlightenedwink

komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)

Zrozumiałam i poprawiłam, ale mam wątpliwości co do 3 podpunktu.

Chcę przypisać różnicę konkretnej zmiennej i średniej np. r2=s-b. I czy nie mogę po prostu potem przypisać w if'ach od razu n=b skoro już wcześniej przypisałam różnicę?

 

Jeśli pytanie jest nie zrozumiałe to pisz, bo nie wiem czy jest xD

I śmiało rozpisuj się, chętnie poczytam i postaram się zrozumieć smiley

komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)

Okej, wszystko działa laugh

komentarz 18 kwietnia 2019 przez anm Użytkownik (780 p.)

Możesz, tylko teraz się zastanów, jeżeli n będzie większe od r2 to dla n przypisujesz wartość b. W następnym ifie sprawdzasz czy n jest większe od r3, więc sprawdzasz czy liczba b jest większa a nie różnica r2, rozumiesz? laugh

+1 głos
odpowiedź 18 kwietnia 2019 przez Michałełe Nałogowiec (25,600 p.)
edycja 18 kwietnia 2019 przez Michałełe

Witam

Załóżmy dla liczb 1 2 3 4 5 średnia to 3.

Odejmujesz od tej średniej każdą liczbę, czyli:

1 -> 3 - 1 = 2

2 -> 3 - 2 = 1

3 -> 3 - 3 = 0

4 -> 3 - 4 = -1

5 -> 3 - 5 = -2

Najmniejsza więc wychodzi 5.

Liczbą najbliżej średniej nie jest najmniejsza, ale ta która jest najbliżej zera. W Twoim programie szukasz najmniejszej.

Protip: Sprawdź każdą wartość z wartością bezwzględną, i która jest najmniejsza, bo przecież w tym wypadku co wyżej 5 i 1 ( -2 i 2) jest tak samo daleko od średniej.

Wartość bezwzględną używa się:

abs( liczba);

 

komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)
Przy pisaniu chciałam obliczyć różnicę i z niej wybrać najmniejszą, ale nawet przy przykładzie z liczbami 1,2,3,4,5 wyskakuje mi, że najbliższą jest 2 a nie 3 (zamieniłam ">" na "<").
komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)

@Michałełe, okej, dziękuję

komentarz 18 kwietnia 2019 przez Michałełe Nałogowiec (25,600 p.)
Proszę :)
komentarz 18 kwietnia 2019 przez Michałełe Nałogowiec (25,600 p.)
I jak, wychodzi dobrze?
komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)

Poprawiłam na takie cuś:

n=fabs(r1); //przypisanie do najmniejszej
    if (n<fabs(r2)) n=b;
    if (n<fabs(r3)) n=c;
    if (n<fabs(r4)) n=d;
    if (n<fabs(r5)) n=e;
    r1=a;

ale nadal przy przykładzie 1,2,3,4,5 wyskakuje 2 najbliżej.

Sprawdzę jeszcze z abs()

komentarz 18 kwietnia 2019 przez Ebay_05 Początkujący (400 p.)
Nadal coś jest nie tak
komentarz 18 kwietnia 2019 przez Michałełe Nałogowiec (25,600 p.)

Ok już mam

	float r1{}, r2{}, r3{}, r4{}, r5{}, n{}, odp{}; //obliczanie różnicy i szukanie najmniejszej
	

Zawsze lepiej zainicjalizować zmienne, spróbuj wypisać zmienną której nie przypisałaś żadnej wartości - będą tam jakieś śmieci - losowe liczby

n = fabs(r1);
	odp = a;

	if (n > fabs(r2)) {
		n = r2;
		odp = b;
	}
	if (n > fabs(r3)) {
		n = r3;
		odp = c;
	}
	if (n > fabs(r4)) {
		n = r4;
		odp = d;
	}	
	if (n > fabs(r5)) {
		n = r5;
		odp = e;
	}

Musiałem zrobić kolejną zmienną odp, aby to ona miała informację jaka jest to odpowiedź, i jeśli nasza wartości bezwzględna jest z jakiejś odpowiedzi mniejsza to po prostu je zamieniamy.


	//Dotąd

	cout << "Liczba najblizej sredniej: " << odp << endl;

I wypisujemy odpowiedź. Najlepiej to by było napisać to za pomocą tablic i pętli, wtedy miałabyś możliwość użycia więcej niż 5 cyfr i nie byłoby tyle pisania :)

Podobne pytania

0 głosów
2 odpowiedzi 499 wizyt
+1 głos
1 odpowiedź 335 wizyt
pytanie zadane 8 sierpnia 2016 w C i C++ przez Netreih Nowicjusz (130 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...