ATPS PROGRAMAÇÃO ESTRUTURADA II
Artigo: ATPS PROGRAMAÇÃO ESTRUTURADA II. Pesquise 862.000+ trabalhos acadêmicosPor: • 26/5/2014 • 3.576 Palavras (15 Páginas) • 764 Visualizações
1. Funções – Passagem de Parâmetro por Valor e Referência.
Função é uma unidade de código de programa autônoma desenhada para cumprir uma tarefa particular.
A função C foi projetada com funções eficientes e fáceis de usar; programas em C geralmente consistem em várias pequenas funções ao invés de poucas de maior tamanho.
A principal razão da existência de funções é impedir que o programador tenha de escrever o mesmo código repetidas vezes.
A forma geral de uma função;
Especificador_de_tipo nome_da_função (lista de parâmetros).
{
Corpo da função
}
O Especificador_de_tipo especifica o tipo de valor que o comando return da função devolve, podendo ser qualquer tipo valido. Se nenhum tipo e especificado, o compilador assume que a função devolve um resultado inteiro. A lista de parâmetros é uma lista de nomes de variáveis separadas por virgula e seus tipos associados que recebem s valores dos argumentos quando a função é chamada. Uma função pode ter parâmetros, neste caso a lista de parâmetros e vazia. No entanto, mesmo que não existam parâmetros, os parênteses ainda são necessários.
Nas declarações de variáveis, você pode declarar muitas variáveis como sendo de tipo comum, usando uma lista de nomes de variáveis separados por vírgula. Em contraposição, todos os parâmetros de função devem incluir o tipo e o nome da variável. Ito é, a lista de declaração de parâmetros para uma função tem esta forma geral:
f (tipo nomerar1, tipo nomerar2,....tipo nomerarN)
A função C foi projetada com funções eficientes e fáceis de usar; programas em C geralmente consistem em várias pequenas funções ao invés de poucas de maior tamanho.
A principal razão da existência de funções é impedir que o programador tenha de escrever o mesmo código repetidas vezes.
1.2. Chamada por valor, chamada por referência.
Em geral, podem ser passados argumentos para sub-rotinas de duas maneiras. A primeira e chamada por valor. Esse método copia o valor de um argumento no parâmetro formal da sub-rotina. Assim, alterações feitas nos parâmetros da sub-rotina não tem nenhum efeito nas variáveis usadas para chama-la.
Chamada por referência é a segunda maneira de passar argumentos para uma sub- rotina. Neste método, o endereço de um argumento é copiado no parâmetro. Dentro da sub- rotina, o endereço é usado para acessar o real utilizado na chamada. Isso significa que alterações feitas no parâmetro afetam a variável usada para chamar a rotina.
Com poucas exceções, C usas chamada por valor para passar argumentos. Em geral, isso significa que não pode alterar as variáveis usadas para chamar a função.
1.3. Criando uma chamada por referência.
Muito embora a convenção de C de passagem de parâmetros seja por valor, você pode criar uma chamada por referência passando um ponteiro para o argumento. Como isso faz que o endereço do argumento seja passado para a função, você pode, então, alterar o valor do argumento fora da função.
Ponteiros são passados para as funções como qualquer outra variável. Obviamente, é necessário declarar os parâmetros como do tipo de ponteiro.
Exemplo com a chamada por referência:
#include <stdio.h>
/* Função com chamada por referência */
int valor(int *a, int *b)
{
*a = *a + 3; /* Modificando o primeiro argumento */
*b = *b + 2; /* Modificando o segundo argumento */
printf("Valores modificados dentro da função:\n");
printf("nr1 = %d\n",*a);
printf("nr2 = %d\n",*b);
}
int main()
{
int nr1 = 2, nr2 = 3, total;
printf("\n");
printf("Chamada por referência\n");
printf("======================\n");
printf("Valores iniciais de nr1 e nr2\n");
printf("nr1 = %d\n",nr1);
printf("nr2 = %d\n",nr2);
valor(&nr1,&nr2); /* Neste tipo de chamada é passado o endereço do
* argumento. Neste tipo de chamada os valores
* podem ser modificados */
printf("\n\nValores após a chamada da função\n");
printf("nr1 = %d\n",nr1);
printf("nr2 = %d\n",nr2);
return(0);
}
1.4. Criando uma chamada por valor.
A chamada por valor é a passagem normal do valor dos argumentos para a função. Utilizando está chamada os valores dos argumentos passados não são modificados. Na realidade é passada uma cópia dos valores para a função.
Exemplo de uma chamada por valor:
#include <stdio.h>
/* Função com chamada por valor */
int valor(int a, int b)
{
a = a + 3; /* Modificando o primeiro argumento */
b = b + 2; /* Modificando o segundo argumento */
printf("Valores modificados dentro da função:\n");
printf("nr1 = %d\n",a);
printf("nr2 = %d\n",b);
}
int main()
{
int nr1 = 2, nr2 = 3, total;
printf("\n");
printf("Chamada por valor\n");
printf("=================\n");
printf("Valores iniciais de nr1 e nr2\n");
printf("nr1 = %d\n",nr1);
printf("nr2 = %d\n",nr2);
printf("\n\nChamando a função\n");
valor(nr1,nr2); /* Neste tipo de chamada são passados os argumentos
* normalmente. Na verdade a função recebe uma cópia
* destes argumentos */
printf("\n\nValores após a chamada da função\n");
printf("nr1 = %d\n",nr1);
printf("nr2 = %d\n",nr2);
return(0);
}
2. Proposta dos Problemas.
2.1. Dois problemas para tratar funções simples.
O uso de uma função pode ser comparado à forma de alugarmos a mão-de-obra de alguém para executar um trabalho específico. Algumas vezes a interação com semelhante pessoa é bem simples; outras vezes, mais complexa.
Case 1 – Um comerciante comprou um produto e quer vendê-lo com lucro de 45% se o valor da compra for menor que 20,00; caso contrário, o lucro será de 30%. Entrar com o valor do produto e imprimir o valor da venda.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
main()
{
float valor_produto;
printf("Informe o valor do produto: ");
// gets(sigla);
scanf("%f", &valor_produto);
if (valor_produto < 20)
printf("O valor da venda eh %3.2f\n", valor_produto * 1.45);
else
printf("O valor da venda eh %3.2f\n", valor_produto * 1.30);
system("pause");
return 0;
}
Case 2- Escrever um programa que receba vários números inteiros no teclado e no final imprimir a média dos números múltiplos de 3. Para sair digitar 0(zero).
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
int num, soma=0;
float media=0, cont=0;
printf("\n DIGITE UM NUMERO INTEIRO: ");
scanf("%d",&num);
if(num %3==0 && num!=0)
{
soma=soma+num;
cont++;
}
while(num!=0)
{
printf("\n DIGITE UM NUMERO INTEIRO: ");
scanf("%d",&num);
if(num %3==0 && num!=0)
{
soma=soma+num;
cont++;
}}
media=soma/cont;
printf("\n\n A media dos numeros e: %3.2f ",media);
printf("\n\n");
system("pause");
return(0);
}
2.2 . Dois problemas para tratar funções Passagem de Parâmetros por Valor.
Passar um argumento por valor significa que o valor do argumento é calculado no tempo da chamada e copiado para o parâmetro correspondente.
Case 1- Dadas n sequência de números inteiros, de cada qual terminada por 0, calcular a média dos números pares de cada sequência.
#include <stdio.h>
void mediaPares()
{
int s = 0, elem, k = 0;
scanf ("%d", &elem);
while (elem != 0)
{
if (elem % 2 == 0)
{
s = s + elem;
k = k + 1;
}
scanf ("%d", &elem);
}
if (k == 0) printf("sequencia sem elementos pares\n");
else printf("%15.10lf\n", (double)s / k);
}
int main(void)
{
int i, n;
scanf("%d", &n);
for (i = 1; i <= n; i = i + 1) mediaPares();
return 0;
}
Case 2- Escrever uma função que verifica se um valor inteiro x encontra-se no intervalo de limite inferior min e limite superior Max. Escreva uma função que verifique se o valor inteiro x encontra-se no intervalo de limite inferior min ou limite superior Max.
#include <stdio.h>
int checaIntervalo(int x, int min, int max)
{
return x >= min && x <= max;
}
int main(void)
{
int a, limInf, limSup, numVezes, i;
scanf("%d", &limInf);
scanf("%d", &limSup);
scanf("%d", &numVezes);
for (i = 1; i <= numVezes; i = i + 1)
{
scanf("%d", &a);
if (checaIntervalo(a, limInf, limSup)) printf("sim\n");
else printf("nao\n");
}
return 0;
}
2.3. Dois problemas para tratar funções com passagem de parâmetro por referência.
Neste caso o que é enviado para a função é uma referência às variáveis utilizadas, e não uma simples cópia, pelo que as alterações realizadas dentro da função irão certamente alterar os valores contidos nessas variáveis.
Case 1- Escrever uma função que troca os valores de duas variáveis.
#include <stdio.h>
void trocaValores(int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}
int main(void)
{
int val1, val2;
scanf("%d %d", &val1, &val2);
printf("%4d%4d\n", val1, val2);
trocaValores(&val1, &val2);
printf("%4d%4d\n", val1, val2);
return 0;
19 }
Case 2-Escrever uma função que determine o valr mínimo e máximo de uma sequencia de valores fornecidos pelo usuário.
#include <stdio.h>
#define FALSE 0
#define TRUE 1
int minMaxSeq(int n, int *min, int *max)
{
int i, x;
if (n <= 0) return FALSE;
scanf("%d", min);
*max = *min;
for (i = 2; i <= n; i = i + 1)
{
scanf("%d", &x);
if (x > *max) *max = x;
else
if (x < *min) *min =x;
}
return TRUE;
}
int main(void)
{
int n, minimo, maximo;
scanf("%d", &n);
if (minMaxSeq(n, &minimo, &maximo)) printf("%4d%4d\n", minimo, maximo);
else printf("sequencia vazia\n");
return 0;
}
3. Fazer a implementação, em Linguagem C, dos seis problemas propostos, colocando no capítulo o problema implementado e a saída do programa.
3.1. Funções simples.
Case 1 – Um comerciante comprou um produto e quer vendê-lo com lucro de 45% se o valor da compra for menor que 20,00; caso contrário, o lucro será de 30%. Entrar com o valor do produto e imprimir o valor da venda.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
main()
{
float valor_produto;
printf("Informe o valor do produto: ");
// gets(sigla);
scanf("%f", &valor_produto);
if (valor_produto < 20)
printf("O valor da venda eh %3.2f\n", valor_produto * 1.45);
else
printf("O valor da venda eh %3.2f\n", valor_produto * 1.30);
system("pause");
return 0;
}
Valor menor que 20
Valor maior que 20
Case 2- Escrever um programa que receba vários números inteiros no teclado e no final imprimir a média dos números múltiplos de 3. Para sair digitar 0(zero).
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
int num, soma=0;
float media=0, cont=0;
printf("\n DIGITE UM NUMERO INTEIRO: ");
scanf("%d",&num);
if(num %3==0 && num!=0)
{
soma=soma+num;
cont++;
}
while(num!=0)
{
printf("\n DIGITE UM NUMERO INTEIRO: ");
scanf("%d",&num);
if(num %3==0 && num!=0)
{
soma=soma+num;
cont++;
}}
media=soma/cont;
printf("\n\n A media dos numeros e: %3.2f ",media);
printf("\n\n");
system("pause");
return(0);
}
3.2. Funções Passagem de Parâmetros por Valor.
Passar um argumento por valor significa que o valor do argumento é calculado no tempo da chamada e copiado para o parâmetro correspondente.
Case 1- Dadas n sequência de números inteiros, de cada qual terminada por 0, calcular a média dos números pares de cada sequência.
#include <stdio.h>
void mediaPares()
{
int s = 0, elem, k = 0;
scanf ("%d", &elem);
while (elem != 0)
{
if (elem % 2 == 0)
{
s = s + elem;
k = k + 1;
}
scanf ("%d", &elem);
}
if (k == 0) printf("sequencia sem elementos pares\n");
else printf("%15.10lf\n", (double)s / k);
}
int main(void)
{
int i, n;
scanf("%d", &n);
for (i = 1; i <= n; i = i + 1) mediaPares();
return 0;
}
Case 2- Escrever uma função que verifica se um valor inteiro x encontra-se no intervalo de limite inferior min e limite superior Max. Escreva uma função que verifique se o valor inteiro x encontra-se no intervalo de limite inferior min ou limite superior Max.
#include <stdio.h>
int checaIntervalo(int x, int min, int max)
{
return x >= min && x <= max;
}
int main(void)
{
int a, limInf, limSup, numVezes, i;
scanf("%d", &limInf);
scanf("%d", &limSup);
scanf("%d", &numVezes);
for (i = 1; i <= numVezes; i = i + 1)
{
scanf("%d", &a);
if (checaIntervalo(a, limInf, limSup)) printf("sim\n");
else printf("nao\n");
}
return 0;
}
3.3 Funções com passagem de parâmetro por referência.
Neste caso o que é enviado para a função é uma referência às variáveis utilizadas, e não uma simples cópia, pelo que as alterações realizadas dentro da função irão certamente alterar os valores contidos nessas variáveis.
Case 1- Escrever uma função que troca os valores de duas variáveis.
#include <stdio.h>
void trocaValores(int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}
int main(void)
{
int val1, val2;
scanf("%d %d", &val1, &val2);
printf("%4d%4d\n", val1, val2);
trocaValores(&val1, &val2);
printf("%4d%4d\n", val1, val2);
return 0;
Case 2- Escrever uma função que determine o valor mínimo e máximo de uma sequência de valores fornecidos pelo usuário.
#include <stdio.h>
#define FALSE 0
#define TRUE 1
int minMaxSeq(int n, int *min, int *max)
{
int i, x;
if (n <= 0) return FALSE;
scanf("%d", min);
*max = *min;
for (i = 2; i <= n; i = i + 1)
{
scanf("%d", &x);
if (x > *max) *max = x;
else
if (x < *min) *min =x;
}
return TRUE;
}
int main(void)
{
int n, minimo, maximo;
scanf("%d", &n);
if (minMaxSeq(n, &minimo, &maximo)) printf("%4d%4d\n", minimo, maximo);
else printf("sequencia vazia\n");
return 0;
}
4. Relatório com o nome de Capítulo 1 – Funções – Passagem de Parâmetro por Valor e Referência.
Abordando os temas funções e derivados. Analisamos que Função tem em si a finalidade de auxiliar na facilidade de cumprir uma determinada atividade através de códigos. E com isso entra suas funcionalidades como a função de passagem de referência, onde as alterações feitas irão certamente mudar os valores, para que isso ocorra e imprescindível o uso obrigatório de apontadores, contradizendo a função de passagem e valor, não se usa apontadores, pois o valor é copiado e calculado no tempo da chamada.
As abordagens adotado para o problema apesar de usarmos uma forma aleatória, foram resolvidas precisamente, pois a implementação no método de saída teve exido no processo para a resolução do problema.
A implementação das saída de função de passagem de referência teve como intuito mostras valores em forma de resultado de endereço, onde a saída facilita o entendimento do problema. Já a implementação da saída de função de valor, podemos sub entender que temos um valor exato, onde as variáveis não se altera, facilitando e entendimento de saída do problema.
BIBLIOGRAFIA
Livro (DEITEL, Paul; DEITEL, Harvey. C Como
Programar. 6ª ed. São Paulo: Pearson Education, 2011.)
<
https://drive.google.com/file/d/0B2k9x8w9Y2JfWHpWY1ROWjFSQlk/edit?usp=sharing>.
https://sites.google.com/a/liesenberg.biz/cjogos/home/materiais-de-apoio/topicos-relativos-a-c/refinamento-sucessivo-de-programas-e-passagem-de-parametros/posicoes-do-menor-e-do-maior-valor
http://www.ime.usp.br/~elo/IntroducaoComputacao/Funcoes%20passagem%20de%20parametros.htm
http://gracianotorrao.com/2008/05/19/funcoes-passagem-de-parametros-por-valorreferencia-em-cc/
http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c770.html
...