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

Problem z zadaniem domowym [odc. 11]

Object Storage Arubacloud
0 głosów
243 wizyt
pytanie zadane 8 lipca 2017 w C i C++ przez Kacper Paluch Nowicjusz (150 p.)
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

int main()
{
    float a,b,c,d,e;
    cout << "Podaj 5 liczb: ";
    cin >>a>>b>>c>>d>>e;

    float srednia = (a+b+c+d+e) / 5;
    cout << "Srednia: " << srednia << endl;

    float m;
    m = (abs(srednia - a));
    if ((abs(srednia - b)) < m) m=b;
    if ((abs(srednia - c)) < m) m=c;
    if ((abs(srednia - d)) < m) m=d;
    if ((abs(srednia - e)) < m) m=e;

    cout << "Najblizsza liczba sredniej to: " << m;

	return 0;
}

Nie działa prawidłowo podawanie najbliższej liczby do średniej. Program niezależnie od tego czy różnica jest większa bądź mniejsza od m, wykonuje instrukcję po if. Siedzę nad tym od godziny i nie potrafię znaleźć przyczyny błędu. Byłby toś w stanie pomóc?

Link do odcinka: https://www.youtube.com/watch?v=63QjKBcIySs&list=PLOYHgt8dIdoxx0Y5wzs7CFpmBzb40PaDo&index=12

3 odpowiedzi

+1 głos
odpowiedź 8 lipca 2017 przez Kacper Walczak Bywalec (2,430 p.)
wybrane 8 lipca 2017 przez Kacper Paluch
 
Najlepsza

Na samym początku istnienia m, pomyliłeś się i nie przypisałeś liczby a, którą wpisujesz do konsoli, tylko wartość bezwzględną z srednia - a to powoduje że jako szukaną na początku wyznaczasz liczbę która nie była wpisywana do konsoli.

Później w if'ach porównujesz np. srednia - c do b i analogicznie w kolejnych warunkach , a powinno być srednia - c do srednia - b

  
  float m;
    
    // m = (fabs(srednia - a)); <---- błąd
    m= a; 
    if ((fabs(srednia - b)) < (fabs(srednia - m))) m=b;
    if ((fabs(srednia - c)) < (fabs(srednia - m))) m=c;
    if ((fabs(srednia - d)) < (fabs(srednia - m))) m=d;
    if ((fabs(srednia - e)) < (fabs(srednia - m))) m=e;
    // zmieniasz ify , porównanie wartości ^
    cout << "Najblizsza liczba sredniej to: " << m;

Przydało by się jeszcze trochę dopracować żeby mógł wyznaczyć więcej niż jedną liczbę najbliższą średniej wink

+1 głos
odpowiedź 8 lipca 2017 przez Knayder Nałogowiec (37,640 p.)
edycja 8 lipca 2017 przez Knayder

W tych ifach:
Sprawdzasz czy wartość bezwzg. z różnicy srednicy i kolejnych wartości podanych przez użytkownika, jest mniejsza niż m.
Twoim problemem jest to, że jako m, zapisujesz wartości wpisane przez użytkownika, a nie wartość tej różnicy.
Spróbuj zrobić to tak:
 

float m;
float wynik = a;
m = (abs(srednia - a));
if ((abs(srednia - b)) < m){
    m=abs(srednia - b);
    wynik = b;
}
if ((abs(srednia - c)) < m){
    m=abs(srednia - c);
    wynik = c;
}
if ((abs(srednia - d)) < m){
    m=abs(srednia - d);
    wynik = d;
}
if ((abs(srednia - e)) < m){
    m=abs(srednia - e);
    wynik = e;
}

Potem wyświetlasz po prostu wartość zmiennej wynik.
Oczywiście jest to bardzo brzydki kod, ponieważ powinieneś tutaj użyć pętli i tablic:

#include <iostream>
#include <limits>
using namespace std;

int main()
{
	const int size = 5; //Ile liczb ma wpisać użytkownik
	float numbers[size]; //Tablica tych liczb
	float average = 0; //Wartość średnia
	for (int i = 0; i < size; i++) {
		cin >> numbers[i];
		average += numbers[i]; //Dodawanie kolejnych liczb do zminnej average
	}
	average /= size; //Podzielenie sumy liczb, przez ich ilość, żeby obliczyć średnią
	std::cout << "Average: " << average << "\n\n";
	float temp = std::numeric_limits<float>::max();
	float result = 0;
	for (int i = 0; i < size; i++) {
		float value = std::abs(average - numbers[i]); //Do pomocniczej zmiennej value, wpisujemy wartość bezwzględną z kolejnych liczb podanych przez użytkownika, odjętych od średniej.
		if (value < temp) { //Jeżeli wartośc ta, jest mniejsza niż poprzednia najmniejsza różnica to:
			temp = value; //Ustawiamy tą różnicę do porównywania:
			result = numbers[i]; //Zapisujemy tą liczbę, żeby można ją było później wyświetlić.
		}
	}


	cout << "Najblizsza liczba sredniej to: " << result << '\n';
	system("pause"); //Żeby się program zatrzymał (W code::blocks samo się to robi, jednak ja używam Visual Studio
	return 0;
}

 

0 głosów
odpowiedź 8 lipca 2017 przez marcingrychtol Obywatel (1,490 p.)
Nie wiem czemu nie próbujesz znaleźć liczby najbliższej średniej wg tego sposobu, który był w kursie (bo domyślam się że to zadanie z kursu C++ na youtube).

 

Najpierw sprawdzasz, która liczba ma najmniejszą różnicę, ale robisz to pętlą. Pamiętaj, że mogą wystąpić dwa przypadki, kiedy liczba jest tak samo blisko średniej, bo moze być od niej większa lub mniejsza. Tu opisałem jak ja to zrobiłem, ale celowo usunąłem kod, spróbuj sam to napisać:

https://forum.pasja-informatyki.pl/267622/znalezienie-liczby-nablizszej-do-sredniej-mozliwa-optymalizacja

Podobne pytania

+1 głos
2 odpowiedzi 179 wizyt
pytanie zadane 5 kwietnia 2016 w C i C++ przez Gravity Nowicjusz (150 p.)
0 głosów
3 odpowiedzi 255 wizyt
pytanie zadane 27 czerwca 2016 w C i C++ przez Kenshei Nowicjusz (120 p.)
0 głosów
1 odpowiedź 252 wizyt
pytanie zadane 27 czerwca 2016 w C i C++ przez programer Obywatel (1,190 p.)

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,966 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!

...