Peršokti į turinį

Dėl pasikartojančių duomenų radimo (C++)


NoSwear`

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

Kompiuterių kainos yra duomenys, ir jie po nuskaitymo saugomi atminty, ne C++ programavimo kalboje :D. Anyway, štai kodas, jeigu teisingai supratau sąlygą:

// ===== Preprocesoriaus direktyvos ===== //

// Include'iname bibliotekas. Jų reikėjo būtent šioje programoje, nes...
// Dirbome su įvesties/išvesties stream'ais (cin/cout).
#include <iostream>

// Nes naudojome setprecision() funkciją.
#include <iomanip>

// Panaudojome ribas dirbdami su įvesties srautu.
#include <limits>

// Hard code'iname masyvo dydžio reikšmę.
#define MASYVO_DYDIS 20

// =====                           =====  //

// Naudojame standartinį std namespace'ą.
// Be jo reikėtų rašyti std::cout, std::cin, std::endl ir pnš.
using namespace std;

int main(int argc, char* argv[]) {
    double kompiuteriuKainos[MASYVO_DYDIS] = {
        500, 100, 300, 300, 200, 600, 900, 300, 700, 800,
        200, 600, 100, 700, 200, 900, 400, 400, 100, 500};
    int pasikartojimuSkaicius = 1;
    
    for (int i = (MASYVO_DYDIS - 1); i > 0; i--) {
        for (int j = 1; j <= i; j++) {
            if (kompiuteriuKainos[j - 1] > kompiuteriuKainos[j]) {
                double temp = kompiuteriuKainos[j - 1];
                kompiuteriuKainos[j - 1] = kompiuteriuKainos[j];
                kompiuteriuKainos[j] = temp;
            }
        }
    }
    
    double ankstesnisElementas = kompiuteriuKainos[0];
    for (int i = 1; i < MASYVO_DYDIS; i++) {
        if (kompiuteriuKainos[i] == ankstesnisElementas) {
            pasikartojimuSkaicius++;
            if (MASYVO_DYDIS < 3) {
                if (pasikartojimuSkaicius > 1) {
                    cout << "Masyve kompiuterio kaina '" << fixed << setprecision(2) << ankstesnisElementas
                         << "' pasikartojo " << pasikartojimuSkaicius << " karta (-us)." << '\n';
                }
            }
        } else {
            if (pasikartojimuSkaicius > 1) {
                cout << "Masyve kompiuterio kaina '" << fixed << setprecision(2) << ankstesnisElementas
                     << "' pasikartojo " << pasikartojimuSkaicius << " karta (-us)." << '\n';
                ankstesnisElementas = kompiuteriuKainos[i];
                pasikartojimuSkaicius = 1;
            }
        }
    }
    
    cout << "\nPaspauskite <ENTER>.";
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    
    return 0;
}

 

Žinoma, čia toks algoritmo realizavimas yra artimesnis C kalbai, o ne C++, bet taip parašiau, nes spėju, jog ši užduotis skirta mokyklai. Ten juk ir prašo koduoti, pavyzdžiui, su primityviais C tipo masyvais, o ne su kokiais C++ vektoriais naudojant STL algoritmus. O jei ši užduotis ir nėra skirta mokyklai, tokio algoritmo analizavimas turėtų praversti.

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

(redaguota)

ne,taip parasiau turejau omeny kodas c++ programavimo kalba :D,Dėkui.

 

sąlygą pilna: Parduotuvėje ant prekystalio sudėta kompiuterių  eilutė. Kiekvieno iš jų kaina žinoma. Pirkėjas prašo vidutinės kainos kompiuterio. Kuris tai bus? Ar yra vienodų kainų kompiuterių?

Redaguota , nario NoSwear`
Nuoroda į komentarą
Dalintis per kitą puslapį

Papildžiau pagal sąlygą, tik neskaitau duomenų iš failo:

// ===== Preprocesoriaus direktyvos ===== //

// Include'iname bibliotekas. Jų reikėjo būtent šioje programoje, nes...
// Dirbome su įvesties/išvesties stream'ais (cin/cout).
#include <iostream>

// Nes naudojome setprecision() funkciją.
#include <iomanip>

// Panaudojome ribas dirbdami su įvesties srautu ir maksimaliomis skaitinių tipų reikšmėmis.
#include <limits>

// Naudojome modulio funkciją abs().
#include <cmath>

// Hard code'iname masyvo dydžio reikšmę.
#define MASYVO_DYDIS 500

// =====                           =====  //

// Naudojame standartinį std namespace'ą.
// Be jo reikėtų rašyti std::cout, std::cin, std::endl ir pnš.
using namespace std;

int main(int argc, char* argv[]) {
    int kompiuteriuSkaicius;
    double kompiuteriuKainos[MASYVO_DYDIS];
    int pasikartojimuSkaicius = 1;
    double kainuVidurkis;
    
    cout << "Sveiki, tai programa, kuri ispes apie kompiuteriu kainu pasikartojimus"
         << "\nbei ras kompiuteri, kurio kaina yra artimiausia kainu vidurkiui."
         << "\n\nIveskite kompiuteriu skaiciu."
         << "\n> ";
    // Apsauga nuo netinkamų reikšmių įvestyje, t.y. kitų simbolių nei skaičiai.
    while (!(cin >> kompiuteriuSkaicius)) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    cout << "\nIveskite kompiuteriu kainas, centus atskirdami tasku (pvz.: 500.95)." << endl;
    for (int i = 0; i < kompiuteriuSkaicius; i++) {
        cout << "> #" << i << ": ";
        // Apsauga nuo netinkamų reikšmių įvestyje, t.y. kitų simbolių nei skaičiai.
        while (!(cin >> kompiuteriuKainos[i])) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
    }
    cout << endl;
    for (int i = (kompiuteriuSkaicius - 1); i > 0; i--) {
        for (int j = 1; j <= i; j++) {
            if (kompiuteriuKainos[j - 1] > kompiuteriuKainos[j]) {
                double temp = kompiuteriuKainos[j - 1];
                kompiuteriuKainos[j - 1] = kompiuteriuKainos[j];
                kompiuteriuKainos[j] = temp;
            }
        }
    }
    
    double ankstesnisElementas = kompiuteriuKainos[0];
    for (int i = 1; i < kompiuteriuSkaicius; i++) {
        if (kompiuteriuKainos[i] == ankstesnisElementas) {
            pasikartojimuSkaicius++;
            if (kompiuteriuSkaicius < 3) {
                if (pasikartojimuSkaicius > 1) {
                    cout << "[!] Masyve kompiuterio kaina '" << fixed << setprecision(2) << ankstesnisElementas
                         << "' pasikartojo " << pasikartojimuSkaicius << " karta (-us)." << '\n';
                }
            }
        } else {
            if (pasikartojimuSkaicius > 1) {
                cout << "[!] Masyve kompiuterio kaina '" << fixed << setprecision(2) << ankstesnisElementas
                     << "' pasikartojo " << pasikartojimuSkaicius << " karta (-us)." << '\n';
                ankstesnisElementas = kompiuteriuKainos[i];
                pasikartojimuSkaicius = 1;
            }
        }
    }
    
    double kainuSuma = 0;
    for (int i = 0; i < kompiuteriuSkaicius; i++) {
        kainuSuma += kompiuteriuKainos[i];
    }
    kainuVidurkis = kainuSuma / kompiuteriuSkaicius;
    
    int artimiausiosKainosKompiuteris = 0;
    double maziausiasSkirtumas = numeric_limits<double>::max();
    for (int i = 0; i < kompiuteriuSkaicius; i++) {
        if (abs(kompiuteriuKainos[i] - kainuVidurkis) < maziausiasSkirtumas) {
            maziausiasSkirtumas = abs(kompiuteriuKainos[i] - kainuVidurkis);
            artimiausiosKainosKompiuteris = i;
        }
    }
    
    cout << "\nKompiuterio kainu vidurkis: " << kainuVidurkis;
    cout << "\nKompiuterio, kurio kaina yra maziausiai nutolusi nuo vidurkio, numeris yra: "
         << artimiausiosKainosKompiuteris << ".\nJo kaina yra: "
         << kompiuteriuKainos[artimiausiosKainosKompiuteris] << '\n';
    
    cout << "\nPaspauskite <ENTER>.";
    cin.sync();
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    
    return 0;
}

 

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

prieš 21 valandas(-ų), NoSwear` parašė:

o galėtum pakoreguot su įvedimais kompiuterių kainų ,kad be masyvu būtų?

O kaip be masyvų ar pnš. duomenų struktūrų mes dirbsime su duomenimis :D? Turbūt turėjai omeny, kad neinicializuočiau masyvo programos kode ir prašyčiau vartotojo įvedimo. Tad atnaujinau ankstesnį pranešimą, kuriame pridėjau kodą su prašymu vartotojui įvesti kompiuterių kainas bei ištaisiau kelis bug'us abiejuose pranešimuose esančiuose koduose.

P.S. Daugiau kodo nerašysiu, turiu svarbesnių reikalų :P.

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

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

Svečias
Ši tema yra užrakinta.

Skelbimai


×
×
  • Sukurti naują...