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

Duvida em C

Discussão em 'Programação' iniciada por bustelo, 22 de Maio de 2006. (Respostas: 24; Visualizações: 1605)

  1. bustelo

    bustelo Power Member

    Viva estou a fazer um program em que numa parte estou a pedir a data de nascimento cujo formato quero em dd-mm-aaaa, sou seja, quem nao escrever nesse formato o programa vai dizer que a data e invalida

    ou seja esta assim...

    ---------------------------------------------------------------

    printf("escreva a data de nascimento");
    scanf("%s", data);

    if(data != ??????

    printf("data invalida");

    ------------------------------------------------------------------

    a minha duvida esta no vermelho, como fazer isso. quais as variaveis a usar, etc para me fazer a validaçao para o formato dd-mm-aaaa. Isto e para um trabalho para a universidade se me conseguirem ajudar agradecia.
     
  2. Martinho

    Martinho Power Member

    existem diversas formas de fazer isso, uma delas por exemplo seria verificar se os "-" estão na posição devida, depois seria converter para formato numérico (se possível claro) e realizar as devidas verificações relativamente às datas, isso não se faz com 1 só if requer mais uns pozinhos.

    agora cabe-te a ti agarrar no livro e ler alguma coisa sobre strings.
     
  3. bustelo

    bustelo Power Member

    Ok mas alguem me pode fornecer esse codigo ja pronto a usar? e que nao tenho muito tempo para estudar isso... obrigado
     
  4. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Código:
    for(i=0;i<10;i++)
      if(i==2||i==5)
      {
        if(str[i]!='-') puts("ERRO");
      }
      else
      {
        if(str[i]>'9'||str[i]<'0') puts("ERRO");
      }
    deve ser mais ou menos isto...
     
  5. bustelo

    bustelo Power Member

    nova duvida... quando estou a verificar se uma string e igual a outra. Exemplo na string1 escrevo janela e na string2 tambem escrevo janela, o programa vai dizer que nao sao iguais e na realidade sao. Podem-me ajudar? obrigado!

    [variaveis]
    char string1[100], string2[100];

    printf("Insira a palavra 1");
    scanf("%s", string1);

    printf("Insira a palavra 2");
    scanf("%s", string2);

    if(string1==string2){
    printf("as duas strings sao iguais");
    else
    printf("as strings sao diferentes");
    }
     
  6. greven

    greven Folding Artist

    Para comparar strings usas o strcmp e não a operação que estás a fazer.
     
  7. Pretender

    Pretender Power Member

    Yep tens que usar o strcmp, adicionando a libraria string.h
    Fiz uma alteração ao código que postaste e meti mais uma situação para perceberes mais algumas funções da bib. string.h
    Penso que não tem nenhum erro mas pelo adiantar da hora já não garanto nada :P

    Código:
    #include <iostream.h>
    #include <iomanip.h>
    #include <stdio.h>
    #include <string.h>
    #define DIMENSAO 20
    void main()
    {
    char string1[DIMENSAO], string2[DIMENSAO];
    
    printf("Insira a palavra 1:\n");
    scanf("%s", string1);
    
    printf("Insira a palavra 2:\n");
    scanf("%s", string2);
    
    
    
    if (strcmp(string1,string2)==0)
    printf("\nas duas strings sao iguais");
    
    
    else if (strlen(string1)==strlen(string2))
    printf("\nAs duas strings são do mesmo tamanho mas nao sao iguais!!");
    
    else
    printf("As strings sao diferentes!");
    
    printf("\nVariaveis de controlo:");
    printf("\nEscreveu na String1: %s e na String2: %s",string1,string2);
    printf("\nO tamanho da string1 e': %d e da string2 e' %d: ",strlen(string1),strlen(string2));
    
    getchar();
    
    }
    
    
     
  8. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    se não me engano, o '==' compara os endereços onde estão guardadas as strings e não o seu conteúdo.
     
  9. dark_splinter

    dark_splinter Power Member

    Pois supostamente sendo uma string um "vector" o seu nome é igual ao 1ª endereço em que começa o vector....

    isto é .... string == &string[0]
    penso n tar enganado ... :joker:
     
  10. bustelo

    bustelo Power Member

    Estou a ter um problema. O compilador nao encontra nenhum erro neste codigo mas quando executa e chega a parte do if(strcmp(alunos.turma,letra[j])==0) o programa da erro!
    posso dizer que a variavel letra[] contem o alfabeto. queria comparar a letra que o utilizador insere se e igual a uma letra do alfabeto, se nao volta a correr o ciclo. qual o problema na codigo?

    PS. Obrigado pelas ajudas anteriores :D


    [Codigo]

    do {

    printf("Indique a sua turma %i\n",i);
    scanf("%s",alunos.turma);

    conterro=0;

    for (j=0; j<23;j++){

    if(strcmp(alunos.turma,letra[j])==0)
    conterro++;
    }

    if (conterro==0)
    printf("Turma Invalida\n");

    } while (conterro==0);

    [/Fim Codigo]
     
    Última edição: 25 de Maio de 2006
  11. dark_splinter

    dark_splinter Power Member

    podias por ai o codigo da estrutura também ....

    e já agora para que é o

    %i (no printf???)

    nunca utilizei o i....
     
  12. greven

    greven Folding Artist

    O i é a mesma coisa que um inteiro, ou seja o %d, mas não tenho a certeza.
     
  13. dark_splinter

    dark_splinter Power Member

    Nunca usei :)... mas vou testar então...
     
  14. bustelo

    bustelo Power Member

    Sim o &i e o mesmo que %d Variaveis de tipo inteiro. Utililizo sempre o %i vai mais ao portugues de i de inteiro :)

    a estrutura e:

    struct livro{
    char titulo[100];
    char subtitulo[100];
    char autor[50];
    char editora[20];
    char genero[20];
    int ano_ed;
    int edicao;

    }livros[100];


    acho que nao era necessario a estrutura para detectar o problema por isso e que nao meti. na percebo pk o programa ao executar da erro.
    Ng me consegue explicar?
    qual o melhor compilador? Uso o dev c++ Codigo Livre mas ja reparei que nas strings na e o forte dele. tipo quando meto o gets em vez do scanf, ele salta-me uma linha.


    [Codigo]

    do {

    printf("Indique a sua turma %i\n",i);
    scanf("%s",alunos.turma);

    conterro=0;

    for (j=0; j<23;j++){

    if(strcmp(alunos.turma,letra[j])==0) /* O programa aborta nesta linha embora a variavel j esteja declarada */
    conterro++;
    }

    if (conterro==0)
    printf("Turma Invalida\n");

    } while (conterro==0);

    [/Fim Codigo]
     
    Última edição: 25 de Maio de 2006
  15. dark_splinter

    dark_splinter Power Member



    Eu n vejo erro nessa linha :wow:....uso o mesmo compilador que tu o dev-c++.... e acontece me muita vez o mesmo que te está acontecer ... o programar ser compilado e depois dar erro do windows ao executar numa certa zona >(...
    E no final acabo por n perceber muito bem o que fiz mal :'(... já me aconselharam a programar C em linux para n dar esse tipo de problemas ... sinceramente n sei ...
     
  16. bustelo

    bustelo Power Member

    E mesmo isso que me esta acontecer... a compilar nao da erro nenhum depois ao executar no windows o programa da erro e fecha... realmente a vida de programador e dificil..... >(

    if(strcmp(alunos.turma,letra[j])==0)

    lembro que a variavel letra tem o alfabeto dentro desta esta declarada da seguinte forma: char letra[23]={'a','b'..etc..}
    se eu declarar a variavel letra apenas como um caracter tipo char letra;

    if(strcmp(alunos.turma,letra)==0)

    o programa aqui ja vai comparar a letra do alunos.turma com a letra e ao executar nao da erro!

    Coisa estranha nao acham?!
     
  17. Pelo que percebi queres saber se a letra (turma) introduzida pelo utilizador faz parte do abecedario, se for isto estas a cometer erros um pouco graves, mas quem nunca os cometeu???
    1º Erro: strcmp - esta funçao compara strings e nao caracteres. E ai que esta o erro pois esta funçao procura o fim da string (que é 0) se nao encontra esse 0 vai ate ao infinito o que nao acontece pois a memoria do computador nao e sempre zero e pára num endereco aleatorio, provavelmente nunca chega a esses endereço porque passando um determinado endereço de memoria o programa pode currumper os dados de outra aplicaçao e por isso o windows fecha a aplicaçao violadora,avisando que acontereu um erro, neste caso a tua.

    O problema neste caso e que nao compreendeste bem a funcao strcmp(...).

    O codigo para corrigir o erro, pode ser:

    [Codigo]

    do {

    printf("Indique a sua turma %i\n",i);
    scanf("%s",alunos.turma);

    // Verificas primeiro o tamanho da string, que nao pode ser , maior que 1 caracter
    if (strlen(alunos.turma) != 1)
    {
    // Turma invalida
    }

    conterro=0; // Nao sei para k precisas disto pois o loop vai se infinito pois conterro
    // vai ser sempre 0

    if ((alunos.turma >= 'A') && (alunos.turma <= 'Z')) // A<=turma<=Z
    {
    // Turma valida
    }
    else
    {
    // Turma invalida
    }

    } while (conterro==0);

    [/Fim Codigo]

    Espero ter ajudado.
     
  18. E que tal:

    static int
    data_valida(const char* data)
    {
    /* codigo aqui */
    }

    printf("escreva a data de nascimento");
    scanf("%8s", data);

    if(!data_valida(data)) {
    printf("data invalida");
    }

    ?
     
  19. bustelo

    bustelo Power Member



    O programa estava correcto como tinha, atraves do strcmp, apercebi-me que o erro estava no compilador pois quando mandava imprimir a variavel letra num ciclo este nao me imprimia nenhum caracter que estava dentro desta. Posteriormente questionei o meu professor em relacao a isto ele disse que como eu estava a fazer estava bem, somente o compilador que estava a usar, as strings nao e o forte dele, visto que tambem e open source e esta sempre em evolucao resolvi isto de uma forma simples...

    if(strcmp(alunos.turma,"a")>0 && strcmp(alunos.turma,"z")<0)

    para complementar posso utilizar aquele do verificar se a string e igual a um caracter :)

    todas as ajudas sao bem-vindas.

    Obrigado :)
     
  20. bustelo

    bustelo Power Member

    Viva surgiu-me outra duvida...

    [codigo]
    struct livro{
    char titulo[100];
    char subtitulo[100];
    char autor[50];
    char editora[20];
    char genero[20];
    int ano_ed;
    int edicao;

    }livros[100];

    for(i=1;1<=4;i++){
    printf("Introduzir titulo, %i\n",i);
    gets(livros.titulo);

    }

    Nesse exemplo vou inserir o titulo de 4 livros!
    Se quisesse apagar o titulo 2 por exemplo como faria para os titulos decrementarem uma posicao

    Expemplo

    titulo 1 - a
    titulo 2 - b
    titulo 3 - c
    titulo 4 - d

    ao eliminar o dois queria que ficasse o seguinte:

    titulo 1 - a
    titulo 2 - c
    titulo 3 - d

    Desculpem a minha ignorancia mas na sei mt de C alias sem muito pouco thanks

    se alguem me conseguir fornecer o codigo agradecia

    :)
     

Partilhar esta Página