Pesquisar no blog:

quarta-feira, 28 de novembro de 2012

Linguagem C - Função rand e srand

A função rand na linguagem C tem o objetivo de gerar números aleatórios.
Exemplo:
main()
{
int i, aleatorio;
for(i = 0; i < 10; i++)
{
    aleatorio = rand();
    printf("%d\n",aleatorio);
}
system("pause");
}
Observe que a sintaxe é bem simples. Mas por que a cada vez que o laço se repete devemos aplicar o valor da função rand a nossa variável?
A função rand utiliza um número como "semente" para gerar os números aleatórios e esse número só mudará quando a função for chamada novamente.
O resultado do código que temos acima foi:

Perceba que sempre que abrimos nosso programa, os números gerados são o mesmos. Então não temos, ainda, números realmente aleatórios.
E se mudarmos nossa variável para receber o valor da função rand apenas um vez, dessa forma:
main()
{
int i, aleatorio = rand();
for(i = 0; i < 10; i++)
    printf("%d\n",aleatorio);
system("pause");
}
Nossa variável terá sempre o mesmo valor. E esse será nosso resultado:

Para que você gere números que realmente serão imprevisíveis com a função rand, devemos usar no mesmo programa outra função chamada srand (seed randomic) usada para que o número usado como semente seja sempre diferente. O uso mais comum da função srand é junto com a função time da biblioteca <time.h>, que busca a data/hora do seu computador. Como o horário da execução de cada parte do seu programa nunca será o mesmo, tornaremos a semente imprevisível:
#include 
O meu resultado foi:

Observe agora que a cada vez que executamos nosso programa um resultado diferente é fornecido.
E como colocar um intervalo especifico para os nossos números? Pois os números gerados pela função rand vão de 0 à 32767.
Podemos utilizar o operador "%" (mod) que nos retorna o resto de uma divisão. Se queremos, por exemplo, simular a jogada de um dado, deveremos limitar nossos números aleatórios entre 1 à 6.
Usando o operador "%" aplicaríamos ao valor da variável que receberá os números aleatórios o seguinte calculo: (rand() % 6)  + 1;
Qualquer número dividido por 6 retornará o resto entre 0 e 5, somando isso a 1 teremos o intervalo de 1 à 6.

Exemplo de um programa que simula a jogada de um dado:

#include 

Exemplo de um programa que simula a retirada de um número de um bingo de 1 à 100:
#include <time.h>
main()
{
srand(time(NULL));
int i, aleatorio = (rand() % 100) + 1;
printf("%d\n",aleatorio);
system("pause");
}

quarta-feira, 14 de novembro de 2012

Linguagem C: Tipos de dados

TIPO
BYTES
ESCALA
char
1
-128 a 127
int
2
-32768 a 32767
float
4
3.4E-38 a 3.4E+38
double
8
1.7E-308 a 1.7E+308
void
0
0
long / long int
4
-2.147.483.647 a 2.147.483.647
unsigned char
1
0 a 255
unsigned int
2
0 a 65535
unsigned long
4
0 a 4.294.967.294

char: variável para armazenar caractere (letra).Ela pode ser considerada um tipo numérico, pois os caracteres são reconhecidos por numerações referente a tabela ASCII.
Exemplo:
main()
{
char ch1 = 'G', ch2 = 'H', ch3 = 'W';
printf("Minhas iniciais sao: %c%c%c", ch1, ch2, ch3);
getch();
}
Em C para imprimir as variáveis do tipo "char" devemos utilizar o "%c" (caractere). Neste caso, foi adicionado 3 "espaços" para imprimir as variáveis "%c%c%c". Esses "espaços" podem ser colocados em qualquer parte do texto. Eles serão buscados na ordem em que digitamos as variáveis depois do texto, ou seja, primeiro é impresso o ch1, em segundo o ch2 e por ultimo o ch3.

int: armazena valores numéricos do tipo inteiro.
Exemplo:
main()
{
int ano = 1988, idade = 23;
printf("Minha idade e' %d. Eu nasci no ano %d.", idade, ano);
getch();
}
Para tipos inteiros usamos o "%d" (Decimal) para reservar sua posição.

float: armazena valores numéricos do tipo fracionário (real).
Exemplo:
main()
{
float peso = 75.530, altura = 1.72;
printf("Meu pego e' %.3f. E minha altura e' %.2f.", peso, altura);
getch();
}
Para tipos de pontos flutuante usamos o "%f" (float/flutuante) para reservar sua posição.

double: armazena valores numéricos do tipo fracionário (real). A diferença de double para float é o seu espaço reservado em memória (4 bytes), que permite a entrada de números com alta precição.
Exemplo:
main()
{
double t = 0.041792653589361;
printf("t =  %.15lf", t);
getch();
}
Para tipos de dupla precisão usamos o "%lf" (long float) para reservar sua posição.

void: define um tipo “vazio”. Parece estranho e talvez difícil de imaginar seu uso. Mais em C um bom exemplo é seu uso para criar funções que não retornam valores.
Exemplo:
void sair() //função para sair ou voltar para tela inicial.
{
    printf("\n\nPara sair pressione ESC e para voltar pressione qualquer tecla.\n");
    char sair = getch();
    if(sair != 27) //se usuário não precionar ESC o programa é chamado novamente.
        main();
    return 0;
}

main()
{
printf("Essa mensagem sera' repetida se voce nao pressionar ESC");
sair();
}

long / long int: armazena valores numéricos do tipo inteiro. A diferença de long int para int é o seu espaço reservado em memória (4 bytes), que permite a entrada de números  muito maiores como visto na escala da tabela acima.
Exemplo:
main()
{
long int t = 2035893612;
printf("t =  %ld", t);
getch();
}

unsigned char: tem o mesmo tamanho do tipo char, mais não permite armazenar valores negativos.

unsigned int: tem o mesmo tamanho do tipo int, mais não permite armazenar valores negativos.

unsigned long: tem o mesmo tamanho do tipo long, mais não permite armazenar valores negativos.