sexta-feira, 24 de junho de 2016

Brincando.Dev("MANIPULANDO ARQUIVOS");

Diego diz: Caro Usuário! Hoje falaremos a respeito de ARQUIVOS!
Usuário diz: Show, e o que são arquivos??
Diego diz: Bom, de modo superficial, um arquivo nada mais é que um ficheiro responsável por guardar alguma informação, seja ela um texto, uma coleção numérica, emails, agenda telefônica, enfim... Se pode encontrar muitas aplicações para o uso de arquivos.
Usuário diz: Hmm saquei, eu mesmo utilizo arquivos para guardar o nome das minas que eu pego heheheheh

Diego diz: ¬¬

Diego diz: Hoje mostrarei como manipular arquivos em algumas linguagens de programação, mas antes mostrarei alguns conceitos básicos para o entendimento de como um arquivo pode ser manipulado, beleza?
Usuário diz: Belezura!

Diego diz: Antes, precisamos entender o seguinte, todo computador é composto por uma memória RAM e um disco rígido, a memória RAM ou memória de acesso randômico assim como um disco rígido, guardam informações em blocos de memória que são sequências de bytes, onde cada byte armazena 256 valores possíveis. A diferença é que a memória RAM é uma memória VOLÁTIL ou seja, todo seu conteúdo é perdido quando não houver mais alimentação no sistema, ou no nosso caso quando o nosso programa for fechado todo conteúdo salvo na memória RAM será apagado.

Usuário diz: O que geralmente é salvo na memória RAM?
Diego diz: As variáveis que utilizamos, as funções que chamamos para executar algum procedimento, ou qualquer outro mecanismo que é utilizado apenas em tempo de execução no nosso programa ficará salvo na memória RAM.
Usuário diz: Puts, mas e se eu quiser manter um dado salvo? Ou ter um repositório?
Diego diz: Ai é necessário que utilize uma memória NÃO-VOLÁTIL como fonte de armazenamento de dados, por exemplo, o disco rígido. Arquivos, em sua maioria são ficheiros que ficam armazenados no nosso disco rígido, podendo esse ser acessado posteriormente, mesmo que o programa tenha sido fechado.

Usuário diz: Huum que maneiro! E como implementamos?
Diego diz: A pedido de um grande amigo meu, (Arthur Soares vulgo "Tutu"), irei implementar um programa que faça manipulações de arquivos encima da linguagem C/C++.

Usuário diz: Belezaa! Um abraço pra ele! E vamos ao o que interessa! \m/

Diego diz: Depois de criado o seu projeto C++, inclua a referência para  a lib "STDIO.H" pois é esse cara que nos oferece recursos para manipularmos arquivos.

Agora mostrarei passo a passo o processo de manipulação:

1 - Criar/Abrir um arquivo:

         Para que possamos trabalhar (ler/escrever) com arquivos é necessário que esse arquivo exista na memória e seja aberto, então é feito o seguinte:

     

         Note que para abrirmos um arquivo utilizamos a função "fopen" essa função espera dois parâmetros, que são:

primeiro: Nome do seu arquivo, você pode escolher o diretório onde deseja salva-lo passando junto ao nome o endereço. Nesse caso, criei o arquivo chamado "MeuArquivo.txt" ná Área de Trabalho.

segundo: Modo de operação. Esse parâmetro é responsável por dizer qual operação será executada nesse arquivo, repare na tabela abaixo:

MODO
OPERAÇÃO
r
Abre um arquivo texto para leitura.
w
Abre um arquivo texto para escrita. Se um arquivo com o mesmo nome existir, será sobrescrito.
a
Abre um arquivo texto para anexação. Se o arquivo não existir, será criado.
rb
Abre um arquivo binário para leitura.
wb
Abre um arquivo binário para escrita. Se um arquivo com o mesmo nome existir, será sobrescrito.
ab
Abre um arquivo binário para anexação. Se o arquivo não existir, será criado.
r+
w+
a+
Abre um arquivo texto para leitura/escrita. Se o arquivo não existir, será criado.
r+b
w+b
a+b
rb+
wb+
ab+
Abre um arquivo binário para leitura/escrita. Se o arquivo não existir, será criado.
























Como vocês conseguem ver, eu utilizei o modo "r" onde diz que a operação feita no arquivo será para leitura e é necessário que o arquivo JÁ EXISTA para que essa operação funcione. E como boas práticas de programação, é sempre bom você ter certeza que nenhum erro ocorreu na criação do seu arquivo, para isso criei uma condição para validar a criação do meu arquivo.

Outro detalhe importante é, sempre que você fizer qualquer trabalho com um arquivo, ao final dessa manipulação SEMPRE feche-o. Por exemplo, se você tem um arquivo e quer ler as informações dele, a ordem seria essa:

1 -  Abrir o arquivo
2 - Ler o arquivo
3 - Fechar o arquivo

As instruções 1 e 3 não mudam, sempre você terá que abrir e fechar seu arquivo, o que é variante é a segunda instrução, que pode ser leitura, escrita, leitura de binários e escrita de binários.

Então para fecharmo um arquivo, é utilizada a seguinte sintaxe:


Primeiro estou verificando se o arquivo esta realmente aberto com a comparação "arquivo != NULL"
se essa condição for verdadeira, a função "fclose" fecha o arquivo que eu passar por parâmetro para ela.

Usuário diz: Nossa que legal cara!
Diego diz: E num é?! Então agora vamos ao o que interessa de verdade. Criarei algumas funções básicas, como por exemplo:

* função que escreva um texto no arquivo.
* função para ler o conteúdo do arquivo
* função para editar o conteúdo.
* função para buscar algum valor dentro do arquivo
* função para apagar o arquivo

1 - Escrevendo em Arquivos

       Primeira função que implementaremos juntos será a de escrita de um texto ou valor em um arquivo. O nome da função será "escreveNoArquivo". Veja o código:
                                          
                                          Linguagem C:

Note que essa função, recebe 2 parâmetros, um arquivo do tipo FILE e o segundo parâmetro uma string que nada mais é que um conjunto de caracteres, nesse caso chamado de texto.
Feito isso eu abro o arquivo passando o nome absoluto do arquivo no sistema, e o modo de operação.
Depois de aberto o arquivo, eu utilizo a função "fputs" passando dois parâmetros, o texto e o arquivo. Essa função, é responsável por inserir uma string ou um conjunto de carácter no arquivo, como o modo de operação que escolhi foi "w" então o arquivo sera sempre sobrescrito, para que o texto seja concatenado é necessário usar o modo 'a' (anexação). E assim que eu termino de inserir o texto no arquivo eu chamo a função "fclose" responsável por fechar o arquivo.

2 - Ler conteúdo de Arquivos
Função "lerConteudoArquivo" recebe um parâmetro do tipo FILE, o principal método utilizado dentro dessa função é o "fgets".

                                           Linguagem C:

Repare que a função "fgets" pede 3 parâmetros, o primeiro um conjunto de carácter, que será utilizado como buffer para guardar o conteúdo coletado no arquivo. O segundo parâmetro é o numero de caracteres que você irá ler no arquivo, nesse caso eu pego o tamanho do nosso buffer e passo como sendo N. E o terceiro e ultimo parâmetro é o arquivo em que você deseja realizar a coleta de dados.






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!