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

Zad. domowe lekcja 11. Wskazówki dla początkującego

Object Storage Arubacloud
0 głosów
216 wizyt
pytanie zadane 1 listopada 2017 w C i C++ przez PanJaqb Początkujący (360 p.)

Witam

Po kilku godzinach spędzonym przed monitorem udało mi się w końcu uzyskać prawidłowe odpowiedzi każdego przypadku jakie podał Pan Mirosław w kursie. Kurs C++ (#11)

Do zadania dodatkowo założyłem sobie aby program wykonywał to z dowolnej ilości liczb. Prosiłbym o wskazówki dla osoby początkującej (to forum to dla mnie jedyny kontakt z osobami które znają się na rzeczy) nad czym popracować podczas pisania kodu, które praktyki są błędne itd. . Bardzo prosiłbym o krytykę.

Kod:

#include <iostream>
#include <cmath>
#include <windows.h>
using namespace std;

int main()
{
    cout << "Ile liczb chcesz wprowadzic? Wpisz: ";

    int ile_liczb;                              int *wile_liczb=&ile_liczb;
    cin >> *wile_liczb;

    float *tablica = new float[*wile_liczb];
    float liczba;                               float *wliczba=&liczba;
    float suma=0;                               float *wsuma=&suma;
    int i=0;

    for (i; i<*wile_liczb; i++)
    {
        cout << "Wprowadz " << (i+1) << ". liczbe: ";
        cin >> *wliczba;
        tablica[i]=*wliczba;
        *wsuma+=*wliczba;
    }

    float srednia = (*wsuma)/(*wile_liczb);     float *wsrednia=&srednia;
    float *wyniki = new float[2];
    float roznica=abs(srednia-tablica[0]);      float *wroznica=&roznica;
    wyniki[0]=tablica[0];
    int flaga=0;                                int *wflaga=&flaga;

    for (i=1; i<*wile_liczb; i++)
    {
        if ((abs(tablica[i]-*wsrednia))<*wroznica)
        {
            *wroznica=abs(tablica[i]-*wsrednia);
            wyniki[0]=tablica[i];
        }
    }

    for (i=0; i<*wile_liczb; i++)
    {
        if (((abs(tablica[i]-*wsrednia))==*wroznica) && (tablica[i] != wyniki[0]))
        {
            wyniki[1]=tablica[i];
            *wflaga=1;
        }
    }

    if (*wflaga==1)
    {
        cout << "Srednia to: " << *wsrednia << ", liczba najblizej sredniej to: " << wyniki[0] << " oraz: " << wyniki[1];
    }
    else
    {
        cout << "Srednia to: " << *wsrednia << ", liczba najblizej sredniej to: " << wyniki[0];
    }
    delete [] tablica, wyniki;

    return 0;
}

Pytania które mi w tej chwili się nasuwają to:
1. Czy takie usilne wykorzystywanie wszędzie wskaźników jest dobre?
2. Jak zoptymalizować jeszcze kod? (czy np. napisanie funkcji dla działań matematycznych oraz wywoływanie ich podczas potrzeby byłoby słusznym krokiem w przód?)

 

1 odpowiedź

+1 głos
odpowiedź 1 listopada 2017 przez 10kw10 Pasjonat (22,880 p.)

1. To zalezy od sytuacji. W niektorych sytuacjach az trzeba ich uzyc, a w innych juz niekoniecznie.

2. Kod napewno wygladal by ladniej, chodz jesli chodzi o czas wykonywania sie bylby ten sam.

Masz pare bledow:

  • uzywanie przestrzeni nazw std
  • windows.h
  • gdy masz jedna instrukcje w ifie nie trzeba klamer (choc to nie jest blad)
  • i chyba najwazniejsze
    delete [] tablica, wyniki; // wyniki to tez tablica
    
    delete []tablica;
    delete []wyniki;

     

komentarz 1 listopada 2017 przez PanJaqb Początkujący (360 p.)

10kw10, dziękuje gorąco za komentarz yes, pozwolę odnieść się do niego :)

1. Czy w takim razie można z grubsza określić kiedy użycie wskaźników jest wskazane? Na chłopski rozum jak dla mnie wydaję mi się, że przy takich małych aplikacjach nie zrobi to różnicy takiej jak przy większych projektach, ale wydaję mi się że jeśli pewna zmienna jest wywoływana kilkanaście razy podczas całego programu to wskazane byłoby użycie jego wskaźnika. W innym wypadku nie zrobi to większej różnicy.

2. Czy napisany kod przeze mnie jest czytelny? Na co mógłbym zwrócić uwagę, przy pisaniu kodu by program był jeszcze bardziej przejrzysty.

Błędy:
Używanie przestrzeni nazw std - używanie tej przestrzeni jest błędem? Chyba nie do końca rozumiem, w każdym filmie Pan Mirosław jej używa, jeśli mógłbym poprosić o rozwinięcie tego punktu byłbym bardzo wdzięczny.

windows.h - zapomniałem usunąć używałem komendy system("pause") do testów :)

Kasowanie tablicy myślałem że wystarczy wymienić tablice do skasowania tak jak np. możemy zadeklarować kilka zmiennych tego samego typu po przecinkach

enlightened

 

1
komentarz 1 listopada 2017 przez 10kw10 Pasjonat (22,880 p.)

1. Kiedy nie znasz rozmiaru tablicy w chwili kompilowania lub np. masz gre, w ktorej sa 3 lvl, no to bez sensu jest ladowac od razu do pamieci mapke z 3lvl skoro gracz jest dopiero na 1, wiec tworzysz wskazniki by moc dynamicznie alokowac i zwalniac pamiec.

2. Jakbys zmienil slownicto na angielskie i stworzyl wlasne funkcje, zeby main wygladal cos w stylu

int main()
{
    function1();
    function2();
}

to mysle ze byloby git ;)

Używanie przestrzeni nazw std - używanie tej przestrzeni jest błędem? Chyba nie do końca rozumiem, w każdym filmie Pan Mirosław jej używa, jeśli mógłbym poprosić o rozwinięcie tego punktu byłbym bardzo wdzięczny.

to nie znaczy ze jest dobrze.

https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice

A co do tego kasowania

int* a,b;

W tym przypadku tylko a jest wskaznikiem, a b jest 'normalna' zmienna, podobna sytuacja jest z usuwaniem.

komentarz 1 listopada 2017 przez PanJaqb Początkujący (360 p.)

Dzięki!yes

Podobne pytania

0 głosów
2 odpowiedzi 621 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez Zangariev Początkujący (290 p.)
+1 głos
1 odpowiedź 262 wizyt
0 głosów
2 odpowiedzi 637 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

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

...