Peršokti į turinį

c++ atrinkimas iš masyvo


Justasino

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

Kiek bandau niekas neišeina, neišeina kaip atrinkti pasikartojančius masyvus..


Uždavinys
http://www.part.lt/perziura/cf33bc79c99036d7b670ff72efecd1dc961.JPG

pvz

10
Petras 4
Jonas 3
Petras 6
Jonas 7
Petras 5
Jonas 9
Petras 8
Jonas 7
Petras 4
Jonas 7



Reikia, kad liktu
Petras
Jonas
naudojant tik for,if
o poto jų vidurkį suskaičiuot
Būčiau labai dėkingas jei kas su pavyzdžiu paaiškintumėt, kaip atrinkti, kad liktu tik tik tie du, o kaip jų vidurkį dar apskaičiuot...

Nuoroda į komentarą
Dalintis per kitą puslapį

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

using namespace std;

const string INPUT_FILE_NAME = "U1.txt";
const int MAXIMUM_ARRAY_SIZE = 99;

// Rikiavimas burbulo metodu.
// Rikiuojame abu masyvus, tačiau tik atsižvelgdami į pirmo masyvo reikšmes.
void bubble_sort_pair_by_first(string strings[], int integers[], unsigned int size)
{
    for (unsigned int i = 0; i < size - 1; i++)
    {
        bool is_swapped = false;
        for (unsigned int j = 0; j < size - i - 1; j++)
        {
            // Jeigu pirmasis string'as yra "didesnis", sukeičiame vietomis tiek string'ą, tiek integer'į.
            if (strings[j] > strings[j + 1])
            {
                const string string_temp = strings[j];
                strings[j] = strings[j + 1];
                strings[j + 1] = string_temp;
                const int integer_temp = integers[j];
                integers[j] = integers[j + 1];
                integers[j + 1] = integer_temp;
                is_swapped = true;
            }
        }
        // Jei nei vienas elementas nebuvo sukeistas vietomis, ciklas stabdomas.
        // Taip daroma, kad nebūtų tikrinamas surikiuotas masyvas.
        if (is_swapped == 0)
        {
            break;
        }
    }
}

int main(int argc, char* argv[])
{
    ifstream input_stream(INPUT_FILE_NAME);
    if (input_stream.fail())
    {
        cerr << "Error opening the file: " << INPUT_FILE_NAME;
        cin.get();
        return 1;
    }

    // Iš failo nuskaitome eilučių kiekį.
    unsigned int entries;
    input_stream >> entries;

    string names[MAXIMUM_ARRAY_SIZE];
    int grades[MAXIMUM_ARRAY_SIZE];

    // Nuskaitome visas reikšmes iš failo ir atitinkamai sudedame į masyvus.
    for (unsigned int i = 0; i < entries; i++)
    {
        input_stream >> names[i] >> grades[i];
    }

    // Rikiuojame vardus pagal abėcėlę, o pažymius rikiuojame ne pagal pažymių dydį, o kartu su vardais.
    bubble_sort_pair_by_first(names, grades, entries);

    string unique_names[MAXIMUM_ARRAY_SIZE];
    double grade_averages[MAXIMUM_ARRAY_SIZE] = { 0.0 };

    // Įdedame pirmą vardą į naują vardų masyvą ir inicializuojame kintamuosius.
    unique_names[0] = names[0];
    unsigned int name_count = 1;
    grade_averages[0] += grades[0];
    unsigned int grade_count = 1;

    for (unsigned int i = 1; i < entries; i++)
    {
        // Iteruojame per kiekvieną studento vardą, tikrindami, ar jis yra lygus ankstesniam.
        // Toks tikrinimas dublikatų šalinime veikia, nes masyvas yra surikiuotas.
        // Jeigu randame naują vardą (nesutampa su ankstesniu):
        //   * ankstesnio studento pažymių sumą daliname iš pažymių skaičiaus,
        //   * padidiname vardų skaičių,
        //   * pridedame dabartinio studento vardą į naują vardų masyvą,
        //   * atstatome pažymių skaičių į 1,
        //   * sudedame dabartinio studento pažymį,
        //   * tikriname toliau.
        if (names[i - 1] != names[i])
        {
            grade_averages[name_count - 1] /= grade_count;
            name_count++;
            unique_names[name_count - 1] = names[i];
            grade_count = 1;
            grade_averages[name_count - 1] += grades[i];
        }
        // Jeigu neradome naujo vardo (sutapo su ankstesniu):
        //   * sudedame dabartinio studento pažymį,
        //   * padidiname pažymių skaičių vienetu,
        //   * tikriname toliau.
        else
        {
            grade_averages[name_count - 1] += grades[i];
            grade_count++;
        }
    }
    // Pasibaigus ciklui suskaičiuojame paskutinio studento pažymių vidurkį.
    // Taip darome, nes visada vidurkį suskaičiuodavome, kai rasdavome naują studento vardą.
    grade_averages[name_count - 1] /= grade_count;

    // Atspausdiname studentų vardus ir pažymių vidurkius su pasirinktu tikslumu.
    for (unsigned int i = 0; i < name_count; i++)
    {
        cout << unique_names[i] << "\t"
             << setprecision(2) << grade_averages[i] << '\n';
    }

    cin.get();

    return 0;
}

 

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

  • Parašė po 3 savaičių...
  • d0Se užrakino šią temą

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2321 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.
  • Šiame puslapyje naršo:   0 nariai

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

Skelbimai


×
×
  • Sukurti naują...