Wyszukiwanie elementu w tablicy struktur

0

Cześć, dlaczego funkcja 'szukajRasy' ciągle zwraca "Nie znaleziono rasy" ?
Jak posortować tablicę wg. rasy?


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

struct Kot
{
	char imie[10];
	char rasa[20];
	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(Kot tabela[], std::string r)
{
	bool czy_znaleziono; 

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

		if (czy_znaleziono)
		{
			std::cout << r << tabela[i].imie;
		}
	}

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

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);
	}

	wyswietlDane((wczytajDane(Plik)));

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

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

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


0

Jaki brzydki kod, C ze strumieniami.

~Do powtórki, jak porównuje się C-stringi ~ (zakładając sarkastycznie, że nie umiesz projektować w C++) dlaczego masz C-stringi w strukturze, a nie std?

Kolejne: funkcje void drukujące, a nie wykonujące czynność i zwracające "coś".

Kompilator aż wyje od ostrzeżeń o nieużytych zmiennych, np Kot Koty[8]{};, BTW jak zacząłeś w vectorach, to tu jest tablica? To "pożyczone" z różnych miejsc?
Moje oczy aż migają na ilość #inckludów.
Jest powód, ze się nie wyszukuje - wystarczy, ze przeczytasz własny (lub "własny") kod.

0

@AnyKtokolwiek:

  1. Co to znaczy "brzydki kod" ? Skoro jest "brzydki" to proszę pokazać jak wygląda "ładny" kod.

  2. Dlaczego mam C-stringi? Dlatego, że tak brzmi polecenie zadania:

Zadeklarować strukturę Kot mającą pola:
imie – tablica znakowa 10-elementowa
rasa- tablica znakowa 20 elementowa (może być dwuwyrazowa)
wiek - typu całkowitego
waga – typu rzeczywistego
W funkcji main zadeklarować 8 - elementową tablicę Koty typu Kot.

3.U mnie nic nie wyje. Natomiast zgodzę się z tym. Tablica to również nie mój wymysł.
4.Tu się również zgodzę. Tyle #inckludów rzeczywiście jest niepotrzebnych.
5.Okej dziękuje za "pomoc".

0

@stefano_cx:

Czyli dalej nie kumasz, dlaczego nic nie znajduje ???

PS. niektórych (w sensie matematycznym, czyli < 100%) nauczycieli infy bym posłał do sprzedawania szczypiorku.
Ten styl podawania zadań, łącznie z "W funkcji main zadeklarować 8 - elementową tablicę Koty typu Kot. " to zabija jakiekolwiek myślenie adepta.
Edukacja skierowana na produkowanie średniaków (by nie nazwać mniej dyplomatycznie)

7

@stefano_cx: to na początek

tabela[i].rasa == r

Tutaj nie porównujesz stringów, a dwie tablice. W dodatku operator == porównuje wskaźniki, a nie wartości. Użyj funkcji strcmp tak jak poniżej:

if( strcmp(test, test2) == 0)
{
    printf("equal");
}

Po drugie, ładny kod, to kod, który jest czytelny. Jeżeli za 6 tygodni wrócisz do tego kodu, to może go zrozumiesz, a za 6 miesięcy? Poczytaj o czymś, co nazywa się Clean Code.

2

Na dodatek iterujesz po całej tablicy i nadpisujesz wynik, po tym jak nawet znajdzie ci tą rasę.

5

Szybkie poprawki:
https://godbolt.org/z/1777re

Jak na początkującego nie jest brzydko.
Jest jakiś podział na mniejsze funkcje, większość ma w miarę rozsądne typy argumentów i wartości zwracanej, będą z ciebie ludzie ;).

A co do pytania:

  1. Jeśli dopasowany kot nie jest na ostatniej pozycji, to ponieważ nie kończysz pętli czy_znaleziono zawsze nabywa wartość false.
  2. twój kod ma Undefined behavior. Jeśli lista kotów jest pusta, to używasz wartości zmiennej, która w kodzie nie ma określonej wartości.
0
urke napisał(a):

Na dodatek iterujesz po całej tablicy i nadpisujesz wynik, po tym jak nawet znajdzie ci tą rasę.

Na dodatek po pustej

3

Co do sortowania:
C++11

#include <algorithm>

void sortujRasy(std::vector<Kot>& tabela)
{
    // zakładając, że Kot::rasa to std::string
    std::sort(tabela.begin(), tabela.end(), [](const Kot& a const Kot& b) { return a.rasa < b.rasa; }); 
}

nowy C++20:

#include <algorithm>
#include <ranges>

void sortujRasy(std::vector<Kot>& tabela)
{
    // zakładając, że Kot::rasa to std::string
    std::ranges::sort(tabela, {}, &Kot::rasa); 
}

https://wandbox.org/permlink/rPTiYlJMNWrUInPM

1 użytkowników online, w tym zalogowanych: 0, gości: 1