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

Średnia waga kotka

Aruba Cloud - Virtual Private Server VPS
0 głosów
179 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ź 507 wizyt
pytanie zadane 18 lutego 2018 w Matematyka, fizyka, logika przez Wookiee Użytkownik (980 p.)
0 głosów
1 odpowiedź 1,288 wizyt
pytanie zadane 30 października 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
0 odpowiedzi 649 wizyt
pytanie zadane 16 czerwca 2018 w C i C++ przez fruczka Użytkownik (570 p.)

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...