• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z kolejką w C

Object Storage Arubacloud
0 głosów
172 wizyt
pytanie zadane 31 marca 2020 w C i C++ przez SensejChmiel Nowicjusz (180 p.)
edycja 31 marca 2020 przez SensejChmiel

Cześć, mam problem z programem który ma symulować kolejkę połączeń w callcenter. Mianowicie, chodzi o wywołania pętli w funkcji main, która nie wykonuje się tyle razy ile powinna (mniej razy). Np gdy powinna wykonuje się 2 razy, wykonuje się raz, a gdy powinna 6 razy to wykonuje się tylko 4 razy.  Przykładowe dane wejściowe powinny wyglądać następująco: 

2   // liczba kolejnych wierszy

a 24 111222333  // tutaj: a-informacja czy a(add) do kolejki lub r(remove); 24- dl. polaczenia; 11...33 - numer tel.

r 28 

Czy mógłby ktoś mi wytłumaczyć dlaczego program tak się zachowuje?

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

struct Operation{
    char typ;
    char *number;
    int secs;
};

struct Queue{
    int rear, front, size;
    struct Operation arr[N];
};

struct Queue* creat_queue(){
    struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue));
    queue->rear=N-1;
    queue->front = queue->size = 0;
    return queue;
};

void add_to_queue(struct Queue* queue, struct Operation item){
    queue->rear=(queue->rear+1)%N;
    queue->arr[queue->rear]=item;
    queue->size=queue->size+1;
}

struct Operation remove_from_queue(struct Queue* queue){
            struct Operation item = queue->arr[queue->front];
            queue->front=(queue->front+1)%N;
            queue->size=queue->size -1;
            return item;
}

int isEmpty(struct Queue* queue) {
     return (queue->size == 0);
 }

void output(struct Queue* queue){
    struct Operation operation;
    while(!isEmpty(queue)){
        operation=remove_from_queue(queue);
        printf("%s %d\n", operation.number, operation.secs);
    }
}

void object(struct Queue* queue){
        struct Operation operation;
        scanf("%c %d %s", &operation.typ, &operation.secs, operation.number);
        if(operation.typ=='a'){
            add_to_queue(queue, operation);
            }
        else if(operation.typ=='r'){
            struct Operation tmp;
                tmp=remove_from_queue(queue);
                tmp.secs=operation.secs-tmp.secs;
                add_to_queue(queue, tmp);
            }

}

int main()
{
    int k;
    scanf("%d", &k);
    struct Queue* queue = creat_queue();
    while(k--){
    object(queue);
    }
    output(queue);
    return 0;
}

 

komentarz 31 marca 2020 przez j23 Mędrzec (194,920 p.)

Dlaczego Operation::number jest tablicą wskaźników?

komentarz 31 marca 2020 przez SensejChmiel Nowicjusz (180 p.)

Racja, blad ktory sie wkradl smiley

komentarz 31 marca 2020 przez j23 Mędrzec (194,920 p.)

Teraz jest jeszcze gorzej. Niech to pole będzie zwykła tablicą char.

1 odpowiedź

+1 głos
odpowiedź 31 marca 2020 przez j23 Mędrzec (194,920 p.)
struct Operation {
    char typ;
    char number[20];
    int secs;
};

...


void object(struct Queue* queue)
{
    struct Operation operation;

 	if(scanf(" %c", &operation.typ) == 1) {   
		switch (operation.typ)
		{
		case 'a':
			scanf("%d %s", &operation.secs, operation.number);
		    add_to_queue(queue, operation);
			break;
			
		case 'r':
		    scanf("%d", &operation.secs);
		    struct Operation tmp = remove_from_queue(queue);
		    tmp.secs = operation.secs - tmp.secs;
		    add_to_queue(queue, tmp);
		};
    }
}

 

komentarz 1 kwietnia 2020 przez SensejChmiel Nowicjusz (180 p.)

Faktycznie, teraz jest juz wporządku smiley. Moglbym jeszcze prosic o wyjasnienie dlaczego moj kod nie dzialal? Czy problem tkwil w scanf?

komentarz 1 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

Błędy były trzy:

  1. wspomniane w komentarzu pole Operation::numer.
  2. format "%c" czyta znak niezależnie od tego, czy jest to biały znak, czy nie. Trzeba było dodać spację, by scanf pominął początkowe białe znaki.
  3. funkcja zawsze czytała trzy wartości, a powinna tyle, ile dany typ rekordu posiada.

 

komentarz 1 kwietnia 2020 przez SensejChmiel Nowicjusz (180 p.)
Jasne, bardzo dziekuje za pomoc!

Podobne pytania

0 głosów
1 odpowiedź 96 wizyt
pytanie zadane 22 maja 2023 w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
0 odpowiedzi 199 wizyt
pytanie zadane 9 listopada 2023 w Systemy operacyjne, programy przez tubylec01 Obywatel (1,260 p.)
0 głosów
0 odpowiedzi 237 wizyt
pytanie zadane 25 listopada 2019 w Algorytmy przez Oskardes Użytkownik (600 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...