terça-feira, 16 de dezembro de 2014

Brincando.Dev("VETORES E MATRIZES");

Diego diz: Grande usuário! Hoje falaremos um pouco do chamados VETORES e MATRIZES, partiu?
Usuário diz: Partiu!!!

Diego diz: Primeiramente, o que são vetores e matrizes?


Diego diz:  Vetores e Matrizes são Arrays ou seja, são estrutura de dados utilizadas para armazenar coleções de elementos do mesmo tipo, onde esses elementos são acessados através de chaves ou índices, que apontam para o endereço do valor armazenado na memória. Essas estruturas, guardam o valor das coleções de forma consecutiva na memória, ou seja, o primeiro elemento do vetor ou matriz ficará armazenado no endereço 0x00000001 (um), o segundo elemento no 0x00000002 (dois), o terceiro elemento na posição 0x00000003 (três) e assim por diante.

Usuário diz: Então qual a diferença entre vetores e matrizes?
Diego diz: Boa pergunta Usuário. Bom, a principal diferença entre essas duas estrutura de dados, é que um vetor é um array unidimensional ou seja, possui apenas uma dimensão, onde os valores podem ser armazenados/referenciados da seguinte forma:
             
                Linguagem C:


Diego diz: Note que, o vetor possui tamanho igual a 5 que é definido pela macro chamada TAM_MAX (Uma macro nada mais é que um padrão de entrada que será substituído por um padrão de saída, exemplo padrão de entrada TAM_MAX logo onde aparecer no código a nomeação TAM_MAX, ela será substituída pela saída que é igual a 5), isso implica que o vetor terá 5 posições na memória para armazenar valores do tipo inteiro. Ao compilarmos esse código, teremos a seguinte saída:

                               

Os 5 primeiros valores que são mostrados, são as entradas lidas no primeiro laço de repetição pela função scanf, onde o valor do incremento i define qual a posição no vetor será inserido o valor lido, o vetor começa na posição 0 e vai até a posição 4, assim é possível perceber que esse vetor contem 5 posições (0,1,2,3 e 4).

A saída, mostra o valor contido em cada posição desse vetor, e o endereço na memória de cada valor.

Usuário diz: Muito massa cara! Mas e quanto a Matrizes??
Diego diz: Matrizes assim como vetores, são arrays, no entanto matrizes possuem 2 dimensões, sendo chamadas de arrays bidimensionais ou multidimensionais. Matrizes bidimensionais possuem índices referidos por linha-coluna, onde o primeiro índice indica a linha e segundo indica a coluna. Ex:

Uma Matriz[4:4] bidimensional matematicamente falando é representada da seguinte forma:

  Matriz =  a11  a12  a13  a14
                a21  a22  a23  a24
                a31  a32  a33  a34
                a41  a42  a43  a44

E para programação, a matriz segue a mesma ordem de formação. Repare no exemplo abaixo:

                                              C



No código escrito em C, pode-se observar que existe uma variável com o nome matriz[][], que tamanho definido pela macro TAM_MAX, como o numero de colunas e o numero de linhas serem o mesmo, então trata-se de uma matriz quadrada, para esse exemplo foi utilizado a função rand() para o preenchimento de valores na matriz. A variável de incremento i representa as linhas e a variável j representa as colunas.

Usuário diz: Ah que bacana, e como eu faço para ver os valores dessa matriz, do jeito que você mostrou com o vetor?

Diego diz: Aii que ta, esse será um desafio que proponho a você Usuário! Crie um código em que nele exista uma matriz quadrada de qualquer ordem, e que seus valores sejam preenchidos randomicamente e que após preenchida toda a matriz, você possa exibir na tela todo o conteúdo nela existente. Demoro??

Usuário diz: Moleeza! Vamo que vamo! Qualquer duvida, te chamo aqui no blog!
Diego diz: Excelente! Boa sorte!




segunda-feira, 15 de dezembro de 2014

Brincando.Dev("PONTEIROS");


Usuário diz: E ae Diego, me tira uma duvida, o que são PONTEIROS?
Diego diz: Bom Usuário, a primeira abordagem é que ponteiros são variáveis que apontam para um endereço de memória o qual esta armazenado um valor.

Usuário diz: Puts cara, não entendi não. Melhora isso...
Diego diz: Usuário, imagine o seguinte. Vamos supor que você é secretário de uma empresa, e você conhece todos os setores desta empresa, assim como conhece todas as pessoas que lá trabalham, então quando alguém de fora, chega até a recepção e pergunta a respeito de alguém que trabalha lá, você informa essa pessoa qual o setor e onde ele se encontra, ou seja você aponta onde essa pessoa se encontra na empresa. Essa é uma analogia muito sutil, no entanto é exatamente essa a ideia de ponteiros, eles são utilizados para apontar o endereço de uma variável na memória.

Usuário diz: Ah entendii! Então um ponteiro sempre me mostrará um endereço de memória, que é o endereço que armazena um valor qualquer na memória?
Diego diz: Exato, o ponteiro é apenas uma variável que mostrará o endereço de memória o qual armazena um valor.

      Um detalhe importante de ponteiros, é que são mais comumente utilizados nas linguagens de mais baixo nível (mais perto do binário)  como por exemplo C, C++, Pascal e etc... E podem ser utilizados para construção de estrutura de dados como, lista, pilha, filha, listas encadeadas, grafos, árvores, etc...
      Os vetores por exemplo, nada mais são que ponteiros com espaços consecutivos da memória, onde armazenam valores.
      O uso mais comum de ponteiros, são na passagem de parâmetros por REFERÊNCIA onde na função chamada é necessário que se tenha um ponteiro apontando para o endereço físico da variável na memória para que ela possa ser alterada diretamente. Outra aplicação onde o uso de ponteiros é indispensável, é para alocação dinâmica de memória.

      Em linguagens mais alto nível (mais próximo da linguagem humana) o uso de ponteiros é restringido ou não suportados, pois se usado de forma indevida, podem gerar problemas no sistema. Não é recomendado que uma variável seja manipulada diretamente através do seu endereço de memória, no entanto, há algumas aplicações que esse recurso se faz essencial.

Usuário diz: Ah entendi, e você teria como me mostrar um exemplo de PONTEIROS em alguma linguagem de programação?

Diego diz: Siim, repare no exemplo utilizado na postagem http://brincandodedesenvolvedor.blogspot.com.br/2014/12/brincandodevpassagem-de-parametros.html.

                                     
                                         C++
                                     

No exemplo acima, temos a função, passagemPorReferencia(), repare que essa função espera dois parâmetros "*a,*b" onde a e b são ponteiros, ou seja, eles esperam o valor passado na chamada da função passagemPorReferencia, e assim que os parâmetros são passados, a e b apontam para o endereço de memória das variaveis num1 e num2, onde tais variáveis terão seus valores alterados na função passagemPorReferencia.  O operador '&' nada mais é que um operador unário (de referência) que retorna o endereço da variável a que se refere.

Usuário diz: Entendii e como seria a representação desse ponteiro na memória?
Diego diz: Usuário, seria mais ou menos assim:

Imagine que num1 seja igual a 1 e num2 seja igual a 10, e que na memória a variavel num1 ocupa o primeiro bloco, e a variavel num2 ocupa o segundo bloco. Então ficaria assim:

             Endereço                        Valor
0x00000001
1
0x00000002
10
0x00000003
vazio
0x00000004
vazio

Quando a função passagemPorReferência() é chamada, e passamos como parâmetros por referência a variável num1 e num2, o que acontece é que a os ponteiros *a e *b apontam para o endereço de memória das duas variáveis num1 e num2, logo o ponteiro *a aponta para o endereço 0x00000001 que corresponde na memória ao endereço onde o valor da variável num1 esta armazenada, então qualquer alteração feita nesse endereço, causará alteração direta no valor da variavel num1, o mesmo ocorre com a variavel num2.

Usuário diz: Massa, entendi!
Diego diz: Bom, é isso ai Usuário! Até a próxima!

Brincando.Dev("PASSAGEM DE PARÂMETROS");

Diego diz: E aee usuário! tudo tranquilo??
Usuário diz:  Tudo certo cara e com você?
Diego diz: Tudo ótimo, meu caro hoje vou te explicar um conceito muito importante, que é a passagem de parâmetros por valor e referência.
Usuário diz:  Esses parâmetros são os que utilizo em funções? É isso mesmo?
Diego diz: Exatamente. Mas primeiro, te pergunto, o que são parâmetros?
Usuário diz:  Ah parâmetros são variáveis utilizadas na declaração de um método ou função, que servem como argumentos para realizarmos instruções específicas nas funções ou métodos.
Diego diz: Exato, logo a passagem de parâmetro nada mais é que o mecanismo utilizado para passar parâmetros a uma função na sua chamada. Por exemplo:

No código abaixo, escrito na linguagem C++, temos a função soma que recebe dois parâmetros 'a' e 'b' do tipo inteiro, e retorna um resultado inteiro, que nada mais é que o resultado da operação.

Perceba, que a função soma(a,b) é chamada dentro da função main(), passando como parâmetros os VALORES '10' e '20'.

Usuário diz:  Certo, até ai tudo bem. E existe alguma diferença entre tipos de passagem de parâmetros?

Diego diz: Existe sim, um parâmetro pode ser passado para uma função, como VALOR ou como REFERÊNCIA.

         A passagem de parâmetros por VALOR como o nome já diz, é esperado que um ou muitos valores sejam passados para a função a qual se deseja chamar, como exemplo de passagem de parâmetros por VALOR é o exemplo acima, da chamada da função soma onde os VALORES '10' e '20' são passados como parâmetros para a função e a variável valor espera um retorno do tipo inteiro.

        A passagem de parâmetros por REFERÊNCIA respeita a mesma característica da passagem por valor, no entanto, a referência é diferente do valor, pois a referência nada mais é que o endereço da variável na memória, onde qualquer alteração na variável muda o valor dela diretamente na memória, isso não é algo recomendável a se fazer, no entanto, pode haver aplicações que esse recurso se faça necessário!

Um exemplo de passagem de parâmetro por referência é:

                                             C++



Logo se é possível perceber, que funções onde os parâmetros devam ser passados por referência, são funções que "retornam" mais de um valor! Quando na declaração da função os parâmetros veem acompanhados com o carácter '*' isso implica que o valor da variável será modificado diretamente na memória, ou seja a variável será modificada dentro da função chamada. E quando chamamos uma função e para esta função passamos parâmetros com o carácter '&' de precedente, isso quer dizer que o parâmetro a ser passado, pode ser modificado na função chamada.

Usuário diz:  Nooh que massa, saquei cara! Valeu mesmo!
Diego diz: \m/

sábado, 13 de dezembro de 2014

Brincando.Dev("FUNÇÕES E PROCEDIMENTOS");

Diego diz: Falaa meu bom! tudo bem?? E aee, preparado pra mais um conceito TOP de programação?
Usuário diz: Eae broo, tudo ótimo! Pow, to sempre preparado cara! O que temos pra hoje?
Diego diz: Hoje falaremos um pouco a respeito das FUNÇÕES e PROCEDIMENTOS!

Usuário diz: Hummm bacana! E do que se trata?
Diego diz: Boom primeiro, você imagina o que pode ser funções ou procedimentos?
Usuário diz: Cara, na verdade não. O que são??
Diego diz: Bom, funções ou procedimentos, são sub-rotinas utilizadas para realizar uma tarefa especifica no seu programa. Por exemplo, se você quiser fazer uma calculadora, você irá precisar de funções do tipo SOMAR, SUBTRAIR, DIVIDIR e MULTIPLICAR, tais funções podem ser chamadas em qualquer parte do seu código desde que estejam na mesma namespace.

Usuário diz: Huum, entendi então eu posso utilizar funções ou procedimentos para que eu possa  realizar instruções dentro das funções sem que eu necessite replicar meu código varias e varias vezes, é isso? É uma forma de eu centralizar meu algorítimo ao invés de ficar replicando meu código!

Diego diz: Exatamente Usuário! Funções são utilizadas exatamente dessa maneira, sendo possível você criar um bloco de instruções e chama-lo em diversas parte do seu código sem repetir as instruções N vezes. Você apenas se preocupa em chamar a função ou procedimento pelo seu nome.

Usuário diz: Entendi, e qual a diferença de funções e procedimentos??

Diego diz: A maior diferença entre funções e procedimentos, é que funções obrigatoriamente terão um tipo de retorno, já procedimentos não retornam valor algum.

Usuário diz: Puts cara, não entendi, como assim?

Diego diz: Por exemplo se fossemos escrever as funções básicas de uma calculadora seria dessa forma:
                                                         Exemplo de Função em Python:

                                                      

Repare que para cada operação eu recebo 2 parâmetros, A e B e cada operação me retorna o resultado da operação matemática entre as duas variáveis.

                                    Exemplo de Procedimento em Delphi:


Já nesse exemplo, temos a implementação de uma Procedure (Procedimento) em Delphi, onde NÃO há retorno algum, ele mostra o resultado da operação dentro da Procedure através de um outro procedimento chamado ShowMessageFmt() que recebe 3 parâmetros, a variavel a, b e total.

Usuário diz: Cara, que bacana, agora meus códigos ficarão mais otimizados! Muito obrigado Diego!
Diego diz: Faloo Usuário! Até a próxima!

Brincando.Dev("BLIBLIOTECAS");

Usuário diz: E aee cara! Diego, hoje eu queria que você me explicasse o que são as Bibliotecas, tem como??
Diego diz: Claro que sim brother! Vamos la, primeiro eu gostaria de saber, qual o conceito que você tem de bibliotecas? O que é uma biblioteca para você meu querido?
Usuário diz: Ahh cara, uma biblioteca para mim, é um local onde são armazenados livros e materiais de fomento ao conhecimento, é onde eu posso recorrer para buscar uma informação o qual eu sei a pergunta mas não sei a resposta. Mais ou menos isso hahaha beleza?
Diego diz: Ótima definição Usuário! Uma biblioteca é exatamente isso, só que no mundo da programação, onde tudo é abstrato, devemos pensar de modo abstrato, beleza? Então uma biblioteca, de modo geral é que um repositório, onde nele contem funções, classes e implementações prontas para que você possa usar no seu código. Saco??
Usuário diz: Ahh entendi! Então, quando eu utilizo a biblioteca "cmath" ou "math.h" em C/C++ eu apenas estou importando para o meu código as funções,estruturas e atributos descritos dentro da biblioteca "cmath", correto??
Diego diz: Exatamente meu boom! Por isso que você não precisa criar a implementação por exemplo da função "eleva" onde você teria que passar para essa função dois parâmetros, o valor e o expoente. O nome dessa função na biblioteca "cmath" é "pow".
Usuário diz: Noooh, que massa cara, agora entendi, corretamente, e assim como no C as bibliotecas são importadas sempre da mesma forma?
Diego diz: Conceitualmente sim. O que muda de fato é a sintaxe, as linguagens de programação são escritas de modo distinto, umas mais robustas outras mais simples, enfim. O que de fato importa é que bibliotecas são utilizadas a fim de garantir que você "não reinvente a roda" hahhaah xD

Mostrarei alguns exemplos em linguagens distintas de programação de importação de bibliotecas no algorítimo.
                      C/C++


        Python


                Java



Diego diz: Bom então é isso! Até a próxima grandessíssimo usuário!

quinta-feira, 11 de dezembro de 2014

Brincando.Dev("ENUMERADORES")

Diego diz: Graande usuário! Hoje nosso bate papo vai ser a respeito dos ENUMERADORES e MACROS.
Usuário diz: E o que seria estas ENUMERADORES?
Diego diz: Bom usuário, um ENUMERADOR nada mais é que um tipo distinto de dado utilizado para enumerar uma sequencia de valores do tipo LITERAL relacionadas a uma enumeração do tipo INTEIRO.
Usuário diz: What Fuck is it!?? Não entendi nada!! oO
Diego diz: Relaxa usuário, é simples! Me responde, para você o que quer dizer a palavra enumeração?

Usuário diz: Uai, eu acho que são valores de algum tipo separados por virgula formando um conjunto de valores enumerados. É isso?

Diego diz: Exataamente! São em suma, palavras separadas por virgulas que formam um conjunto de palavras enumeradas, logo cada palavra ta vinculada a um enumerador do tipo inteiro, da seguinte forma:

ENUMERADOR PAIS {
    BRASIL = 0,
    ARGENTINA = 1,
    BOLÍVIA = 2,
    CHILE = 3
 }

Usuário diz: Ahh entendii! Mas onde eu usaria isso no meu código maluco??!

Diego diz: Simples, suponhamos que você precise garantir que o Zezinho fornecerá uma entrada de dados que seja um valor específico de dado. Por exemplo, você pergunta a ele, "Ei Zezinho, em que planeta você vive? ", as respostas podem ser infinitas, a não ser que você ENUMERE as respostas para que Zezinho possa escolher apenas uma descrita no seu conjunto enumerado. Mais ou menos assim:

"Zezinho em que mundo você vive?"

(Possíveis respostas que Zezinho pode dar)

ENUMERADOR PLANETAS {
    MARTE,
    TERRA,
    SATURNO
}

Usuário diz: AAH quee dahoraa! Assim o Zezinho só poderá responder Marte, Terra ou Saturno, certo?!
Diego diz:  Corretíssimo! Agora mostrarei isso em um código em C#. Lembrando que a linguagem de programação não é o importante, o importante é o entendimento do que de fato representa um Enum.

Usuário diz: Uhuul, bacana! Não vejo a hora de nos encontrarmos denovo! xD Abraço forte!
Diego diz:  Um grande abraço usuário!

Brincando.Dev("ESTRUTURAS CONDICIONAIS")

Diego diz: Falaa usuário!! E ae? Tudo na paaz meu caro!?? Hoje mostrarei a você um conceito muito importante no mundo da programação, hoje falaremos um pouco de ESTRUTURAS DE CONDIÇÃO!

Usuário diz: Belezura, e o que seria essa tal de ESTRUTURA DE CONDIÇÃO?

Diego diz: São estruturas criadas com o objetivo de mudar o fluxo de dados na aplicação. Através de condições de entradas você consegue controlar o fluxo de dados no seu código, por exemplo: vamos supor que você esteja em um banco, e precisa garantir que as pessoas que estão na fila preferencial tenham de fato um dos requisitos para estarem la, os requisitos são:

* Ter alguma deficiência.
* Mulheres grávidas.
* Pessoas com 65 anos ou mais.

        Sabendo que essas são as condições para as pessoas estarem na fila de atendimento preferencial, precisaríamos de uma estrutura de condição para garantir que cada pessoa que entrasse no banco para ser atendido no caixa, pudesse ser atendido no caixa preferencial caso algum desses requisitos fossem atendidos.

Escreveríamos da seguinte forma:

(Pseudocódigo¹)
SE ( (pessoa.deficiente = VERDADEIRO) OU
        (pessoa.gravida = VERDADEIRO) OU
        (pessoa.idade >= 65 anos))
ENTÃO FAÇA
{         
            VAI PARA atendimento_preferencial;
 }
SENÃO FAÇA
{
            VAI PARA atendimento_convencional;
}

Usuário diz: Puts que massa Diegãao! Me deixe arriscar criar essa mesma estrutura de repetição em um código escrito na linguagem C. Me corrija se eu estiver errado, mas ficaria assim:



Diego diz: Exatamente usuário!  Outra forma de controlar o fluxo de dados da sua aplicação é através do bloco INTERRUPTOR, esse bloco é responsável por chavear o do fluxo de dados de modo em que escolha um CASO que atende a DECISAO de ENTRADA do INTERRUPTOR, suponhamos que a idade da pessoa seja maior que 65 anos, então ficaria assim:

pesssoa = IDADE_MAIOR_QUE_65
INTERRUPTOR (pessoa)
{
   caso 'DEFICIENTE' FAÇA:
          VAI PARA atendimento_preferencial;

   caso 'GRAVIDA' FAÇA:
          VAI PARA atendimento_preferencial;

   caso 'IDADE_MAIOR_QUE_65' FAÇA:
          VAI PARA atendimento_preferencial;
 
   caso 'PESSOA_COMUM' FAÇA:
          VAI PARA atendimento_convencional;
}

E no código em C ficaria assim:

                                        

Usuário diz: Minhaa nossa, que féraa cara! E ae, alguma ideia de exercício para que eu possa praticar?

Diego diz: Com certeza usuário!! Vamos para um clássico, crie um programa em qualquer linguagem de programação que leia 3 notas a primeira com peso igual a 30%, a segunda tambem 30%  e a terceira com peso 40% onde o valor cada nota varia de 0 a 100, após lido os valores e calculado o valor da nota com seus respectivos pesos, me dê uma nota final! A nota final então seria:

notaFinal = nota_1 * 30% +  nota_2 * 30% + nota_3 * 40%

Usuário diz: Demorô!! Vo manda bala, e depois vou mostrar o meu código nos comentários para que você possa análisar e ver se esta tudo Ok! Beleza?
Diego diz:  Belezura! E caso tenha alguma duvida ja sabe? É só deixar nos comentários que respondo rapidinho! \m

--------------------------------------------------------------------------------------------------------------------------
1 - Pseudocódigo =  É uma forma genérica de escrever um algoritimo, utilizando uma linguagem simples e textual ( VALEUU WIKIPEDIAA!!! \o/)