• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ribamar

Programa sobre tipos em C

4 mensagens neste tópico

Boas.

Tenho de desenvolver um programa que indique qual dos tipos (unsigned char, unsigned short, unsigned int ou unsigned long) pode armazenar o valor inteiro positivo introduzido pelo utilizador. O programa deve funcionar para qualquer tipo de arquitectura.

Não estou a conseguir chegar a lado nenhum, pois não posso ler do input o numero e guarda-lo num tipo primitivo, pois o utilizador pode introduzir por exemplo 4.294.967.297, e o nr se eu o guardar em long fica 4.294.967.296, pois este é o numero maximo que 1 long consegue representar. O mesmo se aplica aos outros tipos. Se o utilizador introduzir 65.537, se eu guardar em short fica 65.536, pois este é o numero maximo que 1 short guarda.

Já pensei guardar numa string o valor lido, e depois contar as posiçoes do array e comparar com o sifeof de cada tipo. Tambem não vai funcionar em muitos casos, porque por exemplo 65.536 cabe num short, mas 65.537 já so cabe num int ou long....

Se alguem tiver alguma ideia diga algo  :D

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lês o valor para uma string, ou para o tipo de dados (inteiro) que suporte o valor mais elevado. Usando o sizeof podes ver qual o tipo de dados mais apropriado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem me parecia que era PICC :D

Acho que deste a resposta à tua questão no teu próprio post. Se percebi, o objectivo é encontrar o tipo de dados mais pequeno que consiga armazenar um número dado pelo utilizador. O enunciado

Faça um programa que indique qual dos tipos (unsigned char, unsigned short, unsigned int ou unsigned long) pode armazenar o valor inteiro positivo introduzido pelo utilizador. O programa deve funcionar para qualquer tipo de arquitectura.
é omisso, e das duas uma: ou interpretas como quiseres, ou perguntas ao Eng. P.P. qual a interpretação a dar. Mas acho que neste caso não é necessário perguntar.

Eu interpretava do seguinte modo: o número dado não pode ultrapassar o tamanho de unsigned long. Eu usava um unsigned long long para armazenar o valor do utilizador, e depois ia comparando com casts para variáveis mais pequenas, do tamanho mais pequeno para o maior, até encontrar uma comparação que desse true. Se nenhuma der true é porque o valor é demasiado grande para caber num desses tipos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acabei por fazer assim:

int main(){
unsigned long ul;
unsigned long ulmax= ~0;
unsigned int uimax= ~0;
unsigned short usmax= ~0;
unsigned char ucmax=~0;
scanf("%u", &ul);
if(ucmax>=ul) puts("Pode ser armazenado em char, short, int e long.");
else if(usmax>=ul) puts("Pode ser armazenado em short, int e long.");
else if(uimax>ul) puts("Pode ser armazenado em int e long.");
else if(ulmax>ul)puts("Pode ser armazenado em long");
else puts("Se o número introduzido foi %u, entao pode ser armazenado em long.");

o último else está assim porque se o utilizador introduzir um número superior ao que um unsigned long pode armazenar, o número é guardado em memória como o maior número que pode ser guardado em unsigned char. Ou seja, este caso é para o maior número possível do tipo unsigned char mais os número superiores.

Não sei se esta é a melhor maneira, mas de certeza que é a maneira que vou entregar ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora