Introdução à Programação

Embed Size (px)

DESCRIPTION

ntrodução à Programação por Bruno Jefferson, Jorge Dias, e Eduardo Santana Medeiros

Citation preview

  • Introduo Programao i

    Introduo Programaopor 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 node 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 destaobra, voc poder distribuir a obra resultante apenas sob a mesma licena, ou sob uma licenasimilar 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 SIGNATURE

    WRITTEN BY Bruno Jefferson,Jorge Dias, e

    Eduardo SantanaMedeiros

    13 de junho de 2013

    REVISION HISTORY

    NUMBER DATE DESCRIPTION NAME

    v1.0 Maro 2013 Primeira verso do livro Bruno Jeffersonde Sousa

  • Introduo Programao iv

    Sumrio

    1 Registros 1

    1.1 Definio de registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    1.2 Sintaxe para criao de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    1.3 Identificadores de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    1.4 Anlise para criao de Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

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

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

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

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

    1.4.5 Situao sobre gerenciamento de contas bancrias . . . . . . . . . . . . . . 8

    1.5 Exemplos de utilizao dos Registros . . . . . . . . . . . . . . . . . . . . . . . . . 9

    1.5.1 Aluno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    1.5.2 Produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    1.5.3 Pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.6 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

    1.9 Comparao entre Arranjo e Registro . . . . . . . . . . . . . . . . . . . . . . . . . 26

    1.10 Recapitulando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    1.11 Atividades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    2 ndice Remissivo 30

  • Introduo Programao 1 / 30

    Captulo 1

    Registros

    OBJETIVOS 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 declar-los em C. Depois vamos analisar diversas situaes para aprender como o processo de criao deum registro.

    Sero apresentados alguns programas demonstrando a utilizao dos registros e por fim, vamos apren-der como compor registros a partir de outros registros.

    Mas, o que so Registros?

    1.1 Definio de registro

    Definio de RegistroUm Registro um tipo de dado criado pelo usurio, atravs da composio de outros tipos dedados.

    Ns utilizamos registros quando desejamos criar um tipo de dado para reunir informaes sobre o quedesejamos 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] nstemos um exemplo de formulrio para cadastrar Clientes. Os campos do formulrio so preenchidoscom os dados do cliente que nos interessa registrar.

    Sabendo as informaes que desejamos registrar sobre um Cliente, ns podemos esquematizar umregistro, 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: Telefone para contato:CPF: RG:

    Tabela 1.2: Representao de um registro Cliente

    Novo tipo Campo Tipo do campo

    Cliente

    Nome TextualData de Nascimento NumricoTelefone para contato TextualCPF H NumricoRG Numrico

    RelembrandoEm nossos programas ns utilizamos varivies para manter as informaes que desejamosmanipular.No momento da criao de uma varivel precisamos especificar o tipo de dado que de-sejamos que ela mantenha, atravs da declarao da varivel. Vamos relembrar comodeclaramos variveis:Em pseudo-cdigo

    DECLARE nome_da_variavel: TEXTUALDECLARE 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 todaselas possuem o mesmo tipo.

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

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

  • Introduo Programao 3 / 30

    1.2 Sintaxe para criao de registros

    Agora que temos o entendimento que um registro um tipo de dado, vamos conhecer a sintaxe paraespecific-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 composioficar 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 realizadada 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 identificarunicamente um registro.

    ImportanteA palavra registro pode ser empregada em dois contextos diferentes.

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

    Instncia do registroUtilizando a analogia do formulrio, equivaleria s fichas dos clientes. Cada ficha pre-enchida 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 dequalquer outro.

    No registro indicado na tabela Tabela 1.2 [2], como podemos diferenciar um cliente cadastrado deoutro? Qual campo identifica um cliente? Seria o nome? Data de Nascimento? Telefone? CPF ouRG? Neste caso, preferimos utilizar o CPF, pois sabemos que duas pessoas diferentes no podempossuir o mesmo nmero de CPF.

    Em nosso livro os campos identificadores esto marcados com H.

    NotaO identificadores costumam ser do tipo inteiro, pois a comparao de inteiros mais rpidado que comparao textual.

    Na prxima seo, faremos anlises em algumas situaes, caso voc no tenha compreendido o queso 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 mdiasde todos eles, como seria um registro para representar esta situao?

    Nome do RegistroAluno

    CamposObviamente vamos precisar guardar duas notas para cada aluno. Vamos precisar guardar amdia tambm? No, uma vez que temos as duas notas registradas, sempre que desejarmosconsultar a mdia poderemos calcul-las. O nome do aluno seria uma informao til? Semdvidas! Ser importante registrar o nome do aluno pois poderamos imprimir uma lista comos nomes, notas e mdias de cada aluno. A matrcula do aluno importante tambm? Nspoderamos 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 setivssemos dois alunos com o mesmo nome? Ns precisamos de um informao extra paraidentificar e diferenciar um aluno do outro. Com este intuito, vamos optar por registrar amatrcula tambm. O nome da disciplina importante? Neste caso no, pois estamos noslimitando aos alunos e suas notas.

  • Introduo Programao 5 / 30

    Novo tipo Campo Tipo do campo

    Aluno

    matricula H Numriconome Textualnota1 Numriconota2 Numrico

    Registro em Pseudo-cdigoREGISTRO Alunomatricula: NUMRICOnome: TEXTOnota1, nota2: NUMRICO

    FIM_REGISTRO

    Registro em C: code/registros/reg_aluno.ctypedef struct {

    int matricula;char nome[100];float nota1;float nota2;

    } Aluno;

    NotaAt agora voc teve dificuldade para entender esta anlise? Voc compreendeu a necessi-dade da utilizao de matrcula como campo identificador? Concordou com os tipos dedados 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 IMCdelas.

    Nome do RegistroPessoa

    CamposPara 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 juntocom 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? Poderamosutilizar 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 apresentarum lista com todas as pessoas com aquele primeiro nome e selecionar a pessoa correta entreelas.1 Se cadastrarmos o CPF da pessoa poderamos consult-la mais tarde informando apenasele, simplificando a busca. Por ltimo, como algumas tabelas do IMC apresentam os dadoscategorizados por sexo, vamos registr-lo tambm.

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

  • Introduo Programao 6 / 30

    Novo tipo Campo Tipo do campo

    Pessoa

    nome Textualpeso Numricoaltura Numricocpf H Numricosexo Textual

    Registro em Pseudo-cdigoREGISTRO Pessoanome, sexo: TEXTOpeso, altura, cpf: NUMRICO

    FIM_REGISTRO

    Registro em C: code/registros/reg_pessoa.ctypedef struct{

    char nome[100];char sexo; // m: masculino, f: feminofloat peso;float altura;long long cpf;

    } Pessoa;

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

    cpfDeclaramos ele como long long pois os tipos long e int no armazenam nmerosna ordem de 11 dgitos.

    sexoOptamos por utilizar o tipo char para simplificar comparaes, caso seja necessrias.Poderamos declar-lo do tipo int, fazendo uma correspondncia de valores: 1=Femi-nino 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 RegistroPonto

    CamposPara registrar um ponto no plano cartesiano basta informar os valores de suas coordenadas (x,y).

  • Introduo Programao 7 / 30

    Novo tipo Campo Tipo do campo

    Ponto xH NumricoyH Numrico

    Registro em Pseudo-cdigo

    REGISTRO Pontox, y: NUMRICO

    FIM_REGISTRO

    Registro em C: code/registros/reg_ponto.c

    typedef struct{int x;int y;

    } Ponto;

    NotaNeste registro ns temos uma novidade: estamos utilizando dois campos como identifica-dores simultaneamente. As vezes um nico campo s no suficiente para identificar umregistro.Neste caso, fica evidente que dois pontos so iguais se e somente se eles possurem osmesmo valores para o par (x,y).Voc concorda com os tipos de dados apresentados aqui? No achou estranho cpf ser dotipo 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 floatou double? Mais uma vez, aqui no h certo ou errado, ns optamos por int apenas porser 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 seuspreos.

    Nome do RegistroProduto

    CamposPara registrar um produto vamos precisar do seu nome e o seu preo. Mas como identificarum produto cadastrado? Quando vamos no supermercado e compramos alguma mercadoriano 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 nossaaplicao vamos utilizar este mesmo cdigo para identificar unicamente cada produto.

    Novo tipo Campo Tipo do campo

    Produtonome Textualpreco Numrico

    codigo H Numrico

  • Introduo Programao 8 / 30

    Registro em Pseudo-cdigo

    REGISTRO Produtocodigo: NUMRICOnome: TEXTUALpreco: NUMRICO

    FIM_REGISTRO

    Registro em C: code/registros/reg_protudo.c

    typedef struct {long codigo;char nome[100];float preco;

    } Produto;

    NotaNeste registro tivemos contato com um provvel campo identificador universal, o codigo.Geralmente, quando nos deparamos com um campo cdigo, ele ser utilizado como o iden-tificador.a

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

    1.4.5 Situao sobre gerenciamento de contas bancrias

    Nesta situao desejamos criar um sistema bancrio para gerenciar clientes e suas contas bancrias.

    Nomes dos RegistrosCliente e Conta.

    CamposO nome do cliente uma informao relevante. O CPF poder ser utilizado para diferenciarclientes com o mesmo nome. Como identificar a conta do cliente? Cada conta poderia ter umnmero de conta nico, que serviria para identificar a conta do cliente. Cada conta ter umsaldo, que ser gerenciada pelo sistema. Como cada cliente pode possuir mais de uma contabancria, junto com a conta deveremos registrar qual cliente o dono dela. Vamos utilizar oCPF do cliente na conta para identificar o seu dono.

    Novo tipo Campo Tipo do campo

    Contanumero_da_conta

    H

    Numrico

    saldo Numricocpf_do_cliente Numrico

    Registro em Pseudo-cdigoREGISTRO Contanumero_da_conta, cpf_do_cliente, saldo: NUMRICO

    FIM_REGISTRO

  • 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 Campo Tipo do campo

    Cliente nome Textualcpf H Numrico

    Registro em Pseudo-cdigoREGISTRO Clientecpf: NUMRICOnome: TEXTUAL

    FIM_REGISTRO

    Registro em C: code/registros/reg_cliente.ctypedef struct {

    char nome[256];long long cpf;

    } Cliente;

    NotaNesta situao temos outras novidades: a criao de dois Registros e utilizao de umcampo para registrar o relacionamento entre os dois registros.a

    Percebam que cpf o campo identificador de Cliente. Para identificar que uma conta deum 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.

    aRelacionamento entre registros um assunto que est fora do escopo de uma disciplina de Introduo aProgramao, 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 exemplosvoc 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 10 / 30

    1.5.1 Aluno

    Exemplo de utilizao do registro Aluno.

    code/registros/reg_aluno_exemplo.c#include #include

    typedef struct {int matricula;char nome[100];float nota1;float nota2;

    } Aluno;

    int main(){Aluno aluno;aluno.matricula = 201328; // x1strncpy(aluno.nome, "Maria Bonita", sizeof(aluno.nome)); // x2aluno.nota1 = 8.0; // x3aluno.nota2 = 9.0; // x4printf("\n%d %s %1.2f %1.2f", aluno.matricula, aluno.nome, // x5

    aluno.nota1, aluno.nota2); // x6getchar();return 0;

    }

    x1 , x3 , x4 Como atribuir valores aos campos do registro.x2 Como atribuir valores de texto aos campos do registro. Voc j estudou a funo strcpy antes.x5 , x6 Como acessar valores atribudos aos campos do registro.Resultado ao simular a execuo do programa201328 Maria Bonita 8.00 9.00

    1.5.2 Produto

    Exemplo de utilizao do registro Produto.

    code/registros/reg_produto_exemplo.c#include

    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); // x1if (p.preco < 4)

    printf("\nProduto em promocao: %s R$ %1.2f", p.nome, p .preco);

    elseprintf("\nProduto cadastrado.");

    getchar();return 0;

    }

    x1 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 ausnciade & antes do campo nome.

    Resultado ao simular a execuo do programaProduto em promocao: banana R$ 3.99

    AtenoPercebam que quando atribumos um valor de texto aos campos do tipo char[], ns supri-mimos 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 #include

    typedef struct{int x;int y;

    } Ponto;

    #define QUANTIDADE_DE_PONTOS 3 // x1int main(){

    Ponto pontos[QUANTIDADE_DE_PONTOS]; // x2pontos[0].x = -4; pontos[0].y = 7;// x3pontos[1].x = 2; pontos[1].y = -9;// x4

  • Introduo Programao 12 / 30

    pontos[2].x = 5; pontos[2].y = 3;// x5for (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;

    }

    x1 Declarao de constante que definir o tamanho do arranjo.x2 Como declarar um arranjo de registros do tipo Ponto, com o tamanho definido pela constanteQUANTIDADE_DE_PONTOS.x3 , x4 , x5 Como acessar um campo em arranjo de registros. Cada posio, do arranjo contm umregistro. Voc pode acessar as posies do arranjo com a mesma sintaxe: [ndice].

    Resultado ao simular a execuo do programaPonto 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 escreverum 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 seguidaimprima a matrcula, o nome e a mdia de cada um deles.

    Pseudo-cdigo do programaREGISTRO Alunomatricula: NUMRICOnome: TEXTOnota1, nota2: NUMRICO

    FIM_REGISTRO

    QUANTIDADE_DE_ALUNOS = 3DECLARA alunos: Aluno[QUANTIDADE_DE_ALUNOS]

    PARA i=0 AT QUANTIDADE_DE_ALUNOS FAALEIA alunos[i].nomeLEIA alunos[i].matricula

  • Introduo Programao 13 / 30

    LEIA alunos[i].nota1LEIA alunos[i].nota2

    FIM_PARA

    PARA i=0 AT QUANTIDADE_DE_ALUNOS FAAESCREVA alunos[i].matriculaESCREVA alunos[i].nomeESCREVA (alunos[i].nota1 + alunos[i].nota2)/2 x1

    FIM_PARA

    x1 Imprime a mdia calculada.Programa em C: code/registros/calculo_das_medias.c

    #include

    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.5Informe os dados do aluno(2): Maria 2887398 7.0 9.0Informe os dados do aluno(3): Virgulino 2887400 10.0 8.0Matricula Nome Media2887399 Jesuno 6.752887398 Maria 8.002887400 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. Comos dados cadastrados, em seguida localizar uma pessoas atravs do seu CPF e imprimir o seu IMC.

    Pseudo-cdigo do programa

    REGISTRO Pessoanome, sexo: TEXTOpeso, altura, cpf: NUMRICO

    FIM_REGISTRO

    QUANTIDADE_DE_PESSOAS = 3

    PARA i=0 AT QUANTIDADE_DE_PESSOAS FAALEIA pessoas[i].nomeLEIA pessoas[i].alturaLEIA pessoas[i].pesoLEIA pessoas[i].cpfLEIA pessoas[i].sexo

    FIM-PARA

    DECLARA cpf_localizador: NUMRICOLEIA cpf_localizador x1PARA i=0 AT QUANTIDADE_DE_PESSOAS FAA x2SE pessoas[i].cpf == cpf_localizador ENTO x3

    ESCREVE pessoas[i].nomeESCREVE pessoas[i].sexo// IMC = peso / (altura * altura)ESCREVE pessoas[i].peso / (pessoas[i].altura * pessoas[i].altura)

    FIM-PARA

    x1 O ler o campo identificador de Pessoa (CPF).x2 , x3 Pesquisa pelo registro Pessoa identificado pelo CPF lido.Programa em C: code/registros/imc_calculo.c

    #include

    typedef struct{char nome[100];

  • Introduo Programao 15 / 30

    char sexo; // m: masculino, f: feminofloat 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); // x1printf("\nSexo\tNome\tIMC");for(int i=0; (i < QUANTIDADE_DE_PESSOAS); i++){ // x2

    if (cpf_localizador == pessoas[i].cpf){ // x3float 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;

    }

    x1 O ler o campo identificador de Pessoa (cpf).x2 , x3 Pesquisa pelo registro Pessoa identificado pelo CPF lido.Resultado ao simular a execuo do programa

    Campos: nome, altura, peso, cpf, sexo

    Informe os dados da pessoa(1): Jesuno 1.82 79 48755891748 mInforme os dados da pessoa(2): Maria 1.66 52 72779162201 fInforme os dados da pessoa(3): Virgulino 1.75 80 71443626406 mInforme o CPF da pessoa: 72779162201

  • Introduo Programao 16 / 30

    Sexo Nome IMCf Maria 18.87

    1.6.3 Problema de pontos no plano cartesiano

    Escrever um programa que leia 5 pontos. Em seguida imprima qual o ponto mais prximo do primeiroponto lido.

    Pseudo-cdigo do programa

    REGISTRO Pontox, y: NUMRICO

    FIM_REGISTRO

    QUANTIDADE_DE_PONTOS = 5

    PARA i=0 AT QUANTIDADE_DE_PONTOS FAALEIA p[i].xLEIA p[i].y

    FIM_PARA

    menor_distancia_ao_quadrado = MAIOR_INTEIRO x1ponto_mais_proximo = 1 x2PARA i=1 AT QUANTIDADE_DE_PONTOS FAAdistancia_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) x3

    SE distancia_ao_quadrado < menor_distancia_ao_quadrado ENTO x4ponto_mais_proximo = i x5menor_distancia_ao_quadrado = distancia_ao_quadrado x6

    FIM_PARA

    ESCREVA p[ponto_mais_proximo].x,p[ponto_mais_proximo].y

    x1 , x4 , x6 MAIOR_INTEIRO representa o maior nmero inteiro que podemos armazenarnuma varivel. Geralmente atribuimos o maior inteiro quando procuramos por ummenor valor. No cdigo, comparamos menor_distancia_ao_quadrado comdistancia_ao_quadrado e salvamos o menor deles. Se executarmos isso sucessiva-mente, ao final, menor_distancia_ao_quadrado conter o menor valor comparado.2x2 , x5 Esta varivel ir guardar a posio do ponto mais prximo. Ela atualizada, sempre queencontramos outro ponto com menor distncia.x3 Calculo para encontrar a distncia entre dois pontos. Na realizadade, a distncia entre os doispontos seria a raiz de distancia_ao_quadrado. Mas no h diferena em comparar adistncia ao quadrado. Sabemos, por exemplo, que a raiz de x menor do que a raiz de y sex for menor do que y.

    2Caso tivssemos inicializado a varivel menor_distancia_ao_quadrado com 0, ao compar-lo com outronmero, ele seria o menor, impossibilitando encontrar a menor distncia.

  • Introduo Programao 17 / 30

    Programa em C: code/registros/ponto_proximo.c

    #include #include // 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 inteiroint 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 as coordenadas do ponto(1): 0 0Informe as coordenadas do ponto(2): 4 6Informe as coordenadas do ponto(3): 6 1Informe as coordenadas do ponto(4): 5 3Informe as coordenadas do ponto(5): 7 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 enome da cada produto. Por ltimo, consulte o preo de um produto atravs de seu cdigo.

    Pseudo-cdigo do programaREGISTRO Produtocodigo: NUMRICOnome: TEXTUALpreco: NUMRICO

    FIM_REGISTRO

    QUANTIDADE_DE_PRODUTOS = 5DECLARA produtos: Produto[QUANTIDADE_DE_PRODUTOS]

    PARA i=0 AT QUANTIDADE_DE_PRODUTOS FAALEIA produtos[i].codigoLEIA produtos[i].nomeLEIA produtos[i].preco

    FIM_PARA

    PARA i=0 AT QUANTIDADE_DE_PRODUTOS FAAESCREVA produtos[i].codigoESCREVA produtos[i].nome

    FIM_PARA

    DECLARA codigo_digitado: NUMRICOLEIA codigo_digitado

    PARA i=0 AT QUANTIDADE_DE_PRODUTOS FAASE produtos[i].codigo == codigo_digitado ENTO

    ESCREVA produtos[i].precoFIM_PARA

    Programa em C: code/registros/supermercado.c#include

    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 laranja 1.4Informe os dados do produto(2): 2 rosquinha 3Informe os dados do produto(3): 3 leite-moca 4.5Informe os dados do produto(4): 4 farinha-de-trigo 2.7Informe os dados do produto(5): 5 coxinha 1.51 laranja R$ 1.402 rosquinha R$ 3.003 leite-moca R$ 4.504 farinha-de-trigo R$ 2.705 coxinha R$ 1.50Informe o codigo do produto: 4Preo: R$ 2.70

    1.6.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 nascontas.

    Sempre que uma operao de saque ou depsito seja realizada, o sistema dever imprimir o nomedo titular e o saldo final da conta.

    Pseudo-cdigo do programa

    REGISTRO Contanumero_da_conta, cpf_do_cliente, saldo: NUMRICO

    FIM_REGISTRO

    REGISTRO Clientecpf: NUMRICOnome: TEXTUAL

    FIM_REGISTRO

    QUANTIDADE_DE_CLIENTES = 3DECLARA clientes: Cliente[QUANTIDADE_DE_CLIENTES]DECLARA contas: Conta[QUANTIDADE_DE_CLIENTES]

    PARA i=0 AT QUANTIDADE_DE_CLIENTES FAALEIA clientes[i].cpfLEIA clientes[i].nomeLEIA contas[i].saldo // depsito inicial

    clientes[i].codigo = icontas[i].numero_da_conta = icontas[i].codigo_do_cliente = clientes[i].codigo

    FIM_PARA

    DECLARA operacao: TEXTUALDECLARA num_conta, valor, sair=0: NUMRICO

    ENQUANTO sair == 0 FAALEIA operacao

    SE operacao == "saque" OU operacao == "deposito" ENTOLEIA num_conta, valorPARA i=0 AT QUANTIDADE_DE_CLIENTES FAA

    SE contas[i].numero_da_conta == num_conta ENTOSE operacao == "saque" ENTO

    contas[i].saldo = contas[i].saldo - valorSE operacao == "deposito" ENTO

    contas[i].saldo = contas[i].saldo + valorPARA j=0 AT QUANTIDADE_DE_CLIENTES FAA

    SE clientes[j].codigo == contas[i].codigo_do_cliente ENTOESCREVE clientes[j].nome, contas[i].saldo

    FIM_PARAFIM_PARA

    SENO operacao == "sair" ENTO

  • Introduo Programao 21 / 30

    sair = 1FIM_ENQUANTO

    Programa em C: code/registros/conta_bancaria.c

    #include

    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 1500Cliente: Jesuno Conta: 0 Saldo inicial: 1500.00

    Dados para abertura da conta(2): 72779162201 Maria 200Cliente: Maria Conta: 1 Saldo inicial: 200.00

    Dados para abertura da conta(3): 71443626406 Virgulino 600Cliente: Virgulino Conta: 2 Saldo inicial: 600.00

    Informe a operao: 1-Saque 2-Deposito 3-Sair: 1Informe numero-da-conta e valor: 0 300SAQUE: 300.00Cliente: Jesuno Saldo atual: 1200.00Informe a operao: 1-Saque 2-Deposito 3-Sair: 2Informe numero-da-conta e valor: 2 400DEPOSITO: 400.00Cliente: Virgulino Saldo atual: 1000.00Informe a operao: 1-Saque 2-Deposito 3-Sair: 3

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

  • Introduo Programao 23 / 30

    1.7 Inicializando registros

    Quando declaramos uma varivel do tipo registro, tambm podemos realizar uma atribuio aos va-lores dos seus campos. O programa a seguir ilustra esta atribuio.

    AtenoPara a atribuio poder ocorrer, os campos precisam ser inseridos na ordem que foramdeclarados no tipo do registro.

    Programa em C: code/registros/reg_atribuicao.c#include

    typedef struct {int matricula; // x1char nome[100];// x2float nota1; // x3float nota2; // x4

    } Aluno;

    typedef struct {char nome[256];// x5long long cpf; // x6

    } Cliente;

    int main() {Aluno a = {15, "Virgulino da Silva", 9.0f, 10.0f}; // x7Cliente c = {"Maria Bonita", 72779162201}; // x8printf("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;}

    x1 , x2 , x3 , x4 , x7 Seguindo a ordem da declarao do registro, matricula recebe 15, nome recebeVirgulino da Silva, nota1 recebe 9 e nota2 recebe 10.x5 , x6 , x8 Seguindo a ordem da declarao do registro, nome recebe Maria Bonita e cpf recebe72779162201.

    Resultado ao simular a execuo do programaAluno: Virgulino da Silva Mat.: 15 Nota1: 9.00 Nota2: 10.00Cliente: Maria Bonita CPF: 72779162201

    NotaO 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 24 / 30

    1.8 Composio de Registros

    Na definio de registros (Seo 1.1 [1]), vimos que um Registro criado pela composio de ou-tros tipos de dado. Agora veremos que podemos compor um Registro utilizando outros Registrospreviamente definidos.

    CuidadoAo realizar composio de registros, a definio do registro que ser utilizado na composioprecisa aparecer antes (no cdigo fonte) da definio do novo registro. Caso contrrio, vocpoder 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-cdigoREGISTRO Ponto

    x, y: NUMRICOFIM_REGISTRO

    REGISTRO Triangulop1, p2, p3: Ponto

    FIM_REGISTRO

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

    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

    NotaNeste exemplo, o registro do tipo Triangulo foi criado com campos do tipo Ponto, os trscampos foram: p1, p2 e p3. Para acessar a coordenada x do primeiro ponto do Triangulot, chamamos: t.p1.x.Foram dispostas duas atribuies de coordenadas numa mesma linha apenas para ficarmelhor 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 eCliente.

    Composio de registro em Pseudo-cdigoREGISTRO InformacaoPessoalcep: NUMRICOestado_civil: TEXTO

    FIM_REGISTRO

    REGISTRO Alunomatricula: NUMRICOnome: TEXTOnota1, nota2: NUMRICOinfo_pessoal: InformacaoPessoal

    FIM_REGISTRO

    REGISTRO Clientecpf: NUMRICOnome: TEXTUALinfo_pessoal: InformacaoPessoal

    FIM_REGISTRO

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

    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;}

    NotaA composio de Registro utilizada a sintaxe usual de declarao de campos. Uma vez quedefinimos 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 externoinfo_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

    Arranjo de variveis referenciadas por ummesmo nome e indexada por um inteiro.Ex: notas[i].

    Armazena vrios valores, mas todos domesmo tipo.

    Estrutura de dados heterognia

    Coleo de variveis referencias por ummesmo nome

    Armazena vrios valores, e podem ser dediferentes tipos

    Cada valor armazenado num campo comum tipo prprio

  • Introduo Programao 27 / 30

    1.10 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 regis-tros com os arranjos (Seo 1.9 [26]) e aprendemos como criar um registro atravs da composio deoutro (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 utilizarregistros. 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 criaode 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 pequenosprogramas e teste com as entradas indicadas.3

    a. Utilizando o Registro em C: code/registros/reg_aluno.c [5], faa um programa que indiquea situao de cada Aluno: Aprovado, se mdia das notas for maior ou igual 5; Reprovadose a mdia for inferior a 5; Aprovado com meno de honra se mdia for superior ouigual a 9.Entrada: nome matricula nota1 nota2Maria 12887398 7.0 9.0Jesuno 12887399 3.5 6.0Virgulino 12887400 10.0 8.0

    3Testar com valores pr-definidos facilita o desenvolvimento dos programas, faa disso um hbito. Veremos maisadiante 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 queimprima o IMC das mulheres, depois os dos homens. Quando imprimir o IMC, exiba umamensagem indicao a condio em que a pessoa se encontra, segundo a tabela a seguir.

    IMC Classificaoabaixo de 18,5 Subnutrido ou abaixo do pesoentre 18,6 e 24,9 Peso ideal (parabns)entre 25,0 e 29,9 Levemente acima do pesoentre 30,0 e 34,9 Primeiro grau de obesidadeentre 35,0 e 39,9 Segundo grau de obesidadeacima de 40 Obesidade mrbida

    Entrada: nome altura peso cpf sexoJesuno 1.82 79 48755891748 mMaria 1.66 52 72779162201 fVirgulino 1.75 80 71443626406 m

    c. Utilizando o Registro em C: code/registros/reg_ponto.c [7], escreva um programa que leiaalguns pontos, indicando em qual quadrante eles esto no plano cartesiano.Entrada: p1.x p1.y p2.x p2.y p3.x p3.y1 3-2 4-3 -32 -54 0

    d. Utilizando o Registro em C: code/registros/reg_protudo.c [8], escreva um programa quecadastra uma lista de produtos. Em seguida imprima os produtos ordenadamente pelomenor preo.Entrada: codigo nome valor11 laranja 1.412 rosquinha 313 leite-moca 4.514 farinha-de-trigo 2.715 coxinha 1.5

    5. Criando novos Registros. Agora que voc j praticou a utilizao de Registro est no momentode criar os seus prprios Registros.

    ImportanteAs questes a seguir no especificam os programas minuciosamente, elas foram ela-boradas assim para permitir que voc expresse a sua criatividade. No entanto, vocdeve:

    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 eficien-temente.

  • Introduo Programao 29 / 30

    a. Faa um programa para um Petshop, para cadastrar os clientes da loja e seus animais. Oprograma deve possibilitar pesquisa pelo cliente ou pelo seu animal.

    b. Faa um programa para gerenciar os gastos pessoais. O programa deve poder registrar osgastos 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 filmesdevem ser cadastrados por categorias. O programa deve emitir listas de filmes com baseem dois critrios sua escolha.

    d. Faa um programa para auxiliar a Policia Federal acompanhar as exploses de caixaseletrnicos ao longo do tempo. Aps cadastrar as exploses, o sistema deve informar asregies crticas.

    e. Faa um programa para simular um dicionrio. Ele deve cadastrar algumas palavras epossibilitar alguma forma de navegao. Consulte um dicionrio real para verificar quealm do significado da palavra, outras informaes diferentes tambm so cadastradas.

  • Introduo Programao 30 / 30

    Captulo 2

    ndice Remissivo

    CCampo Identificador, 3

    Ppersistncia, 2

    RRegistro, 1

    sintaxe, 3relacionamento, 9

    Ssintaxe, 3

    TTipo de dado, 3

    RegistrosDefinio de registroSintaxe para criao de registrosIdentificadores de registrosAnlise para criao de RegistrosSituao do clculo das notas de um alunoSituao do clculo e consulta do IMC de uma pessoaSituao sobre manipulao de pontos no plano cartesianoSituao sobre cadastro de produtos no supermercadoSituao sobre gerenciamento de contas bancrias

    Exemplos de utilizao dos RegistrosAlunoProdutoPontos

    Exerccios resolvidosPrograma do clculo de mdias de alunosProblema do clculo e consulta do IMC de uma pessoaProblema de pontos no plano cartesianoProblema sobre cadastro de produtos no supermercadoProblema sobre gerenciamento de contas bancrias

    Inicializando registrosComposio de RegistrosTrianguloInformao Pessoal

    Comparao entre Arranjo e RegistroRecapitulandoAtividades

    ndice Remissivo