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 Haro_man, 19 de Novembro de 2007. (Respostas: 9; Visualizações: 770)

  1. Haro_man

    Haro_man Power Member

    Boas pessoal :)

    Alguem me sabe dizer quais são os argumentos e o seu papel que existem na função main ?

    Tenho aqui uma linha de codigo que não consigo decifrar realmente o que isto faz :

    for (i = 0; s; s = s>=65 && s <=90 ? s + 32 : s, i++) ;

    PS: este ? e os dois pontos a frente ainda nao chegei a perceber bem qual a sua função

    :kfold:
     
  2. HecKel

    HecKel The WORM

    int main(int argc, char* argv[]);

    (salvo erro é assim)

    O argc dá-te o número de argumentos que o programa recebe quando é executado, isto é, quando executas o comando na consola podes colocar algumas palavras à frente do nome do programa, isto são os argumentos.

    O argv é o array desses argumentos, isto é, em cada posição do array está uma palavra, a separação é feita pelo space.



    Não faço ideia do que é o s, mas quanto ao condição?valor1:valor2, isto é sinónimo a:

    Código:
    if (condição == true)
        return valor1;
    else
        return valor2;
    Atenção que este return que falo aqui, não é um return para interromper a função, mas sim o valor que vai ser considerado naquela operação. Em vez do tradicional if de statements, vais ter um if de expressions. Espero não te ter confundido com isto ;)
     
  3. Baderous

    Baderous Banido

    Código:
    s[i] = s[i]>=65 && s[i] <=90 ? s[i] + 32 : s[i]
    Este código utiliza o operador condicional '?', que é um operador ternário que indica que espera 3 argumentos.
    É do tipo: condicao ? expressao1 : expressao2
    Funciona da seguinte maneira:
    - A condição é avaliada
    - Se o resultado for verdade, então o resultado de toda a expressão é o valor devolvido por expressao1
    - Senão é o valor devolvido por expressao2

    É quase semelhante a:

    Código:
    if (s[i]>=65 && s[i]<=90)
            s[i]=s[i]+32;
         else
             s[i]=s[i];
    Os argumentos da função main são argc e argv:
    Código:
    int main(int argc, char *argv[])
    São 2 parâmetros que permitem que um programa receba argumentos passados na linha de comando.
    argc - inteiro que indica quantos argumentos foram passados na linha de comando (incluindo o próprio nome do programa)
    argv - vector contendo todas as strings passadas na linha de comando

    Esse for que colocaste aí, tem um ; no fim o que quer dizer que não tem instruções, ou seja, só tem inicializações (i=0), condição (s) e pós-instruções (s = s>=65 && s <=90 ? s + 32 : s, i++).
    Ou seja, é equivalente a:
    Código:
    i=0;
         while (s[i]) {
               s[i] = s[i]>=65 && s[i] <=90 ? s[i] + 32 : s[i];
               i++;
               }
    ou seja, enquanto s!=0, ele faz o teste da condição, atribuindo em seguida um novo valor a s (estes 2 passos são feitos na 1ª linha de código do while). Para iterar no ciclo, incrementa-se o i.
     
  4. Consu

    Consu Power Member

    Esse for não é nada mais que uma maneira estranha de converter uma string para minúsculas.

    Código ASCII do 'A' = 65
    Código ASCII do 'Z' = 90

    Código ASCII do 'a' = 97 = 65 + 32 = 'A' + 32
    Código ASCII do 'z' = 122 = 90 + 32 = 'Z' + 32


    Sempre que esse ciclo encontra uma maiúscula converte-a para minúscula. O caracter de terminação de string é o '\0' que tem código ASCII 0, logo quando encontrar esse caracter o 0 é interpretado como false, e qualquer outro caracter que surja como true.
     
  5. Jorge Candeias

    Jorge Candeias Power Member

    Código:
    for(i = 0; stringX[i] != 0x00; i++)
     if(stringX[i] > 0x40 && stringX[i] < 0x5B)
     stringX[i] = stringX[i] | 0x20;
    
    LOL mais simples e faz o mesmo e até mais rápido...

    já agora no código que o Haro_man postou, o ciclo for termina quando??
    OK já vi: executa enquanto s for verdadeiro (char não nulo)


    Cumprimentos
     
    Última edição: 19 de Novembro de 2007
  6. Consu

    Consu Power Member

    Como referi o ciclo termina quando encontrar o caracter '\0' (termina a string) que tem código ASCII 0. Nessa altura a condição é falsa e o ciclo termina.
    Mais simples? Não vejo onde... Mais rápido sim, dado que a adição foi substituída por um OU.

    Se é para ser mais legível creio que assim fica melhor:
    Código:
    #include <ctype.h>
    
    (...)
    for( int i = 0; i < strlen( str[i] ); ++i )
        str[i] = tolower( str[i] );
    (...)
    
     
    Última edição: 19 de Novembro de 2007
  7. greatbunzinni

    greatbunzinni Power Member

    E inadvertidamente acabaram de fazer todo o trabalho de casa do gajo. Boa.
     
  8. Haro_man

    Haro_man Power Member

    Caro greatbunzinni , ha pessoas que não tem oportunidade de ter aulas , ou que alguem lhes ensine C, e tem de se safar sozinhos e a custa de algumas ajudas. No meu caso, tenho que re-aprender sozinho , porque quando tive a oportunidade de aprender não quis saber. Agora vou fazer exame e não tenho aulas , ou seja estou externo numa escola e tenho que me desenrascar , se andasse a ter aulas não vinha aqui para me fazerem os meus TPC's , mas vim sim obter ajuda.


    Em relação ao resto obrigado a todos os que debateram o problema :)

    De facto nao tava mesmo a chegar a conclusão que aquilo fossem os nr's da tabela asci para serem convertidos para minusculas.

    Obrigado pela preciosa ajuda :001:
     
  9. greatbunzinni

    greatbunzinni Power Member

    Podes vir aqui com o drama do "ai estou a tirar um curso mas não vou às aulas" mas a verdade é que vieste aqui, espetaste o enunciado dos problemas, não apresentaste qualquer trabalho autónomo e limitaste-te a colher as respostas.

    Tendo em conta a altura do campeonato, o teu desespero para obter respostas e agora a tua declaração que nem pões os pés nas aulas então tudo indica que isso eram perguntas de algum mini-teste. Isso implica que vais receber um brinde de avaliação que não corresponde àquilo que sabes e que com certeza será superior a gente do teu curso que sabe mais que tu e, ao contrário do teu caso, esforçou-se para aprender alguma coisa.

    Por isso podes achar o teu caso muito tocante mas na verdade isso não justifica absolutamente nada que andes a servir-te do pessoal dum forum para fazer os teus testes por ti.

    No final ainda passas e acabas o curso sem saber absolutamente nada. Depois vais pedir ao pessoal do forum para trabalhar por ti?
     
  10. Haro_man

    Haro_man Power Member

    realmente.. eu n vou as aulas porque nao tenho aulas ! sabes o que e tar externo por acaso? so te podes inscrever aos exames , mas nem sequer tens aulas para isso . Quando nao se consegue resolver alguma coisa o que e que se faz? se calhar nao pedes ajuda..
     

Partilhar esta Página