sábado, 17 de outubro de 2015

5S (e minha organização)

Olá a todos. Tudo bem?

Fim de semana passado já não teve post, então aqui vai o post atrasado da semana passada. E o assunto será organização, pois era o que eu estava fazendo no último fim de semana. Vou utilizar esse assunto de organização para falar de algumas práticas muito úteis no ambiente de trabalho também, que são os 5S.

A desorganização parece ser uma tendência natural durante a execução de algum trabalho. Conforme o andamento da tarefa vão surgindo a necessidade de ferramentas e instrumentos de medição e nossa bancada fica abarrotada de itens. Após certo tempo nesse processo começamos a ter dificuldade de localizar ferramentas importantes e de nos movimentarmos no ambiente da bancada. Essa desorganização diminui nossa produtividade e reduz a qualidade de nosso trabalho final.

Para evitar isso as empresas do mundo todo adotaram algumas práticas desenvolvidas no Japão que são chamadas de 5S. Esse nome vem de 5 palavras em japonês que iniciam com a letra S e representam cada etapa dessa prática.

Seiri

Essa é a primeira palavra e representa a etapa comumente chamada de descarte. Essa etapa consiste na separação, em cada ambiente de trabalho, de tudo que é útil naquele lugar do que não é útil naquele lugar. Os itens que não são úteis naquele ambiente são colocados em uma área demarcada, chamada área de descarte. Perceba duas coisas importantes: o que não é útil em um lugar ainda assim podem ser útil em outro; a área de descarte não contém apenas material que será sucateado, mas sim material que está separado para uma análise posterior.

A grande sacada do descarte é evidenciar coisas em nossas mesas / bancadas que não são de uso diário. Em sua mesa há um computador, que você usa todos os dias, mas e o calendário de papel sobre sua mesa, é realmente útil? Você já não tem um calendário no computador? E o porta canetas, você usa diariamente? Com essas indagações você se dá conta da quantidade de material em seu ambiente de trabalho que não é utilizado todos os dias, mas que ocupa seu espaço o dia todo. E assim, você se pergunta: não há um lugar melhor para guardar isso?

Seiton

Essa é a segunda palavra e representa a etapa comumente chamada de organização. Nessa etapa cada um verifica e organiza seu espaço de trabalho baseado nos itens úteis (já que os inúteis foram removidos do ambiente de trabalho na etapa anterior). Nessa etapa também se avalia os itens da área de descarte, dando a eles o fim adequado. Resumidamente, os itens da área de descarte podem ser classificados de 3 formas:
* Importantes e de uso diário: Um item que não seja de uso diário em um ambiente de trabalho pode o ser em outro. Assim, deve-se realocar esse item para o outro setor / mesa / bancada.
* Importante e de uso esporádico: Alguns itens não são de uso diário em nenhum lugar da empresa, mas mesmo assim são importantes, pois esporadicamente serão necessários. Esses itens devem ser armazenados em algum lugar separado (como, por exemplo, um almoxarifado) e de forma identificada. A ideia de guardar em um lugar separado é que o item não ocupe espaço diariamente no ambiente de trabalho e a ideia da identificação é que o item seja achado quando seu uso for necessário (pois, se quando você precisar, não achar ele, não adianta nada ter).
* Não importantes: Esses itens deverão ser descartados de vez, observando o descarte ambientalmente correto.

Seiso

Essa terceira palavra representa a etapa comumente chamada de limpeza. Nessa etapa se estabelece novos padrões de limpeza para o ambiente de trabalho. Se antes estava tudo bem trabalhar com o chão sujo, por exemplo, agora esse padrão será refinado e não se aceitará mais isso. Se antes estava tudo bem em deixar a bancada desarrumada de um dia para o outro, agora pelo menos as ferramentas que não serão mais necessárias deverão ser guardadas.

Seiketsu

A quarta palavra representa a etapa comumente chamada de higiene. Essa etapa consiste no bem estar dos colaboradores e na sua imagem pessoal, além do ambiente. Itens que são abrangidos por essa etapa são:
* Verificar se a iluminação do ambiente é adequada ao trabalho;
* Promover um ambiente de trabalho confortável (na medida do possível) aos colaboradores;
* Realizar periodicamente exames de saúde;
* Promover ações para que as etapas anteriores sejam mantidas;
* Verificar se as instalações de uso comum (e.g. banheiros) estão em boas condições de uso;
* Criar padrões claros sobre higiene requerida dos colaboradores;

Shitsuke

Última palavra que representa a etapa comumente chamada de ordem mantida ou disciplina. Essa etapa, que não tem fim (ou seja, é contínua) consiste em não apenas manter as ações das etapas anteriores mas buscar a melhoria contínua. Criar o senso crítico para continuamente se questionar se é possível melhorar ainda mais o ambiente de trabalho. Essa etapa é fundamental pois após a aplicação das práticas a tendência é voltar à bagunça, pois ainda não foi criada a cultura do 5S na empresa / local de trabalho.

Dica para o 5S: É interessante bater fotos do antes e depois para mostrar aos colaboradores as melhorias alcançadas. Abaixo algumas fotos do antes e depois (embora o que eu tenha feito não seja 5S na essência). Algumas marcas foram preservadas.

Antes:



Depois:


Com certeza ainda há espaço para melhorias, que virão com o tempo.

Qualquer dúvida, comentário ou sugestão, deixem um comentário. Obrigado a todos, até a próxima!

domingo, 4 de outubro de 2015

Introdução a Comunicação SPI

Olá a todos. Estava em dúvida se postava sobre comunicação SPI ou sobre o experimento das bobinas de Helmholtz. Por fim escolhi SPI por ser um tópico mais ligado com eletrônica.

Hoje vamos abordar o que é a comunicação SPI em termos gerais, falarei um pouco da sua história, depois vou falar qual é a estrutura necessária para a comunicação SPI e por fim vou falar as vantagens e desvantagens da mesma.

O termo SPI é uma sigla inglesa que significa Interface Periférica Serial (do inglês, Serial Peripheral Interface). Como o próprio nome indica, sua finalidade é interligar periféricos a um dispositivo mestre utilizando comunicação serial. Um exemplo é o Play Station 2, que se comunica por SPI com seus controles.

O protocolo de comunicação foi desenvolvido pela Motorola e com o tempo se tornou um padrão até para outros fabricantes. Ele ganhou esse espaço pela sua simplicidade, já que são necessários apenas 3 fios + 1 para cada dispositivo interligado. Representando em uma equação, a quantidade de fios necessárias para se comunicar com N dispositivos é: 3 + N.

Mas qual a função desses fios? O protocolo SPI admite que existe apenas um dispositivo que é o mestre, e que o restante dos periféricos são escravos, ou seja, são dispositivos que só enviam dados quando solicitados pelo dispositivo mestre. Assim sendo, um dos fios é denominado MOSI. A sigla MOSI significa Saída do Mestre e Entrada do Escravo (em inglês, Master Output, Slave Input).Como o próprio nome diz, a função dessa ligação é trafegar os dados que saíram do mestre e que devem chegar aos escravos.

Outra conexão é denominada de MISO, e é oposta ao MOSI. MISO significa Entrada do Mestre e Saída do Escravo (em inglês, Master Input Slave Output). A função dessa ligação é trafegar os dados que saíram do escravo e devem entrar no mestre.

O terceiro fio que existe independente do número de escravos é o CLK (Clock). O Clock é um sinal que temporiza a comunicação e é controlado pelo dispositivo mestre. Esse sinal é responsável por fazer que mestre e escravo se comuniquem de forma sincronizada.

Abaixo uma figura que exemplifica a interligação desse barramento de comunicação:


Perceba que todos os MOSI e MISO dos escravos estão ligados no mesmo mestre. Assim, quando o mestre fala todos os escravos escutam, mesmo que o comando tenha sido direcionado a um escravo específico. Como evitar que todos os escravos respondam ao mesmo tempo gerando conflitos no barramento?

Para isso utiliza-se o pino SS, que significa Seleção de Escravo (do inglês, Slave Select). Esse é um pino que controla com qual dispositivo escravo o mestre quer se comunicar. Cada escravo tem a sua entrada SS e só irá responder aos comandos se o nível lógico dessa entrada for 0 no momento da comunicação. Os MISO dos escravos que não foram selecionados via SS ficam em alta impedância, impedindo que a tensão que o escravo selecionado coloque em sua saída não danifique a saída dos outros escravos.

Quanto ao Clock há quatro configurações possíveis, já que existem duas configurações de polaridade (CPOL) e duas configurações de fase (CPHA).

A polaridade determina em que nível lógico o Clock fica quando ocioso. A configuração CPOL = 1 informa que o Clock, quando não utilizado, fica em nível lógico 1. Em contrapartida, a configuração CPOL = 0 determina um nível lógico 0 para o Clock quando ocioso.

A fase do Clock (CPHA) determina em que momento de Clock será feita de fato a leitura do dado.  Se CPHA = 1 a leitura é feita na borda de subida do Clock. Se CPHA = 0 a leitura é feita na borda descida do Clock.

Essas configurações por vezes são descritas como Modo do SPI. Cada Modo, que vai de 0 a 3, corresponde a uma configuração possível de CPOL e CPHA. Os Modos estão descritos na figura abaixo:


Particularmente, se eu posso escolher, eu não opto pelos Modos 0 e 2. Não gosto do fato do dado ser lido logo na primeira transição do Clock, quando o mesmo está a sair do estado ocioso. Claro que se o pino SS for habilitado com antecedência, o escravo pode já estar preparado para essa primeira transição, mas, como disse, é apenas preferência.

A comunicação SPI é dita full-duplex. Isso significa que ao mesmo tempo que o mestre envia 1 bit ele já recebe 1 bit do escravo, pois a implementação de um SPI é baseada em um registrador de deslocamento. Mas se é assim, como poderia o escravo responder uma pergunta do mestre se enquanto um pergunta o outro já deve responder? Simples. Na primeira vez o mestre manda a pergunta enquanto o escravo responde 0, por exemplo. Depois o mestre manda 0 (pois já fez a pergunta) enquanto e escravo responde a pergunta feita anteriormente.

Outras características da comunicação SPI é o tamanho da palavra e o primeiro bit transmitido. O tamanho da palavra em geral é 8 bits, ou seja, toda vez que o mestre inicia uma transmissão ele envia pelo menos 8 bits. Valores comuns são 8 bits e 16 bits. Quanto ao primeiro bit transmitido, a configuração pode ser LSB ou MSB. LSB significa que o bit menos significativo do byte (ou da palavra) é transmitido primeiro, enquanto MSB significa que o bit mais significativo é enviado primeiro.

As vantagens do SPI são:
* Simplicidade: Poucos fios/traços são necessários, e a comunicação em si é simples;
* Drivers push-pull: Os dispositivos utilizam drivers push-pull em oposição a coletores abertos. Isso significa uma melhor estabilidade de sinal e torna desnecessário resistores de pull-up/down na maioria das aplicações;
* Altas velocidades em potencial: O protocolo não estabelece limite de velocidade. Assim é possível projetar SPIs de alta velocidade, embora em geral a mesma se limite a alguns MHz.

As desvantagens do SPI são:
* Pinos requeridos: Mesmo sendo simples, ainda requer mais pinos/traços que alguns outros protocolos de comunicação, tal como o I2C;
* Quantidade de mestres: O SPI suporta apenas 1 mestre, em oposição a alguns protocolos multi-mestre (e.g. I2C);
* Protocolo de checagem de erro: Nenhum protocolo de checagem de erro está definido, embora possa ser implementado por conta pelo usuário;
* Distância: Em geral essa comunicação não suporta altas distâncias, como protocolos RS-485 ou CAN-bus.

Esse é o post de hoje. Achei que não ia sair, mas apurei para postar hoje. Abraço a todos. Até mais que agora vou almoçar.

Referências:

SPI vs. I2C, Disponível em: <www.ee-techs.com/circuit/spi.doc>. Acessado em: 04/10/15.

Serial Peripheral Interface (SPI).
Disponível em: <http://web.engr.oregonstate.edu/~traylor/ece473/lectures/spi.pdf>.
Acessado em: 04/10/15.

Serial Peripheral Interface Bus.
Disponível em: <https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus>.
Acessado em: 04/10/15.

SPI Background.
Disponível em: <http://www.totalphase.com/support/articles/200349236-SPI-Background>.
Acessado em: 04/10/15.

Interfacing a PS2 Controller.
Disponível em:  <http://store.curiousinventor.com/guides/PS2/>.
Acessado em: 04/10/15.

domingo, 27 de setembro de 2015

Novas Diretrizes para o Blog

Olá pessoal, Tudo bem?

Bah (Tchê), verifiquei que não há nenhum post em 2015. Se eu tivesse pessoas que seguem ativamente este blog, elas estariam bravas comigo agora (vantagens do anonimato)!

Visando corrigir isso, gostaria de explicar o motivo e as ações que serão tomadas que o blog tenha mais atividade e conteúdo.

Quando o blog começou eu estava no ensino médio e cursando técnico em eletrônica. Então a disponibilidade de tempo era maior. Ainda naquela época eu comecei com a ideia de séries, que são uma sequência de posts sobre um assunto comum, como, por exemplo, a série sobre iluminação.

A ideia de séries foi super bem recebida e então obviamente eu a continuei. Porém, chegando no ensino superior, o tempo disponível diminuiu devido a maior carga de estudos. O que aconteceu então foi o seguinte: eu comecei a série sobre programação enquanto fazia uma disciplina de programação. Porém a disciplina terminou antes da série e eu não tive como disponibilizar esforços para terminar a mesma. Isso gerou um desânimo e um posterior abandono do blog.

Visando melhorar esse aspecto eu anuncio as seguintes alterações no blog:

* O blog ficará mais atrelado as minhas atividades no momento, tal como deve ser um blog. Os posts serão sobre os projetos que eu trabalho no momento, as disciplinas que eu curso no momento, etc. Isso torna o esforço necessário para gerar conteúdo bem menor para mim, uma vez que já estou inserido no assunto de qualquer jeito.

* Séries? Só nas férias. E ainda assim séries curtas, entre 5 e 7 episódios. O assunto da série será a matéria que eu estudarei nas férias para o próximo semestre.

* Videos? Sim! Como podem ver, a conta administradora do blog trocou para "mr.dtft". Essa é uma conta totalmente google, que agora está integrada com g-mail e youtube. Portanto prometo que postarei vídeos (não necessariamente todos sobre eletrônica). Sempre que eu o fizer postarei aqui também.

* Além disso, a conta "mr.dtft" será utilizada exclusivamente para assuntos no blog. Se quiserem me enviar e-mail com dúvidas fiquem a vontade. Peço que se as dúvidas forem simples, que sejam feitas nos comentários. O e-mail ficará mais reservado para colaboração em projetos, etc. Quer montar um circuito e gostaria de umas dicas? Manda um e-mail e trocamos algumas dicas! Se a demanda por isso for muito alta, eventualmente terei que rejeitar alguns pedidos. Mas vamos ver no que vai dar.

* Frequência de posts: Só nos finais de semana, e não em todos. Sabem né, final de semestre não dá. Simplesmente não dá!

Então era isso. Espero conseguir revitalizar esse blog que me é tão querido. Obrigado pelas mais de 250000 visualizações desde o início dele. *-*

quarta-feira, 10 de dezembro de 2014

INDUSCON 2014, Blog 2015


   Olá a todos. Quanto tempo que não posto nada. Desde setembro, se não me engano. Enfim, esse é a parte ruim de fazer engenharia em paralelo com mais um monte de outras coisas. Mas, agora, no fim do ano, resolvi fazer um post para falar sobre coisas gerais.

IEEE INDUSCON 2014 - XI International Conference on Industry Applications

   A primeira delas é que estou na INDUSCON. Como já falei aqui, eu fiz pesquisa no ano passado. Então, com o resultado do trabalho submetemos um artigo que foi aceito e agora está sendo representado na INDUSCON. O nome do congresso é um acrônimo para International Conference on Industry Applications e está na sua 11ª edição, que está sendo realizada em Juíz de Fora, MG. A INDUSCON é uma conferência ligada a IEEE (Institute of Eletrical and Electronics Engineers), a maior associação profissional do mundo em número de inscritos, com aproximadamente 500 mil profissionais cadastrados como membros. Essa oportunidade de estar aqui é muito legal, já que o máximo que tinha saído do meu estado (RS) desde sempre foi para Chapecó (SC). Só que Chapecó é praticamente divisa com RS. Então, de certa forma, é como se eu nunca tivesse saído do estado.

   Dessa vez foi diferente, peguei um ônibus à Porto Alegre, depois um avião à São Paulo onde fiz conexão para o Rio de Janeiro para viajar 3 horas de ônibus para Minas Gerais. Me hospedei no hotel e estou aproveitando a conferência. É realmente um ambiente muito diferente. Eu sou técnico em eletrônica e graduando em engenharia de controle e automação, mas posso assegurar tranquilamente que tenho a menor escolaridade da conferência. Serão 3 dias completos de palestras e apresentação de pôsteres com mestres e doutores em engenharia de todo o Brasil. Com destaque especial para o sempre fortíssimo pessoal do GEPOC (Grupo de Eletrônica de Potência e Controle) de Santa Maria. Grupo do qual já conhecia um integrante e passei a conhecer alguns outros na conferência. Realmente o trabalho que eles executam na UFSM é muito bom e eles merecem a fama que conquistaram.

   Já apresentei meu pôster, consegui minha dose de elogios, mas a maior vitória é estar em um lugar onde só se tem a aprender. Também conheci muita gente legal, e reencontrei algumas pessoas também. Agora resta aguardar a publicação do artigo!


FUTURO DO BLOG PARA 2015

   Pois bem! O ano de 2014 está quase acabando e, por consequência, 2015 está quase começando. Eu não vou prometer constância nas publicações desse blog, devido aos inúmeros compromissos que assumi. Pensei inclusive em encerrar as atividades do blog. Porém me decidi pelo contrário, devido ao fato de já haver muito conteúdo bom publicado aqui.

   Quando o blog começou em... fevereiro de 2012 eu estava iniciando o curso técnico. E adorava este blog. Nessa época eu cursava o terceiro ano do ensino médio no turno da manhã e acordava um pouco antes para publicar neste blog três vezes por semana. De lá pra cá acabei o ensino médio, comecei a graduação, comecei a trabalhar, terminei o curso técnico, comecei a fazer pesquisa e isso tudo contribuiu para que o blog ficasse negligenciado. C'est la vie.

   Não vou deletar o blog até por um motivo sentimental. Ele me acompanha durante um longo tempo e quero, daqui muito mais tempo, poder olhar pra trás e ver o quanto eu evolui. E o blog é um registro escrito do quanto evolui e um registro que me permite ajudar outras pessoas a evoluir também.

   Embora o blog esteja confirmado para 2015, a frequência de postagem provavelmente será baixa. Quero terminar a série de posts dobre programação na linguagem C e começar alguma coisa sobre microcontroladores. Também estarei disponível para sanar dúvidas pelos comentários e, se alguém tiver uma sugestão de post, posso escrevê-lo também (já que ter um feedback serve de motivação para o processo criativo).

   Tendo dito isso, encerro esse post. Abraço a todos. Bom fim de ano. Boas festas e um próspero ano novo à todos.

sábado, 13 de setembro de 2014

Algoritmo e Programação - Funções (Exemplo de Aplicação)

   Olá. Semana passada não pude postar nada, devido a indisponibilidade de tempo. Então vamos retomar esta semana, continuando do tema do último post: funções na linguagem C. Hoje eu vou mostrar como criar uma função simples em um programa. Caso você não saiba nada de funções na linguagem C ainda, por favor, dê uma olhada no último post (clique neste link).

   Primeiramente, crie um novo programa, inclua as bibliotecas que sempre utilizamos e escreva o seguinte código:

float nota_1 = 0, nota_2 = 0, nota_3 = 0, media = 0;
float calculo_media (float n1, float n2, float n3)
{
    float media_aritmetica;
    media_aritmetica = (n1+n2+n3)/3;
    return media_aritmetica;
}
main()
{
    printf("Digite nota 1: ");
    scanf("%f",&nota_1);
    printf("Digite nota 2: ");
    scanf("%f",&nota_2);
    printf("Digite nota 3: ");
    scanf("%f",&nota_3);
    media = calculo_media(nota_1, nota_2, nota_3);
    printf("A media calculada foi de: %f.\n",media);
    if(media < 6)
        printf("Aluno reprovado!\n\n");
    else
    {
        if( media < 7 )
            printf("Aluno aprovado por pouco!\n\n");
        else
        {
            if( media < 8 )
                printf("Aprovado!\n\n");
            else
            {
                if( media < 9 )
                    printf("Aprovado! Parabens!\n\n");
                else
                {
                    if( media <= 10 )
                        printf("Aprovado com louvor!\n\n");
                }
            }
        }
    }
    system("pause");
}
 
   Esse exemplo já foi dado na série de algoritmos e programação, mas até então não sabíamos nada sobre funções ainda. Agora que um pouco dos conceitos das funções foram explicados, vale a pena voltar e dar outra olhada para esse programa.
 
   Como podem lembrar (ou perceber), esse programa calcula a média aritmética de três notas digitadas pelo usuário do programa. Antes do main() perceba que existe o seguinte trecho de código:
 
float calculo_media (float n1, float n2, float n3)
{
    float media_aritmetica;
    media_aritmetica = (n1+n2+n3)/3;
    return media_aritmetica;
}
 
   Bem. Isso é uma função. A primeira palavra é "float". Essa primeira palavra representa o tipo de valor retornado pela função. Mas o que é valor retornado? Basicamente todas funções operam sobre alguns dados. Nesse caso específico, a função calcula a média aritmética baseado em três notas. Algumas funções, após operar com os dados podem fornecer algum resultado. Neste caso, a função fornecerá o resultado calculado da média. A primeira palavra "float" indica que o resultado a ser devolvido é do tipo ponto fluante, ou seja, um número decimal (com virgula). Outros tipos possíveis é int (em geral, números inteiros de 16 bits), char (números inteiros de 8 bits) e void. O void é utilizado quando a função não retornará nenhum valor. Isso significa que ela operará com os dados fornecidos mas não devolverá nenhuma resposta.

   Após a primeira palavra, que determina o tipo de retorno da função, está escrito calculo_media. Esse é o nome da função, e é arbitrário. Porém algumas regras devem ser seguidas. A linguagem C não aceita nomes que comecem com números. Também não são permitidos nomes com espaço (isso justifica o uso do underline no nome). Nomes iguais a palavras reservadas da linguagem, tais como if, else, while, também não são permitidos. É importante lembrar que a linguagem C é case sensitive. Isso significa que ela diferencia letras maiúsculas de minúsculas. Portanto, se eu criei a função "calcula_media" e, dentro do programa, tentar chamar a função "Calcula_Media", o compilador dirá que a função chamada não existe.

   Após o nome, entre parênteses, existe uma lista de argumentos. Essa lista contém o tipo e o nome de todas as variáveis utilizadas nas funções. Vamos começar entendendo o tipo dessas variáveis. Ali percebe-se novamente o uso da palavra float. Isso indica que as variáveis que vão entrar na função são do tipo ponto flutuante, ou seja, admitem valores decimais que não sejam inteiros. O que faz todo sentido nesse exemplo de cálculo de notas, já que as notas podem ser números com vírgula.

   Quanto aos nomes das variáveis, são completamente arbitrários, desde que sejam seguidas as mesmas regras explicadas para nomear funções. Uma coisa importante é que o nome das variáveis da lista de argumentos da função não precisa ser igual ao nome das variáveis passadas para função. Complicada essa explicação? Ok, permita-me exemplificar: perceba que no programa de exemplo a função possui, em sua lista de argumentos, três variáveis. Todas elas são do tipo float e estão nomeadas como n1, n2, n3. Note também que dentro do main() é solicitado ao usuário digitar três valores para notas, que são atribuídas a três variáveis distintas, nomeadas como nota_1, nota_2 e nota_3. Quando eu chamo a função dentro do programa com a seguinte linha de comando "media = calculo_media(nota_1, nota_2, nota_3);" eu passo para dentro da função as variáveis nota_1, nota_2 e nota_3. Perceba que o nome das variáveis que eu passei é diferente do nome das variáveis na lista de argumentos. E isso não constitui problema algum. O que irá acontecer é que a função vai atribuir a primeira variável de sua lista de argumentos (nesse caso, n1) o valor da primeira variável passada como argumento na chamada da função (nesse caso, nota_1). Isso se repetirá com todas as variáveis envolvidas. Ao final desse processo, a função terá uma variável n1 com o valor da variável nota_1, a variável n2 com o valor da variável nota_2 e a variável n3 com o valor da variável nota_3.

   Uma vez que a função tem todas as variáveis, ela pode começar a executar as linhas de instruções no seu corpo, ou seja, dentro de suas chaves. E, no nosso exemplo, a primeira coisa que a função faz é criar uma variável chamada media_aritmetica. Essa variável é local, como todas variáveis criadas dentro de funções. Se você não sabe o que é uma variável local, permita-me, em um novo parágrafo, lhe explicar.

   As variáveis de um programa podem ser divididas em variáveis locais e globais. Uma variável global é aquela cujo escopo é todo o programa. Isso significa que ela pode ser "vista" de todo o programa. As variáveis globais são aquelas criadas fora de qualquer função. Nosso programa contém quatro variáveis globais, que são nota_1, nota_2, nota_3 e media. Perceba que, como eu disse, essas variáveis estão fora das funções do programa (que são o main( ) e media_aritmetica( )). Portanto, por ser global, essa variável pode ser utilizada dentro do main() (como está sendo feito no exemplo) e, se eu quisesse, eu poderia utilizá-las dentro da função media_aritmetica(). Já a variável media_aritmetica foi criada dentro de uma função (a saber: calcula_media( )). Isso significa que ela é uma variável local e seu escopo abrange somente a função onde foi criada. Isso significa que ela não pode ser vista de nenhum outro lugar que não seja dentro da função calcula_media(). Se eu, por exemplo, tentar utilizar a variável media_aritmetica dentro da função main() o compilador gerará uma mensagem de erro, informando que essa variável não está definida dentro da função main().

   Retomando a explicação, uma vez criada a variável calcula_media, ela recebe a soma das notas n1, n2 e n3 dividida por três, pois essa é a forma de calcular a média aritmética de três notas. Após o cálculo, a última instrução da função é "return media_aritmética". Essa instrução diz para a função encerrar, devolvendo o valor da variável media_aritmetica para o local onde a função foi chamada. Se você olhar dentro do programa, a função foi chamada da seguinte forma "media = calculo_media(nota_1, nota_2, nota_3);". Portanto, a variável que irá receber o valor devolvido pela função é "media". Então, atingimos nosso objetivo, pois fizemos com que a variável "media" recebesse a média aritmética das três notas digitadas.

   Após isso o programa segue normalmente, conforme o que já estudamos anteriormente. Espero que tenham gostado, que eu tenha sido claro e que tenham aprendido tudo. Devido ao apuro de tempo, não pude revisar apropriadamente o texto. Então qualquer dúvida ou correção, mandem um comentário. Sugestões e críticas também são bem vindas. Obrigado a todos e até a próxima.

sábado, 30 de agosto de 2014

Algoritmo e Programação - Funções (Conceitos Fundamentais)

   Olá a todos. Hoje eu vou falar genericamente de funções na linguagem C: o que são, para que servem e seus prós e contras. A ideia desse post é que alguém com conhecimento nulo sobre funções (mas com algum conhecimento em linguagem C) possa entender todos os conceitos fundamentais de funções. Em um próximo post trabalharemos exclusivamente com a implementação de funções em um programa simples. Primeiramente vou falar para que servem as funções.

Contextualização

   Imagine que você é um professor de 3 turmas de 60 alunos cada e costuma aplicar três provas durante o semestre para cada turma. Então você terá a maçante tarefa de efetuar o cálculo da média (vamos considerar nesse exemplo a média aritmética) das três notas 180 vezes (uma para cada aluno). Você com certeza não irá escrever no seu código 180 vezes o cálculo da média, que consistiria em (N1+N2+N3)/3. Então você decide usar os laços de repetição apresentados nos últimos posts, dessa forma o programa poderá executar as 180 repetições do cálculo da média de que precisamos.

   Mas você não quer somente calcular a média naquela tela preta de console que vimos nos compiladores usados. Então você estuda um pouco mais e cria uma interface gráfica, com alguns botões e mensagens interativas. Acrescenta algumas funcionalidades extras no seu programa. No final, você acaba com um programa cujo código contém aproximadamente 1000 linhas.

   Então, por uma mudança da instituição onde você trabalha a média deixa de ser aritmética para se tornar harmônica. E, nesse caso, você precisa alterar o código de seu programa. Isso significa que você precisa encontrar e alterar uma expressão específica dentro de 1000 linhas de texto já escrito. Você pode me responder que utilizando um CTRL+F você encontraria rapidamente o trecho procurado. Mas suponha que, por qualquer motivo você precisou escrever a expressão da média aritmética em 10 lugares diferentes de seu código. Nesse caso você deve encontrar todos os locais onde a expressão foi escrita e alterar todos. Mas se você escreveu seu código meses, ou até anos atrás, você se lembrará de quantas vezes diferentes você escreveu a expressão da média?

O que são funções

   Justamente para sanar o problema apresentado anteriormente usa-se as funções da linguagem C. Basicamente uma função nada mais é do que um trecho de código que executa determinadas instruções. Em nosso exemplo inicialmente criaríamos uma função que calculasse a média aritmética. Depois, se precisássemos calcular a média em 10 lugares diferentes do código, simplesmente utilizaríamos a função criada. Quando se utiliza uma função dentro do código nós dizemos que a função foi "chamada". Uma chamada de função nada mais é do que sua utilização dentro do código do programa.

   Assim as funções são trechos de códigos escritos que serão repetidos em diversos lugares do programa que está sendo desenvolvido.

Vantagem das Funções

   Quando fosse necessário efetuar alterações do cálculo da média no programa, simplesmente alteraríamos um único lugar: a função. Uma vez que a função foi alterada (e o projeto compilado novamente), todos os lugares que a utilizavam, sejam 10, 20 ou 100 lugares diferentes do código, passarão a utilizar a nova função. A facilidade em dar manutenção, ou seja, a possibilidade de alterar rapidamente o código é uma das vantagens de utilizar funções.

   Outra vantagem é a facilidade de utilizar trabalho feito em um projeto em outro. Ou seja, imagine que você vá criar outro programa que também necessite efetuar cálculos de médias. Você poderia ir no programa inicial, encontrar os trechos onde foi escrito o cálculo da média e dar um CTRL+C e CTRL+V, copiando-os para o código que está sendo escrito. Mas, se você utilizou funções no primeiro programa, você poderia simplesmente importar a função para o segundo programa ou, no pior caso, dar um CTRL+C e CTRL+V na função, copiando-a para o segundo programa.

   Uma terceira vantagem do uso de função, embora um pouco mais técnica, é a economia de espaço de programa. Não digo apenas da economia de linhas conseguida, já que ao escrever uma função não é necessário escrever 10 vezes a mesma coisa dentro do programa. Refiro-me a economia no espaço de memória ocupado pelo programa. Mas, por que há economia de espaço em memória? Muito simples. Se você repetir 10 vezes o mesmo trecho de código dentro do programa e compilar, o compilador irá gerar instruções todas as vezes que você escreveu determinado trecho de código. Já se, por outro lado, você utilizou funções, o compilador irá gerar instruções apenas uma vez e, toda vez que o programa precisar utilizar essas instruções ele irá "saltar" para o local da memória onde as instruções foram compiladas.

   Embora essa explicação seja um pouco mais técnica e exija alguns conhecimentos sobre organização da memória, resumidamente é isso que acontece. Talvez algum dia (mas não vou prometer nada) exista alguns posts básicos sobre funcionamento de computadores: arquitetura de processadores e organização de memória.

Desvantagem das Funções

   Uma desvantagem das funções, embora relativamente imperceptível com a capacidade atual dos computadores, é a velocidade de execução das funções. Toda vez que o programa acha uma função ele precisa saltar para o trecho da memória que contém as instruções. Esse salto gasta tempo, pois envolve a mudança de valores que estão armazenados nos registradores do processador. Portanto saltar para uma função é mais demorado do que se as instruções tivessem sido repetidas 10 vezes. Porém, como dito, essa demora extra é imperceptível devido à velocidade alta dos computadores modernos.

Quando criar funções?

   Ao escrever o código devemos avaliar quais tarefas são importantes e serão repetidas em nosso programa. Isso serve para não cometermos nem excessos e nem faltas. Não devemos nos exceder e criar funções para tudo dentro do programa, incluindo tarefas que realizamos apenas uma vez no programa. Por outro lado não devemos pecar por falta e não criar nenhuma função dentro de um programa, a menos que ele seja de extrema simplicidade.

   Portanto devemos criar funções para todas as tarefas que:
* Acreditamos que serão utilizadas extensamente dentro de nosso programa;
* Acreditamos que possam ser úteis no futuro para criação de outros programas;

   Esses são os meus critérios para decidir quando criar uma função.

   E por hoje era isto. Nesse post expliquei apenas os conceitos e ideias do uso de funções. No próximo post sobre o assunto falaremos sobre a implementação real de uma função em um exemplo simples. Falaremos sobre a sintaxe da criação de uma função, sobre os parâmetros, sobre o valor de retorno e sobre tudo que for necessário para criação de uma função simples em C. Mais adiante seguiremos com ponteiros e como passar endereços de variáveis para funções. Enfim, temos ainda muito pano para manga e bastante coisa legal para vermos. Sobre este post deixem sugestões e críticas nos comentários. Não hesite em se expressar caso tenha achado algum trecho da explicação confuso. Obrigado a todos e até a próxima!

quinta-feira, 28 de agosto de 2014

200000 Visualizações. lol

O blog chegou a 200k visualizações. Fico feliz com isso! Infelizmente meu computador estragou recentemente, mas assim que eu superar esse contra tempo voltaremos com o ritmo usual de postagem, voltando com a série de programação. Temos ainda algumas coisas para ver sobre esse tema, e depois teremos um novo leque de possibilidades para explorar.

Abraço a todos que leem e, principalmente, que seguem esse blog. Muito obrigado.
Rumo a 300k visualizações!
*-*