Avatar billede ultik Nybegynder
15. juli 1999 - 15:48 Der er 6 kommentarer og
1 løsning

Hjælp med program

// Database program...

// Jeg keder mig og vil lige se om jeg kan lave sådan et program...
#include <stdlib.h> // system cmd
#include <string.h> // strcmp cmd
//#include <fileio.h>
#include <stdio.h> // printf, scanf....


struct kort
{
    int kort_nummer;
   
    char *navn;
   
    char *tlf_nummer;
   
    char *adresse1;
    char *adresse2;
    char *adresse3;

    struct kort *next; // Brugen af Pointere på denne måde kaldes en linked list....
    struct kort *prev;

};

struct database
{
    int antal_kort;

    char *database_navn;
    struct kort *first; // Peger på det første kort i databasen...

    char *filnavn;
};


void VisMenu(void);


char *Intro[7] =
{
    {"        Velkommen til UJSoft Database Program"},
    {"\n"},
    {"  Dette program er udviklet som et tutor projekt..."},
    {"  Det vil sige at jeg udviklede dette program for at "},
    {"  teste mine egne færdigheder som programmør, og for "},
    {"  at hjælpe andre der har problemer med programmering.\n"},
    {"\n\n"}
};

char *Menu[9] =
{
    {"                UJSoft Database Program"},
    {"\n"},
    {"  Skriv en af følgende kommandoer : \n\n"},
    {"  kigkort        :  Kig databasen i igennem..."},
    {"  sletkort        :  Slet et kort fra databasen "},
    {"  nytkort        :  Indsæt nyt kort i databasen"},
    {"  findkort        :  Find et kort i databasen"},
    {"  printkort      :  Print et kort fra databasen ud"},
    {"  slut            :  Afslutter Programmet...\n\n"}
};
char *NytKortMenu[9] =
{
    {"        Indsæt nyt kort i databasen"},
    {"\n"},
    {"  Skriv venligst følgende, og tryk [ENTER] efter hver oplysning : \n\n"},
    {"  Navn"},
    {"  Adresse Vej + Nr"},
    {"  Adresse By + PostNr"},
    {"  Adresse Evt. ( hvis intet så bare tryk enter )"},
    {"  TelefonNummer "},
    {"\n\n\n"}
};

struct database *databasen;

static char *KommandoPrompt = ":>  ";

void NyDatabase(void)
{
    databasen = new struct database;

    databasen->first = NULL;
    databasen->database_navn = "Familien";
    databasen->filnavn = "familien.dat";
}

void CLS(void)
{
    system("cls");
}

struct kort *NextKortIDatabasen(struct kort *kort)
{
    if (!kort)
        return NULL;
    if (kort->next)
        return kort->next;
    else
        return NULL;
}

struct kort *SidsteKortIDatabasen(void)
{
    struct kort *temp, *temp2;
    int i;

    if (!databasen->first)
        return NULL;

    temp = databasen->first; // Vi starter med den første...

    for (i=0;i<256;i++) // dette loop kører for evigt, indtil det bliver stoppet manuelt..
    {
        temp2 = NextKortIDatabasen(temp);
       
        if (temp2)
            temp = temp2;
        else
            break;

        if (i > 200)
            i = 1; // dette er hvad der looper det indtil det bliver stoppet manuelt....
    }
    return temp; // der er ikke flere, temp er det sidste....
}

void PrintKortData(struct kort *kortet)
{
    printf("%s\n", kortet->navn);
    printf("%s\n", kortet->adresse1);
    printf("%s\n", kortet->adresse2);
    printf("%s\n", kortet->adresse3);
    printf("%s\n", kortet->tlf_nummer);
}

void KigIDatabasen(void)
{
    struct kort *temp, *temp2;

    CLS();

    if (!SidsteKortIDatabasen())
    {
        printf("Der er ingen kort i datasen !\n");
        system("pause");
        CLS();
        VisMenu();
    }
    else
    {
        temp = databasen->first;

        PrintKortData(temp);

        while (NextKortIDatabasen(temp))
        {
            temp2 = NextKortIDatabasen(temp);
           
            if (temp2)
            {
                temp = temp2;
                PrintKortData(temp);
            }   
            system("pause");
        }
    }
}

void ModtagNytKortData(void)
{
    char navn[64];
    char adresse1[64];
    char adresse2[64];
    char adresse3[64];
    char tlfnummer[16]; // Behøver ikke nær så mange cifre,,,
    struct kort *nytkort;


    scanf("%64s\n%64s\n%64s\n%64s\n%16s", navn,adresse1,adresse2,adresse3,tlfnummer);

    nytkort = new struct kort;
    nytkort->navn = navn;
    nytkort->adresse1 = adresse1;
    nytkort->adresse2 = adresse2;
    nytkort->adresse3 = adresse3;
    nytkort->tlf_nummer = tlfnummer;
    nytkort->next = NULL;

    if (!SidsteKortIDatabasen()) // Hvis der intet sidste kort er, så er dette det første....
    {
        nytkort->prev = NULL;
        databasen->first = nytkort;
    }
    else
        nytkort->prev = SidsteKortIDatabasen();
   
    if (nytkort->prev)
        nytkort->prev->next = nytkort; // Fik du den.....

    CLS();
    printf("%s\n", nytkort->navn);
    printf("%s\n", nytkort->adresse1);
    printf("%s\n", nytkort->adresse2);
    printf("%s\n", nytkort->adresse3);
    printf("%s\n", nytkort->tlf_nummer);
    system("pause");

}


void VisNytKortMenu(void)
{
    int i;
//    struct kort *sidstekort;
   
//    char b[64];
//    char j;

    CLS();

    for (i=0;i<8;i++)
    {
        printf("%s\n",NytKortMenu[i]);
    }
    printf("%s", KommandoPrompt);
   
    ModtagNytKortData();

    VisMenu();
//    sidstekort = SidsteKortIDatabasen();

}

void ModtagKommando(void)
{
    char kommando[10];
//    char *parameter[35];

    scanf("%10s", kommando);//, parameter);

    if (stricmp(kommando, "slut") == 0)
    {
        printf("\nProgrammet Afsluttes\n");
        exit(0);
    }
    else if (stricmp(kommando, "nytkort") == 0)
    {
        VisNytKortMenu();
    }
    else if (stricmp(kommando, "kigkort") == 0)
    {
        KigIDatabasen();
    }
    else
    {
        printf("\nUkendt Kommando\n");
        VisMenu();
    }
}

void VisMenu(void)
{
    int i;
   
    NyDatabase();

//    char b[64];
//    char j[10];

    CLS();

    for (i=0;i<8;i++)
    {
        printf("%s\n",Menu[i]);
    }
    printf("%s", KommandoPrompt);
    ModtagKommando();
}
void VisIntro(void)
{
    int i;
    //char j;

    for (i=0;i<7;i++)
    {
        printf("%s\n",Intro[i]);
    }

    system("pause");
    system("cls");
}

int main(void)
{
    VisIntro();
    VisMenu();
    exit(0);
    return 0;
}

Dette program er langt fra færdigt endnu selvfølgelig, men det jeg ikke kan forstå er, hvorfor virker kigkort kommandoen ikke ? Prøv at compile så kan i se hvad jeg mener, det siger at der ingen kort er i databasen.....

En anden ting, hvordan kan jeg aflæse et tastetryk fra tastaturet, uden at brugeren skal trykke enter bagefter......
Avatar billede cvsac Nybegynder
15. juli 1999 - 16:13 #1
den anden ting er vidst nok
getche() kan ikke lige huske om der skal ; (kolon) efter
Avatar billede ultik Nybegynder
15. juli 1999 - 18:12 #2
Det må der skulle.... der er jo bare ne funktion ikke ?
Avatar billede cvsac Nybegynder
15. juli 1999 - 19:24 #3
tjooo det er det vel nok jeg bruger den næsten aldrig
Avatar billede ultik Nybegynder
15. juli 1999 - 21:32 #4
Hvad med det andet ? Nogen Ideer ?
Avatar billede cvsac Nybegynder
15. juli 1999 - 21:36 #5
nope jeg får 4 fejl når jeg compiler den
Avatar billede bjarke Nybegynder
18. juli 1999 - 20:40 #6
Hej Ultik!

Det bliver langt dette her. Derfor har jeg udeladt alle headerfilerne, "structerne", char *Intro[], char *Menu[] og en række funktioner jeg heller ikke har ændret i.

Jeg har lavet en del ændringer i dit program. Spørg hvis du ikke forstår ændringerne/kommentarerne.

PROGRAMMET:
/* Tag og lav en ordentlig indholdsfortegnelse øverst, så man ved
    hvilke funktioner, der er i programmet. Desuden kan main() så
    lægges lige efter - det er meget mere overskueligt for os andre;-) */
void VisMenu(void);

char *NytKortMenu[9] =
{
    {"        Indsæt nyt kort i databasen"},
    {"\n"},
    {"  Skriv venligst følgende, og tryk [ENTER] efter hver oplysning : \n\n"},
    {"  Navn"},
    {"  Adresse Vej + Nr"},
    {"  Adresse By + PostNr"},
    {"  Adresse Evt. ( hvis intet så bare tryk enter )"},
    {"  TelefonNummer "},
    {"\n\n\n"}
};

struct database *databasen;

static char *KommandoPrompt = ":>  ";


void CLS(void)
{
    /* Hvorfor bruger du dette kald til operativsystemet?
        I c/c++ findes en kommando, som rydder sk‘rmen: clrscr().
        clrscr() kr‘ver headerfilen conio.h. */

    system("cls");
}

// Returtype void ændret til int, for at kunne afslutte programmet (fornuftigt;-)
int ModtagKommando(void)
{
    char kommando[10];
//    char *parameter[35];

    scanf("%10s", kommando);//, parameter);

    if (stricmp(kommando, "slut") == 0)
    {
          printf("\nProgrammet Afsluttes\n");
          /* Løsningen med returværdi er mere logisk - main()
              "får lov til" at afslutte programmet. Så er der styr på sagerne */
          //exit(0);
          return 0;
    }
    else if (stricmp(kommando, "nytkort") == 0)
    {
          VisNytKortMenu();
    }
    else if (stricmp(kommando, "kigkort") == 0)
    {
          KigIDatabasen();
    }
    else
    {
          printf("\nUkendt Kommando\n");
          // Se main()
          //VisMenu();
    }
    return 1;
}

void VisMenu(void)
{
    int i;
   
    // Se kommentar i main()                 
    //NyDatabase();

    CLS();

    /* Du havde skrevet 8 og ikke 9, så brugeren ved ikke hvordan
        programmet afsluttes! */
    for (i=0;i<9;i++) printf("%s\n",Menu[i]);

    // Se kommentar i main()     
    //ModtagKommando();
}


void VisIntro(void)
{
    int i;

    /* Det kan godt betale sig at spare lidt på pladsen for overskuelighedens skyld engang imellem:

    for (i=0;i<7;i++)
    {
          printf("%s\n",Intro[i]);
    }
    */

    for (i=0;i<7;i++) printf("%s\n",Intro[i]);
   
    /* system("pause") virker ikke på min computer, jeg tror kun
        kommandoen kan bruges i batfiler(?) */

    //system("pause");
    system("cls");
}

int main(void)
{
    /* Når man kigger i main() skal man gerne kunne se hvad der sker i programmet. Det kan man overhovedet ikke her. VisMenu() er "fordækt" programmering. Det er meget misvisende, da hele programmet stort set ligger der. Jeg har foretaget lidt ændringer, som jeg (nærmere) ville have lavet det.

Iøvrigt ryger dit program længere og længere ind i "selvkald". Vælger du "nytkort" starter du funktionen VisMenu() ‚en gang for hvert kort du opretter. Dvs, at du helt unødvendigt opbruger hukommelsen. */

    VisIntro();
    NyDatabase();

    do
        VisMenu();
    while( ModtagKommando() );

    exit(0);

    /* 'return 0' har ingen betydning. Du forlader jo programmet
        med exit(0). I dette tilf‘lde ville jeg slette exit(0) */
    //return 0;
}

ØVRIGE KOMMENTARER:
1) Det er irriterende at indtaste hele navnet på kommandoen.
    Brug evt. getch() eller getche(), så man blot skal trykke et tal eller bogstav
    (eller andet tegn)
2) Du kan ikke indlæse strenge med mellemrum med scanf(). Hvis du f.eks.
    vil indlæse både for- og efternavn i en variabel, så skal du bruge gets().
    gets() kræver headerfilen string.h
3) Programmet med mine ændringer virker ikke, men du kan sikkert komme
    lidt videre nu. Grunden til, at funktionen kigKort() ikke virkede skyldes nok
    det med "selvkaldende" (uendelig rekursiv løkke).
4) getch() læser ét tegn fra tastaturet uden 'enter'. getche() er det samme,
    men tegnet kan ses på skærmen. getchar() læser også ét tegn fra
    tastaturet, men venter på 'enter'.

V.h. Bjarke
Avatar billede ultik Nybegynder
19. juli 1999 - 09:36 #7
tak, du har været til stor hjælp.....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester