Iniciação em C - Dúvidas

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?
 
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:
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()

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:
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()

Obrigado

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

Obrigado...

O getchar() não funcionou. O getch() já funcionou!
 
Qual é a diferença entre ter:

PHP:
float var1 = 1E03;

e

PHP:
double var 1 = 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", var1, var2);

    getch ();
}

O resultado é igual. 1000.000000.
 
Última edição:
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*kilo, peso*grama);
    printf ("Quilos comprados: %f = %e = %E\n", peso, peso*kilo, peso*kilo);
    printf ("Gramas compadros: %f = %e = %E\n", peso, peso*grama, peso*grama);
    getch ();
}

Porque é que se eu declarar a variável peso como int unsigned, os cálculos não são efectuados devidamente?
 
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]
 
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

Mas porque é que ao declarar as variáveis com o signed/unsigned int, influencia o resultado???
 
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..
 
Tem a Ver com o número de bits que a variável irá conseguir armazenar!

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 é?



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

Ok... Obrigado
 
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);
}
 
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
 
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???
 
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.
 
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 num1, num2;
   
           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 num1, num2;
   
           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:
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?
 
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));
 
Back
Topo