Anilto

Separação de palavras em uma frase e ordenação por tamanho

Sep 27th, 2020
1,259
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ordenação de palavras em uma frase por tamanho das palavras.
  2. // José Anilto dos Anjos - 27/09/2020
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8.  
  9.  
  10. int main () {
  11.  
  12.     char frase[100];                // vetor para conter a frase
  13.     char aux[100];                  // vetor auxiliar (substituir por pilha)
  14.     int lim = 0;                    // guardar o tamanho da frase
  15.     int ini = 0;
  16.     int fim = 0;
  17.     int tam = 0;
  18.     int qtd = 0;
  19.  
  20.     int mat[100][3];
  21.     int ind = 0;
  22.  
  23.     scanf(" %[^\n]",frase);         // lê a frase com espaços
  24.     lim = strlen(frase);            // calcula o tamanho da frase lida
  25.  
  26.     printf("\n%s \n", frase);
  27.  
  28.     // separa palavras
  29.     for (int i=0; i <= lim; i++) {
  30.         aux[i] = frase[i];
  31.         if (frase[i] == ' ' || i == lim) {
  32.             fim = i;
  33.             tam = fim - ini;
  34.             mat[ind][0] = ini;
  35.             mat[ind][1] = fim;
  36.             mat[ind][2] = tam;
  37.             printf("\n de %d a %d - tam = %d: ", mat[ind][0], mat[ind][1] - 1, mat[ind][2]);
  38.             ind++;
  39.             qtd++;
  40.             for (int j=ini; j<fim; j++) { printf("%c", aux[j]);  }
  41.             ini = i + 1;
  42.         }
  43.     }
  44.     printf("\n Total de palavras: %d", qtd);
  45.  
  46.     // ordenar por tamanho (selection sort)
  47.     int si, sj, smin, sswap, sswap1, sswap2;
  48.     for (si = 0; si < qtd - 1; si++) {
  49.         smin = si;
  50.         for (sj = si+1; sj < qtd; sj++) {
  51.             if(mat[sj][2] < mat[smin][2]) { smin = sj; } // inverter aqui para ordem crescente ('>' para '<'
  52.         }
  53.         if (si != smin) {
  54.             sswap  = mat[si][0]; mat[si][0] = mat[smin][0]; mat[smin][0] = sswap;
  55.             sswap1 = mat[si][1]; mat[si][1] = mat[smin][1]; mat[smin][1] = sswap1;
  56.             sswap2 = mat[si][2]; mat[si][2] = mat[smin][2]; mat[smin][2] = sswap2;
  57.         }
  58.     }
  59.  
  60.     // mostrar as palavras ordenadas
  61.     printf("\n Ordem decrescente:\n");
  62.     for (int i=0; i< qtd; i++) {
  63.         for (int j = mat[i][0]; j < mat[i][1]; j++ ) { printf("%c",frase[j]); }
  64.             printf("\n");
  65.     }
  66.  
  67.     // loop para ler o vetor auxiliar. Aqui pode substituir pela leitura da pilha (pop)
  68.     printf("\n Frase original:\n");
  69.     for (int j=0; j<lim; j++) { printf("%c", aux[j]); }
  70.     return 0;
  71. }
  72.  
RAW Paste Data