Departamento de Engenharia Electrotécnica PROGRAMAÇÃO DE MICROPROCESSADORES 2009 / 2010 Mestrado Integrado em Engenharia Electrotécnica e Computadores 1º ano 2º semestre Trabalho nº 5 Funções e Vectores http://tele1.dee.fct.unl.pt/pm Paulo da Fonseca Pinto Luis Bernardo
1 Introdução Nos capítulos 5 e 6 do livro Linguagem C de Luís Damas, recomendado para a disciplina de Programação de Microprocessadores, são apresentados respectivamente os funções e vectores. Esta aula visa consolidar estas matérias através de um conjunto de exercícios. Faça todos os exercícios pedidos em ficheiros separados e GUARDE O CÓDIGO desenvolvido na memória USB. Durante a aula o docente pode pedir-lhe para mostrar o código desenvolvido. 2 Como escrever um ficheiro com funções? 2.1 ONDE COLOCAR AS FUNÇÕES? Uma pergunta pertinente quando se escreve o código de um programa com funções é saber onde colocar as funções e o main. Deve ser como está mostrado em baixo à esquerda, ou à direita? main () int i= 4, n=2; escreve_num (i, n); void escreve_num (int a, b) printf ("N1 = %d, N2 0 %d\n, a, b); void escreve_num (int a, b) printf ("N1 = %d, N2 0 %d\n, a, b); main () int i= 4, n=2; escreve_num (i, n); O compilador de C vai percorrendo o ficheiro do princípio ao fim, compilando o programa. Se usarmos o modo à esquerda, quando o compilador encontra a função escreve_num, como ainda não a conhece, admite que ela devolve int. É assim que o compilador de C funciona! Quando chega à função propriamente dita repara que devolve void, e que tem o mesmo nome de uma outra que ele já conhece mas que devolve int. Ora não se pode ter duas funções diferentes com o mesmo nome. O compilador detecta um erro! Existe uma solução: Escrever um protótipo da função escreve_num antes do main para indicar ao compilador que escreve_num devolve void. Ora quanto mais se escreve, mais se erra! Se a meio de programar decidirmos mudar alguma coisa na função temos de ir mudar o protótipo. Assim, deve-se usar o modo de escrita apresentado à direita. O main é sempre a última função no ficheiro e sempre que se chama uma função, chama-se para cima (isto é, o código dela está escrito em cima). Deste modo não são precisos os protótipos. SIMPLES, não é? 2
2.2 AH! AS VARIÁVEIS GLOBAIS É proibido usar variáveis globais em Programação de Microprocessadores. Simples, não é? 3 A tabuada Pretende-se utilizar o código seguinte, sem alterar qualquer linha já escrita, para fazer a tabuada. Acrescente o que for preciso num ficheiro tabuada.c. /* * Tabuada * Ficheiro: tabuada.c */ #include <stdlib.h> /* define exit() para sair do programa */ int mult (int a, b) return a*b; main () int n; printf ("Que tabuada quer (1 a 9)? : "); if (scanf (" %d", &n)!= 1) /* Se não leu um elemento */ printf ("Leitura do limite inválida\n"); exit (1); /* Sai do programa */ if ((n < 1) (n > 9)) printf ( Número incorrecto. Tente outra vez\n ); exit (1); tabuada (n); O programa deve proceder como este exemplo. Pode depois mudar o código para ficar sempre a perguntar. Que tabuada quer (1 a 9)? : 5 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 Que tabuada quer (1 a 9)? : 3
4 A aversão aos a Pretende-se fazer um programa que manipule um vector de caracteres, chamado linha.c (não é uma string de caracteres). Existem as funções seguintes: A função main é simplesmente a chamada a procedimentos; menu contém o menu e devolve a opção escolhida pelo utilizador; limpar_vector (coloca em cada elemento do vector o carácter espaço em branco); ler_vector (pede ao utilizador que escreva um texto que coloca no vector. O texto é lido com getchar e todos os caracteres que o utilizador escrever acima do tamanho do vector são ignorados. Se o utilizador não escreveu os suficientes ficam os que estavam no vector); imprimir_vector (imprime o vector no ecrã usando putchar. Imprime todos os caracteres); substitui_vector (substitui todas as ocorrências de um carácter a pelo carácter b, em que a e b são fornecidos na lista de argumentos. Retorna o número de substituições feito, que a função main escreve no ecrã); conta_caracter (conta quantas ocorrências do carácter a existem no vector, retornando esse valor, que a função main escreve no ecrã). O vector tem tamanho TAM. 5 Padrões e padrões O objectivo do próximo programa é generalizar o problema anterior. Considere um vector a duas dimensões, uma matriz, de caracteres com a dimensão TAM x TAM. Chame ao ficheiro padrao.c. Considere que se numeram as linhas da primeira para a última (de cima para baixo) desde o valor zero a TAM-1 as colunas da esquerda para a direita do mesmo modo as diagonais do modo como mostra a figura seguinte (a diagonal principal tem a identificação de zero; as diagonais para cima são positivas; as diagonais para baixo são negativas) O que se pretende é que faça um programa que trabalhe sobre a matriz e que faça o seguinte: escrever_coluna esta função escreve o carácter a (parâmetro de entrada) na coluna i (também parâmetro de entrada); escrever_linha esta função escreve o carácter a (parâmetro de entrada) na linha i (também parâmetro de entrada); escrever_diagonal esta função escreve o carácter a (parâmetro de entrada) na diagonal i (também parâmetro de entrada); limpa_matriz esta função coloca todos os valores da matriz com o carácter a (parâmetro de entrada) escreve_matriz esta função escreve a matriz no ecrã para o utilizador ver os disparates que anda a fazer. menu esta função contém o menu das hipóteses anteriores main só chama funções 4
-2-1 2 1 0 Uma linha da matriz é, de facto, um vector. Mude então a função escrever_linha para que tenha como parâmetro de entrada um vector (cuja dimensão é dada como parâmetro) em vez de uma matriz. Será que pode mudar a função que trata as colunas do mesmo modo? Experimente Está num curso científico 6 Mais exercícios Se quiser mais exercícios com vectores e funções pode usar os seguintes enunciados de anos anteriores http://tele1.dee.fct.unl.pt/pm_2007_2008/laboratorio/pm_aula3_20072008.pdf e http://www.uninova.pt/~jab/pm/downloads/files/pm_aula4_20082009.pdf 5