[ajuda]

deepshoot

Power Member
ora boas!

Tenho uma dúvida, gostava de saber como posso validar uma data introduzida pelo utilizador.
Óbvio que não é validar os dias, meses e ano, isso é facil, quero é validar, por exemplo, se o utilizador introduzir um caracter em vez de um número.
Provavelmente terá de ser através de código ascii, mas inda não consegui.
Ajuda é bem-vinda.

Thanks
 
Em que linguagem?

Se for em c++, fazes com que o user introduza um dia, mes e ano, tudo inteiros. Se ele introduzir um que não seja inteiro, tens de fazer reset ao cin e fazer com que o user introduza outra vez o dado que estava errado.


Cumps
 
Última edição:
Em que linguagem?

Se for em c++, fazes com que o user introduza um dia, mes e ano, tudo inteiros. Se ele introduzir um que não seja inteiro, tens de fazer reset ao cin e fazer com que o user introduza outra vez o dado que estava errado.


Cumps
Boas.
É em c++
Como faço isso?
Tenho este código

Código:
printf("\nIntroduza a data de hoje na forma dd/mm/aaaa\n");
scanf_s("%d/%d/%d", &d_h, &m_h, &a_h);
depois mando estes parametros para uma funçao que ve se o ano é bisexto por causa do mes de fevereiro, etc, aí ta tudo a funcionar bem.
O pior é se o utilizador introduz um caracter em vez de um inteiro, caso faça isso o programa crasha.
O que pretendo validar agora é que ele nao introduza caracteres.

Cumps
 
Isso é c, porque em c++ tens cout e cin em vez de printf e scanf.
Em vez de definires 3 variaveis para guardar a data fazes um array de três posições e fazes:

Código:
cout << "Introduza dia, mes e ano:\n";
int arr[3]; //para guardar o dia mes e ano
for (int i= 0; i<3 ; ++i)
{
   While (!(cin >> arr[i]))   //se o utilizador não indicar uma variavel int o cin devolve falso
       {
           cin.clear(); //com isto resetas o cin
           While (cin.get() != '\n') //para ler o enter
                continue;
           cout << "Introduza um numero: ";
        }
}

Acho que é mais ou menos isto.


Já agora para puderes usar o cout e o cin tens de incluir o ficheiro iostream (#include <iostream>) e usar a namespace std (using namespace std;).



Espero ter ajudado.
 
Em C, basta-te testar o valor devolvido pelo scanf. O scanf devolve o número de atribuições realizadas com sucesso, ou seja, para esse caso, ele retorna o valor 3 se conseguir atribuir com sucesso valores inteiros às variávies dia, mês e ano, caso contrário devolve um valor diferente (conforme as atribuições feitas com sucesso).
Código:
#include <stdio.h>

int main(void) {
    int dia,mes,ano,v;
    printf("Data (dd/mm/aaaa): ");
    v=scanf("%d/%d/%d",&dia,&mes,&ano);
    if (v!=3)
        printf("Erro");
    else
        printf("Data: %d/%d/%d\n",dia,mes,ano);
    return 0;
}
 
Isso é c, porque em c++ tens cout e cin em vez de printf e scanf.
Em vez de definires 3 variaveis para guardar a data fazes um array de três posições e fazes:

Código:
cout << "Introduza dia, mes e ano:\n";
int arr[3]; //para guardar o dia mes e ano
for (int i= 0; i<3 ; ++i)
{
   While (!(cin >> arr[i]))   //se o utilizador não indicar uma variavel int o cin devolve falso
       {
           cin.clear(); //com isto resetas o cin
           While (cin.get() != '\n') //para ler o enter
                continue;
           cout << "Introduza um numero: ";
        }
}
Acho que é mais ou menos isto.


Já agora para puderes usar o cout e o cin tens de incluir o ficheiro iostream (#include <iostream>) e usar a namespace std (using namespace std;).



Espero ter ajudado.

Boas.
Primeiro de tudo, muito obrigado pela ajuda.
No entanto nc usei cout e cin nas aulas, nem a biblioteca iostream, no entanto vou testar e ver os resultados.

Obrigado

Em C, basta-te testar o valor devolvido pelo scanf. O scanf devolve o número de atribuições realizadas com sucesso, ou seja, para esse caso, ele retorna o valor 3 se conseguir atribuir com sucesso valores inteiros às variávies dia, mês e ano, caso contrário devolve um valor diferente (conforme as atribuições feitas com sucesso).
Nada mais simples, se conseguir meter a funcionar, sem dúvida que mais simples não há, e eu a dar tantas voltas a isto...xD
Obrigadao

Thanks people

Já agora, o trabalho que estou a fazer é um simulador de seguros automóvel, tá praticamente feito ;)
E a cadeira elativa a este trabalho é Algoritmos e programação 1, ou seja, uma introdução à linguagem c++ =)

Fiquem bem
 
ora boas!

Tenho uma dúvida, gostava de saber como posso validar uma data introduzida pelo utilizador.
Óbvio que não é validar os dias, meses e ano, isso é facil, quero é validar, por exemplo, se o utilizador introduzir um caracter em vez de um número.
Provavelmente terá de ser através de código ascii, mas inda não consegui.
Ajuda é bem-vinda.

Thanks
DEsde já obrigado, esta dúvida ta resolvida :p

Agora tenho uma outra dúvida.
O meu programa tem o limite de guardar 50 simulações, para tal tenho o código assim

Código:
 #include<stdio.h>
        .....
        .....
char guarda_nomes[50][45];

void gravacao(char nomes){

        int i=0;
        guarda_nomes[i][0]=nomes;
        i++;//pa na proxima vez que ca passar gravar no indice 1,2...
}

void dados_segurado(){
    printf("Introduza o nome do segurado\n");
    fflush(stdin);
    fgets(nomes[i][0], 40, stdin);//[SIZE=3]aqui o programa empanca!!!![/SIZE] 
    gravacao(nomes);//envia nomes para a funcao gravacao

}

void mostra_gravacao(){
     puts("%s\n", guarda_nomes[i][0];

}
Se alguem puder ajudar, ou dar umas dicas pa meter o codigo melhor, é k consegui guardar a data, os valores, só não consigo guardar os nomes num vector...

Cumps
 
Empanca porque nomes é um array bidimensional de caracteres, e tu estás a passar ao fgets a posição correspondente a um caracter, enquanto que o fgets espera um array de caracteres. Para além disso, o teu programa vai sempre gravar por cima do 1º nome, porque o i++ é invocado na função gravação, mas antes é feito o seu reset para o valor 0, logo vais escrever sempre com o i=0.
 
Empanca porque nomes é um array bidimensional de caracteres, e tu estás a passar ao fgets a posição correspondente a um caracter, enquanto que o fgets espera um array de caracteres. Para além disso, o teu programa vai sempre gravar por cima do 1º nome, porque o i++ é invocado na função gravação, mas antes é feito o seu reset para o valor 0, logo vais escrever sempre com o i=0.
Boas.
Obrigado, mas inda só tive uma aula de 1h30 de arrays, logo nao percebo grande coisa disso.
Que me aconselhas para os efeitos que quero?

Cumps
 
Se nomes[][] é um array bidimensional (array de arrays), então nomes[] é um array, ou seja, aquilo que precisas de passar ao fgets. Não te esqueças é do parâmetro entre [].
 
Sim. Na parte da gravação, a inicialização do i e o seu incremento tem de ser feito fora da função, por exemplo, num ciclo for que chama essa função.
 
thanks
aquele i=0 não devia estar ali, eu é que copiei o codigo mal para aqui.
Vou tentar.

Obrigadao
Tou com um poblema em mostrar a gravação...
o programa empanca, não tá facil.

Agora tenho o código assim
Código:
#include<stdio.h>
        .....
        .....
char guarda_nomes[50][45];
int m=0;

void gravacao(char nomes[]){

        guarda_nomes[m][0]=nomes;
        m++;//pa na proxima vez que ca passar gravar no indice 1,2...
}


void mostra_gravacao(){
     puts("%s\n", guarda_nomes[m][0]);//agora empanca qdo chega aqui

}

void dados_segurado(){

    int i=0;//meti aqui o i
    printf("Introduza o nome do segurado\n");
    fflush(stdin);
    fgets(nomes[i], 40, stdin);
    gravacao(nomes);//envia nomes para a funcao gravacao

}
 
Porque estás a cometer outra vez o mesmo erro. O %s do printf (não podes usar o puts, ele apenas recebe uma string, não recebe parâmetros de formato) está à espera de uma string (array de caracteres com terminador \0) e tu passas um caracter.
 
Porque estás a cometer outra vez o mesmo erro. O %s do printf (não podes usar o puts, ele apenas recebe uma string, não recebe parâmetros de formato) está à espera de uma string (array de caracteres com terminador \0) e tu passas um caracter.

Não pesco nada de arrays...então, nesse printf fica
printf("%s", guarda_nomes[m]);
Se for assim não vai mostrar o nome, já tentei mas nada.

Já agora, na funcao dados_segurado como defino a variavel nomes?
nomes[50][45] assim?!

Cumps
 
Estás-me a perguntar a mim como se define a variável nomes? Pensei que sabias. Se for para armazenar apenas um nome, podes definir como sendo char nomes[45], se quiseres que seja igual à guarda_nomes, então fica como tens. Isso não está a mostrar o nome porque estás a guardar mal o nome na função gravação. Estás a fazer uma atribuição de nomes a guarda_nomes e isso, com arrays, consiste na atribuição do seu endereço, ou seja, estás a atribuir o endereço de nomes a guarda_nomes, logo guarda_nomes passa a referenciar nomes e não guarda nada nela, apenas há uma atribuição de referências (endereços). O que tens de fazer é copiar a string contida em nomes para guarda_nomes através da função strncpy.
 
Estás-me a perguntar a mim como se define a variável nomes? Pensei que sabias. Se for para armazenar apenas um nome, podes definir como sendo char nomes[45], se quiseres que seja igual à guarda_nomes, então fica como tens. Isso não está a mostrar o nome porque estás a guardar mal o nome na função gravação. Estás a fazer uma atribuição de nomes a guarda_nomes e isso, com arrays, consiste na atribuição do seu endereço, ou seja, estás a atribuir o endereço de nomes a guarda_nomes, logo guarda_nomes passa a referenciar nomes e não guarda nada nela, apenas há uma atribuição de referências (endereços). O que tens de fazer é copiar a string contida em nomes para guarda_nomes através da função strncpy.
Epah, agora com isto tudo já não tenho certezas de nada...lol.
Eu no inicio tinha com strcpy, vou tentar novamente.
mas resumindo:
nomes apenas quero para armazenar um nome depois passar esse nome a guarda_nomes(guarda_nomes tem de guardar 50 nomes)
Depois o programa ira correr de novo e a variavel nomes passa a ter outro nome e vai guardar noutro indice da guarda_nomes.

para isso entao, se percebi faço assim.


Código:
#include<stdio.h>
char guarda_nomes[50][45];

void dados_segurado(){
    m=0;
    printf("Introduza o nome do segurado\n");
    fflush(stdin);
    gets(nomes);
    strcpy(guarda_nomes[m][0],nomes);
    m++;
}

void mostra_gravacao(){
   pritnf("%s", guarda_nomes[m][0];    

}
Qualquer coisa deste genero?!
 
Algo deste género:

Código:
#include <stdio.h>
#include <string.h>

#define MAXNOMES 50
#define TAMNOME 45

void dados_segurado(char guarda_nomes[][TAMNOME]) {
    int i;
    char nome[TAMNOME];
    for (i=0;i<MAXNOMES;i++) {
        printf("Introduza o nome do segurado: ");
        fgets(nome,sizeof(nome),stdin);
        nome[strlen(nome)-1]='\0';
        strncpy(guarda_nomes[i],nome,sizeof(nome));
    }
}

void mostra_gravacao(char guarda_nomes[][TAMNOME]) {
    int i;
    for (i=0;i<MAXNOMES;i++)
        printf("%s\n",guarda_nomes[i]);
}

int main(void) {
    char guarda_nomes[MAXNOMES][TAMNOME];
    dados_segurado(guarda_nomes);
    mostra_gravacao(guarda_nomes);
    return 0;
}
 
Algo deste género:

Código:
#include <stdio.h>
#include <string.h>

#define MAXNOMES 50
#define TAMNOME 45

void dados_segurado(char guarda_nomes[][TAMNOME]) {
    int i;
    char nome[TAMNOME];
    for (i=0;i<MAXNOMES;i++) {
        printf("Introduza o nome do segurado: ");
        fgets(nome,sizeof(nome),stdin);
        nome[strlen(nome)-1]='\0';
        strncpy(guarda_nomes[i],nome,sizeof(nome));
    }
}

void mostra_gravacao(char guarda_nomes[][TAMNOME]) {
    int i;
    for (i=0;i<MAXNOMES;i++)
        printf("%s\n",guarda_nomes[i]);
}

int main(void) {
    char guarda_nomes[MAXNOMES][TAMNOME];
    dados_segurado(guarda_nomes);
    mostra_gravacao(guarda_nomes);
    return 0;
}

Bem, obrigadao pela ajuda, já ta a funcionar!!
No entanto tinhas percebido mal o que eu queria, mas já fiz os ajustes e tá tudo a bombar.
Obrigadao pela ajuda!!!!!
 
Back
Topo