Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Reikia skubios pagalbos su c++ uzdaviniu


Džiumandži

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1200 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Nustatykite, ar šiame masyve yra stulpeliai, kurių visi nariai yra neigiami.

ir jei yra issaugoti sukurtam masyve s[x] stulpelio numeri

ok susikuriau loop'a kur tikrina 

for(int i=0;i < stulpelis; i++) {

      for(int j=0; j < eilute; j++) {
               if(j < 0) { }
      }

}

Nors i ta puse?

Nesuprantu, kaip praejus viska patikrinus issaugoti sukurtam masyve stulpelio nr :D 

Nuoroda į komentarą
Dalintis per kitą puslapį

na viena ideja butu tikriausiai susikurti masyva kuriame galetum saugoti kuriuose stulpeliuose yra bent vienas teigiamas skaicius, masyvo indeksas butu stulpelio numeris. Tokiu budu galetum padaryt masyva pavyzdziui:

bool teigiamasStulpelis[x] = {0}; 

ir jeigu stulpelyje i bus teigiamas skaicius, tada pakeisti reiktu

teigiamasStulpelis[i] = 1;

tada tokiu budu gausi sarasa kuriuose stulpeliuose yra vien tik neigiami skaiciai (kai masyve bus 0). Na tada beliktu perrasyt stulpeliu indeksus kurie turi 0 i s[x]

Redaguota , nario Zero Two
Nuoroda į komentarą
Dalintis per kitą puslapį

Kadangi čia yra kalbama apie stulpelius, tai čia bus dvimatis masyvas. Tavo įdėtame kodo snippet'e jis niekur nevyrauja. Vietoj to tikrini, ar indeksas yra mažesnis už nulį. It doesn't make sense, nes masyvų indeksai yra teigiami :D.

Parašiau programą, kuri patikrina, ar yra bent vienas stulpelis, atitinkantis duotą sąlygą, ir stabdo ciklą. Belieka tik apjungti (ir pamodifikuoti) mano kodą su prieš tai pasiūlyta idėja.

int main()
{
    const int size = 4;
    int table[size][size] = {
        1, 2, -3, 4,
        5, 6, -7, 8,
        9, 0, -1, 2,
        3, 4, -5, 6,
    };

    bool any_neg_clmn = false;

    for ( int x = 0; x < size; ++x )
    {
        int y;
        for ( y = 0; y < size; ++y )
        {
            if ( table[y][x] >= 0 )
                break;
        }

        any_neg_clmn = (y == size);
        if ( any_neg_clmn )
            break;
    }

    return 0;
}
Redaguota , nario Tautedorus
Nuoroda į komentarą
Dalintis per kitą puslapį

13 minutes prieš, Džiumandži parašė:

@Tautedorus

Jo, kaip ir sakei dvimatis masyvas susigeneruoju random stulp,eil skaiciu....


        any_neg_clmn = (y == size);
        if ( any_neg_clmn )
            break;
    }

Gali paaiskinti sita vieta? :D nelabai ikirtau

any_neg_clmn kintamasis nusako, ar yra bent vienas stulpelis, kuriame visi skaičiai yra neigiami. Kiekvieną kartą pasibaigus ciklui, kuriame ėjome per kiekvieną stulpelio elementą, patikriname, ar pasiekėme paskutinį elementą. Jeigu taip, vadinasi tame stulpelyje yra vien neigiami skaičiai. Tai reiškia, kad radome bent vieną stulpelį su neigiamais skaičiais ir ciklą galima stabdyti. Tavo atveju ciklo stabdyti nereikia, nes radęs vieną tokį stulpelį norėsi rasti likusius ir išsaugoti jų numerius.

Nuoroda į komentarą
Dalintis per kitą puslapį

27 minutes prieš, Tautedorus parašė:

any_neg_clmn kintamasis nusako, ar yra bent vienas stulpelis, kuriame visi skaičiai yra neigiami. Kiekvieną kartą pasibaigus ciklui, kuriame ėjome per kiekvieną stulpelio elementą, patikriname, ar pasiekėme paskutinį elementą. Jeigu taip, vadinasi tame stulpelyje yra vien neigiami skaičiai. Tai reiškia, kad radome bent vieną stulpelį su neigiamais skaičiais ir ciklą galima stabdyti. Tavo atveju ciklo stabdyti nereikia, nes radęs vieną tokį stulpelį norėsi rasti likusius ir išsaugoti jų numerius.

Nieko nesigauna,

buvo salyga, kad jei yra neigiamias stulpelis tai sukurti masyva b[x] ir issaugoti stulpelio nr... prisegu visa koda del visa ko jei gali prachekink.

x priskiriu reiksme 30 nes intervale tarp 10-30 turiu sukurti random stulpeliu ir eiluciu kieki tai, kitokio budo nezinau dariau, kaip suprantu, okey toliau norejau B tai, kaip suprantu tipo jei yra neigiamas tai i vieta ides stulpelio nr kuriam yra visi negiami, ir niekas neveikia :D 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;

int main()
{
    ofstream out("masyvas.txt");
    srand(time(0));
    // Atsitiktiniai skaiciai tarp 10-30
    int n=rand() % (31 - 10) + 10; // eilutes
    int m=rand() % (31 - 10) + 10; // stulepliai

    int A[n][m];

    //--------------kurimas---------------
  for(int i=0; i<n; i++)
  {
      for(int j=0; j<m; j++)
      {
          A[i][j]=rand()%100 + (rand()%100 *(-1)) ;
      }
  }
 //------------Spausdiname-------------------
 for(int i=0; i<n; i++)
  {
      for(int j=0; j<m; j++)
            out<<setw(5)<<A[i][j]<<" ";
      out<<endl;
  }
  out.close();
 //------------------------------------------
 int x=30;
 int B[x] = {};
 for(int i=0; i < m;i++)
 {
     for(int j=0; j<n;j++) {
            if(A[i][j] >= 0) {
            break;
            } else {
                 B[i] =+ i;
            }
     }
 }
    return 0;
}

 

Nuoroda į komentarą
Dalintis per kitą puslapį

Pirmiausia, tai C++ kalboje nėra VLA palaikymo, skirtingai nei C kalboje. Dėl to masyvų dydžiai turi būti konstantos. Kai kurie kompiliatoriai leidžia naudoti VLA, bet tai nėra patartina. Čia paprasčiausiai galima nusistatyti didžiausią leistiną dydžio konstantą (pavyzdžiui 32) ir susikurti tokio dydžio masyvą. Galima naudoti ir dinaminį atminties išskyrimą, bet čia užeina už mokyklinio kurso ribų.

Taip pat, reikėtų susikonfigūruoti kodo redaktorių, kad formatuotų kodą. Tiek kitiems, tiek tau bus lengviau jį skaityti. Vietoje komentarų, atskiriančių kodo dalis, reikia naudoti funkcijas. Kodas bus struktūrizuotas ir, to pasekoje, lengviau perskaitomas.

Na, ir pereinant prie stulpelių radimo, tavo algoritmas kiekvieną kartą radęs neigiamą skaičių stulpelyje, pridės jo indeksą (numerį) į masyvą. Kam to reikia? Geriau turėti ne int, o bool masyvą ir praėjus pro visus stulpelio elementus priskirti true arba false, priklausomai nuo to, ar radome tinkamą stulpelį.

Galiausiai, patarčiau sumažinti lentelės dydį arba pakeisti užpildymo algoritmą, nes sudarius 30x30 lentelę su atsitiktinėmis reikšmėmis, tikimybė maža, kad gausime stuleplį, kuris turės vien neigiamas reikšmes.

Štai veikiantis kodas:

#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>

#define MAXLEN 32

void clmn2bool_neg(int table[MAXLEN][MAXLEN], int dy, int dx, int columns[MAXLEN])
{
    for ( int x = 0; x < dx; ++x )
    {
        int y;
        for ( y = 0; y < dy; ++y )
        {
            if ( table[y][x] >= 0 )
                break;
        }

        columns[x] = (y == dy);
    }
}

void fprint_2d_arr(const std::string& filename, int table[MAXLEN][MAXLEN], int dy, int dx)
{
    std::ofstream fout(filename);

    for ( int y = 0; y < dy; ++y )
    {
        for ( int x = 0; x < dx; ++x )
        {
            fout << std::setw(5) << table[y][x] << ' ';
        }
        fout << '\n';
    }

    fout.close();
}

void init_2d_arr(int table[MAXLEN][MAXLEN], int dy, int dx)
{
    for ( int y = 0; y < dy; ++y )
    {
        for ( int x = 0; x < dx; ++x )
        {
            table[y][x] = rand() % 100 + (rand() % 100 * (-1));
        }
    }
}

int main()
{
    srand(time(0));

    int dy = rand() % (6 - 2) + 2;
    int dx = rand() % (6 - 2) + 2;

    int table[MAXLEN][MAXLEN];
    int columns[MAXLEN];

    init_2d_arr(table, dy, dx);
    fprint_2d_arr("table.txt", table, dy, dx);
    clmn2bool_neg(table, dy, dx, columns);

    for ( int x = 0; x < dx; ++x )
    {
        if ( columns[x] != 0 )
            std::cout << x << ' ';
    }

    return 0;
}
Redaguota , nario Tautedorus
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 2 savaičių...

@Tautedorus

Tavo pasiulytas budas man per sudetingas ir neikandamas :D

Salyga sako, kad jei yra neigiamas stulpelis tai susikurti b[x] masyva.

Stringu ir nezinau ka daryt, bet kiek suprantu problema yra ties else neigStlp = true; nes tik radus neigiama skaiciu uzdeda true, bet neapskritai visam stulpeli.

Toliau prie if, kadangi salyga sako sukurti b masyva jei yra neigiamas stulpelis tai sukuriu masyva cikle y nes, noriu i y vieta idet stulpelio numeri :D, bet kolkas spausdina nesamones...

Na paaiskinau, kaip suprantu ir, kaip stengiaus daryt, bet stringu. Noriu kuo paprasciau padaryt, ir tai, kad pats suprasciau :D 

 for(int i=0; i < m;i++) // m stulpeliai
 {
     int j;
     for(j=0; j<n;j++) { // n eilutes
            if(A[j][i]>0)
            break;
            else neigStlp = true;
     }
     if(neigStlp){
        for(int y=0;y<m;y++)
        {
            int x=m;
            int B[x]= {};
            int num=+i;
            B[y]=num;
            cout << B[y] << endl;
        }
     }
 }

 

Nuoroda į komentarą
Dalintis per kitą puslapį

Tai mano sprendimas ir išsprendžia tą problemą, kad tik radus neigiamą skaičių neužskaitytų to stulpelio kaip tinkamo. Nežinau, ar eina padaryti paprasčiau, tik reikia išsiaiškinti. Tau reikia už ciklo (4 eilutė) ribų patikrinti, ar j == n. Jei ši sąlyga teisinga, vadinasi niekada nedarėm break ir praėjom pro visas eilutes, o tai reiškia, kad visi skaičiai yra neigiami.

Redaguota , nario Tautedorus
Nuoroda į komentarą
Dalintis per kitą puslapį

29 minutes prieš, Tautedorus parašė:

Tai mano sprendimas ir išsprendžia tą problemą, kad tik radus neigiamą skaičių neužskaitytų to stulpelio kaip tinkamo. Nežinau, ar eina padaryti paprasčiau, tik reikia išsiaiškinti. Tau reikia už ciklo (4 eilutė) ribų patikrinti, ar j == n. Jei ši sąlyga teisinga, vadinasi niekada nedarėm break ir praėjom pro visas eilutes, o tai reiškia, kad visi skaičiai yra neigiami.

oh :D ziaurai dekui sutaupei daug laiko :D 

Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1200 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...