Jak zmieniać pola struktury wewnątrz pętli?

0

Cześć,
mam do zrobienia program, w którym bardzo by mi pomogło sprytne przesuwanie się po polach struktury. Mianowicie powiedzmy, że mamy taką strukturę:

struct osoba
 {
	int wiek;
	char imie[20];
};

I teraz chciałbym w pętli się odwoływać np. w pierwszej iteracji do pola wiek przez osoba.wiek, a w drugiej iteracji do pierwszej litery imienia, czyli osoba.imie[0] w miejscach gdzie wcześniej miałem wspomniane osoba.wiek. Czy da się w jakiś sprytny sposób podmienić "wiek" na "imie[0]"? Nie mam pomysłu jak to zrobić :(

1

da się zrobić, ale w przypadku C++ jest to dość karkołomne.
Pytanie po co?
Z doświadczenia domyślam się, że to jest problem XY, dlatego zapytam:

  • po co?
  • jaki jest twój problem X?
0

A co z uniami?

0

Dzięki za odpowiedź, tzn. mój problem polega na tym, że wiem jak rozwiązać zadanie, tylko w taki sposób, że przekopiuję trzy razy taki sam fragment kodu, dam dwa ify i będzie działać, natomiast podejrzewam, że jakby ktoś miał to czytać to by dostał oczopląsu :). Mam wykonać sortowanie w zależności od kryterium. Mam taką strukturę (typ_zwierza to zdefiniowany enum):

struct zwierz {

	typ_zwierza typ;
	char imie[N];
	int wiek;
}

kryterium jako typ wyliczeniowy:

enum kryterium {wiek, imie_wiek, typ_imie_wiek};

oraz funkcję sortującą w taki sposób, że jeżeli podaję kryterium wiek to sortuje tablicę zoo[] ze względu na wiek, jeżeli imie_wiek to sortuje najpierw ze wzgledu na wiek a potem ze względu na pierwszą literę imienia i analogicznie z kolejnym kryterium. Nie chciałem trzy razy kopiować tej pętli, tylko jakoś ładniej to rozwiązać. PS. Wiem, że bubble sort nie jest optymalny, ale de facto nie jest to tutaj istotne. W tym fragmencie kodu, który podaję brakuje właśnie tego elementu zamiany "wiek" na coś innego w ifie.

void sortuj(zwierz *zoo, int n, kryterium kryt) //kryterium wiek
{
	int i, j;
	zwierz a, b;
	for (int k = 0; k <= kryt; k++)
	{
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
			{
				if ((zoo + j)->wiek > (zoo + 1 + j)->wiek) //dodac zamiane pól
				{
					a = *(zoo + j);
					*(zoo + j) = *(zoo + 1 + j);
					*(zoo + 1 + j) = a;
				}
			}
		}
	}
}
3

No i faktycznie to był problem XY.

C++14

std::vector<zwierz> zoo;
…
std::sort(zoo.begin(), zoo.end(), [](const auto &a, const auto &b) { return a.typ < b.typ; });
…
std::sort(zoo.begin(), zoo.end(), [](const auto &a, const auto &b) { return a.wiek < b.wiek; });
…
std::sort(zoo.begin(), zoo.end(), [](const auto &a, const auto &b) { return strcmp(a.imie, b.imie) < 0; });

Jeśli chcesz używać swojego algorytmu sortowania (dowolne C++/C):

typedef bool (*porownjZwierzeta)(const zwierz& a, const zwierz& b);

bool porownajWiek(const zwierz& a, const zwierz& b);
bool porownajTyp(const zwierz& a, const zwierz& b);
bool porownajImie(const zwierz& a, const zwierz& b);

void sortuj(zwierz *zoo, int n, porownjZwierzeta cmp);

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