Estrutura de Dados Em c Pronatec

Embed Size (px)

Citation preview

  • CDIGO DE BARRAS ISBN

    Curso Tcnico em Informtica

    Estrutura de DadosNdia Mendes dos Santos

    Geraldo Nunes da Silva Jnior

    Otlio Paulo da Silva Neto

  • Estrutura de Dados

    Ndia Mendes dos Santos

    Geraldo Nunes da Silva Jnior

    Otlio Paulo da Silva Neto

    2013Teresina - PI

  • Presidncia da Repblica Federativa do Brasil

    Ministrio da Educao

    Secretaria de Educao a Distncia

    Equipe de ElaboraoInstituto Federal de Educao, Cincia e Tecno-logia do Piau IFPI

    Coordenao do CursoThiago Alves Elias da Silva/IFPI

    Professores-autoresNdia Mendes dos Santos/IFPIGeraldo Nunes da Silva Jnior/IFPIOtlio Paulo da Silva Neto/IFPI

    Comisso de Acompanhamento e ValidaoUniversidade Federal de Santa Catarina UFSC

    Coordenao InstitucionalAraci Hack Catapan/UFSC

    Coordenao do ProjetoSilvia Modesto Nassar/UFSC

    Coordenao de Design InstrucionalBeatriz Helena Dal Molin/UNIOESTE e UFSC

    Coordenao de Design GrficoJuliana Tonietto/UFSC

    Design InstrucionalEleonora Schlemper Mendona/UFSCGustavo Pereira Mateus/UFSC

    Web MasterRafaela Lunardi Comarella/UFSC

    Web DesignBeatriz Wilges/UFSCMnica Nassar Machuca/UFSC

    DiagramaoBrbara Zardo/UFSCRoberto Colombo/UFSC

    Projeto Grficoe-Tec/MEC

    Catalogao na fonte pela Biblioteca Universitria da Universidade Federal de Santa Catarina

    Instituto Federal de Educao, Cincia e Tecnologia do PiauEste Caderno foi elaborado em parceria entre o Instituto Federal de Educao, Cincia e Tecnologia do Piau e a Universidade Federal de Santa Catarina para a Rede e-Tec Brasil.

    S237e Santos, Ndia Mendes dos Estrutura de dados / Ndia Mendes dos Santos,

    Geraldo Nunes da Silva Jnior, Otlio Paulo da Silva Neto. Teresina : Instituto Federal de Educao, Cincia e Tecnologia do Piau, 2013.

    150 p. : il., tabs.

    Inclui bibliografia

    1. Estruturas de dados (Computao). 2. Linguagem de programao(Computadores). 3. Programao (Computadores). I. Silva Jnior, Geraldo Nunes da. II. Silva Neto, Otlio Paulo da. III.

    Ttulo. CDU: 681.31:061.6

  • e-Tec Brasil33

    Apresentao e-Tec Brasil

    Bem-vindo a Rede e-Tec Brasil!

    Voc faz parte de uma rede nacional de ensino, que por sua vez constitui

    uma das aes do Pronatec - Programa Nacional de Acesso ao Ensino Tc-

    nico e Emprego. O Pronatec, institudo pela Lei n 12.513/2011, tem como

    objetivo principal expandir, interiorizar e democratizar a oferta de cursos de

    Educao Profissional e Tecnolgica (EPT) para a populao brasileira propi-

    ciando caminho de o acesso mais rpido ao emprego.

    neste mbito que as aes da Rede e-Tec Brasil promovem a parceria entre a

    Secretaria de Educao Profissional e Tecnolgica (SETEC) e as instncias promo-

    toras de ensino tcnico como os Institutos Federais, as Secretarias de Educao

    dos Estados, as Universidades, as Escolas e Colgios Tecnolgicos e o Sistema S.

    A educao a distncia no nosso pas, de dimenses continentais e grande

    diversidade regional e cultural, longe de distanciar, aproxima as pessoas ao

    garantir acesso educao de qualidade, e promover o fortalecimento da

    formao de jovens moradores de regies distantes, geograficamente ou

    economicamente, dos grandes centros.

    A Rede e-Tec Brasil leva diversos cursos tcnicos a todas as regies do pas,

    incentivando os estudantes a concluir o ensino mdio e realizar uma forma-

    o e atualizao contnuas. Os cursos so ofertados pelas instituies de

    educao profissional e o atendimento ao estudante realizado tanto nas

    sedes das instituies quanto em suas unidades remotas, os polos.

    Os parceiros da Rede e-Tec Brasil acreditam em uma educao profissional

    qualificada integradora do ensino mdio e educao tcnica, - capaz de

    promover o cidado com capacidades para produzir, mas tambm com auto-

    nomia diante das diferentes dimenses da realidade: cultural, social, familiar,

    esportiva, poltica e tica.

    Ns acreditamos em voc!

    Desejamos sucesso na sua formao profissional!

    Ministrio da Educao

    Janeiro de 2013

    Nosso contato

    [email protected]

  • e-Tec Brasil5

    Indicao de cones

    Os cones so elementos grficos utilizados para ampliar as formas de

    linguagem e facilitar a organizao e a leitura hipertextual.

    Ateno: indica pontos de maior relevncia no texto.

    Saiba mais: oferece novas informaes que enriquecem o assunto ou curiosidades e notcias recentes relacionadas ao

    tema estudado.

    Glossrio: indica a definio de um termo, palavra ou expresso utilizada no texto.

    Mdias integradas: sempre que se desejar que os estudantes desenvolvam atividades empregando diferentes mdias: vdeos,

    filmes, jornais, ambiente AVEA e outras.

    Atividades de aprendizagem: apresenta atividades em diferentes nveis de aprendizagem para que o estudante possa

    realiz-las e conferir o seu domnio do tema estudado.

  • e-Tec Brasil7

    Sumrio

    Palavra do professor-autor 9

    Apresentao da disciplina 11

    Projeto instrucional 13

    Aula 1 Introduo a linguagem de programao C 151.1 Apresentao 15

    1.2 Introduo 15

    1.3 Estrutura bsica de um programa em C 17

    1.5 Viso geral: instrues de entrada e sada 17

    1.6 Fundamentos em C 18

    1.7 Comandos bsicos 19

    1.8 Tipos de dados 22

    1.9 Variveis 23

    1.10 Operadores 25

    1.11 Tomada de deciso 28

    1.12 Laos 32

    Aula 2 Funes, matrizes, ponteiros e arquivos 372.1 Funes 37

    2.2 Matrizes 41

    2.3 Ponteiros 43

    2.4 Arquivos 46

    Aula 3 Viso geral de estrutura de dados e lista linares 593.1 Introduo 59

    3.2 Conceitos bsicos 59

    Aula 4 Pilhas 974.1.Introduo 97

    4.2.Pilha esttica 97

    4.3. Pilha dinmica 102

  • Aula 5 Filas e rvores 1115.1 Introduo fila 111

    5.2 Fila esttica 113

    5.3 Fila dinmica 119

    5.4 Introduo rvore 126

    5.5 rvore binria 128

    Aula 6 Ordenao e pesquisa 1356.1 Introduo ordenao 135

    6.2 Mtodo da bolha ou bubblesort 136

    6.3 Introduo pesquisa 141

    6.4 Pesquisa sequencial 141

    6.4 Pesquisa binria 144

    Referncias 148

    Currculo dos professores-autores 149

    e-Tec Brasil 8

  • e-Tec Brasil9

    Palavra do professor-autor

    Caro estudante!

    Bem-vindo disciplina de Estrutura de Dados. O objetivo desta disciplina

    apresentar a Linguagem de Programao C e os seus principais conceitos, bem

    como uma viso geral acerca de Estrutura de Dados abordando Listas (pilhas,

    filas) e rvores e uma introduo ordenao de dados, enfocando o Mtodo

    da Bolha (BubbleSort) e estratgias de pesquisa, especificamente Pesquisa Se-quencial e Binria, conceitos, aplicaes e implementaes, na linguagem C.

    Aproveite o curso e a disciplina, pesquise, troque informaes com seus co-

    legas e tire dvidas com seu tutor, pois ele tem muito mais informaes para

    compartilhar com voc.

    Bons estudos!

    Professores

    Ndia Mendes dos Santos

    Geraldo Nunes da Silva Jnior

    Otlio Paulo da Silva Neto

  • e-Tec Brasil11

    Apresentao da disciplina

    As estruturas de dados tm larga aplicao na computao em geral. Siste-

    mas Operacionais e aplicativos as utilizam para vrias atividades importants-

    simas, como gerenciamento de memria, execuo de processos, armazena-

    mento e gerenciamento de dados no disco, etc.

    As estruturas de dados definem a organizao, mtodos de acesso e opes

    de processamento para a informao manipulada pelo programa. A defini-

    o da organizao interna de uma estrutura de dados tarefa do projetista

    da estrutura, que define tambm qual a API para a estrutura, ou seja, qual

    o conjunto de procedimentos que podem ser usados para manipular os da-

    dos na estrutura. esta API que determina a viso funcional da estrutura

    de dados, que a nica informao relevante para um programador que v

    utilizar uma estrutura de dados pr-definida.

    Portanto, no faltam motivos para um estudante da rea ou qualquer de-

    senvolvedor/programador saberem a fundo e com fluncia sobre o assunto.

  • e-Tec Brasil13

    Disciplina: Estrutura de Dados (carga horria: 90h).

    Ementa: Estrutura de um programa em C. Constantes e Variveis; Operado-res, Expresses e Funes; Entrada e Sada. Estruturas de Controle; Funes

    e Procedimentos. Vetores e Registros; Ponteiros. Estrutura de Dados do Tipo

    TADs: Listas Lineares Estticas e Dinmicas. Pilhas Estticas e Dinmicas. Filas

    Estticas e Dinmicas. rvores: Binrias e Balanceadas. Algoritmos de Percur-

    so. Ordenao e Pesquisa de Dados.

    AULA OBJETIVOS DE APRENDIZAGEM MATERIAISCARGA

    HORRIA(horas)

    1. Introduo linguagem de programa-o C

    Conhecer e identificar a estrutura bsica de um programa em C.Implementar programas bsicos na lingua-gem C.Implementar programas em C utilizando as estruturas de deciso e as estrutura em laos.

    Ambiente Virtual de Ensino Aprendizagem (AVEA):http://cefetpi.nucleoead.net/etapi/;Webconferncia;

    15

    2. Funes, matrizes, ponteiros e arquivos

    Implementar matrizes, funes na linguagem C.Conceituar e implementar ponteiros.Implementar e classificar os mtodos de manipulao de ponteiros.Conceituar e manipular arquivos.

    Ambiente Virtual de Ensino Aprendizagem (AVEA):http://cefetpi.nucleoead.net/etapi/;Webconferncia;

    15

    3. Viso geral de estruturas e lista lineares

    Conceituar Estrutura de Dados.Descrever os tipos de Estrutura de Dados.Implementar as operaes bsicas da Estrutura de Dados do tipo Lista esttica e dinmica de ordenao e desordenao.

    Ambiente Virtual de Ensino Aprendizagem (AVEA):http://cefetpi.nucleoead.net/etapi/;Webconferncia;

    15

    4. PilhasConhecer o funcionamento de uma Pilha.Implementar as operaes bsicas em uma Estrutura Pilha Esttica e dinmica.

    Ambiente Virtual de Ensino Aprendizagem (AVEA):http://cefetpi.nucleoead.net/etapi/;Webconferncia;

    15

    5. Filas e rvores

    Conhecer e identificar uma Fila Esttica e Dinmica.Implementar Fila Esttica e Dinmica na linguagem C.Conceituar rvore e rvore Binria; Reconhe-cer os percursos em rvores binrias.

    Ambiente Virtual de Ensino Aprendizagem (AVEA):http://cefetpi.nucleoead.net/etapi/;Webconferncia;

    15

    6. Ordenao e pesquisa

    Classificar ou ordenar dados.Implementar o mtodo da Bolha ou Bub-bleSort.Conceituar e implementar diferentes estrat-gias de pesquisa.

    Ambiente Virtual de Ensino Aprendizagem (AVEA):http://cefetpi.nucleoead.net/etapi/;Webconferncia;

    15

    Projeto instrucional

  • e-Tec Brasil

    Aula 1 Introduo a linguagem de programao C

    Objetivos

    Conhecer e identificar a estrutura bsica de um programa em C.

    Implementar programas bsicos na linguagem C.

    Implementar programas em C utilizando as estruturas de deciso

    e as estrutura em laos.

    1.1 ApresentaoHabitualmente antes de resolvermos exemplos ou exerccios, elaboraremos o

    algoritmo, que nada mais que uma sequncia de operaes cuja execuo

    produz um resultado que a resposta de um problema proposto.

    Um programa de computador nada mais que a codificao de um algorit-

    mo numa linguagem de programao. Linguagens como C, Pascal, BASIC, ALGOL, Clipper, COBOL, etc., so chamadas procedurais, devido ao fato das instrues serem executadas de forma sequencial, enquanto que as lin-

    guagens baseadas no conceito de eventos como C++, Visual BASIC, Visual Objects, utilizam outra estratgia de programao (Programao Orientada ao Objeto), em C utilizaremos a metodologia estruturada.

    1.2 IntroduoA linguagem C foi desenvolvida inicialmente por Dennis M. Ritchie e Ken

    Tompson no laboratrio Bell no ano de 1972. Baseada na linguagem B cria-da por Tompson, esta linguagem evoluiu da linguagem BCPL, dando origem

    as duas linguagens anteriores.

    C foi inicialmente projetada para ser utilizada no sistema operacional Unix. Podemos definir a linguagem C como sendo uma linguagem de progra-

    mao robusta e multiplataforma, projetada para aplicaes modulares de

    rpido acesso.

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 15

  • Veremos aqui a estrutura ANSI C, verso padro definida pelo comit ame-ricano ANSI e suportada praticamente por todos os compiladores C.

    Podendo ser considerada como uma linguagem de mdio nvel, pois possui

    instrues que a tornam ora uma linguagem de alto nvel e estruturada como

    o Pascal, se assim se fizer necessrio, ora uma linguagem de baixo nvel, pois

    possui instrues to prximas da mquina, que s o Assembler possui.

    De fato com a linguagem C podemos construir programas organizados e con-

    cisos (como o Pascal), ocupando pouco espao de memria com alta velocida-de de execuo (como o Assembler). Infelizmente, dada toda a flexibilidade da linguagem, tambm poderemos escrever programas desorganizados e difceis

    de serem compreendidos (como usualmente so os programas em BASIC).

    Devemos lembrar que a linguagem C foi desenvolvida a partir da necessida-

    de de se escrever programas que utilizassem recursos prprios da linguagem

    de mquina de uma forma mais simples e portvel que o Assembler.

    Linguagem C case sensitive, ou seja, diferencia letras maisculas de minsculas.

    As inmeras razes para a escolha da linguagem C como a predileta para os

    desenvolvedores profissionais. As caractersticas da Linguagem C serviro

    para mostrar o porqu de sua ampla utilizao.

    1.2.1 Caractersticas da linguagem C Portabilidade entre mquinas e sistemas operacionais.

    Dados compostos em forma estruturada.

    Programas Estruturados.

    Total interao com o Sistema Operacional.

    Cdigo compacto e rpido, quando comparado ao cdigo de outras lin-guagem de complexidade anloga.

    ANSI a sigla para American National

    Standards Institute e designa uma organizao americana

    que tem a funo de estabelecer quais normas desenvolvidas

    devem virar padro.

    Estrutura de Dadose-Tec Brasil 16

  • 1.3 Estrutura bsica de um programa em CUm programa em C consistem em uma ou vrias funes. Vamos comear

    pelo menor programa possvel em C:

    main ( ) {

    }

    Todo programa em C tem necessariamente a funo main.

    Este programa compe-se de uma nica funo chamada main.

    Instrues de programa

    Vamos adicionar uma instruo ao nosso programa.

    main ( ){

    printf(ol); /* mostra na tela a mensagem Ol*/

    }

    1.4.1 ComentriosOs comentrios servem principalmente para documentao do programa e

    so ignorados pelo compilador, portanto no iro afetar o programa execu-

    tvel gerado. Os comentrios iniciam com o smbolo /* e se estendem at aparecer o smbolo */. Um comentrio pode aparecer em qualquer lugar no programa onde possa aparecer um espao em branco e pode se estender

    por mais de uma linha.

    1.5 Viso geral: instrues de entrada e sadaToda linguagem de programao de alto nvel suporta o conceito de Tipo

    de dado, que define um conjunto de valores que a varivel pode armaze-

    nar, e os tipos mais comuns encontrados nas linguagens de programao,

    ou seja, inteiro, real e caractere. Diferentemente do Pascal que fortemente tipada onde a mistura entre um nmero inteiro e um real pode causar erros,

    C suporta livremente tipos caracteres e inteiros na maioria das expresses!

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 17

  • Por ser capaz de manipular bits, bytes e endereos, C se adapta bem a pro-gramao em nvel de sistema. E tudo isto realizado por apenas 43 palavras

    reservadas no Turbo C, 32 nos compiladores padro ANSI e 28 no C Padro. Como curiosidade, o IBM BASIC que um interpretador BASIC com fins pu-ramente educativos tem 159 comandos.

    1.6 Fundamentos em CDesta forma a orientao que adotaremos neste incio do curso se deter

    mais na compreenso geral do programa, do que a anlise detalhada de

    cada comando ou funo utilizada. De fato apresentaremos alguns coman-

    dos fundamentais para a escrita de programas bsicos e apenas nos utilizare-

    mos sua sintaxe mais elementar (posteriormente estudaremos cada um deles

    mais detidamente), construiremos os primeiros programas do curso.

    Exemplo 1: Programa mostra a idade.

    /* Exemplo Idade */

    main ( ) {

    int idade;

    idade = 40;

    printf(Sua idade e %d anos. \n, idade);

    }

    Este programa simplesmente imprime Sua idade e 40 anos. saltando uma

    linha (/n) em seu trmino.

    1.6.1 Diretiva #includeToda a diretiva, em C, comea com o smbolo # no incio da linha. A diretiva #include inclui o contedo de outro arquivo dentro do programa atual, ou seja, a linha que contm a diretiva substituda pelo contedo do arquivo

    especificado.

    Sintaxe:

    #include

    ou

    #include nome do arquivo

    Estrutura de Dadose-Tec Brasil 18

  • O primeiro caso o mais utilizado. Ele serve para incluir alguns arquivos que

    contm declarao das funes da biblioteca padro, entre outras coisas.

    Estes arquivos, normalmente, possuem a extenso .h e se encontram em

    algum diretrio pr-definido pelo compilador (/usr/include no Linux; c:\dev--c++\include no Windows com o Dev-C++). Sempre que o programa utilizar alguma funo da biblioteca-padro deve ser includo o arquivo correspon-

    dente. A tabela a seguir apresenta alguns dos principais . h da linguagem C:

    Arquivo Descrio -

    stdio.h ->Funes de entrada e sada (I/O)

    string.h ->Funes de tratamento de strings

    math.h ->Funes matemticas

    ctype.h ->Funes de teste e tratamento de caracteres

    stdlib.h ->Funes de uso genrico

    A segunda forma, onde o nome do arquivo aparece entre aspas duplas,

    serve normalmente para incluir algum arquivo que tenha sido criado pelo

    prprio programador ou por terceiros e que se encontre no diretrio atual,

    ou seja, no mesmo diretrio do programa que est sendo compilado.

    1.7 Comandos bsicosAs instrues de entrada e sada so comandos quase que obrigatrios em

    qualquer programa na linguagem C. Na maioria dos programas em C, o

    usurio necessita entrar com algumas informaes e tambm saber o resul-

    tado de algum processamento. Descreve-se a seguir os comandos bsicos

    da linguagem C.

    1.7.1 Instrues de entrada e sadaO objetivo de escrevermos programas em ltima anlise, a obteno de

    resultados (Sadas) depois da elaborao de clculos ou pesquisas (Processa-

    mento) atravs do fornecimento de um conjunto de dados ou informaes

    conhecidas (Entradas).

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 19

  • 1.7.2 A funo printf ( ) um dos mais poderosos recursos da linguagem C, printf( ) servir basica-

    mente para a apresentao de dados no monitor.

    Sua forma geral ser: printf (string de controle, lista de argumentos);

    Necessariamente voc precisar ter tantos argumentos quantos forem os

    comandos de formatao na string de controle. Se isto no ocorrer, a tela exibir sujeira ou no exibir qualquer dado.

    Exemplo: Dado um nmero, calcule seu quadrado.

    #include

    #include

    main ( ) {

    int numero;

    numero=10;

    printf(O %d elevado ao quadrado resulta em %d. \n,

    numero,numero*numero);

    getch ( );

    }

    A diretiva #include foi utilizada, pois usamos o comando printf (stdio.h) e o comando getch (conio.h).

    Observemos o Quadro de Operadores Especiais suportados por printf( ):

    Cdigo Significado

    \b Retrocesso (BackSpace)

    \f Salto de Pgina (Form Feed)

    \n Linha Nova (Line Feed)

    \t Tabulao Horizontal (TAB)

    \x Representao de byte na base hexadecimal

    Exemplo: printf(\x41); causa a impresso da letra A na tela.

    Estrutura de Dadose-Tec Brasil 20

  • 1.7.3 A funo scanf ( )Uma das mais importantes e poderosas instrues, servir basicamente para

    promover leitura de dados (tipados) via teclado.

    Sua forma geral ser: scanf(string de controle, lista de argumentos);

    Posteriormente ao vermos sua sintaxe completa, abordaremos os recursos

    mais poderosos da , no momento bastar saber que:

    %c - leitura de caracter;

    %d - leitura de nmeros inteiros;

    %f - leitura de nmeros reais;

    %s - leitura de caracteres.

    A lista de argumentos deve conter exatamente o mesmo nmero de argu-

    mentos quantos forem os cdigos de formatao na . Se este no for o caso, diversos problemas podero ocorrer - incluindo at

    mesmo a queda do sistema - quando estivermos utilizando programas com-

    pilados escritos em C.

    Cada varivel a ser lida, dever ser precedida pelo caracter &, por razes que no momento no convm explicarmos, mas que sero esclarecidas no de-

    correr do curso. Para sequncia de caracteres (%s), o caracter & no dever ser usado.

    Exemplo: Programa para ler e mostrar uma idade.

    /* Exemplo L e Mostra Idade */

    main ( ) {

    int idade;

    char nome[30];

    printf(Digite sua Idade: );

    scanf(%d,&idade);

    printf(Seu Nome: );

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 21

  • scanf(%s,nome); /* Strings no utilizar & na leitura */

    printf(%s sua idade e %d anos. \n, nome, idade);

    }

    Faa um programa em C para perguntar sua profisso e mostrar na tela.

    Poste no AVEA da disciplina o arquivo de sua atividade.

    1.8 Tipos de dadosNo momento dispomos de conhecimento para elaborao de programas b-

    sicos para construo de pequenos programas, pois conhecemos instrues

    de entrada de dados (scanf) e de sada (printf).

    Veremos a seguir Tipos de Dados da linguagem C, variveis, operadores, e

    demais instrues bsicas. Devemos procurar compreender a utilidade das

    declaraes que sero exibidas a seguir, relacionando estes recursos com os

    exemplos e exerccios vistos anteriormente.

    Semelhante ao BASIC, Pascal e COBOL, a linguagem C necessita que todas as variveis tenham seus tipos definidos. C aceita tipos bsicos (caractere,

    inteiro, ponto flutuante, dupla preciso e sem valor) e modificadores (sinal,

    sem sinal, longo e curto) que podem alterar os tipos bsicos. Observemos o

    Quadro 1.1 para melhor entendimento.

    Quadro 1.1: Tabela de tamanhos e escala de tipos bsicosTipo Extenso Escala Numrica em bits

    Char 8 0 a 255

    Int 16 -32768 a 32767

    Float 32 3.4E-38 a 3.4E+38

    Double 64 1.7E-308 a 1.7E+308

    Void 0 Sem valorFonte: Schildt H, 1997

    Exemplo: Mesmo nmero com duas representaes diferentes.

    main ( ) {

    float a;

    printf(Digite um numero: );

    Estrutura de Dadose-Tec Brasil 22

  • scanf(%f,&a);

    printf(%f %e,a,a);

    }

    Simulando obtemos:

    Digite um nmero: 65

    65.000000 6.500000E+01

    1.9 VariveisAs variveis tem uma importncia fundamental na linguagem C. So utiliza-

    das como depsitos temporrios de informaes a serem processados pelo

    programa escrito na linguagem C.

    1.9.1 VariveisDe maneira semelhante as demais linguagens estruturadas, em C as vari-

    veis tem seus valores localizados nas rotinas onde foram declaradas (escopo).

    Todas as variveis devem ser declaradas desta forma:

    tipo nome_de_variaveis;

    Exemplos:

    int i,j,l;

    short int si;

    double balanco, consolidacao;

    char nome[30];

    Basicamente, as variveis podem ser declaradas fora das funes (globais) que

    valem para todas as funes do programa. Podem ser declaradas dentro de

    uma funo (locais) sendo desconhecida no restante do programa. Alm disso

    podem ser usadas para passagem de valores entre funes (parmetros).

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 23

  • 1.9.2 Inicializando variveisEm C podemos criar uma varivel e logo em seguida utilizarmos o operador de

    atribuio para inicializarmos o valor de uma varivel. Este processo denomina-

    -se inicializao de variveis. Vejamos abaixo como fazemos tal procedimento.

    int i=0;

    double x=10.5;

    Exemplo: Criando trs variveis e inicializando-as em tempo de criao.

    main ( ) {

    int evento = 5;

    char corrida = c;

    float tempo = 27.25;

    printf ( o melhor tempo da eliminatria % c, corrida);

    printf ( \ n do evento %d foi % f, evento, tempo);

    }

    Simulando obtemos:

    o melhor tempo da eliminatria c

    do evento 5 foi 27.25

    1.9.3 Nomes de variveisA escolha de nomes de variveis em C pode conter quantos caracteres qui-

    ser, sendo o primeiro caractere obrigatoriamente uma letra ou o caractere

    sublinhado. Outra caracterstica marcante em C, que os nomes de variveis

    podem ser criadas com nomes iguais, desde que contenham letras maiscu-

    las ou minsculas, para diferenci-las. isso mesmo, C fazer distino entre

    letras maisculas e minsculas.

    int valor;

    double Valor;

    Observem que as variveis possuem os mesmos nomes, s que a primeiro

    denominada valor escrita em minsculo e a segunda denominada Valor,

    sendo o primeiro caractere escrito em maiscula.

    Estrutura de Dadose-Tec Brasil 24

  • 1.10 OperadoresC uma das linguagens com maior nmero de operadores, devido possuir

    todos os operadores comuns de uma linguagem de alto nvel, porm tam-

    bm possuindo os operadores mais usuais a linguagens de baixo nvel. Para

    fins didticos, dividiremos os operadores em aritmticos, lgicos e de bits. No momento abordaremos apenas as duas primeiras classes.

    1.10.1 Operadores aritmticosOs operadores aritmticos so utilizados para efetuar as operaes mate-

    mticas bsicas como adio, multiplicao, diviso, resto de diviso inteira,

    subtrao o menos unrio, decremento e incremento. O Quadro 1.2 estabe-

    lece o operador aritmtico e a ao de cada um.

    Quadro 1.2: Operadores AritmticosOperador Ao

    + Adio

    * Multiplicao

    / Diviso

    % Resto de Diviso Inteira

    - Subtrao o menos unrio

    -- Decremento

    ++ IncrementoFonte: Schildt H, 1997

    1.10.2 Operadores relacionais e lgicosOs operadores relacionais e lgicos so utilizados para efetuar as operaes

    matemticas relacionais e lgicos que so os seguintes: como maior que,

    maior ou igual que, menor que, menor ou igual que, igual a, diferente de

    condio e. O Quadro 1.3 estabelece os operadores relacionais e lgicos e a

    ao de cada um.

    Quadro 1.3: Operadores relacionais e lgicosOperador Ao

    > Maior que

    >= Maior ou igual que

    < Menor que

  • Em C o resultado da comparao ser ZERO se resultar em FALSO e DIFE-

    RENTE DE ZERO no caso de obtermos VERDADEIRO num teste qualquer. Pro-

    gramadores experientes utilizam-se desta concluso em alguns programas,

    onde inexplicavelmente algo testado contra ZERO.

    Exemplo: Ir calcular a mdia de um aluno sendo que ele possua trs notas,

    a mdia a soma das notas dividida por trs.

    #include

    #include

    void main ( )

    {

    clrscr ( );

    float nota1;

    float nota2;

    float nota3;

    float media;

    printf(\n Digite a primeira nota..: );

    scanf(%f,&nota1);

    printf(\n Digite a segunda nota...: );

    scanf(%f,&nota2);

    printf(\n Digite a terceira nota..: );

    scanf(%f,&nota3);

    media=(nota1+nota2+nota3)/3;

    printf(\n\n Sua mdia ............:%6.2f,media);

    getch ( );

    }

    Faa um programa em C onde dado 5 nmeros, imprima-os em ordem cres-

    cente. Poste no AVEA da disciplina o arquivo de sua atividade.

    Estrutura de Dadose-Tec Brasil 26

  • 1.10.3 Incremento e decrementoPara efetuar o incremento de uma varivel deste tipo, s acrescentarmos

    (++) seguido do nome da varivel e para decrementar utilizamos (--) seguido

    do nome da varivel. Outra maneira de usarmos o incremento e decremento

    colocar o (++) ou (--) antecedendo o nome da varivel.

    Na ocorrncia de (++) ou (--) aps o nome da varivel, denominados ps-fi-

    xado, e antecedendo o nome da varivel, denominados prefixado. Vejamos

    alguns exemplos:

    n = n + 1; /* adiciona 1 a n */

    //seria o mesmo que

    ++n; /* adiciona 1 a n */

    //ou

    n++; /* adiciona 1 a n */

    O que muda nas operaes a cima, apenas o uso dos incrementos, ps-

    -fixados e prefixados, mas que fazem bastante diferenas quando utilizados

    em conjunto com outras instrues.

    Vejamos o exemplo:

    n = 10;

    m = ++n

    printf (\n N=%d M=%d, n, m);

    a = 10

    x = a++

    printf(\n A=%d X=%d, a, x);

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 27

  • Simulando obtemos:

    N=10 M=11

    A=10 X=10

    1.11 Tomada de decisoA tomada de deciso e um dos procedimentos mais comuns em programas

    de computadores, pois atravs deles que o computador decide que pro-

    cedimento executar. A linguagem C nos permite utilizar trs comando de

    deciso:

    if if-else switch

    1.11.1 Comando if-elseAnlogo a outras linguagens, sua forma geral ser:

    if

    ;

    else

    ;

    Exemplo 1: Programa Adulto, Jovem ou Velho.

    main ( ) {

    int i;

    printf(Digite sua idade: );

    scanf(%d,&i);

    if (i > 70)

    printf(Esta Velho!);

    else

    if (i > 21)

    Estrutura de Dadose-Tec Brasil 28

  • printf(Adulto);

    else

    printf(Jovem);

    }

    A expresso avaliada dever obrigatoriamente estar entre parnteses.

    Exemplo 2: Maior entre trs nmeros.

    main ( ) {

    int a,b,c;

    clrscr();

    printf(Digite o 1 Nmero: );

    scanf(%d,&a);

    printf(\nDigite o 2 Nmero: );

    scanf(%d,&b);

    printf(\nDigite o 3 Nmero: );

    scanf(%d,&c);

    if (a > b)

    if (a > c)

    printf(\nO Maior %d,a);

    else

    printf(\nO Maior %d,c);

    else

    if (b > c)

    printf(\nO Maior %d,b);

    else

    printf(\nO Maior %d,c);

    }

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 29

  • Exemplo 3: Maior entre trs nmeros (segunda soluo).

    main ( ) {

    int a,b,c,d;

    clrscr();

    printf(Digite o 1 Nmero: );

    scanf(%d,&a);

    printf(\nDigite o 2 Nmero: );

    scanf(%d,&b);

    printf(\nDigite o 3 Nmero: );

    scanf(%d,&c);

    if (a > b)

    d = a;

    else

    d = b;

    if (c > d)

    printf(\nO Maior %d,c);

    else

    printf(\nO Maior %d,d);

    }

    1.11.2 Comando switchEste comando nos permite selecionar uma opo entre vrias alternativas.

    A varivel ser validada e conforme seu valor executar a opo na qual se

    enquadra. Sua forma geral ser:

    Estrutura de Dadose-Tec Brasil 30

  • switch (opol) {

    case : instruo;

    break;

    case : instruo;

    break;

    case : instruo;

    break;

    default : instruo;

    }

    Exemplo 1: Programa adulto ou velho.

    #include

    #include

    int main ( )

    {

    int i;

    char sn;

    printf(Voce tem mais de 70 anos ? (S/N) );

    scanf(%c,&sn);

    switch (sn) {

    case s : printf(Voce Esta Velho! \n); break;

    case S : printf(Voce Esta Velho! \n); break;

    case n : printf(Voce Esta Adulto! \n); break;

    case N : printf(Voce Esta Velho! \n); break;

    }

    system (pause);

    }

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 31

  • 1.12 LaosUm dos grandes benefcios dos sistemas de processamento de dados est em

    sua confiabilidade (preciso nos clculos) e rapidez (infinitamente superior

    ao ser humano), desta forma ideal para processamento de elevado nmero

    de operaes repetitivas. O processamento de uma Folha de Pagamentos,

    a Emisso de Notas Fiscais, a Gerao de Estatsticas de Faturamento, so

    tpicas tarefas a serem realizadas por processamento eletrnico de dados.

    1.12.1 Comando forO lao for a instruo mais poderosa na criao de estruturas de repetio.

    Neste momento, abordaremos apenas sua sintaxe simplificada, Sua forma

    mais simples :

    for (;;) comando;

    Exemplo 1: Contagem de 1 a 100 ficaria.

    main ( ) {

    int cont;

    for (cont = 1; cont

  • O nmero 2 antes do d causa a representao em vdeo de 2 casas, per-

    mitindo o alinhamento da tabuada!.

    Exerccio1: Elabore tabela de Converso de temperaturas entre as escalas

    Celsius e Fahrnheit.

    #include

    #include

    main ( ) {

    int fahr;

    float celsius;

    for (fahr = 0; fahr

  • while () {

    ;

    }

    Exemplo 1: Contagem de 1 a 100 ficaria.

    main ( ) {

    int cont=0;

    while (cont = 100)

    cont++;

    printf(%d,cont);

    }

    1.12.3 Comando do-whileO lao do-while significa faa enquanto, e um comando utilizado para se

    realizar repeties com um diferencial que a execuo de pelo menos uma

    vez a instruo do lao, mesmo que a condio inicial seja falsa, pois a vali-

    dao da condio s feita depois da execuo do lao. Neste momento,

    abordaremos apenas sua sintaxe simplificada, Sua forma mais simples :

    do {

    ;

    } while ();

    Estrutura de Dadose-Tec Brasil 34

  • Exemplo 1: Contagem de 1 a 100 ficaria:

    #include

    #include

    int main() {

    int cont=0;

    do {

    cont++;

    printf(%d ,cont);

    } while (cont < 100);

    system(pause);

    }

    ResumoNesta aula abordamos conceitos da linguagem de programao C, a sua

    estrutura bsica de um programao, suas caractersticas, vantagens, des-

    vantagens, operaes, declaraes e manipulaes de variveis e as imple-

    mentaes das estruturas condicionais, bem como as implementaes de

    programas das estruturas de lao. Alm de exemplos prticos do nosso dia-

    -a-dia, a fim de um entendimento melhor por parte do leitor aumentando

    assim seu conhecimento terico.

    Assista video-aula da disciplina de Estrutura de Dados disponvel em http://cefetpi.nucleoead.net/etapi/. Aproveite para revisar os contedos da aula sobre Introduo a Linguagem de Programao C. Depois disto, anote em um documento Word suas dvidas e poste estas anotaes no frum do AVEA, para que voc compartilhe dvidas e sane dificuldades.

    e-Tec BrasilAula 1 Introduo a linguagem de programao C 35

  • Atividades de aprendizagem1. Elabore um programa em C que faa o seguinte:

    a) Mostre na tela o seu nome.

    b) Some 10 com 15 e imprima na tela a seguinte frase: O resultado da soma : mostrando o resultado.

    c) Faa a multiplicao entre 10 e 15 e mostre na tela o resultado.

    d) Pergunte o seu nome e imprima na tela.

    e) Pergunte o nome da pessoa e o sobrenome e imprimir os mesmos.

    f) Leia dois nmeros e apresente seu produto.

    g) Leia dois nmeros e apresenta a sua subtrao.

    h) Leia o nome e as duas notas de um aluno e apresente ambos na tela.

    Estrutura de Dadose-Tec Brasil 36

  • e-Tec Brasil

    Aula 2 Funes, matrizes, ponteiros e arquivos

    Objetivos

    Implementar matrizes, funes na linguagem C.

    Conceituar e implementar ponteiros.

    Implementar e classificar os mtodos de manipulao de ponteiros.

    Conceituar e manipular arquivos.

    2.1 FunesConceitualmente, C baseada em blocos de construo. Assim sendo, um pro-

    grama em C nada mais que um conjunto de funes bsicas ordenadas pelo

    programador. As instrues printf( ) e scanf( ), vistas anteriormente, no fazem parte do conjunto de palavras padres da linguagem (instrues), pois no pas-

    sam elas mesmas de funes escritas em C! Esta abordagem permite a portabi-

    lidade da linguagem, pois seus comandos de entaada e sada, no so parte do

    conjunto bsico da linguagem, livrando-a desta forma dos problemas de supor-

    te aos diversos padres de vdeos, teclados e sistemas operacionais existentes.

    Cada funo C na verdade uma sub-rotina que contm um ou mais co-

    mandos em C e que executa uma ou mais tarefas. Em um programa bem

    escrito, cada funo deve executar uma tarefa. Esta funo dever possuir

    um nome e a lista de argumentos que receber. As funes em C so muito

    semelhantes s usadas no Pascal, com a diferena que o prprio programa

    principal apenas uma funo que se inicia com a palavra reservada main ( ) podendo receber parmetros diretamente do DOS, por exemplo.

    Exemplo: Programa principal chamando funo alo.

    main ( ) {

    alo ( );

    }

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 37

  • alo ( ) {

    printf (Al!\n\n);

    }

    Retomemos o exemplo do clculo de um nmero elevado ao quadrado.

    Exemplo: Quadrado com funo.

    main ( ) {

    int num;

    printf(Digite um numero: );

    scanf(%d,&num);

    sqr(num); /* sqr recebe num do programa principal */

    }

    sqr ( ) {

    int x; /* x um parmetro recebido do programa principal

    no caso x vale o contedo de num */

    printf(%d ao quadrado e %d ,x,x*x);

    }

    O argumento simplesmente o valor (em num) digitado no programa

    principal (em scanf) e enviado a funo sqr.

    Um conceito importante e normalmente confundido a diferena conceitual en-

    tre argumento e parmetro que em resumo pode ser definido da seguinte

    forma: Argumento se refere ao valor que usado para chamar uma funo.

    O termo Parmetro se refere varivel em uma funo que recebe o valor dos

    argumentos usados na funo. A distino que deve ser compreendida que a

    varivel usada como argumento na chamada de uma funo no tem nenhuma

    relao com o parmetro formal que recebe o valor dessa varivel.

    Estrutura de Dadose-Tec Brasil 38

  • Exerccio: Passagem de variveis entre rotinas.

    int x;

    main ( ) {

    int a;

    printf(Digite um valor: );

    scanf(%d,&a);

    x = 2 * a + 3;

    printf(%d e %d,x,soma(a));

    }

    soma (z) {

    int z;

    x = 2 * x + z;

    return(x);

    }

    2.1.1 Prottipo de uma funoA declarao de uma funo quando feita no inicio de um programa em C

    dita prottipo da funo. Esta declarao deve ser feita sempre antes da

    funo main, definindo-se o tipo, o nome e os argumentos desta mesma funo. Exemplo:

    float soma (float, float);

    Definindo-se o prottipo de uma funo no necessrio escrever o cdi-

    go desta mesma funo antes da funo main, pois o prottipo indica ao compilador C que a funo est definida em outro local do cdigo. Vejamos

    agora a utilizao do exemplo anterior usando o prottipo de uma funo.

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 39

  • #include

    #include

    int sqr (int); /* prottipo da funo*/

    int main ( ) {

    int num;

    printf(Digite um numero: );

    scanf(%d,&num);

    sqr(num); /* sqr recebe num do programa principal */

    system(pause);

    }

    int sqr(int num) {

    int x = num; /* x um parmetro recebido do programa principal

    no caso x vale o contedo de num */

    printf(%d ao quadrado e %d \n,x,x*x);

    }

    2.1.2 Funo recursivaUma funo denomina-se recursiva quando dentro dela se faz uma chamada

    para ela mesma. Um exemplo prtico seria o clculo do fatorial de um nmero.

    Faa uma funo que escreva o endereo da varivel ZEND. Poste no AVEA

    da disciplina o arquivo de sua atividade.

    #include

    #include

    long fatorial (int);

    int main() {

    int n;

    do {

    Estrutura de Dadose-Tec Brasil 40

  • printf(Digite um numero ou negativo p/ sair \n);

    scanf(%d,&n);

    if (n < 0) {

    break;

    }

    printf(O Fatorial de %d eh %d \n,n,fatorial(n));

    } while (1);

    system(pause);

    return 0;

    }

    long fatorial (int n) {

    return ((n==0) ? (long)1 : (long)n * fatorial(n-1) );

    }

    2.2 MatrizesUma Matriz um conjunto de variveis de mesmo tipo que compartilham

    um mesmo nome. Com Matriz agora podemos armazenar mais de um valor

    para depois serem manipulados atravs de um ndice, o qual referencia cada

    um dos elementos, para se criar uma Matriz necessrio definir um tipo,

    seu nome e quantidade de elementos, sedo este ultimo entre colchetes ([ ]).

    Vejamos agora a declarao de uma matriz.

    int mat[5];

    2.2.1 Referenciao e Atribuio dos elementos de uma matriz

    Para se referenciar um elemento da Matriz individualmente, basta apenas

    colocar-se o nome desta Matriz seguida do seu ndice entre colchetes.

    Os ndices dos elementos de uma matriz so sempre iniciados por zero.

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 41

  • Vejamos um exemplo para se referenciar um elemento da Matriz:

    x = mat[10]; /* x recebe o elemento de mat na posio 10 */

    mat[10] = 20; /* o elemento de mat na posio 10 recebe o valor 20 */

    2.2.2 Inicializao de matrizesPara se inicializar uma Matriz necessrio apenas colocar-se o nome desta

    Matriz, a quantidade elementos entre colchetes seguida do operador de atri-

    buio e por fim os valores separados por ponto e vrgula entre as chaves ({

    }). Vejamos um exemplo para se iniciar uma Matriz.

    int mat[3] = {1;2;3}; /* matriz inicializada com os valores 1,2 e 3 */

    Para exemplificar melhor, vejamos o exemplo abaixo de um programa que

    calcula a media de trs notas.

    #include

    #include

    int main() {

    int i;

    float nota[3], m=0;

    for (i=0;i

  • 2.3 PonteirosO ponteiro nada mais do que uma varivel que guarda o endereo de

    outra varivel.

    2.3.1 Declarao de ponteirosA declarao de ponteiros feita da seguinte forma:

    int *ptr

    Conforme qualquer varivel em C, o ponteiro deve ser declarado antes de

    ser usado. Basta inserir o operador indireto (*) aps o tipo da varivel:

    int *ptr;

    Essa declarao define a varivelptrcomo um ponteiro para uma varivel do tipo int (nmero inteiro).

    A declarao de ponteiro no tem o mesmo significado da declarao de uma

    varivel. Ela indica apenas o tipo de objeto de dados apontado e, desde que

    contm endereo de memria, o tamanho em bytes que ocupa no tem relao com o tamanho do objeto apontado. O tamanho do ponteiro fixo e depende

    apenas do modelo de memria do sistema (2 bytes ou 4 bytes, normalmente).

    Para declarar mais de um ponteiro por linha, usa-se um operador indireto

    (*) para cada

    char *ch1, *ch2;(so ponteiros para o tipochar).

    Se um operador for omitido (exemplo:char *ch1, ch2;), a varivel corres-pondente no ser ponteiro e, certamente, provocar erro de execuo se

    usada como tal.

    2.3.2 Inicializao de ponteirosPara se inicializar um ponteiro necessrio apenas atribuir-se um endereo

    de memria.

    A simples declarao de um ponteiro no o faz til. necessria a indicao

    da varivel para a qual ele aponta.

    O ponteiro pode ser declarado para qualquer tipo legal de varivel em C (char,int,float,double, etc), alm devoid, que seria um genrico, podendo apontar para qualquer tipo de dado.

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 43

  • ....... ....... .......

    4052

    4053

    4054

    ptr var

    4052 10

    Figura 2.1: Inicializao de ponteiro

    int var;

    int *ptr;

    var = 10;

    ptr = &var;

    Na sequncia acima, so declarados uma varivel tipo int (var) e um ponteiro para o mesmo tipo (ptr). A terceira linha atribui o valor 10 a var e a ltima linha inicializa o ponteiro ptr.

    Observa-se o uso do operador de endereamento (&) para inicializao do

    ponteiro. Isso significa, no cdigo ptr = &var, que ptr passa a conter o en-dereo de var, no o seu valor. Supondo que o sistema endereado por 2

    bytes, a Figura 2.1 acima d uma ideia grfica dessa associao: o contedo de ptr 4052, que o endereo do primeiro byte da varivel var (ptr ocupa 2 bytes por causa do endereamento do sistema e var tambm ocupa 2 bytes, mas por ser do tipo int.

    O valor 4052 para a posio de memria de var apenas ilustrativo. Na pr-

    tica, depender do local de memria onde o programa foi carregado.

    Com ptr apontando para var, possvel realizar operaes com esta ltima de forma indireta, a partir de ptr. Exemplos a seguir.

    Acrescentando a linha

    int newVar = *ptr;

    ao cdigo anterior, o valor de newVar 10, que o valor de var lido indire-tamente atravs de ptr.

    Estrutura de Dadose-Tec Brasil 44

  • E a linha

    *ptr = 20;

    modifica o valor de var para 20, ou seja, altera de forma indireta atravs de ptr.

    importante lembrar que um ponteiro declarado e no inicializado poder ter

    contedo nulo ou aleatrio, a depender da alocao sistema. Nessa condio,

    se o contedo apontado for modificado, algumas posies de memria tero

    seus valores indevidamente alterados e as consequncias sero imprevisveis.

    Agora veremos um exemplo completo de utilizao de ponteiros:

    #include

    #include

    int main ( ) {

    int a;

    int b;

    int c;

    int *ptr; /* declara um ponteiro para um inteiro */

    /* um ponteiro para uma varivel do tipo inteiro */

    a = 100;

    b = 2;

    c = 3;

    ptr = &a; /* ptr recebe o endereo da varivel a */

    printf(Valor de ptr: %p, Contedo de ptr: %d\n, ptr, *ptr);

    printf(B: %d, C: %d \n, b, c);

    a = 200;

    printf(Valor de ptr: %p, Contedo de ptr: %d\n, ptr, *ptr);

    system(pause);

    }

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 45

  • Escreva um resumo sobre ponteiros. Poste no AVEA da disciplina o arquivo

    de sua atividade.

    2.4 ArquivosUm arquivo pode ser visto de duas maneiras, na maioria dos sistemas opera-

    cionais: em modo texto, como um texto composto de uma sequncia de

    caracteres, ou em modo binrio, como uma sequncia de bytes (nmeros binrios). Podemos optar por salvar (e recuperar) informaes em disco usando

    um dos dois modos, texto ou binrio. Uma vantagem do arquivo texto que

    pode ser lido por uma pessoa e editado com editores de textos convencionais.

    Em contrapartida, com o uso de um arquivo binrio possvel salvar (e recupe-

    rar) grandes quantidades de informao de forma bastante eficiente. O sistema

    operacional pode tratar arquivos texto de maneira diferente da utilizada para

    tratar arquivos binrios. Em casos especiais, pode ser interessante tratar ar-

    quivos de um tipo como se fossem do outro, tomando os cuidados apropriados.

    2.4.1 Funes para manipulao de arquivosA funo bsica para abrir um arquivo fopen:

    FILE* fopen (char* nome_arquivo, char* modo);

    Quando abrimos um arquivo, a funo tem como valor de retorno um pon-

    teiro para o tipo FILE, e todas as operaes subsequentes nesse arquivo re-cebero este endereo como parmetro de entrada. Se o arquivo no puder

    ser aberto, a funo tem como retorno o valor NULL.

    Devemos passar o nome do arquivo a ser aberto. O nome do arquivo pode ser

    relativo, e o sistema procura o arquivo a partir do diretrio corrente (diretrio

    de trabalho do programa), ou pode ser absoluto, onde especificamos o nome

    completo do arquivo, incluindo os diretrios, desde o diretrio raiz. Existem

    diferentes modos de abertura de um arquivo. Podemos abrir um arquivo para

    leitura ou para escrita, e devemos especificar se o arquivo ser aberto em

    modo texto ou em modo binrio. O parmetro modo da funo fopen uma cadeia de caracteres onde espera-se a ocorrncia de caracteres que identifi-

    cam o modo de abertura. Os caracteres interpretados no modo so:

    R read-only Indica modo apenas para leitura, no pode ser alterado.

    W write Indica modo para escrita.

    A append Indica modo para escrita ao final do existente.

    T text Indica modo texto.

    B binary Indica modo binrio.

    FILE um tipo definido pela biblioteca

    padro que representa uma abstrao do arquivo.

    Estrutura de Dadose-Tec Brasil 46

  • Se o arquivo j existe e solicitamos a sua abertura para escrita com modo w, o arquivo apagado e um novo, inicialmente vazio, criado. Quando solicitamos

    com modo a, o mesmo preservado e novos contedos podem ser escritos no

    seu fim. Com ambos os modos, se o arquivo no existe, um novo criado.

    Os modos b e t podem ser combinados com os demais. Maiores detalhes e outros modos de abertura de arquivos podem ser encontrados nos manuais

    da linguagem C. Em geral, quando abrimos um arquivo, testamos o sucesso

    da abertura antes de qualquer outra operao, por exemplo:

    FILE* fp;

    fp = fopen(entrada.txt,rt);

    if (fp == NULL) {

    printf(Erro na abertura do arquivo!\n);

    exit(1);

    }

    Aps ler/escrever as informaes de um arquivo, devemos fech-lo. Para fe-

    char um arquivo, devemos usar a funo fclose, que espera como parmetro o ponteiro do arquivo que se deseja fechar. O prottipo da funo :

    int fclose (FILE* fp);

    O valor de retorno dessa funo zero, se o arquivo for fechado com sucesso,

    ou a constante EOF (definida pela biblioteca), que indica a ocorrncia de um erro.

    2.4.2 Arquivos em modo textoNesta seo, vamos descrever as principais funes para manipular arquivos

    em modo texto. Tambm discutiremos algumas estratgias para organizao

    de dados em arquivos.

    2.4.3 Funes para ler dadosA principal funo de C para leitura de dados em arquivos em modo texto

    a funo fscanf, similar funo scanf que temos usado para capturar valores entrados via o teclado. No caso da fscanf, os dados so capturados de um arquivo previamente aberto para leitura. A cada leitura, os dados

    correspondentes so transferidos para a memria e o ponteiro do arquivo

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 47

  • avana, passando a apontar para o prximo dado do arquivo (que pode ser

    capturado numa leitura subsequente). O prottipo da funo fscanf :

    int fscanf (FILE* fp, char* formato, ...);

    Conforme pode ser observado, o primeiro parmetro deve ser o ponteiro do

    arquivo do qual os dados sero lidos. Os demais parmetros so os j discu-

    tidos para a funo scanf: o formato e a lista de endereos de variveis que armazenaro os valores lidos. Como a funo scanf, a funo scanf tambm tem como valor de retorno o nmero de dados lidos com sucesso.

    Uma outra funo de leitura muito usada em modo texto a funo fgetc que, dado o ponteiro do arquivo, captura o prximo caractere do arquivo. O

    prottipo dessa funo :

    int fgetc (FILE* fp);

    Apesar do tipo do valor de retorno ser int, o valor retornado o caractere

    lido. Se o fim do arquivo for alcanado, a constante EOF (end of file) retor-nada. Outra funo muito utilizada para ler linhas de um arquivo a funo

    fgets. Essa funo recebe como parmetros trs valores: a cadeia de carac-teres que armazenar o contedo lido do arquivo, o nmero mximo de ca-

    racteres que deve ser lido e o ponteiro do arquivo. O prottipo da funo :

    char* fgets (char* s, int n, FILE* fp);

    A funo l do arquivo uma sequncia de caracteres, at que um caractere

    \n seja encontrado ou que o mximo de caracteres especificado seja alcan-ado. A especificao de um nmero mximo de caracteres importante para

    evitarmos que se invada memria quando a linha do arquivo for maior do que

    supnhamos. Assim, se dimensionarmos nossa cadeia de caracteres, que rece-

    ber o contedo da linha lida, com 121 caracteres, passaremos esse valor para

    a funo, que ler no mximo 120 caracteres, pois o ltimo ser ocupado pelo

    finalizador de string o caractere \0. O valor de retorno dessa funo o pon-teiro da prpria cadeia de caracteres passada como parmetro ou NULL no caso de ocorrer erro de leitura (por exemplo, quando alcanar o final do arquivo).

    Estrutura de Dadose-Tec Brasil 48

  • 2.4.4 Funes para escrever dadosDentre as funes que existem para escrever (salvar) dados em um arquivo,

    vamos considerar as duas mais frequentemente utilizadas: fprintf e fputc, que so anlogas, mas para escrita, s funes que vimos para leitura.

    A funo fprintf anloga a funo printf que temos usado para imprimir dados na sada padro em geral, o monitor. A diferena consiste na pre-

    sena do parmetro que indica o arquivo para o qual o dado ser salvo. O

    valor de retorno dessa funo representa o nmero de bytes escritos no arquivo. O prottipo da funo dado por:

    int fprintf(FILE* fp, char* formato, ...);

    A funo fputc escreve um caractere no arquivo. O prottipo :

    int fputc (int c, FILE* fp);

    O valor de retorno dessa funo o prprio caractere escrito, ou EOF se ocorrer um erro na escrita.

    2.4.5 Estruturao de dados em arquivos textosExistem diferentes formas para estruturarmos os dados em arquivos em

    modo texto, e diferentes formas de capturarmos as informaes contidas

    neles. A forma de estruturar e a forma de tratar as informaes depen-

    dem da aplicao. A seguir, apresentaremos trs formas de representarmos

    e acessarmos dados armazenados em arquivos: caractere a caractere, linha a

    linha, e usando palavras chaves.

    2.4.6 Acesso caractere a caracterePara exemplificar o acesso caractere a caractere, vamos discutir duas apli-

    caes simples. Inicialmente, vamos considerar o desenvolvimento de um

    programa que conta as linhas de um determinado arquivo (para simplificar,

    vamos supor um arquivo fixo, com o nome entrada.txt. Para calcular o nmero de linhas do arquivo, podemos ler, caractere a caractere, todo o

    contedo do arquivo, contando o nmero de ocorrncias do caractere que

    indica mudana de linha, isto , o nmero de ocorrncias do caractere \n.

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 49

  • /* Conta nmero de linhas de um arquivo */

    #include

    int main (void) {

    int c;

    int nlinhas = 0; /* contador do nmero de linhas */

    FILE *fp;

    /* abre arquivo para leitura */

    fp = fopen(entrada.txt,rt);

    if (fp==NULL) {

    printf(No foi possivel abrir arquivo.\n);

    return 1;

    }

    /* l caractere a caractere */

    while ((c = fgetc(fp)) != EOF) {

    if (c == \n)

    nlinhas++;

    }

    /* fecha arquivo */

    fclose(fp);

    /* exibe resultado na tela */

    printf(Numero de linhas = %d\n, nlinhas);

    return 0;

    }

    Como segundo exemplo, vamos considerar o desenvolvimento de um pro-

    grama que l o contedo do arquivo e cria um arquivo com o mesmo con-

    tedo, mas com todas as letras minsculas convertidas para maisculas. Os

    nomes dos arquivos sero fornecidos, via teclado, pelo usurio. Uma possvel

    implementao desse programa mostrada a seguir:

    Estrutura de Dadose-Tec Brasil 50

  • /* Converte arquivo para maisculas */

    #include

    #include /* funo toupper */

    int main (void) {

    int c;

    char entrada[121]; /* armazena nome do arquivo de entrada */

    char saida[121]; /* armazena nome do arquivo de sada */

    FILE* e; /* ponteiro do arquivo de entrada */

    FILE* s; /* ponteiro do arquivo de sada */

    /* pede ao usurio os nomes dos arquivos */

    printf(Digite o nome do arquivo de entrada: );

    scanf(%120s,entrada);

    printf(Digite o nome do arquivo de saida: );

    scanf(%120s,saida);

    /* abre arquivos para leitura e para escrita */

    e = fopen(entrada,rt);

    if (e == NULL) {

    printf(No foi possvel abrir arquivo de entrada.\n);

    return 1;

    }

    s = fopen(saida,wt);

    if (s == NULL) {

    printf(No foi possvel abrir arquivo de saida.\n);

    fclose(e);

    return 1;

    }

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 51

  • /* l da entrada e escreve na sada */

    while ((c = fgetc(e)) != EOF)

    fputc(toupper(c),s);

    /* fecha arquivos */

    fclose(e);

    fclose(s);

    return 0;

    }

    2.4.7 Acesso linha a linhaEm diversas aplicaes, mais adequado tratar o contedo do arquivo linha

    a linha. Um caso simples que podemos mostrar consiste em procurar a ocor-

    rncia de uma sub-cadeia de caracteres dentro de um arquivo (anlogo a o

    que feito pelo utilitrio grep dos sistemas Unix). Se a sub-cadeia for encon-trada, apresentamos como sada o nmero da linha da primeira ocorrncia.

    Para implementar esse programa, vamos utilizar a funo strstr, que procura a ocorrncia de uma sub-cadeia numa cadeia de caracteres maior. A funo

    retorna o endereo da primeira ocorrncia ou NULL, se a sub-cadeia no for encontrada. O prottipo dessa funo :

    char* strstr (char* s, char* sub);

    A nossa implementao consistir em ler, linha a linha, o contedo do arqui-

    vo, contanto o nmero da linha. Para cada linha, verificamos se a ocorrncia

    da sub-cadeia, interrompendo a leitura em caso afirmativo.

    /* Procura ocorrncia de sub-cadeia no arquivo */

    #include

    #include /* funo strstr */

    int main (void) {

    int n = 0; /* nmero da linha corrente */

    int achou = 0; /* indica se achou sub-cadeia */

    char entrada[121]; /* armazena nome do arquivo de entrada */

    char subcadeia[121]; /* armazena sub-cadeia */

    char linha[121]; /* armazena cada linha do arquivo */

    Estrutura de Dadose-Tec Brasil 52

  • FILE* fp; /* ponteiro do arquivo de entrada */

    /* pede ao usurio o nome do arquivo e a sub-cadeia */

    printf(Digite o nome do arquivo de entrada: );

    scanf(%120s,entrada);

    printf(Digite a sub-cadeia: );

    scanf(%120s,subcadeia);

    /* abre arquivos para leitura */

    fp = fopen(entrada,rt);

    if (fp == NULL) {

    printf(No foi possvel abrir arquivo de entrada.\n);

    return 1;

    }

    /* l linha a linha */

    while (fgets(linha,121,fp) != NULL) {

    n++;

    if (strstr(linha,subcadeia) != NULL) {

    achou = 1;

    break;

    }

    }

    /* fecha arquivo */

    fclose(fp);

    /* exibe sada */

    if (achou)

    printf(Achou na linha %d.\n, n);

    else

    printf(Nao achou.);

    return 0;

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 53

  • 2.4.8 Acesso via palavras chaveQuando os objetos num arquivo tm descries de tamanhos variados, co-

    mum adotarmos uma formatao com o uso de palavras chave. Cada objeto

    precedido por uma palavra chave que o identifica. A interpretao desse tipo de

    arquivo pode ser feita lendo-se as palavras chave e interpretando a descrio do

    objeto correspondente. Para ilustrar, vamos considerar que, alm de retngulos,

    tringulos e crculos, tambm temos polgonos quaisquer no nosso conjunto de

    figuras geomtricas. Cada polgono pode ser descrito pelo nmero de vrtices

    que o compe, seguido das respectivas coordenadas desses vrtices.

    O fragmento de cdigo a seguir ilustra a interpretao desse formato, onde

    fp representa o ponteiro para o arquivo aberto para leitura.

    ...

    FILE* fp;

    char palavra[121];

    ...

    while (fscanf(fp,%120s,palavra) == 1) {

    if (strcmp(palavra,RETANGULO)==0) {

    /* interpreta retngulo */

    }

    else

    if (strcmp(palavra,TRIANGULO)==0) {

    /* interpreta tringulo */

    }

    else

    if (strcmp(palavra,CIRCULO)==0) {

    /* interpreta crculo */

    }

    else

    Estrutura de Dadose-Tec Brasil 54

  • if (strcmp(palavra,POLIGONO)==0) {

    /* interpreta polgono */

    }

    else { /* trata erro de formato */

    }

    }

    2.4.9 Arquivos em modo binrioArquivos em modo binrio servem para salvarmos (e depois recuperarmos)

    o contedo da memria principal diretamente no disco. A memria escrita

    copiando-se o contedo de cada byte da memria para o arquivo. Uma das grandes vantagens de se usar arquivos binrios que podemos salvar (e

    recuperar) uma grande quantidade de dados de forma bastante eficiente.

    Neste curso, vamos apenas apresentar as duas funes bsicas para manipu-

    lao de arquivos binrios.

    2.4.10 Funo para salvar e recuperarPara escrever (salvar) dados em arquivos binrios, usamos a funo fwrite. O prottipo dessa funo pode ser simplificado por:

    int fwrite (void* p, int tam, int nelem, FILE* fp);

    O primeiro parmetro dessa funo representa o endereo de memria cujo

    contedo deseja-se salvar em arquivo. O parmetro tam indica o tamanho, em bytes, de cada elemento e o parmetro nelem indica o nmero de ele-mentos. Por fim, passa-se o ponteiro do arquivo binrio para o qual o conte-

    do da memria ser copiado.

    A funo para ler (recuperar) dados de arquivos binrios anloga, sendo

    que agora o contedo do disco copiado para o endereo de memria pas-

    sado como parmetro. O prottipo da funo pode ser dado por:

    int fread (void* p, int tam, int nelem, FILE* fp);

    Para exemplificar a utilizao dessas funes, vamos considerar que uma

    aplicao tem um conjunto de pontos armazenados num vetor. O tipo que

    define o ponto pode ser:

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 55

  • struct ponto {

    float x, y, z;

    };

    typedef struct ponto Ponto;

    Uma funo para salvar o contedo de um vetor de pontos pode receber como

    parmetros o nome do arquivo, o nmero de pontos no vetor, e o ponteiro

    para o vetor. Uma possvel implementao dessa funo ilustrada abaixo:

    void salva (char* arquivo, int n, Ponto* vet) {

    FILE* fp = fopen(arquivo,wb);

    if (fp==NULL) {

    printf(Erro na abertura do arquivo.\n);

    exit(1);

    }

    fwrite(vet,sizeof(Ponto),n,fp);

    fclose(fp);

    }

    A rigor, os tipos int so substitudos pelo tipo size_t, definido pela biblioteca padro, sendo, em geral, sinnimo para um inteiro sem sinal (unsigned int).

    ResumoNesta aula abordamos as principais implementaes da linguagem de pro-

    gramao C, aprendemos ainda como criar funes ou sub-rotinas, a mani-

    pulao de matrizes, a implementao de programas utilizando ponteiros.

    Por fim, aprendemos a criar novos tipo de dados implementado registro e

    manipulando arquivos. Alm de exemplos prticos do nosso dia-a-dia, a fim

    de disponibilizar ao leitor um excelente embasamento terico.

    Assista video-aula da disciplina de Estrutura de Dados disponvel em http://cefetpi.nucleoead.net/

    etapi/. Aproveite para revisar os contedos da aula sobre Funes,

    Matrizes, Ponteiros e Arquivos.

    Estrutura de Dadose-Tec Brasil 56

  • Atividades de aprendizagem1. Fazer um programa que calcule o volume de uma esfera, sendo que o volu-

    me de uma esfera raio*raio*raio. Crie uma funo que faa esse clculo.

    2. Elabore programa que leia n nmeros digitados e apresente sua mdia.

    3. Com base no estudo de Ponteiros, qual das opes a baixo correto afirmar?

    a) Ponteiro uma varivel que armazena endereo.

    b) Ponteiro o valor de uma varivel.

    c) Ponteiro o indicador da prxima varivel a ser passada.

    d) Ponteiro o endereo que aponta para uma varivel.

    4. Quais das seguintes instrues declaram um ponteiro para uma varivel float?

    a) Float p

    b) Float *p

    c) *Float p

    d) Float* p

    5. O seguinte programa est correto? Justifique.

    #include

    const int VAL=123;

    int main() {

    int *p = VAL;

    printf(%d \n, *p);

    return 0;

    }

    e-Tec BrasilAula 2 Funes, matrizes, ponteiros e arquivos 57

  • e-Tec Brasil

    Aula 3 Viso geral de estrutura de dados e lista linares

    Objetivos

    Conceituar estrutura de dados.

    Descrever os tipos de estrutura de dados.

    Implementar as operaes bsicas da estrutura de dados do tipo

    lista esttica e dinmica de ordenao e desordenao.

    3.1 IntroduoEm um projeto de software, existem dois aspectos que devem ser estudados: os procedimentos que devem ser previstos pelo software e sobre que dados estes procedimentos iro atuar.

    Nas tcnicas estruturadas de projeto de software era dada nfase aos proce-dimentos, com a identificao dos aspectos funcionais na primeira etapa de

    desenvolvimento do software.

    Com as tcnicas para especificao dos dados a nvel conceitual, a importncia

    dos procedimentos e dados tornou-se equilibrada. Atualmente, j existem tcni-

    cas de programao com nfase nos dados (programao baseada em objetos).

    Mas, independentemente das tcnicas de anlise e programao utilizadas,

    programas precisam manipular dados e extremamente importante o co-

    nhecimento de conceitos e detalhes da implementao das diversas estrutu-

    ras de dados que manipulam estes dados.

    Neste texto, inicialmente, alguns conceitos bsicos so apresentados. A seguir,

    so descritas as principais Estruturas de Dados, com seus respectivos algoritmos.

    3.2 Conceitos bsicosNesta seo sero apresentados conceitos essenciais para o desenvolvimento

    desta disciplina: tipos de dados, tipos abstratos de dados e estruturas de dados.

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 59

  • 3.2.1 Tipos de dadosEm computao precisamos identificar os tipos de dados que o computa-

    dor, a linguagem de programao ou mesmo um algoritmo so capazes de

    entender. De uma forma geral, os tipos de dados so diferenciados pelos

    valores que podem assumir e pelo conjunto de operaes que podemos

    efetuar com eles.

    Em linguagens de programao o tipo de dados de uma varivel define o

    conjunto de valores que esta varivel pode assumir. Uma varivel do tipo

    lgico, por exemplo, pode assumir dois valores: verdadeiro ou falso. As pos-

    sibilidades do hardware so previstas pela linguagem.

    Os tipos de dados so divididos em: tipos primitivos de dados e tipos estru-

    turados de dados.

    Os tipos primitivos de dados so os tipos bsicos, a partir dos quais pode-

    mos definir os demais tipos e estruturas de dados. Estes tipos de dados so

    os mais frequentes nas linguagens de programao e tem um conjunto de

    valores e operaes restrito.

    So considerados tipos primitivos de dados:

    I. Inteiro - representa uma quantidade que pode ser contada.

    II. Real - representa um valor que pode ser fracionado.

    III. Lgico - pode representar dois estados (verdadeiro ou falso).

    IV. Caracter - pode representar dgitos, letras ou sinais.

    V. Ponteiro - representa o endereo de um dado na memria.

    Os tipos estruturados de dados so construdos a partir dos tipos primitivos.

    Estes tipos so previstos por muitas linguagens de programao e devem ser

    definidos pelo programador. Exemplos de tipos estruturados: array e regis-tro. Estes dois tipos so formados por tipos bsicos como inteiros, caracteres,

    reais, etc.

    Uma declarao de varivel em uma linguagem de programao como C

    especifica duas coisas:

    Estrutura de Dadose-Tec Brasil 60

  • I. Quantos bytes devem ser reservados para armazenar esta varivel (Ex.: no caso de uma varivel inteira, deve ser reservado um espao que garanta que

    o maior inteiro permitido poder ser representado).

    II. Como estes bytes devem ser interpretados (Ex.: uma cadeia de bits pode ser interpretada como um inteiro ou um real).

    Assim, tipos de dados podem ser vistos como mtodos para interpretar o

    contedo da memria do computador.

    3.2.2 Tipos abstratos de dadosO conceito de tipo de dados pode ser visto de outra perspectiva: levando

    em conta, no o que um computador pode fazer, mas o que os usurios

    desejam fazer. Este conceito de tipo de dados independente do hardware chamado de Tipo Abstrato de Dados - TAD.

    Um tipo abstrato de dados composto por um modelo matemtico acom-

    panhado de um conjunto de operaes definidas sobre este modelo.

    Uma vez que um TAD definido e as operaes associadas a este tipo so

    especificadas, pode-se implementar este tipo de dado.

    3.2.3 Estruturas de dadosUm algoritmo projetado em termos de tipos abstratos de dados. Para im-

    plement-los numa linguagem de programao necessrio encontrar uma

    forma de represent-los nessa linguagem, utilizando tipos e operaes su-

    portadas pelo computador. Para representar o modelo matemtico do TAD,

    em uma linguagem de programao, emprega-se uma estrutura de dados.

    As estruturas de dados diferem umas das outras pela disposio ou manipu-

    lao de seus dados. A disposio dos dados em uma estrutura obedece a

    condies preestabelecidas e caracteriza a estrutura.

    Assim, Estrutura de Dados um mtodo particular de se implementar um

    TAD. A implementao de um TAD escolhe uma estrutura de dados (ED)

    para represent-lo. Cada ED pode ser construda a partir de tipos bsicos

    (inteiro, real, caracter) ou estruturada (array, registro) de uma determinada linguagem de programao.

    O estudo de estruturas de dados no pode ser desvinculado de seus aspectos

    algortmicos. A escolha correta da estrutura adequada a cada caso depende

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 61

  • diretamente do conhecimento de algoritmos para manipular a estrutura de

    maneira eficiente.

    As estruturas de dados de tipos de dados estruturadas se dividem em homo-

    gneos (vetores e matrizes) e heterogneos (registros).

    As estruturas homogneas so conjuntos de dados formados pelo mesmo

    tipo de dado primitivo. E as estruturas heterogneas so conjuntos de dados

    formados por tipos de dados primitivos diferentes (campos do registro) em

    uma mesma estrutura. A escolha de uma estrutura de dados apropriada

    pode tornar um problema complicado em um de soluo bastante trivial. O

    estudo das estruturas de dados est em constante desenvolvimento (assim

    como o de algoritmos), mas, apesar disso, existem certas estruturas clssicas

    que se comportam como padres.

    Estruturas de dados clssicas:

    I. Lista.

    II. Pilha.

    III. Fila.

    IV. rvores.

    Nas prximas sees sero apresentados as principais Estruturas de Dados uti-

    lizadas para representar listas, pilhas, filas e rvores. Alm disso, sero apresen-

    tados os algoritmos que devem ser utilizados para manipular estas estruturas.

    3.2.4 Listas linearesUma das formas mais comumente usadas para se manter dados agrupados

    a lista. Afinal, quem nunca organizou uma lista de compras antes de ir ao

    mercado, ou ento uma lista dos amigos que participaro da festa? As listas

    tm-se mostrado um recurso bastante til e eficiente no dia-a-dia das pesso-

    as. Em computao, no tem sido diferente: a lista uma das estruturas de

    dados mais empregadas no desenvolvimento de programas.

    Ao desenvolver uma implementao para listas lineares, o primeiro proble-

    ma que surge : como podemos armazenar os elementos da lista, dentro do

    computador?

    Estrutura de Dadose-Tec Brasil 62

  • Sabemos que antes de executar um programa, o computador precisa carre-

    gar seu cdigo executvel para a memria. Da rea de memria que reser-

    vada para o programa, uma parte usada para armazenar as instrues a se-

    rem executadas e a outra destinada ao armazenamento dos dados. Quem

    determina quanto de memria ser usado para as instrues o compilador.

    Alocar rea para armazenamento de dados, entretanto, responsabilidade

    do programador.

    Uma lista linear pode ser implementada usando vetores ou ponteiros. Se

    for implementada usando vetores, deve estipular qual a quantidade de ele-

    mentos que a lista pode armazenar. A memria para armazenamento dos

    dados alocada em tempo de compilao. Quando implementada usando

    ponteiros, a memria alocada conforme novos elementos so colocados

    na lista e desalocada quando elementos so retirados. Ou seja, vai alocando

    memria dinamicamente, em tempo de execuo.

    3.2.4.1 Tipos de listas linearesI. Lista esttica desordenada.

    II. Lista esttica ordenada.

    III. Lista dinmica desordenada.

    IV. Lista dinmica ordenada.

    a) Lista esttica desordenada

    Na lista desordenada os elementos so colocados na primeira posio

    vazia da lista (normalmente, no final). Na lista ordenada, escolhido um

    dado que ser o campo de ordenao da lista. Quando se deseja inserir

    um novo elemento na lista, primeiro tem que ser verificado em que local

    ele dever ser colocado para que seja mantida a ordem da lista.

    Operaes bsicas das listas: inserir elemento, remover elemento, con-

    sultar elemento, alterar elemento, listagem dos elementos da lista.

    Esta estrutura implementada usando vetores e no se preocupa com orde-

    nao. Os elementos so colocados na estrutura por ordem de chegada. Nas

    prximas sees ser descrita cada uma das operaes feitas nesta estrutura.

    No exemplo, teremos uma lista com os dados dos alunos de uma turma (para

    simplificar, cada aluno tem apenas a matrcula, nome e seu polo).

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 63

  • Operaes bsicas

    I. Inserir elemento A Figura 3.1 ilustra a insero de trs elementos em uma lista esttica desorde-

    nada. Inicialmente o vetor est vazio. O primeiro elemento a chegar o aluno

    Jos com matrcula 256. Este ser colocado na primeira posio do vetor.

    Vetor Vazio

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    429/Paulo

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    Insero do Aluno de matrcula 429 e nome Paulo

    Insero do Aluno de matrcula 132 e nome Ana

    Insero do Aluno de matrcula 256 e nome Jos

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    429/Paulo

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    Figura 3.1: Insero da lista esttica desordenadaFonte: FRANA S. V. A. Apostila de Estrutura de Dados

    Posteriormente, chegam mais dois alunos (Ana com matrcula 132 e Paulo

    com matrcula 429), que so colocados nas prximas posies disponveis

    do vetor (posio 2 e posio 3). Quando uma insero vai ser executada,

    necessrio verificar se o vetor tem posies disponveis. Caso contrrio, a

    insero no pode ser efetuada.

    O cdigo abaixo, implementado est em linguagem C, inserir um novo

    aluno lista:

    //Inserir novo aluno

    void inserir() {

    int cont;

    do{

    cabec();

    Estrutura de Dadose-Tec Brasil 64

  • printf(\nInserir Novo Aluno\n\n);

    if (qa < maximo) { // verifica se o vetor pode receber novo aluno

    printf(\nMatricula do Aluno: );

    scanf(%d,&turma[qa].mat);

    printf(\nNome: );

    fflush(stdin);

    gets(turma[qa].nome);

    printf(\nPolo: );

    scanf(%s,&turma[qa].polo);

    qa++;

    printf(\n\nAluno Inserido com Sucesso!!!\n\n);

    }

    else { // vetor cheio

    printf(\n\n\aNao Pode Inserir - Turma Cheia!!!\n\n);

    getche();

    break;

    }

    printf(\n\nInserir outro(1-sim/2-nao)? );

    scanf(%d,&cont);

    }while (cont == 1);

    }

    II. Consultar elementoDepois que um elemento inserido, a operao mais executada a con-

    sulta. Para a consulta necessrio saber qual elemento deseja consultar.

    Neste caso faremos uma consulta por matrcula. Para isso, a matrcula do

    aluno a ser consultado deve ser lida. feita uma pesquisa em todas as

    posies ocupadas do vetor, a procura do elemento.

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 65

  • Vetor

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    429/Paulo

    578/Maria

    527/Joo

    514/Sara

    Figura 3.2: Consulta da lista esttica desordenada Fonte: FRANA S. V. A. Apostila de Estrutura de Dados

    No vetor da Figura 3.2 temos seis elementos. Vamos consultar o elemento

    de matrcula 578. Para encontr-lo, temos que varrer o vetor desde o seu

    incio e paramos na posio 4 que a posio onde ele se encontra. Caso

    quisssemos consultar o elemento de matrcula 192, iramos varrer todo o

    vetor, elemento a elemento e ao chegar na sexta posio (que a ultima)

    ficaramos sabendo que este elemento no se encontra no vetor. Quando

    um elemento encontrado, seus dados so apresentados e quando ele no

    est no vetor, uma mensagem de erro deve ser dada ao usurio.

    O cdigo abaixo, implementado est em linguagem C, realiza um consulta

    de um determinado aluno:

    //Consultar aluno cadastrado por matricula

    void consultarmat() {

    int i, matcon, achou, cont;

    do {

    cabec();

    printf(\nConsultar Aluno por Matricula\n\n);

    printf(\nMatricula do Aluno: );

    scanf(%d,&matcon);

    achou = procura(matcon);

    if (achou != -1)

    mostre(achou);

    else // aluno nao foi encontrado

    printf(\n\n\aNumero de Matricula Incorreto!!!!!!\n);

    printf(\n\nConsultar outro(1-sim/2-nao)? );

    scanf(%d,&cont);

    } while (cont == 1);

    }

    Estrutura de Dadose-Tec Brasil 66

  • III. Remover elemento Caso um elemento no precise mais fazer parte da estrutura, ele pode

    ser removido. Para remover os dados de um elemento necessrio saber

    qual elemento deseja remover. J que iremos Neste caso faremos a busca

    por matrcula. Para isso, a matrcula do aluno a ser removido deve ser lida.

    feita uma pesquisa em todas as posies ocupadas do vetor, a procura

    da matrcula. Assim que o elemento encontrado, seus dados devem ser

    apresentados ao usurio (neste caso a matrcula e o nome).

    Dessa forma ele pode verificar se realmente aquele o elemento a ser re-

    movido. Quando o elemento no encontrado, uma mensagem de erro

    deve ser dada ao usurio. Numa lista desordenada, para a remoo ser

    efetuada, o ltimo elemento do vetor deve ser transferido para a posio

    do elemento removido, conforme Figura 3.3 a seguir.

    Vetor antes da Remoo

    Vetor depois da Remoo

    Remover aluno de matrcula 132

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    429/Paulo

    578/Maria

    127/Joo

    314/Sara

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    429/Paulo

    578/Maria

    127/Joo

    314/Sara

    1 2 3 4 5 6 7 8

    256/Jos

    429/Paulo

    578/Maria

    127/Joo

    314/Sara

    Figura 3.3: Remoo da lista esttica desordenadaFonte: FRANA S. V. A. Apostila de Estrutura de Dados

    O cdigo abaixo, implementado est em linguagem C, realiza uma remo-

    o aluno:

    //Remover aluno cadastrado

    void remover() {

    int matrem, i, cont, achou, conrem;

    do{

    cabec();

    printf(\nRemover Aluno\n\n);

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 67

  • printf(\nMatricula do Aluno: );

    scanf(%d,&matrem);

    achou = procura(matrem);

    if (achou != -1) {

    mostre(achou);

    printf(\nDeseja remover o aluno (1-sim/2-nao)? );

    scanf(%d,&conrem);

    if (conrem==1) { // verifica se quer remover

    turma[i]= turma[qa-1];

    qa--;

    printf(\n\nAluno removido com Sucesso!!!\n);

    }

    else

    printf(\n\n\aO aluno nao foi removido!!!\n);

    break;

    }

    else // aluno nao foi encontrado

    printf(\n\naNumero de Matricula Incorreto!!!!!!\n);

    printf(\n\nRemover outro(1-sim/2-nao)? );

    scanf(%d,&cont);

    }while (cont == 1);

    }

    IV. Listagem de todos os elementos A operao de listagem possibilita a visualizao dos dados de todos os

    elementos cadastrados. feita uma varredura no vetor e todos os dados

    de todos os elementos so apresentados ao usurio. Caso a lista esteja

    vazia, ser apresentada uma mensagem.

    O cdigo abaixo representa a impresso de todos os elementos:

    Estrutura de Dadose-Tec Brasil 68

  • //Imprimir relatrio com as informaes de todos alunos

    void listagem() {

    int i;

    cabec();

    printf(\nRelatorio Geral\n);

    printf(\n\nMatricula Aluno Polo );

    printf(\n---------------------------------------------);

    for(i = 0; i < qa; i++)

    printf(\n%9d %-20s %-10s, turma[i].mat, turma[i].nome,

    turma[i].polo);

    printf(\n---------------------------------------------);

    printf(\n\nDigite qualquer tecla para sair... );

    getche();

    }

    A implementao do cdigo completo de lista esttica desordenada na lin-

    guagem C estar disponibilizado no AVEA em formatos .pdf e .cpp!

    b) Lista esttica ordenada

    Nesse tipo de lista, os elementos devem ser colocados na estrutura obedecen-

    do a uma ordenao. Qualquer operao feita na estrutura, no pode afetar

    na ordenao da mesma. A vantagem dessa lista ser notada principalmente

    nos momentos que necessite percorrer a lista a procura de algum elemento.

    Aqui, o programa anterior ser modificado, fazendo com que os alunos

    sejam armazenados no vetor por ordem de matrcula.

    Esta estrutura implementada usando vetores e se preocupa com or-

    denao. Os elementos so colocados na estrutura usando uma funo

    procurando a posio correta de insero na ordem crescente. Nas prxi-

    mas sees ser descrita cada uma das operaes feitas nesta estrutura.

    No exemplo, teremos uma lista com os dados dos alunos de uma turma

    (para simplificar, cada aluno tem apenas a matrcula, nome e seu polo).

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 69

  • Operaes bsicas

    I. Inserir elemento Para inserir um elemento em uma lista ordenada podem ocorrer cinco pos-

    sibilidades:

    I. A lista est cheia: nesse caso a insero cancelada.

    II. A lista est vazia: o elemento colocado na primeira posio do vetor.

    III. O elemento a ser inserido menor do que o primeiro da lista.

    IV. O elemento a ser inserido maior do que o ultimo da lista.

    V. O elemento novo ser inserido entre elementos da lista.

    A Figura 3.4 ilustra a insero de quatro elementos em uma lista esttica

    ordenada. Inicialmente o vetor est vazio e o primeiro elemento a chegar

    o aluno Jos com matrcula 256, conforme a Figura 3.4a e est insero

    ser colocada na primeira posio do vetor. Posteriormente, conforme Fi-

    gura 34.b, chega Ana com matrcula 132.

    Para que a lista fique ordenada, deve verificar em qual posio o elemento

    deve ser inserido. Nesse caso, a matrcula 132 menor que 256 (que a

    primeira da lista). Assim, todos os elementos a partir da posio onde o

    elemento de matrcula 256 se encontra, devem se deslocar uma posio,

    abrindo espao para o elemento ser inserido.

    Agora de acordo com a Figura 3.4c chega o elemento de matrcula 429.

    Esta matrcula maior do que todas as matrculas do vetor, portanto, ele

    inserido no final do vetor, sem necessidade de deslocamentos. E por final,

    chega o elemento de matrcula 197 que ser inserido no espao confor-

    meFigura 3.4d.

    Devemos descobrir onde se encontra o primeiro elemento maior do que o

    que ser inserido, ou seja, seu sucessor imediato. Neste caso, ele deve en-

    trar na posio do elemento de matrcula 256. O espao deve ser liberado,

    fazendo-se necessrio o deslocamento de todos os elementos a partir do

    elemento de matrcula 256. A principal questo da insero ordenada

    descobrir o local onde o elemento deve ser inserido e, se necessrio, fazer

    os deslocamentos.

    Estrutura de Dadose-Tec Brasil 70

  • Vetor Vazio

    1 2 3 4 5 6 7 8

    1 2 3 4 5 6 7 8

    256/Jos

    Insero do Aluno de matrcula 256 e nome Jos

    Figura 3.4a: Insero da lista esttica ordenada Fonte: FRANA S. V. A. Apostila de Estrutura de Dados

    1 2 3 4 5 6 7 8

    256/Jos

    1 2 3 4 5 6 7 8

    132/Ana

    256/Jos

    Insero do Aluno de matrcula 132 e nome Ana

    Figura 3.4b: Insero da lista esttica ordenada Fonte: FRANA S. V. A. Apostila de Estrutura de Dados

    Insero do Aluno de matrcula 429 e nome Paulo

    1 2 3 4 5 6 7 8

    132/Ana

    256/Jos

    429/Paulo

    Figura 3.4c: Insero da lista esttica ordenada Fonte: FRANA S. V. A. Apostila de Estrutura de Dados

    1 2 3 4 5 6 7 8

    256/Jos

    429/Paulo

    429/Paulo

    1 2 3 4 5 6 7 8

    132/Ana

    197/Maria

    132/Ana

    256/Jos

    Insero do Aluno de matrcula 197 e nome Maria

    Figura 3.4d: Insero da lista esttica ordenada Fonte: FRANA S. V. A. Apostila de Estrutura de Dados

    O cdigo a seguir, implementado est em linguagem C, inseri um novo alu-

    no lista:

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 71

  • // Inserir um novo aluno na escola

    void inserir() {

    int cont;

    do{

    cabec();

    printf(\nInserir Novo Aluno\n);

    if (qa < maximo) { // verifica se o vetor pode receber novo aluno

    printf(\nMatricula do Aluno: );

    scanf(%d,&al.mat);

    printf(\nNome: );

    fflush(stdin);

    gets(al.nome);

    printf(\nPolo: );

    scanf(%s,&al.polo);

    colocarordem();

    qa++;

    printf(\n\nAluno Inserido com Sucesso!!!\n);

    }

    else { // vetor cheio

    printf(\n\n\aNao Pode Inserir - Turma Cheia!!!\n);

    getche();

    break;

    }

    printf(\n\nContinuar inserindo aluno (1-sim/2-nao)? );

    scanf(%d,&cont);

    }while (cont == 1);

    }

    Estrutura de Dadose-Tec Brasil 72

  • II. Consultar elemento Na Figura 3.5 a matrcula do aluno a ser consultado deve ser lida. feita

    uma varredura em todas as posies ocupadas do vetor, a procura da ma-

    trcula. No caso de uma lista ordenada, se estivssemos procurando um

    aluno de matrcula 120, assim que fizssemos a leitura da primeira matr-

    cula do vetor, j saberamos que a matrcula 120 no est no vetor, evitan-

    do uma varredura at o final do vetor. Na estrutura ordenada, as consultas

    so mais eficientes.

    Vetor

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    429/Paulo

    578/Maria

    527/Joo

    514/Sara

    Figura 3.5: Consulta da lista esttica ordenada Fonte: FRANA S. V. A. Apostila de Estrutura de Dados

    O cdigo abaixo, implementado est em linguagem C, realiza um consul-

    ta de um determinado aluno:

    //Consultar um aluno da escola

    void consultar() {

    int matcon, achou, continuar;

    do{

    cabec();

    printf(\nConsultar Aluno\n\n);

    printf(\nMatricula do Aluno: );

    scanf(%d,&matcon);

    achou = procura(matcon);

    if (achou!=-1)

    mostre(achou);

    else

    printf(\n\n\aNumero de Matricula Incorreto!!!!!!\n);

    e-Tec BrasilAula 3 Viso geral de estrutura de dados e lista linares 73

  • printf(\n\nContinuar consultando aluno(1-sim/2-nao)? );

    scanf(%d,&continuar);

    }while (continuar == 1);

    }

    III. Remover elemento

    Comeamos com a leitura da matrcula do aluno a ser removido. feita

    uma varredura em todas as posies ocupadas do vetor, a procura da

    matrcula. Assim que o elemento encontrado, seus dados devem ser

    apresentados ao usurio (neste caso a matrcula e o nome). Dessa for-

    ma ele pode verificar se realmente aquele o elemento a ser removido.

    Quando o elemento no encontrado, uma mensagem de erro deve ser

    dada ao usurio.

    No exemplo da Figura 3.6 a seguir, desejamos remover o elemento de

    matrcula 256. Para que a lista fique contnua e ordenada, todos os ele-

    mentos que vem depois do elemento que ser removido, devem ser tra-

    zidos uma posio a frente.

    Vetor antes da Remoo

    Vetor depois da Remoo

    Remover aluno de matrcula 256

    1 2 3 4 5 6 7 8

    256/Jos

    132/Ana

    429/