• 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]

VPS Starter Arubacloud
0 głosów
237 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 174 wizyt
pytanie zadane 5 kwietnia 2016 w C i C++ przez Gravity Nowicjusz (150 p.)
0 głosów
3 odpowiedzi 248 wizyt
pytanie zadane 27 czerwca 2016 w C i C++ przez Kenshei Nowicjusz (120 p.)
0 głosów
1 odpowiedź 246 wizyt
pytanie zadane 27 czerwca 2016 w C i C++ przez programer Obywatel (1,190 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 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!

...