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

Zadanie domowe z 11 odcinka kursu C++

Object Storage Arubacloud
0 głosów
118 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez Bartosz Kuligowski Nowicjusz (120 p.)
#include <iostream>
#include <windows.h>

using namespace std;


float liczba[5]; //tablica na 5 zmiennych
float najblizsza_1, najblizsza_2; //na osi mogą być 2 liczby tak samo oddalone od konkretnej liczby, tutaj średniej
float srednia, suma=0;
float m;

float bezw(float n)
{
	if (n < 0) return n * (-1);
}

int main()
{
	cout << "Podaj swoje 5 liczb: " << endl;

	for (int i = 0; i< 5; i++)
	{
		cout << "Podaj " << i+1 << " liczbe: "; cin >> liczba[i];
		suma += liczba[i];
	}

	srednia = suma / 5;

	m = bezw(srednia - liczba[0]); //przyjmuje, ze najblizej sredniej jest 1 element tablicy

	for (int i = 0; i < 5; i++)
	{
		if (bezw(liczba[i]-srednia) < m)

		{
			m = bezw(srednia - liczba[i]);
			najblizsza_1 = liczba[i];
		}
	}


	bool dwie = false;


	for (int i = 0; i < 5; i++)
	{
		if (bezw(liczba[i] -srednia) == m && liczba[i] != najblizsza_1)
		{
			najblizsza_2 = liczba[i];
			dwie = true;
		}

	}

		cout << "Srednia wynosi: " << srednia << endl;

		if (dwie == false)
		{
			cout << "Liczba najblizsza sredniej to: " << najblizsza_1 << endl;
		}
		else cout << "Liczby najblizsze sredniej to: " << najblizsza_1 << " i " << najblizsza_2 << endl;



		system("pause");
}

 

Próbowałem przez wiele godzin rozwiązać to zadanie, ale po prostu już opadam z sił i nie mam pojęcia co jest tutaj źle. Byłbym bardzo wdzięczny za wytknięcie błędów.

1 odpowiedź

0 głosów
odpowiedź 29 czerwca 2020 przez amtrax Dyskutant (9,630 p.)

Cześć, 

warto korzystać w tym przypadku z wbudowanej funkcji abs, a wszystkie wartości najlepiej od razu zadeklarować wartością 0, tak samo najlepiej unikać zmiennych globalnych, w tym wypadku nie są potrzebne. 
Nie są Ci potrzebne również dwie wartości, które przechowuje liczby tak samo oddalone, SPOJ chce tylko najbliższą.

Można przyjąć, że początkowa wartość argumentu m to różnica  0 elementu tablicy ze średnią, najbliższa wartość póki co to również m. 
W pętli iterujemy teraz od 1 elementu, (0 mamy załatwiony).

Jeżeli różnica jest taka sama jak wartość zmiennej m, lub wartość  wynosi 0 (średnia taka sama jak wartość danego elementu), lub m jest mniejsza niż różnica,  to kontynuujemy wykonywanie pętli, bez żadnego przypisania. 

Jeżeli różnica jest mniejsza niż wartość m (co oznacza, że liczba jest bliżej) to:

  • Teraz najbliższą wartością jest liczba[i]
  • Wartość elementu m to różnica między liczbą a średnią

Mam nadzieję, że pomogłem

 

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



int main()
{
    float liczba[5]; //tablica na 5 zmiennych
float najblizej = 0;
float srednia  = 0, suma=0,roznica = 0;

    cout << "Podaj swoje 5 liczb: " << endl;

    for (int i = 0; i < 5; i++)
    {
        cout << "Podaj " << i+1 << " liczbe: ";
        cin >> liczba[i];
        suma += liczba[i];
    }

    srednia = suma / 5;

    float  m  = abs(liczba[0] - srednia);

    najblizej = liczba[0];
    for (int i = 1; i < 5; i++)
    {
        roznica = abs(liczba[i] - srednia);

         if (roznica == m || roznica == 0 || m < roznica )
            continue;
        else  if (roznica < m)
        {
            najblizej = liczba[i];
            m = roznica;
        }
    }

PS

jeżeli chciałbyś wypisać więcej elementów tak samo zbliżonych do średniej, można wtedy użyć tablicy. 

Pozdrowienia  

komentarz 29 czerwca 2020 przez Bartosz Kuligowski Nowicjusz (120 p.)
Dlaczego nie potrzebuje 2 zmiennych zapisujących liczby oddalone tak samo? Jednym z testów w filmie jest właśnie to, czy program pokaże przy średniej 5, że zarówno 6,5 jak i 3,5 są tak samo oddalone od 5.
komentarz 29 czerwca 2020 przez amtrax Dyskutant (9,630 p.)
Sugerowałem się kryteriami SPOJ'a. Tam trzeba wypisać najbliższą liczbę średniej, ale 1 w kolejności podawania. Taki warunek spełnia ten kod.

Jeżeli jednak potrzebujesz wypisać więcej liczb tak samo oddalonych od średniej, można to zrobić przy użyciu tablicy albo vectora.

Podobne pytania

0 głosów
1 odpowiedź 543 wizyt
0 głosów
1 odpowiedź 376 wizyt
0 głosów
4 odpowiedzi 287 wizyt
pytanie zadane 2 listopada 2015 w C i C++ przez Aleksandra Nowicjusz (140 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!

...