LINGUAGEM: Linguagem C - Capítulo 3 - Parte 1

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

  1. Crie um projeto C chamado asciimap
  2. 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

  1. crie um projeto C e salve com o nome de retangulo
  2. 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

  1. 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 );
  2. Escreva uma função que use as mesmas estruturas da atividade 2 para descobrir se um ponto está dentro de um retângulo.
  3. 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.
  4. 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.
  5. 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).
  6. 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.