Funções e Procedimentos – Parte 4

PSEUDOCODIGO bubble sort switch case
Este post faz parte da série Introdução a algoritmos

Oi galera! Tudo bem com todos? Espero que sim! No último artigo eu apresentei as Rotinas que não têm passagem de parâmetros, mas têm algum tipo de retorno, lembram-se? Vamos lá, caso você ainda não tenha lido as partes 1, 2 e 3, então, por favor, antes de ler este artigo, leia essas partes! É importante seguir a ordem, neste caso em particular, para conseguir acompanhar o raciocínio didático que desenvolvi especialmente para vocês.

Não se perca

Antes de continuarmos …

Antes de continuarmos com as nossas Rotinas em Pascal e em C, vamos dar uma olhada na estrutura de um programa em Linguagem C, da mesma forma que fizemos em Pascal. Utilizei a IDE CodeBlocks para implementar os códigos em Linguagem C, você também pode usar esta ferramenta ou optar por outras, como o Dev C++, Visual Studio, Eclipse, Netbeans, etc. Observe a Figura 1.

Estrutura de um Programa em C
Tabela 1: Estrutura de um Programa em C

A Linguagem C em tem algumas particularidades, em relação a outras Linguagens de Programação. Usamos Pascal por ser muito mais didático. O aprendizado de algoritmos e pseudocódigo com Pascal é muito mais rápido do que utilizando C. Entretanto, grande parte dos projetos de sistemas embarcados utilizam-se da Linguagem C e, acredito que grande parte dos meus leitores estão neste meio. Assim, incluirei aqui uma breve explicação da estrutura de um programa em C, para que os exemplos demonstrados nesta série, e na série de Estruturas de Dados, possam ser melhor entendidos.

Palavras Chaves da Linguagem C

INCLUDE: utilizada para INCLUIR uma biblioteca, seja ela da linguagem, ou desenvolvida pelo usuário.

DEFINE: utilizada para DEFINIR uma constante, isto é, um espaço de memória que conterá sempre o mesmo valor de um tipo de dado determinado.

TYPEDEF: utilizada para definir um tipo de dado desenvolvido pelo usuário (tipo definido pelo usuário).

STRUCT: utilizada para definir uma estrutura, isto é, é a forma de implementação de Registros na linguagem C. É uma variável heterogênea, que permite manipular tipos de dados diferentes. Vetores e Matrizes são variáveis homogêneas, pois manipulam um único tipo de dado.

Áreas

As áreas definidas na Estrutura de um programa em C não diferem muito de um programa em Pascal. Existe o escopo global e o local, da mesma forma que em Pascal. Variáveis, Estruturas e Ponteiros podem ser utilizados por todo o arquivo, estando no escopo global, ou apenas por uma parte, estando no escopo local. O que muda de fato é a forma de trabalhar com as funções.

A função deve primeiro ser declarada na área de PROTOTIPO DE FUNÇÕES. Nessa área você não implementa de fato a função, apenas declara que ela vai existir, por isso o ponto e vírgula no final da função e não os colchetes. Após o programa principal é que você vai inserir os comandos que farão parte daquela função, o que chamamos de FUNÇÕES PROTOTIPADAS.

Note que, diferente de um programa em Pascal, em C não precisamos explicitar o nome do programa no início do arquivo. A primeira área do arquivo em C já é destinada à declaração das bibliotecas que serão utilizadas. Se for necessário utilizar constantes em seu programa, estas devem ser definidas logo em seguida a essa área.

Essa estrutura padrão deve ser respeitada, portanto, procure sempre organizar seus programas em C dessa forma. Mas lembre-se, se puder desenvolver suas próprias bibliotecas, melhor. Seria bom que o arquivo do seu programa principal pudesse apenas dar o start na sua aplicação.

Bibliotecas do Usuário

Sempre que possível, desenvolva suas próprias bibliotecas, isto é, aplique o conceito de MODULARIZAÇÃO em seu projeto de software. Em Linguagem C os arquivos de bibliotecas são salvos com a extensão “.h” e, depois, utilizados nos arquivos “.c”. Vejamos um exemplo:

//INDEF é usada para evitar múltiplas inclusões da mesma biblioteca
#ifndef BIBLIOTECA_TESTE_H_INCLUDED

//caso não tenha sido definida, então defina e inclua as seguintes linhas de código
#define BIBLIOTECA_TESTE_H_INCLUDED

int min(int a, int b)
{
    int minimo;
    if(a<b)
        minimo = a;
    else
        minimo = b;
    return minimo;
}

int max(int a, int b)
{
    int maximo;
    if(a>b)
        maximo = a;
    else
        maximo = b;
    return maximo;
}
#endif // BIBLIOTECA_TESTE_H_INCLUDED

Este é o arquivo “.h”, ou seja, a biblioteca. A listagem abaixo é o código fonte do arquivo do programa principal. 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include "biblioteca_teste.h"

int main()
{
    setlocale(LC_ALL, "PORTUGUESE");
    int n1, n2;
    printf(" Digite dois números inteiros: ");
    scanf("%d%d%*c", &n1, &n2);
    printf(" \n O menor valor é: %d",min(n1,n2));
    printf(" \n O maior valor é: %d",max(n1,n2));
    printf(" \n \n ");
    return 0;
}

Observe que no arquivo de biblioteca estão as funções prototipadas, as quais são utilizadas no arquivo do programa principal. Para que possam ser utilizadas, a biblioteca deve ser declarada da seguinte forma:

#include “nomeDaBiblioteca.h”

Note que agora usamos aspas duplas ao invés das tags “<” e “>”, pois é uma biblioteca definida pelo usuário e não uma biblioteca nativa.

Funções com passagem de parâmetros e com retorno

Em Pascal

A listagem X apresenta o código fonte em Pascal, usando functions. Este código está um pouco diferente em relação aos códigos anteriores. Inclui uma nova Função, do tipo inteira, chamada verifica, que tem o objetivo de verificar se o número N2 é igual a zero, retornando 1 se verdadeiro e 0 caso contrário. Esse valor que é retornado por esta função é tratado por quem a chama, que neste caso é a função dividir, que utiliza o n2 como operador e o mesmo não pode ser igual a zero pois não existe divisão por zero.

//DECLARAÇÃO DE BIBLIOTECAS
uses wincrt, crt;
 
//VARIÁVEIS GLOBAIS
var
   opcao, r, v : integer;
   n1, n2 : double;
 
//PROCEDIMENTO PARA REALIZAR A LEITURA DE DOIS OPERANDOS
procedure leitura();
begin
  write('Digite um numero:  ');
  readln(n1);
  write('Digite outro numero:  ');
  readln(n2);
end;
 
//FUNÇÃO PARA CALCULAR A SOMA ENTRE DOIS OPERANDOS
function somar(x:double; y:double):double;
begin
    somar := x + y;
end;
 
//FUNÇÃO PARA CALCULAR A SUBTRAÇÃO ENTRE DOIS OPERANDOS
function subtrair(x:double; y:double):double;
begin
  subtrair := x - y;
end;
 
//FUNÇÃO PARA CALCULAR A MULTIPLICAÇÃO ENTRE DOIS OPERANDOS
function multiplicar(x:double; y:double):double;
begin
     multiplicar := x * y;
end;
 
//FUNÇÃO PARA CALCULAR A DIVISÃO ENTRE DOIS OPERANDOS
function dividir(x:double; y:double):double;
begin
     dividir := x / y;
end;

function verifica(y:double):integer;
begin
      if(y = 0) then
          begin
               //NÃO EXISTE DIVISÃO POR ZERO SE V = 1
               verifica := 1;
          end
     else
          begin
               verifica := 0;
          end
end;
 

//PROCEDIMENTO PARA O MENU
procedure menu;
begin
     repeat
           writeln(' | ==================================|');
           writeln(' | MENU                              | ');
           writeln(' | ==================================|');
           writeln(' | Operacoes Matematicas             | ');
           writeln(' | 1. Soma                           | ');
           writeln(' | 2. Substracao                     | ');
           writeln(' | 3. Multiplicacao                  | ' );
           writeln(' | 4. Divisao                        | ');
           writeln(' | 5. SAIR                           | ');
           writeln(' | ================================= |');
           writeln('');
           write(' Digite a opcao desejada: ');
           readln(opcao);
           writeln('');
 
     Case opcao Of
         1 : Begin
                leitura();
                writeln('A soma e: ', somar(n1,n2):2:2);
             end;
         2 : Begin
                leitura();
                writeln('A subtração e: ', subtrair(n1,n2):2:2);
             end;
         3 : Begin
                leitura();
                writeln('A multiplicação e: ', multiplicar(n1,n2):2:2);
             end;
         4 : Begin
                leitura();
                if(verifica(n2) = 0) then
                   begin
                       writeln('A divisão é: ', dividir(n1,n2));
                   end
                else
                   begin
                      writeln('Nao existe divisao por zero');
                   end
            end;

         Else Writeln (' inválido ');
       End;
     until opcao = 0;
     writeln('');
end;

//PROGRAMA PRINCIPAL
begin
   menu();
end.

Note que as funções agora ficaram ainda mais objetivas, retornando diretamente a operação matemática básica desejada. Se desejar ainda verificar N2 em outras partes do programa, poderá fazê-lo, já que existe uma função para isso. Observe também que o Case 4 é quem chama a função verifica e faz o tratamento necessário para que a função dividir seja usada corretamente. Você não pode chamar a função dividir antes de chamar a função verifica, pois essa verificação do N2 é necessária para não causar um erro de execução no programa. Funções com parâmetros e com retorno têm a seguinte sintaxe:

function nome(parâmetro1: tipo; parâmetro2: tipo, ..., parâmetroN : tipo) : tipo;

begin

//comandos

//end

Assim, substitua nome pelo nome que você quer dar para a sua função. No lugar de parâmetro, coloque o nome da variável, e no lugar de tipo, coloque o tipo de dado que está trabalhando. Não precisamos usar a palavra chave return aqui, o próprio nome da função é utilizado para retornar o valor desejado.

Em C

O exemplo em C é uma “cópia” fiel da lógica do programa em Pascal, a diferença está na sintaxe da linguagem. As funções utilizam a palavra chave return para retornar o valor desejado e, aqui, eu fiz uma conta ao invés de criar uma variável local e retorna-la. Isso aumentaria em duas linhas de código para cada função, o que não é realmente necessário. Os exemplos anteriores foram desenvolvidos dessa forma. Claro que se você tivesse que realizar mais cálculos, ou solicitar outros dados, você não poderia fazer isto diretamente no return, teria mesmo de utilizar uma variável. Tudo bem?

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

//declaração das variáveis globais
float n1, n2;
int opcao;

//declaração dos protótipos de funções
void menu();
void leitura();
float soma(float n1, float n2);
float subtracao(float n1, float n2);
float  divisao(float n1, float n2);
float  multiplicacao(float n1, float n2);
char verificaN2(float n2);

//PROGRAMA PRINCIPAL
int main()
{
    setlocale(LC_ALL, "Portuguese");
    menu();
    return 0;
}

//FUNÇÃO PARA ESCOLHA DA OPÇÃO
void menu()
{
    do
    {
        printf(" \n 1. Soma.");
        printf(" \n 2. Subtração.");
        printf(" \n 3. Multiplicação.");
        printf(" \n 4. Divisão.");
        printf(" \n 0. Sair");

        printf(" \n Digite a opção desejada: ");
        scanf("%d%*c", &opcao);

        switch(opcao)
        {
        case 1:
            leitura();
            printf(" \n O resultado da soma é: %.2f", soma(n1, n2));
            break;
        case 2:
            leitura();
            printf(" \n O resultado da subtracao é: %.2f", subtracao(n1, n2));
            break;
        case 3:
            leitura();
            printf(" \n O resultado da multiplicação é: %.2f", multiplicacao(n1, n2));
            break;
        case 4:
            leitura();
            if(verificaN2(n2)=='t')
            {
                printf(" \n Não existe divisão por zero!");
            }
            else
            {
                printf(" \n O resultado da divisão é: %.2f", divisao(n1, n2));
            }
            printf(" \n ");
            break;
        default:
            printf(" \n Digite uma opção válida!");
            break;
        }
    }
    while(opcao!=0);
}

//FUNÇÃO PARA LEITURA DOS DADOS
void leitura()
{
    printf(" \n Digite o valor do primeiro numero: ");
    scanf("%f%*c", &n1);
    printf(" \n Digite o valor do segundo numero: ");
    scanf("%f%*c", &n2);
}

//FUNÇÃO PARA SOMAR DOIS NÚMEROS
float soma(float n1, float n2)
{
    return (n1 + n2);
}

//FUNÇÃO PARA SUBTRAIR DOIS NÚMEROS
float subtracao(float n1, float n2)
{
    return (n1 - n2);
}

//FUNÇÃO PARA MULTIPLICAR DOIS NÚMEROS
float multiplicacao(float n1, float n2)
{
    return (n1*n2);
}

//FUNÇÃO PARA DIVIDIR DOIS NÚMEROS
float divisao(float n1, float n2)
{
    return (n1/n2);
}

char verificaN2(float n2)
{
    char v;
    if(n2 == 0)
    {
        v = 't';
        //t = true = sim! n2 é igual a zero
    }
    else
    {
        v = 'f';
        //f = false = não! n2 não é igual a zero
    }
    return v;
}

Ainda não acabou …

Pessoal, hoje eu apresentei alguns detalhes sobre a estrutura do programa em C e expliquei como funcionam as funções com retorno e com parâmetros! No último artigo sobre Funções, concluirei o assunto falando sobre a importância das funções e apresentando um resumo de tudo o que discutimos. Muito Obrigada e até a próxima.

Introdução a algoritmos

Funções e Procedimentos – Parte 3 Funções e Procedimentos – Modularização
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Software » Funções e Procedimentos – Parte 4

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: