Peršokti į turinį

reikia pagalbos su c++ uždaviniu


ifsmilga

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

Turime tekstiniame faile(personalas.txt) darbuotojų žiniaraštį:
vardas (16 simbolių), pareigos,  dirbta valandų.
Kitame tekstiniame faile (ikainiai.txt) turime darbų įvertinimo normatyvus:
pareigu pavadinimas, valandos įkainis.
Suformuoti atlyginimų sąrašą(skaiciavimai.txt) ir jį sutvarkyti pagal atlyginimo dydį ir
vardą: vardas, dirbtas valandų kiekis, atlyginimas.
Reikalavimai programai:
1. naudokite įrašus (struktūras) ir masyvus su įrašo (struktūros) tipo elementais;
2. sukurkite pradinių duomenų skaitymo procedūrą (funkciją void C++);
3.sukurkite atlyginimo skačiavimo procedūrą (funkciją void C++);
4.sukurkite rezultatų rašymo į failą procedūrą (funkciją void C++);
5. sukurkite funkciją, rikiuojančią atlyginimus didėjimo tvarka.

personalas

 6 
Vilma       direktorė     8.00    
Ingrida     pavaduotoja   4.00    
Ligita        mokytoja      10.36    
Jurgita        sekretorė     8.00    
Jonas        ūkvedys          4.00    
Kotryna        logopedė      6.00    

ikainiai

direktorė    15.25
pavaduotoja    12.36
mokytoja    9.05
sekretorė    5.45
ūkvedys        5.45
logopedė    7.12

    

 

man taip gaunasi, chatgpt - deja, nepadeda :(

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

using namespace std;

struct Darbuotojas {
    string vardas;
    string pareig;
    double val;
    double ikainis;
    double alga;
};

void skaitymas(Darbuotojas D[], int &n);
void skaiciuoti(Darbuotojas D[], int n);
void spausdinimas(Darbuotojas D[], int n);
double rikiuoti(double D[], int n);

int main() {
    
    Darbuotojas D[51];
    int n;
    skaitymas(D, n);
    skaiciuoti(D, n);
    
    spausdinimas(D, n);
    return 0;
}

void skaitymas(Darbuotojas D[], int &n) {
    ifstream fd1("personalas.txt");
    fd1 >> n;
    char eil[8];
    fd1.ignore(); // Consume the newline character
    for (int i = 0; i < n; i++) {
        getline(fd1, D[i].vardas); // Read the entire line as a string
        fd1 >> D[i].val;
    }
    fd1.close();

    ifstream fd2("ikainiai.txt");
    int k;
    fd2 >> k;
    for (int j = 0; j < k; j++) {
        fd2 >> D[j].ikainis;
    }
    fd2.close();
}

void skaiciuoti(Darbuotojas D[], int n) {
    for (int i = 0; i < n; i++) {
        D[i].alga = D[i].ikainis * D[i].val * 30; // skaciuojam 30-ciai dienu
    }
}


    
    
void spausdinimas(Darbuotojas D[], int n) {
    ofstream fr("skaiciavimai.txt");
    for (int i = 0; i < n; i++) {
        fr << "Vardas " << D[i].vardas << "  Dirbta " << D[i].val << "  Alga " <<fixed << setprecision(2)<< D[i].alga << endl;
    }
    fr.close(); 
}


void rikiuoti(Darbuotojas D[], int n){
    for (int i = 0; i < n - 1; i++){
    int min = i;
        for (int j = i + 1; j < n; j++) {
            if (D[j].alga > D[min].alga){
                min = j;
}
    
}

}
        
            }
                
 

Nuoroda į komentarą
Dalintis per kitą puslapį

prieš 5 valandas(-ų), ifsmilga parašė:

skaičiuoja šitaip

image.png.b6d8924630f318502799f9f25a703ced.png

Problema ne skaičiavime, o tavo failų nuskaityme. Jeigu neklystu ir gerai atsimenu, šiuo metu tu nuskaitai visą eilutė į savo D[].vardas. O ir šiaip, getline su fstream nenaudočiau, nes, vėl gi, kiek pats atsimenu, shit's fucking confusing su juo.

Įsitikinimui, greitai tokį sketch'ą padariau. 

#include <iostream>
#include <fstream>
#include <string>

struct Darbuotojas {
    std::string vardas;
    std::string pareig;
    double val;
    double ikainis;
    double alga;
};

int main() {
    std::ifstream file("darbuotojai.txt");

    Darbuotojas D[51];
    int n;

    file >> n;
    for (int i = 0; i < n; i++) {
        std::getline(file, D[i].vardas);
    }
    file.close();

    std::cout << D[2].vardas;
}


image.png.c9687d2b60db4c38a709727156be20b9.png

Ir štai ką aš gaunu. Kaip matai, visa eilutė buvo nuskaityta į string kintamąjį. 

Tiesiog naudok tokį būdą

 

#include <iostream>
#include <fstream>
#include <string>

struct Darbuotojas {
    std::string vardas;
    std::string pareig;
    double val;
    double ikainis;
    double alga;
};

int main() {
	std::ifstream file("darbuotojai.txt");

    Darbuotojas D[51];
    int n;

    file >> n;
    for (int i = 0; i < n; i++) {
        file >> D[i].vardas;
        file >> D[i].pareig;
        file >> D[i].val;
    }
    file.close();

    std::cout << D[2].val;
}

Ir viskas labai gražiai nusiskaito. 

image.png.e571bb60bb0e3306248a8f2f34db5c43.png

Nuoroda į komentarą
Dalintis per kitą puslapį

nežinau kas kaip, bet porą pirmų eilučių gaunasi gerai kaip ir turi būti ir tie skaičiai tokie irgi bet, toliau ne, be to meta ir pareigas, kurių neturi būti

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

using namespace std;

struct Darbuotojas {
    string vardas;
    string pareigos;
    double val;
    double ikainis;
    double alga;
};

void skaityti(Darbuotojas D[], int& n);
void skaiciuoti(Darbuotojas D[], int n);
void rikiuoti(Darbuotojas D[], int n);
void spausdinti(Darbuotojas D[], int n, double val, double alga);

int main() {
    Darbuotojas D[51];
    int n;
    skaityti(D, n);
    skaiciuoti(D, n);
    rikiuoti(D, n);
    void spausdinti(Darbuotojas D[], int n);
    return 0;
}

void skaityti(Darbuotojas D[], int& n) {
    string vardas;
    double ikainis;
    ifstream fd1("personalas.txt");
    ifstream fd2("ikainiai.txt");
    fd1 >> n;
    char eil[17];
    for (int i = 0; i <= n; i++) {
        fd1.ignore(80, '\n');
        fd1.get(eil, 17);
        D[i].vardas = eil;
        fd1 >> D[i].pareigos;
        fd1 >> D[i].val;
    }

    for (int i = 1; i <= n; i++) {
        fd2 >> vardas;
        fd2 >> ikainis;
        D[i].ikainis = ikainis; 
    }
    fd1.close();
    fd2.close();
}

void skaiciuoti(Darbuotojas D[], int n) {
    for (int i = 1; i <= n; i++) {
        D[i].alga = D[i].ikainis * D[i].val;
    }
}

void rikiuoti(Darbuotojas D[], int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            if (D[i].alga < D[j].alga) {
                Darbuotojas temp = D[i]; //sukeitimas
                D[i] = D[j];
                D[j] = temp;
            }
        }
    }
}

void spausdinti(Darbuotojas D[], int n) {
    ofstream fr("skaiciavimai.txt");
    for (int i = 1; i <= n; i++) {
        fr << "Vardas " << D[i].vardas << " Dirbta " << D[i].val << " Alga " << D[i].alga << endl;
    }
    fr.close();
}
 

image.png

Nuoroda į komentarą
Dalintis per kitą puslapį

21 minutes prieš, ifsmilga parašė:

nežinau kas kaip, bet porą pirmų eilučių gaunasi gerai kaip ir turi būti ir tie skaičiai tokie irgi bet, toliau ne, be to meta ir pareigas, kurių neturi būti

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

using namespace std;

struct Darbuotojas {
    string vardas;
    string pareigos;
    double val;
    double ikainis;
    double alga;
};

void skaityti(Darbuotojas D[], int& n);
void skaiciuoti(Darbuotojas D[], int n);
void rikiuoti(Darbuotojas D[], int n);
void spausdinti(Darbuotojas D[], int n, double val, double alga);

int main() {
    Darbuotojas D[51];
    int n;
    skaityti(D, n);
    skaiciuoti(D, n);
    rikiuoti(D, n);
    void spausdinti(Darbuotojas D[], int n);
    return 0;
}

void skaityti(Darbuotojas D[], int& n) {
    string vardas;
    double ikainis;
    ifstream fd1("personalas.txt");
    ifstream fd2("ikainiai.txt");
    fd1 >> n;
    char eil[17];
    for (int i = 0; i <= n; i++) {
        fd1.ignore(80, '\n');
        fd1.get(eil, 17);
        D[i].vardas = eil;
        fd1 >> D[i].pareigos;
        fd1 >> D[i].val;
    }

    for (int i = 1; i <= n; i++) {
        fd2 >> vardas;
        fd2 >> ikainis;
        D[i].ikainis = ikainis; 
    }
    fd1.close();
    fd2.close();
}

void skaiciuoti(Darbuotojas D[], int n) {
    for (int i = 1; i <= n; i++) {
        D[i].alga = D[i].ikainis * D[i].val;
    }
}

void rikiuoti(Darbuotojas D[], int n) {
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            if (D[i].alga < D[j].alga) {
                Darbuotojas temp = D[i]; //sukeitimas
                D[i] = D[j];
                D[j] = temp;
            }
        }
    }
}

void spausdinti(Darbuotojas D[], int n) {
    ofstream fr("skaiciavimai.txt");
    for (int i = 1; i <= n; i++) {
        fr << "Vardas " << D[i].vardas << " Dirbta " << D[i].val << " Alga " << D[i].alga << endl;
    }
    fr.close();
}
 

 

image.png

Nenaudok visokiausių get, ignore ar dar ko nors, tau jų nereikia. ">>" operatorius ir taip puikiai susitvarkys su nuskaitymu iki space simbolio.

Redaguota , nario darrel.
Nuoroda į komentarą
Dalintis per kitą puslapį

Persidariau greitai tavo kodą ir viskas labai gražiai atsispausdina.

image.png.5c85fec897b73c6420c3f6703616c2df.png

Taip pat, pastebėjau daug klaidų kode.

void spausdinti(Darbuotojas D[], int n, double val, double alga);

Kam tiek parametrų funkcijos deklaracijoje, jeigu pusė vis vieną nenaudoji?

Taipogi, tavo ciklai. Nepamiršk, kad skaičiavimas programavime vykdomas nuo 0, ne nuo 1. Tai pavyzdžiui, pas tave iš viso 6 darbuotojai:

1 2 3 4 5 6

Tačiau, programa mato tai, kaip:

0 1 2 3 4 5

Ką aš tuo turiu omeny - savo ciklų sąlygose tu nurodai, kad i, ciklo skaitiklis, turi būti mažesnis arba lygus n, kas šiuo atveju yra 6. Tai kas gaunasi, kad tavo skaičiavimas, nuskaitymas ir t.t. vykdomas taip:
 

0 1 2 3 4 5 6

Dėl ko, vėl gi, gali atsirasti problemų, nes programa to elemento, jau septintojo, tiesiog neturi, tai priskirti gali bet ką. 

Na ir paskutinis dalykas, kodėl tu spausdinimą, ir dar pora ciklų, pradėdi nuo 1, jeigu masyvai prasideda nuo nulio?

Nesakau, kad čia 100% tikslus paaiškinimai, kadangi ten dar labiau gilintis reikia į tai, kaip kompiuterio atmintis veikia ir t.t., bet sprendžiant pagal užduotį, tikrai turėjo bent pagrindą papasakoti 11 kl. net.

Sėkmės programavime!

 

Redaguota , nario darrel.
Nuoroda į komentarą
Dalintis per kitą puslapį

prieš 18 valandas(-ų), ifsmilga parašė:

ačiū už pagalbą tikrai, ir tokia pravertė, o kas liečia programavimą ir mokyklą gal palikim ... nes kai ją baigiau, buvo vienas kompas visoj mokykloj, taip kad apie kažką daugiau ta tema ir nereikia :)

 

Fair enough then

Nuoroda į komentarą
Dalintis per kitą puslapį

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