Guest User

trabalho de algoritmos - agenda de compromissos 0.2

a guest
Nov 27th, 2012
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <curses.h>
  3. #include <string.h>
  4.  
  5. typedef struct
  6. {
  7.     int ano, mes, dia;
  8. }data;
  9.  
  10. typedef struct
  11. {
  12.     int horas, minutos;
  13. }horario;
  14.  
  15. typedef struct
  16. {
  17.     data dia;
  18.     horario horas;
  19.     char descricao[80];
  20. }dados;
  21.  
  22. typedef struct agenda *node;
  23.  
  24. struct agenda
  25. {
  26.     dados info;
  27.     node ant, prox;
  28. };
  29.  
  30. typedef struct
  31. {
  32.     node prim, ult;
  33.     int qte;
  34. }Descritor;
  35.  
  36. Descritor lista;
  37.  
  38.  
  39. void flush_in()
  40. {
  41.    /*funcao para limpar cache do teclado, estava tendo problemas para
  42.     * usar gets, o programa pulava a linha completamente, achei
  43.     * essa solucao na internet, o cache do teclado ficava "sujo"
  44.     * depois de usar scanf e bugava o gets*/
  45.    int ch;
  46.  
  47.    while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){}
  48. }
  49.  
  50. int debugletudo (Descritor *lista) //para ver o conteúdo todo da lista, testar insercão
  51. {
  52.     node p;
  53.    
  54.     if (lista->qte)
  55.     {
  56.         p = lista->prim;
  57.         while (p)
  58.         {
  59.             printf("%d/%d/%d %d:%d\n%s\n", p->info.dia.dia, p->info.dia.mes, p->info.dia.ano, p->info.horas.horas, p->info.horas.horas, p->info.descricao);
  60.             p = p->prox;
  61.         }
  62.     }
  63.    
  64.     return 0;
  65. }
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72. int remover (Descritor *lista)
  73. {
  74.     data remov;
  75.     int t;
  76.     node p, q;
  77.    
  78.     if (lista->qte == 0)
  79.     {
  80.         printf("Não há dados para carregar! Tente inserir (I) ou abrir um arquivo pré-existente (A) no menu.\n");
  81.         return 0;
  82.     }
  83.    
  84.     do{
  85.         t = 0;
  86.         printf("Digite a data cujos compromissos serão removidos (formato 'dia mês ano(completo)\nex: 21 04 2013): ");
  87.         scanf("%d %d %d", &remov.dia, &remov.mes, &remov.ano);
  88.         flush_in();
  89.        
  90.         if ( (remov.dia > 31) || (remov.dia < 1) )
  91.         {
  92.             printf("\nDia deve ser entre 1 e 31!\n");
  93.             t = 1;
  94.         }
  95.         else if ( (remov.mes > 12) || (remov.mes < 1) )
  96.         {
  97.             printf("\nMês deve ser entre 1 e 12!\n");
  98.             t = 1;
  99.         }
  100.        
  101.     } while (t);
  102.    
  103.    
  104.     p = lista->prim;
  105.    
  106.     while ( p->info.dia.ano == remov.ano) //para remover do primeiro elemento
  107.     {
  108.         while ( p->info.dia.mes == remov.mes)
  109.         {
  110.             while ( p->info.dia.dia == remov.dia)
  111.             {
  112.                 if (!p->prox) //se só houver um elemento
  113.                 {
  114.                     lista->qte = 0;
  115.                     lista->prim = lista->ult = NULL;
  116.                     free(p);
  117.                     printf("\nRemocão concluída e sua agenda está vazia.\n");
  118.                     return 0;
  119.                 }
  120.                
  121.                 (p->prox)->ant = NULL;
  122.                 lista->prim = p->prox;
  123.                 lista->qte -= 1;
  124.                 free(p);
  125.                 p = lista->prim;
  126.                
  127.             }
  128.        
  129.         }
  130.     }
  131.     //removidos elementos até o primeiro não ter a data de remocão
  132.     p = p->prox;
  133.    
  134.     while (p)
  135.     {
  136.        
  137.         while ( p->info.dia.ano == remov.ano)
  138.         {
  139.             while ( p->info.dia.mes == remov.mes)
  140.             {
  141.                 while ( p->info.dia.dia == remov.dia)
  142.                 {
  143.                     if (!p->prox) //se deletando o ultimo elemento
  144.                     {
  145.                         (p->ant)->prox = NULL;
  146.                         lista->qte -= 1;
  147.                         lista->ult = p->ant;
  148.                         free(p);
  149.                         printf("\nRemocão concluída!\n");
  150.                         return 0; //como a lista é ordenada...
  151.                     }
  152.                     else
  153.                     {
  154.                         (p->prox)->ant = p->ant;
  155.                         (p->ant)->prox = p->prox;
  156.                         lista->qte -= 1;
  157.                         q = p->prox;
  158.                         free(p);
  159.                         p = q;
  160.                     }
  161.                 }
  162.                 //se entrou e saiu dessa série de whiles, acabaram os elementos a
  163.                 //serem removidos, já que a lista é ordenada
  164.                 printf("\nRemocão concluída!\n");
  165.                 return 0;
  166.                
  167.             }
  168.         }
  169.        
  170.         //se não entrou nos whiles, andar
  171.         p = p->prox;
  172.        
  173.     }
  174.    
  175.     printf("\nNenhum compromisso encontrado na data pedida.\n");   
  176.     return 0;
  177. }
  178.  
  179. dados pegaDados ()
  180. {
  181.     dados novo;
  182.     int t;
  183.    
  184.     do {
  185.         t = 0;  //zerando a condicao do while toda iteracao
  186.         printf("\nPor favor, insira a data do novo compromisso (formato 'dia mês ano(completo)' \nex: 21 04 2013): ");
  187.         scanf("%d %d %d", &novo.dia.dia, &novo.dia.mes, &novo.dia.ano);
  188.         flush_in();
  189.        
  190.         if ( (novo.dia.dia > 31) || (novo.dia.dia < 1) )
  191.         {
  192.             printf("\nDia deve ser entre 1 e 31!\n");
  193.             t = 1;
  194.         }
  195.         else if ( (novo.dia.mes > 12) || (novo.dia.mes < 1) )
  196.         {
  197.             printf("\nMês deve ser entre 1 e 12!\n");
  198.             t = 1;
  199.         }
  200.        
  201.     } while (t);
  202.    
  203.     do {
  204.         t = 0;
  205.         printf("\nAgora, insira o horário do novo compromisso (formato 'horas minutos' \nex: 14 50): ");
  206.         scanf("%d %d", &novo.horas.horas, &novo.horas.minutos);
  207.         flush_in();
  208.        
  209.         if (novo.horas.horas == 24)
  210.             novo.horas.horas = 0; //apenas para padronizar e facilitar a organizacao
  211.        
  212.         if ( (novo.horas.horas < 0) || (novo.horas.horas > 23) )
  213.         {
  214.             printf("\nHora 'cheia' deve ser entre 0 e 24!\n");
  215.             t = 1;
  216.         }
  217.        
  218.         if ( (novo.horas.minutos < 0) || (novo.horas.minutos > 59) )
  219.         {
  220.             printf("\nMinutos devem ser entre 0 e 59!\n");
  221.             t = 1;
  222.         }
  223.        
  224.     } while (t);
  225.    
  226.     printf("\nEscreva uma breve descricão para o compromisso (até 80 caractres): ");
  227.     gets(novo.descricao);
  228.    
  229.     printf("\nDados inseridos com sucesso.\n");
  230.    
  231.     return novo;
  232. }
  233.  
  234. int inserir (Descritor *lista)
  235. {
  236.     dados novo = pegaDados(); //decidi colocar a parte de interacao com o usuario separada pois ficou grande
  237.     node p, q;
  238.    
  239.     if (lista->qte == 0)
  240.     {
  241.         p = (node)malloc(sizeof(struct agenda));
  242.         p->ant = p->prox = NULL;
  243.         p->info = novo;
  244.         lista->qte = 1;
  245.         lista->prim = lista->ult = p;
  246.         return 0;
  247.     }
  248.     else
  249.     {
  250.         p = lista->prim;
  251.         if (p->info.dia.ano > novo.dia.ano) //se o primeiro ano é maior, o elemento novo será o primeiro
  252.         {
  253.             q = (node)malloc(sizeof(struct agenda));
  254.             q->info = novo;
  255.             q->prox = p;
  256.             q->ant = NULL;
  257.             p->ant = q;
  258.             lista->prim = q;
  259.             lista->qte += 1;
  260.             return 0;
  261.         }
  262.        
  263.         else
  264.         {
  265.             while (p->info.dia.ano < novo.dia.ano)
  266.             {
  267.                 if (!p->prox) //insere no fim da lista
  268.                 {
  269.                     q = (node)malloc(sizeof(struct agenda));
  270.                     q->info = novo;
  271.                     q->ant = p;
  272.                     q->prox = NULL;
  273.                     p->prox = q;
  274.                     lista->ult = q;
  275.                     lista->qte += 1;
  276.                     return 0;
  277.                 }
  278.                 else
  279.                     p = p->prox;
  280.             }
  281.             //saindo do while, o ano de p só pode ser maior ou igual e p->ant só pode ser menor
  282.             if (p->info.dia.ano > novo.dia.ano)
  283.             {
  284.                 q = (node)malloc(sizeof(struct agenda));
  285.                 q->info = novo;
  286.                 q->prox = p;
  287.                 q->ant = p->ant;
  288.                 p->ant = q;
  289.                 lista->qte += 1;
  290.                 return 0;
  291.             }
  292.             //se não caiu em nenhuma das condicoes até agora, os anos são iguais
  293.  
  294.  
  295.             while (p->info.dia.mes < novo.dia.mes)
  296.             {
  297.                 if (!p->prox) //insere no fim da lista
  298.                 {
  299.                     q = (node)malloc(sizeof(struct agenda));
  300.                     q->info = novo;
  301.                     q->ant = p;
  302.                     q->prox = NULL;
  303.                     p->prox = q;
  304.                     lista->ult = q;
  305.                     lista->qte += 1;
  306.                     return 0;
  307.                 }
  308.                 else
  309.                     p = p->prox;
  310.             } //saindo do while, mês de p é maior ou igual
  311.            
  312.             if (p->info.dia.mes > novo.dia.mes)
  313.             {
  314.                 q = (node)malloc(sizeof(struct agenda));
  315.                 q->info = novo;
  316.                 q->prox = p;
  317.                 q->ant = p->ant;
  318.                 p->ant = q;
  319.                 lista->qte += 1;
  320.                 return 0;
  321.             }
  322.             //sendo os meses iguais
  323.            
  324.  
  325.             while (p->info.dia.dia < novo.dia.dia)
  326.             {
  327.                 if (!p->prox) //insere no fim da lista
  328.                 {
  329.                     q = (node)malloc(sizeof(struct agenda));
  330.                     q->info = novo;
  331.                     q->ant = p;
  332.                     q->prox = NULL;
  333.                     p->prox = q;
  334.                     lista->ult = q;
  335.                     lista->qte += 1;
  336.                     return 0;
  337.                 }
  338.                 else
  339.                     p = p->prox;
  340.             } //saindo do while, dia de p é maior ou igual
  341.            
  342.             if (p->info.dia.dia > novo.dia.dia)
  343.             {
  344.                 q = (node)malloc(sizeof(struct agenda));
  345.                 q->info = novo;
  346.                 q->prox = p;
  347.                 q->ant = p->ant;
  348.                 p->ant = q;
  349.                 lista->qte += 1;
  350.                 return 0;
  351.             }
  352.             //sendo os dias iguais
  353.                
  354.             while (p->info.horas.horas < novo.horas.horas )
  355.             {
  356.                 if (!p->prox) //insere no fim da lista
  357.                 {
  358.                     q = (node)malloc(sizeof(struct agenda));
  359.                     q->info = novo;
  360.                     q->ant = p;
  361.                     q->prox = NULL;
  362.                     p->prox = q;
  363.                     lista->ult = q;
  364.                     lista->qte += 1;
  365.                     return 0;
  366.                 }
  367.                 else
  368.                     p = p->prox;
  369.             } //saindo do while, hora cheia de p é maior ou igual
  370.            
  371.             if (p->info.horas.horas > novo.horas.horas)
  372.             {
  373.                 q = (node)malloc(sizeof(struct agenda));
  374.                 q->info = novo;
  375.                 q->prox = p;
  376.                 q->ant = p->ant;
  377.                 p->ant = q;
  378.                 lista->qte += 1;
  379.                 return 0;
  380.             }
  381.             //sendo horas cheias iguais
  382.            
  383.             while (p->info.horas.minutos < novo.horas.minutos )
  384.             {
  385.                 if (!p->prox) //insere no fim da lista
  386.                 {
  387.                     q = (node)malloc(sizeof(struct agenda));
  388.                     q->info = novo;
  389.                     q->ant = p;
  390.                     q->prox = NULL;
  391.                     p->prox = q;
  392.                     lista->ult = q;
  393.                     lista->qte += 1;
  394.                     return 0;
  395.                 }
  396.                 else
  397.                     p = p->prox;
  398.             } //saindo do while, hora cheia de p é maior ou igual
  399.            
  400.             if (p->info.horas.minutos > novo.horas.minutos)
  401.             {
  402.                 q = (node)malloc(sizeof(struct agenda));
  403.                 q->info = novo;
  404.                 q->prox = p;
  405.                 q->ant = p->ant;
  406.                 p->ant = q;
  407.                 lista->qte += 1;
  408.                 return 0;
  409.             }
  410.             //sendo minutos iguais (!)
  411.            
  412.             q = (node)malloc(sizeof(struct agenda));
  413.             q->info = novo;
  414.             q->prox = p;
  415.             q->ant = p->ant;
  416.             p->ant = q;
  417.             lista->qte += 1;
  418.             printf("Já existe um compromisso neste mesmo dia e horário. Ambos estão salvos, mas confira sua programacão.");
  419.             return 0;
  420.                    
  421.         }
  422.     }
  423.    
  424.     return 0;
  425. }
  426.  
  427.  
  428. int menu()
  429. {
  430.     char opcao, sair = 'N';
  431.     int i;
  432.    
  433.     do {
  434.         printf("\nPara inserir um compromisso, digite 'I'. ");
  435.         printf("Para remover os compromissos de uma \ndeterminada data, digite 'R'. ");
  436.         printf("Para consultar um dia, digite 'C'. ");
  437.         printf("Para procurar \ncompromissos por palavras-chave, digite 'P'. ");
  438.         printf("Para salvar seus compomissos em um arquivo de texto, digite 'S'. ");
  439.         printf("Para abrir um arquivo com seus compromissos \nsalvos, digite 'A'. ");
  440.         printf("Ou digite 'E' para sair.\n");
  441.        
  442.         do {
  443.             scanf("%c", &opcao);
  444.             flush_in();
  445.             opcao = toupper(opcao);
  446.            
  447.             switch (opcao)
  448.             {
  449.                 case 'I': inserir(&lista); i = 0; break;
  450.                 case 'R': remover(&lista); i = 0; break;
  451.                 case 'C': debugletudo(&lista); i = 0; break;
  452.                 case 'P': printf("\nProcurar"); i = 0; break;
  453.                 case 'S': printf("\nSalvar"); i = 0; break;
  454.                 case 'A': printf("\nCarregar"); i = 0; break;
  455.                 case 'E':
  456.                     printf("\nDeseja mesmo sair? (S/N)");
  457.                     scanf("%c", &sair);
  458.                     flush_in();
  459.                     sair = toupper(sair);
  460.                     if (sair == 'S')
  461.                         return 0;
  462.                     i = 0; break;
  463.                 default: printf("\nNenhuma opcão válida, tente novamente.\n"); i = 1; break;
  464.             }
  465.         } while (i);
  466.    
  467.     } while (sair != 'S');
  468.    
  469.     return 0;
  470. }
  471.  
  472. int main()
  473. {
  474.     //iniciando a lista
  475.     lista.qte = 0;
  476.     lista.prim = lista.ult = NULL;
  477.    
  478.     //chamando o menu
  479.     printf("                         Bem-vindo à sua agenda virtual\n");
  480.     menu();
  481. //  printf("%d/%d/%d %d:%d\n%s\n", p->info.dia.dia, p->info.dia.mes, p->info.dia.ano, p->info.horas.horas, p->info.horas.horas, p->info.descricao);
  482.     return 0;
  483. }
Advertisement
Add Comment
Please, Sign In to add comment