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

Problem z kolejką w C

0 głosów
330 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 (195,220 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 (195,220 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 (195,220 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 (195,220 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ź 238 wizyt
pytanie zadane 22 maja 2023 w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
0 odpowiedzi 526 wizyt
pytanie zadane 9 listopada 2023 w Systemy operacyjne, programy przez tubylec01 Obywatel (1,610 p.)
0 głosów
0 odpowiedzi 424 wizyt
pytanie zadane 25 listopada 2019 w Algorytmy przez Oskardes Użytkownik (600 p.)

93,632 zapytań

142,556 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...