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

Oceń mój kod oraz ilość szufladek w tablicy jako zmienna.

VPS Starter Arubacloud
0 głosów
164 wizyt
pytanie zadane 11 kwietnia 2018 w C i C++ przez Marcin Reguła Początkujący (450 p.)

Cześć! Ostatnio postanowiłem postawić sobie wyzwanie i spróbować utworzyć program który znajdował by maksimum z dowolnej ilości liczb (wcześniej podanej przez użytkownika bo inaczej nie widziałem możliwości przy mojej wiedzy). Jednak zauważyłem że nie mogę i ilości szufladek na dane w tablicy wpisać zmiennej i już niewiem jak by inaczej to zapisać. Może masz jakąś propozycję ? 
Drugą prośbą jest ocenienie mojego kodu, poprostu co można by było zrobić lepiej lub uprościć. 
A tutaj macie mój program: 

#include <iostream>

using namespace std;

float liczba[10], m=liczba[0];


int main()
{
    cout << "Podaj 10 liczb przedzielajac enterem:" << endl;
    for (int i=0; i<10; i++) //wczytywanie
    {
        cin>>liczba[i];

    }

    for (int i=1; i<10; i++)  //sprawdzanie
     {
         if (m<liczba[i]) m=liczba[i];
     }
        cout<<"Najwieksza liczba to:"<<m;

    return 0;
}

PS.Takie mały szczegół ale by mnie bardzo ucieszył :) Dało by radę jakoś wykonać ten program tak aby spacja też działała jako znak zapisu do kolejnej szufladki następnej liczby?

2 odpowiedzi

0 głosów
odpowiedź 12 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
wybrane 25 kwietnia 2018 przez Marcin Reguła
 
Najlepsza

Poniżej przedstawiam kod bardzo podobnego zadania. (Jest wzięty z forum i jeszcze z elemetami jeżyka C). Program wyszukuje minimalną i maksymalną wartość tablicy 15-elementowej, dodatkowo podaje odpowiednie indeksy. Możesz podpatrzeć niektóre rozwiązania.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
    int tab[15];
    int i, min, max, indeks;

    printf("Wczytaj 15 roznych liczb do tablicy \n");
    printf("Kontynuuj ENTEREM \n");
    getch();

    for (i = 0; i < 15; i++)
    {
        printf("Podaj %i.liczbe do tablicy: ", i + 1);
        scanf("%d", &tab[i]);
    }

    min = tab[0];
    indeks = 0;
    for (i = 0; i < 15; i++)
    {
        if (tab[i] < min)
        {
            indeks = i + 1;
            min = tab[i];
        }
    }
    printf("\n Element minimalny ma wartosc: %i; \n", min);
    printf(" jest to %i.element tablicy. \n", indeks);

    max = tab[0];
    indeks = 0;
    for (i = 0; i < 15; i++)
    {
        if (tab[i] > max)
        {
            indeks = i + 1;
            max = tab[i];
        }
    }
    printf("\n Element maksymalny ma wartosc: %i; \n", max);
    printf(" jest to %i.element tablicy. \n", indeks);

    return 0;
}

 

Poniżej przedstawiam kod współczesnego rozwiązania tego samego zadania przy pomocy wektora - kontenera (dynamicznej tablicy). W tym rozwiązaniu można by wprowadzać dowolną ilość liczb nie przejmując się wielkością tablicy.

#include <algorithm>
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;

int main()
{
    vector <int> vec; //zadeklarowanie wektora

    cout << "Wczytaj 15 roznych liczb do tablicy \n";
    cout << "Kontynuuj ENTEREM \n";
    getch();

    int liczba;
    for (int i = 0; i < 15; i++)
    {
        cout << "Podaj " << i + 1 << ".liczbe do tablicy: ";
        cin >> liczba;
        vec.push_back(liczba); //dodaje na koncu tablicy element 'liczba'
    }
    auto result = minmax_element(vec.cbegin(), vec.cend());
    cout << "min: " << *result.first << '\n';
    cout << "max: " << *result.second << '\n';
}

 

0 głosów
odpowiedź 11 kwietnia 2018 przez RafalS VIP (122,820 p.)

Żeby stworzyć tablicę o wielkości podanej przez użytkownika musiałbyś wykorzystać dynamiczną alokacje. W tym przypadku wystarczyłoby zrobić tak:

int *tablica = new int[n];
/* kod ... */
delete[] tablica;

I wszystko śmiga.
Co do kodu, to tak:
- najważniejsze - nie używaj zmiennych globalnych, no chyba, że to zło konieczne. Tutaj akurat nie jest to wcale uzasadnione. Czemu? Każdy programista Ci to powie, więc możesz wziąć na słowo :D A tak serio to chociażby kwestia analizy kodu. Jeśli coś jest globalne to czytasz funkcje, widzisz nagle linijkce succesCount = 10; i nie wiesz skąd to się wzieło, bo kod jest duży a czytasz samą funkcje. Po drugie kwestia kontroli nad miejscami modyfikacji zmiennej. Podobnie często jak szukasz problemu w niedziałąjącym programie to potrzebujesz znaleźć miejsca gdzie jakaś zmienna jest modyfikowana. Jeśli chodzi o zmienną globalną, to może ona być zmodyfikowana wszędzie, bo wszędzie jest do niej dostęp, a powiedzmy kod ma np 5 tysięcy linijek. No i lipa, tak trochę. Dlatego zmienne robi się lokalne, wtedy kod jest łatwiejszy w utrzymaniu i analizie. Czasem można wykorzystać zmienne globalne, ale generalnie o ile się da to się unika.
- linijka nr 5: zmienna m ma kiepską nazwe, wyobraź sobie, że czytasz kod kogoś kto nazywa zmienne a, b, c, d. Taki kod jest ultra mega hiper nieczytelny, musisz analizować wykorzystanie danej zmiennej żeby dojść do tego po co ona jest i co ona przechowuje. Co widać w Twoim kodzie, bo musiałem zejść do linijki 19, żeby zobaczyć, że to m to maks w tablicy. Tutaj nie jest to problematyczne, bo kod ma kilka linijek, ale przy większych aplikacjach deskryptywne nazwy to podstawa. Powinieneś zatem nazwać zmienną m chociażby max, albo obecnyMax, albo maksymalnaWartoscWTablicy, nie bój się długich nazw. O ile nie piszesz w notatniku to napiszesz 3 litery a potem zrobisz taba i Ci edytor dopisze końcówkę długiej nazwy, a bardzo zyskujesz na czytelności. W komercyjnym kodzie często robi się zmienne, których nazwy są długie jak zdania w stylu maxPingKiedyUzytkownikNieJestPolaczony.
- nazwa "liczba" tablicy też jest mało intuicyjna, o niebo lepsza byłaby już nazwa liczby
- w linijce piątej wykorzystujesz śmieci, m = liczba[0], w szufladkach świeżo stworzonej tablicy są jakieś losowe liczby, wykorzystanie ich wartości to jawny błąd ;P
- lnijka 21: nierówne wcięcie, które sugeruje, że cout jest w forze, a nie jest. Pilnowanie wcięć jest bardzo ważne.
- teraz już się czepiam, ale chcialeś :D - linijka 19 - nie trzymasz się swojej konwencji :P Ciała forów są w klamrach mimo, że są pojedyńczą linijką, a ifa zrobiłeś bez klamr i jeszcze bez entera ;P Generalnie instrukcje po ifie w tej samej linijce są takie sobie, rób enter i najlepiej jescze klamry, chyba, że bardzo chcesz oszczędzać na linijkach.

Kod jest krótki, więc ciężko znaleźć dużo błędów, ale mimo wszystko trochę się znalazło. Z czego oczywiście większa część to kwestia pisania czytelnego kodu, czytelnego dla kolegi, nauczyciela, czy Ciebie czytającego go za kilka miesięcy :P.

2
komentarz 11 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

w linijce piątej wykorzystujesz śmieci, m = liczba[0]

Akurat zmienne globalne domyślnie są inicjowane do 0, więc m będzie równe 0.

Od siebie dodam jeszcze, że program jest błędny. Jeśli największa liczba będzie na pierwszym miejscu, to program poda zły wynik. Powodem jest to, że inicjalizacja zmiennej m następuje przed wpisaniem liczb do tablicy, a pętla for pomija pierwszy element.

komentarz 11 kwietnia 2018 przez RafalS VIP (122,820 p.)
Racja racja, dzięki za korekte.

Podobne pytania

0 głosów
2 odpowiedzi 463 wizyt
pytanie zadane 6 kwietnia 2017 w HTML i CSS przez Kumixx Początkujący (250 p.)
0 głosów
1 odpowiedź 301 wizyt
–3 głosów
5 odpowiedzi 496 wizyt

92,454 zapytań

141,262 odpowiedzi

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

...