// Bsp14.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//

#include "stdafx.h"

#include "family.h"
int read_famil_relation(persn *psn, famil *fml);
int read_person(persn *p, famil *fml, int i);
void frage_antwort(famil *fml);

int main(int argc, char* argv[])
{
  struct famil familie[5];
  struct persn person[10];
  register unsigned short i;
  int d = 0, d1=0;

  // Initialisierung von familien und person
  for (i = 0; i<5;i++)
	  familie[i].mann = familie[i].frau = familie[i].sohn = familie[i].tochter = NULL;
  for (i = 0; i < 10; i++)
  {
	  person[i].name[0] = person[i].vname[0] = person[i].Typ[0] = '\0';
	  person[i].alt = 0;
	  person[i].fl = NULL;
  }


  printf("Geben Sie die Familienbeziehung nach dem Format z.B.\nfamilie 0 sohn == familie 1 mann == person 2\n");
  // "familie 0 == familie 1 mann == person 3"
  //  bedeutet "Der sohn der familie[0] (auf der linken Seite) ist(==) der mann der familie[1] (auf der rechten Seite)
  //  und zugleich die 3te Person
  printf("oder\nperson 2 == familie 1\n");
  // "person[2] == familie[1]
  // bedeutet "person[2] gehoert zur familie[1]

  // folgende loop liest die Familienbeziehungen od. Familienzugehoerigkeit der Person
  while (1)
  { // wenn die Funktion read_famil_relation Nicht Null ist, dann while-loop ist zu ende.
	if (read_famil_relation(person, familie))
		break;
  }
  
  // folgende for-schleife liest die Personen (max. 9 Personen)
  for (i = 0; i < 10; i++)
  {
	  if (read_person(&person[i], familie, i))
		  break;
  }

  // folgende Funktion liest Frage and generiert die Antwort.
  for(i = 0; i < 5; i++)
	frage_antwort(familie);
  return 0;
}

/*************************************************************************************
 * Diese Funtkion liest die Familienbeziehung in Form von
 * "familie <Zahl> <sohn | tochter> == familie <zahl> <mann | frau> == person <zahl>"
 * und erstellt die Verknuepfungen von Zeigern.
 *************************************************************************************/
int read_famil_relation(persn *psn, famil *fml)
{
	char Q1[20]={'\0'}, Q2[20]={'\0'}, line[100];
	int d = -1 , d1 = -1 , d2 = -1;

	fflush(stdin);
	gets(line);
	if(sscanf(line, "familie %d %s == familie %d %s == person %d",&d, Q1, &d1, Q2, &d2) == 5)
	// Q1 und Q2 ist nicht NULL, d.h. Familienbeziehung ist gegeben.
	{
	  if (!strcmp(Q1, "sohn") &&				// der sohn der familie[d] ist gleich wie
		  !strcmp(Q2, "mann"))					// der mann der familie[d1] und heisst person[d2]
		fml[d].sohn = fml[d1].mann = &psn[d2];	// der sohn der familie[d] ist gleich person[d2]
	  else if (!strcmp(Q1, "tochter") &&		// die tochter der familie[d] ist gegeben
		       !strcmp(Q2, "frau"))				// die tochter der familie[d] ist gleich der frau der 
		fml[d].tochter = fml[d1].frau = &psn[d2];// familie[d1] ist gleich person[d2]
	}
    else if (sscanf(line, "familie %d %s == person %d",&d, Q1, &d1) == 3)
	{
		if (!strcmp("mann", Q1))
			fml[d].mann = &psn[d1];
		else if (!strcmp("frau", Q1))
			fml[d].frau = &psn[d1];
		else if (!strcmp("sohn", Q1))
			fml[d].sohn = &psn[d1];
		else if (!strcmp("tochter", Q1))
			fml[d].tochter = &psn[d1];
	}
	else if (sscanf(line, "person %d == familie %d", &d1, &d2) == 2)
	{
		psn[d1].fl = &fml[d2];
	}
	else if (!strncmp("Ende",line,4))
		return 1;
	else
	{
		printf("Falsche Eingabe");
		return 0;
	}
	return 0;

}
/***************************************************
 * Diese Funktion liest Person ein
 * in der Format "Name Vormname Alt"
 ***************************************************/
int read_person(persn *p, famil *fml, int i)
{
	int d, d1;
	char Q1[20], Q2[20];
	fflush(stdin);
	printf("Person[%d] Name, Vorname Alt familie<zahl>\n ", i);
	fflush(stdout);

    if (scanf("%s %s %d %d",Q1, Q2, &d, &d1) != 4 ||
		!strcmp(Q1, "Ende"))
		return 1;
	strcpy(p->name, Q1);
	strcpy(p->vname, Q2);
	p->alt = d;
	p[i].fl = &fml[d1];
	return 0;
}

void frage_antwort(famil *fml)
{
	int d;
	struct famil *f;
	char Q1[20]={'\0'}, Q2[20]={'\0'}, Q3[20]={'\0'};
	struct persn *p;

	printf("\nFrage:\nFamilie Nr.");
	fflush(stdin);
	fflush(stdout);
	scanf("%d", &d);
	f = &(fml[d]);
	printf("Familien-Member:<sohn|tochter>\n");
	fflush(stdin);
	scanf("%s", Q1);
	p = !strcmp("sohn", Q1) ? f->sohn : !strcmp("tochter", Q1) ? f->tochter : NULL;
	printf("Familie[%d]->%s\n", d,Q1);
	if (p != NULL)
	{
		if (p->fl != NULL) 			// wenn sohn oder tochter seine(ihre) eigene Familie hat
		{
			f = p->fl;
			printf("Familien-Member:<sohn|tochter>\n");
			fflush(stdin);
			scanf("%s", Q2);
			p = !strcmp("sohn", Q2) ? f->sohn : !strcmp("tochter", Q2) ? f->tochter : NULL;
			printf("Familie[%d]->%s->%s\n",d,Q1, Q2);
		}
	}
	else
	{
		printf("Keine Angabe\n");
		return;
	}
	

	printf("Attribute:<Alter|Typ|Name|Vorname>");
	fflush(stdin);
	scanf("%s", Q3);

	printf("Familie[%d]->%s->%s->%s\n", d,Q1,Q2,Q3);
	if (!strcmp("Alter", Q3))
		printf("%d", p->alt);
	else if (!strcmp("Name", Q3))
		printf("%s", p->name);
	else if (!strcmp("Vorname", Q3))
		printf("%s", p->vname);
	else if (!strcmp("Typ", Q3))
		printf("%s", p->Typ);
}