• Nenhum resultado encontrado

#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {

N/A
N/A
Protected

Academic year: 2021

Share "#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {"

Copied!
29
0
0

Texto

(1)

Exercício:

Construa um programa em ‘C’ que possua uma função responsável por fazer a troca de valores entre duas variáveis. O programa deve receber

Funções

dois valores inteiros, através da entrada padrão, armazená-los em variáveis, e com a utilização da função mencionada trocar o conteúdo das variáveis e depois retorná-las na saída padrão.

(2)

#include <stdio.h>

void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () { { int num1,num2;

printf("\nEntre com o primeiro valor: "); scanf ("%d",&num1);

printf("\nEntre com o segundo valor: "); scanf ("%d",&num2);

Swap (&num1,&num2);

(3)

Exercício:

Escreva o código fonte de um programa, na linguagem C, que manipule um vetor de inteiros com dez elementos. O programa deve possuir uma função responsável pela inicialização do vetor e

Funções

função responsável pela inicialização do vetor e outra função que efetue a impressão do vetor na saída padrão. Por meio das funções mencionadas, o programa deve inicializar o vetor e em seguida retorná-lo no monitor. Obs. o programa não pode possuir variáveis globais.

(4)

#include <stdio.h> #define tamanho 10 void inicializar(int *v) { int i; for(i=0;i<tamanho;i++) {

printf ("\nEntre com v[%i]: ",i+1); scanf("%i",v+i);

} } }

(5)

void imprimir(int *v) {

int i;

for(i=0;i<tamanho;i++) if (!i)

printf ("\nvetor[ %i, ",v[0]); else

if (i==tamanho-1) printf ("%i ]",v[i]); else

else

printf ("%i, ",v[i]); } main () { int vetor[tamanho]; inicializar(vetor); imprimir(&vetor[0]);

(6)

- Protótipos de funções

Protótipos são declarações de funções. Isto é, você declara uma função que irá usar. O compilador toma então conhecimento do formato daquela função antes de compilá-la. Possibilitando assim, antes da compilação da função, a

Funções

assim, antes da compilação da função, a validação da utilização da mesma.

Um protótipo tem o seguinte formato:

TipoDeRetorno NomeDaFunção (DeclaraçãoDeParâmetros);

onde o TipoDeRetorno, o NomeDaFunção e a

(7)

#include <stdio.h>

float Square (float a); int main ()

{

float num;

printf ("Entre com um numero: "); scanf ("%f",&num);

num=Square(num); num=Square(num);

printf ("\n\nO seu quadrado vale: %f\n",num); return 0;

}

float Square (float a) {

(8)

- Arquivos headers

Arquivos headers, ou arquivos cabeçalhos,

são aqueles que temos mandado o

compilador incluir no início de nossos

Funções

compilador incluir no início de nossos

exemplos e que sempre terminam em .h. Estes arquivos não contêm os códigos das funções. Eles só contêm protótipos de funções.

(9)

O corpo das funções cujos protótipos estão no arquivo-cabeçalho, no caso das funções

do próprio C, já estão compilados e

normalmente são incluídos no programa no instante da "linkagem". Este é o instante em

Funções

instante da "linkagem". Este é o instante em que todas as referências a funções cujos códigos não estão nos arquivos fontes são

resolvidas, buscando este código nos

(10)

- Arquivos headers (continuação)

Se você criar algumas funções que queira aproveitar em vários programas futuros, você pode escrever arquivos-cabeçalhos e incluí-los também.

Funções

incluí-los também.

Vamos supor que a função 'int EPar(int a)', vista anteriormente, seja importante em vários programas, e desejemos declará-la num módulo separado.

(11)

- Arquivos headers (continuação)

No arquivo de cabeçalho chamado por exemplo de “funcao.h” teremos a seguinte declaração:

Funções

declaração:

(12)

- Arquivos headers (continuação)

O código da função será escrito num

arquivo a parte. Vamos chamá-lo de

“funcao.c”. Neste arquivo teremos a

definição da função:

Funções

definição da função: int EPar (int a)

{

(13)

- Arquivos headers (continuação)

Por fim, no arquivo do programa principal teremos a função main(). Vamos chamar este arquivo aqui de “principal.c”.

Funções #include <stdio.h> #include "funcao.h" main () { int num; if (EPar(num))

printf ("\nO numero e par.\n"); else

printf ("\nO numero e impar.\n"); }

(14)

- Arquivos headers (continuação)

Este programa poderia ser compilado usando a seguinte linha de comando para o gcc:

Funções

gcc principal.c funcao.c -o saida

onde “saida” seria o nome do arquivo executável gerado.

(15)

Exercício:

Escreva um programa que faça uso da função EDivisivel(int a, int b), criada anteriormente. Além desta função o programa deverá usar: Max(int a, int b), que retorna o maior dos parâmetros; VMedio(int a, int b), que retorna o valor médio

Funções

VMedio(int a, int b), que retorna o valor médio (inteiro) entre a e b, você deverá escrever estas funções. Organize o seu programa em três arquivos: o arquivo exercicio.c, conterá o programa principal que deve se utilizar das funções descritas; o arquivo func.c conterá o corpo das

(16)

- Os Argumentos argc e argv

A função main() pode ter parâmetros formais. Mas, o programador não pode escolher quais serão eles.

Funções

escolher quais serão eles.

A declaração mais completa que se pode ter para a função main() é:

(17)

Os parâmetros argc e argv dão ao programador acesso à linha de comando com a qual o programa foi chamado.

O argc (argument count) é um inteiro e possui o número de argumentos com os quais a função main() foi chamada na linha

Funções

quais a função main() foi chamada na linha de comando.

O argv (argument values) é um vetor de strings. Cada string deste vetor é um dos parâmetros da linha de comando. É para

(18)

- Os Argumentos argc e argv (continuação)

Exemplo: O programa a seguir faz uso dos parâmentros argv e argc. O programa recebe da linha de comando o dia, mês e ano correntes, e imprimi a data em formato apropriado. Veja o exemplo, supondo que o

Funções

apropriado. Veja o exemplo, supondo que o executável se chame “data”:

data 19 04 06 O programa imprimirá:

(19)

#include <stdio.h>

int 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) {

mes = atoi(argv[2]); /*poderia ter usado sscanf()*/ if (mes<1 || mes>12) if (mes<1 || mes>12) printf("Erro!\nMes invalido!"); else printf("\n%s de %s de 20%s", argv[1], nomemes[mes-1], argv[3]); } else

(20)

Exercício:

Construa um programa que receba da linha de comando, com a qual o programa é executado, um número natural, e retorne

Funções

executado, um número natural, e retorne seu fatorial na saída padrão.

(21)

Na linguagem C, assim como em muitas outras linguagens de programação, uma função pode chamar a si mesma. Uma função que chama a si mesma é chamada função recursiva.

Recursividade

recursiva.

Muitos problemas são definidos com base nos mesmos, ou seja, podem ser descritos por instâncias do próprio problema. Para estas classes de problemas, o conceito de

(22)

Todo cuidado é pouco ao se fazer funções recursivas. A primeira coisa a se providenciar é um critério de parada, o qual vai determinar quando a função deverá parar de chamar a si mesma. Este cuidado impede que a função se chame infinitas vezes.

Recursividade

chame infinitas vezes.

Um exemplo de um problema cuja definição pode ser recursiva é o cálculo do fatorial de um número natural.

(23)

No caso

A!

pode ser definido como

Recursividade

A * (A - 1)!

no caso, é preciso especificar um critério de parada, qual seria?

(24)

Contudo, de acordo com o que vimos até o momento, podemos definir um laço de repetição que implementaria o cálculo do fatorial de um número natural. Definiremos agora este laço:

... int i,num,fat; Recursividade int i,num,fat; ... for (i=2,fat=1;i<=num;i++) fat*=i; ...

(25)

Ainda podemos definir uma função recursiva que implemente o computo do fatorial de um número natural: int fat(int n) { Recursividade { if (n) return n*fat(n-1); else return 1;

(26)

/*Exemplo de um programa que se utiliza da função recursiva fat() */ #include <stdio.h> int fat(int n); int main() { int n;

printf("\nDigite o numero que voce deseja saber o fatorial: "); scanf("%d", &n);

if (n>=0)

printf("\nO fatorial de %d e' %d", n, fat(n)); printf("\nO fatorial de %d e' %d", n, fat(n)); else

{

printf("\nNao existe fatorial de numeros negativos!"); return 1;

}

return 0; }

(27)

Para uma melhor compreensão dos problemas associados à recursão, devemos nos recordar do conceito de “registro de ativação”, estudado na disciplina Introdução a Algoritmos.

O registro de ativação é uma área de memória que guarda informações referentes ao estado atual de uma função:

Recursividade

que guarda informações referentes ao estado atual de uma função:

- valor dos parâmetros formais; - valor das variáveis locais;

- valor do contador de programa (PC); - etc.

(28)

Sempre que uma função chama outra função o registro de ativação da função invocadora é salvo e um novo registro de ativação é criado para a função invocada.

Este processo é conhecido como salvamento Recursividade

Este processo é conhecido como salvamento e troca de contexto e, dependendo da “profundidade” da recursão, consome memória e um tempo de execução significativos.

(29)

Exercício:

Para uma melhor compreensão do conceito de

recursividade construa, na linguagem de

programação C, uma função recursiva que

Recursividade

programação C, uma função recursiva que receba como parâmetro dados referentes a um vetor com elementos inteiros e inverta a ordem de seus elementos.

Referências

Documentos relacionados

O objetivo deste trabalho foi realizar modificações de superfície na liga Ti-15Mo empregando-se feixe de laser e recobrimento com apatitas e análises in vitro

En segundo lugar, o Pontejazz inclúe un Workshop con catro dos músicos máis sobresalientes do jazz neoiorquino como son Philip Dizack (trompeta), Taylor Eigsti (piano), Joe

Devolve o estado de terminação do processo filho que foi atribuído no parâmetro da função exit.. int wait

Isso inclui nossos próprios espíritos, porque temos que buscar nossa evolução através do trabalho mediúnico, com amor, tolerância e humildade, e isso só é possível

[r]

Para instalação em tubo de escoamento, retire a curva plástica, empurrando a mangueira para dentro da curva plástica e, em seguida, para cima.Nunca solte a mangueira

Usando uma balança como a da imagem ao lado, qual o número MÍNIMO de pesagens que você precisa fazer para descobrir a moeda diferente.. Atenção: como é comum nesse

A presente Chamada Pública tem por objeto o recebimento de propostas para apoio financeiro para o desenvolvimento de projetos de Pesquisa, Desenvolvimento