Jump to content

signos


polska

Recommended Posts

Boas pessoal, preciso da vossa ajuda aqui para um problema 😁 , é o seguinte.

O problema consiste em dado um ano juliano, que pode variar entre -5000 a 5000, devolver o signo correspondente desse ano (o signo chinês ... Ou seja, dado 2010, seria devolvido tigre .

Os signos chineses são 12, rato, boi, tigre, coelho, dragao, serpente, cavalo, carneiro, macaco, galo, cao, e porco (pela respectiva ordem) , e temos esta pequena nota :

É de notar que que os romanos desconheciam o zero e como tal nunca existiu um ano zero (o que deu origem mais tarde a imensos mal entendidos sobre se o ano 2000 seria o início do século XXI).

exemplos:

2010

tigre

2012

dragao

2007

porco

Este é o meu prog:

#include <iostream>
using namespace std;
int valor(int vezes){
int ano(0);
while(vezes!=0){
 ano++;
 vezes--;
 if(ano==12)
  ano=0;
}
return ano;
}
int main(){
int ano,r;
char animais[13][10]={" ","rato","boi","tigre","coelho","dragao","serpente","cavalo","carneiro","macaco","galo","cao","porco"};
cin >> ano;
r=valor(ano);
cout << animais[r] << endl ;
return 0;
}

O que eu pensei foi em ir aumentando uma variável até o ano que o utilizador introduzisse (Ex:2012) chegasse a 0, depois, retornava essa variável e imprimia o animal correspondente, que se encontram na matriz animais..

Mas o programa não está correcto, e eu não conssigo encontrar a solução xD . O meu prog para 2012 dá serpente (6) , e para 2012 dá carneiro (8) ... Alguém me conssegue ajudar? 👍

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Usa o resto da divisão inteira para achares o signo.

Para resolveres o problema para os números negativos, o ideal, no teu caso, pode ser indexares o ano mais negativo a zero, calculares o signo correspondente a esse ano, e seguires a ordem a partir daí.

int signo = (ano_inserido - ano_minimo) % numero_de_signos;

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

como é que para o mesmo número (2012) dá dois resultados diferentes ???

Enganei-me, para 2010 é serpente, e para 2012 carneiro 👍

Usa o resto da divisão inteira para achares o signo.

Para resolveres o problema para os números negativos, o ideal, no teu caso, pode ser indexares o ano mais negativo a zero, calculares o signo correspondente a esse ano, e seguires a ordem a partir daí.

int signo = (ano_inserido - ano_minimo) % numero_de_signos;

Ano mínimo? Estas a dizer o 1 ? (visto que 0 não conta) . É que se for, não funciona, eu fiz (2012-1)%12 e deu 7, mas tem de dar 3 (tigre) .

Já agora, podes explicar melhor a parte dos números negativos? não percebi bem o que queres dizer com indexar.. 🙂

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Pah, pronto, indexas os teus signos para um determinado ano, e depois utilizas esse ano como ano de controlo para os restantes. Basicamente é o seguinte (para facilitar vou só escrever letras em vez de signos):

char *signos[] = {"boi", "vaca", "rato", "cobra"};

// para manter o número de signos que tens no array sem
// precisares de estar a actualizar quando alteras o array
int num_de_signos = sizeof(signos)/sizeof(char*);

int ano_indice = 2012; // significa que o ciclo (re)começa em 2012 (boi)

//...

int signo_id = (ano_inserido - ano_indice) % num_de_signos;

if (signo_id < 0) signo_id += num_de_signos;
// o resto da divisão de um número negativo dá negativo,
// tens que somar o número de signos para obteres o indice correcto

printf("O signo do ano %d é %s\n", ano_inserido, signos[signo_id]);

O que acontece é que, como tens um ciclo de signos, só tens que calcular uma posição consecutiva. Daí que isto funcione perfeitamente:

ano = 1 -> 1 % 4 = 1 (vaca)

ano = 2 -> 2 % 4 = 2 (rato)

ano = 3 -> 3 % 4 = 3 (cobra)

ano = 4 -> 4 % 4 = 0 (boi)

ano = 5 -> 5 % 4 = 1 (vaca)

...

Para resolveres a questão da não existência do ano zero, tens que ter a condição que soma um ano, caso o utilizador insira um ano negativo, e que falhe caso insira zero:

if (ano_inserido < 0) ano_inserido++; // repara que no printf anterior o ano deixa de estar correcto
else if (ano_inserido == 0) { printf("fail\n"); return; }

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Pah, pronto, indexas os teus signos para um determinado ano, e depois utilizas esse ano como ano de controlo para os restantes. Basicamente é o seguinte (para facilitar vou só escrever letras em vez de signos):

char *signos[] = {"boi", "vaca", "rato", "cobra"};

// para manter o número de signos que tens no array sem
// precisares de estar a actualizar quando alteras o array
int num_de_signos = sizeof(signos)/sizeof(char*);

int ano_indice = 2012; // significa que o ciclo (re)começa em 2012 (boi)

//...

int signo_id = (ano_inserido - ano_indice) % num_de_signos;

if (signo_id < 0) signo_id += num_de_signos;
// o resto da divisão de um número negativo dá negativo,
// tens que somar o número de signos para obteres o indice correcto

printf("O signo do ano %d é %s\n", ano_inserido, signos[signo_id]);

O que acontece é que, como tens um ciclo de signos, só tens que calcular uma posição consecutiva. Daí que isto funcione perfeitamente:

ano = 1 -> 1 % 4 = 1 (vaca)

ano = 2 -> 2 % 4 = 2 (rato)

ano = 3 -> 3 % 4 = 3 (cobra)

ano = 4 -> 4 % 4 = 0 (boi)

ano = 5 -> 5 % 4 = 1 (vaca)

...

Para resolveres a questão da não existência do ano zero, tens que ter a condição que soma um ano, caso o utilizador insira um ano negativo, e que falhe caso insira zero:

if (ano_inserido < 0) ano_inserido++; // repara que no printf anterior o ano deixa de estar correcto
else if (ano_inserido == 0) { printf("fail\n"); return; }

Obrigado 👍

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.