IT

C programmering

13. april 2006 af Sabrina (Slettet)
Jeg har lavet et program i C, men kan ikke få det til at virke. Det kompiler, men når jeg så indtaster fx "Italiensk", siger den "Lagersegmentfejl".

Opgaveteksten lød på følgende:
"Create a structure that can describe a restaurant. It should have members that include the name, address, average cost, and type of food. Suppose an array of structures representing restaurants has been created. Write a function that prints out all restaurants of a given food type in order of cost - least expensive first"

#include
#include

#define max_restaurants 10
#define max_food 10

struct restaurant{
char *name;
char *address;
int average_cost;
char *food;
}rest[100], backup[100];

typedef struct restaurant restaurant;

restaurant make_restaurant(char *name, char *address, int average_cost, char *food);
void swap(int, int);
void bubble(void);

int main(void){
char *type[max_food];
int i, j = 0;

rest[0]=make_restaurant("Spiret","Boulevarden",100,"Cafe");
rest[1]=make_restaurant("Luna","Boulevarden",120,"Cafe");
rest[2]=make_restaurant("Cafeministeriet","Mølleplads",110,"Cafe");
rest[3]=make_restaurant("San Giovani","Vesterbro",250,"Italiensk");
rest[4]=make_restaurant("Romeo&Julie","Maren Turisgade",150,"Italiensk");
rest[5]=make_restaurant("Mortens Kro","Mølleplads",400,"Bonne Cuisine");
rest[6]=make_restaurant("McDonalds","Nytorv",45,"Fast Food");
rest[7]=make_restaurant("Burger King","Nytorv",50,"Fast Food");
rest[8]=make_restaurant("Azzurra","Reberbansgade",175,"Italiensk");
rest[9]=make_restaurant("Rosdahls","Havnen",300,"Bonne Cuisine");

printf("På hvilken type restaurant vil du spise?\
");
scanf("%s", type);

for (i = 0; i
if (strcmp(type[0],rest[i].food) == 0){
backup[j] = rest[i];
++j;
}
}

bubble();

for (i = 0; i
printf("%s\
", backup[i].name);

return 0;
}

restaurant make_restaurant(char *name, char *address, int average_cost, char *food){
restaurant result;
result.name = name;
result.address = address;
result.average_cost = average_cost;
result.food = food;
return result;
}

void bubble(void){
int i, j;

for (i = 0; i
for (j = max_restaurants-1 ; i
if (backup[j-1].average_cost > backup[j].average_cost)
swap(j-1,j);
}
}
}

void swap(int i, int j){
restaurant temp[max_restaurants];
int tmp = 0;

temp[tmp] = backup[i];
backup[i] = backup[j];
backup[j] = temp[tmp];
}

Brugbart svar (2)

Svar #1
13. april 2006 af fixer (Slettet)

Segmenteringsfejlen kommer fordi strcmp bliver bedt om at sammenligne en peger til en liste af karakterer med en liste af karakterer.

Du har erklæret

char *type[max_food];

hvilket betyder, at 'type' peger til en liste af karakterer. 'type' selv er ikke denne liste.

Når du dernæst i strcmp anvender 'type[0]' fås blot indholdet af variablen 'type' som ikke den list, du vil sammenligne med, men derimod adressen på den.

Brug istedet erklæringen:

char type[max_food];

og din strcmp skal så være:

strcmp(type,rest[i].food == 0){

Dette løser segmenteringsproblemet, men du får andre. F.eks. terminering scanf-konverteringen med 's' formatet så snart den støder ind i et mellemrum. Derfor vil inputtet 'Fast Food' blive formateret som 'Fast'. Der er også andre problemer, men prøv at boks lidt med dem. Ellers må du vende tilbage.

Brugbart svar (2)

Svar #2
13. april 2006 af fixer (Slettet)

Se venligst gennem fingrene med diverse %"#-stavefjel og magler !

Brugbart svar (2)

Svar #3
14. april 2006 af fixer (Slettet)

Forklaringen på segmenteringsfejlen i #1 gik vist lidt vel hurtigt. Problemet er, at du har erklæret en liste af pegere til chars fremfor en peger til en liste af chars. Erklæringen

char * type[10];

gør type til en liste af 10 pegere til char's. Således er type[i], 0=<i/>
Eftersom du endnu ikke har svaret gå jeg udfra du ikke har læst #1 og #2 og er gået videre. Så lad mig hjælpe dig med de øvrige problemer der er.

Det første problem er som nævnt i #1 at scanf terminerer formatering efter '%s' så snart den støder ind i white-space. Det gør det umuligt at læse flere ord, f.eks. 'Fast Food' og 'Bonne Cuisine'.

En løsning er at anvende a-flaget i scanf. Det bevirker at scanf benytter dynamisk strenginput, d.v.s. selv allokerer den til den læste streng nødvendige plads. Så er man fri for at bekymre sig om at allokere plads selv. Dernæst kan man eksplicit angive mængden af de karaketerer, scanf skal matche med. Når man anvender a-flaget skal scanf have en peger til en peger til en char, altså en variabel af typen char**, som argument. Eksempel:

char* type;
scanf("%a[ a-zA-Z0-9]",&type)

type er en peget til en char og dermed er &type - adressen af pegeren - en peger til en peger til en char. Da vil scanf matche enhver inputkarakter i den i klammerne [..] angivne mængde, allokere den nødvendige plads og returnere det formatterede input i type. I det konkrete tilfælde tillades input karakterer som er enten et mellemrum, et lille bogstav fra og med a til og med z, et stort bogstav fra og med A til og med Z eller et ciffer fra og med 0 til og med 9.

Hvis du vil bruge denne konstruktion skal der foretages følgende ændringer:

Erklæring:
----------
char *type[max_food];
->
char* type;

scanf:
------
scanf("%s", type);
->
scanf("%a[ a-zA-Z]",&type)

strncmp:
--------
if (strcmp(type[0],rest[i].food) == 0){
->
if (strcmp(type,rest[i].food) == 0){


Næste problem er din bubble() funktion. Den sorterer altid hele listen, d.v.s. samtlige 10 restauranter. Den burde blot sortere de j restauranter som matcher den type brugren valgte.

Du skal blot give j som heltalsparameter til bubble()

void bubble();
->
void bubble(int);


bubble()
->
bubble(j)

void buble(){
->
void bubble(int k){

og dernæst erstatte max_restaurants med k overalt i bubble.

Så burde det virke. Så kan du selvfølgelig overveje at indføre sikkerhedsfunktioner, der skal forhindre crash såfremt der indtastes et uventet valg. Du kunne f.eks. blot smide dit brugerinput i en while-løkke som ikke terminerer medmindre der er indtastet et brugbart valg.

Svar #4
21. april 2006 af Sabrina (Slettet)

Hej Fixer

Mange, mange tak for din lange udredning!

Du må undskylde det sene svar, men programmet voldte mig en del problemer - og jeg besluttede mig for, at jeg først ville skrive igen, når det virkede (for du er altid så venlig til at svare, så ville ikke stille et spørgsmål, før jeg virkelig havde forsøgt alt, hvad jeg kunne).

Så nu virker programmet, og hvor er jeg stolt ;)


Lige nu er jeg i gang med at kode vores eksamensopgave sammen med 2 andre. Vi skal kode et hangman-spil, og det er faktisk ganske sjovt :)

Skriv et svar til: C programmering

Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk? Klik her for at oprette en bruger.