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

tablica dwuwymiarowa

Ostatnio zmodyfikowano 2016-03-13 19:30
Autor Wiadomość
Detroq
Temat założony przez niniejszego użytkownika
tablica dwuwymiarowa
» 2016-03-12 14:56:54
Hej mam pytanie czy jest możliwość wyświetlenia macierzy kwadratowej przy użyciu pojedynczej pętli for, ograniczając jej ciało do jednej instrukcji? Jeśli tak to proszę o podpowiedź jak.
P-145926
michal11
» 2016-03-12 17:33:28
Jednej instrukcji czy jednej linijki ? Zabawa indeksami i może się uda.
P-145932
Detroq
Temat założony przez niniejszego użytkownika
» 2016-03-12 17:49:43
jednej indukcji , tylko w jaki sposob
P-145933
carlosmay
» 2016-03-12 18:24:14
std::copy() + std::ostream_iterator.
Wtedy pierwszy wymiar lecisz pętlą, a drugi cały wyświetli iterator.

Musiałem to klepnąć, bo nie chciałem gafy strzelić:
C/C++
{
    int tab[ 4 ][ 5 ] = {
        { 1, 2, 3, 4, 5 },
        { 11, 12, 13, 14, 15 },
        { 21, 22, 23, 24, 25 },
        { 31, 32, 33, 34, 35 }
    };
    // z uzyciem petli zakresowej
    for( auto & el: tab )
         std::copy( el, el + 5, std::ostream_iterator < int >( std::cout, " " ) );
   
    std::cout << std::endl;
   
    // jedna instrukcja
    std::copy( & tab[ 0 ][ 0 ], & tab[ 0 ][ 0 ] + 4 * 5, std::ostream_iterator < int >( std::cout, " " ) );
}
P-145934
mokrowski
» 2016-03-12 21:18:48
Jaki jest Cel i jaki jest Sens?
P-145946
Monika90
» 2016-03-13 12:35:29
C/C++
// jedna instrukcja
std::copy( & tab[ 0 ][ 0 ], & tab[ 0 ][ 0 ] + 4 * 5, std::ostream_iterator < int >( std::cout, " " ) );
}
Wg jednej popularnej interpretacji standardu ten kod ma niezdefiniowane zachowanie.


It must be noted, however, that a program which performs multidimensional array subscripting ``by hand'' in this way is not in strict conformance with the ANSI C Standard; according to an official interpretation, the behavior of accessing (&array[0][0])[x] is not defined for x >= NCOLUMNS.
http://c-faq.com/aryptr​/ary2dfunc2.html


Ale to powinno być OK
C/C++
#include <iostream>

int main()
{
    int tab[ 4 ][ 5 ] =
    {
        { 1, 2, 3, 4, 5 },
        { 11, 12, 13, 14, 15 },
        { 21, 22, 23, 24, 25 },
        { 31, 32, 33, 34, 35 }
    };
   
    for( std::size_t i = 0; i < sizeof( tab ) / sizeof( int ); ++i )
         std::cout << * reinterpret_cast < const int *>( reinterpret_cast < const char *>( & tab ) + i * sizeof( int ) ) << ' ';
   
}

Pobieramy adres całej tablicy, traktujemy ją jako tablicę bajtów, przeliczamy adresy ręcznie i rzutujemy tak wyliczony adres z powrotem na wskaźnik do int.
P-145971
Detroq
Temat założony przez niniejszego użytkownika
» 2016-03-13 18:15:51
Dzięki wielkie za odpowiedz , to było takie zadanie ciekawostka od prowadzącego i nie dawalo mi to spokoju, ale na razie nie rozumiem jak to sie odbywa musze jeszcze uzupełnic wiedze, a drugiej strony jakby wygladala ta komenda na macierzy charow ?
P-145981
carlosmay
» 2016-03-13 19:30:53
a drugiej strony jakby wygladala ta komenda na macierzy charow ?
Tak samo, tylko z innym typem przechowywanych danych, lub prościej (bo
char *
 to typ całego wiersza),
więc była by to tablica wierszy.

C/C++
{
    char tab[ 4 ][ 5 ] = {
        { "jaki" },
        { "inny" },
        { "loki" },
        { "maly" }
    };
    // z uzyciem petli zakresowej
    for( auto & el: tab )
         std::copy( el, el + 5, std::ostream_iterator < char >( std::cout ) );
   
    std::cout << std::endl;
   
    for( char * el: tab )
         std::cout << el << ' ';
   
    std::cout << std::endl;
   
    // petla for
    for( std::size_t i = 0; i < 4; ++i )
         std::cout << tab[ i ] << ' ';
   
    std::cout << std::endl;
}
P-145982
« 1 »
  Strona 1 z 1