1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Para quem gosta de desafios

Discussão em 'Programação' iniciada por kropok, 14 de Abril de 2008. (Respostas: 13; Visualizações: 1289)

  1. Recentemente o meu professor de programação lançou um desafio à turma em que consiste fazer
    um programa em que pede a data actual ao utilizador e o programa diz quantos dias passaram
    desde o inicio do ano até a data actual.
    Fazer só isto é muito simples, o problema é que o meu prof disse que era possível fazer isto num
    único ciclo "for", ou seja, tem que pedir um numero ao utilizador e fazer os cálculos dentro do do
    ciclo.

    Eu já tentei fazer mas sem sucesso :(
    Será que alguém sabe fazer isto?

    AH... eu ando a programar em C++ no entanto também pode ser C.
     
  2. Nesse ciclo contas todos os dias em meses anteriores (no caso do dia de hoje Janeiro, Fevereiro e Março)
    e depois somas a esse valor o dia actual (14). ;)
     
  3. arkannis

    arkannis Power Member

    De uma maneira mais bruteforce consegues fazer isso sem ciclo até.
    numeroDoMes -> Numero do mês da data fornecida pelo user
    diaDoMes -> Numero do dia da data fornecida pelo user

    Código:
    int dias = 0;
    switch(numeroDoMes - 1) {
    case 11: dias += 30;
    case 10: dias += 31;
    case 9: dias += 30;
    (...)
    case 1: dias += 31;
    }
    dias += diaDoMes;
    
    Quase que acaba por ser uma especie de ciclo... sem usar um ciclo!
     
  4. doginthefog

    doginthefog Power Member

    A solução parece-me boa, mas queria só deixar um reparo: o que é isso de "maneira mais bruteforce"? Bruteforce seria teres aí uns ciclos a testarem todas as hipóteses de solução do problema até encontrarem a verdadeira solução (o exemplo paradigmático de técnicas "bruteforce" é o de quebrar passwords, em que testas todas as combinações).

    Isso de "bruteforce" não tem nada! Se calhar o que querias dizer é que o código não parece tão elegante (talvez porque dê uma ideia de programação com "gotos")...

    Uma possível solução na minha opinião seria passar pela biblioteca time.h.. outra seria (se percebi correctamente) ter um array com os vários dias do mês e fazer o ciclo percorrer o array, somando o conteúdo.. depois seria só somar o dia do mês e ver se o ano é bissexto...

    kropok, por agora isto parece um grande desafio, mas vais ver que tudo é relativo ;)


    -edit-
    Esqueci-me de dizer que ainda há outra hipótese, que é tentar imitar as optimizações dos compiladores e se tentar fazer "loop-unrolling".. embora kropok, muito provavelmente o teu prof vai-te bater :p
     
    Última edição: 14 de Abril de 2008
  5. arkannis

    arkannis Power Member

    Sim utilizei mal o termo, não era bem isso que eu queria dizer, escusas de bater mais no ceguinho :P
    Queria dizer apenas "de uma maneira mais bruta", por estar a criar um caso para cada mês.
     
  6. slack_guy

    slack_guy Power Member

    Não te esqueças dos anos bissextos e dos dias em que muda a hora ;-)
     
    Última edição: 15 de Abril de 2008
  7. metralha761

    metralha761 1st Folding then Sex

    for (x=0,y=1,total=0;x == dia && y ==mes;x++,total++)
    {
    :arrow: if (x==31 && (y==1 || y==3 || y==5 || y==7 || y==8 || y==10 || y==12))
    :arrow: {
    :arrow: :arrow: x=0;
    :arrow: :arrow: y++;
    :arrow: }
    :arrow: if (x==30 && (y==4 || y==6 || y==9 || y==11))
    :arrow: {
    :arrow: :arrow: x=0;
    :arrow: :arrow: y++;
    :arrow: }
    :arrow: if (x==28 && y=2)
    :arrow: {
    :arrow: :arrow: x=0;
    :arrow: :arrow: y++;
    :arrow: }
    }

    So falta o algoritmo para saber se o ano é bisexto ou nao.
     
  8. Mavors

    Mavors Power Member

    Uma pequena ajuda para saber se o ano é bissexto:

    1- Todo ano divisível por 4 é bissexto
    2- Todo ano divisível por 100 não é bissexto
    3- Mas se o ano for também divisível por 400 é bissexto

    Adapta dp o seguinte à sintaxe da tua linguagem:

    if (((ano / 4 == 0) && (ano / 100 != 0)) || (ano / 400 == 0))
    return true;
    else
    return false;
     
  9. slack_guy

    slack_guy Power Member

  10. metralha761

    metralha761 1st Folding then Sex

    Para os anos bixestos usa-se o modolo ;)

    O mesmo é aplicado nos dias da semana.
     
  11. Uncle Sam

    Uncle Sam Power Member

    Só uma pergunta pessoal! O que faz aquilo que eu pus a negrito?

    Cumps
     
  12. magikRing

    magikRing Power Member

    for (x=0,y=1,total=0;x == dia && y ==mes;x++,total++)

    tens isto como ciclo for. entao o x=0 faz o 'reset' do x para ficar sempre a 0 asseguir a tua instrucao. e o y++ implementa mais 1 no y, ou seja o y por cada instrucao que passa va ficando: 2 3 4 5 etc...
     
  13. Syk3r

    Syk3r I quit My Job for Folding

    Além de que cada vez que o ciclo se repita, a variável total vai ser incrementada.
     
  14. metralha761

    metralha761 1st Folding then Sex

    O x é igual ao dia do mês e o y igual ao mês do ano.

    O total é os dias tds q ja passaram.

    Eu como nao testei nao sei se esta td correcto, mas agora q penso secalhar deve ser com x=1.

    Testa com 1 de fevereiro, tem de dar 32 dias se der 31 é pq ta errado e tens de alterar para x=1 em cada condição positiva.
     

Partilhar esta Página