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.


segunda-feira, 17 de setembro de 2012

Estrutura do código em Linguagem de programação C

C é uma linguagem do tipo estruturada. Isso quer dizer que, normalmente, sua leitura é feita de forma linear.
Segundo o site http://www.tiobe.com C é atualmente (setembro de 2012) a linguagem de programação mais utilizada mundialmente, (isso não quer dizer que é a que tem mais mercado de trabalho ou que seja a melhor).
C é já sofreu bastante implementações e foi utilizada como base para várias outras linguagens. Entre elas:
  • C++
  • JAVA
  • C# (C Sharp)
Para entender a estrutura básica para um programa em C vamos utilizar um programa simples
main()
{
printf("Hello world!");
getch();
}
Para compilar o código foi utilizado o Dev-C++ da Bloodshed Software (http://www.bloodshed.net/devcpp.html, Acesso em 17/09/2012).

Vamos a estrutura:
  • main()

Esta é a forma mais simples de se abrir uma função. E por regra, a função principal deve ser chamada de main.

  • { }

Todo corpo da função deve ficar entre as chaves. Ela delimita o inicio ({) e o fim (}) da função (programa).

  • printf("Hello world!");

printf é a principal função de saída do C. Todo o texto que deseja imprimir na tela deve ficar entre aspas, é possível ainda imprimir variáveis com o printf. Tanto os texto quanto as variáveis de saída devem ficar dentro dos parenteses.

  • getch();

É uma função simples para esperar uma tecla do usuário. Só foi utilizada neste caso para que o programa fique parado. Sem ela o programa apareceria e fecharia sozinho.

Mais detalhes sobre o "main" e seus argumentos:

Existem várias outras formas de se abrir a função main, por exemplo:
  • int main()
  • int main(void)
Porém o mais completo é:
int main(int argc, char *argv[])
Observe que entre os parenteses da função main foram declaradas duas variáveis. A variável argc do tipo inteiro e a variável argv do tipo caracter (o simbolo de asterisco na frente da variável indica que ela é uma variável ponteiro).
argc é de "Argument Counter" e serve para contar quantos argumentos o usuário passou para o programa.
argv: é de "Argumente Vector" e serve para armazenar os argumentos digitados pelo usuário.
Para ficar mais claro o uso deles faça o seguinte teste:
int main(int argc, char *argv[])
{
   int i;
   /* apresenta todos argumentos a partir de argv[0] */
   for(i = 0; i <= argc; i++)
      {
      printf("%s \n\n", argv[i]);
      }
   /* imprimi a quantidade de argumentos */
   printf("\nNumero de argumentos: %d",argc); 
   //O número de argumentos será 4, pois o argc[0] armazena o nome do programa.
   getch();
   return 0;
}
Salvar como argumento.c e compilar o programa acima e executa-lo através da linha de comando (MS-DOS no windows).
Exemplo:

Repare que o meu programa foi armazenado em C:\, por isso utilizei o comando cd C:\ antes de executa-lo.
Logo após executei o meu programa "argumentos.exe" e na sua frente coloquei alguns argumento apenas para teste, o resultado foi:
argumentos.exe

George

aaa

bbb

ccc

<null>

O primeiro argumento (argv[0]) sempre será o nome do programa.
O 4 posteriores (George, aaa, bbb, ccc) foram digitados pelo usuário.
E o ultimo é referente ao caractere "/0" (null ou nulo). Toda matriz de caracteres em C termina com ele.