noobinc Postado Outubro 14, 2012 Denunciar Share Postado Outubro 14, 2012 Olá pessoal. Tenho um problema de faculdade que é assim: /*Escreva um programa que leia um horário (hora, minuto e segundo) e mostre o horário um segundo depois. Por exemplo, se o horário lido for 12:34:25, o horário mostrado deve ser 12:34:26; se o horário lido for 12:59:59, o horário mostrado deve ser 13:00:00.*/Só que tem alguns detalhes: não é permitido utilizar desvio if else, apenas entrada/saída e operações aritméticas.Alguém poderia me dar uma ajuda? Desde já agradeço! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 PedroCunha Postado Outubro 15, 2012 Denunciar Share Postado Outubro 15, 2012 (editado) Você pode dividir a horário em 3 perguntas, e depois no programa, incrementar o valor resultante da terceira pergunta em 1 e depois jogar na tela da seguinte forma:cout << numHoras << ":" << numMinutos << ":" << numSegundos << endl; Att., Pedro. Edit: Acho que você vai precisar de um if, para o caso dos segundos serem iguais à 60, pois nesse caso você vai precisar zerar a contagem e aumentar o minuto em 1. Edit2: Estava atoa em casa e resolvi fazer o código. Funciona perfeitamente, mas como te disse, alguns ifs são necessários. #include <cstdlib> #include <iostream> using namespace std; struct VariaveisGlobais // Aqui usei uma struct para segurar os valores das Horas, Minutos e Segundos, pois além de ser mais organizado, é mais prático. { int Horas, Minutos, Segundos; }; VariaveisGlobais HorariosObj; void Pergunta();// Protótipo das funções. void Horarios(int, int, int);// Protótipo das funções. int Sair();// Protótipo das funções. void Pergunta() { do { cout << "Entre o valor das horas:" << endl; cin >> HorariosObj.Horas; cout << "\n"; cin.sync(); } while (HorariosObj.Horas > 24); // Coloquei esse while para o caso do usuário colocar um valor maior que 24 para o valor das horas. cout << "Entre o valor dos minutos:" << endl; cin >> HorariosObj.Minutos; cout << "\n"; cin.sync(); cout << "Entre o valor dos segundos" << endl; cin >> HorariosObj.Segundos; cout << "\n"; cin.sync(); Horarios(HorariosObj.Horas, HorariosObj.Minutos, HorariosObj.Segundos);// Aqui chamo a função que fará os cálculos necessários e mostrará os valores. } void Horarios (int Horas, int Minutos, int Segundos) { char Opcao; if (HorariosObj.Minutos > 60) { HorariosObj.Horas += HorariosObj.Minutos / 60; // No caso dos minutos serem maiores que 60, aumentaremos o valor das horas em: ValorMinutos/60. HorariosObj.Minutos = HorariosObj.Minutos % 60;// No caso dos minutos serem maiores que 60, // o seu novo valor será o resto da divisão (%) do valor dos minutos por 60. if (HorariosObj.Horas > 24) { HorariosObj.Horas -= 24;// No caso de o resultado das horas ser maior que 24, seu novo valor será: ValorAntigo - 24. } } if (HorariosObj.Segundos > 60) { HorariosObj.Minutos += HorariosObj.Segundos/60;// No caso dos segundos serem maiores que 60, aumentaremos o valor dos minutos em: ValorSegundos/60. if (HorariosObj.Minutos > 60)// Usei esse if no caso do usuário usar um valor igual ou maior que 3600 para os segundos, ou seja, 1 hora. { HorariosObj.Horas += HorariosObj.Minutos/60; if (HorariosObj.Horas > 24) { HorariosObj.Horas -= 24; } HorariosObj.Minutos = HorariosObj.Minutos % 60; HorariosObj.Segundos = HorariosObj.Segundos % 60;// No caso dos segundos serem maiores que 60, } //o seu novo valor será o resto da divisão (%) do valor dos segundos por 60. } cout << HorariosObj.Horas << ":" << HorariosObj.Minutos << ":" << HorariosObj.Segundos << endl;// Aqui eu jogo os valores obtidos na tela, usando os cout << "\n"; // dois pontos (:) para separá-los, como já é padrão. cout << "Quer continuar a usar o programa? (S/N)" << endl; cin >> Opcao; cout << "\n"; cin.sync(); switch (Opcao) // Aqui usei um switch bem simples para dar ao usuário a chance de rodar o programa novamente. { case 'S': { Pergunta(); break; } case 's': { Pergunta(); break; } case 'N': { Sair(); break; } case 'n': { Sair(); break; } default: { Sair(); break;} } } int Sair()// Função usada para fechar o programa. Criei ela separadamente por questões de organização e praticidade para o switch. { cout << "Adeus!" << endl; cin.get(); return 0; } int main() { Pergunta();//Aqui chamo a função que fará o programa começar seu loop, dentro de main. return 0; }Att., Pedro Editado Outubro 16, 2012 por PedroCunha Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 GuiEsquilo Postado Outubro 16, 2012 Denunciar Share Postado Outubro 16, 2012 Você pode dividir a horário em 3 perguntas, e depois no programa, incrementar o valor resultante da terceira pergunta em 1 e depois jogar na tela da seguinte forma:cout << numHoras << ":" << numMinutos << ":" << numSegundos << endl; Att., Pedro. Edit: Acho que você vai precisar de um if, para o caso dos segundos serem iguais à 60, pois nesse caso você vai precisar zerar a contagem e aumentar o minuto em 1. Edit2: Estava atoa em casa e resolvi fazer o código. Funciona perfeitamente, mas como te disse, alguns ifs são necessários. #include <cstdlib> #include <iostream> using namespace std; struct VariaveisGlobais // Aqui usei uma struct para segurar os valores das Horas, Minutos e Segundos, pois além de ser mais organizado, é mais prático. { int Horas, Minutos, Segundos; }; VariaveisGlobais HorariosObj; void Pergunta();// Protótipo das funções. void Horarios(int, int, int);// Protótipo das funções. int Sair();// Protótipo das funções. void Pergunta() { do { cout << "Entre o valor das horas:" << endl; cin >> HorariosObj.Horas; cout << "\n"; cin.sync(); } while (HorariosObj.Horas > 24); // Coloquei esse while para o caso do usuário colocar um valor maior que 24 para o valor das horas. cout << "Entre o valor dos minutos:" << endl; cin >> HorariosObj.Minutos; cout << "\n"; cin.sync(); cout << "Entre o valor dos segundos" << endl; cin >> HorariosObj.Segundos; cout << "\n"; cin.sync(); Horarios(HorariosObj.Horas, HorariosObj.Minutos, HorariosObj.Segundos);// Aqui chamo a função que fará os cálculos necessários e mostrará os valores. } void Horarios (int Horas, int Minutos, int Segundos) { char Opcao; if (HorariosObj.Minutos > 60) { HorariosObj.Horas += HorariosObj.Minutos / 60; // No caso dos minutos serem maiores que 60, aumentaremos o valor das horas em: ValorMinutos/60. HorariosObj.Minutos = HorariosObj.Minutos % 60;// No caso dos minutos serem maiores que 60, // o seu novo valor será o resto da divisão (%) do valor dos minutos por 60. if (HorariosObj.Horas > 24) { HorariosObj.Horas -= 24;// No caso de o resultado das horas ser maior que 24, seu novo valor será: ValorAntigo - 24. } } if (HorariosObj.Segundos > 60) { HorariosObj.Minutos += HorariosObj.Segundos/60;// No caso dos segundos serem maiores que 60, aumentaremos o valor dos minutos em: ValorSegundos/60. if (HorariosObj.Minutos > 60)// Usei esse if no caso do usuário usar um valor igual ou maior que 3600 para os segundos, ou seja, 1 hora. { HorariosObj.Horas += HorariosObj.Minutos/60; if (HorariosObj.Horas > 24) { HorariosObj.Horas -= 24; } HorariosObj.Minutos = HorariosObj.Minutos % 60; HorariosObj.Segundos = HorariosObj.Segundos % 60;// No caso dos segundos serem maiores que 60, } //o seu novo valor será o resto da divisão (%) do valor dos segundos por 60. } cout << HorariosObj.Horas << ":" << HorariosObj.Minutos << ":" << HorariosObj.Segundos << endl;// Aqui eu jogo os valores obtidos na tela, usando os cout << "\n"; // dois pontos (:) para separá-los, como já é padrão. cout << "Quer continuar a usar o programa? (S/N)" << endl; cin >> Opcao; cout << "\n"; cin.sync(); switch (Opcao) // Aqui usei um switch bem simples para dar ao usuário a chance de rodar o programa novamente. { case 'S': { Pergunta(); break; } case 's': { Pergunta(); break; } case 'N': { Sair(); break; } case 'n': { Sair(); break; } default: { Sair(); break;} } } int Sair()// Função usada para fechar o programa. Criei ela separadamente por questões de organização e praticidade para o switch. { cout << "Adeus!" << endl; cin.get(); return 0; } int main() { Pergunta();//Aqui chamo a função que fará o programa começar seu loop, dentro de main. return 0; }Att., Pedroolha cara a melhor soluçao para seu problema e transformar as horas minutos e segundo em numeros inteiros exmplo se 1 hora equivale a 60 minutos e minutos equivale a 60s, então se você transformar tudo em segundo isso ficara mais facil e na hora de mostrar você dividi tudo para o formato de hora minuto e sugundo novamento depois de incrementar o segundo, mais e basicamente isso, normalmente onde eu trabalho a gente precisa compara datas dessa forma então colocamos tudo em um inteiro seria a mesma logica, exemplo 03/04/2012 seria 20120403 esse numero e maior que 20120402. Dessa forma não e preciso utilizar nem uma condição. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 PedroCunha Postado Outubro 16, 2012 Denunciar Share Postado Outubro 16, 2012 Bom, mesmo que você transformasse em inteiros, eventualmente você precisaria usar alguma condicional. Quanto ao que você falou das datas, não entendi da forma que você escreveu.Att., Pedro. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Outubro 17, 2012 Denunciar Share Postado Outubro 17, 2012 Boa noite a todos!Realmente Pedro, não precisaria de condicional dessa forma. Se converter tudo para segundos, somar 1 e depois ir dividindo para voltar a hora, minuto e segundo não tem condicional.Sobre o formato de data, vou explicar: essa forma de representar datas é utilizado quando você quer ordenar eventos, por exemplo. Escrevendo a data em ano, mês e dia ao invés do contrário cria-se um número crescente. Para fazer um teste, faca o seguinte:Crie três arquivos em uma pasta qualquer no seu computador. Os nomes dos arquivos devem ser as seguintes datas: 20 de Janeiro de 2012, 14 de agosto de 2012 e 17 de maio de 2013. Primeiro use como nome as datas em dia, mês e ano: 20012012, 14082012 e 17052013. Agora ordene por nome e veja o que acontece: qualquer forma que ordene, crescente ou decrescente, a data de 2013 sempre vai ficar no meio. Você não consegue ordenar de forma que a data mais recente apareça primeiro, fica embaralhado.Agora mude o nome para ano, mês e dia: 20120120, 20120814 e 20130517. Veja que agora, ao ordenar por nome, as datas ficam em ordem crescente ou decrescente, como você preferir... :)Abraços,Marcelo Utikawa da Fonseca Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Mateus GP Postado Outubro 26, 2012 Denunciar Share Postado Outubro 26, 2012 (editado) Tente esse algoritmo, fiz rapido, por isso teste e faça as modificações que julgar necessarias:#include <stdio.h> typedef unsigned long long int uintm; uintm char2int(const char* adr) { return ((adr[0] - '0')*10)+(adr[1] - '0'); } void int2char(uintm n, char* s) { *s++ = '0' + ((n / 10)%10); *s++ = '0' + (n % 10); *s = 0; } void addsecs2hour(uintm secs, char* hh, char* mm, char* ss) { uintm s, h, m; s = char2int(ss) + secs; m = char2int(mm); h = char2int(hh); s += (m * 60) + (h * 3600); h = s / 3600; m = (s - (h * 3600)) / 60; s -= (h * 3600) + (m * 60); int2char(s, ss); int2char(m, mm); int2char(h, hh); } int main(int argc, char* argv[]) { char h[4], m[4], s[4]; fprintf(stdout, "Insira o horario (hh:mm:ss): "); scanf("%2c%*c%2c%*c%2c%*c", h, m, s); addsecs2hour(1, h, m, s); fprintf(stdout, "Mais um segundo: %s:%s:%s\n", h, m, s); return 0; } Editado Outubro 26, 2012 por Mateus GP Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
noobinc
Olá pessoal. Tenho um problema de faculdade que é assim:
/*Escreva um programa que leia um horário (hora, minuto e segundo)
e mostre o horário um segundo depois.
Por exemplo, se o horário lido for 12:34:25,
o horário mostrado deve ser 12:34:26; se o horário lido for 12:59:59,
o horário mostrado deve ser 13:00:00.*/
Só que tem alguns detalhes: não é permitido utilizar desvio if else, apenas entrada/saída e operações aritméticas.
Alguém poderia me dar uma ajuda? Desde já agradeço!
Link para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.