Advertisement
x0Henr1Must47d

TP2 To-Do

Nov 1st, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.74 KB | None | 0 0
  1. //MAIN
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdbool.h>
  7. #include "To-Do.h"
  8.  
  9. int main(){
  10.  
  11.     Atividade activity; //declaração de uma variavel do tipo Fila
  12.     Fila f; //declaração de uma variavel do tipo Fila
  13.     Lista l; //declaração de uma variavel do tipo Lista
  14.     Pilha p; //declaração de uma variavel do tipo Pilha
  15.  
  16.     int op, pos; //variavel "op" para o switch case, "pos" para receber o retorno da função que encontra a posição da atividade na lista
  17.     char ativi[65]; //variavel que recebe o titulo de uma tarefa
  18.  
  19.     create_lista(&l); //inicialização da lista
  20.     create_fila(&f); //inicialização da fila
  21.     create_pilha(&p); //inicialização da pilha
  22.  
  23.     do{ //equanto "op" não for == 0 o menu de opções volta a aparecer;
  24.         printf("\t\tHello to To-Do Pendulares!\n");
  25.         //menu de opções
  26.         printf("\t1 - Criar uma atividade\n"
  27.                "\t2 - Vizualizar uma atividade\n"
  28.                "\t3 - Editar uma atividade\n"
  29.                "\t4 - Excluir uma atividade\n"
  30.                "\t5 - Listar as atividades\n"
  31.                "\t6 - Proxima atividade a ser realizada\n"
  32.                "\t7 - Atividades concluidas\n"
  33.                "\t0 - EXIT\n\n");
  34.         scanf("%d", &op);
  35.  
  36.         switch(op){
  37.             case 1: //cria uma atividade
  38.                 nova_tarefa(&activity); //preeche a struct atividade com os seus dados
  39.                 criar_atividade(&l, activity); //adiciona a nova atividade na lista de atividades
  40.                 enqueue_prioridade(&f, activity); //coloca uma atividade como prioritaria caso a prioridade seja 3 - alta
  41.                 if(activity.status == 0){//se uma atividade tem status 0 - concluida ela é
  42.                     push(&p, activity); //colocada em uma pilha para que o usuario possa ver quais atividade foram concluidas
  43.                 }
  44.             break;
  45.  
  46.             case 2:
  47.                 printf("\nDigite o titulo da tarefa que deseja vizualizar:\n");
  48.                 scanf("%s", ativi);//a variavel recebe o titulo da tarefa a ser visualizada
  49.                 vizualizar_atividade(&l, ativi); //chama a função de vizualizar a atividade, passando a lista por referencia e o titulo da tarefa a ser vizualizada
  50.             break;
  51.  
  52.             case 3:
  53.                 printf("\nDigite o titulo da tarefa que deseja editar:\n");
  54.                 scanf("%s", ativi);//a variavel recebe o titulo da tarefa a ser visualizada
  55.                 vizualizar_atividade(&l, ativi); //mostra a tarefa que será editada
  56.                 printf("\nDigite a modificacoes que deseja fazer:\n");
  57.                 nova_tarefa(&activity); //preeche a struct atividade com os dados
  58.                 editar(&l, ativi, activity); //chama a função de editar, passando a lista por referencia, o titulo e o dado do tipo Atividade
  59.                 if(activity.status == 0){
  60.                     push(&p, activity); //se uma atividade tem status 0 - concluida ele é colocada em uma pilha
  61.                 }
  62.             break;
  63.  
  64.             case 4:
  65.                 printf("\nDigite o titulo da tarefa que deseja excluir:\n");
  66.                 scanf("%s", ativi); //a variavel recebe o titulo da tarefa a ser visualizada
  67.                 pos = encontrar_pos(&l, ativi); //a variavel pos recebe o retorno da função que encontra a posição de um titiulo especifico de uma atividade
  68.                 activity = remove_at(&l, pos); //activity recebe o retorno da atividade que foi removida
  69.                 imprimir_atividade(activity); // imprime a atividade que foi removida
  70.             break;
  71.  
  72.             case 5:
  73.                 print_lista(l); // imprime a lista de todas as atividades
  74.                 printf("\n");
  75.             break;
  76.  
  77.             case 6:
  78.                 print_fila(f); // imprime todas as atividades que tem uma maior prioridade primeiro
  79.                 printf("\n");
  80.             break;
  81.  
  82.             case 7:
  83.                 print_pilha(p); // imprime todas a atividades já concluidas
  84.                 printf("\n");
  85.             break;
  86.         }
  87.     }while(op != 0);
  88. }
  89.  
  90.  
  91. //TO-DO
  92. #ifndef TO-DO_H_INCLUDED
  93. #define TO-DO_H_INCLUDED
  94. #include <stdlib.h>
  95. #include <stdio.h>
  96. #include <string.h>
  97. #include <stdbool.h>
  98.  
  99. typedef struct Atividade{
  100.     char titulo [65]; //titulo da tarefa;
  101.     char descricao [257]; //descrição da tarefa;
  102.     char data [11]; //data limite para realização da tarefa, no formato DDMMAAAA; D-dia, M-mês, A-ano;
  103.     int prioridade; // 1 - baixa, 2 - média, 3 - alta;
  104.     int status; //0 - concluida, 1 - em andamento, 2 - pendente, 3 atrazada;
  105. }Atividade;
  106.  
  107. typedef struct Celula{
  108.     Atividade dado; //dado passa a ser do tipo Atividade, contendo todos os seus atribuitos;
  109.     struct Celula *prox; //ponteiro para a proxima celula;
  110. }Celula;
  111.  
  112. typedef struct{
  113.     Celula *topo;
  114.     int tam;
  115. }Pilha;
  116.  
  117. typedef struct{
  118.     Celula *inicio, *fim;
  119.     int tam;
  120. }Fila;
  121.  
  122. typedef struct Lista{
  123.     Celula *inicio, *fim;
  124.     int tam;
  125. }Lista;
  126.  
  127. //===========================================================
  128. //Pilha
  129.  
  130. void create_pilha(Pilha *p){
  131.     p->topo = NULL;
  132.     p->tam = 0;
  133. }
  134.  
  135. void push(Pilha *p, Atividade dado){
  136.  
  137.     Celula *temp =  (Celula*)malloc(sizeof(Celula));
  138.  
  139.     temp->prox = p->topo;
  140.     temp->dado = dado;
  141.  
  142.     p->topo = temp;
  143.     p->tam++;
  144. }
  145.  
  146. void print_pilha(Pilha p){
  147.  
  148.     Celula *temp = p.topo;
  149.  
  150.     printf("\nSize:%d\n", p.tam);
  151.     while(temp!=NULL){
  152.         printf("\t|%s|\n", temp->dado.titulo);
  153.         printf("%s\n", temp->dado.descricao);
  154.         printf("%s\n", temp->dado.data);
  155.         printf("%d\n", temp->dado.prioridade);
  156.         printf("%d\n", temp->dado.status);
  157.         temp = temp->prox;
  158.     }
  159. }
  160.  
  161. bool is_empty_pilha(Pilha p){
  162.     return p.topo == NULL;
  163. }
  164.  
  165. Atividade pop(Pilha *p){
  166.  
  167.     if(is_empty_pilha(*p)){
  168.         Atividade erro;
  169.         erro.status = -1;
  170.         return erro;
  171.     }
  172.  
  173.     Celula *temp = p->topo;
  174.  
  175.     p->topo = p->topo->prox;
  176.  
  177.     Atividade dado = temp->dado;
  178.     free(temp);
  179.  
  180.     p->tam--;
  181.  
  182.     return dado;
  183. }
  184.  
  185. void destroy_pilha(Pilha *p){
  186.  
  187.     while(!is_empty_pilha(*p))
  188.         pop(p);
  189. }
  190.  
  191. //==============================================================
  192. //Fila
  193.  
  194. void create_fila(Fila *f){
  195.     f->inicio = f->fim = (Celula *)malloc(sizeof(Celula));
  196.     f->tam = 0;
  197. }
  198.  
  199. bool is_empty_fila(Fila f){
  200.     return f.inicio == f.fim;
  201. }
  202.  
  203. bool enqueue(Fila *f, Atividade activity){
  204.  
  205.     Celula *temp = (Celula *)malloc(sizeof(Celula));
  206.  
  207.     if(temp == NULL)
  208.         return false;
  209.  
  210.     temp->prox = NULL;
  211.     temp->dado = activity;
  212.  
  213.     f->fim->prox = temp;
  214.     f->fim =  f->fim->prox;
  215.  
  216.     f->tam++;
  217.  
  218.     return true;
  219. }
  220.  
  221. Atividade dequeue(Fila *f){
  222.  
  223.     if(is_empty_fila(*f)){
  224.         Atividade erro;
  225.         erro.status = -1;
  226.         return erro;
  227.     }
  228.  
  229.     Celula *temp = f->inicio;
  230.  
  231.     f->inicio = f->inicio->prox;
  232.  
  233.     free(temp);
  234.  
  235.     f->tam--;
  236.  
  237.     return f->inicio->dado;
  238. }
  239.  
  240. Atividade peek(Fila f){
  241.  
  242.     if(is_empty_fila(f)){
  243.         Atividade erro;
  244.         erro.status = -1;
  245.         return erro;
  246.     }
  247.  
  248.     return f.inicio->prox->dado;
  249. }
  250.  
  251. void print_fila(Fila f){
  252.  
  253.     printf("\nSize: %d\n", f.tam);
  254.     Celula *temp = f.inicio->prox;
  255.     while(temp!=NULL){
  256.         printf("\t|%s|\n", temp->dado.titulo);
  257.         printf("%s\n", temp->dado.descricao);
  258.         printf("%s\n", temp->dado.data);
  259.         printf("%d\n", temp->dado.prioridade);
  260.         printf("%d\n", temp->dado.status);
  261.         temp = temp->prox;
  262.     }
  263.     printf("\n");
  264. }
  265.  
  266. void destroy_fila(Fila *f){
  267.     while(!is_empty_fila(*f))
  268.         dequeue(f);
  269.     free(f->inicio);
  270. }
  271.  
  272. //==============================================================
  273. //Lista
  274.  
  275. void create_lista(Lista *l){
  276.  
  277.     Celula *temp = (Celula*)malloc(sizeof(Celula));
  278.  
  279.     temp->prox = NULL;
  280.     l->inicio = l->fim = temp;
  281.     l->tam = 0;
  282. }
  283.  
  284. void add(Lista *l, Atividade dado){
  285.  
  286.     Celula *temp = (Celula*)malloc(sizeof(Celula));
  287.  
  288.     temp->prox = NULL;
  289.     temp->dado = dado;
  290.  
  291.     l->fim->prox = temp;
  292.     l->fim = temp;
  293.     l->tam++;
  294. }
  295.  
  296. Atividade remove_at(Lista *l, int pos){
  297.  
  298.     if(pos < 0 || pos >= l->tam ){
  299.         Atividade erro;
  300.         erro.status = -1;
  301.         return erro;
  302.     }
  303.  
  304.     Celula *ant = l->inicio;
  305.  
  306.     for(int i=0; i < pos;i++)
  307.         ant = ant->prox;
  308.  
  309.     Celula *temp = ant->prox;
  310.     Atividade dado = temp->dado;
  311.  
  312.     ant->prox = temp->prox;
  313.  
  314.     if(ant->prox == NULL)
  315.         l->fim = ant;
  316.  
  317.     free(temp);
  318.  
  319.     l->tam--;
  320.  
  321.     return dado;
  322. }
  323.  
  324. void print_lista(Lista l){
  325.  
  326.     printf("\nSize: %d\n", l.tam);
  327.     Celula *temp = l.inicio->prox;
  328.     int i=0;
  329.     while(temp!=NULL){
  330.         printf("\t|%s|\n", temp->dado.titulo);
  331.         printf("%s\n", temp->dado.descricao);
  332.         printf("%s\n", temp->dado.data);
  333.         printf("%d\n", temp->dado.prioridade);
  334.         printf("%d\n", temp->dado.status);
  335.         temp = temp->prox;
  336.         i++;
  337.     }
  338. }
  339.  
  340. void destroy_lista(Lista *l){
  341.     while(l->inicio != l->fim)
  342.         remove_at(l, 0);
  343.     free(l->inicio);
  344. }
  345.  
  346. //==============================================================
  347. //To-Do!
  348.  
  349. //CRUD
  350. void imprimir_atividade(Atividade activity){//imprime os dados da struct Atividade
  351.     printf("%s\n", activity.titulo);
  352.     printf("%s\n", activity.descricao);
  353.     printf("%s\n", activity.data);
  354.     printf("%d\n", activity.prioridade);
  355.     printf("%d\n", activity.status);
  356. }
  357.  
  358. void nova_tarefa(Atividade *activity){ // preeche a struct Atividade com os dados de uma nova tarefa
  359.  
  360.     printf("Titulo da tarefa:\n");
  361.     scanf("%s", &activity->titulo);
  362.     printf("Descricao da Tarefa:\n");
  363.     scanf("%s", &activity->descricao);
  364.     printf("Data da Tarefa:\n");
  365.     scanf("%s", &activity->data);
  366.     fflush(stdin);
  367.     printf("Defina a Prioridade: "
  368.            "1 - baixa; "
  369.            "2 - media; "
  370.            "3 - alta;\n\n");
  371.     scanf("%d", &activity->prioridade);
  372.     fflush(stdin);
  373.     printf("\n");
  374.     printf("Defina o Status: "
  375.            "0 - concluida; "
  376.            "1 - em andamento; "
  377.            "2 - pendente; "
  378.            "3 - atrazada;\n\n");
  379.     scanf("%d", &activity->status);
  380.     printf("\n");
  381. }
  382.  
  383. void criar_atividade(Lista *l, Atividade activity){ //cria uma atividade chamando outra função de adicionar na lista, pasando a lista e o dado a ser inserido
  384.     add(l, activity);
  385. }
  386.  
  387. void vizualizar_atividade(Lista *l, char ativi[65]){
  388.  
  389.     Celula *temp = l->inicio->prox;
  390.  
  391.     while(strcmp(temp->dado.titulo, ativi)!=0 && temp->prox != NULL){ //irá comparar o titulo da atividade que o usuarios quer
  392.         temp = temp->prox; //vizualizar e enquanto for diferente ele passa adiante para a proxima celula
  393.     }
  394.     printf("\t|%s|\n", temp->dado.titulo);
  395.     printf("%s\n", temp->dado.descricao);
  396.     printf("%s\n", temp->dado.data);
  397.     printf("%d\n", temp->dado.prioridade);
  398.     printf("%d\n", temp->dado.status);
  399. }
  400.  
  401. void editar(Lista *l, char ativi[65], Atividade activity){
  402.  
  403.     Celula *temp = l->inicio->prox;
  404.  
  405.     while(strcmp(temp->dado.titulo, ativi)!=0 && temp->prox != NULL){ //irá comparar o titulo da atividade que o usuarios quer
  406.         temp = temp->prox; //vizualizar e enquanto for diferente ele passa aiante para a proxima celula
  407.     }
  408.     strcpy(temp->dado.titulo, activity.titulo);
  409.     strcpy(temp->dado.descricao, activity.descricao);
  410.     strcpy(temp->dado.data, activity.data);
  411.     temp->dado.prioridade = activity.prioridade;
  412.     temp->dado.status = activity.status;
  413. }
  414.  
  415. int encontrar_pos(Lista *l, char ativi[65]){
  416.  
  417.     int pos=0;
  418.     Celula *temp = l->inicio->prox;
  419.  
  420.     while(strcmp(temp->dado.titulo, ativi)!=0 && temp->prox != NULL){//irá comparar o titulo da atividade que o usuarios quer
  421.         temp = temp->prox; //vizualizar e enquanto for diferente ele passa aiante para a proxima celula
  422.         pos++;
  423.     }
  424.     return pos;
  425. }
  426.  
  427. //Enfilerar com prioridade
  428. void enqueue_prioridade(Fila *f, Atividade activity){
  429.  
  430.     if(activity.prioridade < 3){ //caso a prioridade da atividade não seja alta ela sera enfilieirada tornando a ultima da fila
  431.         enqueue(f, activity);
  432.         return;
  433.     }
  434.  
  435.     Celula *temp = (Celula*)malloc(sizeof(Celula)); //cria uma nova celula
  436.     temp->prox = NULL; // o prox recebe NULL
  437.     temp->dado = activity; // o dado recebe a struct com os detalhes da tarefa
  438.  
  439.     Celula *ant = f->inicio;// a celula anterior recebe o inicio da fila
  440.  
  441.     while(ant->prox!=NULL && ant->prox->dado.prioridade >= 3){// enquanto o proximo da fila for diferente de NULL e os dados forem
  442.         ant = ant->prox;// maior ou igual a 3 ela irá avançar até encontar alguem menor
  443.     }
  444.  
  445.     temp->prox = ant->prox;
  446.     ant->prox = temp;
  447.  
  448.     if(temp->prox == NULL){
  449.         f->fim = temp;
  450.     }
  451.     f->tam++;
  452. }
  453.  
  454. #endif // TO-DO_H_INCLUDED
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement