quarta-feira, 13 de novembro de 2013

Funções, vamos declarar!

Até agora, todos os programas foram simples e pequenos, onde tudo cabia no mesmo lugar.
Programas grandes e complexo precisam ser feitos de outra forma, para isso, vamos utilizar funções.

Existe vários motivos para dividir problemas complexos em funções. O principal, é a reutilização do código.
Já fizemos alguns programas com funções matemáticas básica, imagine como seria bacana, utilizar cada função que foi escrita no mesmo programa!?

Escrever e utilizar uma função segue o seguinte fluxo:

void NomeDaFuncao()
{
 // código aqui...
 return;
}
int mains(int nNumberofArgs, char* pszArgs[])
{
 //código do programa...
//agora, vamos chamar a função NomeDaFuncao()
NomeDaFuncao();

//aqui o controle retorna
}

1- A declaração:
A primeira coisa é a declaração da função, com um nome e o tipo à frente, seguido por um conjunto de parenteses de abertura e fechamento.

2- A definição:
A declaração é seguida da definição do que ela faz. Este é o corpo da função que sempre começa com uma chave de abertura e uma chave de fechamento.

3- O retorno:
O corpo da função contem zero ou mais declarações de retorno. O retorno faz o controle voltar para imediatamente depois do ponto onde a função foi chamada.

4- A chamada:
A função é chamada invocando o nome da função seguida por parênteses de abertura e fechamento.

Retorno da Função.
As funções retornam um valor a quem chama.
Para retornar um valor de uma função, é necessário fazer duas alterações:

1°. Substituir void pelo tipo de valor que vc deseja retornar.
2°. Colocar o valor a retornar depois da palavra-chave return. C++ não permite vc retornar sem nada de uma função se o tipo de retorno for diferente de void.

Vamos ver um exemplo:
A função somaSequencia() é chamada repetidamente para somar uma série de números fornecidos pelo usuário, até que o usuário forneça uma sequência de comprimento zero.

------------------------------------------------------------------------------------------------------------
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;

int somaSequencia()
{
 //criamos a variavel que vai armazenar os dados digitados.
 int nAcumulador = 0;

 //lendo os valores digitados
 for(;;)
 {
  int nValor;
  cout << "Proximo: ";
  cin >> nValor;

  //saindo do loop quando o valor de alvo for digitado
  if(nValor < 0)
  {
   break;
  }

  //agora, passamos o valor para o acumulador
  nAcumulador += nValor;
 }

 //aqui retornamos o valor chamado para o acumulador
 return nAcumulador;
}

int main(int nNumberofArgs, char* pszArgs[])
{
 cout << "Entre com a sequencia de numeros\n"
      << "Numero negativo encerra o programa\n" ;
for(;;)
{
 int nSoma = somaSequencia();
 if(nSoma == 0)
 {
  break;
 }
 cout << "Soma = " << nSoma << endl;
}
system("pause");
return 0;    
}
------------------------------------------------------------------------------------------------------------
Como Passar Argumentos para Funções. 
Quando a função apenas retorna valor, elas são de valor limitado e a comunicação é de uma via - da função para o chamador. Vamos ver agora a comunicação de duas vias, argumentos de função.

Um argumento de função é uma variável, cujo valor é passado para a função durante a chamada. Vamos converter a operação fatorial do estudo anterior em uma função:

------------------------------------------------------------------------------------------------------------
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;

int fatorial(int nAlvo)
{
 //Vamos inicializa o acumulador com 1.
 int nAcumulador = 1;
 for(int nValor = 1; nValor <= nAlvo; nValor++)
 {
  nAcumulador *= nValor;
 }
 return nAcumulador;
}
int main(int nNumberofArgs, char* pszArgs[])
{
 cout << "Programa para calculo de fator\n"
      << "Digite um numero negativo para encerrar o programa" << endl;
for(;;)
{
 int nValor;
 cout << "Digite o numero: ";
 cin >> nValor;
 if(nValor < 0)
 {
  break;
 }
 int nFatorial = fatorial(nValor);
 cout << nValor << " o fator e " << nFatorial << endl;
                
}
system("pause");
return 0;
}
------------------------------------------------------------------------------------------------------------

Uma função pode ter múltiplos argumentos separados por vírgulas. Ex:.
int produto(int nValor1, int nValor2)
{
 retorno nValor1 * nValor2;

------------------------------------------------------------------------------------------------------------
A palavra-chave main() do nosso gabarito é uma função. Mesmo com alguns argumentos estranhos ;)
C++ permite designar o mesmo nome a duas ou mais funções, se puderem ser distinguidas pelo nome ou pelo tipo de argumento. Isso é chamado de sobrecarga de funções.




sexta-feira, 6 de setembro de 2013

Seja Bem Vindo!

E aqui iniciamos nossa jornada, e o mais exitante do inicio, é que não sabemos qual será o fim !
<a href="https://plus.google.com/117007923951383177992" rel="publisher">Google+</a>

domingo, 19 de maio de 2013

#Errata

Peço desculpas pelo meu erro em não perceber que a clausula #include esta cortada :(

Atualizei todas as postagens inserindo a clausula completa como abaixo:


#include<cstdio>
#include<cstdlib>
#include<iostream>

Vale lembrar que, caso esteja no computador do trabalho ou de um amigo que não tenha os copiladores como o DevC++ ou CodeBlock, basta digitar o código no bloco de notas e salva com a extensão .exe

Assim, pode ver seu programa em execução sem instalar nada.
Agora sim, garanto que vai funcionar ;)

Vamos em frente...

Loop For

O loop for não é tão flexível quanto o loop while, porém, é o mais popular.
A maioria dos loops tem 4 partes essenciais.

- A configuração:
Envolve declarar e iniciar uma variável increment.

- O teste de expressão:
A expressão que levará o programa a executar o loop ou sair dele. Normalmente acontece entre os parentes.

- O corpo:
O código dentro das chaves.

- O incremento:
É onde a variável é incrementada. Normalmente no final do corpo.

O loop for incorpora as quatro partes em uma única estrutura. Ex.:

for(setup; teste de expressão; incremento)
{
  Corpo;
}

Uma vez que o setup é executado, o controle vai para o teste da expressão.
O teste da expressão sendo verdadeiro, ou true, o controle passa para o corpo de loop for.
Se o teste da expressão passa a ser falso, ou false, o controle passa para a próxima declaração após a chave de fechamento.
Quando o controle tiver passado pelo corpo do loop for, é forçado a executar a seção de incremento do loop. Depois, o controle volta a testar a expressão.

Vamos refazer o programa fatorial utilizando o loop for para exemplificar e fixar.
------------------------------------------------------------------------------------------------------------


#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
   
    int nAlvo;
    cout << "Entre com o numero para calcular seu fator: ";
    cin  >> nAlvo;

   
    int nAcumulador = 1;
    for(int nValor = 1; nValor <= nAlvo; nValor++)
    {
        cout << nAcumulador << " * "
             << nValor << " igual ";
        nAcumulador = nAcumulador * nValor;
        cout << nAcumulador << endl;
    }

   
    cout << nAlvo << " O fator e: "
         << nAcumulador << endl;

    system("PAUSE");
    return 0;
}
------------------------------------------------------------------------------------------------------------

Há um operador que não foi mencionado, a virgula (,).
Vamos escrever um programa para ver o operador virgula(,) em ação.  Este programa é apenas ilustrativos, vamos entrar numa prática mais aplicada para o operador virgula(,) quanto chegar os arrays, e eu espero chegar lá ;)

------------------------------------------------------------------------------------------------------------


#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
 int nAlvo;
 cout << "Entre com o valor maximo: ";
 cin >> nAlvo;

 for(int nMinuscula = 1, nMaiuscula = nAlvo;
 nMinuscula <= nAlvo; nMinuscula++, nMaiuscula--)
 {
  cout << nMinuscula << " * "
       << nMaiuscula << " e igual "
       << nMinuscula * nMaiuscula << endl;
 }

 system("pause");
 return 0;
}
------------------------------------------------------------------------------------------------------------
Desta vez, nós queremos não apenas incrementar uma variável de 1 até o nAlvo, mas também, decrementar a segunda variável de nAlvo até 1.






sábado, 18 de maio de 2013

While Rodando em Círculos.

Outro recurso importante é a habilidade de fazer um loop.
Construção do loop while(enquanto) no C++.

Formato:
while(expressão)
{
  //Aqui vai o codigo.
}
//Aqui continua o código após o loop.

Quando o programa encontra o loop while, ele avalia a expressão entre parênteses.
Se a expressão for verdadeira, true, ele passa o controle para a primeira linha dentro de {. Quando o controle chegar a }, o programa volta para a expressão e recomeça.
O controle continua a circular entre as chaves até que a expressão passe para falsa, false, ou até que outra coisa rompa o loop.
Vamos avaliar com um programa:

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
    int nAlvo;
    cout << "Este programa calcula os fatores.\n"
         << "Entre com o numero.";
    cin  >> nAlvo;
 
    int nAcumulador = 1;
    int nValor = 1;
    while(nValor <= nAlvo)
    {
      cout << nAcumulador << " * "
           << nValor << " igual ";
      nAcumulador = nAcumulador * nValor;
      cout << nAcumulador << endl;
      nValor++;
    }
    //Imprimindo o resultado.
    cout << nAlvo << " Fator = "
    << nAcumulador << endl;
 
    system("PAUSE");
    return 0;
}
------------------------------------------------------------------------------------------------------------
Após solicitar o valor para o usuário, o programa coloca o valor em nAlvo e já inicia nAcumulador e nValor para 1.

O programa compara o nValor com nAlvo. Caso tenha digitado o valor 5, surge o primeiro loop com a seguinte questão: 1 é menor ou igual a 5? Como a resposta é true, verdadeira, o loop continua.

Antes de multiplicar, o programa imprime os valores de nAcumulador e nValor, ambos igual a 1.
Feito isto, o programa multiplica nAcumulador por nValor e atribui o resultado da multiplicação para nAcumulador, que passa de 1 para 2.

Em seguida, o loop recomeça com a seguinte pergunta: 2 é menor ou igual a 5? Como a resposta ainda é true, verdadeira, o loop continua.

O loop continua até que nValor chegue a 6, deixando de ser menor ou igual a 5 digitado pelo usuário.
Desta forma, o controle passa para a primeira declaração feita após a chave de fechamento } e imprime o resultado final.

Caso usuário digite 0, o controle vai direto para a instrução após a chave de fechamento } e o loop não será executado nenhuma vez. Isto por que, nValor é menor ou igual a 0 e a declaração foi falsa. 

Para interromper um loop em execução, o C++ oferece dois comandos de controle:

Break: sai imediatamente do interior do loop.
Continue: retorna o controle para o inicio do loop.

Vamos ver os dois exemplos em um programa que multiplica valores positivos fornecidos pelo usurário, até que seja digitado um número negativo. O programa ignora zero.
------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
    cout <<"Programa para multiplicar os numeros digitados\n\n"
         <<"Para parar o programa, digite um numero negativo\n\n"
         <<"O programa iguinora zero\n\n"
         << endl;
       
         int nProduto = 1;
         while(true)
         {
          int nValor;
          cout << "Digie o numero para multiplicar: ";
          cin >> nValor;
       
          if(nValor < 0)
          {
           cout << "Saindo. Tchau!\n\n" << endl;
           break;      
          }
          if(nValor == 0)
          {
           cout << "O programa iguinora zero. Por gentileza, digite um numero positivo.\n\n" << endl;
           continue;
          }
       
          //Multiplicando e imprimindo o resultado no console.
          cout << nProduto << " * " << nValor;
          nProduto *= nValor;
          cout << " igual " << nProduto << endl;
         }
 
system("PAUSE");
return 0;
}
------------------------------------------------------------------------------------------------------------
O programa começa com o valor inicial de 1 no produto. Depois, avalia a expressão lógica true. Como true é verdadeiro, o programa entra no loop e continua solicitando ao usuário outro número para multiplicação.

Caso um valor negativo seja digitado, o programa envia a frase de despedida antes de executar o break, que passa o controle para fora do loop.

Caso o valor digitado seja zero, o programa notifica o usuário e retorna o controle para continue assim, o usuário pode continuar digitando.

Loops Aninhados.

O corpo de um loop ponde conter outro loop que é conhecido como nested loops ou loop alinhado.

O lopo alinhado deve executar totalmente através do loop externo.

Vamos escrever um programa que utiliza o loop alinhado para criar uma tabela de multiplicação.
Cada posição da tabela sera apenas a fileira de número, vezes a coluna de número.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
 //Mostrando a coluna
 int nColuna = 0;
 cout << " ";
 while(nColuna < 0)
 {
  cout.width(2);           //Setando uma constante para imprimir no console dois caracteres ou dois digitos.
  cout << nColuna << " "; // Agora, imprimindo as colunas
  nColuna++;              //Incrementa para a proxima coluna
 }
 cout << endl;
 //Agora, o loop para percorrer as linhas
 int nLinha = 0;
 while(nLinha < 10)
 {
  cout << nLinha << " - "; //Começando com o valor das linhas.
  nColuna = 0;            //Agora para cada linha, iniciamos a coluna 0 e vamos para a coluna 9.
  while(nColuna < 10)
  {
   cout.width(2);       //Imprimindo o produto de coluna * linha usando 2 caracteres mesmo quando temos apenas 1 digito.
   cout << nLinha * nColuna << " ";
   nColuna++;  //Indo para a proxima coluna
  }
  nLinha++;    //Indo para a proxima linha
  cout << endl;
  
 }
system("PAUSE");
return 0;
}
------------------------------------------------------------------------------------------------------------
A expressão cout.width(2) ajusta a largura da exibição para duas colunas - C++ coloca um espaço a esquerda em números com apenas 1 digito.



sábado, 11 de maio de 2013

Muitos caminhos

Vamos ver o que o C++ oferece quando o programa precisa decidir entre muitas entradas.
C++ oferece um mecanismo de controle conveniente para selecionar uma série de opções. A declaração switch.

Fluxo e formato da declaração:

switch(expressão)
{
case const1:
//aqui vai a expressão  correspondente == const1
break;

case const2:
//aqui vai a expressão  correspondente == const2
break;

case const3:
//aqui vai a expressão  correspondente == const3
break;

default:
//aqui vai a expressão final
}

Quando encontra a declaração switch, C++ avalia a expressão. Feito isto, ele passa o controle para o comando da expressão do mesmo valor correspondente e continua até encontrar break. O break transfere o controle para } no final da declaração switch.
Se nenhum dos comando combinar, o controle é passado para o comando default por padrão.
O controle default padrão é opcional, mas é uma boa pratica utiliza-lo. #FicaAdica.

Uma declaração switch é diferente de uma série de declarações if. Apenas constantes são permitidas após a palavra chave case, ou expressões que possam ser avaliadas na montagem. Não é possível fornecer uma expressão depois de um comando, pois o valor não é conhecido até o programa ser executado.

Vale lembrar, que o break também é opcional, porém, sem ele, o controle "pula" de um comando para o outro. Seria útil não utilizar a declaração break quando dois ou mais comandos são tratados da mesma maneira.

Para fixar, vamos criar uma calculadora simples implementada com switch.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>


using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
    int nOperador1;
    int nOperador2;
    char cOperador;
    cout << "Entre com o primeiro e o segundo valor\n"
    << "As operacoes permitidas sao: +, -, *, / ou %." << endl;
    cin >> nOperador1 >> cOperador >> nOperador2;
 
    cout << nOperador1 << "  "
         << cOperador  << "  "
         << nOperador2 << " = ";
 
    switch(cOperador)
    {
     case'+':
     cout << nOperador1 + nOperador2;
     break;
     case'-':
     cout << nOperador1 - nOperador2;
     break;
     case'*':
     case'x':
     case'X':
     cout << nOperador1 * nOperador2;
     break;
     case'/':
     cout << nOperador1 / nOperador2;
     break;
     case'%':
     cout << nOperador1 % nOperador2;
     break;
     default:
     cout << "Operacao Invalida";
    }
    cout << endl;
 
    system("PAUSE");
    return 0;
}
------------------------------------------------------------------------------------------------------------
Perceba que o programa inicia repetindo o que foi digitado. Repetir o que foi digitado é uma boa prática de programação, pois garante ao usuário que ele digitou correto, ou não.

Os comandos: x e X foram incluídos pois são símbolos comuns da multiplicação. Do contrário, o comando entraria no default retornando como operação inválida.

quarta-feira, 1 de maio de 2013

Tomar Decisões.

Tomar Decisões.
Todas as linguagens de computador oferecem algum tipo de capacidade de tomada de decisão. Em C++ isso é tratado pela declaração if.
O formato da declaração if é direto. Ex:

if (m > n) // Se m é maior do que n...
{
   //Aqui o codigo....
}

Ao encontrar if, C++ executa a expressão logica contida nos parenteses. Caso a expressão condicional se m for maior que n. Se verdadeiro, o comando é passado para o codigo entre as chaves. Quando a expressão deixa de ser verdadeira, e passa a falsa, o controle passa para a próxima linha após o fechamento das chaves.

Vamos ver os operadores de comparação e seu significado.

= =  Igualdade. Verdade se o argumento do lado esquerdo  tiver o mesmo valor que a expressão do lado direito.
!=   Desigualdade. Oposto de igualdade.
>    Maior que. Verdadeiro se o argumento do lado esquerdo for maior que o do lado direito direito.
<    Menor que. Verdade se o argumento do lado esquerdo for menor que o do lado direito.
>=  Maior que ou igual a. Verdadeiro se o argumento esquerdo esquerdo for maior ou igual ao direito.
<=  Menor ou igual a. Verdade se o argumento esquerdo for menor ou igual ao direito.

#Dica. Não confunda o operador de igualdade = = com o de designação =.
Vamos ver os operadores em um programa.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main (int nNumberofArgs, char* pszArgs[])
{
    //Entrando com o operador1 e operador2
    int nOperador1;
    int nOperador2;
    cout << "\nEntre com o argumento 1: ";
    cin >> nOperador1;
 
    cout << "\nEntre com o argumento 2: ";
    cin >> nOperador2;
 
 
    //Agora, imprimindo os resultados
    if (nOperador1 > nOperador2 )
    {
      cout << "\nO argumento 1 e maior do que o argumento 2." << endl;
    }
    if (nOperador1 < nOperador2)
    {
      cout << "\nO argumento 2 e maior do que o argumento 1." << endl;
    }
    if (nOperador1 == nOperador2)
    {
      cout << "\nOs argumentos sao iguais." << endl;
    }
system("pause");
return 0;
}
------------------------------------------------------------------------------------------------------------

O programa declara duas variáveis int chamadas nOperador1 e nOperador2.
Após solicitar ao usuário que digite os argumentos, o programa executa três comparações:

Se nOperador1 é maior do que nOperador2
Se nOperador1 é menor do que nOperador2

Se nOperador1 é igual a nOperador2

Feita a comparação o programa exibe o resultado.
Mesmo não sendo necessário utilizar as chaves {} quando temos apenas uma declaração if, o uso é recomendado para evitar qq tipo de erro. #Ficaadica.

Podemos usar também a clausua else (caso contrário, se não) a expressão entre as chaves após o else serão será executada, caso a expressão condicional seja falsa. Ex:

if (m > n)
{
 //Aqui vai o código...
}
else
{
//Aqui vai o comando que deve ser executado caso a expressão seja falsa...
}
Vale lembrar que a cláusula else deve aparecer imediatamente após a chave de fechamento do if.

As chaves da cláusula if ou else podem conter  uma outra declaração if. Desta forma, teremos uma declaração if alinhada ou nested. Vamos ver um programa:

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>


using namespace std;

int main (int nNumberofArgs, char* pszArgs[])
{
 //Digite o dia de seu aniversario
 int nAno;
 cout << "\nDigite em que nasceu. ";
 cin >> nAno;

 //Agora, vamos determinar o século
 if (nAno > 2000)
 {
  cout << "\nVc nasceu no seculo 21" << endl;
 }
 else
 {
  cout << "Vc nasceu ";
  if (nAno < 1950)
  {
   cout << "na primeira metade do seculo ";
  }
  else
  {
   cout << "na segunda metade do seculo ";
  }
  cout << "21" << endl;
 }

system("pause");
return 0;
}
------------------------------------------------------------------------------------------------------------
Para praticar, vc pode utilizar if alinhado no programa operador1 e operador2. #Valeapratica.
#Dica. Não é necessário o teste de igualdade. Se o operador1 não for menor ou maior que operador2, então ele deve ser igual.

Expressões condicionais compostas.

Os três operadores lógicos que podem ser usados para criar expressões condicionais compostas são:

&& AND (e) Verdadeiro, se o argumento do lado esquerdo e direito forem verdadeiros, do contrário, falso.

|| OR (ou) Verdadeiro, se qq dos argumentos, da esquerda ou da direita forem verdadeiros, do contrário, falso.

! NOT (não) Verdadeiro, se o argumento da direita for falso, do contrário, falso.

Numa expressão condicional composta, o programador esta fazendo uma ou mais perguntas, veja o exemplo no trecho de código:

if (m < nArgumento && nArgumento < 5)

Este teste não inclui as extremidades, isto é, este teste falhará se nArgumento for igual a m ou n. Use o operador de comparação <= se vc quiser incluir extremidades.













sábado, 20 de abril de 2013

Expressões de Caractere.
São declaradas exatamente como inteiros, mas com a palavra-chave char no lugar de int. Ex: 

char NomeDoCaractere

As constantes são definidas como um único caractere, com aspas simples. Ex:

char letraA = 'A';

Oriento para melhor entendimento, uma pesquisa sobre codificação de caracteres. Não vou entrar em detalhes aqui, basta seguir os exemplos sugeridos nos códigos com a codificação de caractere já inserida.

Vamos seguir com um programa, que permite vc brincar com os caracteres ASCII.

------------------------------------------------------------------------------------------------------------
#include<cstdio>
#include<cstdlib>
#include<iostream>


using namespace std;

int main (int nNumberofArgs, char* pszArgs[])
{
 //Vamos pedir o valor através do prompt de comando.
 int nValor;
 cout << "Digite um numero decimal: ";
 cin >> nValor;

 //Agora, vamos imprimir o caractere correspondente ao digitado.
 char cValor = (char)nValor;
 cout << "O caractere correspondente ao digitado foi: [" << cValor << "]" << endl;

system("pause");
return 0;
}
------------------------------------------------------------------------------------------------------------
#Dica.
Na execução do program acima, sugiro, apenas para ilustrar, inserir os seguintes números para ver o resultado:
63
5
6
7

O (char) que aparece na frente de nValor é chamado de cast (instrução que converte uma variável de um tipo em outro tipo), o qual converte o valor de nValor de um int para um char. 

Para facilitar nossa vida, C++ permite que vc codifique uma sequência de caracteres, fechando a string, sequência, entre aspas duplas. Ex:

cout << "Digite um numero decimal";

É possível codificar qq caractere, impresso ou não, basta colar seu valor em octal depois de uma barra invertida. Ex:

char cEspaco =  '\040';

Sugiro uma pesquisa sobre octal, base de 8 e hexadecimal, base 16.

#Informação importante!
No windows, a barra invertida é usada nos nomes dos arquivos. Ex:
C:\Base Directory\Subdirectory\File Name

Para utilizar a barra invertido nesta situação, cada barra deve ter outra. Ex:
"C:\\Base Directory\\Subdirectory\\File Name"



Expressões Inteiras.

Declarando Variáveis.

A declaração de uma variável inteira começa com a palavra-chave int seguida pelo nome da variável e um ponto e virgula. Ex:

int n1;

Todas as variáveis em C++ precisam ser declaradas antes que possa ser usadas.
Cada variável tem um valor quando é criada, porém, ate que seja designado um determinado valor a ela, uma variável simplesmente aceita qq valor inútil que esteja no mesmo local de memoria que ela foi alocada.

Para designar uma valor a variável, vc deve usar o sinal de igual (=). Ex:

int n;
n = 1;

Vc também iniciar a variável na hora que é declarada. Ex:

int n = 1;

Constantes Inteiras.
C++ entende qq símbolo que comece com um dígito e só contenha dígitos como sendo constante inteira.
Ex: 

123
1
256

Mas veja, não pode ter caracteres estranhos. Ex de errado:

123z456

Expressões.

Variáveis e constantes são úteis se usadas para fazer cálculos.
As expressões sempre envolvem variáveis, constantes e operadores. Um operador executa alguma operação aritmética em seus argumentos. Temos operadores binários e unários.
Toas as expressões retornam um valor e um tipo.

Operadores binários.
É aquele que toma dois argumentos.

*, /, %, +
Multiplicação, divisão, adição, subtração e módulo.

Uma única expressão pode conter incluir múltiplos operadores. Quando os operadores são iguais, C++ avalia a expressão da esquerda para a direita. Ex:

5 + 100 + 32
500 + 32
532

Quando são diferentes, C++ usa uma propriedade chamada precedência, que é a ordem pela qual os operadores são avaliados.
Caso queira, vc pode alterar a precedência dos operadores, envolvendo em parenteses as expressões que deseja que sejam executadas primeiro. Ex:

int n = 5 * (100 + 32);

Assim, a adição é executada antes da multiplicação.

Operadores Unários.
São aqueles que tomam um único argumento, são eles: -, ++,--.
Os operadores ++ e -- aumentam e diminuem seus argumentos em um.
Estes operadores, ++ e --, vêm também em duas versões: um prefixo e uma sufixo.

Ex: de prefixo: ++n.
Ex: de sufixo: n++.

Ambos aumentam seus argumentos em um, a diferença esta no valor retornado. O prefixo retorna valor depois da operação de incremento, enquanto o sufixo retorna o valor do incremento.
Vamos ver em um programa.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>


using namespace std;

int main (int nNumberofArgs, char* pszArgs[])
{
  //Demosntrando incremento e decremento

   int n;
   //Primeiro o prefixo
   n = 1;
cout << "O valor de n e: " << n << endl;
cout << "O valor de ++n e: " << ++n << endl;
cout << "O valor de n  depois e: " << n << endl;
cout << endl;

//Agora, o sufixo
n = 1;

cout << "O valor de n e: " << n << endl;
cout << "O valor de n++ e: " << n++ << endl;
cout << "O valor de n depois e: " << n << endl;
cout << endl;


system("pause");
return 0;
}

------------------------------------------------------------------------------------------------------------
Veja que nos dois casos, a variável n é inicializada para 1 e, após a execução, é incrementada e decrementada. 

sábado, 30 de março de 2013

Convertendo Celsius para Fahrenheit.

Vamos criar um programa simples, que converte a temperatura de Celsius para Fahrenheit.
Vale lembrar que C++ diferencia entre letras maiúsculas e minusculas (case sensitive)
Então, cuidado na digitação.

Nesta primeira etapa, digite tudo exatamente como esta. No progresso do estudo vamos identificando o que é o quê, o que faz, pra que serve e tudo o que for necessário.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{
    //Entrada de informações através do usuário
 int celsius;
 cout << "Entre coma temperatura em Celsius = ";
 cin >> celsius;

    //Convertendo Celsius para Fahrenheit
 int fahrenheit;
 fahrenheit = celsius * 9/5 + 32;

   //Mostrando os resultados na tela
 
 cout << "O valor em Fahrenheit = ";
 cout << fahrenheit << endl;

  //As linhas abaixo servam para não fechar o programa após a execução.
  //Aguarda qq toque de tecla para finalizar
   
 system("Pause");
 return 0;

}
------------------------------------------------------------------------------------------------------------

Montando o Programa.
Após toda a digitação, o compilador verificar os possíveis erros e, acredite, quase sempre tem erros.

Aprender como interpretar o que o compilador esta tentando informar com as mensagens de erro e aviso é uma parte importante do aprendizado da linguagem. #Dica ;)
Apenas trabalhando sobre os seus erro é que vc desenvolve o sentido de como a linguagem funciona.

Para finalizar, algumas informações sobre o código do programa.

O Gabarito:
A primeira parte do programa e o final. Será sempre usado.

------------------------------------------------------------------------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>

using namespace std;

int main(int nNumberofArgs, char* pszArgs[])
{

//Aqui entra todo o código.


 system("Pause");
 return 0;

}
------------------------------------------------------------------------------------------------------------
Comentários:
É uma linha ou parte de uma linha que é ignorada pelo compilador. Os comentários permitem explicar o que o programador esta fazendo.

Um comentário em C++ começa com barras duplas //

Arquivos Include.
Sempre começa com a declaração #include na coluna 1, seguido pelo nome do arquivo a incluir. Vamos falar mais sobre isso em breve.

Main.
Cada programa precisa conter um main() em algum lugar. A execução começa na chave de abertura logo de  main() e termina na declaração de retorno, antes da chave de fechamento. Vamos falar mais sobre isso em breve.







Linguagens de Computador.


Linguagens de Computador.

Os computadores "pensam" usando uma série de zeros e uns. Os comandos são uma sequência de números binários (base 2) como 01011101 ou hexadecimais (base 16). Já imaginou programar desta forma?

Antes os programas eram feitos na linguagem Assembly e, depois, um programa chamado assembler convertia os códigos para linguagem de máquina.

Os programas escritos hoje são chamados como código fonte - a fonte de todo o mal.
Na verdade, o computador jamais executa instruções de linguagem Assembly. Ele executa as instruções de maquina que resultam da conversão das instruções Assembly.

Em 1950, as pessoas começaram a conceber, gradativamente, linguagens expressivas que poderiam ser automaticamente convertidas para linguagem de máquina por um programa chamado compilador.

Essas eram as linguagens de alto nível, pois eram escritas em um nível de abstração mais alto do que a linguagem Assembly.

Umas das primeiras linguagens foi o COBOL. Linguagem Orientada para Aplicações Comerciais, que permitia aos programadores escreverem comandos que se pareciam máximo possível com frases em inglês.


Processo de Compilação.
É possível criar programas C++ utilizando um simples editor de texto, como o bloco de notas ou notpad.
Porém, é preferível um editor que saica alguma coisa sobre a sintaxe do C++ e vai ajudar no processo de montagem.

Existem alguns programas bacanas e muitos, gratuitos.
Eu recomendo o DevC++, é simples, direto, gratuito e em português.

sexta-feira, 29 de março de 2013

Computador X Humanos.

Computador X Humanos.

O computador é uma maquina incrivelmente idiota. Ele pode fazer qq coisa que eu digo a ele (dentro do razoável), mas ele faz "exatamente" o que lhe é dito - nada mais e nada menos.

Sendo que é tão importante, e consideravelmente mais difícil, entender o que não foi dito. Neste aspecto, o computador é quase o oposto de um ser humano, pois nós, os humanos, respondemos intuitivamente (bem, quase todos...)

Por exemplo: 
Se eu digo: Lave os pratos! São instruções claras, mas a grande maioria das informações contidas em tal frase esta "implícita" e não dita.

Vou utilizar um modelo que acho ser bastante ilustrativo e intuitivo, retirado do livro Começando a Programar em C++ para Leigos, de Stephen R. Davis.

"Como Programar um Computador Humano".

O Algoritmo.
#Dica. Um algoritmo é uma descrição das etapas a serem executadas, normalmente a um alto nível de abstração.

1. Erga o carro.
2. Remova as porcas.
3. Remova o pneu.
4. Coloque um novo pneu.
5. Instale as porcas.
6. Abaixe o carro.

Para passar estas instruções ao computador, precisamos falar com ele em uma linguagem que ele conheça.
Para nos ajudar, vou seguir a mesma linguagem de modelo utilizada por Stephen no livro, a TCL - Tire Changing Language ou Linguagem de Troca de Pneu :)

TCL tem substantivos como:
carro
pneu
porca
macaco
caixa de ferramentas
pneu sobressalente
chave inglesa

TCL também tem os verbos:
agarrar
mover
soltar
girar

TCL também precisa saber contar e tomar decisões simples.

Bom, basicamente é tudo que o nosso robô trocador pneu entende. QQ outro comando e ele não faz nada.

O Programa.
Agora vamos converter o algoritmo para o programa necessariamente.

Vc diz: "remova a porca". Para iniciar a troca, certo? Errado. O robô não entende  desta forma, aliás, por mais completa que a frase seja, não contem nenhuma das palavras do nosso TCL que o robô entende.

Vamos realizar esta primeira tarefa utilizando nossa TCL e os passos necessário para o entendimento da máquina.

1. agarre a chave inglesa ;
2. mova a chave inglesa para a porca ;
3. gire a chave inglesa cinco vezes no sentido anti-horário ;
4. mova a chave inglesa para a caixa de ferramentas ;
5. solte a chave inglesa.

Até aqui, podemos dizer que o fluxo do programa flui da etapa 1 até a 5.

Uma dúvida: E se não houver porca?
Não teria problema se a chave inglesa girar sem uma porca. Porém, gastaria tempo e energia, e nosso programa precisa ser funcional, econômico e rápido.

A TCL precisa de uma extensão para tomada de decisões simples, escolhendo o que fazer de acordo com a situação encontrada. Vamos adicionar uma declaração IF (se).

1. agarre a chave inglesa ;
2. Se houver porca ;
3. {
4.    Mova a chave inglesa para a porca ;
5.    Gire a chave inglesa cinco vezes no sentido anti-horário ;
6. }   
7. mova a chave inglesa para a caixa de ferramentas ;
8. solte a chave inglesa.

O programa incia normalmente, se houver porca, o fluxo continua a execução de todas as etapas. Se não houver porca, o programa pula para a etapa 7 e 8.
Neste ponto, o programa executa uma expressão lógica que retorna um valor verdadeiro ou falso. Sim, a porca esta presente - verdadeiro. Não, a porca não esta aqui - falso.

Ainda nos resta um problema. Como o robô vai saber quantas voltas precisa girar a chave inglesa para soltar a porca?
Existe porcas diferentes, certo? Se informa um número médio para ter a certeza de que atenderia a todas as porcas, naquelas que precisam de menos voltas para soltar gastaria tempe e energia novamente, pois o robô continuaria rodando a chave onde a porca já esta solta. Vamos solucionar este ponto.

1. agarre a chave inglesa ;
2. Se houver porca ;
3. {
4.  Mova a chave inglesa para a porca ;
5.  Enquanto (porca anexada ao carro)
6.  {
7.    Gire a chave inglesa uma vez no sentido anti-horário ;
8.  }  
9. }
10. mova a chave inglesa para a caixa de ferramentas ;
11. solte a chave inglesa.

Agora o robô toma uma decisão.
Encontra a porca encaixada e executa a etapa 7.
Retorna a etapa 5 e, como a porca ainda encaixada, ou seja, verdadeiro, repete a etapa 7.
Até que a porca esta solta, como o retorno é falso, o robô então passa para a etapa 9 e segue o fluxo.

Mas ainda temos um problema (nossa que saco!) Os diferente tipos de carros tem diferentes números de porcas. Para continuar com a boa prática de economia de tempo e energia, vamos adicionar uma melhoria no código.

1. agarre a chave inglesa ;
2. Para cada porca na roda
3. {
4.   Se houver porca ;
5.   {
6.     Mova a chave inglesa para a porca ;
7.     Enquanto (porca anexada ao carro)
8.     {
9.       Gire a chave inglesa uma vez no sentido anti-horário ;
10.    }
11.   }
12. }
13. mova a chave inglesa para a caixa de ferramentas ;
14. solte a chave inglesa.

As etapas 7 até 10 ainda são repetidas para cada roda.
Isto é um loop nested (aninhado).
As etapas de 7 até 10 são o loop interno, enquanto as etapas de 2 até 12 são o loop externo.

Eu sei, o program é simples e ainda tem diversas situações que podem surgir, como por exemplo, uma porca faltando. Afinal, não "ensinamos" o robô o que deve ser feito nesta situação.

Mas veja onde começamos e de que forma o código ficou no final.
Disposto a continuar? Então vamos.

 <a href="https://plus.google.com/u/0/109289031165722699327/about/p/pub?rel=author">Google</a>