2013-11-10, 14:34
  #1
Medlem
Sitkins avatar
Hej flashback. Sitter med en funktion (lägg_till_kö) som ska lägga en person i kön. I funktionsbeskrivningen står det bl.a. att man ska först kontrollera att kön inte är full. I detta fallet tänkte jag iterera igenom arrayen genom en for-loop och sedan if(array[i] != null) etc. Men saken är att arrayen som jag ska iterera igenom ligger i en annan fil där den är static, dvs jag har ingen åtkomst till den men jag har använt den till en funktion vars prototyp ligger i en header-fil. Jag kanske ska posta koden men eftersom det är en uppgift är det kanske bättre om jag inte postar hela koden.

Kod:
#define QUEUE_MAX_SIZE 10

static per queue[QUEUE_MAX_SIZE];

static 
int head 0tail 0nbr_elem 0;

  
struct per
{
    
char först_namn[7];
    
char efter_namn[10];
    
char pers_num[12];
    
    
    
};
struct per pers;

void enQ(per pers){
    
    
strcpy(queue[tail].först_namnp1.först_namn);
    
strcpy(queue[tail].sur_namep1.efter_namn);
    
strcpy(queue[tail].pers_nump1.pers_num);
    


så långt har jag gjort i filen kö och som ni ser så använder jag arrayen (queue) med storlek 10 i funktionen enQ

i filen kö.h har jag deklarerat funktionsprototypen void enQ(per pers); och
Kod:
typedef struct 
{
    
char först_namn[7];
    
char efter_namn[10];
    
char pers_num[12];
    
}
per

Nu kommer vi till filen main. Här har jag funktionen lägg_till_kö där jag först ska validera om kön inte är full, sen ska jag mata in personuppgifterna som ska lagras i personvariablen som sedan ska lagras in i funktionen enQ

så långt har jag kommit

Kod:
void lägg_till_kö(per pers){
    
/*Här ska jag kolla om kön är full eller inte*/
   
int i;
 for(
0i</*nu tar det stop för mig, jag tänkte iterera genom hela arrayen men 
                  vet inte hur*/
    
    
enQ(pers);
    
    

__________________
Senast redigerad av Sitkin 2013-11-10 kl. 14:52.
Citera
2013-11-10, 15:38
  #2
Medlem
Sitkins avatar
Ingen som har någon aning? Jag är tacksam för all hjälp

Nu bröt jag lite från uppgiftens regler men jag ändrade funktionen enQ till:
Kod:
void enQ(per pers){
    
int i;
    for(
0<sizeOf(queue[QUEUE_MAX_SIZE]); i++){
        
    
        if ([
queue[i] != 0){ // Här får jag ett felmeddelande, verkar som det inte går att göra så
            
printf("Namn: ");
    
scanf("%s"p1.först_namn);
            
printf("Efternamn: ");
    
scanf("%s"p1.efter_namn);
            
printf("Personnummer:");
    
scanf("%s"p1.pers_num);
    
strcpy(queue[tail].först_namnp1.först_namn);
    
strcpy(queue[tail].efter_namnp1.efter_namn);
    
strcpy(queue[tail].pers_nump1.pers_num);
        }else{
            
printf("Kön är full");
        }
    

}
    


Mot min förmodan hittar jag på nätet att en sådan jämförelse(se den fetmarkerade) går inte att göra på C. Hur ska man då göra? Och som sagt jag är tacksam för ett svar även om det är bara en liten hjälp.
Citera
2013-11-10, 16:29
  #3
Medlem
Du får använda en variabel för att hålla koll på hur många element som för närvarande finns i arrayen.

Kod:
static size_t used_recs = 0;

void enQ(per pers){

    if (used_recs < QUEUE_MAX_SIZE) {
        strcpy(queue[used_recs].först_namn, p1.först_namn);
        strcpy(queue[used_recs].sur_name, p1.efter_namn);
        strcpy(queue[used_recs].pers_num, p1.pers_num);

        used_recs ++;
    } else {
        fprintf(stderr, "Kön är full\n");
    }

}

..och...

Kod:
for(i = 0; i < used_recs; i++)
Citera
2013-11-10, 16:41
  #4
Medlem
Sitkins avatar
Citat:
Ursprungligen postat av FaderBerg
Du får använda en variabel för att hålla koll på hur många element som för närvarande finns i arrayen.

Kod:
static size_t used_recs = 0;

void enQ(per pers){

    if (used_recs < QUEUE_MAX_SIZE) {
        strcpy(queue[used_recs].först_namn, p1.först_namn);
        strcpy(queue[used_recs].sur_name, p1.efter_namn);
        strcpy(queue[used_recs].pers_num, p1.pers_num);

        used_recs ++;
    } else {
        fprintf(stderr, "Kön är full\n");
    }

}

..och...

Kod:
for(i = 0; i < used_recs; i++)

Tack så mycket! Detta går inte att göra på något sätt i funktionen lägg_till_kö som finns i en annan fil?
Hursomhelst tackar jag dig hjärtligt för din hjälp


EDIT: Nvm, jag tror det går bra att validera arrayen i filen kö
__________________
Senast redigerad av Sitkin 2013-11-10 kl. 16:53.
Citera
2013-11-10, 16:54
  #5
Medlem
Citat:
Ursprungligen postat av Sitkin
Tack så mycket! Detta går inte att göra på något sätt i funktionen lägg_till_kö som finns i en annan fil?
Hursomhelst tackar jag dig hjärtligt för din hjälp

Ta bort static och gör variabeln global då. Annars är det ju en god idé att samla alla "kö"-variabler och funktioner i en och samma fil. Förslagsvis "queue.c"...
Citera
2013-11-10, 17:02
  #6
Medlem
Sitkins avatar
Citat:
Ursprungligen postat av FaderBerg
Ta bort static och gör variabeln global då. Annars är det ju en god idé att samla alla "kö"-variabler och funktioner i en och samma fil. Förslagsvis "queue.c"...
Saken är att variabeln måste vara static. Så jag tror det är så det ska vara. Jag testade programmet nu och det fungerar utmärkt att sätta in personer fram tills arrayen blir full

Du har ingen aning hur länge jag har hållit på med programmet alltså Nu fick jag mer krafter att fortsätta programmera.
Citera
2013-11-12, 19:59
  #7
Medlem
Sitkins avatar
Citat:
Ursprungligen postat av FaderBerg
Ta bort static och gör variabeln global då. Annars är det ju en god idé att samla alla "kö"-variabler och funktioner i en och samma fil. Förslagsvis "queue.c"...
Jahapp då har jag fastnat igen men den här gången i funktionen som ska ta bort den siste personen i kön.

Jag vet att det ska vara något liknande men någonstans gör jag en logisk fel. Som de ovanstående funktionerna ska jag skapa en funktion deQ och en tabort_från_kön funktion. I deQ funktionen ska jag ta bort personen från variabeln head, men den har jag inte använt någonstans. Den enda variabeln jag har använt är tail. Så istället för att använda head har jag alltså använd tail variabeln. Sen ska man kopiera personuppgifterna ska kopieras till personvariabeln. I tabort_från_kön ska jag först kontrollera att kön inte är tom och sen ska jag göra ett anrop till deQ som jag skickar adressen till inparametern. Avslutningsvis ska jag skriva ut personuppgifterna för personen. Jag har följt instruktionerna men det verkar som jag tar bort(om kön består av två personer) bägge personerna. Dvs jag behöver bara lite hjälp för att få tänket:



Det svåraste med att vara en nybörjare i programmering är att om syntaxen är rätt och man har kommit in så djupt i programmeringen men logiken är fel så är det liksom kört. För man vet inte vad man ska ändra för att det ska fungera.

Och jag är tacksam för ett svar på förhand!
Citera
2013-11-13, 06:49
  #8
Medlem
Goto10s avatar
Jag har skummat igenom tråden och får känslan att TS behöver designa om köhanteringen. Du nämner variablerna head och tail men att du bara använt tail.
Ett ganska vanligt sätt att implementara en kö är att använda en cirkulär array, säg med storleken 10.
Du låter en variabel, head, hålla koll på första elementet i kön och en annan variabel, tail, hålla koll på första lediga plats i kön.
Det låter som att det är en sådan implementation läraren är ute efter.

Rekommenderar att du läser igenom den här pdf:en: http://cse.unl.edu/~sscott/teach/Cla...tes/Queues.pdf
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in