Upload
ariane-paiva
View
65
Download
1
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
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,¬a1);
printf(\n Digite a segunda nota...: );
scanf(%f,¬a2);
printf(\n Digite a terceira nota..: );
scanf(%f,¬a3);
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/