Jump to content
Fórum Script Brasil
  • 0

Duvida Para Data Em Formato DD/MM/AAAA


Leonardo Prass
 Share

Question

//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 to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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".

Edited by vangodp
Link to comment
Share on other sites

  • 0

De nada companheiro, só espero que você resolva seu problema. Si tiver muita duvida me adicione no skype e te poderei ajudar melhor, é que as vezes por fórum é meio difícil. Lá no Skype me chamo igual.

Link to comment
Share on other 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;
}

 

Edited by Leonardo Prass
Link to comment
Share on other sites

  • 0

Ficar checando cada caso errado que existe acho que é muito mais custoso que fazer o mesmo para quando esteja correto. Agora é coisa sua si quer faze-lo ou não. Poder sim se pode, com c++ você pode tudo.

Link to comment
Share on other 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.

Edited by vangodp
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...