UNIVASF Disciplina: Introdução à Programação Perı́odo: 2010.1 - Turma: Questões de revisão - 15 de Junho Assunto da prova 3: • Agregados heterogêneos, tipos definidos pelo usuário; • Arquivos binário. Comandos para abrir, fechar, salvar e ler informações do arquivo; • Alocação dinâmica, mapa de memória, memória heap e funções malloc e free; • Diretivas de compilação condicional, definição de macros, divisão do projeto em arquivos separados e compilação separada; Questão 1 (Diretivas de compilação condicional e compilação separada) Um programa em C é composto dos arquivos principal.c, bibliotecaImpressao.h, bibliotecaGeometria.h e bibliotecaGeometria.c: /∗principal.c∗/ #include <stdio.h> #include "bibliotecaImpressao.h" #include "bibliotecaGeometria.h" int main() { double n1 = 7, n2 = 8; #ifdef CIRCULO PRN(n1); PRN(a circ(n1)); #elif RETANGULO PRN(n1); PRN(n2); PRN(a ret(n1, n2)); #endif return 0; } /∗bibliotecaImpressao.h∗/ #define PRN(n) printf("%.2lf\n", (double)n) /∗bibliotecaGeometria.h∗/ #define PI 3.14159 double a circ(double raio); double a ret(double base, double altura); Responda: • implemente o bibliotecaGeometria.c sabendo que – a função a circ retorna a área de um cı́rculo = π ∗ raio2 – a função a ret retorna a área de um retângulo = base ∗ altura • escreva o Makefile para compilação do programa definindo: – no campo OPCOES do Makefile, o identificador RETANGULO – a regra all para compilação de principal.c – a regra BIBLIOTECAGEOMETRIA para compilação de bibliotecaGeometria.c – a regra clean para remoção dos arquivos objeto e binário gerados em compilações anteriores Questão 2 (Definição de macros) A macro seguinte é correta? Se sim, em qual situação ela se aplica? 1 #define TROCA(a,b) {int t; t=a; a=b; b=t;} Questão 3 (Agregados heterogêneos, tipos definidos pelo usuário) Considando o código abaixo, implemente a função potenciaMedia(), em que o produto dos membros tensao e corrente de cada elemento de um vetor de estruturas medicao é somado e dividido pelo número de elementos num_medicoes desse vetor. Utilize o operador -> para acessar os membros da estrutura medicao a partir do ponteiro p. Resultado esperado: Potencia media = 13.5 W #include <stdio.h> //Estrutura cujos membros sao medicoes de tensao (em mV) e corrente (em mA) typedef struct { float tensao; float corrente; } medicao; //Esta funcao retorna a potencia media das medicoes ao longo do tempo float potenciaMedia(medicao ∗p, int num medicoes) { //... } main() { //Um vetor de medicoes ao longo do tempo medicao medicoes[] = {{1136, 11853}, {1136, 11850}, {1136, 11850}, {1136, 11850}, {1136, 11850},... ⇒ ... {1152, 11823}, {1152, 11823}}; printf("Potencia media = %.1f W\n", potenciaMedia(medicoes, 7)/1000000); } Questão 4 (Arquivos binário e Alocação dinâmica) O arquivo matriz.bin possui um cabeçalho: 1 char correspondendo ao número de linhas de uma matriz M , e 1 char correspondente ao número de colunas da matriz. O campo de dados possui uma matriz linearizada de elementos do tipo char. Implemente um programa em C para • abrir o arquivo matriz.bin para leitura no modo binário • ler o número de linhas e armazenar numa variável do tipo char • ler o número de colunas e armazenar numa variável do tipo char • alocar um espaço de memória suficiente para armazenar a matriz. Um ponteiro R deve apontar para a primeira posição • ler os valores da matriz (se houver uma quantidade insuficiente de valores, mostrar uma mensagem de erro) e armazenar no espaço de memória alocado apontado por R • fechar o arquivo matriz.bin • abrir um arquivo matrizTransposta.txt para escrita no modo texto. Nesse arquivo será armazenada a transposta M t de M . Note que M t[i][j] = M [j][i], ∀i, j. Exemplo: M = | | | 0 1 2 Mt = | 0 | 2 2| 3| 4| 1 3 2| 4| • alocar um espaço de memória suficiente para armazenar a matriz transposta M t de M . Um ponteiro Rt deve apontar para a primeira posição 2 • escrever na região apontada por Rt, a transposta M t de M • escrever a transposta M t formatada no arquivo matrizTransposta.txt • desalocar o espaço de memória apontado por R e Rt • fechar o arquivo matrizTransposta.txt Protótipos: FILE ∗ fopen ( const char ∗ filename, const char ∗ mode ); int fclose ( FILE ∗ stream ); size t fread ( void ∗ ptr, size t size, size t count, FILE ∗ stream ); size t fwrite ( const void ∗ ptr, size t size, size t count, FILE ∗ stream ); int fscanf ( FILE ∗ stream, const char ∗ format, ... ); int fprintf ( FILE ∗ stream, const char ∗ format, ... ); void ∗ malloc ( size t size ); void free ( void ∗ ptr ); 3