sharivan

ordenacao.c

Sep 3rd, 2015
142
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  *
  3.  * Programa em C que lê nomes e pontuações a partir da entrada,
  4.  * ordena as informações de acordo com a pontuação da maior para a menor
  5.  * e depois imprime o resultado ordenado.
  6.  *
  7.  * A ordenação é feita durante a leitura dos dados de forma a otimizar o algoritmo.
  8.  *
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13.  
  14. #define MAX_NOMES 5
  15. #define MAX_COMPRIMENTO_NOME 50
  16.  
  17. #define TRUE 1
  18. #define FALSE 0
  19.  
  20. char g_sNome[MAX_NOMES][MAX_COMPRIMENTO_NOME]; // Armazena os nomes informados.
  21. int g_iPontuacao[MAX_NOMES]; // Armazena a pontuação referente a cada nome informado.
  22.  
  23. /*
  24.  *
  25.  * Realiza uma troca entre as posições 'i' e 'j'.
  26.  *
  27. */
  28. void swap(int i, int j) {
  29.     int iTempPontuacao = g_iPontuacao[i];
  30.     g_iPontuacao[i] = g_iPontuacao[j];
  31.     g_iPontuacao[j] = iTempPontuacao;
  32.    
  33.     char sTempNome[MAX_COMPRIMENTO_NOME];
  34.     strcpy_s(sTempNome, g_sNome[i]);
  35.     strcpy_s(g_sNome[i], g_sNome[j]);
  36.     strcpy_s(g_sNome[j], sTempNome);
  37. }
  38.  
  39. /*
  40.  *
  41.  * Realiza uma cópia da posição 'srcIndex' para a posição 'dstIndex'.
  42.  *
  43. */
  44. void copy(int dstIndex, int srcIndex) {
  45.     g_iPontuacao[dstIndex] = g_iPontuacao[srcIndex];
  46.     strcpy_s(g_sNome[dstIndex], g_sNome[srcIndex]);
  47. }
  48.  
  49. /*
  50.  *
  51.  * Realiza um shift right (deslocamento à direnta) de 'count' elementos nos arrays iniciando na posição 'start'.
  52.  *
  53. */
  54. void shift(int start, int count) {
  55.     for (int i = start + count; i > start; i--)
  56.         copy(i, i - 1);
  57. }
  58.  
  59. /*
  60.  *
  61.  * Sub-rotina principal do programa.
  62.  *
  63. */
  64. int main(){
  65.     for (int i = 0; i < MAX_NOMES; i++) {
  66.         char sNomeLido[MAX_COMPRIMENTO_NOME];
  67.         int iPontuacaoLida;
  68.        
  69.         // Faz a leitura dos dados.
  70.         printf("Digite o nome: ");
  71.         scanf_s("%s", &sNomeLido);
  72.         printf("Digite a pontuação: ");
  73.         scanf_s("%d", &iPontuacaoLida);
  74.  
  75.         int bAchou = FALSE;
  76.         // Varre os dados anteriormente armazenados, verificando se existe algum que tenha uma pontuação menor que a pontuação informada.
  77.         for (int j = 0; j < i; j++)
  78.             if (iPontuacaoLida > g_iPontuacao[j]) { // Verifica se a pontuação informada é maior que alguma das pontuações anteriormente informadas.
  79.                 // Caso seja...
  80.                 shift(j, i - j); // Desloca o array para a direita a partir da posição j para que ela fique livre para receber os novos dados.
  81.                 strcpy_s(g_sNome[j], sNomeLido); // Adiciona os novos dados na posição a qual anteriormente residia os dados da maior pontuação.
  82.                 g_iPontuacao[j] = iPontuacaoLida;
  83.                 bAchou = TRUE;
  84.                 break; // Operação concluída. Cai fora daqui!
  85.             }
  86.         if (!bAchou) { // Se na varredura não foi encontrada nenhuma pontuação menor do que a informada, então adiciona novos elementos no array.
  87.             strcpy_s(g_sNome[i], sNomeLido);
  88.             g_iPontuacao[i] = iPontuacaoLida;
  89.         }
  90.     }
  91.    
  92.     // Após realizada a leitura e ordenação dos dados é realizada a apresentação deles na tela.
  93.  
  94.     printf("\nResultado:\n");
  95.     printf("Nome\t\t\tPontuação\n");
  96.  
  97.     for (int i = 0; i < MAX_NOMES; i++)
  98.         printf("%s\t\t\t%d\n", g_sNome[i], g_iPontuacao[i]);
  99.  
  100.     int x = 0;
  101.     while (x != 1){
  102.         printf("Deseja continuar? (sim pra 1, não)");
  103.         scanf_s("%d", &x);
  104.     }
  105.    
  106.     return 0;
  107. }
RAW Paste Data