Pesquisar este blog

Livros Recomendados

quarta-feira, 17 de fevereiro de 2021

URI (BEECROWD) - 1551 - Frase Completa - Strings - C e C++

Novamente um post com três soluções! Esse é mais um exercício da categoria Strings, ou seja, de alguma forma é necessário manipular os conjuntos de caracteres para se obter o aceite no exercício. O título desse exercício é "Frase Completa". Vamos conferir como se resolve este exercício? Confere mais abaixo nesse post!

Plataforma: URI (BEECROWD)

Problema1551

Enunciado:
Seu professor de português não para de trazer coisas novas para a sala, e hoje não foi diferente. Existe uma cidade, segundo seu professor, onde as pessoas levam muito a sério a forma como elas se comunicam. Em especial, quando duas pessoas estão conversando, elas pensam muito nas frases antes de dizê-las, de forma a garantir que tal frase seja uma “frase completa”, ou talvez uma “frase quase completa”. Considerando o nosso alfabeto de 26 letras, uma frase é dita “completa” quando ela contém todas as letras do alfabeto contidas nela. De modo semelhante, uma frase é dita “quase completa” se ela não é completa, porém contém ao menos metade das letras do alfabeto contidas nela. Quando uma frase não é “completa” e nem “quase completa”, ela é dita “mal elaborada”. Seu professor lhe deu uma tarefa muito difícil: dadas várias frases trocadas entre vários habitantes da cidade citada, diga em qual das categorias acima a frase se encaixa.

Linguagens: C e C++

Solução: Nas duas primeiras soluções, cria-se um array contendo todo alfabeto e percorre-se a linha lida comparando o caractere com cada letra do alfabeto, atribuindo 1 à posição do alfabeto (à letra) lida. Se todas as posições tiverem o valor 1 no final, significa que a frase é completa.

Código em C:

#include <stdio.h>
#include <string.h>
int main() {
    int n, total, i, j, tam, letras[26];
    char frase[1010];
    char alfabeto[27] = "abcdefghijklmnopqrstuvwxyz";
    scanf("%d ", &n);
    while (n--) {
        fgets(frase, 1010, stdin);
        tam = strlen(frase);
        memset(letras, 0, sizeof(letras));
        for (i = 0; i < tam; i++)
            for (j = 0; j < 26; j++)
                if (frase[i] == alfabeto[j])
                    letras[j] = 1;
        total = 0;
        for (i = 0; i < 26; i++)
            total += letras[i];
        printf("frase ");
        if (total == 26)
            printf("completa\n");
        else if (total > 12)
            printf("quase completa\n");
        else
            printf("mal elaborada\n");
    }
    return 0;
}

Código em C++:

Mesma lógica do código acima, mas utilizando diretamente o tipo string.

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    int n, total, i, tam, letras[26];
    string frase;
    string alfabeto = "abcdefghijklmnopqrstuvwxyz";
    cin >> n;
    cin.ignore();
    while (n--) {
        getline(cin, frase);
        tam = frase.size();
        memset(letras, 0, sizeof(letras));
        for (i = 0; i < 26; i++)
            if (frase.find(alfabeto[i]) < tam)
                letras[i] = 1;
        total = 0;
        for (i = 0; i < 26; i++)
            total += letras[i];
        cout << "frase ";
        if (total == 26)
            cout << "completa" << endl;
        else if (total > 12)
            cout << "quase completa" << endl;
        else
            cout << "mal elaborada" << endl;
    }
    return 0;
}

Solução alternativa em C++:

Todas as frases são percorridas, anotando as letras usadas em um vetor ocorrencias. Ao final, é verificado quantas letras foram usadas e são feitas as comparações para gerar o resultado final.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <map>
 
using namespace std;


int main() {
 int n;
 int ocorrencias[30];
 cin >> n;
 string line;
 getline(cin, line);
 for(int i=0;i<n;i++){
  for(int j=0;j<=26;j++){
   ocorrencias[j] = 0;
  }
  int letras_usadas = 0;
  getline(cin, line);
  for(int j=0;j<line.length();j++){
   if(line[j]!= ' ' and line[j]!=','){
    int letter = line[j]-'a';
    if(ocorrencias[letter] == 0){
     ocorrencias[letter] = 1;
     letras_usadas++;
    }
   }
  }
  if(letras_usadas==26) cout << "frase completa" << endl;
  else if(letras_usadas>=13) cout << "frase quase completa" << endl;
  else cout << "frase mal elaborada" << endl;
 }
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas