Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo Programao
por Bruno Jefferson, Jorge Dias, e Eduardo Santana Medeiros
Ed. v1.0
Introduo Programao
ii
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
1.3
Identificadores de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.5
1.5.1
Aluno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
1.5.2
Produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
1.5.3
Pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.6.1
12
1.6.2
14
1.6.3
16
1.6.4
18
1.6.5
19
1.7
Inicializando registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
1.8
Composio de Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
1.8.1
Triangulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
1.8.2
Informao Pessoal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
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
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.
Introduo Programao
1.2
3 / 30
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
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
1.3
Identificadores de registros
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
Na prxima seo, faremos anlises em algumas situaes, caso voc no tenha compreendido o que
so campos identificadores ter outra oportunidade.
1.4
1.4.1
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
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
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
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
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
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
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
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
Como atribuir valores de texto aos campos do registro. Voc j estudou a funo strcpy antes.
x, 6x Como
1.5.2
Produto
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.
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
Introduo Programao
pontos[2].x =
12 / 30
5; pontos[2].y =
3;// 5x
x, 4x, 5x Como
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
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
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;
}
Introduo Programao
14 / 30
1.6.2
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
x, 3x Pesquisa
Programa em C: code/registros/imc_calculo.c
#include <stdio.h>
typedef struct{
char nome[100];
Introduo Programao
15 / 30
x, 3x Pesquisa
os dados
os dados
os dados
o CPF da
Introduo Programao
Sexo
f
Nome
Maria
1.6.3
16 / 30
IMC
18.87
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
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
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;
}
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
1.6.4
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
1.6.5
laranja 1.4
rosquinha 3
leite-moca 4.5
farinha-de-trigo 2.7
coxinha 1.5
Introduo Programao
20 / 30
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;
}
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
x, 6x, 8x Seguindo
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
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
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}};
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
Registro
Introduo Programao
1.10
27 / 30
Recapitulando
1.11
Atividades
Introduo Programao
28 / 30
Classificao
Subnutrido ou abaixo do peso
Peso ideal (parabns)
Levemente acima do peso
Primeiro grau de obesidade
Segundo grau de obesidade
Obesidade mrbida
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