Powiązania w strukturach

0

Witam, jak to zwykle przy programowaniu mam kolejny problem;/ Robię program który między innymi tworzy łańcuchy powiązań miedzy ludźmi i wybiera spośród nich najdłuższy. Wygląda to mniej więcej tak:
Ala i Michał są przyjaciółmi
Kasia i Michał są przyjaciółmi
Paweł i Marek są przyjaciółmi
najdłuższy łańcuch: Ala-Michał- Kasia

Program zrobiłem za pomocą struktur tak, że wiadomo jakich przyjaciół ma dana osoba oraz ilu ich ma. Niestety nie mam żadnej koncepcji żeby zrobić ten łańcuch. Będę bardzo wdzięczny za jakiś pomysł.

Kod programu:

//============================================================================
// Name        : Przyjaciele.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

struct dane{
        char* imie;
        int wiek;
        char* przyjaciele[99];
        int ile_przyjaciol;
        char* wrogowie[99];
        int ile_wrogow;
    } ;

int main() {

    struct dane osoby[1000];

    char* tab[10];
    char* imie_max;
    int i,j,w,z,bonus,max,suma,l_osoby,x;
    float srednia,licznik;
    FILE* plik;
    char* tekst;
    tekst = (char*) malloc( sizeof(char) );
    char *n;

z=0;
l_osoby=0;
    j=0;
    plik = fopen("xxx.txt", "r");
    while (feof(plik)==false){
        i=0;

    n=fgets( tekst, 100, plik );
    ///printf("%s\n",tekst);

    char* k = tekst;
    while (k != NULL) {
    char* l = strchr(k+1,'  ');
    if (l != NULL) *l = '\0';

    ////cout << k << endl;

    bonus=strlen(k);

    if (k[bonus - 1] == '\n')
        k[bonus - 1] = '\0';

    tab[i]=k;

    i=i+1;
    if (l != NULL) k = l+1;
    else k=NULL;
    }
////////////osoby////////////////
    if (strlen(tab[0])==5){
l_osoby=l_osoby+1;
        osoby[j].imie=strdup(tab[1]);
            osoby[j].wiek=atof(tab[2]);
        /// printf("%d\n",j);
        /// printf("imie %s\n",osoby[j].imie);
            ////printf("wiek %d\n",osoby[j].wiek);
            ////printf("\n");
    }
    ///////////////////////////////////

    /////////////////przyjaciele/////////////////////
    if (strlen(tab[0])==11){
z=z+1;
        ///printf("%s\n",tab[0]);
        for (i=0;i<=j-z;i++){
            w=0;

//////////PRZYJACIELE////////////////////
                        if (osoby[i].imie==string(tab[1])){

                                while (osoby[i].przyjaciele[w]!=NULL){
                            w=w+1;
                                                }

                                    osoby[i].przyjaciele[w]=strdup(tab[2]);
                                    osoby[i].ile_przyjaciol=w+1;
                                        }

                        if (osoby[i].imie==string(tab[2])){

                                    while (osoby[i].przyjaciele[w]!=NULL){
                                w=w+1;
                                            }
                                            osoby[i].przyjaciele[w]=strdup(tab[1]);
                                            osoby[i].ile_przyjaciol=w+1;
                                            }
                      }

                    }

    /////////////////////////WROGOWIE/////////////////////
    if (strlen(tab[0])==7){
z=z+1;
        ///printf("%s\n",tab[0]);
        for (i=0;i<=j-z;i++){
            w=0;
    if (osoby[i].imie==string(tab[1])){

                                while (osoby[i].wrogowie[w]!=NULL){
                            w=w+1;
                                                }

                                    osoby[i].wrogowie[w]=strdup(tab[2]);
                                    osoby[i].ile_wrogow=w+1;
                                        }

                        if (osoby[i].imie==string(tab[2])){

                                    while (osoby[i].wrogowie[w]!=NULL){
                                w=w+1;
                                            }
                                            osoby[i].wrogowie[w]=strdup(tab[1]);
                                            osoby[i].ile_wrogow=w+1;
                                            }
                      }

                    }
    /////////////////////////////////////////

j=j+1;
    }

/// printf("\n");
    ////printf("%d\n",j);
    for (i=0;i<=j-z;i++){

    printf("imie %s\n",osoby[i].imie);
    printf("wiek %d\n",osoby[i].wiek);
    printf("przyjaciel %s\n",osoby[i].przyjaciele[0]);
    printf("ilosc przyjaciol: %d\n",osoby[i].ile_przyjaciol);
    ///printf("drugi przyjaciel Ali %s\n",osoby[i].przyjaciele[1]);
    printf("\n");
    }

////zadania programu///////////////

////najwiecej przyjaciol///////////
    max=0;
    for (i=0;i<=j-1;i++){
        if(osoby[i].ile_przyjaciol>=max){
            max=osoby[i].ile_przyjaciol;
            imie_max=osoby[i].imie;
        }

    }
    if (max==0){
                        printf("najwiecej przyjaciol: brak\n");
                    }else{
            printf("najwiecej przyjaciol: %s\n",imie_max);
                    }
/////////////////////////
    ////najwiecej wrogow///////////
        max=0;
        for (i=0;i<=j-1;i++){
            if(osoby[i].ile_wrogow>=max){
                max=osoby[i].ile_wrogow;
                imie_max=osoby[i].imie;
            }

        }
        if (max==0){
                    printf("najwiecej wrogow: brak\n");
                }else{
        printf("najwiecej wrogow: %s\n",imie_max);
                }
    /////////////////////////
//////sredni wiek bez przyjaciol////////////
    licznik=0;
    suma=0;
    srednia=0;
    for (i=0;i<=j-1;i++){
            if((osoby[i].ile_przyjaciol==0) && (osoby[i].imie!=NULL)){
                suma=suma+osoby[i].wiek;

                licznik=licznik+1;
            }

        }
    srednia=suma/licznik;
    printf("sredni wiek: %.1lf\n",srednia);
    printf("liczba wczytanych osob: %d\n",l_osoby);

    return 0;
}

Zawartość pliku z których program pobiera dane:

OSOBA Ala 18
OSOBA Iza 17
OSOBA Jan 16
OSOBA Marta 15
OSOBA Marcinek 13
OSOBA Marcin 13
OSOBA Gienek 12
PRZYJACIELE Ala Jan
PRZYJACIELE Marta Iza
PRZYJACIELE Marcin Ala
WROGOWIE Jan Ola

0

Nie wiem na czym ow powiazania mialyby polegac, ale pierwsze co mi przychodzi do glowy, to: http://pl.wikipedia.org/wiki/Graf_%28matematyka%29

0

Nie mogę tego ogarnąć. Próbuje to obecnie zrobić na funkcji.
wygląda to tak:

 //============================================================================
// Name        : Przyjaciele.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

struct dane {
    char* imie;
    int wiek;
    char* przyjaciele[99];
    int ile_przyjaciol;
    char* wrogowie[99];
    int ile_wrogow;
    char* lancuch[99];
};
struct dane osoby[1000];

int w, j, x, i;
string lancuch;

string Funkcja(char* a, string b) {

    for (w = 0; w <= j - 1; w++) {

        if (osoby[w].imie == a) {
            lancuch = lancuch + osoby[w].imie;
            cout << lancuch << endl;
            Funkcja(osoby[w].imie, lancuch);

        }

    }

    return lancuch;
}

int main() {

    char* tab[10];
    char* imie_max;
    int z, bonus, max, suma, l_osoby;
    float srednia, licznik;
    FILE* plik;
    char* tekst;
    tekst = (char*) malloc(sizeof(char));
    char *n;

    z = 0;
    l_osoby = 0;
    j = 0;
    plik = fopen("xxx.txt", "r");
    while (feof(plik) == false) {
        i = 0;

        n = fgets(tekst, 100, plik);
        ///printf("%s\n",tekst);

        char* k = tekst;
        while (k != NULL) {
            char* l = strchr(k + 1, '   ');
            if (l != NULL)
                *l = '\0';

            ////cout << k << endl;

            bonus = strlen(k);

            if (k[bonus - 1] == '\n')
                k[bonus - 1] = '\0';

            tab[i] = k;

            i = i + 1;
            if (l != NULL)
                k = l + 1;
            else
                k = NULL;
        }
////////////osoby////////////////
        if (strlen(tab[0]) == 5) {
            l_osoby = l_osoby + 1;
            osoby[j].imie = strdup(tab[1]);
            osoby[j].wiek = atof(tab[2]);
            /// printf("%d\n",j);
            /// printf("imie %s\n",osoby[j].imie);
            ////printf("wiek %d\n",osoby[j].wiek);
            ////printf("\n");
        }
        ///////////////////////////////////

        /////////////////przyjaciele/////////////////////
        if (strlen(tab[0]) == 11) {
            z = z + 1;
            ///printf("%s\n",tab[0]);
            for (i = 0; i <= j - z; i++) {
                w = 0;

//////////PRZYJACIELE////////////////////
                if (osoby[i].imie == string(tab[1])) {

                    while (osoby[i].przyjaciele[w] != NULL) {
                        w = w + 1;
                    }

                    osoby[i].przyjaciele[w] = strdup(tab[2]);
                    osoby[i].ile_przyjaciol = w + 1;
                }

                if (osoby[i].imie == string(tab[2])) {

                    while (osoby[i].przyjaciele[w] != NULL) {
                        w = w + 1;
                    }
                    osoby[i].przyjaciele[w] = strdup(tab[1]);
                    osoby[i].ile_przyjaciol = w + 1;
                }
            }

        }

        /////////////////////////WROGOWIE/////////////////////
        if (strlen(tab[0]) == 7) {
            z = z + 1;
            ///printf("%s\n",tab[0]);
            for (i = 0; i <= j - z; i++) {
                w = 0;
                if (osoby[i].imie == string(tab[1])) {

                    while (osoby[i].wrogowie[w] != NULL) {
                        w = w + 1;
                    }

                    osoby[i].wrogowie[w] = strdup(tab[2]);
                    osoby[i].ile_wrogow = w + 1;
                }

                if (osoby[i].imie == string(tab[2])) {

                    while (osoby[i].wrogowie[w] != NULL) {
                        w = w + 1;
                    }
                    osoby[i].wrogowie[w] = strdup(tab[1]);
                    osoby[i].ile_wrogow = w + 1;
                }
            }

        }
        ///////////////////////////////////////////

        j = j + 1;
    }

    ////////////////lancuch///////////////////////
    printf("odpalanie lancucha\n");
    for (i = 0; i <= j - 1; i++) {
        for (x = 0; x <= osoby[i].ile_przyjaciol - 1; x++) {

            cout << Funkcja(osoby[i].przyjaciele[x], lancuch);
        }
    }

/// printf("\n");
    ////printf("%d\n",j);
    for (i = 0; i <= j - 1; i++) {

        //printf("imie %s\n",osoby[i].imie);
        //printf("wiek %d\n",osoby[i].wiek);
        //printf("przyjaciel %s\n",osoby[i].przyjaciele[0]);
        //printf("ilosc przyjaciol: %d\n",osoby[i].ile_przyjaciol);
        //printf("drugi przyjaciel Ali %s\n",osoby[i].przyjaciele[1]);
    }

////zadania programu///////////////

////najwiecej przyjaciol///////////
    max = 0;
    for (i = 0; i <= j - 1; i++) {
        if (osoby[i].ile_przyjaciol >= max) {
            max = osoby[i].ile_przyjaciol;
            imie_max = osoby[i].imie;
        }

    }
    if (max == 0) {
        printf("najwiecej przyjaciol: brak\n");
    } else {
        printf("najwiecej przyjaciol: %s\n", imie_max);
    }
/////////////////////////
    ////najwiecej wrogow///////////
    max = 0;
    for (i = 0; i <= j - 1; i++) {
        if (osoby[i].ile_wrogow >= max) {
            max = osoby[i].ile_wrogow;
            imie_max = osoby[i].imie;
        }

    }
    if (max == 0) {
        printf("najwiecej wrogow: brak\n");
    } else {
        printf("najwiecej wrogow: %s\n", imie_max);
    }
    /////////////////////////
//////sredni wiek bez przyjaciol////////////
    licznik = 0;
    suma = 0;
    srednia = 0;
    for (i = 0; i <= j - 1; i++) {
        if ((osoby[i].ile_przyjaciol == 0) && (osoby[i].imie != NULL)) {
            suma = suma + osoby[i].wiek;

            licznik = licznik + 1;
        }

    }
    srednia = suma / licznik;
    printf("sredni wiek: %.1lf\n", srednia);
    printf("liczba wczytanych osob: %d\n", l_osoby);

    return 0;
}

Nie rozumiem tylko czemu nie wyświetla wartości tego łańcucha

0

1.Programowanie zorientowane faraonowo jest złym pomysłem pod każdym możliwym względem.
2.Zmienna w używana wewnątrz jakże elokwentnie nazwanej funkcji Funkcja powinna być imo lokalna.
3.W ogóle ten kod to jakaś porażka: nie wiadomo skąd wynikające porównania, masy pętli i zabawa w łączenie C z C++...

1

Masz koszmarną strukturę danych. Zobacz:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Person;

struct Item
  {
   struct Person *who;
   struct Item *next;
  };

struct Person
  {
   char *name;
   unsigned old;
   struct Item *friends,*enemies;
   struct Person *next;
  };

struct Person *find(struct Person *list,const char *name)
  {
   while(strcmp(name,list->name)) list=list->next;
   return list;
  }

struct Person *read(const char *filename)
  {
   struct Person *head,*tmp;
   struct Item *p,*q;
   FILE *file;
   char key[100],name[100];

   head=NULL;
   file=fopen(filename,"r");
   while(fscanf(file,"%19s %99s ",key,name)==2)
     {
      if(!strcmp(key,"OSOBA"))
        {
         tmp=(struct Person*)malloc(sizeof(struct Person));
         tmp->name=strdup(name);
         fscanf(file,"%u ",&tmp->old);
         tmp->friends=tmp->enemies=NULL;
         tmp->next=head;
         head=tmp;
        }
      else if(!strcmp(key,"PRZYJACIELE"))
        {
         fscanf(file,"%99s ",key);
         p=(struct Item*)malloc(sizeof(struct Item));
         q=(struct Item*)malloc(sizeof(struct Item));
         p->who=find(head,name);
         q->who=find(head,key);
if(!p->who || !q->who) exit(1); // brakuje osoby
         p->next=q->who->friends;
         q->next=p->who->friends;
         q->who->friends=p;
         p->who->friends=q;
        }
      else if(!strcmp(key,"WROGOWIE"))
        {
         fscanf(file,"%99s ",key);
         p=(struct Item*)malloc(sizeof(struct Item));
         q=(struct Item*)malloc(sizeof(struct Item));
         p->who=find(head,name);
         q->who=find(head,key);
if(!p->who || !q->who) exit(1); // brakuje osoby
         p->next=q->who->enemies;
         q->next=p->who->enemies;
         q->who->enemies=p;
         p->who->enemies=q;
        }
     }
   fclose(file);
   return head;
  }

int main()
  {
   struct Person *head,*p;
   struct Item *i;

   head=read("Lancuch.txt");
   for(p=head;p;p=p->next)
     {
      printf("%s %u (",p->name,p->old);
      for(i=p->friends;i;i=i->next) printf(" %s",i->who->name);
      printf(" ) (");
      for(i=p->enemies;i;i=i->next) printf(" %s",i->who->name);
      printf(" )\n");
     }   
   return 0;
  }

To samo ale masz pełną elastyczność, oraz krótszy zapis.

0

Dopiero z tym startuje więc jeszcze nie mam określonego stylu pisania ani doświadczenia.
To coś zmienia, że ona będzie lokalna?
No ale program robi wszystko co do niego należy poza tą jedną rzeczą, wiec cel jest w 75% osiągnięty. Robiony jest na szybko, ponieważ zadanko dostałem z dnia na dzień i nie mam czasu na dłuższą zabawę przy nim.

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