Advertisement
Guest User

Untitled

a guest
Apr 10th, 2020
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <ostream>
  4. #include <math.h>
  5.  
  6. using namespace std;
  7.  
  8. int tamanhoString(string texto)
  9. {
  10.     int i = 0;
  11.     while (texto[i] != 0)
  12.     {
  13.         i++;
  14.     }
  15.     return i;
  16. }
  17.  
  18. int numPalavras(string texto, char delimitador)
  19. {
  20.     int num_palavras = 0;
  21.     for (int i = 0; i < tamanhoString(texto); i++)
  22.     {
  23.         if (i == 0)
  24.         {
  25.             num_palavras = 0;
  26.         }
  27.         else if (((texto[i] == delimitador) && (texto[i - 1] != delimitador)) || ((i == tamanhoString(texto) - 1) && (texto[i] != delimitador)))
  28.         {
  29.  
  30.             num_palavras++;
  31.         }
  32.     }
  33.     return num_palavras;
  34. }
  35.  
  36. void split(string texto, string palavras[], char delimitador)
  37. {
  38.     int num_palavras = numPalavras(texto, delimitador);
  39.  
  40.  
  41.  
  42.     string temp = "";
  43.     int contador = 0;
  44.     for (int i = 0; i < tamanhoString(texto); i++)
  45.     {
  46.         if ((texto[i] != delimitador) && (i != tamanhoString(texto) - 1))
  47.         {
  48.             temp = temp + texto[i];
  49.         }
  50.         else if ((i != 0) && (texto[i] == delimitador) && (texto[i - 1] != delimitador))
  51.         {
  52.             palavras[contador] = temp;
  53.             contador++;
  54.             temp = "";
  55.         }
  56.         else if ((i == tamanhoString(texto) - 1) && (texto[i] != delimitador))
  57.         {
  58.             temp = temp + texto[i];
  59.             palavras[contador] = temp;
  60.             temp = "";
  61.             contador = 0;
  62.         }
  63.     }
  64.  
  65. }
  66.  
  67. int numLinhas(int totalPalavras, double quebras[])
  68. {
  69.     int i;
  70.     int j = totalPalavras;
  71.     int num_linhas = 0;
  72.     while (j > 0)
  73.     {
  74.         i = quebras[j - 1];
  75.         num_linhas++;
  76.         j = i;
  77.     }
  78.     return num_linhas;
  79. }
  80. int tamanhoItens(string palavras[], int num_palavras)
  81. {
  82.     int tamanho = 0;
  83.     for (int i = 0; i < num_palavras; i++)
  84.     {
  85.         tamanho += tamanhoString(palavras[i]);
  86.     }
  87.     return tamanho;
  88. }
  89.  
  90. string alinhaTexto(string texto, int larguraLinha, int ultimaLinhaParagrafo)
  91. {
  92.     string* palavras = new string[numPalavras(texto, ' ')];
  93.     string resposta = "";
  94.     int contaEsquerda;
  95.     int num_itens = numPalavras(texto, ' ');
  96.     split(texto, palavras, ' ');
  97.     for (int i = 0; i < num_itens - 1; i++)
  98.     {
  99.         palavras[i] += ' ';
  100.     }
  101.     if (!ultimaLinhaParagrafo)
  102.     {
  103.         contaEsquerda = larguraLinha - tamanhoItens(palavras, num_itens);
  104.         while ((contaEsquerda > 0) && (num_itens > 1))
  105.         {
  106.             for (int i = 0; i < num_itens - 1; i++)
  107.             {
  108.                 palavras[i] += ' ';
  109.                 contaEsquerda--;
  110.                 if (contaEsquerda < 1)
  111.                 {
  112.                     break;
  113.                 }
  114.             }
  115.         }
  116.     }
  117.     for (int i = 0; i < num_itens; i++)
  118.     {
  119.         resposta += palavras[i];
  120.     }
  121.     return resposta;
  122.  
  123. }
  124.  
  125. int contarN(string texto) {
  126.     int contador2 = 0;
  127.     for (int i = 0; i <= tamanhoString(texto); i++) {
  128.         if ((i != tamanhoString(texto)) && (texto[i] == '<' && texto[i + 1] == 'n')) {
  129.             contador2++;
  130.             i = i + 2;
  131.         }
  132.     }
  133.     return contador2;
  134. }
  135.  
  136. void criarLinhas(string linha[], string texto) {
  137.     int contador = 0;
  138.     for (int i = 0; i <= tamanhoString(texto); i++) {
  139.         if ((i != tamanhoString(texto)) && (texto[i] == '<' && texto[i + 1] == 'n')) {
  140.             contador++;
  141.             i += 2;
  142.         }
  143.         else {
  144.             linha[contador] += texto[i];
  145.         }
  146.  
  147.     }
  148.  
  149. }
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156. string justificar2(string texto, int larguraLinha) {
  157.     string textoJustificado = "";
  158.     string* palavras = new string[numPalavras(texto, ' ')];
  159.     split(texto, palavras, ' ');
  160.     int totalPalavras = numPalavras(texto, ' ');
  161.     int** espacoVazio = new int* [totalPalavras];
  162.     for (int i = 0; i < totalPalavras; i++)
  163.         espacoVazio[i] = new int[totalPalavras];
  164.  
  165.     for (int i = 0; i < totalPalavras; i++)
  166.     {
  167.         espacoVazio[i][i] = larguraLinha - tamanhoString(palavras[i]);
  168.         for (int j = i + 1; j < totalPalavras; j++)
  169.         {
  170.             espacoVazio[i][j] = espacoVazio[i][j - 1] - tamanhoString(palavras[j]) - 1;
  171.         }
  172.  
  173.     }
  174.     double* minima = new double[totalPalavras + 1];
  175.     double* quebras = new double[totalPalavras];
  176.     double custo;
  177.     minima[0] = 0;
  178.     for (int i = 1; i <= totalPalavras; i++)
  179.     {
  180.         minima[i] = pow(10, 20);
  181.     }
  182.     for (int i = 0; i < totalPalavras; i++)
  183.     {
  184.         quebras[i] = 0;
  185.     }
  186.     int i = 0;
  187.     for (int j = 0; j < totalPalavras; j++)
  188.     {
  189.         i = j;
  190.         while (i >= 0)
  191.         {
  192.             if (espacoVazio[i][j] < 0)
  193.             {
  194.                 custo = pow(10, 10);
  195.             }
  196.             else
  197.             {
  198.                 custo = minima[i] + pow(espacoVazio[i][j], 2);
  199.             }
  200.             if (minima[j + 1] > custo)
  201.             {
  202.                 minima[j + 1] = custo;
  203.                 quebras[j] = i;
  204.             }
  205.             i--;
  206.  
  207.         }
  208.  
  209.     }
  210.     string* linhas = new string[numLinhas(totalPalavras, quebras)];
  211.     int contador = 0;
  212.     int j = totalPalavras;
  213.     while (j > 0)
  214.     {
  215.         i = quebras[j - 1];
  216.         for (int k = i; k < j; k++)
  217.         {
  218.             if (k != j - 1)
  219.             {
  220.                 linhas[contador] = linhas[contador] + palavras[k] + ' ';
  221.             }
  222.             else
  223.             {
  224.                 linhas[contador] = linhas[contador] + palavras[k];
  225.             }
  226.         }
  227.         contador++;
  228.         j = i;
  229.     }
  230.     string* temp = new string[contador];
  231.     for (int i = 0; i < contador; i++)
  232.     {
  233.         temp[(contador - 1) - i] = linhas[i];
  234.     }
  235.     for (int i = 0; i < contador; i++)
  236.     {
  237.         linhas[i] = temp[i];
  238.     }
  239.     for (int k = 0; k < contador; k++)
  240.     {
  241.         textoJustificado = textoJustificado + "\n" + alinhaTexto(linhas[k], larguraLinha, 0);
  242.     }
  243.     return textoJustificado;
  244. }
  245.  
  246.  
  247.  
  248. string justificar(string texto, int larguraLinha)
  249. {
  250.     int numeroN = contarN(texto);
  251.     string* linhasSemN = new string[numeroN + 1];
  252.     criarLinhas(linhasSemN, texto);
  253.     string real = "";
  254.     for (int i = 0; i < numeroN; i++) {
  255.         if (i <= numeroN - 1) {
  256.             real += justificar2(linhasSemN[i], larguraLinha) + "\n";
  257.         }
  258.         else {
  259.             real += justificar2(linhasSemN[i], larguraLinha);
  260.         }
  261.     }
  262.     return real;
  263. }
  264.  
  265.  
  266.  
  267. int main()
  268. {
  269.     string texto = "Seja Bem vindo ao 'Soul of Pirates Online'.<n> Você acaba de embarcar em um Mundo conhecido como Orisord, um lugar repleto de criaturas místicas, tesouros e segredos que o aguardam para grandes aventuras.<n> Sua jornada se inicia em uma cidade...";
  270.     int larguraLinha = 38;
  271.     cout << contarN(texto);
  272.     cout << justificar(texto, larguraLinha);
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement