Pesquisar este blog

Livros Recomendados

terça-feira, 2 de fevereiro de 2021

URI (BEECROWD) - 1287 - Processador Amigável de Inteiros - Strings - C e C++

Resolvi o problema Processador Amigável de Inteiros de formas um pouco diferentes. Tenho duas soluções em C++ e uma em C e trago aqui para compartilhar com vocês. Caso tenham soluções diferentes, comentem!

Plataforma: URI (BEECROWD)

Problema1287

Enunciado:
Computadores estão presentes em uma porcentagem significante de casas pelo mundo e, como programadores, somos responsáveis por criar interfaces que todos possam usar. Interfaces de usuário precisam ser flexíveis de forma que se um usuário comete um erro não fatal, a interface ainda pode deduzir o que o usuário queria dizer. Sua tarefa é escrever um programa que processe um texto de entrada representando um inteiro, porém, como esta é uma interface de usuário, não seremos muito rígidos com o usuário: 1. Se o usuário digita a letra "O" ou "o", assumimos que ele queria digitar o número "0". 2. Se o usuário digita a letra "l", assumimos que ele queria digitar o número "1". 3. Vírgulas e espaços são permitidos, porém não são processados (são ignorados). Se, mesmo com as regras acima, o usuário não entrou um número não-negativo, imprima a string "error". Overflow (um valor maior que 2147483647) é considerado inválido e "error" deve ser impresso.

Linguagens: C e C++


Solução:

Código em C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char linha[55], resposta[55], novo[55];
    int i, k, j, flag, tamResposta;
    long long int saida;
    while (fgets(linha, 55, stdin) != NULL) {
        flag = 0;
        tamResposta = 0;
        for (i = 0, k = 0; i < strlen(linha); i++) {
            if (linha[i] < 48 || linha[i] > 57 ) {
                if (linha[i] == 'o' || linha[i] == 'O') {
                    resposta[k] = '0';
                    k++;
                }
                else if (linha[i] == 108) {
                    resposta[k] = '1';
                    k++;
                }
                else if (linha[i] != 44 && linha[i] != 32 && linha[i] != 10) {
                    flag = 1;
                    break;
                }
            }
            else {
                resposta[k] = linha[i];
                k++;
            }
        }
        for (i = 0; resposta[i] == '0'; i++);

        for (i = 0, j = 0; i < k; i++) {
            if (resposta[i] > 47 && resposta[i] < 58) {
                tamResposta++;
                novo[j] = resposta[i];
                j++;
            }
        }

        saida = atoll(novo);
        if (flag || saida > 2147483647LL || saida < 0 || tamResposta < 1)
            printf("error\n");
        else if (saida == 0)
            printf("0\n");
        else {
            printf("%lld\n", saida);
        }
        memset(resposta, 0, sizeof resposta);
        memset(novo, 0, sizeof novo);
    }
    return 0;
}

Código em C++:

Mesma solução acima.

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int main() {
    char linha[55], resposta[55], novo[55];
    int i, k, j, flag, tamResposta;
    long long int saida;
    while (fgets(linha, 55, stdin) != NULL) {
        flag = 0;
        tamResposta = 0;
        for (i = 0, k = 0; i < strlen(linha); i++) {
            if (linha[i] < 48 || linha[i] > 57 ) {
                if (linha[i] == 'o' || linha[i] == 'O')
                    resposta[k] = '0';
                else if (linha[i] == 108)
                    resposta[k] = '1';
                else if (linha[i] != 44 && linha[i] != 32 && linha[i] != 10) {
                    flag = 1;
                    break;
                }
            }
            else
                resposta[k] = linha[i];
            k++;
        }
        for (i = 0, j = 0; i < k; i++) {
            if (resposta[i] > 47 && resposta[i] < 58) {
                tamResposta++;
                novo[j] = resposta[i];
                j++;
            }
        }
        saida = atoll(novo);
        if (flag || saida > 2147483647LL || saida < 0 || tamResposta < 1)
            cout << "error" << endl;
        else
            cout << saida << endl;
        memset(resposta, 0, sizeof resposta);
        memset(novo, 0, sizeof novo);
    }
    return 0;
}

Solução alternativa em C++:

Cada linha lida é percorrida da esquerda para a direita, substituindo as letras pelo número correspondente. Caso nenhuma das letras ou números permitidos (ou espaço e vírgula) sejam escritos, então é gerado um sinal de erro. Caso contrário, um número vai sendo gerado. Ao final, é verificado se o número está no limite permitido, onde é impresso o valor final ou uma mensagem de erro.

 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <string> 
 
using namespace std;

int main() {
 string line;
 while(getline(cin,line)){
  int digits = 0;
  long long max = 2147483647;
  string number = "";
  bool error = false;
  if(line.length()==0) error = true;
  else {
   for(int i=0;i<line.length();i++){
    //cout << number << endl;
    if(line[i]=='O' or line[i]=='o') line[i]='0';
    if(line[i]=='l') line[i]='1';
    if(line[i]>='0' and line[i]<= '9'){
     if(line[i]=='0'){
      if(number.length()>0){
       number += line[i];
      }
      else{
       digits++;
      }
     }
     else{
      number += line[i];
      digits++;
     }
    }
    else if(line[i]!=' ' and line[i]!=',')
     error = true;
    if(error) break;
   }
  }
  if(digits>0 and number.length()==0)number = '0';
  if(number.length()>10) error = true;
  string::size_type sz;
  long long number_final = atoll(number.c_str());
  if(number_final > max) error = true;
  if(error or digits==0) cout << "error" <<endl;
  else cout << number_final << 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