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
Download

Exercicios aula 15/06 (revisão para a prova 3)