GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Exercício de Fila Circular

programação
Tags: #<Tag:0x00007fbf1cdcf658>

#1

Boa noite. Estou tendo conteúdo sobre filas circulares. Já fui atrás de vários exemplos, pois a professora acabou deixando só um exemplo. Estou programando em C, no Code Blocks. Gostaria de uma luz, como faço para começar este exercício abaixo:
“Crie um programa que gerencie uma fila de tarefas a serem cumpridas. As tarefas são compostas de três strings que contém uma ação a ser executada, a data e local. O usuário pode escolher entre inserir uma nova tarefa, somente verificar a próxima tarefa que ele deve cumprir ou verificar e marcar a tarefa como cumprida.”

Se puderem ajudar, agradeceria demais :wink:


#2

Qual a sua dificuldade em específico? “Como faço pra começar” é muito vago. Você pesquisou ao menos a definição de lista circular?

Veja por exemplo: https://www.programiz.com/dsa/circular-queue

Abraço.


#3

Sim sim, tô pesquisando bastante exemplos, por enquanto tô declarando em struct as variáveis. Meu problema estar em pedir esses dados no programa


#4

consegui escrever isso de código, porém não estou conseguindo pedir opções no começo, para saber se quer inserir tarefa e afim.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 2

struct tarefa {
char acao[50];
char data[50];
char local[50];
};

// Variaveis declaradas aqui são visiveis por todas as funções
//int fila[MAX];
struct tarefa fila[MAX];
int inicio = 0;
int fim = 0;
int fila_cheia = 0;

int consistirFilaCheia() {
//indices de armazenamento e recuperação iguais, quando maiores do que zero indicam fila cheia.
if ((fim > 0) && (fim == inicio)) {
fila_cheia = 1;
return 1;
}

// indica que foram inseridos MAX elementos e não ocorreu nenhuma remoção, o que indica fila cheia. 
if ((fim == MAX) && inicio == 0) {
    fila_cheia = 1;
    return 1;
}

return 0;

}

int consistirTarefaFila(int indice) {
if (indice < inicio || indice > fim) {
return 0;
}

return 1;

}

//Insere um item no final da fila
int armazena(struct tarefa t1) {
printf(“Item a ser inserido na fila: %s\n”, t1.acao);

// Houve uma remoção e o fim deve ir para 0
if ((fim == MAX) && (inicio > 0)) {
    fim = 0;
    fila_cheia = 1;
}

fila[fim] = t1; 
fim++;

printf("Inserção OK.\n");
return 0;

}

//Remove um item da fila (o primeiro que entrou)
int remover() {
//Se inicio = 0 e fim = 0, a fila está vazia. Ou ainda, se foram inseridos 4 elementos (por exemplo) e removidos 4 elementos, fim e inicio irão apontar para a posição 5, indicando que a fila está vazia.
if (((inicio == 0) && (inicio == fim)) || ((inicio == fim) && (fila_cheia == 0))){
printf(“Fila vazia.\n”);
return 0;
}

//Verifica se já foram removidos todos os elementos de fila[0] até fila[MAX-1]. Se isso já ocorreu, o próximo elemento a ser removido é o que está em fila[0].
if (inicio == MAX)
    inicio = 0;

inicio++;
return 0;

}

int main() {
struct tarefa t1;
struct tarefa t2;
struct tarefa t3;

strcpy(t1.acao, "Tarefa de casa");
strcpy(t1.data, "01/01/2017");
strcpy(t1.local, "Em casa");

strcpy(t2.acao, "Uma tarefa");
strcpy(t2.data, "01/02/2017");
strcpy(t3.local, "Na empresa");

strcpy(t3.acao, "Eu sou uma tarefa");
strcpy(t3.data, "01/03/2017");
strcpy(t3.local, "Na piscina");

if (consistirFilaCheia() == 1) {
    printf("Fila cheia\n");
} else {
    armazena(t1);
}

if (consistirFilaCheia() == 1) {
    printf("Fila cheia\n");
} else {
    armazena(t2);
}

// Consultar indice 1 (item 2 da fila)
int indice;
indice = 0;

if (consistirTarefaFila(indice) == 1) {
    printf("Tarefa encontrada: %s\n", fila[indice].acao);
} else {
    printf("Tarefa não encontrada\n");
}

if (consistirFilaCheia() == 1) {
    printf("Fila cheia \n");
} else {
    armazena(t3);
}

printf("Removendo tarefa: %d \n", indice);
remover();

if (consistirTarefaFila(indice) == 1) {
    printf("Tarefa encontrada: %s\n", fila[indice].acao);
} else {
    printf("Tarefa não encontrada\n");
}

}


#5

Separe seu código em funções, cada um com uma tarefa específica. Por exemplo, seu main poderia ser assim:

struct tarefa{
    char[50] acao;
    char[50] data;
    char[50] local;
    int estaConcluida; // 0 para pendente, 1 para concluída
}; 

FilaCircular* filaDeTarefas;

int main(void){
  int opcao = 0;
  
  while opcao != -1 {
    // aqui você exibe as opções
    opcao = scanf();

   switch(opcao){
    case -1 : break; // sairá do loop e do programa
    case 0 : incluirTarefa();
    case 1 : verTarefa();
    case 2 : marcarComoConcluida();
   }
  }
}

void incluirTarefa(){
  // pede os dados, cria um struct e insere na fila 
  tarefa tar;

  tar.acao = "X";  // usa scanf para pegar a ação
  tar.data = "Y"; // usa scanf para pegar a data
  tar.local= "Z";  // usa scanf para pegar o local
  tar.estaConcluida = 0;

  adicionarNaFila(filaDeTarefas, tar);
}

void adicionarNaFila(FilaCircular& fila, tarefa tar){
  // adiciona a tarefa "tar" na fila circular "fila"
}

Obs: o código é só para explicar como poderia ser a estrutura. Ele não funciona.

Abraço.