• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Średnia waga kotka

Object Storage Arubacloud
0 głosów
128 wizyt
pytanie zadane 18 lutego 2021 w C i C++ przez Kacperek_code Obywatel (1,690 p.)

Cześć, miałem napisać funkcję, która wypisze koty, których waga jest powyżej średniej i zapisze do pliku. 

Napisałem, ale niestety nie można tego zrobić w taki sposób z powodu niezgodnych typów argumentów i braku konwersji.

Proszę o pomoc. 

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdlib>
#include <algorithm>

struct Kot
{
    std::string imie; //skoro piszemy w C++ bardziej zasadne używać jest 'std::string' niżeli 'C-string'
    std::string rasa; //skoro piszemy w C++ bardziej zasadne używać jest 'std::string' niżeli 'C-string'
    int wiek;
    float waga;
};

std::vector<Kot> wczytajDane(std::ifstream& Plik);

void wyswietlDane(const std::vector<Kot>& wektor);

std::vector<Kot> wczytajDane(std::ifstream& Plik)
{
    std::vector<Kot> Koty;
    Kot kot;

    while (Plik >> kot.imie >> kot.rasa >> kot.wiek >> kot.waga)
    {
        Koty.push_back(kot);
    }

    return Koty;
}

void wyswietlDane(const std::vector<Kot>& wektor)
{
    for (const auto& k : wektor)
    {
        std::cout << k.imie << " " << k.rasa << " " << k.wiek << " " << k.waga << " " << "\n";
    }
}

void szukajRasy(const std::vector<Kot>& tabela, std::string r)
{
    bool czy_znaleziono = false;

    for (size_t i = 0; i < tabela.size(); i++)
    {
        czy_znaleziono = (tabela[i].rasa == r);

        if (czy_znaleziono)
        {
            std::cout << "\n" << tabela[i].imie << " " << tabela[i].rasa << " " << tabela[i].wiek << " " << tabela[i].waga << " " << "\n";
        }
    }

    if (!czy_znaleziono)
    {
        std::cout << "\nNie znaleziono rasy";
    }
    
}

void sortujRasy(std::vector<Kot>& tabela)
{
    std::sort(tabela.begin(), tabela.end(), [](const Kot& a, const Kot& b) { return a.rasa < b.rasa; });
}

float srWaga(std::vector<Kot>& tabela)
{
    float suma = 0;
    int ile = 0;

    for (size_t i = 0; i < tabela.size(); i++)
    {
        suma += tabela[i].waga;
        ile++;
    }

    suma = suma / ile;
    std::cout << "\nSrednia waga kota wynosi: " << suma << "\n";

    return suma;
}

void powSr(std::vector<Kot>& tabela) //powSr - 'powyzej sredniej'
{
    std::ofstream zapis("waga.txt");

        for (int i = 0; i < tabela.size(); i++)
        {
            if (tabela[i].waga > srWaga)
            {
                zapis << tabela[i].imie << " " << tabela[i].rasa << " " << tabela[i].wiek << " " << tabela[i].waga;
                std::cout << "\n" << tabela[i].imie << " " << tabela[i].rasa << " " << tabela[i].wiek << " " << tabela[i].waga << " " << "\n";

            }
        }

        zapis.close();
}

int main()
{
    //Kot Koty[8]; 

    std::ifstream Plik;
    Plik.open("kotki.txt");
    if (!Plik.is_open())
    {
        std::cout << "Plik nie moze zostac otwarty. \n";
        std::cin.get();
        exit(1);
    }

    auto Koty = wczytajDane(Plik);

    wyswietlDane(Koty);

    std::string rasa;
    std::cout << "\nPodaj rase: ";
    std::cin >> rasa;
    szukajRasy(Koty, rasa);

    std::cout << "\n-------------------------\n";


    sortujRasy(Koty);
    wyswietlDane(Koty);
    srWaga(Koty);
    powSr(Koty);


    std::cin.ignore();
    std::cin.get();
    return EXIT_SUCCESS;
}

 

komentarz 18 lutego 2021 przez Kacperek_code Obywatel (1,690 p.)
PS. nie patrzcie na komentarze we strukturze xd Napisałem je dla swojego wykładowcy.

1 odpowiedź

+3 głosów
odpowiedź 18 lutego 2021 przez TOM_CPP Pasjonat (22,640 p.)
wybrane 19 lutego 2021 przez Kacperek_code
 
Najlepsza

W funkcji powSr wywołujesz niepoprawanie funkcję srWaga. Powinno być

if (tabela[i].waga > srWaga(tabela))
{
....
}

Pomyśl także o tym, że teraz niepotrzebnie wywołujesz funkcję srWaga z każdą iteracją pętli for.

Zobacz jak to można zrobić używając tylko jednego wywołania.

void powSr( std::vector<Kot>& tabela)
{
    std::ofstream zapis("waga.txt");

    auto sr {srWaga(tabela)};

    for ( const auto& kot : tabela )
    {
        if ( kot.waga > sr )
        {
            zapis << kot.imie << " " << kot.rasa << " " << kot.wiek << " " << kot.waga;
            std::cout << "\n" << kot.imie << " " << kot.rasa << " " << kot.wiek << " " << kot.waga << " " << "\n";
        }
    }
    zapis.close();
}

 

komentarz 19 lutego 2021 przez Kacperek_code Obywatel (1,690 p.)

Dziękuję pięknie za pomoc! 

Podobne pytania

0 głosów
1 odpowiedź 372 wizyt
pytanie zadane 18 lutego 2018 w Matematyka, fizyka, logika przez Wookiee Użytkownik (980 p.)
0 głosów
1 odpowiedź 913 wizyt
pytanie zadane 30 października 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
0 odpowiedzi 491 wizyt
pytanie zadane 16 czerwca 2018 w C i C++ przez fruczka Użytkownik (570 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...