Advertisement
OverSkillers

Media,Max,Min

Apr 3rd, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct Lista{ //sintaxe do typedef: typedef [tipo de dados atual] [nome pelo qual se vai passar a chamar]
  6.  
  7.     int num;
  8.     struct Lista *proximo, *anterior; //Ponteiros que apontam para um objecto do tipo struct Lista
  9.                                     //(tal como int *p corresponde a um ponteiro que aponta para um objecto do tipo int)
  10. }Lista;
  11.  
  12. //Funções que criam e inserem listas
  13.  
  14. Lista *criaLista(); //Esta função devolve um ponteiro (*) que aponta para um objeto do tipo struct Lista (Lista)
  15.  
  16. int insereNum(Lista *); //Esta função não devolve nada, mas recebe um ponteiro que aponta para um objecto do tipo struct Lista,
  17.                         //neste caso, o primeiro elemento
  18.  
  19. //Função que mostra os numeros no ecrã
  20.  
  21. int mostraNum(Lista *);
  22.  
  23. //Funções que calculam média, mínimo e máximo
  24.  
  25. int avgLista(Lista *);
  26.  
  27. int minLista(Lista *);  //Recebem todas o cabeçalho (o primeiro elemento) da lista que se pretende efetuar as operações
  28.  
  29. int maxLista(Lista *);
  30.  
  31. int main(void){
  32.  
  33.     Lista *startLista = NULL; //Eu costumo inicializar todos os ponteiros com NULL, excepto em algumas situações.
  34.                             //Neste caso também dá jeito, porque facilmente se verifica se a lista tem alguma coisa
  35.  
  36.     int esc;
  37.  
  38.     do{
  39.  
  40.         printf("\n\nOPCOES:\n\t1. Criar uma nova lista\n\t2. Inserir um numero\n\t3. Mostrar numeros introduzidos\n\t4. Media\n\t5. Minimo\n\t6. Maximo\n\t7. Sair\nIntroduza escolha: ");
  41.         scanf("%d", &esc);
  42.         fflush(stdin); //fflush(*FILE) força a limpeza do buffer de um stream (pode ser de um ficheiro,
  43.                         //neste caso é o de entrada, stdin)
  44.  
  45.         switch(esc){
  46.  
  47.             case 1:
  48.                 if(startLista!=NULL){
  49.  
  50.                     printf("Ja existe uma lista."); //Como inicializei startLista a NULL, é fácil verificar se existe ou nao uma lista
  51.                     break;
  52.                 }
  53.  
  54.                 startLista = criaLista(); //Tens de guardar sempre o primeiro elemento da lista. startLista é um ponteiro
  55.                                         //do mesmo tipo que criaLista() (Lista*), logo pode-se igualar, ficando startLista com o
  56.                                         //endereço do ponteiro devolvido
  57.                 break;
  58.             case 2:
  59.                 if(startLista==NULL){
  60.  
  61.                     printf("Nao existe uma lista."); //Verificação rápida se já existe o primeiro elemento
  62.                     break;
  63.                 }
  64.  
  65.                 insereNum(startLista); //insereNum recebe o cabeçalho da lista ao qual as outras estão ligadas
  66.                 break;
  67.             case 3:
  68.                 mostraNum(startLista);  //Não é preciso verificar se startLista é NULL, porque se fôr, o ciclo for()
  69.                                         //termina imediatamente e não apresenta nada no ecrã
  70.                 break;
  71.             case 4:
  72.                 avgLista(startLista);
  73.                 break;
  74.             case 5:
  75.                 minLista(startLista);
  76.                 break;
  77.             case 6:
  78.                 maxLista(startLista);
  79.                 break;
  80.         }
  81.     }while(esc!=7);
  82. }
  83.  
  84. Lista *criaLista(){ //Esta função devolve um ponteiro (*) que aponta para um objeto do tipo struct Lista (Lista)
  85.  
  86.     Lista *startLista = malloc(sizeof(Lista)); //Pede ao OS para reservar um bloco de memoria do tamanho do struct Lista (chamado Lista) e guarda o endereço desse bloco em startLista
  87.                                                 //startLista é um ponteiro para struct Lista, e para acedar aos dados desse struct é necessário usar "->"
  88.                                                 //startLista->num é a mesma coisa que (*startLista).num
  89.                                                 //Como startLista é um ponteiro, usando o * pode-se aceder ao objecto ao qual ele aponta, neste caso um struct. No entanto, "->" é muito mais fácil de perceber e usar
  90.  
  91.     if(startLista!=NULL){ //No caso extremamente raro onde o OS não pode reservar memória, ou seja, malloc() devolve NULL
  92.  
  93.         //Pede um numero ao utilizador e guarda-o no dado num do struct Lista, aqui apontado por startLista, logo guarda-o em startLista->num [ou (*startLista).num]
  94.         printf("Introduza um numero: ");
  95.         scanf("%d", &(startLista->num)); //startLista->num é um inteiro, logo o operador & tem de ser utilizado
  96.         fflush(stdin);
  97.  
  98.         //Ponteiros dentro do struct
  99.  
  100.         //Como este é suposto ser o primeiro elemento, tanto como *anterior como *proximo apontam para NULL
  101.         startLista->anterior = NULL;
  102.         startLista->proximo = NULL;
  103.     }
  104.     else printf("Erro ao criar lista.");
  105.  
  106.     return startLista; //Devolve o cabeçalho a guardar em startLista. Lembra-te que a menos que declares uma variavel global,
  107.                     //startLista do main() e este startLista são objectos diferentes, apesar de apontarem para a mesma coisa, e
  108.                     //terem o mesmo nome
  109. }
  110.  
  111. int insereNum(Lista *startLista){ //Esta função não devolve nada, mas recebe um ponteiro que aponta para um objecto do tipo struct
  112.                                 //Lista, neste caso, o primeiro elemento
  113.  
  114.     Lista *atualLista = NULL, *ultimaLista = NULL, *proximaLista = NULL, *novo = malloc(sizeof(Lista));
  115.  
  116.     //Este for() vai percorrer a lista do inicio ao fim e só para quando a lista atual for NULL. Como a condição
  117.     //atualLista!=NULL só é testada depois da iteração acontecer, atualLista no final vai ser igual a NULL,
  118.     //sendo necessãrio usar ultimaLista = atualLista
  119.     for(atualLista = startLista; atualLista!=NULL; atualLista = atualLista->proximo){
  120.  
  121.         ultimaLista = atualLista;
  122.     }
  123.  
  124.     //Mesma coisa que em criaLista(), pede um numero e guarda no struct, só que em vez de o ponteiro se chamar startLista,
  125.     //chama-se novo, são ponteiros para as mesmas coisas
  126.     printf("Introduza um numero: ");
  127.     scanf("%d", &(novo->num)); //novo->num é um inteiro, logo o operador & tem de ser utilizado
  128.     fflush(stdin);
  129.  
  130.     //Ponteiros dentro do struct
  131.  
  132.     //Para guardar o anterior, em vez de só fazeres ultimaLista->proximo = novo, fazes também o oposto,
  133.     //logo novo->anterior = ultimaLista
  134.     ultimaLista->proximo = novo;
  135.     novo->anterior = ultimaLista;
  136.     novo->proximo = NULL; //Coloca sempre o proximo a apontar para NULL
  137. }
  138. //Função que mostra os numeros no ecrã
  139.  
  140. int mostraNum(Lista *startLista){
  141.      Lista *novo, *ponteiro_1, *ponteiro_2;
  142.      novo = startLista;
  143.    while(novo!=NULL){
  144.      ponteiro_1 = novo->proximo;
  145.      ponteiro_2 = novo->anterior;
  146.      printf("O numero e %d \n", novo->num);
  147.      novo=novo->proximo;
  148.     }
  149. }
  150.  
  151. //Funções que calculam média, mínimo e máximo
  152.  
  153. int avgLista(Lista *startLista){
  154.     Lista *novo, *ponteiro_1, *ponteiro_2;
  155.     novo = startLista;
  156.     int valores = 0;
  157.     int total = 0;
  158.     int media;
  159.     while(novo!=NULL){
  160.         ponteiro_1 = novo->proximo;
  161.         ponteiro_2 = novo->anterior;
  162.         total += 1;
  163.         valores = (novo->num) + valores;
  164.         novo=novo->proximo;
  165.     }
  166.     media = valores/total;
  167.     printf("A media e %d",media);
  168. }
  169.  
  170.  
  171. int minLista(Lista *startLista){ //Recebem todas o cabeçalho (o primeiro elemento) da lista que se pretende efetuar as operações
  172.     Lista *novo, *ponteiro_1, *ponteiro_2;
  173.     novo = startLista;
  174.     int minimo,temp= (novo->num);
  175.     while(novo!=NULL){
  176.         ponteiro_1 = novo->proximo;
  177.         ponteiro_2 = novo->anterior;
  178.         minimo = (novo->num);
  179.         if (minimo < temp){
  180.             temp = minimo;
  181.         }
  182.         novo=novo->proximo;
  183.     }
  184.     printf("O valor minimo e %d",temp);
  185. }
  186.  
  187. int maxLista(Lista *startLista){
  188.     Lista *novo, *ponteiro_1, *ponteiro_2;
  189.     novo = startLista;
  190.     int minimo,temp= (novo->num);
  191.     while(novo!=NULL){
  192.         ponteiro_1 = novo->proximo;
  193.         ponteiro_2 = novo->anterior;
  194.         minimo = (novo->num);
  195.         if (minimo > temp){
  196.             temp = minimo;
  197.         }
  198.         novo=novo->proximo;
  199.     }
  200.     printf("O valor maximo e %d",temp);
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement