Gestor de tarefas pessoais em C
Enunciado
Gestor de tarefas pessoais
(http://disciplinas.ist.utl.pt/~leic-so.daemon/2012-2013/laboratorios/lab01%20-%20ambiente/guia/)
Construa uma aplicação de organização pessoal que permite gerir as tarefas pendentes de uma pessoa.
Cada tarefa:
- é identificada por uma sequência de caracteres única que, por simplicidade, não pode conter espaços;
- tem uma prioridade, definida por um inteiro entre 0 e 2 (0 é mais prioritária, 2 é menos prioritária).
A aplicação tem os seguintes comandos:
- > nova
que insere a nova tarefa;
- > lista
que lista todas as tarefas com tarefa da prioridade indicada ou superior; a listagem deve estar ordenada por prioridade (mais prioritárias primeiro) e, entre tarefas igualmente prioritárias, por data de criação (mais recentes primeiro);
- > completa
que retira a tarefa indicada; caso a tarefa não exista, deve ser apresentada a mensagem de erro “TAREFA INEXISTENTE”.
Sugestão: usar tantas listas quanto níveis de prioridade.
Resolução
list.h
/* * list.h - definitions and declarations of the integer list */ #include <stdlib.h> #include <stdio.h> /* lst_iitem - each element of the list points to the next element */ typedef struct lst_iitem { char* value; struct lst_iitem *next; } lst_iitem_t; /* list_t */ typedef struct { lst_iitem_t * first; } list_t; /* lst_new - allocates memory for list_t and initializes it */ list_t* lst_new(); /* lst_destroy - free memory of list_t and all its items */ void lst_destroy(list_t *); /* lst_insert - insert a new item with value 'value' in list 'list' */ void lst_insert(list_t *list, char* value); /* lst_remove - remove first item of value 'value' from list 'list' */ int lst_remove(list_t *list, char* value); /* lst_print - print the content of list 'list' to standard output */ void lst_print(list_t *list);
list.c
/* * list.c - implementation of the integer list functions */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "list.h" list_t* lst_new() { list_t *list; list = (list_t*) malloc(sizeof(list_t)); list->first = NULL; return list; } void lst_destroy(list_t *list) { lst_iitem_t *head, *temp; head = list->first; while(head != NULL) { temp = head; head = head->next; free(temp); } free(list); } void lst_insert(list_t *list, char* value) { lst_iitem_t *temp,*right; temp = (lst_iitem_t*)malloc(sizeof(lst_iitem_t)); temp->value = (char*) malloc(strlen(value) * sizeof(char)); strcpy(temp->value, value); temp->next = list->first; list->first = temp; } int lst_remove(list_t *list, char* value) { lst_iitem_t *temp, *prev; temp = list->first; while(temp != NULL) { if(!strcmp(temp->value,value)) { if(temp == list->first) { list->first = temp->next; free(temp); return 1; } else { prev->next = temp->next; free(temp); return 1; } } else { prev = temp; temp = temp->next; } } return 0; } void lst_print(list_t *list) { lst_iitem_t *temp = list->first; while(temp) { printf("%sn", temp->value); temp = temp->next; } }
main.c
/* * Gestor de Tarefas Pessoais * 2013 Ricardo Sequeira */ #include <stdio.h> #include <string.h> #include "list.h" #define N_LISTS 6 #define MAX_NAME 100 int main(int argc, char *argv[]) { char cmd[10]; list_t *tasklists[N_LISTS]; int i; for(i=0; i<N_LISTS; i++) tasklists[i] = lst_new(); while(1) { scanf(" %s", cmd); if(!strcmp(cmd, "new")) { int prio; char taskName[MAX_NAME]; scanf(" %d %s", &prio, taskName); if(prio < 0 || prio > N_LISTS-1) { printf("ERROR: Invalid priority!n"); continue; } lst_insert(tasklists[prio], taskName); } else if(!strcmp(cmd, "list")) { int prio; scanf(" %d", &prio); if(prio < 0 || prio > N_LISTS-1) { printf("ERROR: Invalid priority!n"); continue; } int j; for(j=N_LISTS-1; j>=prio; j--) { printf("=====Priority %d=====n", j); lst_print(tasklists[j]); } } else if(!strcmp(cmd, "complete")) { char taskName[MAX_NAME]; scanf(" %s", taskName); int j; int found = 0; for(j=0; j<N_LISTS; j++) if(lst_remove(tasklists[j], taskName) > 0) { found = 1; break; } if(!found) printf("TAREFA INEXISTENTEn"); } else { printf("ERROR: Invalid option!n"); } } return 0; }