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

Iniciação em C - Dúvidas

Discussão em 'Programação' iniciada por PsySc0rpi0n, 29 de Junho de 2012. (Respostas: 62; Visualizações: 3359)

  1. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Boas...

    Estou a começar a aprender C e estou a ler o livro do Luís Damas e cheguei aqui a um ponto que o código parece-me estar igual ao que vem no livro mas por alguma razão o programa termina abruptamente e não consigo descobrir porquê!

    Alguém que me dê luz para eu ver o erro...

    O código é o seguinte:

    PHP:
    /*Programa cap02-06*/
    #include <stdio.h>

    main ()

    {
    short int idade;
    int   montante;
    long  int n_conta;

        
    printf ("Qual a sua idade\? "); scanf("%hd",&idade);
        
    printf ("Qual o montante a depositar\? "); scanf ("%d",montante);
        
    printf ("Qual o numero de conta\? "); scanf ("%ld",n_conta);
        
    printf ("Uma pessoa de %hd anos depositou €%d na conta %ld\n",idade,montante,n_conta);
    }
    O que estará mal aqui?
     
  2. Psycop

    Psycop I fold therefore I AM

    Olá

    O que está a acontecer é que o computador é tão rapido a fazer o que lhe pedes que a janela abre e fecha quase imediatamente. Para que possas ver o resultado e manter a janela aberta ate clicares numa tecla usa o system("PAUSE"); ou o getch(); no final do programa antes da ultima { do main()
     
    Última edição: 29 de Junho de 2012
  3. dagas46

    dagas46 Power Member

    Exactamente o que o Psycop disse mas ele enganou-se e em vez de ser antes da última { é sim antes da última }. É a última instrução da main, ou seja, a seguir ao último printf. E usa getchar() em vez de getch().

    Mais duas coisas:

    1 - Escreve apenas uma instrução por linha. Se estás a aprender é melhor.
    2 - No 2º 3º scanf, falta um & antes do nome da variável
     
    Última edição: 29 de Junho de 2012
  4. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Obrigado

    Obrigado...

    O getchar() não funcionou. O getch() já funcionou!
     
  5. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Qual é a diferença entre ter:

    PHP:
    float var1 1E03;
    e

    PHP:
    double var 1e06;
    A minha dúvida é no 'E' e 'e' e não no float e double.


    Edit;

    Para experimentar fiz isto:

    PHP:
    /*programa c02-08*/

    #include <stdio.h>

    main ()

    {
    float var1 1E03;
    float var2 1e03;

        
    printf ("A variavel 1 e %f e a variavel 2 e %f\n"var1var2);

        
    getch ();
    }
    O resultado é igual. 1000.000000.
     
    Última edição: 29 de Junho de 2012
  6. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Já vi a diferença entre 1E03 e 1e03... É apenas o formato de saída do valor!


    Agora:

    PHP:
    /*programa c02-08*/

    #include <stdio.h>

    main ()

    {
    float kilo 1.0E03;
    double grama 1.0E06;
    float peso;

        
    printf ("Quantas toneladas comprou\?"); scanf ("%f",&peso);
        
    printf ("Singnifica que comprou %f quilogramas e %f gramas.\n",peso*kilopeso*grama);
        
    printf ("Quilos comprados: %f = %e = %E\n"pesopeso*kilopeso*kilo);
        
    printf ("Gramas compadros: %f = %e = %E\n"pesopeso*gramapeso*grama);
        
    getch ();
    }
    Porque é que se eu declarar a variável peso como int unsigned, os cálculos não são efectuados devidamente?
     
  7. Psycop

    Psycop I fold therefore I AM

    A diferença entre o unsigned int e o signed int é o facto do unsigned int usar 4 bits para números menores que zero e outros 4 bits para números maiores que zero. O signed int usa todos os 8 bits para números maiores que zero:

    unsigned int: -32768 até 32768
    signed int: 0 até 65555 [FONT=arial, helvetica, clean, sans-serif][/FONT]
     
  8. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Mas porque é que ao declarar as variáveis com o signed/unsigned int, influencia o resultado???
     
  9. Psycop

    Psycop I fold therefore I AM

    Tem a Ver com o número de bits que a variável irá conseguir armazenar!
     
  10. cyrus takem

    cyrus takem Power Member

    para contas 2+2 em nada, so influencia o resultado se for maior que esses valores.
    quanto ao getchar() nao ter funcionado isso e porque ele leu o ultimo enter depois do numero da conta..
     
  11. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Eu quando li essa parte no livro do Luís Damas, não entendi bem.

    Então, para tentar resumir, é possível colocar numa tabela, essa informação para os tipos de variáveis com que eu agora estou a trabalhar???

    bytes intervalo
    int 2 -32768 a 32767
    short int 2 -32768 a 32767
    long int 4 -2147483648 a 2147483647
    unsigned int 2 0 a 65535
    unsigned short int 2 0 a 65535
    unsigned long int 4 0 a 4294967295
    float 4 ???
    double 8 ???



    Ajudem-me a acabar de preencher esta tabela, please!!!

    Para tentar entender a tabela vou experimentar com um exemplo:

    O tipo de variável int não conseguirá armazenar um valor, por exemplo de -32769 ou de 32768, certo? Se eu fizer isto o resultado de operações com a variável que defini como int vai produzir resultados errados, não é?



    Ok... Obrigado
     
  12. O tamanho (número de bits) de cada tipo varia de arquitectura para arquitectura, e também com o compilador que estás a usar. Por exemplo o int no meu pc tem 4 bytes.
    Para sabers os limites, tens a biblioteca limits.h (e float.h), e também há o operador sizeof() que te permite saber o tamanho em bits do que tu lhe mandares lá para dentro.
    Se usares valores fora do limite o que vai acontecer é um overflow, o C não se queixa, nem te avisa directamente, mas no decorrer do programa pode vir a dar-te uma excepção, por isso se for previsível que possa acontecer tens de usar algum método para te protegeres.
    anyway: 32bits
    Código:
    int: 4
    short int: 2
    long int: 4
    long: 4
    long long: 8
    float: 4
    double: 8
    
    
    int_max: 2147483647
    int_max+1: -2147483648
    int_max+101: -2147483548
    
    em 64bits:
    Código:
    int: 4short int: 2
    long int: 8
    long: 8
    long long: 8
    float: 4
    double: 8
    
    
    int_max: 2147483647
    int_max+1: -2147483648
    int_max+101: -2147483548
    
    código:
    Código:
    #include <stdio.h>
    #include <limits.h>
    int main(){
    printf("int: %d\n", sizeof(int));
    printf("short int: %d\n", sizeof(short int));
    printf("long int: %d\n", sizeof(long int));
    printf("long: %d\n", sizeof(long ));
    printf("long long: %d\n", sizeof(long long));
    printf("float: %d\n", sizeof(float));
    printf("double: %d\n", sizeof(double));
    
    
    int int_max=INT_MAX;
    printf("\nint_max: %d\n", int_max);
    int_max+=1;
    printf("int_max+1: %d\n", int_max);
    int_max+=100;
    printf("int_max+101: %d\n", int_max);
    }
    
     
  13. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Obrigado por explicares mas há ali cenas que não entendo e acho que nem vou perguntar, pelo menos para já...

    Vou seguir no livro e ver no que dá!

    Cheers
     
  14. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Pronto...

    Já me deparei com mais um pormenor que não consegui entender...

    Se a variável int suporta valores desde -32768 a 32767, como é que ela, num simples programa que pede dois valores e calcula os resultados das opreações mais comuns (+, -, * e /), ao introduzir os valores de 5000 e 2500, na operação de multiplicar, aceita o valor de 12500000???
     
  15. estas a assumir que o int tem 2 bytes, e o teu computador e o compilador estão a usar int de 4 bytes, daí que o range seja maior (o int fica com valores entre -2147483648 e 2147483647).
    O que eu te tentei explicar atrás (pelos vistos de uma forma com pouca qualidade :P) foi isto.

    Se realmente tentares fazer operações cujo resultado esteja fora dos valores suportados por um determinado tipo ele dá sempre overflow (isto é faz as contas como se nada fosse, mas os bits que transbordarem são ignorados e o resultado não é correcto.
     
  16. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Ok, então acho que estou a entender...

    No entanto ali no post que colocaste código C, há coisas que ainda não entendo porque ainda lá não cheguei a esse ponto...

    Estás "muito à frente" para mim. lol

    Eu estou a seguir o tal livro que falei do Luís Damas mas ainda só vou na página 56, se não me engano.

    Outra coisa que fiz foi tentar alterar o formato de saída dos resultados dos cálculos embora os dois valores pedidos fossem declarados como int. Ou seja, os dois valores pedidos foram armazenados em variáveis int mas na multiplicação e na divisão, quando "pedi" para mostrar os resultados dessas operações com o printf, defini o formato desses resultados como float, tipo isto:

    PHP:
    #include <stdio.h>

    main ()

    {
         
    int num1num2;
       
               
    printf ("Introduza um numero: "); scanf ("%d", &num1);
               
    printf ("Introduza outro numero: "); scanf ("%d", &num2);
               
    printf ("A soma da: %d",num1 num2);
               
    printf ("A subtracção da: %d",num1 num2);
               
    printf ("A multiplicação da: %f",num1 num2);
               
    printf ("A divisão da: %f",num1 num2);

        
    getch ();
    }

    e ainda tentei:


    PHP:
    #include <stdio.h>

    main ()
    {
         
    int num1num2;
       
               
    printf ("Introduza um numero: "); scanf ("%d", &num1);
               
    printf ("Introduza outro numero: "); scanf ("%d", &num2);
               
    printf ("A soma da: %d",num1 num2);
               
    printf ("A subtracção da: %d"num1 num2);
               
    printf ("A multiplicação da: %f", (float) (num1 num2));
               
    printf ("A divisão da: %f",(float) (num1 num2));

        
    getch ();
    }

    mas também não deu resultados certos nem na multiplicação nem na divisão!!!

    O que fiz como é óbvio, está errado, só não percebi porquê. Usei o casting para mudar temporariamente de tipo as variáveis na multiplicação e divisão!
     
    Última edição: 3 de Julho de 2012
  17. dagas46

    dagas46 Power Member

    Compilaste o código?

    Isso deveria ter dado erro a compilar
     
  18. Sim, ele tem ai uns 2/3 erros no código ("" a mais faltam os {} e não há getch () ou é getchar())
    Em todo o caso que valores estás a usar para num1 e num2?
     
  19. cyrus takem

    cyrus takem Power Member

    na multiplicaçao da resultado errado? acho que na multiplicaçao de inteiros podes usar int como reultado..
    quanto a divisao eu normalmente faço:

    float a;
    int b, c;
    a=(float)b/(float)c;


    porque como tu tens:
    a=(float)(b/c);
    ele primeiro faz b/c e so depois e que converte para float se nao me engano e isso da resultados errados

    resumindo o que disse, substitui esta linha:
    printf ("A divisão da: %f",(float) (num1 / num2));

    por:
    printf ("A divisão da: %f",(float)num1 / (float) num2));
     
  20. PsySc0rpi0n

    PsySc0rpi0n Power Member

    Vou editar o código e corrigir e já cá volto para responder!
     

Partilhar esta Página