Peršokti į turinį

Padėkite su programavimo uždaviniu


Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1217 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

Paprasčiausiai nuskaityti būtų galima taip:

#include <fstream>
#include <iostream>

#define MAXLEN 50

int main()
{
    std::ifstream fin("file.txt");
    if ( !fin )
        return 1;

    int m, n;
    fin >> m >> n;
    if ( m > MAXLEN || n > MAXLEN )
        return 1;

    int matrix[MAXLEN][MAXLEN];
    for ( int i = 0; i < m; ++i )
        for ( int j = 0; j < n; ++j )
            fin >> matrix[i][j];

    return 0;
}

Taip pat galima kurti paprastą vienmatį masyvą ir interpretuoti  jį kaip dvimatį:

#include <fstream>
#include <iostream>

#define MAXLEN 2500

int main()
{
    std::ifstream fin("file.txt");
    if ( !fin )
        return 1;

    int m, n;
    fin >> m >> n;
    if ( m * n > MAXLEN )
        return 1;

    int matrix[MAXLEN];
    for ( int i = 0; i < m; ++i )
        for ( int j = 0; j < n; ++j )
            fin >> matrix[i * n + j];

    return 0;
}

Tačiau abu sprendimai turi trūkumų: 

  • masyvas turi būti gana mažas, kad tilptų į steką
  • atmintis yra išvaistoma (nes bet kokiu atveju kuriame maksimalaus dydžio masyvą)

Jei nori išvengti anksčiau minėtų problemų, reikia pasimokyti apie rodykles arba STL konteinerius. Bet tai yra out-of-scope mokykliniame kurse :unsure:.

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

(redaguota)

Kolkas esu padaręs tiek ir nesusigaudau, kur klaidų galėtų būti

Pačią matricą esu užrašęs taip:

4 4
4 8 9 -5
5 6 1 8
-5 9 10 18

#include <iostream>
#include <fstream>
using namespace std;
#define MAXLEN 2500
const char FV[]="Matrica.txt";
const char FR[]="Rezultatai.txt";
int n, m;
int A[4][4];
int main()
{
std::ifstream fin("matrica.txt");
if ( !fin )
return 1;
 
int m, n;
fin >> m >> n;
if ( m * n > MAXLEN )
return 1;
 
int matrix[MAXLEN];
for ( int i = 0; i < m; ++i )
for ( int j = 0; j < n; ++j )
fin >> matrix[i * n + j];
 
return 0;
}
//void Skaitymas(char FV[])
//{
// ifstream fd("Matrica.txt");
//fd >> n >> m;
//for(int i = 0; i < n; i++ )
// for(int j = 0; j < m; j++ )
//fd >> A[j];
// fd.close();
//}
void Spausdinti(char FR[])
{
ofstream fr("Rezultatai.txt");
for(int i = 0; i < n; i++ ) {
for(int j = 0; j < m; j++ )
fr << A[j] << " ";
fr << endl;
}
fr.close();
}
void RastiDidVieta(int &di, int &dj)
{
int did = -10000; // Pradinė reikšmė
di = -1; // Didžiausio matricos elemento eilutės indeksas
dj = -1; // Didžiausio matricos elemento stulpelio indeksas
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(A[j] > did) {
did = A[j]; di = i; dj = j;
}
}
void StulpelioSalinimas(int nrs)
{
for(int j = nrs; j < m-1; j++)
for(int i = 0; i < n; i++)
A[j] = A[j+1];
m = m-1; // Stulpelių skaičius sumažinamas vienetu
}
Redaguota , nario Nesiseka
Nuoroda į komentarą
Dalintis per kitą puslapį

Pirmiausia, tai visada prieš klausdamas turi parodyti suformatuotą kodą. Niekam nesinori kopijuoti ir dėti į IDE kodą, kad išeitų suprasti, kas parašyta. Taip pat forumuose kodas talpinamas kodo įterpimo funkcijos pagalba teksto redaktoriuje.

Kalbant apie patį kodą, tai iš karto galiu pasakyti, kad negalima naudoti globaliųjų kintamųjų, nebent išskirtiniais atvejais (mokykloje tikrai tokių nebus). Tad masyvą ir kitus kintamuosius reikia kurti main() funkcijoje ir paduoti jį kitoms. Jei nori, kad paduotų kintamųjų reikšmės po pakeitimų atsispindėtų ir main() funkcijoje, naudok nuorodas, pvz., void foo(int &x). Na, yra ir kitų problemų:

  • dvimačiai masyvai, kaip rodžiau pavyzdyje, yra naudojami su dvejomis poromis laužtinių skliaustų, pvz., matrix[0][5]
  • funkcijos turi būti sukuriamos virš main() funkcijos (arba bent jau deklaruojamos)
  • ieškant didžiausio skaičiaus, pradinė reikšmė turi būti pirmas elementas, o ne kažkoks magiškas skaičius
  • failų pavadinimų konstantos yra sukurtos, bet jų nenaudoji
  • prieš pradedant skaityti failą, nepatikrini, ar jį pavyko atidaryti
  • main() funkcijoje atidarai failą skaitymui, bet niekur to nepanaudoji, nes failą atidarai ir skaitymo funkcijoje
  • nors ir mokykloje turbūt sakys kitaip, patariu using namespace std nenaudoti ir ranka visur prirašyti std::
  • vietoje std::endl daugumoje situacijų užtenka parašyti tiesiog '\n'

Pataisius visa tai ir daugiau:

#include <fstream>
#include <iostream>

#define MAXLEN 32

const char IN_FNAME[] = "matrix.txt";
const char OUT_FNAME[] = "result.txt";

void del_col_2d(int matrix[MAXLEN][MAXLEN], int dx, int& dy, int col)
{
    if ( col >= dy )
        return;

    for ( int x = 0; x < dx; ++x )
        for ( int y = col; y < dy - 1; ++y )
            matrix[x][y] = matrix[x][y + 1];

    --dy;
}

void max_idx_2d(int matrix[MAXLEN][MAXLEN], int dx, int dy, int& xmax, int& ymax)
{
    xmax = ymax = 0;
    for ( int x = 0; x < dx; ++x )
        for ( int y = 0; y < dy; ++y )
            if ( matrix[x][y] > matrix[xmax][ymax] )
            {
                xmax = x;
                ymax = y;
            }
}

void copy_arr_2d(int from[MAXLEN][MAXLEN], int to[MAXLEN][MAXLEN], int dx, int dy)
{
    for ( int x = 0; x < dx; ++x )
        for ( int y = 0; y < dy; ++y )
            to[x][y] = from[x][y];
}

void fprint_arr_2d(int matrix[MAXLEN][MAXLEN], int dx, int dy)
{
    std::ofstream fr(OUT_FNAME);
    for ( int x = 0; x < dx; ++x )
    {
        for ( int y = 0; y < dy; ++y )
            fr << matrix[x][y] << ' ';

        fr << '\n';
    }

    fr.close();
}

void fread_arr_2d(int matrix[MAXLEN][MAXLEN], int& dx, int& dy)
{
    std::ifstream fd(IN_FNAME);
    if ( !fd )
        return;

    fd >> dx >> dy;
    for ( int x = 0; x < dx; ++x )
        for ( int y = 0; y < dy; ++y )
            fd >> matrix[x][y];

    fd.close();
}

int main()
{
    int b[MAXLEN][MAXLEN], m, n;
    fread_arr_2d(b, m, n);

    int xmax, ymax;
    max_idx_2d(b, m, n, xmax, ymax);

    int c[MAXLEN][MAXLEN];
    copy_arr_2d(b, c, m, n);

    del_col_2d(c, m, n, ymax);
    fprint_arr_2d(c, m, n);

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

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1217 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ą...