algoritmo (pseudo codigo)

p!nk.

Power Member
boas malta ... fui confrontado com um problema na faculdade, que me deixou a mim, e a toda a malta da turma bastante intrigado ... passo a citar o enunciado!!

Considere uma data correspondente ao mês e dia do ano corrente fornecida pelo utilizador. Escreva
um algoritmo que apresente a quantidade de dias que falta para o último dia do ano.


de notar, que nao podemos usar ciclos do tipo "for" .... apenas podemos usar decisoes para decifrar!! alguem tem uma luzinha a acender na cabeça?! :D:D

abraços!
 
boas malta ... fui confrontado com um problema na faculdade, que me deixou a mim, e a toda a malta da turma bastante intrigado ... passo a citar o enunciado!!

Considere uma data correspondente ao mês e dia do ano corrente fornecida pelo utilizador. Escreva
um algoritmo que apresente a quantidade de dias que falta para o último dia do ano.


de notar, que nao podemos usar ciclos do tipo "for" .... apenas podemos usar decisoes para decifrar!! alguem tem uma luzinha a acender na cabeça?! :D:D

abraços!

tens de usar as condiçoes para ver os meses que faltam até ao fim do ano, tens de ter vários, pois, tens vários tipos de meses, uns com 28 ou 29 dias, outros com 30, e outros com 31, tens de usar as condições para regular isso, depois outra para ver se é ano bissexto ou normal. Depois tens de através de outra condição ver que mês é a data actual, subtrair até ao fim do mês em questão e depois so tens de somar os os meses que faltam ate ao fim do ano(claro que o que vais somar sao os dias que cada mês tem.)


Espero ter ajudado, cumprimentos.
 
Dependendo da linguagem que uses pode ser mais ou menos facil.
Podes converter as duas datas para um timestamp subtrair e converter para dias.
Por exemplo, os sitemas *nix tratam as datas, creio eu, contando o numero de milisegundos desde uma determinada data inicial. Neste caso, basta fazer a diferenca e dividir por 86400000 para teres os dias.
 
pois .... mas isso, foi o que eu já pensei!!! mas nao me consigo "transcrever" para o papel ... esse pensamento!!! ...


tens de meter os dados de entrada com um "write("Escreva a data...", dia, mes, ano)
Se for mes 4,6 ou 7 entao temos 30 dias, se for 5 ou 8 tens 31 dias, e se for 2 tens 28 ou 29 dias. Se o ano a didivir por 4 der igual a 0 (penso eu, ja nao me lembro muito bem) entao tens um ano bissexto. entao o mesmo 2 tem 29 dias. Depois é so subtraires os dias do mes da data e somares os dias dos outros meses que faltam. Não me parece assim tão difícil, e olha que eu não sou nenhum guru a algoritmia :P olha que no exemplo que te dei não meti os dias dos meses bem. E não te vou fazer o algoritmo, tenta por ti. Se entretanto tiveres dúvidas, escrveves o que já fizeste que alguem ha-de te dar uma mãozinha.

cumprimentos.
 
Ler Dia
Ler Mes

DiasPassados = 0

Se Ano Bisexto
DiasFevereiro = 29
TotalDias = 366
Senao
DiasFevereiro = 28
TotalDias = 365

Se Mes == 1
DiasParaFinal = TotalDias - (DiasPassados + Dia)
Senao
DiasPassados = DiasPassados + 30

Se Mes == 2
DiasParaFinal = TotalDias - (DiasPassados + Dia)
Senao
DiasPassados = DiasPassados + DiasFevereiro

.......................

Se Mes == 12
DiasParaFinal = TotalDias - (DiasPassados + Dia)
Algo do genero, apenas com decisoes.
 
Última edição:
tens de meter os dados de entrada com um "write("Escreva a data...", dia, mes, ano)
Se for mes 4,6 ou 7 entao temos 30 dias, se for 5 ou 8 tens 31 dias, e se for 2 tens 28 ou 29 dias. Se o ano a didivir por 4 der igual a 0 (penso eu, ja nao me lembro muito bem) entao tens um ano bissexto. entao o mesmo 2 tem 29 dias. Depois é so subtraires os dias do mes da data e somares os dias dos outros meses que faltam. Não me parece assim tão difícil, e olha que eu não sou nenhum guru a algoritmia :P olha que no exemplo que te dei não meti os dias dos meses bem. E não te vou fazer o algoritmo, tenta por ti. Se entretanto tiveres dúvidas, escrveves o que já fizeste que alguem ha-de te dar uma mãozinha.

cumprimentos.

tipo, tenho um pensamento semelhante a esse que tu enuncias-te ... so que nao o estou a conseguir transcrever ... é algo do género:

Código:
se(mes = 4 ou 6 ou 9 ou 11)
  dias_rest= (30-dia)+(3 x 30) senao
     se (mes = 1 ou 3 ou 5 ou 7 ou 8 ou 10 ou 12)
        dias_rest=(31-dia)+6 x30

e depois, falta-me outra condiçao para o fevereiro, e outra linha de codigo pa calcular entao os dias restantes :/
 
Para determinar a diferença entre 2 datas não precisas de andar com essas coisas todas:

Código:
public static String calcula(GregorianCalendar inicio, GregorianCalendar fim) {
        long totalmilis = fim.getTimeInMillis() - inicio.getTimeInMillis();
        long milis = totalmilis%1000;
        long totalseg = totalmilis/1000; long seg = totalseg%60;
        int totalmin = (int) totalseg/60; int min = totalmin%60;
        int totalhoras = totalmin/60; int horas = totalhoras%60;
        int totaldias = totalhoras/24;
        return totaldias + " dias, " + horas +" horas, "+ min+ " minutos e "+ seg + "," + milis + " segundos.";
    }

Isto dá a diferença entre 2 datas em dias, horas, minutos e segundos. Basicamente, transforma as 2 datas no tempo correspondente em milissegundos e depois faz a sua diferença. Basta depois calcular o que se quer.
 
Para determinar a diferença entre 2 datas não precisas de andar com essas coisas todas:

Código:
public static String calcula(GregorianCalendar inicio, GregorianCalendar fim) {
        long totalmilis = fim.getTimeInMillis() - inicio.getTimeInMillis();
        long milis = totalmilis%1000;
        long totalseg = totalmilis/1000; long seg = totalseg%60;
        int totalmin = (int) totalseg/60; int min = totalmin%60;
        int totalhoras = totalmin/60; int horas = totalhoras%60;
        int totaldias = totalhoras/24;
        return totaldias + " dias, " + horas +" horas, "+ min+ " minutos e "+ seg + "," + milis + " segundos.";
    }

Isto dá a diferença entre 2 datas em dias, horas, minutos e segundos. Basicamente, transforma as 2 datas no tempo correspondente em milissegundos e depois faz a sua diferença. Basta depois calcular o que se quer.


Isso não é assim tão simples senão:


Código:
public int GetDaysToEndOfYear(DateTime startdate)
{
     DateTime endOfYear = new DateTime(startdate,12,31);
     TimeSpan diff = endOfYear - startdate;
     return diff.Days;

}


Provavelmente vais ter que fazer isso sem recorrer a bibliotecas.

Acho q a maneira é mesmo com 12 if's , um por cada mês.

Cumps
 
Última edição:
Código:
dayOfMonth = 10
monthOfYear = 2
year = 2008

isLeap = ((year modulo 4 is 0) and (year modulo 100 is not 0)) or (year modulo 400 is 0)

if  isLeap == true
    DAYS_LEFT_ARR = [366, 335, 306, 275,245,214,184,153,122,92,61,31]
else
     DAYS_LEFT_ARR = [365, 334, 306, 275,245,214,184,153,122,92,61,31]

print ("DAYS LEFT: ") && print(DAYS_LEFT_ARR[monthOfYear] - dayOfMonth)
 
Última edição:
Receber dia
Receber mês
Validar dados

Ver ano corrente no system time

Calcular o timestamp às 23:59:59 de 31/12 do ano corrente
Calcular o timestamp às 00:00:00 do dia/mês inseridos

Subtrair

Transformar o tempo em dias
 
Isso não é assim tão simples senão:


Código:
public int GetDaysToEndOfYear(DateTime startdate)
{
     DateTime endOfYear = new DateTime(startdate,12,31);
     TimeSpan diff = endOfYear - startdate;
     return diff.Days;

}
Provavelmente vais ter que fazer isso sem recorrer a bibliotecas.

Acho q a maneira é mesmo com 12 if's , um por cada mês.

Cumps

isso dos 12 if's .... foi o que a turma propôs ao prof ... mas ele disse que havia uma maneira mais facil!! amanha pergunto-lhe :P
 
Podes sempre tentar com um switch...
Não estás a fazer 12 if's, mas é lá perto :D
Acho que já fiz um algoritmo do genero em C, mas não me lembro, e agora já não tenho paciencia pra pensar muito :P
 
Esse é relativamente fácil comparado com o primeiro algoritmo que tive que resolver. Determinar em que dia calha o natal de um ano qualquer. Ou seja o utilizador introduz o ano e o algoritmo tem que determinar o dia em que é o natal nesse ano... llol
 
Back
Topo