quinta-feira, 28 de março de 2013

OpenGL: Configurando o ambiente

A OpenGL possui 3 bibliotecas com a finalidade de simplificar determinadas tarefas de programação: Elas são GL, GLU e GLUT.

GL: É responsável pelas tarefas de baixo nível.
GLU: É utilizada para criar objetos complexos.
GLUT: Utilizada para fazer a comunicação com as janelas por meio de funções.

Quando eu comecei a passar os tutoriais de C, eu mostrei uma pequena lista de compiladores que poderiam ser usados durante a programação da linguagem. Todos os exemplos que eu passar aqui, vou estar utilizando a IDE Dev-C++ com o sistema Windows (Ruindows para alguns :) ).

Caso você ja tenha as bibliotecas, é bom atualiza-las. Abra o Dev-C++. Clique na aba 'Ferramentas', e depois em atualizações. Deve aparecer esta tela.


Na aba 'Groups', selecione 'OpenGL', seguindo um click em 'Check for updates'. Ele vai atualizar a lista de bibliotecas. Nela você deve achar e baixar a biblioteca GLUT, e atualiza-la.

Agora indo ao ponto de que as bibliotecas não se encontram na máquina.
Entre no diretório do Dev-C++ (\Dev-Cpp\Include\GL), e verifique se o mesmo contém gl.h, glu.h e glut.h.



OBS: Caso não consiga achar as bibliotecas, as mesmas estão disponíveis no site da OpenGL
Depois de baixar, copie a "glut32.dll" para a pasta "system32". Copie a "glut.h" para "\Dev-Cpp\Include\GL".

Após isso, va em "Arquivo>>Novo>>Projeto", e dentro da aba "Basic" selecione "Console Application", definindo o projeto como "Projeto C++". Dê um nome ao projeto e clique "OK". Você deve salvar seu projeto em uma pasta de fácil acesso.


Va na aba 'Projeto' e clique em Opções de Projetos, clicando em seguida na aba 'Parâmetros'. No Linker, adicione: lib/libglu32.a, lib/glut32.a e lib/libopengl32.a. As mesmas se encontram na pasta "\Dev-C++\Lib".



quarta-feira, 27 de março de 2013

Linguagem C: Parte 7 [Strings]

As Strings são um conjunto de caracteres armazenados em um vetor. Diferente de char, float, double e int, a string não é um tipo básico de C. Nesse texto, irei mostrar formas de construir e tratar Strings, usando algumas funções que a linguagem C oferece. :)



 Exemplos de Strings:
"Paulo", "Brasil", "Faculdade de Psicologia", "C".

OBS: Note que para representar um char, eu utilizo aspas simples, enquanto as strings são utilizadas aspas. Por isso "C" é uma string, e 'C' é um char.

Uma coisa importante de entender é como uma string é utilizada. Como uma string é um vetor de caracteres, cada caractere da palavra é colocado em uma posição como se fosse um char. Quando declaramos a carga inicial de um vetor, de forma superior ao número de caracteres utilizados, o compilador colocará automaticamente o caractere '\0' para delimitar a string.
Ex:
char pais[30] = "Brasil";

Ficaria {Brasil+\0}, que da 5+1, utilizando 6 caracteres ao todo.

Outros exemplos:

char nome[30] = "Pedro";
char pais[30] = {'B','R','A','S','I','L'}; // delimitador colocado depois de 'L'
char fruta[] = "tomate";
char *fruta = "tomate"; // igual ao anterior

No caso de fruta, é calculado o número de caracteres da string, sendo add o '\0'.

I/O de Strings

Existe algumas funções de grande importância para leitura e escrita de strings.

Puts
Essa função é utilizada para escrever strings que estejam em ConstantesVariáveis, ou simplesmente imprimir uma linha, mudando de linha logo em seguida.

Ex:
puts("IBM");
printf("IBM\n");
As duas expressões irão imprimir, indo em seguida para uma nova linha.

Printf
Sua maior importância é melhor empregada na escrita de formato da string, utilizando a formatação.

Ex:
char pais[30] = "Paraguai";
printf("País: %s", pais);

Scanf
É uma função que permite fazer a leitura de apenas uma palavra na string utilizando %s. Claro que existe maneiras de fazer a leitura de mais uma palavra usando scanf(). Poderíamos utilizar scanf("%[^\n]s", var), informando que o scanf() vai ler até encontrar um ENTER. O bom é utilizarmos um fflush(stdin), antes do scanf(), para limpar o buffer do teclado. É sempre bom lembrar que não colocamos "&" antes de scanf() quando se trata de strings.

Ex:
#include<stdio.h>
main()
{
   char materia;
   puts("Insira o nome da materia:");
   scanf("%s",materia);
   printf("Matéria: %s" ,materia);
   system("pause");
}

Gets
Essa função tem a capacidade de ler mais de uma palavra. Sendo para alguns, uma das mais apropriadas para ler strings.

Ex:
#include<stdio.h>
main()
{
   char nome[60];
   puts("Insira seu nome completo:");
   gets(nome);
   printf("Seu nome é: %s", nome);
}

►Funções Especias para manipular Strings

As seguintes funções tem o objetivo de auxiliar o programador, sendo consideradas as principais para manipular strings. Elas se encontram na biblioteca <string.h>, por isso não se esqueça de chamar essa biblioteca em seus programas, quando for utilizar essas funções, evitando assim possíveis erros.

►1 - strlen: Devolve o número de caracteres de uma string.
Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char psg[60]; // personagem
   int tamanho;
   puts("Ins nome do personagem:");
   gets(psg);
   tamanho = strlen(psg);
   printf("O personagem tem %d caracteres.", tamanho);
}

►2 - strcmp: Função usada para comparar duas strings. Podemos levar em consideração as seguintes informações.
strcmp(string1,string2);
strcmp("bola","barco"). A resposta é: O primeiro é maior, pois 'o' é maior que 'a'.
strcmp("canudo","juiz"). A resposta é: O segundo é maior, pois 'c' é menor que 'j'.
strcmp("navio","navio"). A resposta é: Os dois são iguais.

O que essa função faz é analisar o primeiro caractere das strings passadas por seus parâmetros, comparando eles entre si. A letra maior é sempre a que vem depois. Se a primeira letra da string1 for maior que a da string2, então string1 é maior. Se as duas strings tiverem a primeira letra igual, então a função verifica a segunda letra e assim por diante. Se ao chegar ao fim da leitura e ambas tiverem os mesmos caracteres, as duas serão classificadas como iguais.

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z1[60], z2[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z1);
   puts("Insira outra palavra:");
   gets(z2);
   valor = strcmp(z1,z2); // atribuindo o valor da função a variável
   if(valor == 0)
      puts("Igual!!!");
   else if(valor > 0)
      puts("Primeira é maior.");
   else
      puts("Segunda é maior.");
}

►3 - strcpy: É uma função que recebe dois argumentos, copiando o conteúdo de uma string para outra. Sua definição é: strcpy(char *dest, char*orig), a orig copiada para dest.

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z[60], zCopia[60];
   puts("Insira um nome:");
   gets(z);
   strcpy(zCopia, z);
   printf("O nome é: %s", zCopia);
}

►4 - isNull: Essa função verifica se a string contém um caractere, devolvendo um valor lógico. Ela não faz parte da linguagem C, o que pode ocasionar erro em seu compilador,  mas eu achei um exemplo de como pode ser usada.

Ex:
#include <stdio.h>
main()
{
   char z[60];
   int valor;
   puts("Insira um nome:");
   gets(z);
   valor = isNull(z); // atribuindo o valor da função a variável
   printf("%d", valor); // retorna 0(falso) ou 1(verdadeiro)
}
int isNull(char *z)
{
   return (z[0] == '\0');
}

►5 - strcat: Concatena a string orig com a dest. Sua definição: strcat(char *dest, char *orig).

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z[60], zCopia[60];
   puts("Insira uma palavra:");
   gets(z);
   strcpy(zCopia,z);
   strcat(z, zCopia);
   printf("Palavra =  %s", z);
}

►6 - strcountc: Devolve o número de vezes que um determinado caractere apareceu em uma string. Sua definição: strcountc(char *z, char a). :)

Ex:
#include <stdio.h>
#include <string.h>
int strcountc(char *z, char a);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = strcountc(z, 'a');
   printf("O 'a' apareceu %d vezes.", valor);
}
int strcountc(char *z, char a)
{
   int c, contar;
   for(c=contar=0; z[c]!='\0'; c++)
   if(z[c]==a)
      contar++;
   return contar;
}

►7 - strcountd: Mostra o números de dígitos na string. Sua definição: strcountd(char *z).

Ex:
#include <stdio.h>
#include <string.h>
int strcountd(char *z);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = strcountd(z);
   printf("%s tem %d digitos." , z, valor);
}
int strcountd(char *z)
{
   int c, contar;
   for(c=contar=0; z[c]!='\0'; c++)
   if(isdigit(z[c]))
      contar++;
   return contar;
}

►8 - indchr: Mostra o índice da primeira ocorrência de um determinado caractere na string.

Ex:
#include <stdio.h>
#include <string.h>
int indchar(char *z, char a);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = indchar(z, 'o');
   if(valor<0)
   {
      printf("O caractere 'o' não se encontra na string.");
   }
   else
   {
      printf("Posição %d" , valor);
   }
}
int indchar(char *z, char a)
{
   int c;
   for(c=0; z[c]!='\0'; c++)
   if(z[c]==a)
      return c;
   return -1;
}

►9 - strset: Substitui todas as posições de uma string com um determinado caractere. 

Ex:
#include <stdio.h>
#include <string.h>
main()
{
   char z[60];
   puts("Insira a senha:");
   gets(z);
   printf("Senha = %s", strset(z, '*'));
}

►10 - strupr e strlwr: Uma imprime uma string maiúscula, e a outra uma string minúscula, respectivamente. Para evitar erros, inclua a função <ctype.h>.


Ex:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
main()
{
   char z[60];
   puts("Insira uma palavra:");
   gets(z);
   printf("Maiúsculo = %s\n", strupr(z));
   printf("Minúsculo = %s", strlwr(z));
}

►11 - strcounta -  Devolve apenas letras. Mudei pouca coisa em relação a de números.


#include <stdio.h>
#include <string.h>
int strcounta(char *z);
main()
{
   char z[60];
   int valor;
   puts("Insira uma palavra:");
   gets(z);
   valor = strcounta(z);
   printf("Tem %d letra(s)." ,valor);
}
int strcounta(char *z)
{
   int c, contar;
   for(c=contar=0; z[c]!='\0'; c++)
   if (!isdigit (z[c])) // verifica se é um número
      contar++;
   return contar;
}

E "eras isso". Essas são apenas algumas formas que podemos manipular nossas strings. Lembrando que o que foi mostrado, apenas arranha a superfície do que pode ser feito com strings em C. Você pode criar ou implementar novas strings a partir do que viu, traçando uma  boa lógica. :)

Menu da Linguagem C

Até a próxima! ^^

quinta-feira, 21 de março de 2013

Aeroportos mais perigosos do mundo

Apesar de ser antiga, a reportagem mostra uma série de vídeos, sobre aeroportos que aparentam ter sido construídos de forma insana, mas que funcionam normalmente.



quarta-feira, 20 de março de 2013

Linguagem C: Parte 6 [Vetores]

Agora chegou a hora de aprender um pouco sobre vetores. Lembrando que é apenas algo superficial, perto do que realmente pode ser criado, utilizando esses comandos.
Um vetor pode ser entendido como um conjunto de elementos consecutivos, podendo ser de qualquer tipo de dado, mas todos do mesmo tipo, sendo acessados em conjunto ou individualmente pelo seu nome. Também é importante lembrar, que o índice do 1° elemento de um vetor é sempre 0, alternando entre 0 e n-1.
A declaração de um vetor, é feita por: tipo nome[n°elementos].

Ex 1:

#include<stdio.h>
main()
{
   int z[3]; // Um vetor de 3 elementos
   int c;
   z[0] = 1; // 1° elem
   z[1] = 4; // 2° elem
   z[2] = 59; // 3° elem
   for(c=0; c<3; c++)
   {
       printf("%d, ",z[c]);
   }
   system("pause");
}

Existe outros jeitos de declarar:
z[4-2] = 10; // equivale a z[2] = 10
z[3] = {1,4,59};
z[] = {1,4,59}; // equivale ao de cima

Lembrando que quando os vetores são criados, eles também acumulam valores aleatórios em suas posições. Se eu decidir declarar um vetor com 5 elementos, mas colocar apenas 2 valores, os primeiros dois elementos irão conter os valores que lhes forma atribuídos, e os elementos restantes serão iniciados com 0(ZERO).
Ex :
z[5] = {90,40}; // como eu atribui
z[5] = {90,40,0,0,0}; // como ficou

Agora vou mostrar um simples programa que utiliza um vetor, de exemplo:

#include<stdio.h>
/* Recebe 5 números ins pelo user, e imprimi os mesmos */
main()
{
   int num[5];
   int c;
   for(c=1; c<=5; c++)
   {
       printf("Ins o %d° num: ",c);
       scanf("%d", &num[c]);
   }
   for(c=1; c<=5; c++)
   {   
       printf("...%d\n", num[c]);
       system("pause");
   }

Constantes

São dados gravados na memória que não podem ter seus valores alterados, armazenando valores que representam tamanho fixo, durante a execução. São declaradas fora das funções, podendo serem utilizadas em qualquer parte do programa. Elas simplificam muito o trabalho do programador, quando ele precisa alterar um único valor que se encontra espalhado, ao longo do programa.
Para criarmos uma constante, podemos utilizar a palavra reservada const.
Ex:

#include<stdio.h>
const int num = 50;

void func(int z[])
{
   int c;
   for(c=0; c<num; c++)
      z[c] = 0;
}
main()
{
   int x[num], c;
   func(x);
   for(c=0; c<num; c++)
      x[c] = c;
   for(c=num-1; c>=0; c--)
      printf("%d\n", x[c]);
}

A outra forma é usando #define, considerada uma constante simbólica. Ela é uma diretiva que indica ao pré-processador que o símbolo que a segue vai ficar com o valor que aparece depois do símbolo. Ela não ocupa um espaço físico em memória, tendo seu valor substituído ao longo do programa, antes da compilação. É normal representar constantes simbólicas por letras maiúsculas.

#include<stdio.h>
#define NUM 50
void func(int z[])
{
   int c;
   for(c=0; c<NUM; c++)
      z[c] = 0;
}
main()
{
   int x[NUM], c;
   func(x);
   for(c=0; c<NUM; c++)
      x[c] = c;
   for(c=NUM-1; c>=0; c--)
   printf("%d\n", x[c]);
}

Vetores em Funções

O exemplo a seguir, é de uma função que recebe um vetor de int(sem dimensão) e um int, indicando quantos elementos irão iniciar.
Ex:

#include<stdio.h>
void func(int z[], int num)
{
   int c;
   for(c=0; c<num; c++)
       z[c] = 0;
}
main()
{
   int x[5];
   int y[16];

   func(x,5);
   func(y,16);
}

Se eu passar a dimensão do vetor no parâmetro, o compilador iria descartar os números dos elementos do vetor.

Vetores Multidimensionais

Um vetor pode ser declarado com n dimensões. Eles são preciosos quando precisamos escrever programas que são melhores de organizar utilizando muitos elementos. Um bom exemplo disso é o jogo da velha. Note que o exemplo apresenta apenas as posições dos elementos "X" e "0" sobre o "tabuleiro", e mais nada, partindo de como fazer uma jogada, pontos e etc.
Ex:

#include<stdio.h>
#define JOG 3

main()
{
   char Velhas[JOG][JOG] = {{' ', ' ', ' '},{' ', ' ', ' '},{' ', ' ', ' '}};
   int c;
   int k;
   Velha [0][0] = 'X';
   Velha [1][1] = 'X';
   Velha [0][2] = '0';
   Velha [2][2] = '0';
   for(c=0; c<JOG; c++)
   {
      for(k=0; k<JOG; k++)
         printf("%c %c", Velha [c][k], k==JOG-1? ' ' : ' | ');
      if(c != JOG-1)
         printf("\n-----------\n");
         system("pause");
}
}

Até a próxima! ^^

Menu da Linguagem C

quarta-feira, 6 de março de 2013

Desenhos: Parte 1

Artes

     Estou postando os desenhos que achei na net. E antes de mais nada, os artistas estão de parabéns.

Pessoa dormindo.

Se conhecerem me avisem.

Dr. House

Cantora Amy Lee