polska Posted June 7, 2012 at 10:14 PM Report Share #461267 Posted June 7, 2012 at 10:14 PM (edited) 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 June 7, 2012 at 10:15 PM 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 More sharing options...
HappyHippyHippo Posted June 7, 2012 at 11:18 PM Report Share #461272 Posted June 7, 2012 at 11:18 PM como é que para o mesmo número (2012) dá dois resultados diferentes ??? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
KTachyon Posted June 7, 2012 at 11:18 PM Report Share #461273 Posted June 7, 2012 at 11:18 PM 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 More sharing options...
polska Posted June 7, 2012 at 11:35 PM Author Report Share #461276 Posted June 7, 2012 at 11:35 PM (edited) 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 June 7, 2012 at 11:42 PM 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 More sharing options...
KTachyon Posted June 8, 2012 at 12:01 AM Report Share #461279 Posted June 8, 2012 at 12:01 AM 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 More sharing options...
polska Posted June 8, 2012 at 11:08 PM Author Report Share #461575 Posted June 8, 2012 at 11:08 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now