Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador 3140. Mostrar todas as postagens
Mostrando postagens com marcador 3140. Mostrar todas as postagens

quarta-feira, 24 de março de 2021

URI (BEECROWD) - 3140 - Copiando e Colando Código - Iniciante - C e C++

Plataforma: URI (BEECROWD)

Problema3140

Linguagens: C e C+.

Enunciado:

Durante a pandemia, com a suspensão temporária do calendário acadêmico na UFSC, Lucas tem aproveitado o tempo livre para fazer vários cursos online e aprender a usar novas tecnologias e bibliotecas de programação.

Recentemente ele participou de um bootcamp gratuito sobre o uso de Node.js e da biblioteca ReactJS e ficou apaixonado. Ele gostou tanto que ele decidiu portar um site que ele havia criado em HTML para esse novo formato.

Para sorte de Lucas, ele pode reaproveitar boa parte dos scripts em HTML, mas algumas partes deixam de ser necessárias, já que o Node.js e + ReactJS passam a gerá-las automaticamente. Como são vários arquivos para ele analisar e dar control+c, control+v nos códigos, ele gostaria da sua ajuda para agilizar o processo.

Dado um arquivo em HTML, você deve escrever um programa que retorne apenas o conteúdo que esteja entre as tags "<body>" e "</body>", todo resto deve ser ignorado.

Como o Lucas é um cara caprichoso, o código está devidamente indentado. Nas linhas de abertura e fechamento da tag body não há mais nada além da própria tag e os espaços de indentação.

Solução: Neste exercício era necessário reproduzir somente o que estava dentro do body de uma página HTML, ou seja, após o texto "<body>" e antes de "</body>", assumindo que a página foi criada dentro dos padrões da W3C. Nas duas soluções (C e C++) utilizei estruturas condicionais para procurar pelas expressões "<body>" e "</body>" e, quando encontrasse a primeira, escreveria o conteúdo até encontrar "</body>". Quando encontrasse o "</body>" a ação seria interromper, saindo do laço de repetição e encerrando o programa. Foi criada uma variável de controle que é alterada quando "<body>" é encontrado, assim o algoritmo sabe que pode imprimir o conteúdo. Veja abaixo as soluções.

Código em C

Enquanto houver conteúdo, lê da entrada padrão e testa se é a tag de fechamento. Se for, pula para o fim do programa. Se não for, testa se pode escrever, através da variável escreve. Ela funciona como uma flag e só terá seu valor alterado para 1 após encontrar "<body>". Então, cada linha será escrita. A comparaiçaõ entre os textos é feita com a função strstr, da biblioteca string.

#include <stdio.h>
#include <string.h>
int main() {
    char linha[1100];
    int escreve = 0;
    while (fgets(linha, sizeof(linha), stdin) != NULL) {
        if (strstr(linha, "</body>") != NULL)
            break;
        if (escreve)
            printf("%s", linha);
        if (strstr(linha, "<body>") != NULL)
            escreve = 1;
    }
    return 0;
}

Código em C++
:

A lógica do código é a mesma. Procura pela tag final, quando encontrar o programa é encerrado. Procura pela tag inicial (body), que ativa a variável de controle de escrita, permitindo assim escrever todas as tags que estão após o body. Isso será interrompido quando a tag de fechamento "</body>" for encontrada. A comparação de strings foi feita com o método find, da biblioteca string, importada na segunda linha do código.

#include <iostream>
#include <string>
using namespace std;
int main() {
    string linha, openTag = "<body>", closeTag = "</body>";
    bool escreve = false;
    while(getline(cin, linha)) {
        if (linha.find(closeTag) != string::npos)
            break;
        if (escreve)
            cout << linha << endl;
        if (linha.find(openTag) != string::npos)
            escreve = true;
    }
    return 0;
}

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