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

Problem z tablicą

Object Storage Arubacloud
0 głosów
399 wizyt
pytanie zadane 19 września 2016 w C i C++ przez Łukasz ER Początkujący (420 p.)

Witam, 

Poniżej przedstawiam kod obliczający szóstkę w totka bez powtarzania liczb. Wszystko gra poza tym, że jak przy deklarowaniu zmiennej tablica[6] zmienię ilość zadeklarowanego miejsca na 5 to występuje błąd. Przecież w tablicy potrzebuję tylko 6 miejsc na 6 wylosowanych liczb czyli od 0 do 5 . Czy ktoś mi wyjaśni dlaczego tak się dzieje ??

pozdrawiam :D



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

int licznik = 0;
int tablica[6];
int liczba;

int losowanie(int min,int max)
{
   return rand()% (max - min + 1) + min;
}

bool czyPadla(int number)
{
    for (int i=0; i<6; i++)
    {
        if (number == tablica[i])
        {
            return 1;
        }
        
    }
    return 0;
}

int main(int argc, const char * argv[]) {
    
    srand((unsigned int)time(NULL));
    
    while(licznik<6)
    {
        liczba = losowanie(1, 49);
        if (!(czyPadla(liczba)))
        {
            tablica[licznik] = liczba;
        }
        licznik++;
    }
    
       for (int i = 0; i<6; i++)
    {
        cout<<"[";
        cout<<tablica[i];
        cout<<"]";
    }
    

    
    return 0;
}

 

komentarz 19 września 2016 przez Masorro Nowicjusz (160 p.)
Jednak racja, trzeba też pętle ogarnąc
komentarz 19 września 2016 przez Łukasz ER Początkujący (420 p.)
Masorro a tak odnośnie tego ifa sprawdzającego liczby w tablicy to wydaje mi się że powinno być samo i zamiast i-1. tablica[i]
komentarz 19 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)

Łukasz ER, jeżeli używasz wartości, których zamiana wymagałaby wielokrotnej zmiany kodu to warto używać stałych globalnych np.:

static const int ROZMIAR = 6;

Wtedy wystarczy, że zmienisz powyższą wartość, a działanie programu będzie bezpieczne, niezależnie od wartości.

komentarz 19 września 2016 przez Łukasz ER Początkujący (420 p.)

Witaj, Zaćwilichowski, a możesz mi powiedzieć jak w przypadku mojego kodu ta stała globalna mogłaby uwydatnić go ??

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <stdio.h>
using namespace std;

int licznik = 0;
int tablica[6];
int liczba;
int ileProb;

int losowanie(int min,int max)
{
   return rand()% (max - min + 1) + min;
}

bool czyPadla(int number)
{
    for (int i=0; i<6; i++)
    {
        if (number == tablica[i])
        {
            return true;
        }
        
    }
    return false;
}

int main(int argc, const char * argv[]) {
    
    srand((unsigned int)time(NULL));
    
    while(licznik<6)
    {
        liczba = losowanie(1, 10);
        cout<<" { "<<liczba;
        cout<<" ";
        if (!(czyPadla(liczba)))
        {
            tablica[licznik] = liczba;
        }
        else if (czyPadla(liczba))
        {
            licznik--;// lub continue
        }
       licznik++;
    }
       for (int i = 0; i<6; i++)
    {
        cout<<"[";
        cout<<tablica[i];
        cout<<"]";
    }
    

    
    return 0;
}

 

komentarz 20 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 20 września 2016 przez plkpiotr
Pewnie :)
Zaraz pojawi się odpowiedź, dodam też parę uwag, które powinny usprawnić Ci pisanie kodu ;)

1 odpowiedź

+1 głos
odpowiedź 20 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 20 września 2016 przez plkpiotr

Rzuć okiem na poprawiony kod przeze mnie :) 

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <stdio.h>
using namespace std;
static const int ROZMIAR = 6;

int tablica[ROZMIAR];
int licznik = 0;
int liczba;
int ileProb;

int losowanie(int min, int max)
{
    return rand() % (max - min + 1) + min;
}

bool czyPadla(int number)
{
    for (int i = 0; i < ROZMIAR; i++)
        if (number == tablica[i])
            return true;
    return false;
}

int main(int argc, const char * argv[])
{
    srand((unsigned int)time(NULL));
    while (licznik < ROZMIAR)
    {
        liczba = losowanie(1, 10);
        cout << "{" << liczba << "} ";
        if (!(czyPadla(liczba)))
            tablica[licznik] = liczba;
        else if (czyPadla(liczba))
            licznik--; // lub continue
        licznik++;
    }
    cout << endl;
    for (int i = 0; i < ROZMIAR; i++)
        cout << "[" << tablica[i] << "] ";
    return 0;
}

Mechanizm działania programu jest taki sam jaki zamierzałeś, wizualnie się „zmniejszył” bo było troszkę niekoniecznie potrzebnych klamerek, znaków nowego wiersza, dzielenia strumienia na pojedyncze instrukcje itd. Ale tym się nie przejmuj, z czasem przyjdzie to samo jednak warto dbać o to by Twój kod był czytelny dla innych - zresztą w takiej formie będzie i Tobie łatwiej zrozumieć o co mi chodzi ;) Do rzeczy:

  • Mówimy, że coś jest globalne, gdy coś nie znajduje się wewnątrz żadnej z funkcji - u Ciebie są to zmienne w 8, 9, 10, 11 wierszu. Unikaj tego, złym nawykiem jest wrzucanie zmiennych jako globalne, przy większych projektach zrobi się po prostu bałagan.
  • Spójrz na szóstą linijkę - właśnie o to chodziło mi ze stałymi globalnymi. Piszemy je z reguły wielkimi literami i są one widoczne dla każdej z trzech funkcji w Twoim programie, od teraz, jeżeli będziesz chciał losować inną ilość liczb niż 6, to wystarczy, że zmienisz wartość stałej ROZMIAR właśnie w szóstej linijce, i nie będziesz musiał zmieniać go za każdym następnym razem, gdy pojawi się w kodzie (8, 20, 29, 40 linijka). Od teraz twój program jest uniwersalny, sprawdź co się stanie gdy zmienisz szóstkę w kodzie na np. trójkę...
  • Jeżeli wypisujesz coś w strumieniu w jednej linijce nie warto tego rozwlekać na kilka instrukcji (jedna instrukcja to fragment tekstu do średnika), możesz połączyć to za pomocą operatora << - (32, 41 wiersz)
  • Jeżeli pętla / warunek dotyczy jednej instrukcji to nie potrzeba pisać klamerek (20-23 wiersz)
     

To dosyć dużo uwag jak na taki programik, także informacji wystarczy na jeden raz :)
Nie miej mi za złe, że tyle rzeczy wypunktowałem, ale warto od początku nauczyć się pewnych zasad, bo zarówno Tobie będzie łatwiej pisać, a i nam zrozumieć „co poeta miał na myśli”, bo gdyby każdy pisał po swojemu to trudno działać byłoby w zespole.
Powodzenia w dalszym programowaniu!

1
komentarz 20 września 2016 przez Łukasz ER Początkujący (420 p.)
Wielkie dzięki uwaga 1 i 2 bardzo cenne choć nie ukrywam że tak na szybciocha trochę to pisałem i bardziej się skupiałem na działaniu programu niż na czytelności. Nie mniej jednak postaram się nawet w takich sytuacjach stosować te zasady chociażby żeby nabrać dobre nawyki.

Wielki dzięki dla ciebie i reszty za poświęcony czas naprawdę bezcenne. To co mnie zaskoczyło na tym forum to to ,że można liczyć na bezinteresowną pomoc użytkowników już nie wspomnę o tym że w środku nocy:D
komentarz 20 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Nie ma sprawy ; )
Co do samego działania kodu to faktycznie nie ma się do czego przyczepić, bo wg mnie fajnie jest napisany. Wbrew pozorom nawet przez czytanie cudzego kodu, poprawianie czyichś błędów, rozwiązywanie problemów innych użytkowników można się sporo nauczyć, a na pewno wiele rzeczy poukładać sobie w głowie na nowo, także ten pozornie bezinteresownie pomagający również na tym zyskuje :)
Poza tym pogadam sobie troszkę o kodzie, bo informatyka ma niestety/albo na szczęście (niepotrzebne skreślić) to do siebie, że tylko z innymi programistami sobie pogadasz na temat zainteresowań ;)
Z każdym razie, cieszę się, że mogłem pomóc :)

Podobne pytania

0 głosów
3 odpowiedzi 928 wizyt
pytanie zadane 12 września 2016 w PHP przez demotywatorking Obywatel (1,210 p.)
0 głosów
2 odpowiedzi 1,123 wizyt
0 głosów
2 odpowiedzi 179 wizyt
pytanie zadane 23 stycznia 2023 w C i C++ przez Dani Obywatel (1,450 p.)

92,539 zapytań

141,382 odpowiedzi

319,481 komentarzy

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

...