Aqui você encontra infomações sobre Informática, Eletrônica, Elétrica, Mecânica e Automação

quarta-feira, 2 de novembro de 2011

Cursos IPED

O Grupo iPED é um dos melhores sistemas de educação do mundo. Possui mais de 800 mil alunos no Brasil e em mais de 60 países.

São diversos cursos para você escolher.



segunda-feira, 18 de abril de 2011

Como ligar a fonte ATX sem placa mãe

Esta ligação só funciona em fontes ATX.

Abaixo está o diagrama do plug de uma fonte ATX, todos os plugs são padrões.


O que você deve fazer é unir dois fios do plug.

A figura abaixo mostra quais fios devem ser unidos.



O verde (pino 14) é designado como o fio da “potência”, enquanto que o preto (pino 13) é designado como fio “terra”.

Ao unir esses dois fios, a fonte entra em funcionamento imediatamente.

domingo, 17 de abril de 2011

Linguagem C (parte 8)

Funções: protótipos de função É considerada boa prática utilizar protótipos de função para todas as funções em seu programa. Um protótipo declara o nome de função, seus parâmetros e seu tipo de retorno para o resto do programa antes da declaração real da função. Para entender a utilidade dos protótipos, digite o seguinte código e execute-o:
  #include <stdio.h>

  void main()
  {
     printf("%d\n",add(3));
  }  
  int add(int i, int j)

  {
     return i+j; 
  }  
Este código compila em diversos compiladores sem emitir um aviso, apesar de add esperar dois parâmetros e receber apenas um. Ele funciona porque muitos compiladores C não verificam se o parâmetro corresponde ao tipo ou à quantidade. Você pode perder horas na depuração de um código no qual você está declarando parâmetros a mais ou a menos por engano. O código anterior compila corretamente, mas produz a resposta errada.
Para resolver este problema, a linguagem C permite colocar protótipos de função no início (na verdade, em qualquer lugar) de um programa. Se fizer isso, a linguagem C verifica tipos e quantidades de todas as listas de parâmetros. Tente compilar o seguinte:
  #include <stdio.h>  

  int add (int,int); /* protótipo de função para add */

  void main()
  {
     printf("%d\n",add(3));
  }    
  int add(int i, int j)
  {    
     return i+j;
  } 
O protótipo faz com que o compilador sinalize um erro na instrução printf.
Coloque um protótipo para cada função no início de seu programa. Os propótipos podem economizar bastante tempo de depuração e também resolver o problema que ocorre ao compilar com funções que são utilizadas antes de serem declaradas. Por exemplo, o seguinte código não compilará:
  #include  <stdio.h> 
   
  void main()
  {
      printf("%d\n",add(3));
  }
  float add(int i, int j)
  {
      return i+j;
  }  
Você pode perguntar: "Por que ele compilará quando add retorna um int mas não quando retorna um float?" Porque os compiladores em C mais antigos padronizaram um valor de retorno para int. O uso de um protótipo resolverá este problema. Os "compiladores antigos" (sem suporte a ANSI) permitem protótipos, porém a lista de parâmetros do protótipo deve estar vazia. Os compiladores antigos não fazem a verificação de erros em listas de parâmetros.


Tente isto

  • Retorne ao exemplo de classificação bubble sort anteriormente apresentado e crie uma função.
  • Retorne aos programas anteriores e crie uma função para obter a entrada de dado do usuário, em vez de obter a entrada de dado da função principal.

sábado, 16 de abril de 2011

Linguagem C (parte 7)

Funções A maioria das linguagens permite criar funções de algum tipo. Funções permitem dividir um longo programa em seções nomeadas, de forma que as seções possam ser reutilizadas ao longo do programa. As funções aceitam parâmetros e retornam um resultado. Funções de C podem aceitar um número ilimitado de parâmetros. Em geral, a linguagem C não se preocupa em qual ordem você coloca suas funções no programa, contanto que o nome da função seja conhecido pelo compilador antes de ser invocado.
Já falamos um pouco sobre funções. A função rand previamente descrita é bastante simples. Ela não aceita parâmetros e retorna um resultado inteiro:
  int rand()
  /* de K&R
     - produz um número aleatório entre 0 e 32767.*/
  {
      rand_seed = rand_seed * 1103515245 +12345;
      return (unsigned int)(rand_seed / 65536) % 32768;
  }  
A linha int rand() declara a função rand para o resto do programa e especifica que aquele rand não aceitará nenhum parâmetro e retornará um resultado inteiro. Esta função não tem nenhuma variável local, mas se elas fossem necessárias, iriam logo abaixo da abertura {. A linguagem C permite declarar variáveis após qualquer {: elas existem até o programa atingir o } correspondente e então desaparecem. Desta forma, as variáveis locais de uma função desaparecem assim que o } correspondente é atingido na função. Enquanto existirem, as variáveis locais residem na pilha do sistema. Observe que não há nenhum ; depois de () na primeira linha. Caso tenha colocado um, acidentalmente, você receberá uma enorme cascata de mensagens de erro do compilador, que não farão sentido algum. Observe também que, mesmo sem parâmetros, você precisa usar o (). Eles indicam ao compilador que você está declarando uma função em vez de simplesmente declarar um int.
A instrução return é importante para qualquer função que retorna um resultado. Ela especifica o valor que a função retornará e a encerra imediatamente. Isto significa que você pode colocar diversas instruções de retorno na função para proporcionar vários pontos de saída. Se você não colocar uma instrução de retorno em uma função, a função retorna quando atinge } e retorna um valor aleatório (muitos compiladores o advertirão se você não retornar um valor específico). Em C, uma função pode retornar valores de qualquer tipo: int, float, char, struct, etc.
Há vários modos corretos para executar a função rand. Por exemplo: x=rand( );. A variável x recebe o valor retornado por rand nesta instrução. Observe que você deve usar ( ) na chamada da função, mesmo que nenhum parâmetro seja passado. Caso contrário, x recebe o endereço de memória da função rand, que geralmente não é desejável.
Você também pode invocar rand desta forma:
  if (rand() > 100)  
Ou deste modo:
  rand();  
No último caso, a função é chamada, mas o valor retornado por rand é descartado. Talvez você nunca faça isso com rand, mas muitas funções retornam algum tipo de código de erro por meio da função, e se você não está muito preocupado com o código de erro (por exemplo, por saber que um erro é impossível), você poderá descartá-lo.
Funções podem usar um retorno tipo void caso se deseje que não se retorne nada. Por exemplo:
  void print_header()
  {
      printf("Programa Número 1n");
      printf("por Marshall Brainn");
      printf("Versão 1.0, lançada em 26/12/91\n");  
  }  
Esta função não retorna valor algum. Você pode invocá-la com a seguinte instrução:
  print_header();  
 

Você deve incluir ( ) na chamada. Se não o fizer, a função não é invocada, embora possa ser compilada corretamente em outros sistemas.
As funções em C podem aceitar qualquer tipo de parâmetro. Por exemplo:
  int fact(int i)
  {
      int j,k;
      j=1;
      for (k=2; k<=i; k++)
          j=j*k; 
     return j;
  }  
retorna o fatorial de i, que é passado como um parâmetro inteiro. Separe vários parâmetros com vírgulas:
  int add(int i, int j)
  {
      return i+j;
  }  
A linguagem C evoluiu ao longo dos anos. Às vezes, você verá funções como add escritas do "modo antigo", como mostrado abaixo:
  int add(i,j)
      int i;
      int j;
  {
      return i+j;
  } 
É importante saber ler o código escrito no estilo antigo. Não há nenhuma diferença na forma em que o código é executado, apenas a notação é diferente. Você deve usar o "novo estilo" (conhecido como ANSI C) com o tipo declarado, como parte da lista de parâmetros, a menos que tenha conhecimento prévio de que o código será enviado a alguém com um compilador em "estilo antigo" (sem suporte a ANSI).

sexta-feira, 15 de abril de 2011

quinta-feira, 14 de abril de 2011

Linguagem C (parte 5)

Matrizes Nesta seção, criaremos um pequeno programa em C que gera 10 números aleatórios e os ordena. Para tal, utilizaremos uma nova disposição de variável denominada matriz.
Uma matriz permite declarar e trabalhar com uma coleção de valores de mesmo tipo. Por exemplo, você pode querer criar uma coleção de 5 inteiros. Uma forma para fazer isso seria declarar 5 inteiros diretamente:
  int a, b, c, d, e; 
Isso está certo, mas e se você precisasse de milhares de números inteiros? Uma forma mais fácil é declarar uma matriz de 5 inteiros.
  int a[5];  
Os cinco inteiros individuais dentro desta matriz são acessados por um índice. Todas as matrizes iniciam em zero e vão até n-1 no C. Assim, int a[5]; contém 5 elementos. Por exemplo:
  int a[5];


  a[0] = 12;
  a[1] = 9;
  a[2] = 14;
  a[3] = 5;
  a[4] = 1;  
Uma das vantagens sobre a indexação de matriz é que você pode usar um loop para manipular o índice. Por exemplo, o código a seguir inicializa todos os valores na matriz em 0:
  int a[5];


  int i;
  for (i=0; i<5; i++)
      a[i] = 0;  
O código seguinte inicializa seqüencialmente os valores na matriz e então os imprime:
  #include <stdio.h> 

  int main()
  {
      int a[5];
      int i;
        for (i=0; i<5; i++)
          a[i] = i;
      for (i=0; i<5; i++)
          printf("a[%d] = %dn", i, a[i]);
  }  
As matrizes são usadas a toda hora em C. Para entender seu uso, inicie um editor e digite o seguinte código:
  #include <stdio.h>

  #define MAX 10

  int a[MAX];
  int rand_seed=10;

  /* from K&R
     - retorna um número aleatório entre 0 e 32767.*/
  int rand()
  {
      rand_seed = rand_seed * 1103515245 +12345;
      return (unsigned int)(rand_seed / 65536) % 32768;
  }
    int main()
  {
      int i,t,x,y;
       
      /* preenche a matriz */
      for (i=0; i < MAX; i++)
      {
          a[i]=rand();
           printf("%dn",a[i]);
      }
      /* mais coisas aparecerão aqui em breve */
      return 0;
  }  
Este código contém vários conceitos novos. A linha #define declara uma constante denominada MAX e a define em 10. Os nomes de constantes em geral são escritos em letras maiúsculas para destacá-los no código. A linha int a[MAX]; mostra como declarar uma matriz de inteiros em C. Observe que por causa da posição da declaração da matriz, ela é global ao programa.
A linha int rand_seed=10 também declara uma variável global, desta vez denominada rand_seed, que é inicializada em 10 sempre que o programa inicia. Este valor é o inicial para o código de números aleatórios que segue. Em um gerador de números aleatórios reais, o seed deve inicializar como um valor aleatório, como a hora do sistema. Aqui, a função rand produzirá os mesmos valores sempre que executar o programa.
A linha int rand() é uma instrução de função. A função rand não aceita parâmetros e retorna um resultado inteiro: aprenderemos mais sobre as funções em breve. As quatro linhas que seguem implementam a função rand. Por hora, nós as ignoraremos.
A função principal é normal. Quatro inteiros locais são declarados e a matriz é preenchida com 10 valores aleatórios usando um loop for. Observe que a matriz a contém 10 inteiros individuais. Você aponta para um inteiro específico na matriz usando colchetes. Assim a[0] refere-se ao primeiro inteiro na matriz, a[1] refere-se ao segundo, e assim por diante. A linha que começa com /* e termina com */ é denominada de comentário. O compilador ignora completamente a linha de comentário. Você pode colocar notas para si próprio ou outros programadores nos comentários.
Agora adicione o seguinte código no lugar do comentário mais coisas...:
  /* ordenação por bolha da matriz */
  for (x=0; x < MAX-1; x++)
      for (y=0; y < MAX-x-1; y++)
          if (a[y] > a[y+1])
          {
              t=a[y];
              a[y]=a[y+1];
              a[y+1]=t;
           }
  /* imprime matriz classificada */
  printf("--------------------n");
  for (i=0; i < MAX; i++)
  printf("%dn",a[i]);  
Esta codificação classifica os valores aleatórios e os imprime ordenadamente. Sempre que o executar, você obterá os mesmos valores. Para alterar os valores classificados, altere o valor de rand_seed sempre que executar o programa.
O único modo fácil para realmente entender o que o código está fazendo é executá-lo "à mão". Isto é, assuma que MAX é 4 para facilitar, pegue uma folha de papel e finja que é o computador. Desenhe a matriz no papel e coloque 4 valores aleatórios e não-classificados na matriz. Execute cada linha da seção de classificação do código e desenhe exatamente o que acontece. Você verá que, sempre que submetidos ao loop interno, os valores maiores na matriz são empurrados para baixo e os valores menores vão para o topo da matriz.
Tente isto
  • No primeiro trecho do código, tente alterar o loop for que preenche a matriz para uma única linha de código. Certifique-se de que o resultado seja igual ao do código original.
  • Pegue o código de ordenação por bolha e coloque-o em sua própria função. O cabeçalho de função será void bubble_sort(). Depois transfira as variáveis utilizadas pela ordenação por bolha para a função e torne-as locais. Por ser uma matriz local, você não precisa passar parâmetros.
  • Inicialize a semente do número aleatório para diferentes valores.
Erros que devem ser evitados na linguagem C
  • A linguagem C não tem nenhuma verificação de dimensão, portanto, se você indexar além do fim da matriz, ele não o informará a respeito. Ele provavelmente travará ou apresentará dados incorretos.
  • A chamada de função deve incluir () mesmo se nenhum parâmetro for informado. Por exemplo, C aceitará x=rand; mas a chamada não funcionará. O endereço de memória da função rand será colocado em x. Você deve dizer x=rand();.

quarta-feira, 13 de abril de 2011

Linguagem C (parte 4)

Looping: um exemplo real Suponhamos que você queira criar um programa que imprima uma tabela de conversão Fahrenheit para Celsius. Isso pode ser facilmente obtido com um loop for ou loop while:
#include <stdio.h>
  
int main()
{
      int a;
      a = 0;
      while (a <= 100)
      {
          printf("%4d graus F = %4d graus C\n",
              a, (a - 32) * 5 / 9);
          a = a + 10;
      }
      return 0;
}  
Se executar este programa, ele produzirá uma tabela de valores iniciando em 0 graus F e terminando em 100 graus F. O resultado será este:
0   graus  F =  -17 graus C 
10  graus  F =  -12 graus C
20  graus  F =   -6 graus C
30  graus  F =   -1 graus C
40  graus  F =    4 graus C    
50  graus  F =   10 graus C    
60  graus  F =   15 graus C    
70  graus  F =   21 graus C    
80  graus  F =   26 graus C    
90  graus  F =   32 graus C   
100 graus  F =   37 graus C      
Os valores da tabela estão em incrementos de 10 graus. Observe como é fácil alterar os valores iniciais, finais ou de incremento da tabela que o programa produz.
Para valores mais precisos, você pode usar valores de ponto flutuante:
#include <stdio.h>

int main()
{      
     float a;     
     a = 0;
      while (a <= 100)
      {
          printf("%6.2f graus F = %6.2f graus C\n",
              a, (a - 32.0) * 5.0 / 9.0);
          a = a + 10;
      }
      return 0;
  }  
Você pode ver que a declaração de a foi alterada para flutuante, e o símbolo %f substitui o símbolo %d na instrução printf. Além disso, o símbolo %f possui alguma formatação: o valor será impresso com 6 dígitos inteiros e 2 decimais.
Agora vamos supor que queiramos modificar o programa para que a temperatura 98.6 seja inserida na tabela na posição adequada. Isto é, queremos que a tabela aumente a cada 10 graus e que inclua uma linha extra para 98.6 graus F, que é a temperatura corpórea normal do ser humano. O programa seguinte atende essa finalidade:
#include <stdio.h>

int main()  
{
      float a;
      a = 0;
      while (a <= 100)
      {
       if (a > 98.6)   
          {
              printf("%6.2f graus F = %6.2f graus C\n",
                  98.6, (98.6 - 32.0) * 5.0 / 9.0);
          }
          printf("%6.2f graus F = %6.2f graus C\n",
              a, (a - 32.0) * 5.0 / 9.0);
          a = a + 10;
      }
      return 0;
  }  
Este programa funciona se o valor final for 100, mas se você alterar o valor final para 200, verá que o programa tem um bug. Ele imprime a linha de 98.6° várias vezes. Este problema pode ser corrigido de várias formas. Eis uma:
#include <stdio.h>

int main()
{
      float a, b;
      a = 0;
      b = -1;
      while (a <= 100)
      {
       if ((a > 98.6) && (b < 98.6)) 
         {
              printf("%6.2f graus F = %6.2f graus C\n",
                  98.6, (98.6 - 32.0) * 5.0 / 9.0);
          }
          printf("%6.2f graus F = %6.2f graus C\n",
              a, (a - 32.0) * 5.0 / 9.0);
          b = a;
          a = a + 10;
      }
      return 0;
} 
  

Tente isto

  • Tente alterar o programa conversor Fahrenheit-Celsius de modo que ele utilize scanf para aceitar o valor inicial, final e de incremento daquele usuário.
  • Adicione uma linha de cabeçalho à tabela que é gerada.
  • Tente encontrar uma solução diferente para o bug corrigido pelo exemplo anterior.
  • Crie uma tabela que converta libras em quilogramas ou milhas em quilômetros.


Erros a serem evitados na linguagem C

  • Colocar = quando se deseja == em uma instrução if ou while.
  • Esquecer de aumentar o contador dentro do loop while. Isso causa um loop infinito (o loop nunca acaba).
  • Acidentalmente colocar um ; no final de um loop for ou instrução if, pois isto anula a instrução. Por exemplo:
    for (x=1; x<10; x++);
        printf("%d\n",x);  
    imprime apenas um valor, pois o ponto-e-vírgula após a instrução for atua como uma linha para a execução do loop for.

terça-feira, 12 de abril de 2011

Linguagem C (parte 3)

Printf: lendo os valores de usuário O programa anterior é bom, mas seria melhor se ele lesse os valores 5 e 7 inseridos pelo usuário, em vez de usar constantes. Em vez disso, tente este programa:
#include <stdio.h>    

int main()
{
      int a, b, c;
      printf("Entre o primeiro valor:");
      scanf("%d", &a);
      printf("Entre o segundo valor:");
      scanf("%d", &b);
      c = a + b;
      printf("%d + %d = %d\n", a, b, c);  
      return 0;
  } 
Eis como este programa funciona ao ser executado:
Faça as alterações, depois compile e rode o programa para certificar-se de que funciona. Observe que scanf usa as mesmas strings de formato que printf (digite man scanf para mais informação). Observe também o & na frente de a e b. Este é o operador de endereço em C: ele retorna o endereço da variável (isto não fará sentido até aprendermos sobre os ponteiros). Você tem de usar o operador & em scanf em qualquer variável do tipo char, int ou float, bem como tipos de estrutura (que discutiremos em breve). Se excluir o operador &, você receberá um erro ao executar o programa. Tente executá-lo para ver que tipo de erro ocorre.
Vamos ver algumas variações para entender printf completamente. Eis uma instrução simples de printf:
      printf("Hello");  
Esta chamada para printf tem uma string de formatos que diz ao printf para enviar a palavra "Hello" para a saída padrão. Compare-a com:
      printf("Hello\n");
A diferença entre as duas é que a segunda versão exibe a palavra "Hello" seguida de uma quebra de linha.
As linha seguintes mostram como exibir o valor de uma variável usando printf.
      printf("%d", b);  
O %d é uma expressão de controle que será substituída pelo valor da variável b quando a instrução printf for executada. Freqüentemente, você vai desejar incluir o valor entre outras palavras. Uma forma de fazer isso é:
    printf("A temperatura é ");
    printf("%d", b);
    printf(" degrees");
Um modo mais fácil de dizer isso é:
      printf("A temperatura é %d graus\n", b);
Você também pode usar múltiplas expressões de controle %d em uma instrução printf:
      printf("%d + %d = %d\n", a, b, c);
Na instrução printf, é extremamente importante que o número de operadores na string de formato corresponda exatamente ao número e tipo de variáveis que a seguem. Por exemplo, se a string de formatos contém três operadores %d, então ela deve ser seguida por exatamente três parâmetros do mesmo tipo e ordem que aqueles especificados pelos operadores.
Você pode imprimir todos os símbolos normais na linguagem C com printf usando expressões de controle diferentes:
  • int (valores inteiros) usam %d
  • float (valores de ponto flutuante) usam %f
  • char (valores de caractere simples) usam %c
  • strings de caracteres (matrizes de caracteres, discutiremos mais tarde) usam %s
Você pode aprender mais sobre as nuances do printf em uma máquina UNIX digitando man 3 printf. Qualquer outro compilador de C que você utilize provavelmente virá acompanhado de um manual ou arquivo de ajuda que contém uma descrição do printf.

Scanf A função scanf permite aceitar entradas do dispositivo padrão, que, para nós, é geralmente o teclado. A função scanf pode fazer muitas coisas diferentes, mas pode ter resultados incertos quando não usada de forma simples. É falível pois não lida muito bem com erros humanos. Mas para programas simples, ela é boa o suficiente e fácil de usar.
A aplicação mais simples de scanf se parece com:
      scanf("%d", &b); 
O programa lerá um valor inteiro digitado pelo usuário usando o teclado (%d é para inteiros, como em printf, assim b deve ser declarado como um int) e o colocará em b.
A função scanf usa as mesmas expressões de controle da printf:
  • int usa %d
  • float usa %f
  • char usa %c
  • strings de caracteres (abordados mais tarde) usam %s
Você DEVE colocar & na frente da variável usada em scanf. A razão para isso ficará clara assim que você aprender sobre os ponteiros. É fácil esquecer o sinal &, e se você esquecer, seu programa quase sempre apresentará problemas ao ser executado.
Em geral, é melhor usar scanf como mostrado aqui, lendo apenas um valor do teclado. Use múltiplas chamadas do scanf para ler valores múltiplos. Em qualquer programa real, você usará as funções gets ou fgets em vez de ler o texto em uma linha por vez. Então você fará a "análise" da linha para ler seus valores. Isso serve para detectar erros na entrada e controlá-los da maneira que achar adequada.
As funções printf e scanf exigirão um pouco de prática para serem inteiramente compreendidas, mas uma vez dominadas serão extremamente úteis.
Tente isto!
  • Modifique este programa para que ele aceite 3 valores em vez de 2 e some todos eles juntos:
    #include <stdio.h>
    
    int main()
    {
          int a, b, c;
          printf("Entre o primeiro valor:");
          scanf("%d", &a);
          printf("Entre o segundo valor:");
          scanf("%d", &b);
          c = a + b;
          printf("%d + %d = %d\n", a, b, c);
          return 0;
     }    
  • Tente apagar ou adicionar caracteres ou palavras aleatórias em um dos programas anteriores e veja como o compilador reage a tais erros de compilação. Por exemplo, apague a variável b na primeira linha do programa anterior e veja o que o compilador faz quando você se esquece de declarar uma variável. Apague um ponto-e-vírgula e veja o que acontece. Omita uma das chaves. Remova um dos parênteses próximos à função principal. Faça uma alteração por vez e compile o programa para ver o que acontece. Simulando erros como esses você pode aprender sobre diferentes erros de compilação, o que facilitará futuras detecções quando você os cometer.
Erros a serem evitados na linguagem C
  • Usar letras maiúsculas e minúsculas aleatoriamente. Letras maiúsculas e minúsculas são importantes na linguagem C, portanto você não pode digitar Printf ou PRINTF. É obrigatório que seja printf.
  • Esquecer de usar o & em scanf.
  • Parâmetros em excesso ou a falta deles após a instrução de formato em printf ou scanf.
  • Esquecer de declarar o nome de uma variável antes de utilizá-la.

Desvio e looping Em C, as instruções if e loops while regem-se pelos princípios das expressões Booleanas. Eis um programa simples em C que demonstra uma instrução if:
#include <stdio.h>

int main()
{
int b;
printf("Digite um valor:");
scanf("%d", &b);
if (b < 0)
printf("O valor é negativo ");
return 0;
}
Este programa aceita um número do usuário. Ele então testa esse número utilizando uma instrução if para ver se ele é menor que 0. Se for, o programa imprime uma mensagem. Caso contrário, o programa não faz nada. A parte (b < 0) do programa é a expressão booleana. A linguagem C avalia esta expressão para decidir se imprime ou não a mensagem. Se a expressão booleana se mostra Verdadeira, então a linguagem C executa a linha imediatamente posterior à instrução if (ou um bloco de linhas entre chaves logo após a instrução if). Se a expressão booleana se mostrar Falsa, então a linguagem C pula a linha ou bloco de linhas logo após a instrução if.
Eis um exemplo um pouco mais complexo:
#include <stdio.h>

int main()
{
int b;
printf("Digite um valor:");
scanf("%d", &b);
if (b < 0)
printf("O valor é negativo ");
else if (b == 0)
printf("O valor é zero ");
else
printf("O valor é positivo ");
return 0;
}
Neste exemplo, as seções else if e else avaliam tanto para valores positivos como zero.
Eis uma expressão booleana mais complicada:
if ((x==y) && (j>k))
z=1;
else
q=10;
Esta instrução diz: "Se o valor da variável x for igual ao valor da variável y, e se o valor da variável j for maior que o valor da variável k, então defina a variável z como 1; de outro modo, defina a variável q como 10". Você usará instruções if como esta em todos os seus programas C para tomar decisões. De um modo geral, a maioria das decisões será simples como o primeiro exemplo, mas, eventualmente, as coisas podem ser um pouco mais complicadas.
Observe que a linguagem C utiliza == para testar a igualdade, enquanto utiliza = para atribuir um valor a uma variável. O símbolo && em C representa uma operação booleana AND.
Aqui estão todos os operadores booleanos em C:
  igualdade         ==
  menor que         < 
  maior que         >    
  menor ou igual    <= 
  maior ou igual    >=  
  desigualdade      != 
  e                 &&  
  ou                || 
  não               !
Você descobrirá que as instruções while são tão fáceis de utilizar como as instruções if. Por exemplo:
while (a < b)
{      
   print("%d\n", a);  
   a = a + 1;
}
Isso faz com que duas linhas entre chaves sejam executadas repetidamente até que a seja maior ou igual a b. Em geral, a instrução while funciona assim:
A linguagem C também oferece uma estrutura do-while:
  do
  {
      printf("%d\n", a);
      a = a + 1;
  }
  while (a < b);   
O loop for na linguagem C é apenas um atalho para expressar uma instrução while. Por exemplo, suponha que você tenha o seguinte código em C:
  x=1;
  while (x<10)
  {
      blá blá blá
      x++; /* x++ é o mesmo que dizer x=x+1 */
  } 
Você pode converter isso em um loop for da seguinte forma:
  for(x=1; x<10; x++)
  {
      blá blá blá
  }   
Observe que o loop while contém uma etapa de inicialização (x=1), uma etapa de teste (x<10) e uma de incremento (x++). O loop for permite colocar as três partes em uma única linha, mas você pode colocar qualquer coisa nelas. Por exemplo, suponha que você tenha o seguinte loop:
  a=1;
  b=6;
  while (a < b)
  {
      a++;
      printf("%d\n",a);
  }   
Você também pode colocá-lo para indicação:
  for (a=1,b=6; a < b; a++,printf("%dn",a));  
É um pouco confuso, mas é possível. O operador vírgula permite separar diversas instruções diferentes nas seções de inicialização e incremento do loop for (porém não na seção de teste). Muitos programadores de linguagem C gostam de concentrar muitas informações em uma única linha de código. Outros acham que isto torna o código mais difícil de entender, e portanto desmembram essas instruções.
= versus == em expressões booleanas
O sinal == é um problema na linguagem C pois freqüentemente você se esquece e digita apenas = em uma expressão booleana. Este é um erro comum de ocorrer, mas para o compilador há uma diferença significativa. A linguagem C aceitará = e == em uma expressão booleana, mas o comportamento do programa mudará consideravelmente quando usamos um ou outro.
As expressões booleanas em C avaliam os inteiros e os inteiros podem ser usados dentro de expressões booleanas. O valor inteiro 0 em C é Falso, enquanto qualquer outro valor inteiro é Verdadeiro. É código seguinte é permitido em C:
  #include <stdio.h>  

  int main()
  {
      int a;
      printf("Digite um número:");
      scanf("%d", &a);
      if (a)
      {
          printf("O valor é verdadeiro\n");
      }
      return 0;
  }  
Se a for qualquer número diferente de 0, a instrução printf é executada.
Em C, uma instrução como if (a=b) significa: “Atribuir b para a, e então testar a para seu valor Booleano". Assim, se a retornar o valor 0, a instrução if é Falsa. Caso contrário, é Verdadeira. O valor de a muda durante o processo. Este não é o comportamento desejado se você pretendeu digitar == (embora esta característica seja útil quando usada corretamente), assim, tenha cuidado com o uso de = e ==.

segunda-feira, 11 de abril de 2011

Linguagem C (parte 2)

O mais simples programa em C : o que está acontecendo? Vamos analisar este programa e aprender o que as diferentes linhas de comando fazem:
  • Este programa em C começa com #include <stdio.h>. Esta linha inclui uma "biblioteca padrão de I/O" (entrada/saída) em seu programa, que permite ler a entrada a partir do teclado (denominada "entrada padrão"), exibir o resultado em uma tela (denominada "saída padrão"), processar arquivos de texto armazenados em disco e assim por diante. É uma biblioteca extremamente útil. A linguagem C possui um grande número de bibliotecas padrão como stdio, incluindo bibliotecas de strings de caracteres, de horário e de funções matemáticas. Uma biblioteca é simplesmente um pacote de códigos que alguém escreveu anteriormente para simplificar a sua vida (discutiremos bibliotecas daqui a pouco).
  • A linha int main( ) declara a função principal. Todo programa em C deve ter uma função denominada main em algum lugar no código. Aprenderemos mais sobre as funções em breve. O programa começa a ser executado a partir da primeira linha da função main.
  • Em C, os símbolos { e } marcam o começo e término de um bloco de código. Neste caso, o bloco de código que compõe a função principal contém duas linhas.
  • A instrução printf em C permite enviar o resultado para a saída padrão (para nós, a tela). A parte entre aspas é denominada string de formato e descreve como os dados serão formatados quando impressos. A string de formato pode conter strings de caracteres como "Este é o resultado do meu primeiro programa!", símbolos de quebra de linha (\n), e operadores como expressão de controle para variáveis (vide abaixo). Se você está usando UNIX, pode digitar man 3 printf para obter uma documentação completa sobre a função printf. Caso contrário, consulte a documentação incluída em seu compilador para mais detalhes sobre a função printf.
  • A linha return 0; faz com que a função retorne um código de erro de 0 (sem erros) à shell que iniciou a execução. Esta capacidade será discutida em detalhes mais tarde.
  •   

Variáveis Como programador, você com freqüência desejará que seu programa se "lembre" de um valor. Por exemplo, se seu programa solicita um valor do usuário, ou se ele calcula um valor, você vai querer armazená-lo em algum lugar para usá-lo mais tarde. O modo como seu programa se lembra das coisas é por meio do uso de variáveis. Por exemplo:
      int b;  
Esta linha diz: "Quero criar um espaço chamado b que possa conter um valor inteiro". Uma variável tem um nome (neste caso, b) e um tipo (neste caso, int, um inteiro). Você pode armazenar um valor em b escrevendo algo assim:
      b = 5;  
Você pode usar o valor em b escrevendo algo assim:
      printf("%d", b);  
Na linguagem C, há vários tipos padrões de variáveis:
  • int - valores inteiros (número inteiro)
  • float - valores de ponto flutuante
  • char - valores de caractere único (como "m" ou "Z")
Veremos exemplos destes outros tipos à medida que avançarmos.

Printf A instrução printf permite enviar o resultado para a saída padrão. Para nós, o termo "saída padrão" se refere à tela (embora você possa redirecionar a saída padrão para um arquivo de texto ou outro comando).
Eis outro programa que o ajudará a aprender mais sobre printf:
#include <stdio.h>  

int main( )
  {
      int a, b, c;
      a = 5;
      b = 7;
      c = a + b;
      printf("%d + %d = %d\n", a, b, c);  
      return 0;
  }  
Digite este programa em um arquivo e salve-o como add.c. Compile-o com a linha gcc add.c -o add e depois execute-o digitando add (ou ./add). Você verá a linha "5 + 7 = 12" como resultado.
Eis uma explicação das diferentes linhas neste programa:
  • a linha int a, b, c; declara três variáveis de número inteiro denominadas a, b e c.
  • a próxima linha inicializa a variável nomeada a para o valor 5.
  • a próxima linha define 7 para b .
  • a próxima linha soma a e b e "atribui" o resultado a c.
    O computador adiciona o valor em a (5) ao valor em b (7) para formar o resultado 12 e então coloca o novo valor (12) na variável c. Por este motivo, o sinal = nesta linha é denominado "operador de atribuição".
  • A instrução printf depois imprime a linha "5 + 7 = 12". As expressões de controle %d na instrução printf atuam como expressão de controle de valores. Há 3 expressões de controle %d, e no final da linha printf há três nomes de variável: a, b e c. A linguagem C liga o primeiro %d ao a e o substitui por 5. Ele liga o segundo %d com b e o substitui por 7, faz a correspondência do terceiro %d com c e o substitui por 12. Depois, imprime a linha completa na tela: 5 + 7 = 12. O +, o = e o espaçamento são parte da linha de formato e são automaticamente integrados entre os operadores %d conforme especificado pelo programador.

domingo, 10 de abril de 2011

Linguagem C

O que é C? C é uma linguagem de programação de computadores. Isso significa que você pode usá-la para criar listas de instruções para um computador seguir. A linguagem C é uma das milhares de linguagens de programação atualmente em uso. Existe há várias décadas e ganhou ampla aceitação por oferecer aos programadores o máximo em controle e eficiência. A linguagem C é fácil de aprender: pode ter um estilo um tanto criptográfico comparada às outras linguagens, mas isso é logo superado.

A linguagem C é o que se chama de linguagem compilada. Isso significa que, uma vez escrito o programa em C, ele deve ser passado por um compilador para transformar seu programa em executável para o computador rodar (executar). Um programa em C possui um formato legível ao homem, enquanto o executável gerado no compilador possui a forma legível para a máquina e é executada por ela. Isto significa que para escrever e executar um programa em C, você precisa ter acesso a um compilador de C. Se estiver usando uma máquina UNIX (por exemplo, escrevendo scripts CGI em C no seu computador UNIX, ou se você é um estudante que trabalha em uma máquina UNIX de um laboratório), o compilador de C está disponível gratuitamente. Ele é chamado "cc" ou "gcc" e está disponível na linha de comando. Se você é um aluno, estão a escola lhe fornecerá um compilador (descubra qual a escola usa e aprenda mais sobre ele). Se estiver trabalhando em casa em uma máquina Windows, você precisará fazer o download de um compilador de C gratuito ou comprar um compilador comercial. Um compilador comercial amplamente utilizado é o ambiente Visual C++ da Microsoft (ele compila programas em C e C++). Mas, infelizmente, este programa custa caro. Caso não disponha de algumas centenas de dólares para gastar em um compilador comercial, você pode usar um dos compiladores gratuitos disponíveis na internet.
Vamos começar com um programa em C bastante simples e progredir a partir dele. Vamos supor que você usará a linha de comando UNIX e o gcc como seu ambiente para estes exemplos, mas caso contrário, todos os códigos também funcionarão (basta compreender e usar o compilador que tiver disponível).

 O mais simples programa em C Vamos começar com o programa em C mais simples possível e usá-lo tanto para entender os fundamentos da linguagem C como o processo de compilação em C. Digite o programa seguinte em um editor de textos padrão (vi ou emacs no UNIX, Bloco de notas no Windows ou TeachText no Macintosh). Depois salve o programa em um arquivo denominado samp.c. Se deixar de incluir .c, você provavelmente receberá informação de algum tipo de erro ao compilá-lo (portanto, não se esqueça de inserir o .c). Certifique-se também de que o editor não anexe automaticamente caracteres extras (como .txt) ao nome do arquivo. Eis o primeiro programa:
#include <stdio.h>      

int main()  
{      
   printf("Este é o resultado do meu primeiro program!\n");     
   return 0;
}  
Quando executado, este programa instrui o computador a imprimir a linha: "Este é o resultado do meu primeiro programa!", e depois encerra o programa.

Posição
Ao escrever este programa, posicione #include de forma que o sinal # esteja na coluna 1 (mais à esquerda). Isso facilita o seu entendimento, mas na verdade o espaçamento e recuo podem ser do jeito que você preferir. Em alguns sistemas UNIX, você encontrará um programa chamado cb, o C Beautifier (algo como "embelezador de C"), que formata códigos. O espaçamento e recuo mostrados acima são um bom exemplo a seguir.
Para compilar este código, siga estas etapas:
  • Em uma máquina UNIX, digite gcc samp.c -o samp (se gcc não funcionar, tente cc). Esta linha executa o compilador em C chamado gcc, pede que compile samp.c e que nomeie o arquivo executável criado como samp. Para executar o programa, digite samp (ou em algumas máquinas UNIX, ./samp).
  • Em uma máquina rodando DOS ou Windows e usando DJGPP (em inglês), digite o seguinte no prompt do MS-DOS: gcc samp.c -o samp.exe. Esta linha executa o compilador em C chamado gcc, Pede que compile samp.c e que nomeie o arquivo executável criado como samp.exe. Para executar o programa, digite samp.
  • Se estiver trabalhando com algum outro compilador ou sistema de desenvolvimento, leia e siga as instruções dele para compilar e executar o programa.
Você verá "Este é o resultado do meu primeiro programa!" ao executá-lo. Veja o que aconteceu ao compilar o programa:

Caso tenha cometido um erro de digitação no programa, ele não compilará ou não poderá ser executado. Se o programa não foi compilado ou não executa corretamente, edite-o e localize os erros de digitação. Corrija o erro e tente novamente.

domingo, 3 de abril de 2011

Como atualizar a versão do Windows Seven

Atualize a versão do seu windows usando o “Windows Anytime Upgrade“, com ele você pode alterar a versão do seu Windows Starter, Home, Business ou Premium para a versão Professional ou Ultimate sem ter que fazer uma nova instalação ou modificar seus softwares já instalados.

Aqui será mostrado como alterar a versão Windows 7 Home Premium para a Ultimate.É fácil, rápido, e você preserva seus programas, arquivos e configurações, tudo isso em menos de 10 minutos.


O que é o Windows Anytime Upgrade?

Nada mais é que um utilitário da Microsoft que permite a atualização da versão do Windows para uma versão superior com mais recursos.

Perguntas Frequentes


Estas são respostas a algumas dúvidas comuns sobre o Windows 7 Anytime Upgrade.
Posso usar o Windows Anytime Upgrade para fazer a atualização de uma versão anterior do Windows para o Windows 7?


Não. O Windows Anytime Upgrade não pode atualizar versões anteriores do Windows para o Windows 7. O Windows Anytime Upgrade foi projetado apenas para atualizar o computador de uma edição do Windows 7 para outra edição do Windows 7.


Posso atualizar as versões de 32 e 64 bits do Windows 7 com o Windows Anytime Upgrade?


Sim, você pode usar o Windows Anytime Upgrade para atualizar uma versão de 32 bits para outra de 32 bits ou uma versão de 64 bits para outra de 64 bits do Windows 7. No entanto, o Windows Anytime Upgrade não pode atualizar uma versão de 32 bits para outra de 64 bits do Windows 7 ou uma versão de 64 bits para outra de 32 bits do Windows 7.


Posso voltar à edição do Windows 7 que o meu computador estava executando antes da atualização?


Sim, mas será necessário fazer uma instalação limpa da edição anterior do Windows 7, o que significa que os seus arquivos e as suas configurações de programas não serão preservados.


Alterando a versão do Windows 7

Primeiro, vamos checar a versão atual do windows, como podem ver,
é a versão Home Premium.



No seu PC, abra o Windows Anytime Upgrade, clicando no botão Iniciar, Todos os Programas e clicando em Windows Anytime Upgrade.






Clique em Digitar uma chave de atualização.


Digite a chave de atualização da versão Ultimate e clique em Avançar.

D4F6K - QK3RD - TMVMJ - BBMRX - 3MBMV

Após a verficação da chave, clique em Avançar.



Clique em Aceito para aceitar os termos da licença.



Antes de atualizar, salve seu trabalho e feche todos os programas abertos, após isso clique em Atualizar.



Após acabar a atualização clique em Avançar.



Seu windows será atualizado, não desligue o computador, ele reiniciará sozinho, note no rodapé da imagem que a versão ainda é a Home Premium.


Após reiniciar o computador, o windows vai continuar as atualizações, mas note no rodapé da imagem que a versão agora já é a Ultimate.



Terminando os updates, uma tela irá aparecer informando que as atualizações tiveram exito, e que seu computador está pronto para uso com a versão Ultimate.


Confirme a versão do Windows clicando nas propriedades do seu computador.


Ativar nova versão

Baixe o Windows 7 Loader
Baixar

1. Descompacte o arquivo, execute o “Windows 7 Loader.exe” e clique em “Install”

2. Agora escolha uma marca, e click no botão logo abaixo das marcas
Obs. A marca escolhida não precisa ser a mesma do seu PC, clic em uma qualquer e tenter atualizar, caso não atualize, execute o 7loader novamente e escolha outra marca até obter sucesso.

3. Depois click em Install 7Loader, e de OK.
Logo o computador irá reiniciar e o windows estará validado.
Verificando se o windows está atualizado:
Click em propriedade do Meu Computador e verifique


Quem tiver a versão Starter e quiser passar para Ultimate, primeiro você tem que passar para Home Premium, e depois passar para Ultimate. Os procedimentos são os seguintes:

1. Execute o Windows Anytime Upgrade

2. Digite a chave do Home Premium ->

H4JWX-WHKWT-VGV87-C7XPK-CGKHQ

3. Execute o Windows Anytime Upgrade novamente

4. Digite a chave do Ultimate que está no tutorial acima.
Alterando também a linguagem do Sistema

O Windows 7 é todo modular, até na linguagem do Sistema Operacional. Se você pegar um computador com a versão Home Premium em inglês, basta fazer esse procedimento e depois de virar Ultimate, baixe o pacote de linguagem do brasil através do Windows Update, evitando a formatação do windows apenas para trocar a versão do idioma.


Fonte: http://infohelp.org

quarta-feira, 30 de março de 2011

Como funciona a linguagem java

Variáveis

Todos os programas utilizam variáveis para guardar, temporariamente, alguns dados . Por exemplo, se você pedir um número de um usuário em alguma parte do programa, vai armazená-lo em uma variável para que possa utilizar depois. As variáveis devem ser definidas (ou declaradas) em um programa antes que você possa usá-las, e além disso, é necessário atribuir um tipo específico a cada variável. Mais um exemplo: você pode definir uma variável para ter um tipo que permita armazenar números, e definir outra para ter um tipo que a deixe armazenar o nome de uma pessoa. (Como o Java requer que você defina as variáveis antes de usá-las e diga o tipo de valor que deseja armazenar nelas, ela é chamada de uma linguagem de tipagem forte. Como você deve estar se perguntando, há linguagens que não requerem isso, são as linguagens de tipagem fraca. No geral, ao criar programas grandes, a tipagem forte costuma reduzir o número de erros de programação que você pode cometer).
  import java.awt.Graphics;
    import java.awt.Color;
      public class FirstApplet extends java.applet.Applet
    {
          public void paint(Graphics g)
        {
            int width = 200;
            int height = 200;
            g.drawRect(0, 0, width, height);
            g.drawLine(0, 0, width, height);
            g.drawLine(width, 0, 0, height);
        }
    }  
Neste programa, declaramos 2 variáveis chamadas width (largura) e height (altura). E também declaramos que o tipo delas é int. Este é o tipo de variável capaz de armazenar um número inteiro (por exemplo, 1, 2, 3). E, finalmente, inicializamos ambas com o valor de 200. Outra forma de dizer a mesma coisa seria:
          int width;
            width = 200;
            int height;
            height = 200;  
A primeira forma é um pouquinho mais rápida de ser digitada. O ato de definir o primeiro valor de uma variável é chamado de inicialização da variável. Um erro de programação comum acontece quando você esquece de inicializá-la. Para ver esse bug, experimente eliminar a parte da inicialização no código (a parte "= 200") e recompile o programa para ver o que acontece. Você vai ver que o compilador reclama desse problema e essa é uma característica bem legal porque vai ajudá-lo a economizar muito tempo.
Há dois tipos de variáveis em Java: as variáveis simples (primitivas) e as classes.
O tipo int é uma variável simples. Ela é capaz de armazenar um número e nada mais do que isso. Basta declarar uma int, definir um valor e usá-la. As classes, por outro lado, podem conter partes múltiplas e têm métodos que facilitam seu uso. Um exemplo bom e direto de uma classe é a Rectangle (retângulo), e vamos começar por ela.
Uma das limitações do programa no qual trabalhamos até agora é o fato de que ele presume que a janela tem um tamanho de apenas 200 pixels x 200 pixels. E se quiséssemos perguntar para a janela: "Qual é o seu tamanho?," e criar nosso retângulo e diagonais nos baseando neste tamanho? Se você voltar um pouco e olhar a página da documentação referente à classe Graphics (java.awt.Graphics.html, o arquivo que lista todas as funções de desenho disponíveis), vai ver que uma das funções se chama getClipBounds. Clique nesse nome de função para ver a descrição completa. Na verdade, essa função não aceita nenhum parâmetro. Em vez disso, ela retorna um valor do tipo Rectangle. O retângulo que ela retorna contém a largura e a altura da área disponível para desenho. Se você clicar em Rectangle nessa página da documentação, vai ser levado para a página referente à classe Rectangle (java.awt.Graphics.html). Ao olhar na seção Variable Index (Índice de Variáveis) na parte superior da página, vai descobrir que essa classe contém 4 variáveis chamadas de x, y, width (largura) e height (altura), respectivamente. Sabendo isso, o que queremos fazer é saber o tamanho do maior retângulo possível usando getClipBounds, pegar a largura e a altura desse retângulo e salvar esse valores nas variáveis width e height que criamos no exemplo anterior, assim:

  import java.awt.Graphics;
    import java.awt.Color;
    import java.awt.Rectangle;
      public class FirstApplet extends java.applet.Applet
    {
          public void paint(Graphics g)
        {
            int width;
            int height;
            Rectangle r;
              r = g.getClipBounds();
            width = r.width - 1;
            height = r.height - 1;
              g.drawRect(0, 0, width, height);
            g.drawLine(0, 0, width, height);
            g.drawLine(width, 0, 0, height);
        }
    }  

Ao executar este exemplo, vai notar que o retângulo e as diagonais cabem direitinho dentro da área de desenho. E mais: se alterar o tamanho da janela, o retângulo e as diagonais são desenhadas novamente de maneira automática e de acordo com o novo tamanho. Há 5 novos conceitos introduzidos nesse código, vamos ver quais são eles:
  1. em primeiro lugar, por estarmos usando a classe Rectangle, precisamos importar java.awt.Rectangle na terceira linha do programa;
  2. neste programa, declaramos 3 variáveis, 2 (width e height) são do tipo int e uma (r) é do tipo Rectangle;
  3. usamos a função getClipBounds para descobrir o tamanho da área de desenho. E como ela não aceita parâmetros, não lhe demos nenhum ("( )"). Mas ela retorna um "Rectangle". Escrevemos a linha "r = g.getClipBounds();" como uma maneira de dizer: "Por favor, coloque o retângulo retornado na variável r";
  4. essa variável r, pelo fato de pertencer à classe Rectangle, contém 4 variáveis: x, y, largura e altura (leia a documentação da classe Rectangle para aprender esses nomes). Se você quiser ter acesso a elas, use o operador "." (ponto). Por isso, a frase "r.width" quer dizer: "Dentro da variável r, pegue o valor chamado width". Este valor vai ser colocado na nossa variável local que também tem o nome de width. Repare que subtraímos 1 no processo. Faça um teste para ver o que acontece se não fizer isso. Aproveite e também tente subtrair 5 em vez de 1;
  5. por último, usamos width e height nas funções de desenho;
Uma questão que costuma ser feita nesse ponto é: "É obrigatório declarar variáveis com o nome de width e height?" A resposta é não. Poderíamos ter digitado r.width - 1 diretamente na função de desenho. Mas criar variáveis facilita na hora da leitura e é recomendado que você crie este hábito. A linguagem Java é compatível com muitos tipos de variáveis simples. Estas 3 são as mais comuns:
  • int - valores inteiros (1, 2, 3...)
  • float - valores decimais (3,14159, por exemplo)
  • char - caracteres (a, b, c...)
Dá para realizar operações matemáticas com os tipos simples. Entre as operações que a linguagem Java entende, estão + (soma), - (subtração), * (multiplicação) e / (divisão). Aqui vai um exemplo de como você poderia usar essas operações em um programa. Digamos, por exemplo, que você quer calcular o volume de uma esfera com um diâmetro de 10 metros. Este código faria exatamente o que você quer:
  float diameter = 10;
    float radius;
    float volume;
      radius = diameter / 2.0;
    volume = 4.0 / 3.0 * 3.14159 * radius * radius * radius;  
O primeiro cálculo diz: "Divida o valor da variável chamada diameter (diâmetro) por 2,0 e coloque o resultado na variável chamada radius (raio)". Perceba que o sinal "=" significa "Coloque o resultado do cálculo à direita dentro da variável cujo nome está à esquerda".

Dando voltas

Uma das coisas que os computadores fazem muito bem é realizar cálculos e operações repetitivas. Nas seções anteriores, vimos como escrever "blocos seqüenciais de código", o que, automaticamente nos leva a falar sobre as técnicas para fazer um bloco destes acontecer repetidamente. Por exemplo, digamos que eu lhe peça para desenhar a seguinte figura:

Um bom começo seria desenhar as linhas horizontais assim:

Uma maneira de desenhar as linhas seria criar um bloco seqüencial de código:
  import java.awt.Graphics;
        public class FirstApplet extends java.applet.Applet
      {
            public void paint(Graphics g)
          {
              int y;
              y = 10;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
              y = y + 25;
              g.drawLine(10, y, 210, y);
          }
      }  
Para alguns programadores iniciantes, a frase "y = y + 25;" pode parecer estranha na primeira vez que a virem, mas o que ela significa é: "Pegue o valor que está na variável y, some 25 e coloque o resultado de volta na variável y." Por exemplo, se y contiver 10 antes da linha ser executada, ele terá 35 imediatamente após a linha ter sido executada.
Não é difícil perceber logo de cara que esse código contém 2 linhas iguais sendo repetidas várias vezes. O que acontece é que, neste caso, a repetição não é tão trabalhosa, mas imagine se você quisesse criar uma tabela com milhares de linhas e colunas. Ia ser muito cansativo escrever o programa usando este método de repetição. A solução para esse problema é um loop, como você pode ver abaixo:
  import java.awt.Graphics;
        public class FirstApplet extends java.applet.Applet
      {
            public void paint(Graphics g)
          {
              int y;
              y = 10;
              while (y <= 210)
              {
                  g.drawLine(10, y, 210, y);
                  y = y + 25;
              }
          }
      }  
Ao executar este programa, vai ver que ele desenha 9 linhas horizontais com 200 pixels de comprimento.
A expressão while é uma expressão de loop na linguagem Java. Ela manda o Java agir da seguinte maneira: na frase em que pode ler while, o Java observa a expressão entre parênteses e pergunta, "O y é menor ou igual a 210?":
  • caso a resposta seja positiva, o Java insere o bloco de código colocado entre chaves, "{" e "}". A parte do loop acontece ao final do bloco de código. Quando o Java chega à chave final, volta à frase com o while e faz a mesma pergunta novamente. Pode ser que essa seqüência de loop ocorra várias vezes.
  • mas se a resposta for negativa, ele pula o código colocado entre as chaves e segue em frente.
Quando executar esse programa, vai ver que o valor inicial de y é 10. Como dez é menor do que 210, o Java bloqueia as chaves, desenha uma linha de (10,10) a (210,10), define y como 35 e volta à frase while. E como 35 é menor do que 210, o Java bloqueia as chaves mais uma vez, desenha uma linha de (10,35) a (210,35), define y como 60 e retorna à frase while. E isso vai se repetindo até que y seja maior do que 210, a única condição em que o programa pára. E podemos completar nossa grade adicionando um segundo loop ao programa, veja só:
  import java.awt.Graphics;
        public class FirstApplet extends java.applet.Applet
      {
            public void paint(Graphics g)
          {
              int x, y;
              y = 10;
              while (y <= 210)
              {
                  g.drawLine(10, y, 210, y);
                  y = y + 25;
              }
              x = 10;
              while (x <= 210)
              {
                  g.drawLine(x, 10, x, 210);
                  x = x + 25;
              }
          }
      }  
Acho que você percebeu que a frase while tem 3 partes:
  • há um passo de inicialização que define y como 10;
  • depois vem um passo de avaliação dentro dos parênteses da frase while;
  • e por último, em algum lugar da frase, há um passo de acréscimo, que aumenta o valor de y.
Além disso, o Java também suporta uma outra maneira de fazer a mesma coisa de um jeito mais compacto do que a frase com while. Basta usar o comando for. Se você tiver um comando while, da seguinte forma:
          y = 10;
              while (y <= 210)
              {
                  g.drawLine(10, y, 210, y);
                  y = y + 25;
              }  

Então, a frase equivalente a for vai ter a seguinte aparência:
          for (y = 10; y <= 210; y = y + 25)
              {
                  g.drawLine(10, y, 210, y);
              }  
Dá para ver que tudo o que esse novo tipo de programa faz é condensar as linhas de inicialização, avaliação e acréscimo em uma só linha. Não passa de uma maneira de reduzir o tamanho do programa que você escreveu.
E já que estamos aqui, lá vão 2 pontos rápidos a respeito dos loops:
  • em muitos casos, também seria fácil inicializar y como 210 e subtrair 25 a cada passagem pelo loop. A avaliação iria perguntar: "o y é maior ou igual a 10?" A escolha é só sua, mas o que posso dizer é que a maioria das pessoas acha mais fácil somar do que subtrair. E você, o que acha?
  • o passo de acréscimo é muito importante. Um exemplo disso é o seguinte: digamos que você deixou de fora, sem querer, a parte que diz "y = y + 25;" dentro do loop. O que iria acontecer é que o valor de y nunca mudaria (ficando sempre em 10), o que não o deixaria ficar maior do que 210 e o loop continuaria para sempre (ou até que você o parasse, desligando o computador ou fechando a janela). Essa condição é chamada de loop infinito e é um bug bem comum.
Para praticar um pouco o loop, tente escrever programas que desenhem as seguintes figuras:

terça-feira, 29 de março de 2011

Como funciona a linguagem java

Entendendo o que acabou de acontecer

Mas o que foi que eu fiz? Em primeiro lugar, você escreveu um código para um  applet Java extremamente simples. Um applet é um programa Java que pode ser executado dentro de um programa de navegação na internet (browser), ao contrário de um aplicativo Java, que é um programa independente executado em um computador local (os aplicativos Java são um pouco mais complicados e não tão populares, por isso estamos começando com os applets). Depois, compilamos o applet usando o javac. O passo seguinte foi criar uma página da internet extremamente simples cuja função era somente "abrigar" o applet. Rodamos o applet usando o appletviewer, embora também dê para executá-lo, facilmente, em um programa de navegação.
O programa em si tem cerca de 10 linhas:
  import java.awt.Graphics;
      public class FirstApplet extends java.applet.Applet
    {
        public void paint(Graphics g)
        {
            g.drawLine(0, 0, 200, 200);
        }
    }  
Este é um dos applets mais simples que você pode criar. Para entendê-lo por completo, será necessário aprender bastante, especialmente no que diz respeito às técnicas de programação orientadas a objetos. E já que estou presumindo que você não tem a mínima noção sobre programação, gostaria que nos concentrássemos em só uma só linha deste programa no momento:
          g.drawLine(0, 0, 200, 200);   
Esta é a linha do programa que faz todo o trabalho. É ela que desenha a linha diagonal. O resto do programa, por sua vez, é a armação que dá suporte àquela linha, e vamos nos permitir ignorar a armação no momento. O que você fez nesse programa foi mandar o computador desenhar uma linha do canto superior esquerdo (0,0) ao canto inferior direito (200, 200). E o computador, obediente que é, desenhou exatamente como mandamos. Essa é a essência da programação de computadores!
(Repare também que, na página HTML, configuramos o tamanho da janela do applet (no passo 5 acima) para ter largura e altura iguais a 200.)
Neste programa, nós usamos um método (ou função) chamada drawLine e passamos 4 parâmetros para ela (0, 0, 200, 200). A linha termina com um "ponto e vírgula". Ele atua como o ponto final no fim de uma frase. A linha começa com g., o que significa que queremos usar a função chamada de drawLine no objeto específico g (que, como você pode conferir uma linha acima, é da classe Graphics, ou gráfico, em Português. Não se preocupe, ainda vamos entrar nos detalhes sobre classes e suas funções neste artigo).
Um método não é nada mais do que um comando, ou seja, ele manda o computador fazer algo. No nosso caso, drawLine manda o computador desenhar uma linha entre os pontos especificados: (0, 0) e (200, 200). Imagine a janela tendo sua coordenada 0,0 no canto superior esquerdo, com os eixos positivos X e Y se estendendo para a direita e para baixo. Cada ponto na tela (cada pixel) representa um incremento na escala.


Experimente o mesmo programa com números diferentes para os 4 parâmetros. Altere um número ou 2, salve suas modificações, recompile usando o javac e execute novamente o applet após cada mudança feita. Vamos ver o que você consegue descobrir.
E que outras funções posso usar além de drawLine? Para descobrir isso, temos de olhar a documentação da classe Graphics. Ao instalar o kit de desenvolvimento Java e descompilar a documentação, um dos arquivos descarregados no processo se chama java.awt.Graphics.html. É ele que explica essa classe específica. Na minha máquina, o caminho exato para este arquivo é o D:jdk1.1.7docsapijava.awt.Graphics.html. Na sua, porém, o caminho deve ser um pouco diferente (mas não tão diferente assim), tudo depende de onde você instalou o kit. De qualquer maneira, encontre o arquivo e o abra. Lá em cima no arquivo há uma seção chamada "Method Index" (Índice de métodos). Ela nada mais é do que uma lista de todas as funções dessa classe. A função drawLine é uma delas, mas existem várias outras. Alguns exemplos do que você pode desenhar:
  • linhas
  • arcos
  • ovais
  • polígonos
  • retângulos
  • seqüências 
  • caracteres
Leia a respeito e teste algumas dessas funções diferentes para descobrir o que é possível fazer. Por exemplo, experimente este código:
          g.drawLine(0, 0, 200, 200);
            g.drawRect(0, 0, 200, 200);
            g.drawLine(200, 0, 0, 200);
Ele vai desenhar uma caixa com 2 diagonais (lembre-se de deixar a janela grande o bastante para conseguir ver tudo). Agora, tente desenhar outras formas. Aproveite e leia sobre como alterar a cor com a função setColor. Por exemplo:
  import java.awt.Graphics;
    import java.awt.Color;
      public class FirstApplet extends java.applet.Applet
    {
          public void paint(Graphics g)
        {
            g.setColor(Color.red);
            g.fillRect(0, 0, 200, 200);
            g.setColor(Color.black);
            g.drawLine(0, 0, 200, 200);
            g.drawLine(200, 0, 0, 200);
        }
    }  
Repare que foi adicionada uma nova linha import na segunda linha do programa. O resultado deste programa fica assim:


Uma coisa que pode estar passando pela sua cabeça neste momento é: "Como é que ele sabia que tinha de usar Color.red em vez de somente red (vermelho), e como ele sabia que tinha de adicionar uma segunda linha import?" Bom, esse é o tipo de coisa que você aprende com exemplos. Como lhe mostrei um exemplo de como usar o método setColor, agora você sabe que sempre que quiser mudar a cor, terá de usar Color. seguido por um nome de cor como parâmetro para o método setColor; também vai lembrar de adicionar a linha import apropriada no começo do programa. Se for olhar o setColor na documentação, vai ver que tem um link que fala sobre a classe Color, e dentro dele há uma lista de todos os nomes de cores válidos e técnicas para criar novas cores (sem nome). É só ler, guardar na cabeça e agora já sabe como alterar as cores em Java. Essa é a essência de se tornar um programador: aprender novas técnicas e lembrar delas no próximo programa que você for criar. E para aprender essas novas técnicas, você lê um exemplo (como fizemos aqui) ou lê a documentação. Ou, ainda, olha um código de exemplo (como os que estão no diretório de demonstração). Se o seu cérebro gosta de explorar, aprender e lembrar de coisas, você vai adorar programação!
Nesta seção, você aprendeu como escrever códigos lineares e seqüências, ou seja, blocos de códigos que consistem em métodos começando na parte superior e vão descendo (experimente desenhar uma das linhas antes de desenhar o retângulo vermelho e veja o que acontece. Ela será coberta pelo retângulo e ficará invisível, o que nos ensina que a ordem das linhas na seqüência do código é importante). Linhas de código em seqüência formam o núcleo básico de qualquer programa de computador. Agora, antes de irmos para a próxima seção, faça testes com todos os diferentes métodos de desenho e veja o que acontece.

Bugs e depuração

Uma coisa que você vai notar enquanto aprende sobre programação é que você costuma cometer um certo número de erros e suposições que fazem com que o seu programa: 1) não possa ser compilado; ou 2) produza resultados inesperados na execução. Esses problemas são conhecidos como bugs (erros), e a ação de removê-los chama-se depuração. Os programadores costumam passar metade do seu tempo fazendo isso.
Eu sei que você é capaz e vai ter tempo e oportunidade de sobra para criar os seus próprios bugs, mas vou criar alguns para deixá-lo mais familiarizado com as possibilidades. No seu programa, apague um dos "ponto e vírgula" do final de uma linha e tente compilar o programa com o javac. O compilador vai lhe mostrar uma mensagem de erro. Isso se chama erro de compilador e temos de eliminar todos eles antes de poder executar o programa. Outra possibilidade é cometer um erro de digitação no nome de uma função. Experimente esquecer de digitar um "{" ou eliminar uma das linhas import para ficar acostumado com os diferentes erros de compilador. A primeira vez que você vir um certo tipo de erro de compilador, pode ficar bem frustrado. No entanto, se fizer experiências assim (com erros conhecidos criados de propósito), vai se sentir mais familiarizado com vários dos erros comuns.
Um bug, também conhecido como erro de execução ou erro em tempo de execução, acontece quando o programa é compilado, normalmente e consegue ser executado, mas não produz o resultado planejado durante a programação. Por exemplo, este código produz um triângulo vermelho com duas linhas diagonais que o cruzam:
          g.setColor(Color.red);
            g.fillRect(0, 0, 200, 200);
            g.setColor(Color.black);
            g.drawLine(0, 0, 200, 200);
            g.drawLine(200, 0, 0, 200);  
O código a seguir, por outro lado, produz apenas o retângulo vermelho (ele cobre as 2 linhas):
          g.setColor(Color.black);
            g.drawLine(0, 0, 200, 200);
            g.drawLine(200, 0, 0, 200);
            g.setColor(Color.red);
            g.fillRect(0, 0, 200, 200);  
Embora o código seja quase idêntico, o resultado é completamente diferente na execução. E se o resultado esperado for visualizar 2 linhas diagonais, o código do segundo exemplo contém um bug.
Lá vai outro exemplo:
          g.drawLine(0, 0, 200, 200);
            g.drawRect(0, 0, 200, 200);
            g.drawLine(200, 0, 0, 200);
Este código produz uma caixa com uma moldura em preto e 2 diagonais. Já este próximo pedacinho de código produz apenas uma diagonal:
          g.drawLine(0, 0, 200, 200);
            g.drawRect(0, 0, 200, 200);
            g.drawLine(0, 200, 0, 200);  
Novamente, se o que você queria era ver 2 diagonais, o segundo código contém um bug (examine-o até descobrir o que há de errado). Este é o tipo de bug que, por ser muito sutil, pode levar tempo para ser encontrado.
E não se preocupe, pois você vai ter bastante tempo para praticar a "arte" de encontrar seus próprios bugs. O programador comum gasta cerca de metade de seu tempo procurando, encontrando e eliminando esses erros. Então, tente não ficar frustrado quando ocorrerem, eles fazem parte da vida de um programador.