Linguagem C Vetores, Matrizes e Funções Revisão de Funções • O que são “Funções”? (ou subprogramas ou subrotinas) – São trechos de código fonte agrupados sob um nome, que podem ser chamados sempre que for necessário executar uma determinada ação programada neste trecho; • Como usar funções? – Atribui-se um nome à uma seqüência de comandos, e faz-se referência a este nome nos vários lugares do programa onde a seqüência em questão deveria ser repetida. Revisão de Funções • Por que usar funções? – Evita escrita repetida de código (uma certa seqüência de comandos deve ser repetida em vários lugares de um programa). • Economiza o tempo gasto com o trabalho de copiar estas seqüências; • Evitar a necessidade de mudar em múltiplos lugares caso deseje alterar o seu funcionamento; – Dividir grandes tarefas de computação em tarefas menores: • Facilita o gerenciamento de grandes sistemas e • Aumenta a confiabilidade dos mesmos. • Resumo: Principais motivações para uso das funções! – Evitar repetição de código – Modularização Revisão de Funções • Função simples: void sai_do_programa() { printf(“Digite qualquer tecla para sair do programa.\n”); system(“pause”); exit(0); } Chamada: sai_do_programa(); Revisão de Funções • Função com parâmetro: void imprime_quadrado(int n) { printf(“O quadrado de %d eh %d.\n”,n, n*n); } Chamada: imprime_quadrado(5); Saída: O quadrado de 5 eh 25 Revisão de Funções • Função com parâmetro e retorno: int quadrado(int n) { int q; q = n * n; return(q); } Chamada: printf(“O quadrado de %d eh %d.\n”, 5, quadrado(5) ); Saída: O quadrado de 5 eh 25 Revisão de Funções • Função com parâmetro e retorno: int quadrado(int n) { int q; q = n * n; return(q); } Chamada: int i; for(i=1;i<5;i++) printf(“O quadrado de %d eh %d.\n”, 5, quadrado(5) ); Saída: O quadrado de 1 eh 1 O quadrado de 2 eh 4 O quadrado de 3 eh 9 O quadrado de 4 eh 16 Revisão de Funções • Função com diversos parâmetros e retorno: int potencia(int n, int p) { int i,resultado=1; for(i=1;i<=p;i++) resultado = resultado * n; return(resultado); } Chamada: printf(“%d elevado a %d vale %d.\n”,2,4,potencia(2,4)); Saída: 2 elevado a 4 vale 16 Revisão de Funções • Função com diversos parâmetros e retorno: int potencia(int n, int p) { int i,resultado=1; for(i=1;i<=p;i++) resultado = resultado * n; return(resultado); } Chamada: int i; for(i=1;i<5;i++) printf(“%d elevado a %d vale %d.\n”,2,i,potencia(2,i)); Saída: 2 elevado a 1 vale 1 2 elevado a 2 vale 4 2 elevado a 3 vale 8 2 elevado a 4 vale 16 Revisão de Funções • Posicionamento das funções no programa C: – Sempre antes da função main() – Caso queira colocar as funções após a função main(), é preciso colocar um “protótipo” da função antes da função main()!!!! – (Mas o que é um protótipo de função?.....) – …é a descrição da função! – Ex: função “sai_do_programa” void sai_do_programa() { printf(“Digite qualquer tecla para sair do programa.\n”); system(“pause”); exit(0); } – Protótipo da função “sai_do_programa”: void sai_do_programa(); Revisão de Funções • Posicionamento das funções no programa C: Ex2: função “quadrado” int quadrado(int n) { int q; q = n * n; return(q); } – Protótipo da função “quadrado”: int quadrado(int n); Revisão de Vetores • Vetores são Estruturas de Dados Homegêneas, isto é, capazes de armazenar uma quantidade pré-definida de valores do mesmo tipo • Necessitam de apenas um índice de acesso. • Declaração: tipo nomedovetor[DimMax]; Onde: – tipo:um dos tipos primitivos de dados em C (char, int, float, double) – nomedovetor: segue as mesmas regras das variáveis básicas – DimMax: define o número máximo de elementos do vetor pode ser uma expressão constante inteira Revisão de Vetores #include <stdio.h> #include <stdlib.h> #define NUM_ALUNOS 3 int main( ) { float notas [NUM_ALUNOS]; float media_turma = 0.0; int i; for ( i = 0; i < NUM_ALUNOS; i++ ) { printf ("Digite a nota do %d o. aluno: ", i+1); scanf ("%f", ¬as[i]); } for ( i = 0; i < NUM_ALUNOS; i++ ) { media_turma += notas[i]; } media_turma = media_turma / NUM_ALUNOS ; printf ("A media da turma eh %.2f \n", media_turma); system ("Pause"); return 0; } Vetores e Funções #include <stdio.h> #include <stdlib.h> #define NUM_ALUNOS 3 int main( ) { float notas [NUM_ALUNOS]; float media_turma; int i; float media ( float notas[], int n ) { int i = 0; float m = 0.0; for ( i = 0; i < NUM_ALUNOS; i++ ) { printf ("Digite a nota do %d o. aluno: ", i+1); scanf ("%f", ¬as[i]); } media_turma = media ( notas, NUM_ALUNOS ); for ( i = 0; i < n; i++ ) { m = m + notas[i] ; } m = m / n; return m; } printf ("A media da turma eh %.2f \n", media_turma); system ("Pause"); return 0; } Vetores e Funções • E para calcular o número de alunos com notas acima da média? • A função de cálculo de média pode ser a mesma já utilizada..... • E agora criamos a função de cálculo da quantidade de alunos acima da média! #include <stdio.h> #include <stdlib.h> #define NUM_ALUNOS 3 float media ( float notas[], int n ) { int i = 0; float m = 0.0; for ( i = 0; i < n; i++ ) { m = m + notas[i] ; } m = m / n; return m; } Vetores e Funções int conta_alunos_acima_da_media ( float notas[], int n, float media) { int i, conta = 0; for ( i = 0; i < n; i++ ) { if (notas[i] > media) { conta += 1; } } return conta; } Vetores e Funções int main( ) { float notas [NUM_ALUNOS]; float media_turma; int i, melhores_alunos; for ( i = 0; i < NUM_ALUNOS; i++ ) { printf ("Digite a nota do %d o. aluno: ", i+1); scanf ("%f", ¬as[i]); } media_turma = media ( notas, NUM_ALUNOS ); printf ("A media da turma eh %.2f \n", media_turma); melhores_alunos=conta_alunos_acima_da_ media(notas, NUM_ALUNOS, media_turma); printf (“E o numero de alunos com nota acima da media foi: %d .\n”, melhores_alunos); system ("Pause"); return 0; } Vetores e Funções • Desafio 1: Alterar o programa anterior para: – Receber duas notas bimestrais de cada aluno; – Verificar se cada nota está entre 0.0 e 10.0; – Calcular a média de cada aluno (e armazenar o valor em um vetor); – Modificar o programa para apresentar os seguintes resultados: • média geral da turma; • número de alunos com média individual acima da média da turma. Matrizes e Funções • Será que é possível “passar matrizes” por parâmetro? • Se sim, como? Matrizes e Funções #include <stdio.h> #include <stdlib.h> #define NUM_ALUNOS 3 int main() { float notas [NUM_ALUNOS][2], media_turma; int i; for ( i = 0; i < NUM_ALUNOS; i++ ) { printf ("Digite a 1a. nota do %d o. aluno \n: ", i+1); scanf ("%f", ¬as[i][0]); printf ("Digite a 2a. nota do %d o. aluno \n: ", i+1); scanf ("%f", ¬as[i][1]); } media_turma = media_geral ( notas, NUM_ALUNOS ); printf ( "A media da turma eh %.2f \n", media_turma); system ("Pause"); return 0; } Matrizes e Funções float media_geral ( float notas[][2], int n ) { int i = 0; float m = 0.0; float notaaluno = 0.0; for ( i = 0; i < n; i++ ) { notaaluno = ( notas[i][0] + notas[i][1] )/2; m = m + notaaluno; } m = m / n; return m; } Exercício Complementar: • • Elabore um programa que manipule os dados para uma sala de 40 alunos. O programa deve receber como entrada (via leitura de teclado): - Os nomes dos alunos (máximo 50 caracteres). - As duas notas parciais. – O programa deve calcular e imprimir, numa mesma linha, para cada aluno: - O nome e a média final. – E também deve apresentar: - A maior média da turma, e a menor média da turma. - A quantidade de alunos aprovados, reprovados e em exame. - Uma listagem com o nome dos alunos que irão para a final.