Осуществить проход по номерам квартир и выписать одинаковые квартиры и проживающих там людей

Всем доброго времени суток. Нужна ваша помощь. Программа практически полностью доделана, но не могу понять как осуществить проход именно по семьям и выписать семьи с одинаковыми номерами квартир.



#include <iostream>
#include <cstdio>
void m_print(void) // для печати файла 
{


    int oldmax_1 = 0; // используеться для определения возраста в семье 1 
    int oldmax_2 = 0; // используеться для определения возраста в семье 2 
    int oldmax_3 = 0; // используеться для определения возраста в семье 3 
    int oldmax_4 = 0; // используеться для определения возраста в семье 4
    char oldmax_name_1[32]; // используеться для имени старшего человека в семье 1 
    char oldmax_name_2[32]; // используеться для имени самого страшего человека в семье 2
    char oldmax_name_3[32]; // используеться для имени самого старшего человека в семье 3
    char oldmax_name_4[32]; // используеться для имени самого страшего человека в семье 4
    char oldmin_name_1[32]; // используеться для имени самого младшего человека в семье 1 
    char oldmin_name_2[32]; // используеться для имени самого младшего человека в семье 2
    char oldmin_name_3[32]; // используеться для имени самого младшего человека в семье 3
    char oldmin_name_4[32]; // используеться для имени самого младшего человека в семье 4
    
    struct people
    {
        char name[32];
            int old;
    };
    struct J_GEO_1
    {
        char city[32];
        char ulitsa[32];
        int kv;
        int dom;
    };
    struct Family
    {
        char name[32];
        people* fd[5];
        J_GEO_1* ad;
    };

    people a = {"dima", 15,},
        b = {"egor", 20,},
        c = {"misha" , 30,},
        n = {"ola" , 29,},
        v = {"masha" , 70,},

        d = {"sasha" , 35,},
        x = {"dasha" , 34,},
        e = {"oleg" , 15,},
        f = {"kostya" , 70,},
        q = {"ira" , 68},

        z = {"kira" , 15,},
        l = {"karina" , 34,},
        m = {"nikita" , 35,},
        s = {"vova" , 60,},
        r = {"dima" , 70,}, // no

        u = {"stas" , 29,},
        i = {"nastya" , 33,},
        p = {"vera", 40,}, // no
        o = {"mikle" , 67,}, // no
        h = {"luda" , 63,}; // no 

    J_GEO_1 a1 = {"moskva", "perovo" , 16 , 140, },
        d1 = {"moskva",  "akdemicheskaya" , 15 , 10,},
        z1 = {"ekaterinburg", "puskina", 29 , 140,},
        u1 = {"anapa", "ianovo", 16 , 48};

    // сравнение номеров домов вывод одинаковых семей 
    // сравнение квартир вывод одинаковых семей 
    // сравнение имен в семьях вывод одинаковых имен в семьях 

    Family F1, F2, F3, F4;

    strcpy(F1.name, "F1");
    F1.fd[0] = &a;
    F1.fd[1] = &b;
    F1.fd[2] = &c;
    F1.fd[3] = &n;
    F1.fd[4] = &v;

    F1.ad = &a1;

    strcpy(F2.name, "F2");
    F2.fd[0] = &d;
    F2.fd[1] = &x;
    F2.fd[2] = &e;
    F2.fd[3] = &f;
    F2.fd[4] = 0;

    F2.ad = &d1;

    strcpy(F3.name, "F3");
    F3.fd[0] = &z;
    F3.fd[1] = &l;
    F3.fd[2] = &m;
    F3.fd[3] = &s;
    F3.fd[4] = 0;

    F3.ad = &z1;

    strcpy(F3.name, "F4");
    F4.fd[0] = &u;
    F4.fd[1] = &i;
    F4.fd[2] = 0;
    F4.fd[3] = 0;
    F4.fd[4] = 0;

    F4.ad = &u1;

    for (int ic = 0; ic <= 4; ic++)
    {
        if(oldmax_1<F1.fd[ic]->old)
        {
            oldmax_1 = F1.fd[ic]->old;
            strcpy(oldmax_name_1, F1.fd[ic]->name);
        }
        for (int ic = 0; ic <= 4; ic++)
        {
            if (oldmax_2 < F2.fd[ic]->old)
            {
                oldmax_2 = F2.fd[ic]->old;
                strcpy(oldmax_name_2, F2.fd[ic]->name);
            }
            for (int ic = 0; ic <= 4; ic++)
            {
                if (oldmax_3 < F3.fd[ic]->old)
                {
                    oldmax_3 = F3.fd[ic]->old;
                    strcpy(oldmax_name_3, F3.fd[ic]->name);
                }
                for (int ic = 0; ic <= 4; ic++)
                {
                    if (oldmax_4 < F4.fd[ic]->old)
                    {
                        oldmax_4 = F4.fd[ic]->old;
                        strcpy(oldmax_name_4, F4.fd[ic]->name);
                    } // закончили с максимальным возрастом
                    for (int ic = 0; ic <= 4; ic++)
                    {
                        if (oldmax_1 > F1.fd[ic]->old)
                        {
                            oldmax_1 = F1.fd[ic]->old;
                            strcpy(oldmin_name_1, F1.fd[ic]->name);
                        }
                        for (int ic = 0; ic <= 4; ic++)
                        {
                            if (oldmax_2 > F2.fd[ic]->old)
                            {
                                oldmax_2 = F2.fd[ic]->old;
                                strcpy(oldmin_name_2, F2.fd[ic]->name);
                            }
                            for (int ic = 0; ic <= 4; ic++)
                            {
                                if (oldmax_3 > F3.fd[ic]->old)
                                {
                                    oldmax_3 = F3.fd[ic]->old;
                                    strcpy(oldmin_name_3, F3.fd[ic]->name);
                                }
                                for (int ic = 0; ic <= 4; ic++)
                                {
                                    if (oldmax_3 > F3.fd[ic]->old)
                                    {
                                        oldmax_4 = F4.fd[ic]->old;
                                        strcpy(oldmin_name_4, F4.fd[ic]->name);  
                                    } // закончили с минимальным возрастом
                                }
                            }
                        }
                    }
                }
            }
        }
        
    }
}

Ответы (1 шт):

Автор решения: Павел Ериков

Если же вам не важно, как выглядит код и эффективен ли он, а главное, что работает и хорошо, то для начала создадим функцию print, которая будет внутри себя проверять номера квартир и если они равны, то выводить имена членов семьи.

void print(Family fam1, Family fam2) {
    //Если квартиры не равны, то выходим из функции
    if (fam1.ad->kv != fam2.ad->kv)
        return;
    cout << "Одинаковая квартира: " << fam1.ad->kv << endl;
    cout << "Первая семья: " << endl;
    for (int i = 0; i < 5; ++i)
        if(fam1.fd[i] != 0)
            cout << fam1.fd[i]->name << endl;
    cout << "Вторая семья: " << endl;
    for (int i = 0; i < 5; ++i)
        if(fam2.fd[i] != 0)
            cout << fam2.fd[i]->name << endl;
}

Должен предупредить, что все ваши структуры внутри функции m_print нужно вынести вне.

И в функции m_print вызовем 6 раз функцию print:

print(F1, F2); print(F1, F3); print(F1, F4);
print(F2, F3); print(F2, F4);
print(F3, F4);

Но лучше все таки писать код примерно таким образом.

→ Ссылка