Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida Para Data Em Formato DD/MM/AAAA


Leonardo Prass

Pergunta

//Escrever um Programa que recebe uma data no formato 'DD/MM/AAAA' (dia/mês/ano),
//verifica se as barras estão na posição correta, se o dia está entre 1 e 31 (inclusive), se o
//mês está entre 1 e 12 e retorna um valor da seguinte forma:
//0: data correta
//1: dia inválido
//2: mês inválido
//3: dia e mês inválidos
//4: formato inválido

 

Não Sei Como Posso fazer Para que o programa reconheca o formato como Incorreto meu Codigo Segue abaixo; 

Usando o For.

#include<iostream>


int main()
{//Indica Inicio//Int Vetor i = '/'

int dat,m,a,dia;


std::cout<<"Digite a Data Nesse Formato DD/MM/AAAA: " ;
std::cin>>dia;
std::cin>>m;
std::cin >>a;

if(dia >=1 &&dia <=31 && m >=1 && m<=12){
std::cout<<"Data Correta!";}

if (dia>32||dia <=0 &&m >=1 && m<=12){
std::cout<<"Dia Incorreto!" ;}
if (dia >=1 &&dia <=31  && m >12 || m<=0){
std::cout<<"Mes Incorreto!" ;}
if (dia>=32||dia <=0 && m >12 || m<=0){
std::cout<<"Dia E Mes Incorretos!" ;}
return 0;
}

 

 

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

introduzir a data normalmente: 12/05/2015

#include <iostream>
using namespace std;

int main () {
    int dia;
    int mes;
    int ano;
    char barra1;
    char barra2;
    
    std::string entrada;
    std::cout << "Digite a Data Nesse Formato DD/MM/AAAA: " ;
    
    cin >> dia >> barra1 >> mes >> barra2 >> ano;
    
    int levelCheck = 0;
    ( dia > 0 ) ? levelCheck++ : levelCheck = levelCheck ;
    ( dia <= 31 ) ? levelCheck++ : levelCheck = levelCheck ;
    ( mes > 0 ) ? levelCheck++ : levelCheck = levelCheck ;
    ( mes <= 12 ) ? levelCheck++ : levelCheck = levelCheck ;    
    ( barra1 == '/' ) ? levelCheck++ : levelCheck = levelCheck ;
    ( barra2 == '/' ) ? levelCheck++ : levelCheck = levelCheck ;
    if( levelCheck == 6 ){
        cout << "Check ok!" << endl;
    }else{
        cout << "no!" << endl;
    }
    cout << dia << "-" << mes << "-" << ano << endl;
    
    cin.ignore();
    return  0;
}

si você intercalar tipos básicos na hora de ler com cin, ele vai saber exatamente onde tem que ir cada tipo. Como se trada de ler 12/05/2015 você na realidade tem intcharintcharint, então ao fazer cin >> int >> char >> int >> char >> int; o cin sabe exatamente onde vai cada um, isso não funciona com cin >> int >> int porem funciona com cin >> char >> char. Isso é por que no caso do char sabemos que só entra uma letra, si temos 2 letras o cin é suficientemente inteligente como para por cad aletra em um char, porem no caso de int o numero pode variar no tamanho, tipo 0, 12, 12123... Então o cin não sabe como separar ele já que poderia is separado de varias formas como n1=1 e  n3=2123, n1=12 e n2=123... Acho que só funciona com 2 chars, floats, doubles, ints, strings... não funciona, só si estiverem intercalados mesmo. Uma função mais potente que cout para isso é sscanf porem nesse caso não acho que seja útil, outras formas é trabalhar com templates e sobrecarga de operadores etc etc.

Espero que seja útil o exemplo.

Link para o comentário
Compartilhar em outros sites

  • 0
#include <iostream>
using namespace std;

int main () {
    string data = "21/10/2014"; //2 barras  
    int nBarras = 0; //numero de barras deve ser 2
    for( unsigned int i = 0; i < data.length(); i++){
        if ( data[i]=='/' ){
            nBarras++;
        }
    }
    
    if( nBarras == 2 ){ //si tiver 2 barras no string mostra ok
        cout << "Check ok!" << endl;
    }else{
        //...si nao "no". XD
        cout << "no!" << endl;
    }
    
    cin.ignore();
    return  0;
}

Isso?

Link para o comentário
Compartilhar em outros sites

  • 0

Bem Eu Tentei Aplica no meu codigo mas não tive sucesso ,sou iniciante em c++ então tenho um conhecimento bem basico ,e ainda n aprendi a usar stings mais acho que estou mais perto de resolver o poblema pode dar uma olhada agradeco pelo seu apoio.

#include<iostream>


int main()
{//Indica Inicio//Int Vetor i = '/'

int m,a,dia,i,dat;
int barra=0;

std::cout<<"Digite a Data Nesse Formato DD/MM/AAAA: " ;
std::cin>>dia;
std::cin>>m;
std::cin >>a;
for (i = 0; i < dat; i++){
if ( dat=='/' ){
            barra++;
std::cout<<"Barras Incorretas" ; }
if(dia >=1 &&dia <=31 && m >=1 && m<=12){
std::cout<<"Data Correta!";}

if (dia>32||dia <=0 &&m >=1 && m<=12){
std::cout<<"Dia Incorreto!" ;}
if (dia >=1 &&dia <=31  && m >12 || m<=0){
std::cout<<"Mes Incorreto!" ;}
if (dia>=32||dia <=0 && m >12 || m<=0){
std::cout<<"Dia E Mes Incorretos!" ;}
return 0;
}
}

Link para o comentário
Compartilhar em outros sites

  • 0

conforme você descreveu seu problema você tem que armazenar DD/MM/AAAA em uma ou mais variáveis para poder validar elas. Porem acho que você não se decide na forma correta de armazenar elas. você não pode comprovar as si as barras estao invertidas com um for si DD/MM/AAAA for inteiros e chars, para isso você tem que usar um string. Por outro lado você pode separar tudo em variáveis de forma que logo na entrada fique:

int dia = DD
char barra1 = / primeira  barra
mes = MM
char barra2 = / segunda barra
int ano = AAAA

Nesse caso não é possível usar um loop for já que todas estão separadas, não da para usar for.

Outra forma de fazer é guardar inteiro o DD/MM/AAAA em um string como no segundo exemplo que eu coloquei. Tipo:

string dataAtual = "DD/MM/AAAA";

Mas aí o problema é que isso são todos chars agrupados baixo uma mesma variável (string), na qual sim é possível fazer uso de um bucle for pois as barras estariam nas posições dataAtual[2] e dataAtual[5].

Então decida-se si a sua entrada é um string ou si prefere tomar todo o grupo como variáveis por separado. Si você se decidir por usar strings, você vai ter muito maios complexidade, pois terá que separar os números das barras, fazer conversões de tipo e mil raios mais.
 

Outra coisa que você não esta levando em conta, é que isso do for não aparece no seu enunciado, ou ao menos eu não vejo...

//Escrever um Programa que recebe uma data no formato 'DD/MM/AAAA' (dia/mês/ano),
//verifica se as barras estão na posição correta, se o dia está entre 1 e 31 (inclusive), se o
//mês está entre 1 e 12 e retorna um valor da seguinte forma:

Todos os exemplos que coloquei fazem justo o que você pediu ao principio. Aí eu pergunto.... Que você quer fazer?

 

Eu Tentei Aplica no meu codigo mas não tive sucesso

O que você quer aplicar? O meu código já esta 100% pronto, si a Data não for correta ele não vai tragar não, ele vai dar um aviso "no".

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

  • 0

Consegui Conclui Meu Codigo gracas a Sua Ajuda Muito Obrigado Segue abaixo codigo pronto;Pórem ele não reconhece o local correto onde tem que ser colocado a barra

E UMA PERGUNTA não teria como definir usando o for ex um limite de 2 barras a cada 2 casas n sei se tu me entendeu ,estabelecer um limite de barras e a cada duas casas?

E NOVEMENTE MUITO OBRIGADO MESMO PELA SUA AJUDA XD.


//Escrever um Programa que recebe uma data no formato 'DD/MM/AAAA' (dia/mês/ano),
//verifica se as barras estão na posição correta, se o dia está entre 1 e 31 (inclusive), se o
//mês está entre 1 e 12 e retorna um valor da seguinte forma:
//0: data correta
//1: dia inválido
//2: mês inválido
//3: dia e mês inválidos
//4: formato inválido

 

#include<iostream>


int main()
{//Indica Inicio//

int dat,m,a,dia;
char barra1;
char barra2;

std::cout<<"Digite a Data Nesse Formato DD/MM/AAAA: " ;
std::cin>>dia;
std::cin>>barra1;
std::cin>>m;
std::cin >>barra2;
std::cin >>a;
if (barra1!='/' && barra2!='/'){
    std::cout<<"Formato Incorreto" ;}


if(dia >=1 &&dia <=31 && m >=1 && m<=12 &&barra1=='/' && barra2=='/'){
std::cout<<"Data Correta!";}

if (dia>32||dia <=0 &&m >=1 && m<=12){
std::cout<<"Dia Incorreto!" ;}
if (dia >=1 &&dia <=31  && m >12 || m<=0){
std::cout<<"Mes Incorreto!" ;}
if (dia>=32||dia <=0 && m >12 || m<=0){
std::cout<<"Dia E Mes Incorretos!" ;}
return 0;
}

 

Editado por Leonardo Prass
Link para o comentário
Compartilhar em outros sites

  • 0

Sim... você pode fazer de mil formas diferentes, C++ é diferente de C, você pode usar os mecanismos de C ou as 1000 formas de fazer a mesma coisa em C++. Tudo é questão de praticar e conhecer as funções de ambos linguagens.

Particularmente eu gosto de usar C++ por que tem solução para tudo. por exemplo str::find que devolve si tem 2 barras"//" no texto ou 3.... Si não encontrar devolve 0, si encontrar devolve um ponteiro a essa primeira barra. Então é fazer um if ( data.find("//") != NULL  ) {/*Encontrado barra dupla*/}. O que seria equivalente a falhar a leitura. Ler sobre find aqui http://www.cplusplus.com/reference/string/string/find/

A função membro find() é só uma das "mil" possibilidades que tem C++, você tem que conhecê-las as funções que estão disponíveis para C++ para trabalhar com elas, si você a usar al menos uma vez essas funções você sabe do que são capazes, assim que pratique muito.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

  • 0
#include <iostream>
using namespace std;

int main(){
    
    string data = "21/02//1977";
    string subString = "//";
    
    int pos = NULL;
    if ( (pos = data.find( subString )) != NULL ) {
        
        cout << "Encontrado \"" << subString << "\" na posiçao numero: " << pos+1 << endl; 
 
    }else{
        cout << "Nao foi encontrado \"" << subString << "\" na data." << endl;
    }
    
    
    
    getchar();
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...