eMatematikas Prisijunk Forumas Egzaminų užduotys ONLINE testai

Programavimas C++ Uždavinys


Sveiki reiktų pagalbos kažkur padariau klaidą. :(


void atimti(int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[],  int  n, int k )
{
    int h;
    for(int i=0; i<n; i++){
        for(int j=0; j<k; j++){
            if(KontDiena[i]==DienaKeist[j]){
                h=i;
                salinimas(KontDiena,KontKiek,DienaKeist,KiekKeist,n,h);

            }
        }
    }

}




void salinimas(int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[], int & n, int h){
for(int i=h; i<n; i++){
    KontDiena[i]=KontDiena[i++];
    KontKiek[i]=KontKiek[i++];
}
n--;
}



Iš dviejų masyvų KontDiena Ir KontKiek reikia pašalinti kitų dviejų masyvų DienaKeist ir KiekKeist elementus.

Duomenys:
KontDiena[5]={6, 8, 12, 19, 26};
KontKiek[5]={2, 1, 1, 2, 1};
6 2
8 1
12 1
19 2
26 1

DienaKeist[3]={8, 12, 19};
KiekKeist[3]={1,1,1};
8 1
12 1
19 1

Reikia pašalinti sutampancius elementus eilese.
Turetu gautis:
6 2
19 1

Jei neaiškiai parašiau galiu atsiusti visa kodą ar užduotį. Būčiau labai dėkingas.

pakeista prieš 6 m

Viskas aišku tik, ar galėtum įkelti visą kodą? Be to, jūs jau mokėtės struktūras?

pakeista prieš 6 m

Galiu, bet nemanau ar labai ką padės, nes be šitos dalies nesprendžiu toliau. Apie struktūras dal nelabai žinau.

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

const char in1[]="Duomenys1.txt";
const char in2[]="Duomenys2.txt";
const char in3[]="Duomenys3.txt";
const char out[]="Rezultatai.txt";
const int CMax=100;

void skaityti(const char in1[], const char in2[], const char in3[], int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[], int DienaPridet[], int KiekPridet[], int & n, int & k, int & p);
void bandymasspaudinti(int KontDiena[], int KontKiek[], int n);
void salinimas(int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[], int & n, int h);
void atimti(int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[],  int  n, int k );

int main()
{
    int n, k, p;
    int KontDiena[CMax], KontKiek[CMax];
    int DienaKeist[CMax], KiekKeist[CMax];
    int DienaPridet[CMax], KiekPridet[CMax];

    skaityti(in1,in2,in3,KontDiena,KontKiek,DienaKeist,KiekKeist,DienaPridet,KiekPridet,n,k,p);
    atimti(KontDiena,KontKiek,DienaKeist,KiekKeist,n,k);



    bandymasspaudinti(KontDiena,KontKiek,n);

    return 0;
}

void skaityti(const char in1[], const char in2[], const char in3[], int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[], int DienaPridet[], int KiekPridet[], int & n, int & k, int & p){
ifstream fd(in1);
fd>>n;
for(int i=0; i<n; i++){
    fd>>KontDiena[i]>>KontKiek[i];
}
fd.close();

ifstream dd(in2);
dd>>k;
for(int j=0; j<k; j++){
    dd>>DienaKeist[j]>>KiekKeist[j];
}
dd.close();

ifstream ff(in3);
ff>>p;
for(int m=0; m<p; m++){
    ff>>DienaPridet[m]>>KiekPridet[m];
}
ff.close();
}



void atimti(int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[],  int  n, int k )
{
    int h;
    for(int i=0; i<n; i++){
        for(int j=0; j<k; j++){
            if(KontDiena[i]==DienaKeist[j]){
                h=i;
                salinimas(KontDiena,KontKiek,DienaKeist,KiekKeist,n,h);

            }
        }
    }

}




void salinimas(int KontDiena[], int KontKiek[], int DienaKeist[], int KiekKeist[], int & n, int h){
for(int i=h; i<n; i++){
    KontDiena[i]=KontDiena[i++];
    KontKiek[i]=KontKiek[i++];
}
n--;
}

pakeista prieš 6 m

Geriau įkelk visą užduotį, nes pagal mane, bandant įžvelgt kas kaip, "turėtų gautis"
6 2
19 1
26 1

Aii, taip mano klaida.
6 2
19 1
26 1
Turi gautis

Gal kažkas rado kas ne taip?

Šalinime siūlyčiau pirma su if funkcija surasti masyvų indeksus(KontDiena ir DienaKeist), kai jų reikšmės yra vienodos - vienoda diena. Jei tos dienos vienodos, tai iš kiekio masyvo(KontKiek) atimti kito kiekio masyvo (KiekKiek) reikšmes rastuose indeksuose ir tik tada šalinti iš masyvų(KontDiena ir KontKiek) reikšmes, kurių kiekio masyvo(KontKiek) reikšmės lygios 0;

Kodą įdėjau čia: https://pastebin.com/CnERpmJ5

Dėkui labai. Viskas gerai veikia, tik kodėl funkcijoje "atimti" reikia  i--; ir j=0; prisiskiriti?

pakeista prieš 6 m

Nagrinėkime integer tipo KontDiena ir DienaKeist masyvus:

KontDiena[5]={6, 8, 12, 19, 26};
DienaKeist[7]={12, 13, 15, 7, 8, 6, 19};

Pašalinkime antrąją KontDiena reikšmę [tex](i=1)[/tex], turėtume

KontDiena[4]={6,12,19,26};
DienaKeist[7]={12, 13, 15, 7, 8, 6, 19};

tačiau be i--; j=0; ir toliau einant antrajam antrajam ciklui, tenkinančiui j<k po šalinimo, KontDiena(1)=12 reikšmė bus lyginama su DienaKeist(j+1) (j>0, nes ciklas neuždarytas, veiks kol j<k) ir t.t., todėl bus nepatikrintos DienaKeist reikšmės nuo j=0 iki j=5, esant i=1 ir bus praleista DienaKeist(0)=12 reikšmė. Tokia situacija labai reali dirbant su didesniais duomenimis.

pakeista prieš 6 m

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »