Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Liczba najbliższa średniej - Mirosław Zelent odcinek 11 zadanie domowe

Ostatnio zmodyfikowano 2016-03-10 17:29
Autor Wiadomość
mokrowski
» 2016-03-09 22:36:06
Ba.. odbiję piłeczkę.. a w czym <array> jest bardziej uniwersalny :-) Jak u niego z przemieszczaniem (konstruktor przenoszący i std::move), sprawdź? Jak z konstruktorem przenoszącym? No i czy kompilator zgodny z C++11? itd... itd... No zawsze można powiedzieć że tu to nie potrzebne. To raczej odchylenie pragmatyczne. Jak będzie potrzebne to array będzie wiązał ręce a vector nie. Miej świadomość że tu dyskutujemy z własnym doświadczeniem. Ja mam takie, ty możesz mieć inne :-)

Wystarczy pamiętać że "przedwczesna optymalizacja jest źródłem zła" :-) Z moich obserwacji w projektach "przewalania danych między GUI/SQL'em/Siecią/.." 90% wyborów to vector. Jak się nie "wyrabia" albo ciąży, szukasz czegoś innego. Czasem nawet grafów z Boost'a.

Ot np. minimalizacja pamięci czyli jazda "po bandzie". Tak, wiem że sscanf() może być niebezpieczny. Tak wiem że "lepiej strumieniem a nie z C".. no .. ale mam mało RAM i mało pamięci we flash a i kontenery jakoś słabo zrobione w tym kompilatorze. Wtedy powstaje taki potworek działający np. tylko dla wartości dodatnich (choć da się go uogólnić także dla ujemnych), bez żadnych kontenerów no i .. piękny to on nie jest... :-/ Ale działa i jest mniejszy 2.5 raza od wersji "edu-wypasionej" :-)

Nie optymalizuj przedwcześnie bo wyjdzie Ci taka patologia .. może i fajna i ciekawa ale w projekcie powoduje WTF :-)
C/C++
#include <cstdio>
#include <cmath>

static constexpr size_t VALUES_NUM = 5;

using namespace std;

int main()
{
    float sum = 0;
    float input_value;
    float nearest_value;
   
    size_t counter = 0;
   
    printf( "Podaj %zu liczb oddzielonych spacją lub znakiem nowej linii:\n", VALUES_NUM );
   
    scanf( "%f", & nearest_value );
    sum += nearest_value;
   
    do {
       
        scanf( "%f", & input_value );
        sum += input_value;
       
        float step_avg = sum /( counter + 1 );
       
        if( abs( input_value - step_avg ) < abs( nearest_value - sum / step_avg ) )
        {
            nearest_value = input_value;
        }
       
        ++counter;
       
    } while( counter <( VALUES_NUM - 1 ) );
   
    printf( "Średnia to: %.2f\n", sum / VALUES_NUM );
    printf( "Pierwsza liczba najbliższa średniej to: %.2f\n", nearest_value );
}

PS. Złożoność tego kodu to O(n) w praktyce to samo co O(2n) w poprzednich przykładach a poprzednie chyba czytelniejsze? :-)
P-145816
Lich555
Temat założony przez niniejszego użytkownika
» 2016-03-10 14:43:34
Dziękuję za te odpowiedzi, ale sądzę, że trochę zaszliście za daleko. Gdybym umiał takie rzeczy, to nie siedziałbym przy 11 odcinku kursu Pana Zelenta, także proszę trzymać się rozsądnego zakresu wiedzy ;)
Powrócę do kodu z pierwszej strony.
roznica = roznica >= 0 ? roznica: - roznica;
 (prosiłbym o temat jakiegoś poradnika o tym zapisie) Można to przetłumaczyć w taki sposób? "zmienna roznica = roznica jeśli jest on większy lub równy zeru, a jeśli nie, to zmień wartość na przeciwną"
Jeśli nie można tak przetłumaczyć, to mógłbym prosić o napisanie tego w zwykłym if żeby lepiej to zobrazować?
Czy
size_t
 w ostatnim
for
 mógłbym zastąpić zwykłym
int
? Czemu jest tam zastosowany
size_t
?
P-145854
carlosmay
» 2016-03-10 15:21:33
roznica = roznica >= 0 ? roznica: - roznica;

C/C++
if( roznica >= 0 )
     roznica = rozniaca;
else
     roznica = - roznica;

wyrażenie warunkowe - MSDN
wyrażenie warunkowe - Wikipedia
P-145856
Lich555
Temat założony przez niniejszego użytkownika
» 2016-03-10 16:38:47
Ok, dzięki. Już prawie wszystko rozumiem :P Jeszcze pozostaje kwestia tego
size_t
 i prosiłbym o napisanie
for( float & x: liczby )
 sposobem "starym", sprzed standardu C++11. Pomogłoby mi to w zrozumieniu.
P-145859
carlosmay
» 2016-03-10 17:29:00
std::size_t
 typ całkowity stosowany w określaniu pozycji i rozmiaru.
np. bezpieczniej używać
std::size_t
 przy porównaniu wyszukanej pozycji z wartością
std::string::npos
.
std::size_t - cppreference

for( float & x: liczby )
Jest to udogodnienie dla wypisania całej zawartości tablicy, kontenera bez konieczności ręcznego iterowania.
C/C++
for( auto & element: kontener ) {
    std::cout << element;
}

// mozna nia zaspąpic ponizsze petle
for( auto it = kontener.cbegin(); it != kontener.cend(); ++it ) {
    std::cout << * it;
}
//
for( std::size_t i = 0; i < rozmiar; ++i ) {
    std::cout << tab[ i ];
}
std::for_each( kontener.cbegin(), kontener.cend(),
[]( typ & element ) { std::cout << element; } );

pętla zakresowa
pętla zakresowa - MSDN
P-145861
1 « 2 »
Poprzednia strona Strona 2 z 2