C Telefonbuch programmieren, brauche dringend Hilfe!

marcels87

Cadet 1st Year
Registriert
Jan. 2009
Beiträge
8
Hi Leute,
ich habe ein Problem. Ich soll ein Telefonbuch programmieren und zwar als Array mit Größe 100. Desweiteren sollen Funktionen wie Einfügen,Ausgeben, Sortieren
Löschen von einem Element und löschen aller Elemente vorhanden sein. Die Sortierung soll per Bubblesort geschehen.
Ich bin ein blutiger Anfänger was C angeht und habe bisher nur den Bubblesort und den struct-Befehl im Programm!
Die genannten erwaltungsmöglichkeiten sollen über jeweils eine eigene Funktion verfügen, also nicht ale in der main-funktion stehen! Ich darf auch keine globalen Variablen benutzen.
Im Programm soll eine Variablen für die Anzahl vorhanden sein, die bei Einfüge- oder Löschoperation innerhalb der zuständigen Funktion verändert wird und anschliessend in die Main-Funktion zurück gegeben wird. Sie soll auch aus dieser in die einzelnen Funktionen übergeben werden.

Ich muss zugeben, dass ich mich als Anfänger mit diesen Vorgaben stark überfordert fühle. Vor allen Dingen. da ich mich erst seit drei Monaten mit C beschäftige und das nicht Vollzeit!
MfG

Marcel

#include <stdio.h>
#include <stdlib.h>
#define TBSIZE 100


typedef struct
{
int PLZ, Telnummer, Vorwahl;
char Name, Vorname;
int Tag, Monat, Jahr;
}TEL[TBSIZE];


TEL a;

a.Name = Mustermann;
a.Vorname = Max
a.PLZ = 12345;
a.Telnummer = 0;
a.Tag = 19;
a.Monat = 02;
a.Jahr = 1987;

void bubblesort(int *array, int length)
{
int i, j;
for (i = 0; i < length; ++i) {
for (j = 0; j < length - i - 1; ++j) {
if (array[j] > array[j + 1]) {
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
}
 
und was ist jetzt die frage?
 
Code:
int main( int argc, char **argv, char **env )
{
  // hier kommt dein code rein
  return 0;
}
ich weiß nicht was du willst. entweder du gibst uns deinen code vor oder du sagst uns wo du hilfe (keine lösung) brauchst. deine hausaufgaben musst du schon selbst erledigen.
 
Ja eine konkrete Frage wäre nicht schlecht, deine Hausaufgaben wird hier wohl niemand machen.

Bzgl. deiner Bubblesort-Funktion: Was willst du sortieren? Du übergibst der Funktion einen Zeiger auf ein Integer. Und dann fängst du an dein Array zu sortieren, nur nach was um Himmels Willen sortierst du?
 
Sortiert werden soll nach Name, ich weiss nicht, wie ich die Funktionen für die Verwaltungsoptionen programmieren kann. Mir geht es nicht darum, eine komplette Lösung zu bekommen sondern vielleicht nur einen Tipp, wo man ein gutes Tutorial über sowas findet oder ähnliches!

MfG

Marcel
 
Du willst also keine Lösung sondern nur wissen wo du sie herbekommst? :)

Aber für solche Fragen kann man sich auch immer ganz gut an die IRC Channels auf freenode wenden. Da gibts für jede Sprache was passendes...
 
hm, mit ner verketteten liste wäre der ganze spass sehr viel einfacher (und beliebig groß)

z.b. Löschen: pointer aus dem akt. element ins vorherige verschieben & nen free und schon biste "sauber"
 
Danke für die Antworten, aber was ist bitte mit free gemeint? Man merkt wahrscheinlich, dass ich in C keine Leuchte bin aber ich versuchs halt. Das grösste Problem ist, dass ich keine Zeit habe mir irgendein Buch von vorne bis hinten durchzulesen da ich zum einen nur vier Tage Zeit für diese Aufgabe habe und in der letzten Woche drei Prüfungen geschrieben habe für die auch Zeit investieren musste. Naja, wenn jemand noch einen Tip hat wäre ich auf jeden Fall sehr dankbar!

MfG
Marcel
 
free & co gehört zum speichermanangement, dann wird der für das "objekt" allokierte speicher wieder freigegeben.
 
Ich würde folgende Methoden schreiben:

  • main, hat eine Endlosschleife die Zeilen einliest, damit der Benutzer Befehle eingeben kann. (siehe "scanf")
  • printEntry, gibt einen Eintrag auf der Konsole aus (siehe "printf")
  • printBook, gibt das ganze Telefonbuch aus (benutzt printEntry)
  • findSpace, sucht einen freien Eintrag im Buch und gibt diesen zurück falls es einen gibt, ansonsten NULL, dann ist das Buch voll
  • insertEntry, trägt einen Eintrag ins Buch ein (benutzt findSpace)
  • sort, sortiert das Buch
  • isEmpty, prüft ob ein Eintrag im Buch auch leer ist.

In der main würde ich dann noch die Befehle machen, also damit der Benutzer zB über "print" das Buch ausgegeben bekommt oder "insert vorname nachname nummer postleitzahl" einen eintragen kann. Das wärs doch im wesentlichen schon oder nicht?

/edit
sort, isEmpty vergessen.
 
Hi, Marcel.

Ich hab zufällig auch die selbfe Aufgabe! Ich bin zurzeit soweit gekommen, weiß aber nicht wie ich die Arrays löschen soll! vllt könnte uns da jemand helfen und vllt kann dir ja mein code, was ich bis jetzt geschrieben habe, helfen!

Hmm, da du drei Prüfungen geschrieben hast, denke ich mal, dass du in köln et studierst :P


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


static int x;

typedef struct{
   char vname[30], nname[30], ort[30], geb[10];
   int PLZ,vwahl, tnummer;
}  TEL;

TEL liste[100];

void Eingabe(int nr, TEL *neu)
{
   printf("Vorname : ");
   fgets(neu[nr].vname, 30, stdin);
   printf("Nachname : ");
   fgets(neu[nr].nname, 30, stdin);
   printf("Postleitzahl: ");
   do
   {
     scanf("%d",&neu[nr].PLZ);
   } while(getchar()!= '\n');
   printf("Wohnort : ");
   fgets(neu[nr].ort, 30, stdin);
   printf("Geburtsdatum tt/mm/jjjj: ");
   do
   {
     scanf("%c",&neu[nr].geb);
   } while(getchar()!= '\n'); 
   printf("Vorwahl:");
   do
   {
     scanf("%d",&neu[nr].vwahl);
   } while(getchar()!= '\n');
   printf("Telefonnummer:");
   do
   {
     scanf("%d",&neu[nr].tnummer);
   } while(getchar()!= '\n');
}

void Ausgabe(TEL *all, int nr)
{
   int i;

   for(i = 0; i < nr; i++)
   {
      printf("Vorname..................:%s",all[i].vname);
      printf("Nachname.................:%s",all[i].nname);
      printf("Postleitzahl.............:%d\n",all[i].PLZ);
      printf("Ort......................:%s\n",all[i].ort);
      printf("Geburtsjahr..tt.mm.jjjj..:%s\n",all[i].geb);
      printf("Vorwahl/Telnummer........:%d/%d,\n\n",all[i].vwahl,all[i].tnummer);
      printf("\n\tWeiter mit <Enter>\n\n");
      getchar();
   }
}

void Bubblesort(TEL *sort,int nr)
{
   TEL *temp;
   int i,j;

   temp = (TEL *)malloc(sizeof(TEL *));
   if(NULL == temp)
   {
      printf("Konnte keinen Speicher reservieren ...\n");
      return;
   }
   for(i = 0; i < nr; i++)
   {
      for(j=i+1;j<nr;j++)
      {
         if(strcmp(sort[i].nname, sort[j].nname)>0)
         {
            *temp=sort[j];
            sort[j]=sort[i];
            sort[i]=*temp;
         }
      }
   }
   printf("... sortiert!!\n");
   printf("\n\tWeiter mit <Enter>\n\n");
   getchar();
}


void Loeschen(TEL *all,int nr)
{
     int auswahl;
     printf("\n\n----------Loeschoptionen-----------\n\n");
     printf("Loeschen von einem Eintrag = 0\n");
     printf("Loeschen der gesamten Datenbank = 1\n");
     scanf("%d",&auswahl);
     switch(auswahl)
     {
/*        case 1 : ???? ;    break;
          case 2 : ???? ;    break;*/ 
          default: break;
     }        
}

void Menue()
{
   int auswahl;
   char c;

   do
   {
      printf("-1- Neuer Eintrag\n");
      printf("-2- Inhalte Loeschen\n");
      printf("-3- Alle Eintraege ausgeben\n");
      printf("-4- Eintraege sortieren\n");
      printf("-5- Programm beenden\n");
      printf("\nIhre Auswahl : ");
      scanf("%d",&auswahl);
      getchar();
      switch(auswahl)
      {
         case 1 : Eingabe(x++,liste);        break;
         case 2 : Loeschen(liste,x);         break;
         case 3 : Ausgabe(liste,x);          break;
         case 4 : Bubblesort(liste,x);       break;
         default: break;
      }
   } while(auswahl < 5);
}
     
int main(void)
{
    Menue();
    return EXIT_SUCCESS;
}

Naja, kann jemand uns bei diesem Problem helfen?
 
Um alles zu löschen könntest du einfach x auf 0 setzen, wenn ich das richtig sehe. Um einzelne Einträge zu löschen hast du mehrere Möglichkeiten.

Einerseits kannst du dir eine Funktion schreiben, die das Array durchgeht bis zum löschenden Eintrag liste und dann einfach immer liste = liste[i+1] machen, so dass alle folgenden einträge eins nach vorne gezogen werden. Anschließend x um eins reduzieren und fertig. Die Methode ist aber nicht sehr effizient aber dafür recht simpel.

Andererseits kannst du dir einen ungültigen Eintrag definieren, z.B. tnummer = 0. Bei allen Operationen (Ein-/Ausgabe usw.) musst du dann eben diese Bedingung abprüfen. Für deine Ausgabe würdest du dann z.B. in der for-Schleife so etwas brauchen:

Code:
if all[i].tnummer = 0
   continue;

Außerdem müsstest du die for-Schleife dann nicht nur bis x, sondern gleich bis 100 laufen lassen, da ja zwischendrin ungültige Einträge sein könnten.

Bei der Eingabe würdest du dann nicht x als Index übergeben, sondern du müsstest erst durch die Liste gehen und einen freien (ungültigen) Platz suchen und dann dessen index übergeben.

Ich hoffe, das war ein wenig verständlich ;-)
 
Zurück
Oben