[CAPÍTULO 1] - [CAPÍTULO 2] - [CAPÍTULO 3]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6]
Estruturas
Tipos de Dados
Em aulas anteriores dissemos que os TIPOS de DADO podem ser classificados em:- básicos ou primitivos
- compostos ou construídos
Tipos compostos
- Arranjos (matrizes e vetores)
- Ponteiros
- Definidos pelo usuário
- Estruturas
- Uniões
- Enumerações
- Campos de bits
-
typedefs
Estruturas
Atividade : asciimap
- Crie um projeto C chamado asciimap
- Salve os arquivos abaixo no projeto
/* asciimap.h */ #define LAR_MAX 40 #define ALT_MAX 20 void ler_pontos(char asciimap[ALT_MAX][LAR_MAX]); void imprimir(char asciimap[ALT_MAX][LAR_MAX]);
NOTA : Sobre o uso de ARRANJOS em parametros de funções videL Matrizes e Parâmetros de Funções.
/* asciimap.c
*/
#include "asciimap.h"
void ler_pontos(char asciimap[ALT_MAX][LAR_MAX]) {
char opc[10] = "sim";
while( strcmp(opc,"nao") != 0 ) {
unsigned short x,y;
char c;
printf("Ponto:\n");
printf(" x = "); scanf("%hu",&x);
printf(" y = "); scanf("%hu",&y);
if ( x >= LAR_MAX || y >= ALT_MAX ) {
printf("erro: Max x = %hu e Max y = %hu\n", LAR_MAX -1, ALT_MAX -1);
continue;
}
printf(" c = "); scanf(" %c" ,&c);
asciimap[y][x] = c;
printf("Outro? [sim|nao]\n");
scanf("%s",opc);
}
}
void imprimir(char asciimap[ALT_MAX][LAR_MAX]) {
int x,y;
for( y=0; y < ALT_MAX; y++ ) {
for( x=0; x < LAR_MAX; x++ )
printf("%c",asciimap[y][x]);
printf("\n");
}
}
/* asciimap-teste.c
*/
#include "asciimap.h"
main() {
char map[ALT_MAX][LAR_MAX];
memset(map,' ',LAR_MAX * ALT_MAX);
ler_pontos(map);
imprimir(map);
}
Atividade 2 : retangulo
- crie um projeto C e salve com o nome de retangulo
- crie os arquivos abaixo no projeto retangulo
/* retangulo.h
*/
#include "asciimap.h"
struct ponto {
unsigned short x,y;
char c;
};
struct retangulo {
struct ponto ini;
unsigned short dx,dy;
};
#define min(a,b) ((a) < (b) ? (a) : (b))
void desenhar(char asciimap[ALT_MAX][LAR_MAX], struct retangulo ret);
/* retangulo.c
*/
#include "retangulo.h"
void desenhar(char asciimap[ALT_MAX][LAR_MAX], struct retangulo ret) {
int x,xf,y,yf;
xf = min(ret.ini.x + ret.dx, LAR_MAX);
for ( x = ret.ini.x ; x < xf; x++ )
asciimap[ret.ini.y][x] = ret.ini.c;
yf = min(ret.ini.y + ret.dy, ALT_MAX);
for ( y = ret.ini.y; y < yf; y++ )
asciimap[y][ret.ini.x] = ret.ini.c;
if ( ret.ini.y + ret.dy <= ALT_MAX )
for ( x = ret.ini.x ; x < xf; x++ )
asciimap[yf-1][x] = ret.ini.c;
if ( ret.ini.x + ret.dx <= LAR_MAX )
for ( y = ret.ini.y ; y < yf; y++ )
asciimap[y][xf-1] = ret.ini.c;
}
/* retangulo-teste.c
*/
#include "retangulo.h"
main() {
struct ponto p = {0, 0, '.'};
struct retangulo r = { p, 10, 4 };
struct retangulo r2= { {10,4,'-'}, 10, 10};
char map[ALT_MAX][LAR_MAX];
memset(map,' ', ALT_MAX*LAR_MAX);
desenhar(map,r);
desenhar(map,r2);
imprimir(map);
}
Leitura Recomendada
Exercícios
- Estenda o programa da atividade 2 para incluir o desenho de :
- retas (definida por dois pontos distintos; )
- circulos (definido por um ponto central e um raio );
- Escreva uma função que use as mesmas estruturas da atividade 2 para descobrir se um ponto está dentro de um retângulo.
- Defina uma estrutura que permita representar um triângulo, através das coordenadas dos seus vértices. Em seguida, escreva uma função que leia as coordenadas dos vértices de um triângulo e preencha a estrutura definida cujo endereço lhe é passado como parâmetro. Depois, escreva funções que determinem o perímetro e a área de um triângulo representado pela estrutura definida. Por fim, desenvolva um programa de teste de todas as funções criadas.
- Considere que uma empresa precisa armazenar os seguintes dados de um cliente:
- DADOS
- Nome completo com no máximo 50 caracteres;
- renda mensado do cliente;
- ano de nascimento;
- possui ou não carro.
- Defina um tipo e uma estrutura para armazenarem estes dados e escreva um programa que leia estes dados armazene-os em uma variável e em seguida os imprima.
- DADOS
- Considerando a mesma estrutura do exercício anterior, escreva um programa que leia os dados de 100 clientes e imprima:
- quantos clientes têm renda mensal acima da média;
- quantos clientes têm carro;
- quantos clientes nasceram entre 1960 (inclusive) e 1980 (exclusive).
- Considere que foi definida a seguinte estrutura:
typedef struct _frac {
int numerador, denominador;
} FRACAO;
Escreva um programa em C que calcule as quatro operações (+, -, * e / ) usando frações definidas com estruturas do tipo FRACAO. O programa deve ler duas frações e imprimir o resultado de cada uma das quatro operações.
Bibliografia e fonte:
- [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
- LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
- [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
- DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
- Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.
Coloque aqui o seu email