Ir ao conteúdo

Posts recomendados

Postado

Boa tarde! Gostaria de ajuda com o meu código. O objetivo é fazer uma agenda, onde o usuário pode adicionar lembretes. É obrigatório que o código possua listas, pilhas ou filas, eu optei por usar pilhas porém estou enfrentando problemas com praticamente todas as funções. Poderiam me ajudar com algumas dicas para que o meu código funcione?

 

#include <stdio.h>
#include <stdlib.h>
#define ANSI_COLOR_RED      "\x1b[31m"
#define ANSI_COLOR_BLACK "\033[30m"

struct Calendario{
 char lembrete[200][30]; 
 int dia[30];
 int mes[30];
 
 struct Calendario *prox;
}; 

typedef struct Calendario calendario;

int tam;

int menu(void);
void inicia(calendario *PILHA);
void opcao(calendario *PILHA, int op);
void exibe(calendario *PILHA);
void exibe(calendario *PILHA);
void imprime_mes(calendario *PILHA, int meses);
void libera(calendario *PILHA);
void adicionar(calendario *PILHA);
calendario *deletar(calendario *PILHA);


int main(void)
{
 calendario *PILHA = (calendario *) malloc(sizeof(calendario));
 if(!PILHA){
  printf("Sem memoria disponivel!\n");
  exit(1);
 }else{
 inicia(PILHA);
 int opt;

 do{
  opt=menu();
  opcao(PILHA,opt);
 }while(opt);

 free(PILHA);
 return 0;
 }
}

void inicia(calendario *PILHA)
{
  int i =0;
for (i = 0; i<30; i++){
 PILHA->prox = NULL;
 tam=0;
}}

int menu(void)
{
 int opt;

 printf("Escolha a opcao\n");
 printf("0. Sair\n");
 printf("1. Apagar todos os lembretes\n");
 printf("2. Exibir lembretes\n");
 printf("3. Adicionar lembretes\n");
 printf("4. Remover lembretes\n");
 printf("Opcao: "); scanf("%d", &opt);

 return opt;
}

void opcao(calendario *PILHA, int op)
{
 calendario *tmp;
 switch(op){
  case 0:
   libera(PILHA);
   break;

  case 1:
   libera(PILHA);
   inicia(PILHA);
   break;

  case 2:
   exibe(PILHA);
   break;

  case 3:
   adicionar(PILHA);
   break;

  case 4:
   tmp= deletar(PILHA);
   if(tmp != NULL)
   printf("LEMBRETE DELETADO");
   break;

  default:
   printf("Comando invalido\n\n");
 }
}

int vazia(calendario *PILHA)
{
  int i =0;
  int cont = 0;
for (i = 0; i<30; i++){
 if(PILHA->prox == NULL)
 {cont++;}
 if(cont == 0)
  return 1;
 else
  return 0;
}}

calendario *aloca(c)
{
 calendario *novo=(calendario *) malloc(sizeof(calendario));
 if(!novo){
  printf("Sem memoria disponivel!\n");
  exit(1);
 }else{
  printf("Título do lembrete: "); 
  scanf("%s", &novo->lembrete[c]);
  printf("Dia do lembrete: "); scanf("%d", &novo->dia[c]);
  printf("Mês do lembrete(em número): "); scanf("%d", &novo->mes[c]);
  return novo;
 }
}

void imprime_mes(calendario *PILHA, int meses){

const char *months[]={
                      "\nJaneiro","\nFevereiro","\nMarço","\nAbril","\nMaio","\nJunho","\nJulho","\nAgosto","\nSetembro","\nOutubro","\nNovembro","\nDezembro"
                     };

int month_days[] = {0, 31, 29, 31, 30, 31, 30, 31 ,31 ,30, 31, 30, 31};

int year = 2020;

    int first_day;
    int x;
    int y;
    int z;
    int j;

    x = (year - 1.)/4.0;
    y = (year - 1.)/100.;
    z = (year - 1.)/400.;

    first_day = (year + x - y + z) %7;


    int i;

    printf("%s %d\n\n", months[meses-1], year); 
    printf("Dom  Seg  Ter  Qua  Qui  Sex  Sab\n");

for(i = 1; i < meses; i++) 
    {
        
        first_day = ((first_day + month_days[i])%7); 
    }

    for(i = 1; i <= 1 + first_day * 5; i++)
    {
        printf(" ");
    }

    for(i = 1; i <= month_days[meses]; i++)
    {
        for(j = 0; j<30; j++)
        {
         if (PILHA->mes[j] == 1)
        {
        printf(ANSI_COLOR_RED "%2d",i); 
        printf(ANSI_COLOR_BLACK);
        }
        else
        {
         printf("%2d", i);
         }}

        if((i + first_day)%7 > 0)
            printf("   ");
        else
            printf("\n ");
    }
}

void exibe(calendario *PILHA)
{
 if(vazia(PILHA)){
  printf("PILHA vazia!\n\n");
  return ;
 }

int j;
 int meses;
 calendario *tmp;
 tmp = PILHA->prox;
 printf("Digite o mês que deseja visualizar: ");
 scanf("%d", &meses);
 imprime_mes( PILHA, meses);
 printf("LEMBRETES:");
 for(j = 0; j<30; j++)
{
 if(PILHA->mes[j] == meses)
{
 while( tmp != NULL){
  printf("Dia %d: %s", tmp->dia[j], tmp->lembrete[j]);
  tmp = tmp->prox;
 }
}


 printf("\n\n");
}
}

void libera(calendario *PILHA)
{
 if(!vazia(PILHA)){
  calendario *proxCalendario,
     *atual;

  atual = PILHA->prox;
  while(atual != NULL){
   proxCalendario = atual->prox;
   free(atual);
   atual = proxCalendario;
  }
 }
}


void adicionar(calendario *PILHA)
{
 int c = 0;
 calendario *novo=aloca(c);
 c++;
 novo->prox = NULL;

 if(vazia(PILHA))
  PILHA->prox=novo;
 else{
  calendario *tmp = PILHA->prox;

  while(tmp->prox != NULL)
   tmp = tmp->prox;

  tmp->prox = novo;
 }
 tam++;
}


calendario *deletar(calendario *PILHA)
{
 if(PILHA->prox == NULL){
  printf("PILHA ja vazia\n\n");
  return NULL;
 }else{
  calendario *ultimo = PILHA->prox,
              *penultimo = PILHA;

  while(ultimo->prox != NULL){
   penultimo = ultimo;
   ultimo = ultimo->prox;
  }

  penultimo->prox = NULL;
  tam--;
  return ultimo;
 }
}

 

Postado

struct Calendario{
 char lembrete[200][30]; 
 int dia[30];
 int mes[30];
 
 struct Calendario *prox;
}; 

typedef struct Calendario calendario;

int tam;

int menu(void);
void inicia(calendario *PILHA);
void opcao(calendario *PILHA, int op);
void exibe(calendario *PILHA);
void exibe(calendario *PILHA);
void imprime_mes(calendario *PILHA, int meses);
void libera(calendario *PILHA);
void adicionar(calendario *PILHA);
calendario *deletar(calendario *PILHA);

Olhando apenas para a estrutura de dados, talvez não haja razão para ter fixos 200 lembretes de 30 posições para cada dia.

É quase inútil e difícil de testar sem ter memória. Talvez deva implementar antes de tudo uma função para ler o calendário do disco e outra para salvar na saída. São umas poucas linhas e vai te ajudar pra caramba

 

O próprio calendário não é em si uma lista, mas tem propriedades, podia ter um nome, uma quantidade de eventos, uma data de criação, sei lá. E DENTRO dele está uma lista. De eventos. Onde cada evento tem um dia e mes, quem sabe hora?

 

E as funções deveriam retornar algo. Cada vez que escreve um void perde uma oportunidade de retornar algo útil.

  • inicia() em geral retorna o endereço de início ou NULL
  • adicionar() também retorna o endereço de início ou NULL
  • exibe() retorna o total de itens ou -1 em caso de erro
  • libera retorna 0 se não achou o cara. Zero é falso em C

Quando a implementar, creio que pilha não é uma boa opção: estamos falando de eventos. O normal é uma lista com ponteiros para frente e para trás. Porque? Óbvio: você que navegar pelos eventos, e um ponteiro para o anterior e o próximo é uma boa ajuda certo?

 

Lógico que como só seu programa insere eventos você vai inserir já na ordem cronológica de evento...

 

Apenas sugestões.

 

 

 

 

Postado
30 minutos atrás, Ludmila Ribeiro disse:

@arfneto Pensando em uma lista de eventos onde cada um possui um dia, um mês e um título, é possível inserir na lista essas três variáveis ou seria necessário fazer uma lista para cada variável?

 

Você vai ter uma lista de coisas onde cada elemento é uma estrutura. Nesse caso é um evento. Não faz diferença o que tem dentro.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!