Buscar

Funções em C e Variáveis Globais e Locais

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 1/11
PR1022804 2023 2 AULA08
Funções em C e Variáveis Globais e Locais
Programa C: Um conjunto de funções
Passando parâmetros e recebendo valores de retorno
Um pouco mais sobre parâmetros
Os argumentos argc e argv
Variáveis GLOBAIS e variáveis LOCAIS
Um parênteses sobre nome de variáveis
Iniciando variáveis na declaração
Funções da biblioteca matemática
Números Aleatórios
Função rand()
Função srand()
Exercícios
Funções em C e Variáveis Globais e Locais
OBJETIVOS
O aluno será capaz de saber:
Criar e acessar funções;
Passar parâmetros para funções;
Como retornar valores de funções;
Atribuir nome de variáveis;
Sobre a abrangência de variáveis locais e globais;
Usar a biblioteca matemática (math.h); E
Usar as funções para gerar números aleatórios (rand() e srand()).
METODOLOGIA
A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão
mostrados exemplos testados programas no microcomputador do laboratório de informática.
INTRODUÇÃO
Um programa em C basicamente é um conjunto de funções. Uma função pode ser vista como um
subprograma para o qual podemos repassar dados de entrada através de parâmetros e receber
os resultados através do retorno da função. No centro da programação estão as variáveis que
podem ser Globais ou Locais dependendo o local onde elas forem definidas e que vão receber
valores diretos ou como parâmetros.
Índice
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 2/11
Normalmente, um programa em C possui pelo menos uma função: a função main(). Esta função
é chamada no início da execução do programa. A primeira instrução da função main() é a
primeira instrução executada pelo programa (pelo menos do ponto de vista do programador). Da
mesma forma, a última instrução desta função é a última instrução a ser chamada. Um programa
vai ser composto por um conjunto de funções.
EXEMPLO 1
#include <stdio.h>
void func4()
{
 printf("Esta é a função func4()\n");
}
void func3()
{
 printf("Esta é a função func3()\n");
 func4();
}
void func2()
{
 printf("Esta é a função func2()\n");
}
void func1()
{
 printf("Esta é a função func1()\n");
 func2();
 func3();
}
void main()
{
 printf("Esta é a primeira instrução da função main()\n");
 func1();
 printf("Esta é a última instrução da função main()\n");
}
A sequência de chamada de funções pode ser ilustrada da forma:
Programa C: Um conjunto de funções
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 3/11
EXERCÍCIO
Compile e execute o programa acima. Verifique a ordem de impressão das mensagens e compare com
as chamadas das funções.
NOTA
Uma função pode ser chamada várias vezes no programa - É O REAPROVEITAMENTO DE
CÓDIGO...
Uma função normalmente resolve um determinado problema para um determinado conjunto de
dados e produz uma saída.
Estes dados podem ser passados como parâmetros e a saída pode ser retornada pela função.
EXEMPLO 2
Uma função media_nums() que retorna a média de 3 números reais passados como parâmetros
#include <stdio.h>
float media_nums(float num1, float num2, float num3)
{
 float media_local;
 media_local = (num1 + num2 + num3)/3;
 return media_local;
}
void main()
{
 float media, aux1, aux2, aux3;
 printf("\nEntre com numero 1: "); 
 scanf ("%f",&aux1);
 printf("\nEntre com numero 2: "); 
Passando parâmetros e recebendo valores de retorno
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:FuncChamadaFuncoes.png
https://wiki.sj.ifsc.edu.br/index.php/Arquivo:FuncChamadaFuncoes.png
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 4/11
 scanf ("%f",&aux2);
 printf("\nEntre com numero 3: "); 
 scanf ("%f",&aux3);
 media = media_nums(aux1, aux2, aux3);
 printf ("\nmedia dos 3 numeros é %f\n", media);
}
Deve ser observado que:
Após o nome da função, entre parênteses, são fornecidos os três parâmetros com os seus
respectivos tipos. Os valores (conteúdos das variáveis) aux1, aux2 e aux3 são copiados para as
variáveis num1, num2 e num3 da função media_nums().
A função media_nums() retorna um valor do tipo float (informado antes do nome da função) que é
o valor da variável media_local. Este valor é copiado para a variável media da função main()
As variáveis num1, num2 e num3 bem como a variável media_local possuem escopo LOCAL, ou
seja, são "vistas" somente pela função media_nums();
As variáveis media, aux1, aux2 e aux3 também possuem escopo LOCAL, ou seja são "vistas"
somente pela função main();
NOTE: que o formato de declaração de uma função é:
 tipo_retorno nome_funcao( lista_de_parametros )
 {
 declaracao_variaveis_locais
 instruções
 }
Por enquanto, assumiremos que variáveis devem ser somente declaradas no início da função. Existem
situações que poderemos relaxar esta afirmação.
O termo argumento ou parâmetro real (atual) é usado para referenciar os valores que estão sendo
passados na CHAMADA da função. Os parâmetros formais referem-se aos parâmetros listados na
função. É comum, no entanto, usar os termos argumentos e parâmetros como sinônimos e
identificados pelo contexto em que estão sendo usados.
A passagem de parâmetros POR VALOR diz respeito a copiar o valor do argumento na CHAMADA da
função para a variável associada ao parâmetro na função. Mais tarde falaremos na passagem de
parâmetro POR REFERÊNCIA. Por ora, usaremos a passagem POR VALOR.
Os parâmetros passados na CHAMADA de uma função não são necessariamente variáveis. Eles
podem ser uma expressão qualquer (uma expressão SEMPRE resulta em um VALOR).
Exemplo de chamadas para a função media_nums():
#include <stdio.h>
float media_nums(float num1, float num2, float num3)
{
 float media_local;
 media_local = (num1 + num2 + num3)/3;
 return media_local;
}
Um pouco mais sobre parâmetros
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 5/11
void main()
{
 float media, x,y,z;
 x = 5.7;
 y = 9.8;
 /* exemplo de chamada 1 */ 
 media = media_nums(4.8,x,y*3);
 /* exemplo de chamada 2 */ 
 media = media_nums (x+y,y*y+5,(x+y)/2);
}
Deve ser observado que:
na chamada 1 do exemplo, os parâmetros são uma CONSTANTE, o valor de x, e o valor de y*3.
Note que o compilador deve gerar código para resolver estas expressões antes de INVOCAR a
função!.
na chamada 2 aparecem expressões ainda mais complexas. Todas elas devem ser resolvidas
antes da função ser INVOCADA.
A função main() pode ter parâmetros formais, mas o programador não pode escolhores quais serão
eles.
A declaração que se pode ter para a função main() é:
int main (int argc, char *argv[]);
EXEMPLO 3
Escreva um programa que faça uso dos parâmentros argv e argc. O programa deverá receber
da linha de comando o dia, mês e ano correntes (dd/mm/aaaa), e imprimir a data em formato
apropriado.
Veja o exemplo, supondo que o executável se chame data:
$ data 05 06 2007
O programa deverá imprimir:
$ 05 de junho de 2007
#include <stdio.h>
#include <stdlib.h>
 
void main(int argc, char *argv[])
{
 
int mes;
 
 char *nomemes [] = 
{"janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"};
 
 if(argc == 4) /* Testa se o numero de parametros fornecidos esta' correto o primeiro parametro e' o nome do 
programa, o segundo o dia o terceiro o mes e o quarto os dois ultimos algarismos do ano */
 {
mes = atoi(argv[2]); /* argv contem strings. A string referente ao mes deve ser transformada em um numero inteiro. 
A funcao atoi esta sendo usada para isto: recebe a string e transforma no inteiro equivalente */
 
 if (mes<1 || mes>12) /* Testa se o mes e' valido */
printf("Erro!\nUsomes: mm, deve ser de 1 a 12.\n");
Os argumentos argc e argv
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 6/11
 else
printf("\n%s de %s de %s\n\n", argv[1], nomemes[mes-1],argv[3]);
 }
 else 
printf("Erro!\nUso: dd mm aaaa, devem ser inteiros, ou estão faltando.\n");
}
Variáveis GLOBAIS e variáveis LOCAIS
Se variáveis são declaradas dentro de uma função, então a visbilidade (ESCOPO) destas variáveis é
LOCAL. Nenhuma outra função tem acesso a estas variáveis.
Uma variável pode ser GLOBAL, ou seja, declarada FORA das funções. Neste caso a variável é VISTA
por todas as funções. Seja o exemplo anterior modiificado:
#include <stdio.h>
float media; /* Variável GLOBAL */
void media_nums(float num1, float num2, float num3)
{
 media = (num1 + num2 + num3)/3;
 return;
}
void main()
{
 float aux1, aux2, aux3; /* Variáveis LOCAIS */
 printf("\nEntre com numero 1: "); 
 scanf ("%f",&aux1);
 printf("\nEntre com numero 2: "); 
 scanf ("%f",&aux2);
 printf("\nEntre com numero 3: "); 
 scanf ("%f",&aux3);
 media_nums(aux1, aux2, aux3);
 printf ("\nmedia dos 3 numeros é %f\n", media);
}
Neste exemplo, a variável media é declarada como GLOBAL. Ela é MODIFICADA diretamente pela
função media_nums() e impressa pela função main()
NOTE 1
Que como a função media_nums() não retorna valor então declaramos seu tipo de retorno como
void que significa aqui NADA ou VAZIO.
NOTE 2
também que MESMO que a função retorne um valor, não é obrigatório colocá-la no lado direito
do sinal de atribuição.
Na realidade, uma função pode ser chamada dentro de qualquer expressão. Por exemplo, para o caso
em que a função media_nums() retorna um valor, ela poderia ser usada como:
#include <stdio.h>
float media_nums(float num1, float num2, float num3)
{
 float media_local;
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 7/11
 media_local = (num1 + num2 + num3)/3;
 return media_local;
}
void main()
{
 float media, aux1, aux2, aux3;
 printf("\nEntre com numero 1: "); 
 scanf ("%f",&aux1);
 printf("\nEntre com numero 2: "); 
 scanf ("%f",&aux2);
 printf("\nEntre com numero 3: "); 
 scanf ("%f",&aux3);
 media = media_nums(aux1, aux2, aux3);
 printf ("\nmedia dos 3 numeros multiplicada por 10 é %f\n", 10*media_nums(aux1, aux2, aux3));
}
Um nome de variável pode conter letras, dígitos e o underscore(sublinhado). Ela DEVE iniciar com
um underscore ou uma letra. Letras maúsculas e minúsculas podem ser usadas e são distinguidas (o
C é CASE SENSITIVE)
Variáveis LOCAIS e GLOBAIS podem ter o mesmo nome. A variável LOCAL terá preferência no uso.
EXERCÍCIO
Execute o programa abaixo e verifique as saídas.
#include <stdio.h>
int i=1; /* GLOBAL */
void func()
{
 int i=100; /* LOCAL */
 i=i+1; /* incrementa LOCAL */
 printf( "Valor de i = %d na função func()\n", i );
}
 
void main()
{
 i=i+1; /* incrementa GLOBAL */
 func();
 printf( "Valor de i = %d \n", i );
}
NOTA
Não é recomendado o uso de variáveis com o mesmo nome.
Tanto as variáveis LOCAIS como as GLOBAIS podem ser inicializadas na declaração.
EXEMPLO 4
Um parênteses sobre nome de variáveis
Iniciando variáveis na declaração
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 8/11
#include <stdio.h>
int alfa=1;
void main()
{
 float beta=1.5;
 printf("Valor de alfa = %d e valor de beta = %f\n", alfa, beta);
}
NOTA 1
Variáveis LOCAIS não são iniciadas automaticamente: cabe ao programador iniciá-la
corretamente.
NOTA 2
Variáveis GLOBAIS são iniciadas automaticamente com zero. Mas mantenha-se informado sobre
o sistema que está trabalhando. Em sistemas embarcados pode não ser verdade!
Funções da biblioteca matemática
Para usar as funções matemáticas (http://en.wikipedia.org/wiki/C_mathematical_functions) da
biblioteca padrão, fazer os seguintes passos:
Tanto valores passados como argumento, quanto o returno de valores são do tipo double.
Veja alguns exemplos de funções disponíveis ao se utilizar math.h.
double x;
Função Como chamar
Seno sin(x)
Cosseno cos(x)
Tangente tan(x)
Exponencial exp(x)
Logaritmo log(x), log10(x)
Potência pow(x,y)
Raiz sqrt(x)
Atenção
No arquivo-fonte incluir o header math.h da biblioteca matemática:
 
#include <stdio.h>
#include <math.h>
void main()
{
 
 float x,y; /* declaração de duas variáveis reais */
http://en.wikipedia.org/wiki/C_mathematical_functions
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 9/11
 printf ("Entre com o valor de x ");
 scanf("%f",&x);
 y = sqrt(x); /* usar sqrtf(x) no linux */
 printf ("Raiz de x = %lf", y);
}
NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla
precisão (double).
Para compilar e linkar o arquivo "math.h" em Linux use
gcc ex1.c -o ex1 -lm
Números Aleatórios
Gerar sequências de números aleatórios é um problema bastante comum em programação. Em
linguagem C os números aleatórios, também chamados de números randômicos, podem utilizar-se da
função rand e srand pertencentes à biblioteca stdlib.h.
A função rand() é utilizada para gerar um número aleatório em linguagem C e faz parte da biblioteca
stdlib.h. Sendo assim a função rand() compre seu papel em gerar números randômicos.
Quando esta função é chamada ela produz um valor aleatório na faixa entre 0 e a constante
RAND_MAX. O valor desta constante encontra-se definida no arquivo stdlib.h. Para gerar valores
dentro de uma determinada faixa é utilizado % (módulo) do valor.
O programa abaixo gera uma sequência com 10 números aleatórios entre 0 e 100.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
 int i;
 printf("Gerando 10 valores aleatorios:\n\n");
 for (i = 0; i < 10; i++)
 {
 /* gerando valores aleatórios entre zero e 100 */
 printf("%d ", rand() % 100);
 }
 return 0;
}
Veja também sobre o número inicial ou "semente" e a função srand() em:
http://linguagemc.com.br/valores-aleatorios-em-c-com-a-funcao-rand/
EXEMPLO
Função rand()
http://linguagemc.com.br/valores-aleatorios-em-c-com-a-funcao-rand/
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 10/11
[Expandir]
[Expandir]
[Expandir]
[Expandir]
Desafio: Gerar 100 números aleatórios de 0 a 10 (%11) e dizer que se essa função possui uma
distribuição normal.
Resposta
Para fazer com que os valores gerados não se repitam precisamos usar a função srand a fim de
inicializar a função rand com um valor “semente” para que se produza um valor aleatório na faixa
determinada. A função srand recebe um argumento do tipo inteiro sem sinal, ou seja unsigned int.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // necessário p/ as funções rand() e srand()
#include <time.h> //necessário p/ função time()
int main(void)
{
 int i;
 
 printf("Gerando 10 valores aleatorios:\n\n");
 
 srand(time(NULL));
 
 for (i=0; i < 10; i++)
 {
 // gerando valores aleatórios na faixa de 0 a 100(-1)
 printf("%d ", rand() % 100);
 }
 
 getch();
 return 0;
}
NOTA
srand(time(NULL)) objetiva inicializar o gerador de números aleatórios com o valor da função
time(NULL). Este por sua vez, é calculado como sendo o total de segundos passados desde 1 de
janeiro de 1970 até a data atual. Desta forma, a cada execução o valor da "semente" será
diferente.
Exercícios
1. Faça uma versão "politicamente incorreta" de um programa de adivinhação. Faça um loop infinito
com o do while() e use uma instrução goto para sair do loop.
Solução 1
2. Ainda sobre o exercício 1, implemente uma versão usando o comando while().Solução 2
3. Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;
Solução 3
4. Uso do while e switch.
Função srand()
28/11/2023, 08:18 PR1022804 2023 2 AULA08 - MediaWiki do Campus São José
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA08 11/11
[Expandir]Solução 4
 
Disponível em “https://wiki.sj.ifsc.edu.br/index.php?title=PR1022804_2023_2_AULA08&oldid=191359”
Esta página foi modificada pela última vez em 21 de setembro de 2023, às 15h45min.
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA07
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA07
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2#Aulas
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2#Aulas
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA09
https://wiki.sj.ifsc.edu.br/index.php/PR1022804_2023_2_AULA09
https://wiki.sj.ifsc.edu.br/index.php?title=PR1022804_2023_2_AULA08&oldid=191359

Continue navegando