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

Tablica dwuwymiarowa - losowe wypełnienie z zakresu lilcz niepodzielnych przez 3 bez powtórzeń

Ostatnio zmodyfikowano 2019-12-13 18:28
Autor Wiadomość
matt21mcr
Temat założony przez niniejszego użytkownika
Tablica dwuwymiarowa - losowe wypełnienie z zakresu lilcz niepodzielnych przez 3 bez powtórzeń
» 2019-12-06 11:50:36
Witam, mam taki program, który już wcześniej napisałem.

C/C++
#include <cstdlib>
#include <iostream>
#include <time.h>

using namespace std;

int x, y; //Zmiennne do przetrzymywania wartości wylosowanych
int losuj[ 6 ][ 6 ]; //Deklaracja Tablicy dwuwymiarowej, jak Denisiatko chciał macież ma mieć wielkość 5 na 6...

int main()
{
   
    srand( time( 0 ) );
   
    for( y = 0; y < 5; y++ ) {
       
        for( x = 0; x < 6; x++ )
        {
            losuj[ y ][ x ] =(( rand() % 70 ) - 5 );
            cout << losuj[ y ][ x ] << " ";
        }
        cout << endl;
    }
   
   
    system( "PAUSE" );
    return 0;
}

Teraz mam serio duży problem, bo muszę wypełnić tablicę 6x5 elementami z zakresu -25 do 43, liczby wylosowane nie mogą się powtarzać oraz muszą być podzielne przez 3.

Przejrzałem mnóstwo forów zagranicznych też i mam z tym poważny problem.

Będę bardzo wdzięczny za jakąkolwiek pomoc.

Z góry dziękuję za pomoc :-)

Matty
P-175730
matt21mcr
Temat założony przez niniejszego użytkownika
Wypełnianie wartościami 6 x 6 gotowe, jeszcze brakuje liczb podzielnych przez trzy
» 2019-12-06 12:20:44
Więc znalazłem rozwiązanie na to, aby tablica została wypełniana niepowtarzającymi się liczbami:

C/C++
#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif

#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <ctime>

void swap( int array[], int pos1, int pos2 ) {
    int tmp = array[ pos1 ];
    array[ pos1 ] = array[ pos2 ];
    array[ pos2 ] = tmp;
}

int _tmain( int argc, _TCHAR * argv[] ) {
   
    srand( time( NULL ) );
   
    int numbers[ 100 ];
    int matrix[ 6 ][ 6 ];
   
    // fill in the numbers
    for( int i = 0; i < 100; ++i ) {
        numbers[ i ] = i;
    }
   
    // a random number of swaps
    int repeat = rand() % 100 + 100;
   
    // perform the swaps...
    for( int i = 0; i < repeat; ++i ) {
        // ... with random positions
        swap( numbers, rand() % 100, rand() % 100 );
    }
   
    // fill in the matrix
    for( int i = 0; i < 6; ++i ) {
        for( int j = 0; j < 6; ++j ) {
            matrix[ i ][ j ] = numbers[ i * 10 + j ];
        }
    }
   
    std::cout << "This is the matrix:" << std::endl << std::endl;
   
    // print the matrix
    for( int i = 0; i < 6; ++i )
   
    for( i = 0; i < 10; i++ )
   
    {
        for( int j = 0; j < 6; ++j ) {
            std::cout << matrix[ i ][ j ] << "  ";
        }
        std::cout << std::endl;
    }
    getchar();
    system( "PAUSE" );
    return 0;
}

Bardzo miły fragment kodu, nawet dla mnie zrozumiały, ale teraz z tymi liczbami podzielnymi to już się totalnie gubię.. Niby to jest proste z forów, które przejrzałem, ale gdzie to dopisać...

Dzięki,

Matty
P-175731
nanoant20
» 2019-12-06 16:51:33
Teraz mam serio duży problem, bo muszę wypełnić tablicę 6x5 elementami z zakresu -25 do 43, liczby wylosowane nie mogą się powtarzać oraz muszą być podzielne przez 3

z ciekawości ten zakres to od -25 czy od 25?

jeżeli od -25 do 43
int liczba = (( rand() % 69 ) - 25 );

jeżeli od 25 do 43
int liczba  = (rand() % (43 - 25 + 1)) + 25;

C/C++
int liczba =(( rand() % 69 ) - 25 );
if( liczba % 3 == 0 ) {
    //dalej sprawdzasz czy powtarza sie
    //jeżeli nie to wpisujesz do tablicy
}

Losowanie bez powtórzeń

//edit
jeżeli nawet zakres będzie od -25 do 43
to do tablicy liczb podzielnych przez 3
i bez powtórzenia można zapisać tylko 23

//edit
temat jest niejednoznaczny z treścią
w temacie
Tablica dwuwymiarowa - losowe wypełnienie z zakresu lilcz niepodzielnych przez 3 bez powtórzeń
a w treści
liczby wylosowane nie mogą się powtarzać oraz muszą być podzielne przez 3

P-175732
matt21mcr
Temat założony przez niniejszego użytkownika
LICZBY TYLKO PODZIELNE PRZEZ 3, zakres -25 do 43 - POMOC W MODYFIKACJI KODU
» 2019-12-07 12:06:57
nanoant20, przede wszystkim wielkie dzięki za odzew i pomoc(!) - Przepraszam z góry, nie wiem czy można zmienić tytuł postu. Powiem szczerze, że są to często szukane tematy, z racji tego, że wielu 'uczących'; uważa, że uczy to logicznego myślenia w programowaniu. Proszę Was, zacnych programistów, aby pomogli mi w rozwiązaniu tego problemu do końca. :-).

TYLKO LICZBY PODZIELNE PRZEZ 3.

Wiem, że to by funkcjonowało, bo już sprawdziłem:

C/C++
{
    int tab[ 6 ], i;
    for( i = 0; i < 6; i++ )
    {
        cin >> tab[ i ];
        if( tab[ i ] % 3 == 0 )
             cout << tab[ i ] << endl;
       
    }

Tylko zastanawiam się, gdzie to poprawnie w kodzie programu wtsawić, wcześniej pokazanego.

Chodzi mi o ten kawałek kodu"

C/C++
#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif

#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <ctime>

void swap( int array[], int pos1, int pos2 ) {
    int tmp = array[ pos1 ];
    array[ pos1 ] = array[ pos2 ];
    array[ pos2 ] = tmp;
}

int _tmain( int argc, _TCHAR * argv[] ) {
   
    srand( time( NULL ) );
   
    int numbers[ 100 ];
    int matrix[ 6 ][ 6 ];
   
    // fill in the numbers
    for( int i = 0; i < 100; ++i ) {
        numbers[ i ] = i;
    }
   
    // a random number of swaps
    int repeat = rand() % 100 + 100;
   
    // perform the swaps...
    for( int i = 0; i < repeat; ++i ) {
        // ... with random positions
        swap( numbers, rand() % 100, rand() % 100 );
    }
   
    // fill in the matrix
    for( int i = 0; i < 6; ++i ) {
        for( int j = 0; j < 6; ++j ) {
            matrix[ i ][ j ] = numbers[ i * 10 + j ];
        }
    }
   
    std::cout << "This is the matrix:" << std::endl << std::endl;
   
    // print the matrix
    for( int i = 0; i < 6; ++i )
   
    for( i = 0; i < 10; i++ )
   
    {
        for( int j = 0; j < 6; ++j ) {
            std::cout << matrix[ i ][ j ] << "  ";
        }
        std::cout << std::endl;
    }
    getchar();
    system( "PAUSE" );
    return 0;
}

{ / cpp ]
   
    Wielkie dzi ę ki, pozdro,
   
    Matty
P-175735
pekfos
» 2019-12-07 12:25:24
Dla dowolnego całkowitego n, 3n jest podzielne przez 3. Użyj odpowiednio mniejszego zakresu i pomnóż wynik razy 3. W tym wypadku [-8, 14] odpowiada wszystkim możliwym liczbom podzielnym przez 3 z przedziału który podałeś. Nie trudno zauważyć, że ma tylko 23 liczby, więc tablicy 5x6 nie wypełnisz bez powtórzeń.
P-175736
matt21mcr
Temat założony przez niniejszego użytkownika
Tablica 6x6
» 2019-12-07 12:31:31
Dzięki Pefkos, wiem, rozumiem mniej wiecęj do czego zmierzasz. Dzięki za info.
Natomiast błędnie opisałem tablicę 5x6, gdyż tablica powinna mieć 6x6 pozycji, łącznie 36...

Mam problem ze zmianą tego kodu użytego powyżej, a może macie lepszy pomysł? \

Serio odwdzięczę się za helpa ;-)
P-175737
pekfos
» 2019-12-07 12:40:23
Lepszym pomysłem będzie zrewidowanie poprawności treści zadania. Nie da się wylosować 36 liczb z 23 możliwych bez powtórzeń. Nie wiem co chcesz w tym kodzie modyfikować.
P-175738
matt21mcr
Temat założony przez niniejszego użytkownika
Treść polecenia...
» 2019-12-07 12:45:32
Dziękuję Pefkos za helpa.

Treść brzmi dokładnie tak:

"Napisz program wypełniający tablicę dwuwymiarową 6x6 elementami typu całkowitego z zakresu od -25 do 43. Wylosowane wartości nie mogą się powtarzać i wylosowane liczby muszą być podzielne przez 3. "

Chciałbym wszystkich przeprosić za wprowadzenie w błąd. To w sumie by była modyfikacja poprzedniego programu, czyli:

C/C++
#include <cstdlib>
#include <iostream>
#include <time.h>

using namespace std;

int x, y; //Zmiennne do przetrzymywania wartości wylosowanych
int losuj[ 6 ][ 6 ]; //Deklaracja Tablicy dwuwymiarowej, jak Denisiatko chciał macież ma mieć wielkość 6 na 6...

int main()
{
   
    srand( time( 0 ) );
   
    for( y = 0; y < 5; y++ ) {
       
        for( x = 0; x < 6; x++ )
        {
            losuj[ y ][ x ] =(( rand() % 70 ) - 5 );
            cout << losuj[ y ][ x ] << " ";
        }
        cout << endl;
    }
   
   
    system( "PAUSE" );
    return
P-175739
« 1 » 2
  Strona 1 z 2 Następna strona