linguagem c- volume 3 (1)

Upload: ivson-borges

Post on 05-Jul-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/16/2019 Linguagem C- Volume 3 (1)

    1/104

    Recife, 2009

    Programação 2

    Sônia Virginia Alves França

  • 8/16/2019 Linguagem C- Volume 3 (1)

    2/104

    Universidade Federal Rural de Pernambuco

    Reitor: Prof. Valmar Corrêa de AndradeVice-Reitor: Prof. Reginaldo BarrosPró-Reitor de Administração: Prof. Francisco Fernando Ramos CarvalhoPró-Reitor de Extensão: Prof. Paulo Donizeti SiepierskiPró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José FreirePró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira

    Pró-Reitora de Ensino de Graduação: Profª. Maria José de SenaCoordenação de Ensino a Distância: Profª Marizete Silva Santos

    Produção Gráca e EditorialCapa e Editoração: Allyson Vila Nova, Rafael Lira, Italo Amorim e Marcella AlmeidaRevisão Ortográca: Marcelo MeloIlustrações: Diego Almeida e Glaydson da SilvaCoordenação de Produção: Marizete Silva Santos

  • 8/16/2019 Linguagem C- Volume 3 (1)

    3/104

    Sumário

    Apresentação ........................................................................................5

    Conhecendo o Volume 3 ......................................................................6

    Capítulo 1 – Armazenamento de Dados em Vetores .........................8

    1.1 O que são vetores? ......................................................................8

    1.2 Declaração de Vetores .................................................................9

    1.3 Referência a elementos de vetor ................................................11

    1.4 Inicialização de vetores ..............................................................13

    1.5 Leitura de elementos para o vetor ..............................................15

    1.6 Impressão dos elementos de um vetor.......................................22

    1.7 Tamanho de um vetor e segmentação de memória ...................27

    1.8 Passando vetores como parâmetros de funções .......................28

    Capítulo 2 – Armazenamento de Dados em Registros ....................35

    2.1 O que são registros? ..................................................................35

    2.2 Declaração de um Registro ........................................................36

    2.3 Acessando os campos do registro ..............................................39

    2.4 Vetor de registro .........................................................................40

    2.5 Acessando os campos do vetor de registro ................................42

    2.6 Usando vetor de registro ............................................................43

  • 8/16/2019 Linguagem C- Volume 3 (1)

    4/104

    Capítulo 3 – Armazenamento de Dados em Arquivos .....................61

    3.1 O que são arquivos? ...................................................................61

    3.2 Comandos para manipular arquivos binários .............................64

    3.3 Implementação das operações básicas em um arquivo .............76

    Considerações Finais .......................................................................102

    Conhecendo a Autora .......................................................................104

  • 8/16/2019 Linguagem C- Volume 3 (1)

    5/104

    Apresentação

    Caro(a) aluno(a),

    Seja bem-vindo (a) ao terceiro módulo da disciplina Programação II. Neste módulo,vamos dar mais um passo no nosso aprendizado sobre a linguagem de programação

    C.

    Nos dois volumes anteriores, aprendemos os comandos básicos do C, a utilizar

    as estruturas de controle (seleção e repetição) e a modularizar nossos programas em

    módulos ou funções. Com estes assuntos, adquirimos a capacidade de desenvolver

    programas mais elaborados.

    Neste livro, nós vamos aprender novas formas de armazenar nossos dados. Com os

    vetores e registros, poderemos manusear um volume maior de dados, de forma facilitada.

    Outro assunto muito importante que será abordado neste volume é o armazenamento de

    dados em arquivos. Atualmente, ao terminar a execução do programa, todos os dados

    que foram digitados são perdidos. Com o armazenamento de dados em arquivos, isto

    não acontece. Assim, iremos desenvolver programas com operações como: cadastro de

    elementos, remoção, alteração, consultas, listagens, etc.

    Continuem resolvendo as questões propostas no nal de cada capítulo, além de

    executar buscas na Internet, visando um maior aprofundamento de cada assunto. Ao naldeste módulo, teremos a capacidade de resolver questões com operações presentes

    nos principais sistemas de controle do mercado, como por exemplo: sistema de controle

    de estoque, sistema de controle de cliente, etc. Vamos começar mais uma nova etapa

    no conhecimento da linguagem de programação C?

    Bons estudos!

    Professora Sônia Virginia Alves França

  • 8/16/2019 Linguagem C- Volume 3 (1)

    6/104

    6

    Programação 2 

    Conhecendo o Volume 3

    Neste terceiro volume, vocês irão encontrar o módulo 03 da

    disciplina: Programação II. Este volume está estruturado em três

    capítulos, que serão estudados ao longo de 15h/aula. Para facilitar

    seus estudos, veja a organização deste volume.

    Capítulo 1: Armazenamento de Dados em Vetores

    Carga Horária do Capítulo 1: 5 h/aula

    Objetivos do Capítulo 1: Apresentar o uso de vetores para o

    armazenamento de dados.

    Conteúdo Programático do Capítulo 1

    • Denição de vetores;

    • Declaração, leitura e escrita de dados em vetores;

    • Passagem de vetores como parâmetros de funções;

    Capítulo 2: Armazenamento de Dados em Registros

    Carga Horária do Capítulo 2: 5 h/aula

    Objetivos do Capítulo 2: Apresentar o uso de registros para o

    armazenamento de dados.

    Conteúdo Programático do Capítulo 2

    • Denição de registros;

    • Declaração, leitura e escrita de dados em registros;

    • Vetor de registro;

    Capítulo 3: Armazenamento de Dados em Arquivos

    Carga Horária do Capítulo 3: 5 h/aula

    Objetivos do Capítulo 3: Apresentar os principais comandos para

    o armazenamento de dados em arquivos. Com os arquivos, os dados

    manipulados no programa podem ser armazenados denitivamente.

    Conteúdo Programático do Capítulo 3

    • Denição de arquivos;

  • 8/16/2019 Linguagem C- Volume 3 (1)

    7/104

    7

    Programação 2 

    • Ponteiros;

    • Comandos para manipulação de dados em arquivos;

     Ao nal de cada capítulo vocês encontrarão:

    • A seção “Atividades e Orientações de Estudo”: que contém

    exercícios para a xação do assunto estudado, além de

    indicação de fóruns de discussão.

    • A seção “Conheça Mais”: que contém dicas de sites e livros

    que devem ser lidos para ampliar os seus conhecimentos.

    • A seção “Vamos Revisar?”: que apresenta um resumo dos

    principais tópicos abordados no capítulo.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    8/104

    8

    Programação 2 

    Capítulo 1 – Armazenamento de

    Dados em Vetores

    Vamos conversar sobre o assunto?

    Neste terceiro volume, vamos aprender novas formas de armazenar

    nossos dados. Começaremos aprendendo como armazenar os dados

    em vetores. Com os vetores, nós podemos armazenar um grande

    conjunto de dados, facilitando o acesso e manuseio dos mesmos. Os

    dados são a “alma” de um programa. Assim, a manipulação dos dados

    de forma mais adequada e facilitada, trará ganhos para o programa e

    para o programador. Vamos continuar a nossa caminhada?

    1.1 O que são vetores?

    Imaginem que um professor nos encomendou um programa, que

    tenha que armazenar as médias dos 50 alunos de uma turma. Como

    faríamos para armazenar essas médias? Até o ponto que estudamos

    a linguagem C, teríamos que declarar 50 variáveis do tipo oat , uma

    por uma. Que trabalheira, não é mesmo? E se o professor tivesse 300

    alunos? Passaríamos um tempão só declarando variáveis e, além

    disso, teríamos muito trabalho para fazer o controle das mesmas.

    Mas não se preocupem, com os vetores, o professor pode ter mais de

    1000 alunos, que a declaração e manuseio dos dados será bem fácil.

    Os vetores são usados quando precisamos armazenar um conjunto

    de dados do mesmo tipo. Por exemplo: armazenar as 50 médias dos

    alunos de uma turma (todas as médias são do tipo oat ). Os vetores

    são bem convenientes já que iremos colocar todas as informaçõesdentro de um mesmo conjunto e faremos referência de cada dado,

    individualmente, através de um índice1. De maneira mais formal, os

    vetores são chamados de estruturas de dados homogêneas  (já

    que armazenam dados do mesmo tipo). Os vetores são formados

    por dados de mesmo tipo (homogêneo) e possuem número xo de

    elementos (estático).

    Para entendermos melhor os vetores, vamos visualizar a sua

    representação gráca, na gura 1.1.

    Saiba Mais

    1 Em inglês, um

    vetor é chamadode array (que

    signica cadeia). Assim, quando

    temos um array,

    temos uma cadeia

    de inteiros, reais

    ou caracteres.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    9/104

    9

    Programação 2 

    media 3.0 7.5 5.8 9.5 8.2

    0 1 2 3 4

    Figura 1.1: Representação gráca de um vetor 

    Na gura 1.1 temos um vetor chamado media, formado por 5

    elementos. Vocês lembram quando tínhamos uma variável simples?

    Representávamos com uma única caixa. Agora, com os vetores,

    teremos um conjunto de dados, por isso ele é formado por várias

    caixas. Em cada uma delas poderemos armazenar um valor. Todas as

    caixas têm um único nome. Neste exemplo, o vetor se chama media.

    Notem que, abaixo de cada caixa temos um número. Estes números

    são chamados de índices. É através do índice, que iremos informarqual das caixas do vetor é que estamos querendo acessar. Já que

    todas as caixas têm um único nome (media), a forma de diferenciar

    uma da outra é o índice. Entenderam?

    Na linguagem C, o índice de um vetor, começa a partir de 0. Assim,

    em um vetor com 5 elementos, os índices variam de 0 a 4 (como no

    exemplo da gura 1.1). Por isso, o primeiro elemento do vetor media 

    está na posição de índice 0. Podemos dizer que a média do segundo

    aluno está na posição de índice 1 do vetor media, e é igual a 7.5.Esta não é a única maneira de estruturar um conjunto de dados.

    Também podemos organizar dados sob forma de tabelas. Neste caso,

    cada dado é referenciado por dois índices e dizemos que se trata de

    um conjunto bidimensional (ou matriz).

    Vamos aprender, nas próximas seções, como manusear os vetores

    nos nossos programas.

    1.2 Declaração de Vetores

    Como já foi mencionado, um vetor é um conjunto de variáveis

    do mesmo tipo, que possuem um nome identicador e um índice de

    referência. A sintaxe para a declaração de um vetor é a seguinte:

    Sintaxe

    tipo identicador[tamanho];

  • 8/16/2019 Linguagem C- Volume 3 (1)

    10/104

    10

    Programação 2 

    onde:

    • tipo: é o tipo de dados que o vetor armazena: int , oat , char ,

    etc.

    • identicador : é o nome do vetor. As regras para nomear um

    vetor são as mesmas usadas para nomear variáveis, constantese funções.

    • tamanho: é o tamanho do vetor. Isto é, o número de elementos

    que o vetor pode armazenar.

     A seguir, são apresentados exemplos de declarações de vetores.

    Os vetores são declarados na seção de declaração de variáveis do

    programa. Se estivermos desenvolvendo um programa modularizado,

    podemos declarar o vetor como uma variável local de um módulo.Exemplo 1.1: declaração de vetores

    1

    2

    3

    int idade[100];

    oat nota[25];

    char nome[80];

    No primeiro exemplo, temos a declaração de um vetor chamado

    idade, que pode armazenar até 100 números inteiros. No segundoexemplo, temos um vetor chamado nota, com capacidade para

    armazenar até 25 números reais. E, nalmente, no terceiro exemplo,

    temos um vetor chamado nome, com capacidade de armazenar até

    80 caracteres2.

     Ao declararmos o vetor, já temos que ter uma previsão de quantos

    elementos serão armazenados no mesmo. Com isso, o processador

    saberá quanto de memória precisa ser reservada para armazenar os

    dados do vetor, ao executar o programa. A quantidade de memória(em bytes) usada para armazenar um vetor pode ser calculada como:

    quantidade de memória = tamanho do tipo * tamanho do vetor 

    O tamanho do tipo indica quantos bytes um determinado tipo de

    variável utiliza para ser armazenado (vimos este assunto no Volume

    1 – Capítulo 3). Ao compilar o programa, a quantidade de memória

    necessária para armazenar o vetor é alocada. Os vetores têm

    tamanhos xos e não podemos armazenar mais elementos do que a

    quantidade que foi solicitada no momento da declaração do vetor. Por

     Atenção

    2 Nós já havíamos

    utilizado vetor

    de caracteres, já

    que trabalhamoscom variáveis

    que armazenam

    uma cadeia de

    caracteres. No

     próximo volume,teremos um

    capítulo dedicado

    a este assunto.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    11/104

    11

    Programação 2 

    isso, são chamados de estáticos. A quantidade de elementos não

    pode aumentar em tempo de execução do programa.

    Também é possível declarar um vetor com tamanho parametrizado:

    usando uma constante. Declaramos uma constante com a diretiva

    #dene, no início do programa, e depois declaramos o vetor com

    esta constante como tamanho do vetor. Deste modo, podemos alterar

    o número de elementos do vetor antes de qualquer compilação do

    programa. Esta é uma maneira simples de administrar o espaço de

    memória usado pelo programa, e também testar os limites de um

    vetor.

    Exemplo 1.2:

    Declaração de vetor usando uma constante no local do tamanho do vetor.

    1

    2

    #dene TAMANHO 30

    int valor[TAMANHO];

    No exemplo 1.2, o vetor valor   terá capacidade de armazenar 30

    elementos (este é o valor da constante TAMANHO).

    1.3 Referência a elementos de vetor 

     Agora que já sabemos como criar os vetores, a partir da sua

    declaração, vamos aprender como acessar um elemento do vetor.

    Segue abaixo a sintaxe.

    Sintaxe

    identicador[indice]

    onde:

    • identicador : é o nome do vetor que queremos acessar.

    • índice: é o índice do elemento do vetor que queremos acessar.

    Cada elemento do vetor é referenciado pelo nome do vetor e,

    entre colchetes, tem-se o índice, que é um número inteiro. O índice

    irá indicar qual elemento do vetor estamos querendo referenciar. A

    seguir, são apresentadas algumas atribuições a elementos de um

    vetor chamado valor , que é composto por 10 elementos do tipo oat .

  • 8/16/2019 Linguagem C- Volume 3 (1)

    12/104

    12

    Programação 2 

    Exemplo 1.3: Acessando os elementos de um vetor 

    1

    2

    3

    4

    5

    6

    oat valor[10]; //declaração do vetor

    int x;

    x = 3;

    valor[1] = 6.6;

    valor[x] = 9.9

    valor[x+2] = 10.0;

    Entre os colchetes, que indicam o índice do vetor que será

    acessado, podemos ter: um valor (exemplo da linha 4), uma variável

    (exemplo da linha 5) ou uma expressão (exemplo da linha 6).Devemos ter cuidado quando usamos variáveis e expressões, pois

    estas devem ser inteiras e devem ter um valor dentro da capacidade

    de armazenamento do vetor. Ou seja, se o vetor foi declarado com

    tamanho 10, não podemos tentar acessar o índice 18 do vetor.

    Na linha 4, foi atribuído 6.6 ao elemento de índice 1 do vetor valor .

    Na linha 5, como a variável  x   tem armazenado 3, então o valor[3] ,

    receberá 9.9. Quando temos uma expressão, que é o caso da linha

    6, a expressão é resolvida primeiro. Assim, como  x = 3, e entre oscolchetes temos  x+2 , o resultado será 5. Dessa forma, valor[5]

    receberá 10.0. A seguir, temos a situação nal do vetor valor , após as

    atribuições dos valores do exemplo.

    Valor  6.6 9.9 10.0

    0 1 2 3 4 5 6 7 8 9

    Figura 1.2: Situação do vetor valor  após atribuições

    Viram como é fácil trabalhar com vetor? Em uma única linha, nós

    criamos um conjunto de variáveis, do tamanho da nossa necessidade.

    Posteriormente, acessamos cada uma destas variáveis utilizando o

    nome do vetor e o índice da variável.

    Na próxima seção, vamos ver como fazemos para inicializar os

    elementos de um vetor, no momento da declaração.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    13/104

    13

    Programação 2 

    1.4 Inicialização de vetores

    No momento da declaração de um vetor, também podemos

    inicializar os seus elementos, fazendo a atribuição de valores aos

    mesmos. A sintaxe para a inicialização dos elementos de um vetor é

    a seguinte:

    Sintaxe

    tipo identicador[tamanho] = {lista de valores};

    Onde:

    • tipo: é o tipo dos elementos do vetor: int, oat, char , etc.

    • identicador : é o nome do vetor.

    • tamanho: é o tamanho do vetor. Isto é, o número de elementos

    que o vetor pode armazenar.

    • lista de valores: é uma lista, separada por vírgulas, dos valores

    de cada elemento do vetor. A lista de valores é colocada entre

    chaves.

    Vamos ver a seguir, exemplos de inicialização de vetores.

    Exemplo 1.4: Inicialização de vetores

    1

    2

    3

    4

    int idade[7] = {12, 30, 14, 7, 13, 15, 6};

    char vogal[5] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’};

    oat nota[5] = {8.4, 6.9, 4.5};

    oat media[5] = {0};

    No exemplo da linha 1, temos o vetor chamado idade e para cada

    posição do vetor, foi atribuído um valor. Após esta atribuição, o vetor

    idade cará assim:

    idade 12 30 57 25 18 15 13

    0 1 2 3 4 5 6

    Figura 1.3: Situação do vetor idade após inicialização

    No segundo exemplo, temos um vetor de caracteres, chamado

    vogal . Quando inicializamos um vetor deste tipo de variável, os valores

  • 8/16/2019 Linguagem C- Volume 3 (1)

    14/104

    14

    Programação 2 

    devem ser colocados entre apóstrofo. Ao nal desta atribuição, o vetor

    vogal  cará como mostra a gura 1.4.

    vogal a e i o u

    0 1 2 3 4

    Figura 1.4: Situação do vetor idade após inicialização

    Na linha 3, temos a inicialização do vetor nota, que é composto

    por cinco elementos. Notem que, entre as chaves, não temos cinco

    valores. Temos apenas três. Quando não quisermos inicializar todo o

    vetor, podemos colocar apenas os valores dos primeiros elementos, e

    aos demais, será atribuído zero (automaticamente). Vejam na gura

    1.5 como cará o vetor nota, após a sua inicialização.

    nota 8.4 6.9 4.5 0.0 0.0

    0 1 2 3 4

    Figura 1.5: Situação do vetor idade após inicialização

    Seguindo o raciocínio do exemplo anterior, quando precisarmos

    inicializar todos os elementos do vetor com zero, fazemos como

    mostra o exemplo da linha 4. Colocamos apenas um zero entre aschaves, o primeiro elemento será inicializado com zero, e os demais

    também. Neste caso, o vetor media cará como apresentado na gura

    1.6.

    media 0.0 0.0 0.0 0.0 0.0

    0 1 2 3 4

    Figura 1.6: Situação do vetor media após inicialização

    Opcionalmente, podemos inicializar os elementos do vetor

    enumerando-os um a um. No exemplo 1.5, a seguir, observem que

    estas duas inicializações são possíveis:

  • 8/16/2019 Linguagem C- Volume 3 (1)

    15/104

    15

    Programação 2 

    Exemplo 1.5: Inicialização de vetores

    1

    2

    3

    4

    5

    6

    int valor[3] = {7,4,20};

    ou

    int valor[3];

    valor[0] = 7;

    valor[1] = 4;

    valor[2] = 20;

    Na próxima seção, vamos aprender a armazenar, em um vetor,

    valores que são fornecidos via teclado.

    1.5 Leitura de elementos para o vetor 

     Agora suponham que os valores que vão ser armazenados no

    vetor sejam fornecidos pelo usuário, via teclado. O que devemos

    fazer? Devemos utilizar uma estrutura de repetição, para controlar o

    preenchimento dos dados no vetor, um por um. Assim, podem ocorrer

    duas situações:

    • Nós sabemos quantos elementos o usuário vai digitar;

    • Nós não sabemos a quantidade de elementos que o usuário

    vai digitar.

    Vamos ver como tratar cada uma das situações? Quando nós

    sabemos quantos elementos o usuário vai digitar, poderemos usar

    uma estrutura de repetição como o for , que irá repetir a leitura dos

    elementos, na quantidade denida. Vamos ver o Programa Completo

    1.1 a seguir: o usuário precisa armazenar 5 elementos em um vetorde inteiros, chamado valor .

  • 8/16/2019 Linguagem C- Volume 3 (1)

    16/104

    16

    Programação 2 

    Programa Completo 1.1:

    Ler 5 números inteiros, armazenando-os em um vetor 

    1

    2

    3

    4

    5

     

    6

    7

    8

    9

    10

    11

    main()

    {

    int valor[5];

      int i;

      printf(“Cadastro dos elementos do vetor Valor 

    \n\n”);

      for (i=0; i

  • 8/16/2019 Linguagem C- Volume 3 (1)

    17/104

    17

    Programação 2 

    isso, usamos a expressão i+1.

    • Linha 8: scanf   que lê o valor, armazenando no vetor. Notem

    que estamos usando a variável i , no índice do vetor. Dessa

    forma, o i  vai variando a cada vez que o for  é repetido, e assim,

    os elementos são armazenados em índices diferentes do vetor.

    Com isso, nenhum elemento irá sobrepor o outro.

    • Linha 9:  fecha chaves que indica o nal da sequência de

    comandos do for .

    • Linha 10: comando getche que faz com que a tela de execução

    do programa que aberta, e assim podemos ver o resultado do

    programa.

    • Linha 11: fecha chaves, indicando o nal do programaprincipal.

     A gura 1.7, apresenta a tela de execução do Programa Completo

    1.1.

    Figura 1.7: Tela de execução do Programa Completo 1.1

    Para facilitar o entendimento, vamos fazer um acompanhamento

    dos valores das variáveis do Programa Completo 1.1, ao longo da

    sua execução. Vamos considerar que o usuário está cadastrando os

    valores apresentados na gura 1.7. A gura 1.8 mostra os valores das

    variáveis do programa, conforme o programa vai sendo executado.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    18/104

    18

    Programação 2 

    i i+1 valor  

    0 1 10

    0 1 2 3 4

    1 210 15

    0 1 2 3 4

    2 310 15 9

    0 1 2 3 4

    3 410 15 9 6

    0 1 2 3 4

    4 5 10 15 9 6 12

    0 1 2 3 4

    Figura 1.8: Acompanhamento das variáveis do Programa Completo 1.1

    O que fazemos quando não sabemos quantos elementos serão

    armazenados no vetor? Neste caso, como não sabemos quantas

    vezes o for  deve ser executado, poderemos fazer a leitura dos dados

    que serão colocados no vetor, usando um do/while, como mostra o

    Programa Completo 1.2, a seguir. Neste programa, iremos fazer

    a leitura de uma quantidade indeterminada de números inteiros,

    armazenando em um vetor.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    19/104

    19

    Programação 2 

    Programa Completo 1.2:

    Ler um conjunto de números inteiros, armazenando-os em um vetor.

    1

    2

    3

    4

    5

     

    6

    7

    8

    9

    10

     

    11

    12

    13

    main()

    { int valor[5];

      int q, continuar;

      q=0;

      printf(“Cadastro dos elementos do vetor Valor 

    \n\n”);

      do

      { printf(“\n\nElemento %d: “,q+1);

      scanf(“%d”,&valor[q]);

      q++;

      printf(“\n\nCadastrar outro elemento

    (1-sim/2-nao)? “);

      scanf(“%d”, &continuar);

      } while ((continuar==1) && (q

  • 8/16/2019 Linguagem C- Volume 3 (1)

    20/104

    20

    Programação 2 

    dos elementos no vetor.

    • Linha 6: do indicando o início da repetição.

    • Linha 7: Abre chaves que inicia a sequência de comandos do

    do/while (já que teremos mais de um comando). Nesta linha

    também temos o printf  para que o usuário saiba qual elementodo vetor está sendo cadastrado no momento.

    • Linha 8: scanf  que lê o valor que será armazenado no vetor.

    Notem que estamos usando a variável q, no índice do vetor.

    • Linha 9: incremento da variável q, indicando que mais um

    elemento foi cadastrado no vetor. Através do valor de q, 

    saberemos se o vetor já está cheio ou não.

    • Linha 10:  prinft  que pergunta ao usuário se deseja cadastraroutro elemento no vetor. O usuário pode parar o cadastro dos

    elemento do vetor, no momento que ele desejar. Nesse caso, o

    vetor pode car com posições sem valores armazenados.

    • Linha 11: scanf  para ler a resposta do usuário.

    • Linha 12: fecha chaves do do/while  e while  com a condição

    que faz com que a repetição que sendo executada. Como

    a condição é formada por duas expressões relacionais, nóscolocamos cada expressão relacional entre parênteses e depois

    colocamos toda a expressão entre parênteses. As expressões

    estão conectadas pelo operador && (e). Com isso, quando uma

    das expressões der falso, a repetição para. Vai parar porque

    o vetor está cheio (q=5 ) ou porque o usuário desejou parar,

    respondendo 2 a pergunta se deseja continuar.

    • Linha 13: fecha chaves, indicando o nal do programa

    principal.

     A gura 1.9, apresenta a tela de execução do Programa Completo

    1.2.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    21/104

    21

    Programação 2 

    Figura 1.9: Tela de execução do Programa Completo 1.2

    Vamos acompanhar o valor das variáveis do Programa Completo

    1.2? A Figura 1.9 mostra o cadastramento de 3 elementos no vetor. O

    usuário respondeu que não queria mais cadastrar após dar entrada

    ao terceiro elemento. A gura 1.10 mostra os valores das variáveis do

    programa, conforme o programa vai sendo executado.

    q q+1 valor  

    0 112

    0 1 2 3 4

    1 212 15

    0 1 2 3 4

    2 3 12 15 18

    0 1 2 3 4

    Figura 1.10: Acompanhamento das variáveis do Programa Completo 1.2

     Agora que já sabemos colocar informações em um vetor via

    teclado, vamos ver como apresentar, na tela, os valores armazenados

    em um vetor.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    22/104

    22

    Programação 2 

    1.6 Impressão dos elementos de um vetor 

    Quando desejarmos apresentar os elementos que estão

    armazenados no vetor, devemos utilizar uma estrutura de repetição,

    que fará com que cada uma das posições do vetor seja “visitada” e

    seu conteúdo apresentado. Vale lembrar que, quando declaramos umvetor, indicamos a sua capacidade de armazenamento. Mas durante a

    execução do programa, pode ser que o usuário não armazene dados

    suciente para preencher todas as posições do vetor. Assim, quando

    formos imprimir os dados de um vetor, precisamos saber quantos

    elementos têm armazenado no momento da impressão. O Programa

    Completo 1.3, mostra a leitura e a impressão dos dados armazenados

    em um vetor.

    Programa Completo 1.3: Ler e imprimir um conjunto de números inteiros,

    armazenando-os em um vetor.

    1

    2

    3

    4

    5

     

    6

    7

    8

    9

    10

     

    11

    12

    13

    14

    15

    16

    17

    main()

    { int valor[5];

      int q, continuar, i;

      q=0;

      printf(“Cadastro dos elementos do vetor Valor 

    \n\n”);

      do

      { printf(“\n\nElemento %d: “,q+1);

      scanf(“%d”,&valor[q]);

      q++;

      printf(“\n\nCadastrar outro elemento 

    (1-sim/2-nao)? “);

      scanf(“%d”, &continuar);

      } while ((continuar==1) && (q

  • 8/16/2019 Linguagem C- Volume 3 (1)

    23/104

    23

    Programação 2 

     Até a linha 12, o Programa Completo 1.3 é, praticamente, idêntico

    ao Programa Completo 1.2. A única diferença é que temos, na linha

    3, a declaração da variável i , que será usada no for  que imprimirá os

    elementos do vetor. Vamos ver o que está acontecendo nas demais

    linhas?

    • Linha 13:  printf   para informar que serão apresentados os

    elementos do vetor. Notem que o texto entre aspas não termina

    com \n. Isso se dá porque não queremos que o cursor vá para

    a linha seguinte.

    • Linha 14: for   que será utilizado para percorrer o vetor,

    acessando cada uma das posições do vetor. A variável que tem

    a informação de quantos elementos foram armazenados no

    vetor é q. Dessa forma, o i  do for  vai variar de 0 até q-1. Umavez que se q for 3, a última posição ocupada no vetor é 2.

    • Linha 15: printf  que apresenta o elemento do vetor, na posição

    de índice i . Este printf  também não tem o \n, porque queremos

    que os elementos do vetor sejam impressos um ao lado do

    outro. Este é o único comando do for , por isso não houve a

    necessidade de delimitar com chaves.

    • Linha 16: getche que evita o fechamento da janela de execução

    do programa, e assim poderemos ver os elementos do vetor

    impresso.

    • Linha 17:  fecha chaves, indicando o nal do programa

    principal.

     A gura 1.11 apresenta a tela de execução do programa 1.3. Foram

    cadastrados os mesmos valores do exemplo anterior.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    24/104

    24

    Programação 2 

    Figura 1.11: Tela de execução do Programa Completo 1.3

    Neste caso, apesar do vetor ter sido declarado com 5 posições, só

    foram preenchidas 3 posições. Vejam que, após o usuário responder

    que não quer mais cadastrar, os elementos do vetor são apresentados

    um ao lado do outro.

    Vamos ver outro Programa Completo? Neste programa iremos

    ler as matrículas e notas dos alunos de uma turma e imprimir as

    matrículas dos alunos de tiveram nota acima da média das notas da

    turma.

    Programa Completo 1.4

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    main()

    { int mat[10];

      oat nota[10];

    int q, i, continuar;

      oat soma, media;

      soma = 0;

      q=0;

      do

      { system(“cls”);

      printf(“Universidade Aberta do Brasil -

    UFRPE\n\n”);

  • 8/16/2019 Linguagem C- Volume 3 (1)

    25/104

    25

    Programação 2 

    11

     

    12

    13

    14

    15

    16

    17

    18

     

    19

    20

    21

    22

    23

     

    24

    25

     

    26

    27

    28

    29

    30

      printf(“\n\nDados do Alunos %d\n\n”,

    q+1);

      printf(“\nMatricula: “);

      scanf(“%d”,&mat[q]);

      printf(“\nNota: “);

      scanf(“%f”,&nota[q]);

      soma = soma + nota[q];

      q++;

      printf(“\n\nCadastrar outro(1-sim/2-nao)?

    “);

      scanf(“%d”, &continuar);

      } while ((continuar==1) && (q

  • 8/16/2019 Linguagem C- Volume 3 (1)

    26/104

    26

    Programação 2 

    • Linhas 6 e 7: inicialização das variáveis soma (que acumula as

    notas de todos os alunos) e q  (que conta quantos elementos

    foram cadastrados no vetor).

    • Linhas 8 a 20: do/while que faz a leitura das matrículas e das

    notas de cada aluno, armazenando nos respectivos vetores.

    Neste do/while, o usuário pode parar o cadastro no momento

    que ele desejar. Para calcularmos a média da turma, temos que

    somar as notas de todos os alunos e dividir pela quantidade

    de alunos. Assim, enquanto estivermos no do/while, estamos

    acumulando as notas de todos os alunos na variável soma.

    • Linha 21: ao sair do do/while, a média da turma pode ser

    calculada.

    • Linha 22: usa o system(“cls”) para limpar a tela e dar início atela que irá apresentar os resultados.

    • Linha 24: printf  para apresentar a média da turma.

    • Linhas 26 a 29: for   para visitar cada posição do vetor que

    armazena as notas dos alunos. Quando verica que a nota do

    aluno é maior que a média da turma (armazenada na variável

    media), a matrícula do aluno é apresentada.

     A gura 1.12 apresenta a tela de execução do programa 1.4, nafase do cadastramento dos dados dos alunos (matrícula e nota).

    Figura 1.12: Tela de Execução do Programa Completo 1.4 – Cadastro de Alunos

     A gura 1.13 apresenta a tela de execução do programa completo

    1.4, na fase do apresentação dos resultados.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    27/104

    27

    Programação 2 

    Figura 1.13: Tela de Execução do Programa Completo 1.4 – Apresentação dos Resultados

    1.7 Tamanho de um vetor e segmentação dememória

    Na linguagem C, devemos ter cuidado com os limites de um vetor.

    Embora na declaração tenhamos que denir o tamanho de um vetor,

    o C não faz nenhum teste de vericação de acesso a um elemento

    dentro do vetor ou não.

    Por exemplo, se declaramos um vetor como int valor[5] ,

    teoricamente, só tem sentido usarmos os elementos valor[0], valor[1],valor[2] , valor[3] e valor[4]. Porém, o C não acusa erro se usarmos

    valor[12]  em algum lugar do programa. Estes testes de limite devem

    ser feitos dentro do programa, pelo programador.

    Este fato se deve à maneira como o C trata os vetores. A memória

    do computador é um espaço (físico) particionado em porções de 1

    byte. Se declararmos um vetor como int valor[3] , estamos reservando

    12 bytes  (3 segmentos de 4 bytes – lembrando que cada int  ocupa

    4 bytes) de memória para armazenar os seus elementos. O primeirosegmento será reservado para valor[0] , o segundo segmento para

    valor[1]   e o terceiro segmento para valor[2] . O segmento inicial é

    chamado de segmento base, de modo que valor[0]  será localizado no

    segmento base. Quando acessamos o elemento valor[i] , o processador

    acessa o segmento localizado em base+i . Se i  for igual a 2, estamos

    acessando o segmento base+2   ou valor[2] (o último segmento

    reservado para o vetor). Porém, se i  for igual a 7, estamos acessando

    o segmento base+7  que não foi reservado para os elementos do vetore que provavelmente está sendo usado por uma outra variável ou

    contém uma informação inesperada (lixo).

  • 8/16/2019 Linguagem C- Volume 3 (1)

    28/104

    28

    Programação 2 

    Observem que o acesso a um segmento fora do espaço destinado

    a um vetor pode destruir informações reservadas de outras variáveis.

    Estes erros são difíceis de detectar, pois o compilador não gera

    nenhuma mensagem de erro. Por isso, a solução mais adequada é

    sempre avaliar os limites de um vetor antes de manipulá-lo. Como

    feito no Programa Completo 1.2 que vai cadastrando os elementos novetor e para quando o vetor completa a sua capacidade.

     A princípio, este fato poderia parecer um defeito da linguagem,

    mas na verdade trata-se de um recurso muito poderoso do C. Poder

    manipular sem restrições todos os segmentos de memória é uma

    exibilidade apreciada por programadores mais experientes.

    1.8 Passando vetores como parâmetros defunções

    Os vetores, assim como as variáveis simples, podem ser usados

    como argumentos de funções. Veremos como se declara uma função

    que recebe um vetor como parâmetro e como se chama uma função

    passando um vetor como parâmetro.

     A sintaxe de uma função que recebe um vetor como parâmetro é a

    seguinte:

    Sintaxe

    tipo_retorno nome_função(tipo_vetor nome_vetor[])

    {

      //corpo da função

    }

    Onde:

    • tipo_retorno: é o tipo de retorno da função.

    • nome_função: é o nome da função.

    • tipo_vetor : é o tipo de dados dos elementos do vetor.

    • nome_vetor : é o nome do vetor. Observe que depois do nome

    do vetor temos o [ e o ], mas não colocamos nada entre eles.

    Neste caso, não é necessário informar o tamanho do vetor.

    Quando formos chamar uma função que recebe um vetor como

  • 8/16/2019 Linguagem C- Volume 3 (1)

    29/104

    29

    Programação 2 

    parâmetro, usamos a seguinte sintaxe:

    Sintaxe

    nome_da_função(nome_do_vetor);

    Onde:

    • nome_da_função: é o nome da função que será chamada.

    • nome_do_vetor : é o nome do vetor que queremos passar

    como parâmetro. Neste caso, indicamos apenas o nome do

    vetor, sem os colchetes.

    O exemplo 1.6, a seguir, apresenta a declaração de uma função

    que tem um vetor como parâmetro e a chamada da função.

    Exemplo 1.6:

    declaração e chamada de uma função que tem um vetor como parâmetro

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

     

    11

    12

    oat media(oat vetor[],oat N)

    {

      //corpo da função

    }

    main()

    { oat valor[30]; // declaração do vetor

      oat n;

      ...

      med = media(valor, n); // passagem do vetor

    para a função

      ...

    }

    Atenção: Ao contrário das variáveis comuns, o conteúdo de um

    vetor pode ser modicado pela função chamada. Isto signica que

    podemos passar um vetor para uma função e alterar os valores de

    seus elementos. Isto ocorre porque a passagem de vetores para

    funções é feita de modo especial dito passagem por endereço.Portanto, devemos ter cuidado ao manipular os elementos de um

  • 8/16/2019 Linguagem C- Volume 3 (1)

    30/104

    30

    Programação 2 

    vetor dentro de uma função para não modicá-los por descuido.

    Atividades e Orientações de Estudos

    Vamos fazer um conjunto de exercícios, usando o assunto que

    acabamos de aprender? Segue abaixo uma lista de exercícios em

    que os dados serão armazenados em vetores. Vamos começar?

    1. Ler um conjunto de números e imprimi-los na ordem inversa da

    leitura. A quantidade de números também será lida e será no

    máximo 10.

    2. Ler o tamanho e os elementos de dois vetores e, em seguida,caso os vetores tenham o mesmo tamanho, gere e imprima o

    vetor SOMA, onde seus elementos serão formados pela soma

    dos elementos de mesmos índices dos dois vetores lidos.

    Exemplo:

    A 1 4 7 2 9

    0 1 2 3 4

    B 3 5 11 4 8

    0 1 2 3 4

    Soma 4 9 18 6 17

    0 1 2 3 4

    3. Ler um vetor de números e imprimir os valores armazenados

    nas posições PARES e, em seguida, os valores armazenados

    nas posições ÍMPARES. Exemplo:

    V 1 4 7 2 9

    0 1 2 3 4

    Valores nas posições pares: 1 7 9

  • 8/16/2019 Linguagem C- Volume 3 (1)

    31/104

    31

    Programação 2 

    Valores nas posições impares: 4 2

    4. Ler dois vetores e caso tenham tamanhos iguais, armazene seus

    elementos alternadamente em um terceiro vetor. Exemplo:

    A 1 4 7 2 12

    0 1 2 3 4

    B 3 5 11 4 15

    0 1 2 3 4

    Resultante 1 3 4 5 7 11 2 4 12 15

    0 1 2 3 4 5 6 7 8 9

    5. Ler um vetor de números inteiros e imprimir as posições do

    maior e do menor elemento do vetor. Assuma que não existem

    elementos repetidos no vetor. Exemplo:

    V 14 13 7 22 9

    0 1 2 3 4

    O menor elemento se encontra na posição 2

    O maior elemento se encontra na posição 3

    6. Ler um vetor de números e inverter a ordem dos elementos

    desse vetor no próprio vetor. Exemplo:

      Vetor antes de ser invertido:

    V 14 13 7 22 9

    0 1 2 3 4

      Vetor depois de ser invertido:

  • 8/16/2019 Linguagem C- Volume 3 (1)

    32/104

    32

    Programação 2 

    V 9 22 7 13 14

    0 1 2 3 4

    7. Ler dois vetores de números e gerar um terceiro vetor formadopela INTERSECÇÃO dos dois vetores lidos. O resultado da

    interseção de dois conjuntos é: os elementos que fazem parte

    dos dois conjuntos. Exemplo:

    A 1 4 7 2 12

    0 1 2 3 4

    B 3 4 2 14 25

    0 1 2 3 4

    interseccao 4 2

    0 1 2 3 4

    8. Ler dois vetores de números e gerar um terceiro vetor formado

    pela DIFERENÇA dos dois vetores lidos. O resultado da

    diferença de dois conjuntos é: os elementos do conjunto A que

    não fazem parte do conjunto B. Exemplo:

    A 1 4 7 2 12

    0 1 2 3 4

    B 3 4 2 14 25

    0 1 2 3 4

    Diferenca 1 7 12

    0 1 2 3 4

  • 8/16/2019 Linguagem C- Volume 3 (1)

    33/104

    33

    Programação 2 

    9. Ler dois vetores de números e gerar um terceiro vetor formado

    pela UNIÃO dos dois vetores lidos. O resultado da união de dois

    conjuntos é: todos os elementos que fazem parte dos conjuntos

     A e B. Exemplo:

    A 1 4 7 2 12

    0 1 2 3 4

    B 3 4 2 14 25

    0 1 2 3 4

    União 1 4 7 2 12 3 14 25

    0 1 2 3 4 5 6 7 8 9

    10. Ler um vetor de números e imprimir os números que se repetem

    nesse vetor. Exemplo:

    V 1 4 7 1 2 1 4 25 3 7

    0 1 2 3 4 5 6 7 8 9

      Os números que se repetem no vetor são: 1 4 7

    Conheça Mais

    Para ampliar nossos conhecimentos sobre os assuntos tratados

    neste capítulo, leiam o capítulo que aborda armazenamento em

    vetores, do livro:

    • SCHILDT, Herbert. C Completo e Total. São Paulo: Makron,

    1996.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    34/104

    34

    Programação 2 

    Vamos Revisar?

    Vamos lembrar rapidinho o que foi visto neste capítulo?

    Leia o resumo a seguir, composto com os principais conceitos

    apresentados.

    Vetores: conhecidos como estruturas de dados homogêneas, osvetores são um conjunto de variáveis que armazenam elementosdo mesmo tipo.

    Índices: para acessar um elemento do vetor, precisamos indicar emque posição do vetor está o elemento.

    No momento da declaração dos vetores, precisamos indicar quantoselementos serão armazenados no mesmo.

    É de responsabilidade do programador o acesso aos elementos dovetor. Se o programa tentar acessar uma posição que não existe novetor, o compilador não indicará o erro.

    Quando passamos um vetor como parâmetro de uma função, seusvalores podem ser alterados

  • 8/16/2019 Linguagem C- Volume 3 (1)

    35/104

    35

    Programação 2 

    Capítulo 2 – Armazenamento de

    Dados em Registros

    Vamos conversar sobre o assunto?

    Neste capítulo, vamos aprender mais uma forma de armazenamento

    de dados, que são os registros. Nos registros podemos agrupar dados

    de tipos diferentes. Por conta disto, os registros são chamados de

    estruturas de dados heterogêneas. Assim como os vetores, os registros

    vão facilitar o gerenciamento dos dados dos nossos programas, que

    estão cada vez maiores. Veremos, também, como unir os conceitos

    de vetores e registros, trabalhando com vetor de registro. Leiam este

    capítulo com calma e atenção, uma vez que iremos utilizar registros

    em muitas situações nos nossos programas, certo?

    2.1 O que são registros?

    Nós já sabemos que um conjunto homogêneo de dados é composto

    por variáveis do mesmo tipo (vetores). Mas, e se tivermos um conjunto

    em que os elementos não são do mesmo tipo? Teremos, então, um

    conjunto heterogêneo  de dados, que são chamados de registros.

    O registro é uma das principais formas de estruturar os dados no

    programa. O conceito de registro visa facilitar o agrupamento de

    variáveis de tipos diferentes, mas que possuem uma relação lógica.

    Um registro é um conjunto de uma ou mais variáveis, que podem

    ser de tipos diferentes, agrupadas sobre um único nome. O fato de

    variáveis agrupadas em um registro poderem ser referenciadas por

    um único nome, facilita a manipulação dos dados armazenados nestasestruturas. Como exemplo de um registro, imaginem uma estrutura que

    armazene as diversas informações do boletim de um aluno. O boletim

    é formado por um conjunto de informações logicamente relacionadas,

    porém de tipos diferentes, tais como: número de matrícula (inteiro),

    nome do aluno (caractere), nome da disciplina (caractere), média (real)

    e situação (caractere), que são subdivisões do registro (elementos

    de conjunto), também chamadas de campos. Logo, um registro é

    composto por campos que são partes que especicam cada uma das

    informações. A gura 2.1 apresenta o boletim de notas de um aluno.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    36/104

    36

    Programação 2 

    Boletim de Notas

    Matricula...: 12345

    Nome........: Michel

    Disciplina..: Matemática

    Média........: 10.0

    Situação....: Aprovado

    Figura 2.1 Boletim de Notas

    Notem que, o boletim é composto por informações de diferentestipos. No entanto, todas as informações do boletim estão relacionadas

    ao mesmo aluno. O agrupamento de informações de tipos diferentes,

    que tem uma relação lógica, facilitará a manipulação de dados.

    Nas próximas seções, vamos aprender a declarar e manipular

    registros.

    2.2 Declaração de um Registro

    Para declarar uma variável, precisamos informar o seu tipo e dar

    um nome à mesma. Mas, um registro é formado por várias variáveis

    de tipos diferentes. Como iremos declarar um registro? Para declarar

    um registro, é necessário informar quais variáveis, e seus respectivos

    tipos, fazem parte do registro. Dessa forma, precisamos declarar

    cada campo do registro, agrupando-os em um novo tipo de dado.

     A declaração de um registro passa por duas fases: denição de um

    novo tipo de dado e declaração do registro propriamente dito. Vamosentender melhor isso tudo?

    Primeiramente, precisamos denir quais campos fazem parte

    do registro e criar um novo tipo de dado para o nosso programa.

    Precisamos criar um novo tipo de dado porque não conseguiríamos

    representar o tipo de informação que o registro armazena, utilizando

    os tipos primitivos disponíveis na linguagem: int , oat , char , etc. Uma

    vez que o registro agrupa variáveis de tipos de dados diferentes. Para

    criar um novo tipo de dado, utilizamos a seguinte sintaxe:

  • 8/16/2019 Linguagem C- Volume 3 (1)

    37/104

    37

    Programação 2 

    Sintaxe

    typedef struct { declaração das variáveis;

      } nome_do_tipo;

    Onde:

    • typedef : indica que um novo tipo de dado será denido.

    • struct: indica que o tipo de dado que será denido é um

    registro, ou seja, um agrupamento de variáveis de tipos de

    dados diferentes.

    • declaração das variáveis: são as variáveis que fazem parte do

    registro. Neste local, precisamos especicar quais as variáveis

    irão compor o registro, além do tipo das mesmas. As variáveis

    são colocadas entre chaves.

    • nome_do_tipo: é dado um nome ao novo tipo de dado que

    está sendo criado. Só depois que o novo tipo de dado é criado,

    é que o registro poderá ser declarado.

    Na sequência, vamos ver a declaração de um registro. Assim como

    toda variável, ao declarar uma variável que é um registro, precisamos

    dizer que tipo de dado o registro armazena. Neste caso, iremos dizerque o registro é do tipo de dado que acabamos de denir no typedef .

     A sintaxe é a seguinte:

    Sintaxe

    nome_do_tipo nome_do_registro;

    Onde:

    • nome_do_tipo:  é o nome do tipo de dado que denimos

    no nosso programa, formado pelo agrupamento de várias

    variáveis.

    • nome_do_registro:  é o nome da variável registro que está

    sendo declarada. O nome de um registro segue as regras dos

    identicadores.

    O exemplo 2.1 apresenta a declaração do registro do boletim do

    aluno:

  • 8/16/2019 Linguagem C- Volume 3 (1)

    38/104

    38

    Programação 2 

    Exemplo 2.1: Denição de tipo e declaração de registro

    1

    2

     

    3

    4

    5

    typedef struct { int matricula;

      char nome[20], disciplina[20],

    situação[10];

      oat media;

      } Tipo_Aluno;

    Tipo_Aluno aluno;

    Primeiramente, entre as linhas 1 e 4, foi denido o conjunto de

    variáveis que fazem parte do registro. É nesta parte que está sendo

    denido um novo tipo de dado.

    • Linha 1: com o typedef  estamos informando que será denidoum novo tipo de dado. O struct   indica que este tipo é um

    agrupamento de variáveis de tipos diferentes, ou seja, um

    registro. Colocamos o abre chaves e começamos a declarar

    as variáveis que irão compor o registro. Começamos com a

    declaração da variável inteira matricula. Se houvesse mais

    variáveis do tipo int , poderiam ser declaradas nesta mesma

    linha.

    • Linha 2: declaração das variáveis do tipo char : nome, disciplina 

    e situacao.

    • Linha 3: declaração da variável media que é do tipo oat .

    • Linha 4: Após a declaração de todas as variáveis que compõe

    o registro, podemos fechar a chaves e, em seguida, dar um

    nome a esse tipo de agrupamento, que acabamos de denir.

    Neste caso, o tipo foi chamado de Tipo_Aluno. Ao denirmos

    um tipo de dado no nosso programa, signica que: podemosdeclarar variáveis dos tipos de dados primitivos (int , oat , char ,

    etc), além de variáveis do tipo de dado que nós denimos, neste

    caso, Tipo_Aluno.

    • Linha 5: declaração de uma variável chamada aluno, e o tipo

    de dado que ela armazena é Tipo_Aluno, ou seja, armazena:

    matricula, nome, disciplina, situacao e media.

     A gura 2.2 mostra a representação gráca da variável aluno, queé do tipo Tipo_Aluno.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    39/104

    39

    Programação 2 

     matricula

    nome

    disciplina

    situacao

    media

    aluno

    Figura 2.2: Representação gráca do registro aluno

    Notem que, a variável aluno (que é um registro) é formada pelos

    campos denidos no Tipo_Aluno.

    Como uma variável registro é formada por vários campos,

    precisamos utilizar uma forma diferenciada para informar qual campo

    do registro nós estamos querendo acessar. Lembram dos vetores, que

    precisávamos dizer qual elemento do vetor seria acessado? Com os

    registros vai acontecer algo parecido. Mas isto, nós vamos aprender

    na próxima seção.

    2.3 Acessando os campos do registro

    De acordo com a gura 2.2, a variável aluno é um registro formado

    por vários campos. Para acessar um campo de um registro, devemos

    usar a seguinte sintaxe:

    Sintaxe

    nome_do_registro.campo

    Onde:

    • nome_do_registro: é o nome da variável registro que queremos

    acessar.

    •  Após o nome_do_registro devemos colocar um ponto, que

    irá separar o nome do registro, do campo que vem logo em

    seguida.

    • campo: é o campo do registro que será acessado.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    40/104

    40

    Programação 2 

    Pensem da seguinte forma: suponham que queremos acessar

    o registro aluno, do exemplo 2.1. Ao acessarmos esta variável, ela

    possui vários campos. Precisamos dizer qual deles será acessado

    no momento. A seguir, são apresentados exemplos de acesso aos

    campos do registro aluno. Ao acessar um campo do registro, podemos

    atribuir valores, como mostra o exemplo 2.2.

    Exemplo 2.2: Acesso aos campos de um registro

    1

    2

    3

    4

    aluno.matricula = 12345;

    scanf(“%f”, &aluno.media);

    gets(aluno.nome);

    printf(“Situacao do aluno: %s”, aluno.situacao);

    Na linha 1, estamos acessando o campo matricula  do registro

    aluno. Assim, colocamos o nome do registro, o ponto e o campo que

    queremos acessar. Com acesso ao campo, zemos uma atribuição4.

    Na linha 2, estamos acessando o campo media do registro aluno.

    Neste caso, ao invés de atribuir um valor ao campo de registro, estamos

    fazendo uma leitura via teclado e armazenando o valor digitado no

    campo media. Como o campo media é do tipo oat , colocamos o %f  

    no scanf , indicando que será lido um número real.

    Na linha 3, temos o comando de leitura gets, responsável por ler

    variáveis do tipo char . Neste gets, estamos fazendo uma leitura via

    teclado e armazenando o valor digitado no campo nome do registro

    aluno.

    Na linha 4, temos um  printf   que apresenta a situação do aluno.

    Para isso, acessamos o campo situacao do registro aluno.

    Notem que, se tivermos vários alunos em uma turma, precisaremos

    de várias variáveis registro do tipo Tipo_Aluno, uma para cada

    aluno. Para fazer isso de forma mais simplicada, devemos juntar os

    conceitos de vetores e registros e criar um vetor de registro. Vamos

    aprender como faz isto?

    2.4 Vetor de registro

    Os vetores são formados por um conjunto de dados do mesmo

    tipo. No capítulo anterior, utilizamos vetores que armazenavam dados

    Saiba Mais

    4 O ponto que

    aparece neste

    comando, deve

    ser lido como

    “campo”. Assim,a leitura do

    comando da linha

    1 seria: aluno nocampo matricula

    recebe 12345.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    41/104

    41

    Programação 2 

    de tipos  primitivos, ou seja, tipos disponíveis na linguagem –  int,

    oat, char , etc. Veremos que podemos utilizar como elemento do vetor

    não apenas um tipo primitivo, mas também os tipos construídos (tipos

    denido pelo programador), neste caso, os registros. Imaginem que

    queremos armazenar os boletins dos 50 alunos de uma turma. Para

    isso, será necessário um registro diferente para cada aluno. Paraagrupar todos estes registros, iremos denir um vetor de registro.

    Como possuímos 50 alunos, podemos criar um vetor no qual cada

    posição, armazena um Tipo_Aluno.

    Para declarar um vetor de registro, precisamos antes denir os

    elementos do registro, utilizando o typedef struct , e assim, denir um

    novo tipo de dado que será utilizado no programa. Após denirmos o

    novo tipo de dado, o vetor poderá ser declarado. Para declararmos

    um vetor, precisamos informar o tipo de dado que o vetor armazena,

    damos um nome ao vetor e informamos, entre colchetes, o tamanho

    do vetor. O exemplo 2.3 apresenta a declaração do vetor de registro

    alunos:

    Exemplo 2.3: denição do registro e declaração do vetor de registro

    1

    2

     

    3

    4

    5

    typedef struct { int matricula;

      char nome[20], disciplina[20],situação[10];

      oat media;

      }Tipo_Aluno;

    Tipo_Aluno alunos[50];

    Neste exemplo, cada uma das 50 posições do vetor alunos  irá

    armazenar todos os dados que compõe o Tipo_Aluno, ou seja:

    matricula, nome, disciplina, situacao e media. A gura 2.3, a seguir,

    representa o vetor de registro declarado no exemplo.

    alunos

    matriculanomedisciplinamediasituacao

    matriculanomedisciplinamediasituacao

    matriculanomedisciplinamediasituacao

    matriculanomedisciplinamediasituacao

    0 1 ... 48 49

    Figura 2.3: Representação gráca do vetor de registro aluno

  • 8/16/2019 Linguagem C- Volume 3 (1)

    42/104

    42

    Programação 2 

    Se apenas com os vetores, já havíamos adquirido uma facilidade

    na declaração e manipulação de um grande conjunto de variáveis,

    com os vetores de registros, esta facilidade será aumentada.

    Vamos aprender, na próxima seção, como acessamos um campo

    de um vetor de registro.

    2.5 Acessando os campos do vetor de

    registro

    Quando precisamos acessar um elemento do vetor, informamos,

    entre colchetes, o índice do elemento do vetor que será acessado.

    Quando queremos acessar um campo do registro, informamos o

    nome da variável registro, colocamos um ponto e o nome do campoque queremos acessar. Já no caso de um vetor de registro, temos

    que usar a seguinte sintaxe:

    Sintaxe

    nome_do_vetor[indice].campo

    Onde:

    nome_do_vetor : nome do vetor que queremos acessar.

    [índice]: índice do vetor que será acessado.

    .campo: campo do registro que será acessado.

    O exemplo 2.4 apresenta acessos a campos do vetor de registro

    alunos.

    Exemplo 2.4: Acesso aos elementos de um vetor de registro

    1

    2

    3

    4

    alunos[2].media = 7.5;

    alunos[3].matricula = 12345;

    gets(alunos[0].nome);

    scanf(“%d”,&alunos[2].matricula);

    Na linha 1, acessamos o elemento de índice 2 do vetor alunos e

    atribuímos 7.5 ao campo media. Na linha 2, acessamos o elemento

    de índice 3 do vetor alunos e atribuímos 12345  ao campo matricula.

    Nas linhas 3 e 4, temos acessos através de comandos de entrada

  • 8/16/2019 Linguagem C- Volume 3 (1)

    43/104

    43

    Programação 2 

    de dados. Na linha 3, temos um gets, que obtém o nome do aluno, via

    teclado, e armazena no índice 0 do vetor alunos, no campo nome. Na

    linha 4, temos o scanf  que lê a matrícula do aluno, armazenando no

    índice 2 do vetor alunos, no campo matricula.

    2.6 Usando vetor de registro

    Vamos fazer um programa completo usando vetor de registro?

    Este programa será um pouco maior do que os outros programas que

     já zemos, e apresentará uma gama de coisas novas. Além do uso

    de vetor de registro, aprenderemos a mostrar os dados do vetor de

    registro em forma de tabela. Vamos começar?

    Primeiramente, vamos ler e entender o enunciado do ProgramaCompleto 2.1: Faça um programa que cadastre e apresente os

    dados dos alunos de uma escola. Os dados dos alunos devem

    ser armazenados em um vetor de registro, com a capacidade de

    armazenar até 20 alunos. A quantidade de alunos que será cadastrada

    é desconhecida. No momento do cadastro serão informados os

    seguintes dados para cada aluno: matrícula, nome, série(1-4) e se

    tem irmão na escola (1-sim/0-nao). O programa irá calcular o valor

    da mensalidade do aluno, que depende da série do aluno e se o

    mesmo tem irmão na escola. Valor da Mensalidade: 1ª Serie: R$110,

    2ª Serie: R$130, 3ª Serie: R$160, 4ª Serie: R$170. O aluno que tiver

    irmão na escola, receberá 20% de desconto no valor da mensalidade.

    Quando o usuário decidir que não deseja mais cadastrar, o programa

    apresentará os dados de todos os alunos, em forma de tabela. Para

    facilitar o entendimento deste enunciado, vejam os exemplos das telas

    que são apresentadas durante a execução do programa:

    Colégio Legal

    Cadastro de Aluno

    Matricula..:Nome.......:Serie(1-4):Irmao na escola (1-sim/0-nao):

    Cadastrar outro aluno (1-sim/0-nao)?

  • 8/16/2019 Linguagem C- Volume 3 (1)

    44/104

    44

    Programação 2 

    Colégio Legal

    Relatório Geral

    Matricula Nome Serie Irmao Mensalidade

    xx xxxxx x x xx.xx

    xx xxxxx x x xx.xx

    xx xxxxx x x xx.xx

    xx xxxxx x x xx.xx

    xx xxxxx x x xx.xx

    Tecle enter para sair...

    Figura 2.4:Exemplos de telas do programa completo 2.1

     A primeira tela representa a operação de cadastramento dos

    dados dos alunos. Nesta tela, é que serão fornecidos os dados para o

    cadastramento dos alunos. Como a mensalidade é um dado calculado

    pelo programa, o usuário não fornecerá este dado no momento do

    cadastro.

     A segunda tela representa a apresentação dos dados de todos

    os alunos, em forma de tabela (listagem ou relatório). Cada linha databela apresentará os dados de um aluno.

    Como precisamos armazenar os vários dados de cada um dos

    alunos da escola, se faz necessário o uso de um vetor de registro.

    Segue o código do programa completo 2.1, que será comentado

    posteriormente.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    45/104

    45

    Programação 2 

    Programa Completo 2.1

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

     

    22

    23

    #include

    main()

    { typedef struct{ int mat, serie, irmao;

      char nome[20];

      oat mens;

      } Tipo_Aluno;

      Tipo_Aluno alunos[20];

      int qa, i, resp;

      qa =0;

      do

      { system(“cls”);

      printf(“Colegio Legal\n”);

    printf(“\n\nCadastro de Alunos\n\n”);

      printf(“\nMatricula.: “);

      scanf(“%d”,&alunos[qa].mat);

      printf(“\nNome......: “);

      fush(stdin);

      gets(alunos[qa].nome);

      printf(“\nSerie(1-4): “);

      scanf(“%d”,&alunos[qa].serie);

      printf(“\nIrmao na escola(1-sim/0-nao):“);

      scanf(“%d”,&alunos[qa].irmao);

      switch(alunos[qa].serie)

    24

    25

    26

    27

    28

      { case 1: alunos[qa].mens = 110; break;

      case 2: alunos[qa].mens = 130; break;

      case 3: alunos[qa].mens = 160; break;

      case 4: alunos[qa].mens = 170; break;

      }

  • 8/16/2019 Linguagem C- Volume 3 (1)

    46/104

    46

    Programação 2 

    29

    30

    31

    32

     

    33

    34

    35

    36

    37

    38

    39

     

    40

    41

    42

     

    43

    44

    45

    46

      if (alunos[qa].irmao == 1)

      alunos[qa].mens = alunos[qa].mens*0.8;

      qa++;

      printf(“\n\nDeseja cadastrar outro aluno(1-sim/0-nao)? “);

      scanf(“%d”,&resp);

      }while ((resp == 1) && (qa

  • 8/16/2019 Linguagem C- Volume 3 (1)

    47/104

    47

    Programação 2 

    • Linha 8:  declaração das variáveis qa  (que irá controlar a

    quantidade de alunos cadastrados no vetor),  i (utilizada como

    variável de controle do for ) e resp  (utilizada para saber se o

    usuário deseja continuar cadastrando novos alunos).

    • Linha 9: inicialização da variável qa com 0;

    • Linhas 10 a 34:  repetição do tipo do/while  que irá controlar

    o cadastro dos dados dos alunos no vetor de registro. Este

    do/while  irá parar a sua execução se o vetor car cheio (20

    elementos) ou se o usuário não quiser mais cadastrar.

    • Linha 11: Cada vez que o do/while é executado, queremos que

    a tela seja limpa. Para isso, usamos o system(“cls”). Esta linha

    tem, também, o abre chaves que indica o início da sequência

    de comandos do do/while.

    • Linhas 12 e 13:  printf para indicar o nome do colégio (Colégio

    Legal) e para indicar o que está sendo feito nesta tela (Cadastro

    de Alunos).

    • Linhas 14 e 15:  printf informando que o usuário deve digitar

    a matrícula do aluno e scanf  que obtêm a matrícula do aluno,

    armazenado-a no vetor de registro alunos, na posição qa e no

    campo mat. Notem que a variável qa iniciou com 0. Na primeiravez que o do/while for executado, os dados dos alunos serão

    armazenados na posição 0 do vetor. A cada vez que a repetição

    é executada, a variável qa  é incrementada de uma unidade.

     Assim, os dados de cada aluno serão armazenados em uma

    posição, diferente, no vetor de registro.

    • Linhas 16 a 18: printf  informando que o usuário deve digitar o

    nome do aluno. fush para limpar o buffer e, em seguida, o gets 

    responsável por ler o nome do aluno, armazenando no vetor deregistro alunos, na posição qa e no campo nome.

    • Linhas 19 e 20:  printf informando que o usuário deve digitar a

    série do aluno (que pode ser de 1 a 4). scanf responsável por

    ler a série do aluno, armazenando no vetor de registro alunos,

    na posição qa e no campo serie.

    • Linhas 21 e 22:  printf  informando que o usuário deve digitar se

    o aluno tem irmão na escola (digitar 1 se tiver irmão e 0 se nãotiver irmão na escola). scanf responsável por ler se o aluno tem

    irmão na escola, armazenando no vetor de registro alunos, na

  • 8/16/2019 Linguagem C- Volume 3 (1)

    48/104

    48

    Programação 2 

    posição qa e no campo irmao.

    • Linhas 23 a 28: depois de obter todos os dados de um aluno,

    o programa vai calcular o valor da mensalidade do aluno,

    vericando a série e se tem irmão na escola. Como cada uma

    das séries da escola tem um valor diferente de mensalidade,

    este switch  serve para vericar em que série o aluno está

    matriculado, para atribuir ao campo mens do registro do aluno,

    o valor da mensalidade correspondente a sua série.

    • Linhas 29 e 30: if  para vericar se o aluno tem irmão na escola.

    De acordo com o enunciado, os alunos que tem irmão na escola,

    recebem uma desconto de 20% na sua mensalidade. Como o if

    só tem um comando, não foi necessário o uso de chaves.

    • Linha 31: neste momento, todo o registro do aluno já foipreenchido. Com isso, fazemos o incremento da variável qa,

    informando que mais um aluno acabou de ser cadastrado.

    • Linhas 32 e 33:  printf   que pergunta se o usuário deseja

    continuar cadastrando novos alunos. scanf  para ler a resposta

    do usuário (1 se ele deseja continuar cadastrando e 0 se deseja

    parar).

    • Linha 34: fechamento do do/while com a condição que faz arepetição parar. Como mencionado anteriormente, este do/ 

    while ca em execução enquanto tem posições disponíveis no

    vetor ou enquanto o usuário desejar. Nesta linha, termina a fase

    de cadastramento dos dados dos alunos no vetor de registro.

    • Linhas 35 a 47: Esta sequência de comando serve para

    apresentar os dados dos alunos que foram armazenados

    no vetor de registro. Por uma questão de organização, estes

    dados serão apresentados na forma de tabela. Assim, cadalinha da tabela corresponderá aos dados de um aluno, ou

    seja, uma posição do vetor de registro. Para que a tabela que

    alinhada, precisamos saber que: a tela tem 80 colunas por 25

    linhas. Dessa forma, temos que distribuir as informações de um

     jeito que não extrapole as 80 colunas da tela. Para entender

    melhor esta parte do programa, acompanhem os comandos,

    observando a gura 2.9 (tela de execução do programa).

    • Linha 35: limpa a tela para darmos início à apresentação dosdados de todos os alunos.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    49/104

    49

    Programação 2 

    • Linhas 36 e 37: printf  para informar o nome do colégio e para

    informar o que esta tela faz (Relatório Geral).

    • Linha 38:  printf  para passar uma linha na tela. Esta linha vai

    delimitar o cabeçalho da tabela.

    • Linha 39: printf  que imprime os títulos de cada coluna da tabela. A tabela será composta pelas seguintes colunas: Matricula,

    Nome, Serie, Irmao e Mensalidade. Os títulos que devemos

    dar as colunas da tabela são sempre indicados nos enunciados

    das questões, certo? Sigam esta dica, porque vocês estão

    começando a aprender a fazer tabelas agora. Este printf  é cheio

    de detalhes, mas vamos ver isso agora, observando a gura

    2.5. O resultado deste printf  é a linha que está indicada com a

    seta.

    Figura 2.5: Apresentação dos dados em forma de tabela

    • Vamos ver quais são os passos para montar o printf  da linha 39

    (cabeçalhos/títulos das colunas da tabela).

    » Para cada coluna da tabela, veriquem quantas letras tem

    no seu cabeçalho. Por exemplo, a palavra matrícula, tem 9

    letras. Vejam que, na gura 2.5, tem a indicação de quantasletras tem em cada um dos cabeçalhos. A quantidade de

    letras que tiver o cabeçalho, será a largura da coluna.

    » Agora, precisamos vericar se os dados dos alunos vão

    extrapolar a largura de cada uma das colunas da tabela.

    Vamos ver uma por uma:

    √ Matricula: a coluna que será utilizada para apresentar

    a matrícula, tem uma largura de 9 espaços (quantidade

    de letras da palavra matrícula). Vamos considerar que

    nossas matrículas tem sempre menos que 9 dígitos.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    50/104

    50

    Programação 2 

     Assim, a largura de 9 espaços para esta coluna, é

    suciente.

    √ Nome: a palavra nome só tem 4 letras. Vejam que o

    nome do aluno foi declarado com 20 letras. Assim, se

    deixarmos a coluna Nome, com largura 4, não será

    suciente para apresentar os nomes dos alunos.

    Quando a quantidade de letras do cabeçalho é menor

    que o conteúdo que vem na coluna da tabela, devemos

    completar a coluna com espaços em branco até fazer

    com que a coluna tenha a largura que precisamos.

    √ Série: tem 5 letras. A série do aluno varia entre 1 e 4,

    dessa forma, a largura da coluna Serie (5 espaços),

    será suciente para apresentar o dado.√ Irmão: também tem 5 letras. A variável que armazena

    se o aluno tem ou não irmão na escola, varia entre 0 e

    1, dessa forma, a largura da coluna Irmao (5 espaços),

    será suciente para apresentar o dado.

    √ Mensalidade: tem 11 letras. Esta largura é suciente

    para apresentar o valor da mensalidade do aluno.

    » Agora que já sabemos que apenas a coluna Nome não temlargura suciente para apresentar os nomes dos alunos,

    vamos ver quantos espaços em branco nós temos que

    colocar depois da palavra Nome, para que esta coluna

    tenha a largura que precisamos. Se o nome do aluno tem

    até 20 letras e a palavra Nome tem apenas 4 letras, faremos

    a seguinte conta: 20 – 4 = 16. Assim, depois da palavra

    Nome, temos que colocar 16 espaços em branco, para que

    a nossa coluna passe a ter a largura que precisamos (20).

    » Por m, temos que denir um espaçamento para separar

    uma coluna da outra. Nos nossos exemplos, vamos usar

    sempre três espaços separando uma coluna da outra.

     A padronização do espaçamento entre as colunas visa

    facilitar a programação, já que estamos vendo este assunto

    agora e o mesmo é cheio de detalhes.

    » Agora vamos montar o  printf , vejam a gura 2.6. Nós

    vamos colocando os títulos das colunas da tabela, e entrecada palavra, vamos colocando três espaços em branco,

  • 8/16/2019 Linguagem C- Volume 3 (1)

    51/104

    51

    Programação 2 

    que foi o espaçamento denido para separar as colunas.

    Só no caso da coluna nome, que depois que colocamos

    Nome, devemos dar os 16 espaços em branco para que ela

    passe a ser uma coluna de largura 20. Mas ainda teríamos

    que dar mais 3 espaços em branco, que é para separar a

    coluna nome, da coluna serie.

    Figura 2.6: Detalhamento do printf da linha 39

    » O  printf  está pronto! A primeira vista, parece complicado,

    mas depois vocês estarão fazendo a tabela bem rápido.

    • Linha 40:  printf  para passar uma linha na tela. Esta linha vai

    delimitar o cabeçalho da tabela.

    • Linha 41: for   para visitar cada uma das posições do vetor e

    apresentar os dados dos alunos. A variável de controle do for ,

    o i , vai variar de 0 até a ultima posição ocupada do vetor. A

    variável que tem esta informação é o qa.

    • Linha 42: este  printf   é que vai fazer a montagem das linhas

    da tabela, apresentado os dados dos alunos que estão

    armazenados no vetor de registro. Este  printf   também tem

    macetes, pois está relacionado com o printf  da linha 39. Vamos

    lá! Lembram que zemos a contagem para saber a largura

    de cada coluna da tabela? Vamos precisar desta informação

    agora.» Na primeira parte do  printf , temos a string   de controle

    (a gura 2.7 faz o detalhamento dessa parte do  printf ).

    Sabemos que as colunas da tabela são: matricula( número

    inteiro e esta coluna deve ter largura 9), nome  (vetor de

    caracteres com até 20 letras), serie (número inteiro e esta

    coluna tem largura 5), irmão (número inteiro e esta coluna

    tem largura 5) e mensalidade  (número real e esta coluna

    tem largura 11). Além disso, sabemos que entre cadacoluna, nós colocamos três espaços em branco. Com estas

    informações, vamos montar a string  de controle do printf  da

  • 8/16/2019 Linguagem C- Volume 3 (1)

    52/104

    52

    Programação 2 

    linha 42.

    Figura 2.7: Detalhamento do printf da linha 42 

    » Entre o % e a letra que indica o que vai ser impresso (%d,

    %s ou %f ), devemos colocar a largura da coluna. A primeira

    coluna da tabela é a da matricula, que é um número inteiro

    e que tem largura 9. Por isso, temos o %9d. Após cada

    uma das formatações, colocamos três espaços em branco, já que foi o espaçamento denido entre as colunas da

    tabela. No caso da variável caractere nome do aluno (que

    é a segunda coluna da tabela) colocamos %-20s (o – é

    para que o nome do aluno seja alinhado pela esquerda).

    Nas demais formatações não precisamos colocar o -, só

    utilizamos em campos caractere.

    » Após a string de controle, colocamos as variáveis que serão

    apresentadas na tela, na ordem em que as colunas foramdenidas.

    • Linha 43: printf  para passar uma linha na tela. Esta linha vai

    fechar a tabela.

    • Linha 44:  printf   que informa que o usuário deve teclar enter  

    para sair.

    • Linha 45: getche()  que evita que a tela de execução feche

    antes de vermos os resultados.

    • Linha 46: fecha chaves do programa principal.

     A gura 2.8 apresenta a tela de execução do programa 2.1, na

    fase do cadastramento dos alunos.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    53/104

    53

    Programação 2 

    Figura 2.8: Tela de execução do programa completo 2.1 - Cadastro

     A gura 2.9 apresenta a tela de execução do programa 2.1, na

    fase do apresentação dos dados de todos os alunos cadastrados, em

    forma de tabela.

    Figura 2.9: Tela de execução do programa completo 2.1 – Relatório Geral

    Viram como esta questão é cheia de detalhes? Mas não se

    assustem, a explicação precisava ser minuciosa, para que cada linha

    do programa fosse entendida. Agora precisamos treinar esse tipo de

    questão. Não percam tempo!

    Atividades e Orientações de Estudos

    Vamos resolver mais uma lista de exercícios? Esta lista é composta

    por questões em que se faz necessário o uso de vetor de registro.

    DICA: sempre coloque as tabelas com os mesmos cabeçalhos

    propostos nos enunciados (exemplos de telas). Mãos a obra!

    1. Uma empresa de turismo deseja um programa que calcule o

    valor das viagens dos clientes. Serão informados os seguintes

  • 8/16/2019 Linguagem C- Volume 3 (1)

    54/104

    54

    Programação 2 

    dados: código do cliente, nome, roteiro desejado(1-Brasil,

    2-EUA, 3-África), tipo de quarto (1-Standard, 2-Luxo), Se deseja

    alugar carro(1-sim/0-nao) e a quantidade de dias. A quantidade

    de clientes é desconhecida. O programa irá calcular o total da

    viagem usando os valores da tabela abaixo, que variam de

    acordo com o roteiro escolhido. A diária do quarto de luxo éR$30 mais cara que o valor da diária em um quarto standard.

    Exemplo: Se a pessoa escolher roteiro 2, em quarto de luxo, a

    diária irá custar: 320 + 30 = R$ 350.

    Roteiro Diária – Hotel

    Quarto Standard

    Diária - Aluguel

    de carro

    1 R$ 170 R$ 50

    2 R$ 350 R$ 60

    3 R$ 370 R$ 75

    Total da Viagem: 

    dias*diáriahotel + dias*diariacarro(se o cliente for alugar carro)

      Armazenar os dados em um vetor de registro. Imprimir os dados

    em forma de tabela. Exemplo das telas:

    Viagem Legal – Turismo

    Cadastro de Cliente

    Codigo:Nome:Roteiro (1-Brasil, 2-EUA, 3-África):Tipo de Quarto (1- Standard, 2-Luxo): Alugar Carro (1-sim/0-nao)? Quantidade de Dias:

    Inserir outro (1-sim,0-nao)?

    Viagem Legal – Turismo

    Relatório Geral

    Código Nome Roteiro Quarto Carro Dias Total

    xx xxxxx x x x xx xx.xx

    xx xxxxx x x x xx xx.xx

    xx xxxxx x x x xx xx.xx

    Tecle enter para sair...

  • 8/16/2019 Linguagem C- Volume 3 (1)

    55/104

    55

    Programação 2 

    2. Faça um programa para montar a folha de pagamento dos

    empregados de uma empresa. Para cada empregado serão

    lidos os seguintes dados: matricula, nome, cargo(1-Analista

    de Sistemas/2- programador), sexo(1-mas/2-fem), anos de

    experiência e quantidade de lhos. O programa irá calcular

    para cada empregado o seu salário. Sabe-se que:

    Cargo Salário Base

    1 R$ 2500

    2 R$ 1700

      O salário será calculado da seguinte forma: Cada cargo tem

    o salário base. Além do salário base, o empregado recebe os

    seguintes adicionais: R$ 50, para cada ano de experiência e R$

    40 por cada lho. Portanto, um analista de sistemas com três

    anos de experiência e dois lhos terá o salário = 2500 + 50*3 +

    40*2 = R$ 2730.

      Armazenar as informações em um vetor de registros. Imprimir

    o relatório geral em forma de tabela contendo os dados de

    cada empregado. A quantidade de empregados da empresa é

    desconhecida (declarar o vetor com capacidade de armazenar

    20 funcionários). Exemplos das telas:

    Empresa Legal

    Cadastro de Funcionario

    Matricula:Nome:Cargo(1-Analista de Sistemas, 2- programador):Sexo(1-mas/2-fem):  Anos de experiência:Quantidade de lhos:

    Cadastrar outro (1-sim/2-nao)?

  • 8/16/2019 Linguagem C- Volume 3 (1)

    56/104

    56

    Programação 2 

    Empresa Legal

    Listagem Geral

    Matricula Nome Cargo Sexo Anos Q. Filho Salário

    xx xxxxx x x xx x xxx.xx

    xx xxxxx x x xx x xxx.xx

    xx xxxxx x x xx x xxx.xx

    xx xxxxx x x xx x xxx.xx

    Tecle enter para sair...

    3. Faça um programa para uma empresa de celular contendo asseguintes operações: cadastro de clientes e listagem geral.

    Para cada cliente devemos armazenar: código, nome, sexo

    (1-feminimo/2-masculino), quantidade de ligações, plano que

    o cliente está associado (1-Dia/2-Noite/3-Fixo/4-Empresarial) e

    Valor da conta. O programa irá calcular o valor da conta de cada

    cliente. Sabe-se que, cada plano tem uma tarifa diferenciada,

    segundo a tabela abaixo:

    Plano Valor de 1 ligação

    Dia 1.30

    Noite 1.60

    Fixo 1.25

    Empresarial 1.10

     Armazenar os dados em um vetor de registro. Após o cadastro dos

    clientes, apresentar a listagem com os dados de todos os clientes, em

    forma de tabela. A quantidade de clientes é desconhecida. Declare o

    vetor com capacidade de receber até 50 clientes.

    Exemplos das telas:

  • 8/16/2019 Linguagem C- Volume 3 (1)

    57/104

    57

    Programação 2 

    Ligue Mais

    Cadastro de Cliente

    Código:Nome:

    Sexo(1-fem/2-mas): Quantidade de Ligações:Plano(1-Dia/2-Noite/3-Fixo/4-Empresarial):

    Cadastrar outro (1-sim/0-nao)?

    Ligue Mais

    Listagem Geral

    Codigo Nome Sexo Quant. Lig. Plano Total

    xx xxxxx x xx x xxx.xx

    xx xxxxx x xx x xxx.xx

    xx xxxxx x xx x xxx.xx

    xx xxxxx x xx x xxx.xx

    Tecle enter para sair...

    4. Um professor quer um programa para o cálculo da média dosalunos de uma turma. Serão informadas a matrícula, nome (20

    caracteres), e as três notas dos alunos. O professor descarta

    a menor nota do aluno e a media é calculada com as duas

    maiores notas. Calcular a média e apresentar os resultados em

    forma de tabela, após o cadastramento. Armazenar os dados em

    um vetor de registro. A quantidade de alunos é desconhecida,

    declare o vetor com capacidade de receber até 20 alunos.

    Exemplos das Telas:

    Universidade Legal

    Cadastro de aluno

    Matricula:Nome:Nota 1:Nota 2:Nota 3:

    Cadastraroutro (1-sim/0-nao)?

  • 8/16/2019 Linguagem C- Volume 3 (1)

    58/104

    58

    Programação 2 

    Universidade Legal

    Relatório Geral

    Matricula Nota1 Nota2 Nota3 Media

    x xxxxxxxxx x.x x.x x.x x.x

    x xxxxxxxxx x.x x.x x.x x.x

    x xxxxxxxxx x.x x.x x.x x.x

    x xxxxxxxxx x.x x.x x.x x.x

    Tecle enter para sair...

    5. O MEC quer um programa para fazer um relatório sobre ospólos de educação a distância da UFRPE. Para cada pólo são

    informados os seguintes dados: código do pólo, cidade, total

    de alunos, total de tutores, se possui laboratório de informática

    (1-sim/0-não) e se possui laboratório de ciências (1-sim/0-não).

    O MEC quer saber quanto deve ser liberado de verba para cada

    pólo. O calculo será feito da seguinte forma:

    • Por cada aluno são liberados: R$ 100

    • Por cada tutor são liberados: R$ 500

    • Se o pólo tem não tem laboratório de informática são liberados:

    R$ 20.000

    • Se o pólo não tem laboratório de ciências são liberados: R$

    17.000

    Ex: um pólo com 150 alunos, com 15 tutores, que tem laboratório

    de informática, mas não tem laboratório de ciências: Verba = 100 x

    150 + 500 x 15 + 17000 = 15000 + 7500 + 17000 = 39500.

     Armazenar os dados dos pólos em um vetor de registro. A

    quantidade de pólos é desconhecida. Declarar o vetor com a

    capacidade de armazenar até 20 pólos. Após o cadastros dos pólos,

    apresentar todos os dados dos pólos em forma de tabela.

    Exemplos das telas:

  • 8/16/2019 Linguagem C- Volume 3 (1)

    59/104

    59

    Programação 2 

    Ministério da Educação

    Cadastro de Polo

    Codigo:Cidade:

    Quantidade de alunos:Quantidade de tutores:Tem lab. de informatica (1-sim/0-nao)? Tem lab. de ciencias (1-sim/0-nao)?

    Cadastrar outro pólo (1-sim,0-nao)?

    Ministério da Educação

    Listagem Geral

    Codigo Cidade Alunos Tutores LI LC Verba Liberada

    xx xxxxx xxx xxx x x xxxxx.xx

    xx xxxxx xxx xxx x x xxxxx.xx

    xx xxxxx xxx xxx x x xxxxx.xx

    xx xxxxx xxx xxx x x xxxxx.xx

    Tecle enter para sair...

    Conheça Mais

    Vocês poderão aprender mais sobre registros e vetores de registros

    lendo os livros:

      MONTGOMERY, Eduard. Programando em C: Simples ePrático. São Paulo: Alta Books, 2006.

      SCHILDT, Herbert. C Completo e Total. São Paulo: Makron,

    1996.

    Vamos Revisar?

    Nesta seção iremos revisar os principais tópicos vistos neste

  • 8/16/2019 Linguagem C- Volume 3 (1)

    60/104

    60

    Programação 2 

    capítulo. Vale a pena dar uma lida para vericar como está o nosso

    aprendizado. Observem o resumo a seguir:

    Os registros são um agrupamento de variáveis de tipos diferentes,mas que tem uma relação lógica.

    Por ser formado por elementos de diferentes tipos, os registros sãochamados de estruturas de dados heterogêneas.

    Para declarar uma variável registro, precisamos denir um novotipo de dado para o programa, utilizando o typedef.

    Cada elemento do registro é chamado de campo.

    Unindo os conceitos de vetores e de registros, temos os vetoresde registro que facilitam a declaração e o manuseio de grandes

    volumes de dados.

  • 8/16/2019 Linguagem C- Volume 3 (1)

    61/104

    61

    Programação 2 

    Capítulo 3 – Armazenamento de

    Dados em Arquivos

    Vamos conversar sobre o assunto?

    Neste capítulo, vamos aprender a armazenar nossos dados de

    forma denitiva. Até então, ao terminar a execução de um programa,

    todos os dados que foram armazenados nas variáveis eram perdidos.

    Em muitas aplicações isto não pode acontecer. Por exemplo, um

    professor precisa ter certeza de que todo o trabalho para digitar

    as notas dos alunos da turma não será perdido quando ele fechar

    o programa. Com os arquivos, poderemos armazenar os dados e

    recuperá-los quando necessário. Este capítulo abordará os comandos

    que nos possibilitarão manipular dados armazenados em um arquivo.

    Vamos começar?

    3.1 O que são arquivos?

    Os arquivos são estruturas de dados manipuladas fora do ambiente

    do programa. Considera-se como ambiente do programa a memória

    principal, onde nem sempre é conveniente manter certas estruturas

    de dados. De modo geral, os arquivos são armazenados na memória

    secundária, como, por exemplo: disco rígido (HD), CD e pendrive.

    3.1.1. Como os arquivos são organizados?

     A linguagem C utiliza o conceito de uxo de dados (stream) para

    manipular os vários tipos de dispositivos de armazenamento e seus

    diferentes formatos. Os dados podem ser manipulados em doisdiferentes tipos de uxos: uxos de texto e uxos binários.

    Um uxo de texto (text stream) é composto por uma sequência

    de caracteres, que pode ou não ser dividida em linhas, terminadas

    por um caractere de nal de linha. Um uxo binário (binary stream) é

    composto por uma sequência de bytes, que são lidos, se