Ir ao conteúdo
  • Cadastre-se

VisualG Idade de uma pessoa em números romanos (algoritmos romanos)


Posts recomendados

@Pablo.Mascarenhas    os números Romanos são compostos  por Letras ,  sendo assim você vai precisar converter os números em caracteres de Letras maiúsculas ,  e uma forma de fazer a conversão seria colocando os "Romanos"  em um vetor de pesquisar ,   e depois que você fizer um código sobre esse exercício , poste ele aqui e ajudaremos se ainda precisar   .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • mês depois...

Boa noite pessoal!

 

...Tentei aqui, mas deu problema. Apareceu até a linha que deu erro, mas vou postar o código completo pra vocês apontarem as falhas por favor:

 

Algoritmo "Calcular Idade em Romano"
Var
   nome: caractere
   data_nascimento: caractere
Inicio
   escreva("Digite o nome completo do aluno(a): ")
   leia(nome)
   escreva("Digite a data de nascimento completa do aluno(a) (DD/MM/AAAA): ")
   leia(data_nascimento)
   idade_romana <- calcular_idade_romana(nome, data_nascimento)
   escreva(idade_romana)
   Fim
Funcao calcular_idade_romana(nome: caractere, data_nascimento: caractere): caractere
Var
   data_nascimento_datetime: data
   idade: inteiro
   idade_romana: caractere
Inicio
   data_nascimento_datetime <- converte_data(data_nascimento)
   idade <- calcular_idade(data_nascimento_datetime)
   idade_romana <- converter_para_romano(idade)
   retorne nome + ", " + idade_romana
FimFuncao
Funcao converte_data(data_nascimento: caractere): data
Var
   dia, mes, ano: inteiro
Inicio
   dia <- inteiro(Substring(data_nascimento, 1, 2))
   mes <- inteiro(Substring(data_nascimento, 4, 2))
   ano <- inteiro(Substring(data_nascimento, 7, 4))
   retorne data(dia, mes, ano)
FimFuncao
Funcao calcular_idade(data_nascimento: data): inteiro
Var
   data_atual: data
   idade_dias: inteiro
   idade_anos: inteiro
Inicio
   data_atual <- hoje()
   idade_dias <- difDias(data_atual, data_nascimento)
   idade_anos <- idade_dias / 365
   retorne idade_anos
FimFuncao
Funcao converter_para_romano(numero: inteiro): caractere
Var
   valores: vetor[1..13] de inteiro = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
   letras: vetor[1..13] de caractere = ["M", "CM", "D", "CD", "C"]
fimalgoritmo

 

Sim, deu erro nesta linha aqui:

 

Funcao calcular_idade_romana(nome: caractere, data_nascimento: caractere): caractere

 

Aguardo uma luz, pois quero muito aprender a programar e esses exercícios de fixação ajudam pra caramba!

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Olá novamente.

 

Tô esquentando, mas tô me batendo com uma variável que o VisualG parece não ter ou não estou sabendo encontrar a certa: AnoAtual.

 

Ele não puxa essa data, daí o programa informa um erro. Aqui, o que consegui fazer até então:

----------------------------------------------------------------------------------------------------------------------------------------------------

Algoritmo "Idade em algarismos romanos"
//
//
Var
   datanascimento: inteiro
   dia: inteiro
   mes: inteiro
   ano: inteiro
   idade: inteiro
   idaderomana: caractere
Inicio
   Escreval("Digite seu dia de nascimento (dd): ")
   Leia(dia)
   Escreval("Digite seu mes de nascimento (mm): ")
   Leia(mes)
   Escreval("Digite seu ano de nascimento (aaaa): ")
   Leia(ano)
   // Calcula a idade com base na data atual
   idade <- AnoAtual - ano
   Se mes > MesAtual Ou (mes = MesAtual E dia > DiaAtual) então
      idade <- idade - 1
   FimSe
   idaderomana <- ""

   // Converte a idade em algarismos romanos
   Se idade >= 100 então
      idaderomana <- "C"
      idade <- idade - 100
   FimSe
   Se idade >= 90 então
      idaderomana <- idaderomana + "XC"
      idade <- idade - 90
   FimSe

   Se idade >= 50 então
      idaderomana <- idaderomana + "L"
      idade <- idade - 50
   FimSe
   Se idade >= 40 então
      idaderomana <- idaderomana + "XL"
      idade <- idade - 40
   FimSe

   Enquanto idade >= 10 Faca
      idaderomana <- idaderomana + "X"
      idade <- idade - 10
   FimEnquanto
   Se idade >= 9 então                                  Se idade >= 4 então
      idaderomana <- idaderomana + "IV"
      idade <- idade - 9
   FimSe
   Se idade >= 5 então
      idaderomana <- idaderomana + "V"
      idade <- idade - 5
   FimSe
   Se idade >= 4 então
      idaderomana <- idaderomana + "IV"
      idade <- idade - 4
   FimSe
   Enquanto idade >= 1 Faca
      idaderomana <- idaderomana + "I"
      idade <- idade - 1
   FimEnquanto
   Escreva("Sua idade é ", AnoAtual - ano, " anos, ou ", idaderomana, " em algarismos romanos.")
Fimalgoritmo

 

----------------------------------------------------------------------------------------------------------------------------------------------------

Aguardo uma orientação.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Desculpe pera demora.

 

Em 17/04/2023 às 22:31, Bruno Pz disse:

Tô esquentando, mas tô me batendo com uma variável que o VisualG parece não ter ou não estou sabendo encontrar a certa: AnoAtual.

 

Rodei o código. Olha o erro:

image.png

 

Aí vai lá na linha 19. Tem esse conteúdo que foi citado.

 

Tá, onde essa variável AnoAtual foi declara?

Resposta: a princípio não é uma "variável de sistema", ou seja, que o próprio VisualG cria sozinho (exemplo: pi já tá lá. Tem o valor "3.14159265358979"). Logo, você estaria tentando usar uma variável que não foi criada OU digitou a nomenclatura errada por engano. (Parece ser o primeiro caso.)


Basta declarar a variável e ajustar o código..... e testando e ajustando...

 

Uma dica geral que dou (lá ele) é: vá fazendo o algoritmo aos poucos, e ao mesmo tempo vá fazendo testes. Exemplo:

 

algoritmo "Idade em algarismos romanos"
var
   dia, mes, ano: inteiro
   diaAtual, mesAtual, anoAtual: inteiro
   idade: inteiro

inicio
   escrevaL("Digite seu dia de nascimento (dd): ")
   leia(dia)
   escrevaL("Digite seu mes de nascimento (mm): ")
   leia(mes)
   escrevaL("Digite seu ano de nascimento (aaaa): ")
   leia(ano)

   escrevaL("Digite o dia atual de nascimento (dd): ")
   leia(diaAtual)
   escrevaL("Digite mes atual de nascimento (mm): ")
   leia(mesAtual)
   escrevaL("Digite ano atual de nascimento (aaaa): ")
   leia(anoAtual)

   // Calcula a idade com base na data atual
   idade <- AnoAtual-ano
     
   escrevaL(idade)
fimAlgoritmo

 

Inseri a data da atual Constituição do Brasil e a data de hoje, respectivamente:

 

image.png

 

funcionou.

 

Pronto... "tenho uma noção que o cálculo da data parece está funcionando".  Depois avança para um outro teste. Exemplo:

 

Inserir e testar o trecho que calcular "se já comemorou aniversário no ano atual".

   se ((mes > mesAtual) OU ((mes = mesAtual) E (dia > diaAtual))) então
      idade <- idade-1
   fimSe

 

Vai fazendo os testes e ajustando...

 

Depois insere uma nova coisa... vai inserindo (lá ele) e testando.

 

 

 

Dica 1: a sugestão é fazer a maior quantidade de testes possíveis. A medida que vai pegando a prática, vai diminuindo os testes. Outro ponto bacana é que vai também parando para "otimizar" esses testes, exemplo:

 

 

 

image.png

 

Ora! Essa data será sempre a mesma. Inclusive pode fazer o mesmo para data do nascimento, ou seja, colocar datas fixas para testa o resultado por extenso, entende? Aí fica focando apenas em ajustar o resultado.. depois altera os valores no código para testar outras possibilidades... só deixar para "ler do teclado" quando o código tiver mais maduro.

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Opa, boa noite!

 

Então, meio que abandonei o Portugol porque nosso professor começou a nos jogar C e estou aprendendo muita coisa nesta linguagem. Daí consegui rodar um código que faz exatamente o que vcs estão pedindo. Aqui está:

#include <stdio.h>
#include <time.h>

int main(void) 
{
    char nome[100];
    int dia, mes, ano;
    int idade;
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);

    printf("Digite o nome completo do aluno(a): ");
    fgets(nome, 100, stdin);

    printf("Digite a data de nascimento (dd mm aaaa): ");
    scanf("%d %d %d", &dia, &mes, &ano);

    idade = tm.tm_year + 1900 - ano;
    if (tm.tm_mon + 1 < mes || (tm.tm_mon + 1 == mes && tm.tm_mday < dia)) {
        idade--;
    }

    printf("Nome: %s", nome);
    printf("Idade: ");

    while (idade >= 100) {
        printf("C");
        idade -= 100;
    }
    if (idade >= 90) {
        printf("XC");
        idade -= 90;
    }
    if (idade >= 50) {
        printf("L");
        idade -= 50;
    }
    if (idade >= 40) {
        printf("XL");
        idade -= 40;
    }
    while (idade >= 10) {
        printf("X");
        idade -= 10;
    }
    if (idade == 9) {
        printf("IX");
        idade -= 9;
    }
    if (idade >= 5) {
        printf("V");
        idade -= 5;
    }
    if (idade == 4) {
        printf("IV");
        idade -= 4;
    }
    while (idade > 0) {
        printf("I");
        idade--;
    }

    return 0;
}

 

Caso esteja faltando algo, por favor, me avisem. A indentação não está lá essas coisas, mas creio que dá pro gasto. 🙂

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Bruno Pz, me parece que ficou tudo certinho! Muito bom!

 

Adendo: apenas o detalhe que dá BO se tiver mais 400 anos ou se nasceu no ano corrente (idade 0). 😄

 

Adendo 2: como observável, a lógica independe da linguagem. O que muda aí é que o C teve estruturas que facilitaram/aprimoraram o algoritmo, por exemplo, com a coleta da "data" atual.

 

Não programo em C, mas vou tentar explicar o que eu entendi da estrutura:

 

Em 28/05/2023 às 18:13, Bruno Pz disse:
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);

 

O time() retorna o "dados de data atual" em determinado formato. O "localtime() usa a hora apontada pelo timer para preencher a variável tm com os valores que representam a data/hora correspondente passada pelo parâmetro", ou seja, foi declarado a variável tm (o C permite e eventualmente resolveu utilizar a mesma nomenclatura da struct. Poderia ser outra!), que por sua vez é do tipo (struct) tm (algo nativo de alguma biblioteca)... e na mesma linha já definiu que seu valor vai ser igual ao retorno do tal localtime(). Portanto, a variável tm terá em si os dados de data/hora preenchidos, assim posteriormente podendo coletar o ano, mês e dia de forma mais simples (acessando os campos da struct da variável).

 

a struct tm teria essa estrutura:

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */	
};

 

Só para deixar mais claro... segue o exemplo:

    time_t t = time(NULL);
    struct tm nome_que_eu_quiser_incluse_tm;
    nome_que_eu_quiser_incluse_tm = *localtime(&t);

    printf("Digite o nome completo do aluno(a): ");
    fgets(nome, 100, stdin);

    printf("Digite a data de nascimento (dd mm aaaa): ");
    scanf("%d %d %d", &dia, &mes, &ano);

    idade = nome_que_eu_quiser_incluse_tm.tm_year + 1900 - ano;
    if (nome_que_eu_quiser_incluse_tm.tm_mon + 1 < mes 
       || (nome_que_eu_quiser_incluse_tm.tm_mon + 1 == mes && nome_que_eu_quiser_incluse_tm.tm_mday < dia)) {
        idade--;
    }

 

Observem que isso:

    struct tm nome_que_eu_quiser_incluse_tm;
    nome_que_eu_quiser_incluse_tm = *localtime(&t);

 

foi para exemplificar que é a mesma coisa que isso:

struct tm nome_que_eu_quiser_incluse_tm = *localtime(&t);

 

Quem puder me corrigir/complementar em algo, também agradeço.

 

Adendo 3: o Portugol seria apenas uma forma de "pescar" os estudantes... utilizando do nosso idioma como chamariz. Passou um pouquinho do nível iniciante, melhor coisa é partir para algo mais avançado e robusto mesmo! 🙂

 

Como observável, tirando a parte da "coleta da data atual", que não é especificamente trivial os detalhes, o restante é basicamente a mesma coisa, só mudando a sintaxe dos comando (de português para inglês e com formas e ordem divergentes). Só isso. Em relação ainda à parte da data, também não tem mistério.. seria só "como pego a data atual do sistema em C?". Daí só "copiar" a estrutura! Ninguém precisaria dominar os detalhes em C ou qualquer outra linguagem para utilizar recursos... o que tentei explicar/comentar acima, seria apenas uma forma de tentar "aprofundar" e entender mais ou menos como funcionaria as coisas... mas se não quisesse entender detalhes, também seria de boa.. apenas precisa entender lá na parte de usar os campos do tm. Tipo:

 

 

Saber como isso funciona não é tão relevante (mais é interessante):

 

Em 28/05/2023 às 18:13, Bruno Pz disse:
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);

 

Pois podem-se abstrair e saber que pode fazer isso:

 

idade = tm.tm_year + 1900 - ano;

 

Ou seja: o que "me importa" é que vou ter uma variável que nela tem esses dados de data que preciso.

 

Ah! só para finalizar essa questão da abstração, seria algo como:

 

struct tm tm = *localtime(&t);

 

Esse struct tm seria como se fosse um tipo em si... como se fosse algo assim: 

 

int tm = *localtime(&t);

 

Espero que não tenha viajado d+... 😄

 

Link para o comentário
Compartilhar em outros sites

  • Simon Viegas alterou o título para Idade de uma pessoa em números romanos (algoritmos romanos)

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!