Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- *
- * Programa em C que lê nomes e pontuações a partir da entrada,
- * ordena as informações de acordo com a pontuação da maior para a menor
- * e depois imprime o resultado ordenado.
- *
- * A ordenação é feita durante a leitura dos dados de forma a otimizar o algoritmo.
- *
- */
- #include <stdio.h>
- #include <string.h>
- #define MAX_NOMES 5
- #define MAX_COMPRIMENTO_NOME 50
- #define TRUE 1
- #define FALSE 0
- char g_sNome[MAX_NOMES][MAX_COMPRIMENTO_NOME]; // Armazena os nomes informados.
- int g_iPontuacao[MAX_NOMES]; // Armazena a pontuação referente a cada nome informado.
- /*
- *
- * Realiza uma troca entre as posições 'i' e 'j'.
- *
- */
- void swap(int i, int j) {
- int iTempPontuacao = g_iPontuacao[i];
- g_iPontuacao[i] = g_iPontuacao[j];
- g_iPontuacao[j] = iTempPontuacao;
- char sTempNome[MAX_COMPRIMENTO_NOME];
- strcpy_s(sTempNome, g_sNome[i]);
- strcpy_s(g_sNome[i], g_sNome[j]);
- strcpy_s(g_sNome[j], sTempNome);
- }
- /*
- *
- * Realiza uma cópia da posição 'srcIndex' para a posição 'dstIndex'.
- *
- */
- void copy(int dstIndex, int srcIndex) {
- g_iPontuacao[dstIndex] = g_iPontuacao[srcIndex];
- strcpy_s(g_sNome[dstIndex], g_sNome[srcIndex]);
- }
- /*
- *
- * Realiza um shift right (deslocamento à direnta) de 'count' elementos nos arrays iniciando na posição 'start'.
- *
- */
- void shift(int start, int count) {
- for (int i = start + count; i > start; i--)
- copy(i, i - 1);
- }
- /*
- *
- * Sub-rotina principal do programa.
- *
- */
- int main(){
- for (int i = 0; i < MAX_NOMES; i++) {
- char sNomeLido[MAX_COMPRIMENTO_NOME];
- int iPontuacaoLida;
- // Faz a leitura dos dados.
- printf("Digite o nome: ");
- scanf_s("%s", &sNomeLido);
- printf("Digite a pontuação: ");
- scanf_s("%d", &iPontuacaoLida);
- int bAchou = FALSE;
- // Varre os dados anteriormente armazenados, verificando se existe algum que tenha uma pontuação menor que a pontuação informada.
- for (int j = 0; j < i; j++)
- if (iPontuacaoLida > g_iPontuacao[j]) { // Verifica se a pontuação informada é maior que alguma das pontuações anteriormente informadas.
- // Caso seja...
- 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.
- strcpy_s(g_sNome[j], sNomeLido); // Adiciona os novos dados na posição a qual anteriormente residia os dados da maior pontuação.
- g_iPontuacao[j] = iPontuacaoLida;
- bAchou = TRUE;
- break; // Operação concluída. Cai fora daqui!
- }
- if (!bAchou) { // Se na varredura não foi encontrada nenhuma pontuação menor do que a informada, então adiciona novos elementos no array.
- strcpy_s(g_sNome[i], sNomeLido);
- g_iPontuacao[i] = iPontuacaoLida;
- }
- }
- // Após realizada a leitura e ordenação dos dados é realizada a apresentação deles na tela.
- printf("\nResultado:\n");
- printf("Nome\t\t\tPontuação\n");
- for (int i = 0; i < MAX_NOMES; i++)
- printf("%s\t\t\t%d\n", g_sNome[i], g_iPontuacao[i]);
- int x = 0;
- while (x != 1){
- printf("Deseja continuar? (sim pra 1, não)");
- scanf_s("%d", &x);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement