Você está na página 1de 34

Introduo Programao

Introduo Programao
por Bruno Jefferson, Jorge Dias, e Eduardo Santana Medeiros

Ed. v1.0

Introduo Programao

ii

Copyright 2013 UAB

Voc tem a liberdade de:


Compartilhar copiar, distribuir e transmitir a obra.
Remixar criar obras derivadas.
Sob as seguintes condies:
Atribuio Voc deve creditar a obra da forma especificada pelo autor ou licenciante (mas no
de maneira que sugira que estes concedem qualquer aval a voc ou ao seu uso da obra).
Uso no comercial Voc no pode usar esta obra para fins comerciais.
Compartilhamento pela mesma licena Se voc alterar, transformar ou criar em cima desta
obra, voc poder distribuir a obra resultante apenas sob a mesma licena, ou sob uma licena
similar presente.
Para maiores informaes consulte: http://creativecommons.org/licenses/by-nc-sa/3.0/br/ .

Introduo Programao

iii

COLLABORATORS
TITLE :
Introduo Programao
ACTION

NAME

DATE

WRITTEN BY

Bruno Jefferson,
Jorge Dias, e
Eduardo Santana
Medeiros

13 de junho de 2013

SIGNATURE

REVISION HISTORY
NUMBER

DATE

v1.0

Maro 2013

DESCRIPTION
Primeira verso do livro

NAME
Bruno Jefferson
de Sousa

Introduo Programao

iv

Sumrio

Registros

1.1

Definio de registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Sintaxe para criao de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.3

Identificadores de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4

Anlise para criao de Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4.1

Situao do clculo das notas de um aluno . . . . . . . . . . . . . . . . . . .

1.4.2

Situao do clculo e consulta do IMC de uma pessoa . . . . . . . . . . . .

1.4.3

Situao sobre manipulao de pontos no plano cartesiano . . . . . . . . . .

1.4.4

Situao sobre cadastro de produtos no supermercado . . . . . . . . . . . . .

1.4.5

Situao sobre gerenciamento de contas bancrias . . . . . . . . . . . . . .

Exemplos de utilizao dos Registros . . . . . . . . . . . . . . . . . . . . . . . . .

1.5

1.5.1

Aluno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

1.5.2

Produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

1.5.3

Pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

1.6.1

Programa do clculo de mdias de alunos . . . . . . . . . . . . . . . . . . .

12

1.6.2

Problema do clculo e consulta do IMC de uma pessoa . . . . . . . . . . . .

14

1.6.3

Problema de pontos no plano cartesiano . . . . . . . . . . . . . . . . . . . .

16

1.6.4

Problema sobre cadastro de produtos no supermercado . . . . . . . . . . . .

18

1.6.5

Problema sobre gerenciamento de contas bancrias . . . . . . . . . . . . . .

19

1.7

Inicializando registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

1.8

Composio de Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

1.8.1

Triangulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

1.8.2

Informao Pessoal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

Comparao entre Arranjo e Registro . . . . . . . . . . . . . . . . . . . . . . . . .

26

1.10 Recapitulando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

1.11 Atividades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

ndice Remissivo

30

1.6

1.9

Introduo Programao

1 / 30

Captulo 1
Registros
O BJETIVOS DO CAPTULO
Ao final deste captulo voc dever ser capaz de:
Criar registros em C
Analisar problemas e reconhecer os campos necessrios para utilizar nos registros
Reconhecer campos identificadores de registros
Criar e manipular listas de registros
Neste captulos ns iremos estudar sobre Registros. Vamos conhecer a sua utilidade e como declarlos em C. Depois vamos analisar diversas situaes para aprender como o processo de criao de
um registro.
Sero apresentados alguns programas demonstrando a utilizao dos registros e por fim, vamos aprender como compor registros a partir de outros registros.
Mas, o que so Registros?

1.1

Definio de registro

Definio de Registro
Um Registro um tipo de dado criado pelo usurio, atravs da composio de outros tipos de
dados.
Ns utilizamos registros quando desejamos criar um tipo de dado para reunir informaes sobre o que
desejamos representar. No registro, as informaes so organizadas em campos.
Uma analogia de registro pode ser vista quando preenchemos um formulrio. Na Tabela 1.1 [2] ns
temos um exemplo de formulrio para cadastrar Clientes. Os campos do formulrio so preenchidos
com os dados do cliente que nos interessa registrar.
Sabendo as informaes que desejamos registrar sobre um Cliente, ns podemos esquematizar um
registro, informando os tipos de dado de cada campo, conforme descrito na Tabela 1.2 [2].

Introduo Programao

2 / 30

Tabela 1.1: Formulrio para cadastro de Cliente


Nome:
Data de Nascimento:
CPF:

Telefone para contato:


RG:

Tabela 1.2: Representao de um registro Cliente


Novo tipo

Cliente

Campo
Nome
Data de Nascimento
Telefone para contato
CPF H
RG

Tipo do campo
Textual
Numrico
Textual
Numrico
Numrico

Relembrando
Em nossos programas ns utilizamos varivies para manter as informaes que desejamos
manipular.
No momento da criao de uma varivel precisamos especificar o tipo de dado que desejamos que ela mantenha, atravs da declarao da varivel. Vamos relembrar como
declaramos variveis:

Em pseudo-cdigo
DECLARE nome_da_variavel: TEXTUAL
DECLARE var1,var2,var3: NUMRICO

Em C
char[] nome_da_variavel;
double var1,var2,var3;
Quando especificamos mais de uma varivel separadas por vrgula, assumimos que todas
elas possuem o mesmo tipo.

Na prxima seo, veremos como a sintaxe para criao de registros, em pseudo-cdigo e em C.


Importante
Embora, na prtica, o uso de registro geralmente est associado a persistncia de dados,
sempre que mencionarmos cadastrar neste captulo, estamos nos referindo a manter os
dados em memria para consulta posterior.
Em um sistema real, geralmente existe alguma forma de persistncia dos dados atravs de
arquivos ou banco de dados caso contrrio os dados seriam perdidos.

Introduo Programao

1.2

3 / 30

Sintaxe para criao de registros

Agora que temos o entendimento que um registro um tipo de dado, vamos conhecer a sintaxe para
especific-lo:
Sintaxe em pseudo-cdigo para criar registro
REGISTRO nome_do_registro
// Declaraes dos campos
REGISTRO_FIM

Sintaxe em C para criar registro


typedef struct {
// Declaraes dos campos
} nome_do_registro;

Quando criamos um novo tipo de dado precisamos nome-lo, para podermos referenci-lo mais tarde.
Nestas notaes nome_do_registro o nome do tipo de dado registro que ser criado.
As Declaraes dos campos definem os campos que compe o registro. Esta composio
ficar evidente nas prximas sees, onde iremos criar e manipular vrios registros.
Aps a definio do novo tipo de dado registro, uma declarao de varivel com este tipo realizada
da forma usual:
Declarao de varivel do tipo criado em pseudo-cdigo
DECLARE variavel_nome: nome_do_registro

Declarao de varivel do tipo criado em C


nome_do_registro variavel_nome;

1.3

Identificadores de registros

Antes de comearmos a especificar os registros, vamos primeiro entender a necessidade de identificar


unicamente um registro.
Importante
A palavra registro pode ser empregada em dois contextos diferentes.

Tipo de dado
o tipo de dado, conforme apresentado na definio de Registro.

Instncia do registro
Utilizando a analogia do formulrio, equivaleria s fichas dos clientes. Cada ficha preenchida equivale a uma instncia, ou um registro daquele tipo.
Por convenincia, sempre que utilizarmos a palavra registro para indicar instncia do tipo,
ela ser grafada em itlico.

Introduo Programao

4 / 30

Identificadores de registros so campos nos registros que o identifica e diferencia um registro de


qualquer outro.
No registro indicado na tabela Tabela 1.2 [2], como podemos diferenciar um cliente cadastrado de
outro? Qual campo identifica um cliente? Seria o nome? Data de Nascimento? Telefone? CPF ou
RG? Neste caso, preferimos utilizar o CPF, pois sabemos que duas pessoas diferentes no podem
possuir o mesmo nmero de CPF.
Em nosso livro os campos identificadores esto marcados com H.
Nota
O identificadores costumam ser do tipo inteiro, pois a comparao de inteiros mais rpida
do que comparao textual.

Na prxima seo, faremos anlises em algumas situaes, caso voc no tenha compreendido o que
so campos identificadores ter outra oportunidade.

1.4

Anlise para criao de Registros

Nesta seo mostramos o processo de criao de um Registro em diversas situaes diferentes.


Em cada situao apresentada faremos a seguinte anlise:
Determinar o tipo de registro que vamos criar
Especificar quais sero os campos do registro, com os seus respectivos tipos
Indicar qual o campo identificador (H), caso exista
Apresentar o cdigo de criao do Registro em Pseudo-cdigo e em C

1.4.1

Situao do clculo das notas de um aluno

Em uma disciplina onde os alunos possuem duas notas, e precisamos registrar e calcular as mdias
de todos eles, como seria um registro para representar esta situao?
Nome do Registro
Aluno
Campos
Obviamente vamos precisar guardar duas notas para cada aluno. Vamos precisar guardar a
mdia tambm? No, uma vez que temos as duas notas registradas, sempre que desejarmos
consultar a mdia poderemos calcul-las. O nome do aluno seria uma informao til? Sem
dvidas! Ser importante registrar o nome do aluno pois poderamos imprimir uma lista com
os nomes, notas e mdias de cada aluno. A matrcula do aluno importante tambm? Ns
poderamos suprimir a matrcula do aluno, mas qual seria a consequncia disso? Por exemplo,
na lista de notas poderia conter apenas os nomes, notas e mdias. Mas o que aconteceria se
tivssemos dois alunos com o mesmo nome? Ns precisamos de um informao extra para
identificar e diferenciar um aluno do outro. Com este intuito, vamos optar por registrar a
matrcula tambm. O nome da disciplina importante? Neste caso no, pois estamos nos
limitando aos alunos e suas notas.

Introduo Programao
Novo tipo
Aluno

5 / 30

Campo
matricula H
nome
nota1
nota2

Tipo do campo
Numrico
Textual
Numrico
Numrico

Registro em Pseudo-cdigo
REGISTRO Aluno
matricula: NUMRICO
nome: TEXTO
nota1, nota2: NUMRICO
FIM_REGISTRO

Registro em C: code/registros/reg_aluno.c
typedef struct {
int matricula;
char nome[100];
float nota1;
float nota2;
} Aluno;

Nota
At agora voc teve dificuldade para entender esta anlise? Voc compreendeu a necessidade da utilizao de matrcula como campo identificador? Concordou com os tipos de
dados utilizados para cada varivel?

1.4.2

Situao do clculo e consulta do IMC de uma pessoa

Nesta situao desejamos criar um sistema para cadastrar pessoas e em seguida consultar o IMC
delas.
Nome do Registro
Pessoa
Campos
Para o clculo do IMC so necessrias duas informaes: a altura e o peso. Novamente,
o nome da pessoa uma informao relevante, pois vamos imprimir o IMC calculado junto
com o nome. Mas como realizar a consulta? Aps o cadastro realizado de algumas pessoas,
qual o parmetro de busca que iremos utilizar para encontrar a pessoa certa? Poderamos
utilizar o nome completo da pessoa para encontr-la. Mas digitar o nome todo enfadonho.
Poderamos utilizar apenas o primeiro nome para busca, mas ento teramos que apresentar
um lista com todas as pessoas com aquele primeiro nome e selecionar a pessoa correta entre
elas.1 Se cadastrarmos o CPF da pessoa poderamos consult-la mais tarde informando apenas
ele, simplificando a busca. Por ltimo, como algumas tabelas do IMC apresentam os dados
categorizados por sexo, vamos registr-lo tambm.
1A

opo de utilizar o primeiro nome iria complicar o algortmo da busca.

Introduo Programao
Novo tipo

Pessoa

6 / 30

Campo
nome
peso
altura
cpf H
sexo

Tipo do campo
Textual
Numrico
Numrico
Numrico
Textual

Registro em Pseudo-cdigo
REGISTRO Pessoa
nome, sexo: TEXTO
peso, altura, cpf: NUMRICO
FIM_REGISTRO

Registro em C: code/registros/reg_pessoa.c
typedef struct{
char nome[100];
char sexo; // m: masculino, f: femino
float peso;
float altura;
long long cpf;
} Pessoa;

Nota
Mais uma vez, embora nosso problema no tenha indicado os campos que necessita, fomos
capazes de deduzir alguns. Aqui no h certo ou errado, cada um pode realizar sua anlise
e chegar a resultados diferentes.
Voc concorda com os tipos de dados apresentados aqui? No achou estranho cpf ser do
tipo long long? Voc declararia sexo com outro tipo, diferente de char?

cpf
Declaramos ele como long long pois os tipos long e int no armazenam nmeros
na ordem de 11 dgitos.

sexo
Optamos por utilizar o tipo char para simplificar comparaes, caso seja necessrias.
Poderamos declar-lo do tipo int, fazendo uma correspondncia de valores: 1=Feminino e 2=Masculino. Ou ainda poderamos utilizar char[] e registrar o texto completo:
Feminino ou Masculino.

1.4.3

Situao sobre manipulao de pontos no plano cartesiano

Nesta situao desejamos criar um sistema matemtico para manipular pontos no plano cartesiano.
Nome do Registro
Ponto
Campos
Para registrar um ponto no plano cartesiano basta informar os valores de suas coordenadas (x,y).

Introduo Programao

7 / 30

Novo tipo

Campo
xH
yH

Ponto

Tipo do campo
Numrico
Numrico

Registro em Pseudo-cdigo
REGISTRO Ponto
x, y: NUMRICO
FIM_REGISTRO

Registro em C: code/registros/reg_ponto.c
typedef struct{
int x;
int y;
} Ponto;

Nota
Neste registro ns temos uma novidade: estamos utilizando dois campos como identificadores simultaneamente. As vezes um nico campo s no suficiente para identificar um
registro.
Neste caso, fica evidente que dois pontos so iguais se e somente se eles possurem os
mesmo valores para o par (x,y).
Voc concorda com os tipos de dados apresentados aqui? No achou estranho cpf ser do
tipo long long? Voc declararia sexo com outro tipo, diferente de char?
E em relao ao tipo do dado? Voc teria utilizado outro tipo, diferente de int, como float
ou double? Mais uma vez, aqui no h certo ou errado, ns optamos por int apenas por
ser mais simples fornecer coordenadas em inteiro.

1.4.4

Situao sobre cadastro de produtos no supermercado

Nesta situao desejamos criar um sistema, para um supermercado, que cadastre produtos e seus
preos.
Nome do Registro
Produto
Campos
Para registrar um produto vamos precisar do seu nome e o seu preo. Mas como identificar
um produto cadastrado? Quando vamos no supermercado e compramos alguma mercadoria
no peso, o caixa do supermercado precisa fornecer um cdigo para cadastrar o produto pesado.
Geralmente ele utiliza uma tabela, onde h o nome do produto e o seu cdigo. Para a nossa
aplicao vamos utilizar este mesmo cdigo para identificar unicamente cada produto.
Novo tipo
Produto

Campo
nome
preco
codigo H

Tipo do campo
Textual
Numrico
Numrico

Introduo Programao

8 / 30

Registro em Pseudo-cdigo
REGISTRO Produto
codigo: NUMRICO
nome: TEXTUAL
preco: NUMRICO
FIM_REGISTRO

Registro em C: code/registros/reg_protudo.c
typedef struct {
long codigo;
char nome[100];
float preco;
} Produto;

Nota
Neste registro tivemos contato com um provvel campo identificador universal, o codigo.
Geralmente, quando nos deparamos com um campo cdigo, ele ser utilizado como o identificador.a
aA

1.4.5

no ser quando o cdigo for utilizado para designar uma senha.

Situao sobre gerenciamento de contas bancrias

Nesta situao desejamos criar um sistema bancrio para gerenciar clientes e suas contas bancrias.
Nomes dos Registros
Cliente e Conta.
Campos
O nome do cliente uma informao relevante. O CPF poder ser utilizado para diferenciar
clientes com o mesmo nome. Como identificar a conta do cliente? Cada conta poderia ter um
nmero de conta nico, que serviria para identificar a conta do cliente. Cada conta ter um
saldo, que ser gerenciada pelo sistema. Como cada cliente pode possuir mais de uma conta
bancria, junto com a conta deveremos registrar qual cliente o dono dela. Vamos utilizar o
CPF do cliente na conta para identificar o seu dono.
Novo tipo
Conta

Campo
numero_da_conta
H
saldo
cpf_do_cliente

Registro em Pseudo-cdigo
REGISTRO Conta
numero_da_conta, cpf_do_cliente, saldo: NUMRICO
FIM_REGISTRO

Tipo do campo
Numrico
Numrico
Numrico

Introduo Programao

9 / 30

Registro em C: code/registros/reg_conta.c
typedef struct {
long
numero_da_conta;
long
cpf_do_cliente;
double saldo;
} Conta;

Novo tipo
Cliente

Campo
nome
cpf H

Tipo do campo
Textual
Numrico

Registro em Pseudo-cdigo
REGISTRO Cliente
cpf: NUMRICO
nome: TEXTUAL
FIM_REGISTRO

Registro em C: code/registros/reg_cliente.c
typedef struct {
char nome[256];
long long cpf;
} Cliente;

Nota
Nesta situao temos outras novidades: a criao de dois Registros e utilizao de um
campo para registrar o relacionamento entre os dois registros.a
Percebam que cpf o campo identificador de Cliente. Para identificar que uma conta de
um determinado cliente, utilizamos o campo identificador de cliente na conta.
Esta uma estratgia muito importante para especificar relacionamento entre registros,
certifique-se que compreendeu-a antes de prosseguir.
a Relacionamento

entre registros um assunto que est fora do escopo de uma disciplina de Introduo a
Programao, voc estudar este tpico numa disciplina de Banco de Dados.

1.5

Exemplos de utilizao dos Registros

Nesta seo veremos alguns exemplos que demonstram a utilizao de registros. Nestes exemplos
voc ir aprender:
1. Como atribuir e acessar valores aos campos do registro
2. Como atribuir valores de texto aos campos do registro
3. Como ler valores da entrada e atribu-los aos campos
4. Como declarar um arranjo de registros
5. Como acessar um campo num arranjo de registros

Introduo Programao

1.5.1

10 / 30

Aluno

Exemplo de utilizao do registro Aluno.


code/registros/reg_aluno_exemplo.c
#include <stdio.h>
#include <string.h>
typedef struct {
int matricula;
char nome[100];
float nota1;
float nota2;
} Aluno;

int main(){
Aluno aluno;
aluno.matricula = 201328; // 1x
strncpy(aluno.nome, "Maria Bonita", sizeof(aluno.nome)); // 2x
aluno.nota1 = 8.0; // 3x
aluno.nota2 = 9.0; // 4x
printf("\n%d %s %1.2f %1.2f", aluno.matricula, aluno.nome, // 5x
aluno.nota1, aluno.nota2); // 6x
getchar();
return 0;
}
x, 3x, 4x Como

atribuir valores aos campos do registro.

Como atribuir valores de texto aos campos do registro. Voc j estudou a funo strcpy antes.

x, 6x Como

acessar valores atribudos aos campos do registro.

Resultado ao simular a execuo do programa


201328 Maria Bonita 8.00 9.00

1.5.2

Produto

Exemplo de utilizao do registro Produto.


code/registros/reg_produto_exemplo.c
#include <stdio.h>
typedef struct {
long codigo;
char nome[100];
float preco;

Introduo Programao

11 / 30

} Produto;
int main(){
Produto p;
scanf("%ld %s %f", &p.codigo, p.nome, &p.preco); // 1x
if (p.preco < 4)
printf("\nProduto em promocao: %s R$ %1.2f", p.nome, p .preco);
else
printf("\nProduto cadastrado.");
getchar();
return 0;
}

Como ler da entrada os valores e atribu-los aos campos. Consulte a documentao de scanf
(ou fscanf) para conhecer a sintaxe de leitura e converso dos dados. Percebam a ausncia
de & antes do campo nome.

Resultado ao simular a execuo do programa


Produto em promocao: banana R$ 3.99

Ateno
Percebam que quando atribumos um valor de texto aos campos do tipo char[], ns suprimimos o &. Isto correu com o campo aluno.nome em strncpy e p.nome no scanf.

1.5.3

Pontos

Exemplo de utilizao do registro Ponto com Arranjo.


code/registros/reg_ponto_exemplo.c
#include <stdio.h>
#include <string.h>
typedef struct{
int x;
int y;
} Ponto;
#define QUANTIDADE_DE_PONTOS 3 // 1x
int main(){
Ponto pontos[QUANTIDADE_DE_PONTOS]; // 2x
pontos[0].x = -4; pontos[0].y = 7;// 3x
pontos[1].x = 2; pontos[1].y = -9;// 4x

Introduo Programao
pontos[2].x =

12 / 30

5; pontos[2].y =

3;// 5x

for (int i = 0; i < QUANTIDADE_DE_PONTOS ; i++){


if(pontos[i].y > 0)
printf("\nPonto acima da reta: (%d,%d)",
pontos[i].x, pontos[i].y);
}
getchar();
return 0;
}
x

Declarao de constante que definir o tamanho do arranjo.


Como declarar um arranjo de registros do tipo Ponto, com o tamanho definido pela constante
QUANTIDADE_DE_PONTOS.

x, 4x, 5x Como

acessar um campo em arranjo de registros. Cada posio, do arranjo contm um


registro. Voc pode acessar as posies do arranjo com a mesma sintaxe: [ndice].

Resultado ao simular a execuo do programa


Ponto acima da reta: (-4,7)
Ponto acima da reta: (5,3)

1.6

Exerccios resolvidos

Nesta seo teremos a especificao de diversos problemas. Para cada um deles iremos escrever
um pseudo-cdigo que resolva o problema descrito, utilizando o recurso de Registros. Em seguida,
implementar um programa em C.

1.6.1

Programa do clculo de mdias de alunos

Escrever um programa que cadastre o nome, a matrcula e duas notas de vrios alunos. Em seguida
imprima a matrcula, o nome e a mdia de cada um deles.
Pseudo-cdigo do programa
REGISTRO Aluno
matricula: NUMRICO
nome: TEXTO
nota1, nota2: NUMRICO
FIM_REGISTRO
QUANTIDADE_DE_ALUNOS = 3
DECLARA alunos: Aluno[QUANTIDADE_DE_ALUNOS]
PARA i=0 AT QUANTIDADE_DE_ALUNOS FAA
LEIA alunos[i].nome
LEIA alunos[i].matricula

Introduo Programao

13 / 30

LEIA alunos[i].nota1
LEIA alunos[i].nota2
FIM_PARA
PARA i=0 AT QUANTIDADE_DE_ALUNOS FAA
ESCREVA alunos[i].matricula
ESCREVA alunos[i].nome
ESCREVA (alunos[i].nota1 + alunos[i].nota2)/2 1x
FIM_PARA

Imprime a mdia calculada.

Programa em C: code/registros/calculo_das_medias.c
#include <stdio.h>
typedef struct {
int matricula;
char nome[100];
float nota1;
float nota2;
} Aluno;

#define QUANTIDADE_DE_ALUNOS 3
int main(){
Aluno alunos[QUANTIDADE_DE_ALUNOS];
printf("Dados: nome(sem espacos), matricula, nota1, nota2\n");
for(int i=0; (i < QUANTIDADE_DE_ALUNOS); i++){
printf("\nInforme os dados do aluno(%i): ",i+1);
scanf("%s %i %f %f",alunos[i].nome, &alunos[i]. matricula,
&alunos[i].nota1, &alunos[i].nota2);
}
printf("\nMatricula\tNome\tMedia\n");
for(int i=0; (i < QUANTIDADE_DE_ALUNOS); i++){
printf("%i\t%s\t%1.2f\n",alunos[i].matricula,alunos[i ].nome,
(alunos[i].nota1 + alunos[i].nota2)/2);
}
getchar();
return 0;
}

Resultado ao simular a execuo do programa


Dados do aluno: nome(sem espacos), matricula, nota1, nota2

Introduo Programao

14 / 30

Informe os dados do aluno(1): Jesuno 2887399 6.0 7.5


Informe os dados do aluno(2): Maria 2887398 7.0 9.0
Informe os dados do aluno(3): Virgulino 2887400 10.0 8.0
Matricula
Nome
Media
2887399 Jesuno
6.75
2887398 Maria
8.00
2887400 Virgulino
9.00

1.6.2

Problema do clculo e consulta do IMC de uma pessoa

Escrever um programa que cadastre o nome, a altura, o peso, o cpf e sexo de algumas pessoas. Com
os dados cadastrados, em seguida localizar uma pessoas atravs do seu CPF e imprimir o seu IMC.
Pseudo-cdigo do programa
REGISTRO Pessoa
nome, sexo: TEXTO
peso, altura, cpf: NUMRICO
FIM_REGISTRO
QUANTIDADE_DE_PESSOAS = 3
PARA i=0 AT QUANTIDADE_DE_PESSOAS FAA
LEIA pessoas[i].nome
LEIA pessoas[i].altura
LEIA pessoas[i].peso
LEIA pessoas[i].cpf
LEIA pessoas[i].sexo
FIM-PARA
DECLARA cpf_localizador: NUMRICO
LEIA cpf_localizador 1x
2x
PARA i=0 AT QUANTIDADE_DE_PESSOAS FAA
SE pessoas[i].cpf == cpf_localizador ENTO 3x
ESCREVE pessoas[i].nome
ESCREVE pessoas[i].sexo
// IMC = peso / (altura * altura)
ESCREVE pessoas[i].peso / (pessoas[i].altura * pessoas[i].altura)
FIM-PARA

O ler o campo identificador de Pessoa (CPF).

x, 3x Pesquisa

pelo registro Pessoa identificado pelo CPF lido.

Programa em C: code/registros/imc_calculo.c
#include <stdio.h>
typedef struct{
char nome[100];

Introduo Programao

15 / 30

char sexo; // m: masculino, f: femino


float peso;
float altura;
long long cpf;
} Pessoa;
#define QUANTIDADE_DE_PESSOAS 3
int main(){
Pessoa pessoas[QUANTIDADE_DE_PESSOAS];
printf("Campos: nome, altura, peso, cpf, sexo\n");
for(int i=0; (i < QUANTIDADE_DE_PESSOAS); i++){
printf("\nInforme os dados da pessoa(%i): ",i+1);
scanf("%s %f %f %Lu %c",pessoas[i].nome, &pessoas[i]. altura,
&pessoas[i].peso, &pessoas[i].cpf, &pessoas[i ].sexo);
}
printf("\nInforme o CPF da pessoa: ");
long long cpf_localizador;
scanf("%Lu",&cpf_localizador); // 1x
printf("\nSexo\tNome\tIMC");
for(int i=0; (i < QUANTIDADE_DE_PESSOAS); i++){ // 2x
if (cpf_localizador == pessoas[i].cpf){ // 3x
float imc = pessoas[i].peso / (pessoas[i]. altura *
pessoas[i].altura);
printf("\n%c\t%s\t%1.2f\n",pessoas[i].sexo,
pessoas[i].nome, imc);
break;
}
}
getchar();
return 0;
}

O ler o campo identificador de Pessoa (cpf).

x, 3x Pesquisa

pelo registro Pessoa identificado pelo CPF lido.

Resultado ao simular a execuo do programa


Campos: nome, altura, peso, cpf, sexo
Informe
Informe
Informe
Informe

os dados
os dados
os dados
o CPF da

da pessoa(1): Jesuno 1.82 79 48755891748 m


da pessoa(2): Maria 1.66 52 72779162201 f
da pessoa(3): Virgulino 1.75 80 71443626406 m
pessoa: 72779162201

Introduo Programao
Sexo
f

Nome
Maria

1.6.3

16 / 30

IMC
18.87

Problema de pontos no plano cartesiano

Escrever um programa que leia 5 pontos. Em seguida imprima qual o ponto mais prximo do primeiro
ponto lido.
Pseudo-cdigo do programa
REGISTRO Ponto
x, y: NUMRICO
FIM_REGISTRO
QUANTIDADE_DE_PONTOS = 5
PARA i=0 AT QUANTIDADE_DE_PONTOS FAA
LEIA p[i].x
LEIA p[i].y
FIM_PARA
menor_distancia_ao_quadrado = MAIOR_INTEIRO 1x
ponto_mais_proximo = 1 2x
PARA i=1 AT QUANTIDADE_DE_PONTOS FAA
distancia_ao_quadrado = (pontos[i].x-pontos[0].x)*
(pontos[i].x-pontos[0].x)+(pontos[i].y-pontos[0].y)*
(pontos[i].y-pontos[0].y) 3x
SE distancia_ao_quadrado < menor_distancia_ao_quadrado ENTO 4x
ponto_mais_proximo = i 5x
menor_distancia_ao_quadrado = distancia_ao_quadrado 6x
FIM_PARA
ESCREVA p[ponto_mais_proximo].x,p[ponto_mais_proximo].y

x,

x,

x MAIOR_INTEIRO

representa o maior nmero inteiro que podemos armazenar


numa varivel. Geralmente atribuimos o maior inteiro quando procuramos por um
menor valor.
No cdigo, comparamos menor_distancia_ao_quadrado com
distancia_ao_quadrado e salvamos o menor deles. Se executarmos isso sucessivamente, ao final, menor_distancia_ao_quadrado conter o menor valor comparado.2
6

x, 5x Esta

varivel ir guardar a posio do ponto mais prximo. Ela atualizada, sempre que
encontramos outro ponto com menor distncia.

Calculo para encontrar a distncia entre dois pontos. Na realizadade, a distncia entre os dois
pontos seria a raiz de distancia_ao_quadrado. Mas no h diferena em comparar a
distncia ao quadrado. Sabemos, por exemplo, que a raiz de x menor do que a raiz de y se
x for menor do que y.
2 Caso

tivssemos inicializado a varivel menor_distancia_ao_quadrado com 0, ao compar-lo com outro


nmero, ele seria o menor, impossibilitando encontrar a menor distncia.

Introduo Programao

17 / 30

Programa em C: code/registros/ponto_proximo.c
#include <stdio.h>
#include <limits.h> // contm definio de INT_MAX
typedef struct{
int x;
int y;
} Ponto;
#define QUANTIDADE_DE_PONTOS 5
int main(){
Ponto pontos[QUANTIDADE_DE_PONTOS];
printf("Campos: x, y\n");
for(int i=0; (i < QUANTIDADE_DE_PONTOS); i++){
printf("\nInforme as coordenadas do ponto(%i): ",i+1);
scanf("%d %d",&pontos[i].x,&pontos[i].y);
}
int menor_distancia_ao_quadrado = INT_MAX; // maior inteiro
int ponto_mais_proximo = 1;
for(int i=1; (i < QUANTIDADE_DE_PONTOS); i++){
int distancia_ao_quadrado = (pontos[i].x-pontos[0].x)*
(pontos[i].x-pontos[0].x)+(pontos[i].y-pontos [0].y)*
(pontos[i].y-pontos[0].y);
if(distancia_ao_quadrado < menor_distancia_ao_quadrado ){
ponto_mais_proximo = i;
menor_distancia_ao_quadrado = distancia_ao_quadrado;
}
}
printf("\nPonto mais proximo: (%d,%d)\n",
pontos[ponto_mais_proximo].x, pontos[ ponto_mais_proximo].y);
getchar();
return 0;
}

Resultado ao simular a execuo do programa


Campos: x, y
Informe
Informe
Informe
Informe
Informe

as
as
as
as
as

coordenadas
coordenadas
coordenadas
coordenadas
coordenadas

do
do
do
do
do

ponto(1):
ponto(2):
ponto(3):
ponto(4):
ponto(5):

0
4
6
5
7

0
6
1
3
2

Introduo Programao

18 / 30

Ponto mais proximo: (5,3)

1.6.4

Problema sobre cadastro de produtos no supermercado

Escrever um programa que cadastre vrios produtos. Em seguida, imprima uma lista com o cdigo e
nome da cada produto. Por ltimo, consulte o preo de um produto atravs de seu cdigo.
Pseudo-cdigo do programa
REGISTRO Produto
codigo: NUMRICO
nome: TEXTUAL
preco: NUMRICO
FIM_REGISTRO
QUANTIDADE_DE_PRODUTOS = 5
DECLARA produtos: Produto[QUANTIDADE_DE_PRODUTOS]
PARA i=0 AT QUANTIDADE_DE_PRODUTOS FAA
LEIA produtos[i].codigo
LEIA produtos[i].nome
LEIA produtos[i].preco
FIM_PARA
PARA i=0 AT QUANTIDADE_DE_PRODUTOS FAA
ESCREVA produtos[i].codigo
ESCREVA produtos[i].nome
FIM_PARA
DECLARA codigo_digitado: NUMRICO
LEIA codigo_digitado
PARA i=0 AT QUANTIDADE_DE_PRODUTOS FAA
SE produtos[i].codigo == codigo_digitado ENTO
ESCREVA produtos[i].preco
FIM_PARA

Programa em C: code/registros/supermercado.c
#include <stdio.h>
typedef struct {
long codigo;
char nome[100];
float preco;
} Produto;
#define QUANTIDADE_DE_PRODUTOS 5
int main(){
Produto produtos[QUANTIDADE_DE_PRODUTOS];
printf("Campos: codigo-do-produto nome preco\n");

Introduo Programao

19 / 30

for(int i=0; (i < QUANTIDADE_DE_PRODUTOS); i++){


printf("\nInforme os dados do produto(%i): ",i+1);
scanf("%ld %s %f",&produtos[i].codigo,produtos[i].nome ,
&produtos[i].preco);
}
for(int i=0; (i < QUANTIDADE_DE_PRODUTOS); i++){
printf("\n%ld\t%s R$ %1.2f", produtos[i].codigo,
produtos[i].nome,produtos[i].preco);
}
long codigo_digitado;
printf("\nInforme o codigo do produto: ");
scanf("%ld", &codigo_digitado);
for(int i=1; (i < QUANTIDADE_DE_PRODUTOS); i++){
if (produtos[i].codigo == codigo_digitado) {
printf("\nPreo: R$ %1.2f\n", produtos[i]. preco);
}
}
getchar();
return 0;
}

Resultado ao simular a execuo do programa


Campos: codigo-do-produto nome preco
Informe os dados do produto(1): 1
Informe os dados do produto(2): 2
Informe os dados do produto(3): 3
Informe os dados do produto(4): 4
Informe os dados do produto(5): 5
1
laranja R$ 1.40
2
rosquinha R$ 3.00
3
leite-moca R$ 4.50
4
farinha-de-trigo R$ 2.70
5
coxinha R$ 1.50
Informe o codigo do produto: 4
Preo: R$ 2.70

1.6.5

laranja 1.4
rosquinha 3
leite-moca 4.5
farinha-de-trigo 2.7
coxinha 1.5

Problema sobre gerenciamento de contas bancrias

Escreva um programa que simule contas bancrias, com as seguintes especificaes:


Ao iniciar o programa vamos criar contas bancrias para trs clientes.
Cada conta ter o nome e o CPF do cliente associado a ela.

Introduo Programao

20 / 30

No ato da criao da conta o cliente precisar fazer um depsito inicial.


Aps as contas serem criadas, o sistema dever possibilitar realizaes de saques ou depsitos nas
contas.
Sempre que uma operao de saque ou depsito seja realizada, o sistema dever imprimir o nome
do titular e o saldo final da conta.
Pseudo-cdigo do programa
REGISTRO Conta
numero_da_conta, cpf_do_cliente, saldo: NUMRICO
FIM_REGISTRO
REGISTRO Cliente
cpf: NUMRICO
nome: TEXTUAL
FIM_REGISTRO
QUANTIDADE_DE_CLIENTES = 3
DECLARA clientes: Cliente[QUANTIDADE_DE_CLIENTES]
DECLARA contas:
Conta[QUANTIDADE_DE_CLIENTES]
PARA i=0 AT QUANTIDADE_DE_CLIENTES FAA
LEIA clientes[i].cpf
LEIA clientes[i].nome
LEIA contas[i].saldo // depsito inicial
clientes[i].codigo = i
contas[i].numero_da_conta = i
contas[i].codigo_do_cliente = clientes[i].codigo
FIM_PARA
DECLARA operacao: TEXTUAL
DECLARA num_conta, valor, sair=0: NUMRICO
ENQUANTO sair == 0 FAA
LEIA operacao
SE operacao == "saque" OU operacao == "deposito" ENTO
LEIA num_conta, valor
PARA i=0 AT QUANTIDADE_DE_CLIENTES FAA
SE contas[i].numero_da_conta == num_conta ENTO
SE operacao == "saque" ENTO
contas[i].saldo = contas[i].saldo - valor
SE operacao == "deposito" ENTO
contas[i].saldo = contas[i].saldo + valor
PARA j=0 AT QUANTIDADE_DE_CLIENTES FAA
SE clientes[j].codigo == contas[i].codigo_do_cliente ENTO
ESCREVE clientes[j].nome, contas[i].saldo
FIM_PARA
FIM_PARA
SENO operacao == "sair" ENTO

Introduo Programao

21 / 30

sair = 1
FIM_ENQUANTO

Programa em C: code/registros/conta_bancaria.c
#include <stdio.h>
typedef struct {
char nome[256];
long long cpf;
} Cliente;
typedef struct {
long
numero_da_conta;
long
cpf_do_cliente;
double saldo;
} Conta;
#define QUANTIDADE_DE_CLIENTES 3
#define OPERACAO_SAQUE 1
#define OPERACAO_DEPOSITO 2
int main(){
Cliente clientes[QUANTIDADE_DE_CLIENTES];
Conta
contas[QUANTIDADE_DE_CLIENTES];
printf("Campos: cpf nome deposito-inicial\n");
for(long i=0; (i < QUANTIDADE_DE_CLIENTES); i++){
printf("\nDados para abertura da conta(%ld): ",i+1);
scanf("%Ld %s %lf",&clientes[i].cpf,clientes[i].nome,
&contas[i].saldo);
contas[i].numero_da_conta = i;
contas[i].cpf_do_cliente = clientes[i].cpf;
printf("\nCliente: %s Conta: %ld Saldo inicial: %1.2lf\n",
clientes[i].nome, contas[i].numero_da_conta, contas[i].saldo);
}
int operacao; // como ainda no aprendemos a comparar strings,
// vamos usar operao como numrico.
long num_conta;
double valor;
int sair=0; // FALSE
while (!sair){
printf("\nInforme a operao: 1-Saque 2-Deposito 3-Sair: ");
scanf("%d", &operacao);
if (operacao == OPERACAO_SAQUE || operacao == OPERACAO_DEPOSITO){
printf("\nInforme numero-da-conta e valor: ");
scanf("%ld %lf", &num_conta, &valor);
for(int i=0; (i < QUANTIDADE_DE_CLIENTES); i++){

Introduo Programao

22 / 30

if (contas[i].numero_da_conta == num_conta) {
if (operacao == OPERACAO_SAQUE){
contas[i].saldo -= valor;
printf("\nSAQUE: %1.2lf", valor);
}
if (operacao == OPERACAO_DEPOSITO){
contas[i].saldo += valor;
printf("\nDEPOSITO: %1.2lf", valor);
}
for(int j=0; j < QUANTIDADE_DE_CLIENTES; j++){
if (clientes[j].cpf == contas[i].cpf_do_cliente)
printf("\nCliente: %s Saldo atual: %1.2lf",
clientes[j].nome, contas[i].saldo);
}
}
}
}else{
sair = 1; // TRUE
}
}
getchar();
return 0;
}

Resultado ao simular a execuo do programa


Campos: cpf nome deposito-inicial
Dados para abertura da conta(1): 48755891748 Jesuno 1500
Cliente: Jesuno Conta: 0 Saldo inicial: 1500.00
Dados para abertura da conta(2): 72779162201 Maria 200
Cliente: Maria Conta: 1 Saldo inicial: 200.00
Dados para abertura da conta(3): 71443626406 Virgulino 600
Cliente: Virgulino Conta: 2 Saldo inicial: 600.00
Informe a operao: 1-Saque 2-Deposito 3-Sair: 1
Informe numero-da-conta e valor: 0 300
SAQUE: 300.00
Cliente: Jesuno Saldo atual: 1200.00
Informe a operao: 1-Saque 2-Deposito 3-Sair: 2
Informe numero-da-conta e valor: 2 400
DEPOSITO: 400.00
Cliente: Virgulino Saldo atual: 1000.00
Informe a operao: 1-Saque 2-Deposito 3-Sair: 3

Aps todos estes programas, agora vamos ver uma tcnica que no utilizada ainda, a inicializao de
registro com valores pr-definidos.

Introduo Programao

1.7

23 / 30

Inicializando registros

Quando declaramos uma varivel do tipo registro, tambm podemos realizar uma atribuio aos valores dos seus campos. O programa a seguir ilustra esta atribuio.
Ateno
Para a atribuio poder ocorrer, os campos precisam ser inseridos na ordem que foram
declarados no tipo do registro.

Programa em C: code/registros/reg_atribuicao.c
#include <stdio.h>
typedef struct {
int matricula; //
char nome[100];//
float nota1;
//
float nota2;
//
} Aluno;

x
x
3x
4x
1
2

typedef struct {
char nome[256];// 5x
long long cpf; // 6x
} Cliente;
int main() {
Aluno a = {15, "Virgulino da Silva", 9.0f, 10.0f}; // 7x
Cliente c = {"Maria Bonita", 72779162201}; // 8x
printf("Aluno: %s Mat.: %d Nota1: %1.2f Nota2: %1.2f\n",
a.nome, a.matricula, a.nota1, a.nota2);
printf("Cliente: %s CPF: %1Ld\n", c.nome,c.cpf);
return 0;
}
x, 2x, 3x, 4x, 7x Seguindo

a ordem da declarao do registro, matricula recebe 15, nome recebe


Virgulino da Silva, nota1 recebe 9 e nota2 recebe 10.

x, 6x, 8x Seguindo

a ordem da declarao do registro, nome recebe Maria Bonita e cpf recebe


72779162201.

Resultado ao simular a execuo do programa


Aluno: Virgulino da Silva Mat.: 15 Nota1: 9.00 Nota2: 10.00
Cliente: Maria Bonita CPF: 72779162201

Nota
O Registro um tipo de dado composto por campos com outros tipos. Mas ser que
possvel declarar um campo do tipo Registro? Veremos a resposta na prxima seo.

Introduo Programao

1.8

24 / 30

Composio de Registros

Na definio de registros (Seo 1.1 [1]), vimos que um Registro criado pela composio de outros tipos de dado. Agora veremos que podemos compor um Registro utilizando outros Registros
previamente definidos.
Cuidado
Ao realizar composio de registros, a definio do registro que ser utilizado na composio
precisa aparecer antes (no cdigo fonte) da definio do novo registro. Caso contrrio, voc
poder ter erros de compilao.

1.8.1

Triangulo

Nesta seo vamos definir um Registro triangulo que contm 3 campos do tipo Ponto.
Composio de registro em Pseudo-cdigo
REGISTRO Ponto
x, y: NUMRICO
FIM_REGISTRO
REGISTRO Triangulo
p1, p2, p3: Ponto
FIM_REGISTRO

Composio de registro em C: code/registros/reg_triangulo.c[]


#include <stdio.h>
typedef struct
int x;
int y;
} Ponto ;

typedef struct {
Ponto p1;
Ponto p2;
Ponto p3;
} Triangulo ;
int main() {
Triangulo t;
t.p1.x= 1; t.p1.y=0;
t.p2.x=-1; t.p2.y=0;
t.p3.x= 0; t.p3.y=1;
printf("Triangulo: (%d, %d), (%d, %d), (%d, %d).\n",
t.p1.x, t.p1.y, t.p2.x, t.p2.y, t.p3.x, t.p3.y);
return 0;
}

Introduo Programao

25 / 30

Nota
Neste exemplo, o registro do tipo Triangulo foi criado com campos do tipo Ponto, os trs
campos foram: p1, p2 e p3. Para acessar a coordenada x do primeiro ponto do Triangulo
t, chamamos: t.p1.x.
Foram dispostas duas atribuies de coordenadas numa mesma linha apenas para ficar
melhor visualmente, no h necessidade de serem assim.

1.8.2

Informao Pessoal

Nesta seo vamos definir um Registro InformacaoPessoal e utiliz-lo no Registro Aluno e


Cliente.
Composio de registro em Pseudo-cdigo
REGISTRO InformacaoPessoal
cep: NUMRICO
estado_civil: TEXTO
FIM_REGISTRO
REGISTRO Aluno
matricula: NUMRICO
nome: TEXTO
nota1, nota2: NUMRICO
info_pessoal: InformacaoPessoal
FIM_REGISTRO
REGISTRO Cliente
cpf: NUMRICO
nome: TEXTUAL
info_pessoal: InformacaoPessoal
FIM_REGISTRO

Composio de registro em C: code/registros/reg_infopessoal.c[]


#include <stdio.h>
typedef struct {
long long cep;
int estado_civil; // 1:Solteiro 2:Casado 3:Viuvo 4:Divorciado
} InformacaoPessoal;
typedef struct {
int matricula;
char nome[100];
float nota1;
float nota2;
InformacaoPessoal info_pessoal;
} Aluno;
typedef struct {
char nome[256];
long long cpf;

Introduo Programao

26 / 30

InformacaoPessoal info_pessoal;
} Cliente;
int main() {
Aluno a = {15, "Virgulino da Silva", 9.0f, 10.0f, {58051400,
1}};
Cliente c = {"Maria Bonita", 72779162201, {58051400, 2}};

printf("Aluno: %s %1Ld %d.\n", a.nome, a.info_pessoal.cep,


a.matricula);
printf("Cliente: %s %1Ld %1Ld.\n", c.nome, c.info_pessoal.cep,
c.cpf);
return 0;
}

Nota
A composio de Registro utilizada a sintaxe usual de declarao de campos. Uma vez que
definimos um novo tipo, basta utilizar o tipo na declarao normal do campo.
O acesso aos campos internos do registro passam pelo campo definido no registro externo,
por exemplo, para acessar o interno cep, primeiro precisamos referenciar o campo externo
info_pessoal, portanto o acesso fica: a.info_pessoal.cep.

Para finalizar nossos estudos sobre Registro, na seo seguinte vamos compar-lo com Arranjo.

1.9

Comparao entre Arranjo e Registro

A tabela a seguir mostra uma comparao entre Arranjos e Registros.


Arranjo (ou array)

Registro

Estrutura de dados homognia

Estrutura de dados heterognia

Arranjo de variveis referenciadas por um


mesmo nome e indexada por um inteiro.
Ex: notas[i].
Armazena vrios valores, mas todos do
mesmo tipo.

Coleo de variveis referencias por um


mesmo nome
Armazena vrios valores, e podem ser de
diferentes tipos
Cada valor armazenado num campo com
um tipo prprio

Introduo Programao

1.10

27 / 30

Recapitulando

Iniciamos este captulo conhecendo a definio de Registro e sua utilidade.


Em seguida aprendemos a sua sintaxe de criao. Vimos o que um campo identicador, e como ele
utilizado para diferenciar um registro de outro.
Realizamos anlises em 5 situaes demonstrando como criamos registros em cada uma delas.
Na Seo 1.6 [12] vimos como implementamos diversos programas em pseudo-cdigo e em C.
Por fim, aprendemos como um registro pode ser inicializado (Seo 1.7 [23]), comparamos os registros com os arranjos (Seo 1.9 [26]) e aprendemos como criar um registro atravs da composio de
outro (Seo 1.8 [24]).
No prximo captulo aprenderemos como reaproveitar cdigo, criando nossas prprias funes.

1.11

Atividades

1. Entendo a necessidade dos registros. Ns poderamos escrever os programas sem utilizar


registros. Qual a utilidade de se utilizar registros nos programas?
2. O que um campo identificador? D exemplos no contidos neste captulo.
3. Na Seo 1.4 [4] analisamos diversas situaes buscando os campos necessrios para criao
de Registros. Agora chegou a sua vez de fazer o mesmo, para cada situao a seguir faa:
Defina o(s) nome(s) do tipo de registro que voc criar
Especifique os campos com seus respectivos tipos
Indique qual so os campos identificadores, caso exista
Escreva as declaraes do(s) Registro(s) em C
a. Um programa para registrar os animais e os clientes de um Petshop.
b. Um programa para registrar e consultar filmes.
c. Um programa para uma biblioteca registrar os seus livros.
d. Um programa para agendar e consultar compromissos.
4. Pratique o uso de registros. Utilizando os registros definidos no captulo, faa pequenos
programas e teste com as entradas indicadas.3
a. Utilizando o Registro em C: code/registros/reg_aluno.c [5], faa um programa que indique
a situao de cada Aluno: Aprovado, se mdia das notas for maior ou igual 5; Reprovado
se a mdia for inferior a 5; Aprovado com meno de honra se mdia for superior ou
igual a 9.
Entrada: nome matricula nota1 nota2
Maria 12887398 7.0 9.0
Jesuno 12887399 3.5 6.0
Virgulino 12887400 10.0 8.0
3 Testar com valores pr-definidos facilita o desenvolvimento dos programas, faa disso um hbito. Veremos mais
adiante como redirecionar a entrada do programa, facilitando ainda mais os testes.

Introduo Programao

28 / 30

b. Utilizando o Registro em C: code/registros/reg_pessoa.c [6], escreva um programa que


imprima o IMC das mulheres, depois os dos homens. Quando imprimir o IMC, exiba uma
mensagem indicao a condio em que a pessoa se encontra, segundo a tabela a seguir.
IMC
abaixo de 18,5
entre 18,6 e 24,9
entre 25,0 e 29,9
entre 30,0 e 34,9
entre 35,0 e 39,9
acima de 40

Classificao
Subnutrido ou abaixo do peso
Peso ideal (parabns)
Levemente acima do peso
Primeiro grau de obesidade
Segundo grau de obesidade
Obesidade mrbida

Entrada: nome altura peso cpf sexo


Jesuno 1.82 79 48755891748 m
Maria 1.66 52 72779162201 f
Virgulino 1.75 80 71443626406 m

c. Utilizando o Registro em C: code/registros/reg_ponto.c [7], escreva um programa que leia


alguns pontos, indicando em qual quadrante eles esto no plano cartesiano.
Entrada: p1.x p1.y p2.x p2.y p3.x p3.y
1 3
-2 4
-3 -3
2 -5
4 0

d. Utilizando o Registro em C: code/registros/reg_protudo.c [8], escreva um programa que


cadastra uma lista de produtos. Em seguida imprima os produtos ordenadamente pelo
menor preo.
Entrada: codigo nome valor
11
12
13
14
15

laranja 1.4
rosquinha 3
leite-moca 4.5
farinha-de-trigo 2.7
coxinha 1.5

5. Criando novos Registros. Agora que voc j praticou a utilizao de Registro est no momento
de criar os seus prprios Registros.
Importante
As questes a seguir no especificam os programas minuciosamente, elas foram elaboradas assim para permitir que voc expresse a sua criatividade. No entanto, voc
deve:
Resolver as questes utilizando os conhecimentos adquiridos neste captulo
Utilizar composio de registros quando for apropriado
Preparar valores de entradas fixos para o seu programa, de forma a test-lo eficientemente.

Introduo Programao

29 / 30

a. Faa um programa para um Petshop, para cadastrar os clientes da loja e seus animais. O
programa deve possibilitar pesquisa pelo cliente ou pelo seu animal.
b. Faa um programa para gerenciar os gastos pessoais. O programa deve poder registrar os
gastos por categoria e emitir um relatrio para proporcionar um controle financeiro.
c. Faa um programa para registrar os filmes que voc assistiu ou quer assistir. Os filmes
devem ser cadastrados por categorias. O programa deve emitir listas de filmes com base
em dois critrios sua escolha.
d. Faa um programa para auxiliar a Policia Federal acompanhar as exploses de caixas
eletrnicos ao longo do tempo. Aps cadastrar as exploses, o sistema deve informar as
regies crticas.
e. Faa um programa para simular um dicionrio. Ele deve cadastrar algumas palavras e
possibilitar alguma forma de navegao. Consulte um dicionrio real para verificar que
alm do significado da palavra, outras informaes diferentes tambm so cadastradas.

Introduo Programao

Captulo 2
ndice Remissivo
C
Campo Identificador, 3
P
persistncia, 2
R
Registro, 1
sintaxe, 3
relacionamento, 9
S
sintaxe, 3
T
Tipo de dado, 3

30 / 30

Você também pode gostar