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

[C++] Największa przekątna tablicy dwuwymiarowej

Ostatnio zmodyfikowano 2017-12-18 21:19
Autor Wiadomość
Wiesław
Temat założony przez niniejszego użytkownika
[C++] Największa przekątna tablicy dwuwymiarowej
» 2017-12-09 14:14:54
Witam,
ostatnio napisałem program, który wypisuje numer i elementy lewoskośnej przekątnej tablicy dwuwymiarowej o największej sumie liczb. Nie działa mi on jednak poprawnie z samymi liczbami ujemnymi. Może ktoś znaleźć błąd? PS. Zależy mi,żeby przekątne numerować od 1.

C/C++
#include<iostream>
using namespace std;
int main()
{ int n;
    cin >> n;
    int tab[ n ][ n ];
    for( int a = 0; a < n; a++ )
    { for( int b = 0; b < n; b++ )
             cin >> tab[ a ][ b ];
       
    }
    int z = 1, suma = 0, w = 0;
    for( int i = 0; i <( 2 * n ) - 1; i++ )
    {
        for( int x = 0; x < n; x++ )
        {
            suma = 0;
            for( int y = 0; y < n; y++ )
            { if( x + y == i )
                     suma += tab[ x ][ y ];
               
            }
            if( suma > w )
            { w = suma;
                z = i + 1;
               
            }
           
        }
    }
    cout << z << ": ";
    for( int x = 0; x < n; x++ )
    { for( int y = 0; y < n; y++ )
        { if( x + y == z - 1 )
                 cout << tab[ x ][ y ] << " ";
           
        } }
    return 0;
}
P-167745
nanoant20
» 2017-12-14 19:53:55
Może ktoś znaleźć błąd?
Oczywiście, że mogę znaleźć błąd
Niebezpieczna konstrukcja
C/C++
int n;
cin >> n;
int tab[ n ][ n ];
Rozmiar tablicy ustawia się na sztywno, liczba elementow musi być wartością stałą, albo za pomocą operatora new
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-2​/Tablice-jednowymiarowe/292

korzystaj, też ze strumienia wyjściowego cout, w celu kontroli co robi program
P-167911
darko202
» 2017-12-15 10:44:32
a poza tym

1.
>> Nie działa mi on jednak poprawnie z samymi liczbami ujemnymi.

C/C++
// 0.
int z = 1, suma = 0, w = 0;
// 1.
suma += tab[ x ][ y ]; // tu suma < 0
// 2.
if( suma > w ) // dla liczb ujemnych if nie zadziała bo to np. if( -1 > 0 )

// kod
     int z = 1, suma = 0, w = 0;

for( int i = 0; i <( 2 * n ) - 1; i++ )
{
    for( int x = 0; x < n; x++ )
    {
        suma = 0;
        for( int y = 0; y < n; y++ )
        { if( x + y == i )
                 suma += tab[ x ][ y ];
           
        }
        if( suma > w )
        { w = suma;
            z = i + 1;
           
        }
       
    }
}

2.
>> program, który wypisuje numer i elementy lewoskośnej przekątnej tablicy dwuwymiarowej


C/C++
for( int i = 0; i <( 2 * n ) - 1; i++ )
{
    suma = 0; // tu można mówić o sumie jakiejś przekątnej
   
    for( int x = 0; x < n; x++ )
    {
        //suma = 0;  // tu pokazuje jeden element
        for( int y = 0; y < n; y++ )
        ...
P-167921
Wiesław
Temat założony przez niniejszego użytkownika
» 2017-12-17 12:49:43
Dziękuję za pomoc. Sam napisałem taki poprawiony kod, w którym tablica ma wymiary 3x3. Zmieniłem miejsce zerowania sumy oraz w, jednak ciągle coś nie działa (jest to kwestia dosłownie jednego miejsca w tablicy). Wymiary tablicy dla których kod nie działa to
-1 -1 -1
-1 -1 -1
-1 -1 0
Wypisuje wtedy 4: -1 -1, a nie 5: 0.
Nowy kod:
C/C++
#include<iostream>
using namespace std;
int main()
{ int tab[ 3 ][ 3 ];
    for( int a = 0; a < 3; a++ )
    { for( int b = 0; b < 3; b++ )
             cin >> tab[ a ][ b ];
       
    }
   
   
    int z = 0, suma = 0, w = - 1000000;
    for( int i = 0; i < 2 * 3 - 1; i++ )
    { suma = 0;
        for( int x = 0; x < 3; x++ )
        {
            for( int y = 0; y < 3; y++ )
            { if( x + y == i )
                     suma += tab[ x ][ y ];
               
            }
            if( suma > w )
            { w = suma;
                z = i + 1;
               
            }
           
        }
    }
    cout << z << ": ";
    for( int x = 0; x < 3; x++ )
    { for( int y = 0; y < 3; y++ )
        { if( x + y == z - 1 )
                 cout << tab[ x ][ y ] << " ";
           
        } }
    return 0;
}
P-167944
Luq
» 2017-12-17 14:19:50
C/C++
if( suma > w )
{
    w = suma;
    z = i + 1;
}
Ta część jest w niewłaściwym miejscu.
P-167949
Wiesław
Temat założony przez niniejszego użytkownika
» 2017-12-17 21:31:28
Dziękuję bardzo, problem rozwiązany :)
P-167970
Wiesław
Temat założony przez niniejszego użytkownika
Przyspieszenie programu
» 2017-12-18 21:19:35
W sumie mam jeszcze jeden problem - da się jakoś przyspieszyć działanie programu? Ponieważ dla dużych tablic zajmuje dużo czasu (i pamięci). Pozdrawiam.
EDIT: Wymyśliłem coś takiego. Dziękuję za dawną pomoc jeszcze raz.
C/C++
#include<iostream>
using namespace std;
int main()
{
    cin.tie( 0 );
    ios_base::sync_with_stdio( 0 );
    std::flush( std::cout );
    short n;
    cin >> n;
    short tab[ n ][ n ];
    int luke[ 2 * n - 1 ];
    for( int y = 0; y < 2 * n - 1; y++ )
         luke[ y ] = 0;
   
    for( short a = 0; a < n; a++ )
    { for( short b = 0; b < n; b++ )
             cin >> tab[ a ][ b ];
       
    }
    int suma = 0, z = 0, p = 0;
    for( int a = 0; a < n; a++ )
    { for( int b = 0; b < n; b++ )
        { p = a + b;
            luke[ p ] += tab[ a ][ b ];
        }
       
    }
    int y = luke[ 0 ];
    for( short c = 1; c < 2 * n - 1; c++ )
    { if( luke[ c ] > y )
        { y = luke[ c ];
            z = c;
        }
    }
    cout << z + 1 << ": ";
    for( short x = 0; x < n; x++ )
    { for( short y = 0; y < n; y++ )
        { if( x + y == z )
                 cout << tab[ x ][ y ] << " ";
           
        } }
    return 0;
}
P-167980
« 1 »
  Strona 1 z 1