1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[ajuda]

Discussão em 'Programação' iniciada por deepshoot, 16 de Janeiro de 2009. (Respostas: 19; Visualizações: 789)

  1. deepshoot

    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
     
  2. Ronnie_03

    Ronnie_03 Power Member

    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: 16 de Janeiro de 2009
  3. deepshoot

    deepshoot Power Member

    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
     
  4. Ronnie_03

    Ronnie_03 Power Member

    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.
     
  5. Baderous

    Baderous Banido

    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;
    }
    
     
  6. deepshoot

    deepshoot Power Member

    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

    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
     
  7. deepshoot

    deepshoot Power Member

    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
     
  8. Baderous

    Baderous Banido

    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.
     
  9. deepshoot

    deepshoot Power Member

    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
     
  10. Baderous

    Baderous Banido

    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 [].
     
  11. deepshoot

    deepshoot Power Member

    Tipo, meter assim
    fgets(nomes, 45, stdin);

    e a parte da gravação?

    thanks
     
  12. Baderous

    Baderous Banido

    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.
     
  13. deepshoot

    deepshoot Power Member

    thanks
    aquele i=0 não devia estar ali, eu é que copiei o codigo mal para aqui.
    Vou tentar.

    Obrigadao
     
  14. deepshoot

    deepshoot Power Member

    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
    
    }
     
  15. Baderous

    Baderous Banido

    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.
     
  16. deepshoot

    deepshoot Power Member

    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
     
  17. Baderous

    Baderous Banido

    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.
     
  18. deepshoot

    deepshoot Power Member

    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?!
     
  19. Baderous

    Baderous Banido

    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;
    }
    
     
  20. deepshoot

    deepshoot Power Member

    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!!!!!
     

Partilhar esta Página