Matrizes, funções, passagem de parâmetros e recursão em C

ComputaçãoAtualizado em 5,79 KB

Resumo

O texto apresenta matrizes como estruturas de dados homogêneas e bidimensionais, funções e procedimentos como forma de modularizar programas, e a diferença entre variáveis locais e globais. Explica também a passagem de parâmetros por valor e por referência, os parâmetros de argc e argv em main e o conceito de recursão. Inclui exemplos em linguagem C.

Pontos-chave

  • Uma matriz é uma estrutura homogênea, bidimensional, endereçada por mais de um índice, com tamanho fixo após a compilação.
  • Procedimentos agrupam comandos; funções são procedimentos que retornam um valor ao término.
  • Variáveis locais existem apenas dentro da função que as declara; variáveis globais existem durante toda a execução do programa.
  • Na passagem por valor, a função trabalha com cópias; na passagem por referência, são passados endereços e as alterações refletem na variável original.
  • Em main, argc indica quantos parâmetros foram passados e argv guarda os parâmetros como strings, sendo o primeiro o nome do programa.
  • Funções recursivas são aquelas que chamam a si mesmas; costumam ser um pouco mais lentas que as iterativas, mas produzem códigos mais claros.

Teste-se

Matriz

Uma matriz é uma estrutura de dados homogênea e bidimensional. Exemplos:

  • Prédio com mais de um apartamento por andar;
  • Conjunto habitacional com várias ruas.

Características da matriz

  • Endereçada por mais de um índice;
  • Tamanho pré-definido — após a compilação não pode ser mudado;
  • Estrutura de dados estática — mantém o mesmo tamanho ao longo de toda a execução do programa.

Exemplo conceitual

Dez elementos inteiros dispostos numa matriz com cinco linhas e duas colunas.

Exemplo em C: leitura e impressão de uma matriz

main()
{
    float m[3][4];
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 4; j++)
            scanf("%f", &m[i][j]);
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
            printf("%10.2f", m[i][j]);
        printf("\n");
    }
}

Funções e Procedimentos

Procedimentos — estruturas que agrupam um conjunto de comandos executados quando o procedimento é chamado.

Funções — procedimentos que retornam um valor ao seu término.

Vantagens de funções e procedimentos

  • Modularidade;
  • Isolamento;
  • Melhor depuração;
  • Fácil manutenção;
  • Reutilização de código.

Benefícios práticos:

  • Evitam que os blocos do programa fiquem grandes demais e difíceis de ler e entender;
  • Ajudam a organizar o programa;
  • Permitem reaproveitamento de código construído anteriormente;
  • Evitam repetição de trechos de código, minimizando erros e facilitando alterações.

Modularização e escopo

Permitem modularizar o programa, criando blocos de código independentes:

  • As variáveis criadas dentro destes blocos e os parâmetros recebidos são locais;
  • Estes blocos retornam nenhum ou, no máximo, um valor;
  • O cabeçalho e as chamadas devem concordar em número, tipo e ordem dos parâmetros;
  • É possível criar procedimentos/funções globais.

Variável local

Variável local: declarada dentro de uma função; existe apenas dentro da função que a contém; após o término da execução da função, ela deixa de existir.

Variável global

Variável global: declarada fora de qualquer função; acessível em qualquer parte do programa; existe durante toda a execução do programa.

Boas práticas de programação

  • Evitar o uso de variáveis globais;
  • As funções devem modificar apenas as suas variáveis locais e as variáveis passadas a elas como parâmetros.

Passagem de Parâmetros

Parâmetros ou argumentos são os valores recebidos e/ou retornados por uma função.

int soma(int a, int b)
{
    return (a + b);
}

Os parâmetros de uma função se comportam como variáveis locais (criados na entrada e destruídos na saída).

Por valor

  • É feita uma cópia das variáveis originais que permanecem inalteradas;
  • Os valores das variáveis externas (função chamadora) são copiados para variáveis internas da função chamada;
  • Alteração no valor das variáveis terá efeito apenas local à função chamada.

Por referência

  • São passados os endereços de memória destas variáveis e qualquer alteração feita nessas variáveis no interior da função/procedimento refletirá na variável originalmente passada;
  • Os valores das variáveis externas não são passados para a função, mas sim os seus endereços;
  • Ocorre alteração no valor das variáveis externas.

Notação em C:

  • & — indica o endereço de memória de uma variável;
  • * — indica o conteúdo do endereço indicado (desreferenciação).

Parâmetros do main

Protótipo comum:

int main(int argc, char **argv)
  • argc (um valor inteiro) guarda quantos parâmetros foram passados (count);
  • argv (vetor de strings) guarda os parâmetros passados (value);
  • Os argumentos passados são sempre strings;
  • O primeiro argumento é o nome do programa.

Parâmetros do main: exemplo

Receber dois números como parâmetros e mostrar a soma. Salve o programa com o nome SOMA_ARQ.

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

main(int argc, char **argv)
{
    float fnum1, fnum2;
    fnum1 = atof(argv[1]);
    fnum2 = atof(argv[2]);
    printf("Programa %s", argv[0]);
    printf("\nParametros passados: %d", argc);
    printf("%6.2f + %6.2f = %6.2f", fnum1, fnum2, fnum1 + fnum2);
    getch();
}

Recursão

Recurso também conhecido como recursividade; são funções recursivas quando uma função ou procedimento chama a si própria.

  • Também chamada de definição circular;
  • O computador aloca memória na pilha para novas variáveis locais e parâmetros;
  • Não é feita cópia da função na memória, mas a função é executada novamente com novos argumentos;
  • Desvantagem: funções recursivas costumam ser um pouco mais lentas que as iterativas;
  • Vantagem: permitem versões mais claras e simples de vários algoritmos.

#include

int num;

void dec(int x)
{
    if (x > 0)
    {
        printf("%d | ", x);
        dec(x - 1);
        printf("%d | ", x * 2);
    }
}

void ler()
{
    printf("\nINFORME UM VALOR: ");
    scanf("%d", &num);
}

main()
{
    ler();
    while (num != 0)
    {
        dec(num);
        ler();
    }
}

Baixar

PDF Word HTML

Perguntas frequentes

O que é uma matriz em C?

Uma matriz é uma estrutura de dados homogênea e bidimensional, endereçada por mais de um índice. Seu tamanho é definido antes da compilação e não pode ser alterado durante a execução do programa.

Qual a diferença entre passagem de parâmetros por valor e por referência?

Na passagem por valor, a função recebe uma cópia dos valores e alterações não afetam a variável original. Na passagem por referência, são passados os endereços das variáveis, e alterações feitas dentro da função refletem na variável externa.

Para que servem argc e argv na função main?

argc guarda a quantidade de parâmetros passados ao programa e argv é um vetor de strings com esses parâmetros. O primeiro elemento de argv é sempre o nome do programa.

Teste-se

Cartões de revisão

Clique em um cartão para ver a resposta.

Teste

1. Qual característica NÃO se aplica a uma matriz segundo o texto?
2. Qual é a diferença entre procedimento e função segundo o texto?
3. Onde existe uma variável local?
4. Na passagem de parâmetros por valor, o que acontece?
5. Qual operador indica o endereço de memória de uma variável em C?
6. Qual é o primeiro elemento do vetor argv?
7. Em relação à recursão, qual afirmação está de acordo com o texto?

Perguntas geradas com IA a partir do documento: verifique as respostas com o texto.