Escolar Documentos
Profissional Documentos
Cultura Documentos
_____________________________________________________________________________
Programação
Estrutura de Dados
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 1
Programação e Estrutura de Dados
_____________________________________________________________________________
1.1 Programação
ela vai armazenar. Desta forma pode-se aproveitar a mesma estrutura de dados para diversos
tipos de dados. Por exemplo, é melhor ter uma agenda genérica do que uma agenda de
telefones. Uma agenda genérica pode ser utilizada para guardar telefones, ou emails, ou até
mesmo guardar outra estrutura dentro dela: contatos, que seriam compostos por nome,
telefone e email.
Algumas estruturas de dados são apenas agrupamentos de dados sem um objetivo de
aplicar algum algoritmo ou tirar proveito de sua estrutura. Um exemplo seria a estrutura
Contato. Algumas outras estruturas são mais espertas e trabalhosas, como a Agenda, assim
como Listas Ligadas, Vetores, Tabelas de Espalhamento e outras que veremos no decorrer
do texto. Estas estruturas, por sua característica mais complexa e de poder ser reutilizada em
outros contextos, devem ser criadas da forma mais independente possível dos dados que
estarão dentro dela. Em outras palavras, não devemos misturar a Agenda e o Contato de
maneira rígida, para que com isso possamos criar outras Agendas, como por exemplo, uma
Agenda de Fornecedor.
1.3 Motivação
Todo mundo já experimentou sopa de letrinhas quando criança. Aliás, quando as crianças
tomam sopa de letrinhas, elas ficam muito mais interessadas em formar as palavras do que
em tomar a sopa.
O que chama mais a atenção é que nesta brincadeira de criança aparece um conceito bem
interessante de estrutura de dados. Quando a sopa é servida, as letras estão todas espalhadas
sem ordem alguma e sem nenhum significado. Quando você escolhe um grupo de letras e as
coloca em seqüência formando uma palavra, este grupo de letras ganha um valor semântico,
ou seja, ganha um significado.
O grupo de letrinhas que você escolhe para formar uma palavra pode conter letras
repetidas sem problema nenhum. A única regra é que as letras postas em seqüência devem
formar uma palavra existente em alguma língua.
As músicas também são exemplos em que a definição de uma seqüência dos elementos
agrega valor semântico. Uma música é composta de notas musicais. Quando estas notas
estão “espalhadas”, elas não significam muita coisa. Já quando colocadas em uma seqüência
adequada, formam uma música que as pessoas podem apreciar. Além disso, uma mesma
nota musical pode aparecer mais de uma vez em uma única música.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 3
Programação e Estrutura de Dados
_____________________________________________________________________________
Outro exemplo em que a seqüência dos elementos é importante são as rotas de aviões.
Imagine o nome de várias cidades sem nenhuma ordem. Desta maneira, estes nomes não
significam muita coisa. Mas, se eles forem colocados em alguma seqüência então poderiam
formar a rota de uma aeronave.
Por exemplo, suponha que entregaram relatórios os alunos Rafael, Paulo e Ana. Rafael
entregou apenas um relatório; Paulo entregou dois relatórios; e Ana entregou três relatórios.
Uma possível listagem neste caso seria assim:
1) Rafael
2) Paulo
3) Ana
4) Paulo
5) Ana
6) Ana
A listagem também deve manter a ordem de pontuação obtida pelos relatórios dos alunos.
Por exemplo, suponha que o Rafael teve pontuação máxima(100) no seu relatório; O Paulo
teve pontuação 70 em um relatório e 50 no outro; Ana teve pontuação 60, 40 e 40 nos seus
relatórios. Então, a listagem ficaria assim:
1) Rafael (100)
2) Paulo (70)
3) Ana (60)
4) Paulo (50)
5) Ana (40)
6) Ana (40)
1) Rafael (100)
2) Paulo (70)
3) Rafael (65)
4) Ana (60)
5) Paulo (50)
6) Ana (40)
7) Ana (40)
Para gastar os créditos obtidos com os relatórios, o aluno deve pedir para retirar uma das
suas entradas na listagem. Os créditos são proporcionais a colocação da entrada do aluno na
listagem.
Por exemplo, se o Paulo quiser gastar uma das suas duas entradas na lista ele deve
escolher entre a de 70 pontos a 50 pontos. A de 70 é a segunda da lista e a de 50 é a quinta.
Suponha que ele escolha a de 50 pontos então a nova listagem ficaria assim:
1) Rafael (100)
2) Paulo (70)
3) Rafael (65)
4) Ana (60)
5) Ana (40)
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 5
Programação e Estrutura de Dados
_____________________________________________________________________________
6) Ana (40)
Quando o aluno quiser usar seus créditos ele deve verificar antes se ele tem entradas na
listagem. Para isso, ele deve ir à secretária da instituição.
A instituição pode querer saber qual é o aluno que está na primeira posição da listagem
ou o que está na última. Na verdade, seria interessante para a instituição poder facilmente
saber qual é o aluno que está em qualquer posição que ela queira.
Uma vez definidas todas as operações temos então a interface de uso da nossa estrutura
de dados.
Interface da Lista:
1) Adiciona um dado elemento no fim da Lista.
2) Adiciona um dado elemento em um dada posição.
3) Pega o elemento de uma dada posição.
4) Remove o elemento de uma dada posição.
5) Verifica se um dado elemento está contido na Lista.
6) Informa a quantidade de elementos da Lista.
“A morte do homem começa no instante em que ele desiste de aprender” – Albino Teixeira
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 6
Programação e Estrutura de Dados
_____________________________________________________________________________
Variáveis e constantes são os elementos básicos que um programa manipula. Uma variável é
um espaço reservado na memória do computador para armazenar um tipo de dado
determinado.
Variáveis devem receber nomes para poderem ser referenciadas e modificadas quando
necessário. Um programa deve conter declarações que especificam de que tipo são as
variáveis que ele utilizará e as vezes um valor inicial. Tipos podem ser por exemplo: inteiros,
reais, caracteres, etc. As expressões combinam variáveis e constantes para calcular novos
valores.
2.1 Constantes
Constante é um determinado valor fixo que não se modifica ao longo do tempo, durante a
execução de um programa. Conforme o seu tipo, a constante é classificada como sendo
numérica, lógica e literal.
Exemplo de constantes:
N1+N2+N3
Constante
3
2.2 Variáveis
VARIÁVEL
CONTEÚDO
DA VARIÁVEL
VARIÁVEIS
NOME = “JOSE”
_____________________________________________________________________________
IDADE = 50
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 7
Programação e Estrutura de Dados
_____________________________________________________________________________
2.4 EXERCÍCIOS
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
Linguagem poderosa criada em 1971 por Denis Ritchie com implementação do conceito POO
em 1983 por Bjarne Stroustrup recebendo o nome de C++ (++ é chamado de pós-incremento
na linhagem C). Em 2003, a Empresa Borland implementou sua plataforma gráfica para o
ambiente Windows, chamando de C++ Builder.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 8
Programação e Estrutura de Dados
_____________________________________________________________________________
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 9
Programação e Estrutura de Dados
_____________________________________________________________________________
Descrição Símbolo
Soma +
Subtração -
Multiplicação *
Divisão /
Resto da divisão %
Estes operadores sempre retornam valores lógicos (verdadeiro ou falso/ True ou False)
Para estabelecer prioridades no que diz respeito a qual operação executar primeiro, utilize os
parênteses.
Os operadores relacionais são:
Descrição Símbolo
Igual a =
Diferente de !=
Maior que >
Menor que <
Maior ou igual a >=
Menor ou igual a <=
Igual comparação ==
Exemplo:
Tendo duas variáveis A = 5 e B = 3
Os resultados das expressões seriam:
Expressão Resultado
A == B Falso
A != B Verdadeiro
A>B Verdadeiro
A<B Falso
A >= B Verdadeiro
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 10
Programação e Estrutura de Dados
_____________________________________________________________________________
A <= B Falso
E &&
OU ||
NÃO !
Exemplos:
Suponha que temos três variáveis A = 5, B = 8 e C =1
Os resultados das expressões seriam:
Expressão Resultado
Exemplo:
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 11
Programação e Estrutura de Dados
_____________________________________________________________________________
A linguagem C++ Builder foi implementada para o ambiente gráfico e recebeu outras
funções para de transformações de dados, tanto para cálculos como para visualização de
resultados.
Exemplo:
{ } (Inicio e Fim);
ShowMessage (Comando);
if (Comando se);
Exemplo:
Exemplos (Comandos):
Float -> é diferente de float; string -> é diferente de String; int -> é diferente de Int;
strtofloat -> é diferente de StrToFloat;
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 12
Exemplos(Variáveis):
Int a -> é diferente de int B; String aluno -> é diferente de String Aluno;
float media -> é diferente de float MEDIA;
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplos:
{
funcionario = „Joao‟;
cargo = „Programador‟;
salario = 1500.00;
ir = 150.00;
sl = salario – ir
}
void __fastcall
TForm1::Button1Click(TObject
*Sender)
Edit1
{
float V1, V2, Soma;
Edit2 V1 = atof(Edit1->Text.c_str());
V2 = atof(Edit2->Text.c_str());
Edit3->Text = Soma;
}
Label1 Edit3
Label2
_____________________________________________________________________________
Label3
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 13
Programação e Estrutura de Dados
_____________________________________________________________________________
V1 = StrToFloat(Edit1->Text); V1 = StrToFloat(Edit1->Text);
V2 = StrToFloat(Edit2->Text); V2 = StrToFloat(Edit2->Text);
Exemplo 2:
2) Receber o Nome do funcionário, Salário atual, Taxa de Reajuste em %, em seguida
calcule e mostre: O aumento e novo salário do funcionário.
{
String Funcionario;
float SalarioAtual, TaxaR, Reajuste,
NovoSalario;
SalarioAtual = atof(Edit2->Text.c_str());
TaxaR = atof(Edit3->Text.c_str());
Edit4->Text = Reajuste;
Edit5->Text = SalarioAtual;
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 14
Programação e Estrutura de Dados
_____________________________________________________________________________
4.1 EXERCÍCIOS
5 Estrutura Condicional em C
Simples:
É a estrutura que será repetida o teste condicional a cada decisão a ser tomada pelo
algoritmo ou programa.
Composta:
É a estrutura que fará o aproveitamento do teste condicional na decisão a ser tomada pelo
programa.
Exemplo 1:
Imagine um programa que determinado aluno somente estará aprovado se sua média for
maior ou igual a 5.0, veja no exemplo do programa como ficaria.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 15
Programação e Estrutura de Dados
_____________________________________________________________________________
n1 = atof(Edit4->Text.c_str());
n2 = atof(Edit4->Text.c_str());
media = ( n1 + n2 ) / 2;
if (media >=5.0)
situacao = "Aprovado";
situacao = "Reprovado";
Exemplo 2:
C++ Builder ( Tela Gráfica ) ( Código )
(Concional composta)
Calcular Equação do 2° Grau void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a, b, c, d;
float x1, x2;
a = atoi(Edit1->Text.c_str());
b = atoi(Edit2->Text.c_str());
c = atoi(Edit3->Text.c_str());
d = pow(b, 2) - 4 * a * c;
if ( d >= 0 )
{
x1 = (-b + sqrt(d)) / (2 * a);
x2 = (-b - sqrt(d)) / (2 * a);
Edit4->Text = x1;
Edit5->Text = x2;
}
else
ShowMessage("Delta = " + IntToStr(d) + " < 0");
_____________________________________________________________________________
}
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 16
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Text = "";
Edit2->Text = "";
Edit3->Text = "";
Programação e Estrutura de Dados
_____________________________________________________________________________
5.1 EXERCÍCIOS
Exemplo1:
Escrever os números impares de 1 a 100.
C++ Builder
int N;
Exemplo2:
Escrever seu nome 1000 vezes.
C++ Builder
{
int N;
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 17
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo3:
Escrever os números pares de 200 a 0.
C++ Builder
int N;
Além da utilização clássica que acabamos de ver, o comando de repetição For é muito
mais abrangente. Podemos ter mais de uma estrutura de repetição uma dentro da outra. Quando
isto acontece dizemos que temos estruturas de repetições aninhadas ou encadeada.
Exemplo 4:
1.1 4.1
1.2 4.2
1.3 4.3
1.4 4.4
1.5 4.5
2.1 5.1
2.2 5.2
2.3 5.3
2.4 5.4
2.5 5.5
3.1
3.2
3.3
3.4
3.5
C++ Builder
{
int n, x;
_____________________________________________________________________________
for (n = 1; n <= 5; n++)
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira
for ( x = 1; x <= 5; x++)
Página 18
ListBox1->Items->Add(IntToStr(n)+”. “+IntToStr(x));
}
Programação e Estrutura de Dados
_____________________________________________________________________________
6.2 EXERCÍCIOS
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 19
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo1:
Escrever a soma dos 10 primeiros números pares.
C++ Builder
int x, soma;
soma = 0; x = 1;
while (x <= 10 )
{
soma = soma + 2 * x;
x = x + 1;
}
Edit1->Text = Soma;
}
Exemplo2:
Escrever todos os múltiplos de 2,5082364789 e inferior a 31,34598736.
C++ Builder
double m;
m = 2.5082364789;
Exemplo1:
Dados os valores A e B, inteiros, elaborar o programa em C++ Builder para exibir os números
pares entre a seqüência de A e B, inclusive.
C++ Builder
{
int a, b;
a = StrToInt(Edit1->Text);
b = StrToInt(Edit2->Text);
do
{
if ((a % 2) == 0)
ListBox1->Items->Add(a);
a++;
}
while (a <= b);
}
Exemplo2:
Calcular a soma e exibir o resultado dos N primeiros termos da seqüência: (1 + 2 + 3 + 4 + ...)
int n, x, s;
n = StrToInt(Edit1->Text);
s = 0; x = 0;
do
{
x++;
s = s + x;
}
Edit2->Text = s;
6.6 EXERCÍCIOS
1) Elaborar as estruturas acima para calcular exibir a soma dos N primeiras termos da
seqüência:
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 21
Programação e Estrutura de Dados
_____________________________________________________________________________
7. ARRANJOS
Arranjos, também conhecido como vetores ou matrizes, são agrupamentos de variáveis
do mesmo tipo, variáveis homogêneas, com o mesmo nome e diferenciadas por um ou mais
índices.
Diz-se que o arranjo é um vetor quando seus itens possuem uma única dimensão, um
único índice, e quando o arranjo for definido por duas dimensões, dois índices, costuma-se
referenciá-lo como matriz.
Vetor
A forma de declarar um vetor é:
Em termos práticos, esse tipo de variável significa que a simples declaração de um único
vetor do tipo inteiro com 5 itens equivale a 5 declarações de variáveis inteiro distintas.
Exemplo:
Vet 0 0 0 0 0
Indice 0 1 2 3 4
Equivale a:
Solução 1: Solução 2:
C++ Builder
{ {
String nome[7]; String nome[7];
int I;
nome*0+ = “Tolentina”; for I = 0 ; I < 7 ; I++)
nome*1+ = “Tolentina”; nome* I + = “Tolentina”;
nome*2+ = “Tolentina”; }
_____________________________________________________________________________
nome*3+
CEFET - Curso Superior de =Tecnologia
“Tolentina”;
em Sistemas para Internet - Prof. Pereira Página 22
nome*4+ = “Tolentina”;
nome*5+ = “Tolentina”;
nome*6+ = “Tolentina”;
Programação e Estrutura de Dados
_____________________________________________________________________________
Há ocasiões nas quais se deseja que o arranjo, ao ser criado, já tenha valores default
atribuídos a seus itens.
Exemplo:
Vet 16 2 77 33 1024
Indice 0 1 2 3 4
Vet 16 2 77 33 1024
Indice 0 1 2 3 4
Vet 16 2 77 0 0
Indice 0 1 2 3 4
É o que:
String frase[ 42 ] = { “V”, “o”, “c”, “ê”, “ “,”t”, “e”, “m”, “ “, “m”, “u”, “i”, “t”, “o”, “ “, “o”, “ “,
“q”, “u”, “e”, “ “, “a”, “p”, “r”, “e”, “n”, “d”, “e”, “r”, “ “, “n”, “e”, “s”, “t”, “e”, “ “, “c”, “u”, “r”,
“s”, “o”, “\0” };
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 23
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo2:
Suponha que desejamos confeccionar uma cartela de um bingo que geralmente são
confeccionadas com valores de 1 a 75 números.
B I N G O
1 19 33 47 61
3 26 34 53 65
6 27 35 54 68
10 28 42 56 73
11 29 44 60 75
int cartela[25] = { 1, 3, 6, 10, 11, 19, 26, 27, 28, 29, 33, 34, 35, 42, 44, 47, 53, 54, 56, 60, 61, 65,
68, 73, 75 };
Ou assim:
int cartela[25];
cartela[0]=1 ; cartela[1]=3 ; cartela[2]=6 ; cartela[3]=10 ; cartela[4]=11;
cartela[5]=19 ; cartela[6]=26 ; cartela[7]=27 ; cartela[8]=28 ; cartela[9]=29;
cartela[10]=33 ; cartela[11]=34 ; cartela[12]=35 ; cartela[13]=42 ; cartela[14]=44;
cartela[15]=47 ; cartela[16]=53 ; cartela[17]=54 ; cartela[18]=56 ; cartela[19]=60;
cartela[20]=61 ; cartela[21]=65 ; cartela[22]=68 ; cartela[23]=73 ; cartela[24]=75;
Solução
{
int cartela[25] = {1, 3, 6, 10, 11, 19, 26, 27, 28, 29, 33, 34, 35, 42, 44, 47, 53, 54, 56, 60, 61, 65, 68, 73, 75};
String linha[5];
int I, L, x;
ListBox1->Items->Add("B I N G O");
I=0;x=1;
Exemplo3:
A Distribuidora de Bebidas Caranguejo Ltda atingiu em 2007, sua meta de venda mensal
conforme tabela abaixo. Através da meta atingida na tabela, ela precisa saber a média de
venda mensal em 2008, e o qual o valor e o mês, que a meta foi menor e maior. Faça um
programa em C++ mostrar os dados solicitados, usando o conceito de vetor.
Tabela de simulação:
metamaior=meta[0] ; metamenor=meta[0];
for (x=0 ; x < 12 ; x++ )
{
mvm = mvm + meta [x];
if (meta[x] > metamaior)
{
metamaior = meta[x]; mesMetamaior = mes[x];
}
if (meta[x] < metamenor)
{
metamenor = meta[x]; mesMetamenor=mes[x];
_____________________________________________________________________________
CEFET} - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 25
}
mvm = mvm / 12;
Matriz
Exemplo:
Equivale a:
Exemplo1:
Suponha que você quer armazenar um nome de uma pessoa 10 vezes na memória usando matriz.
Solução 1:
C++ Builder
{
String nome[2] [5];
nome*0+*0+ = “Florentina”; nome*0+*1+ = “Florentina”; nome*0+*2+ = “Florentina”; nome*0+*3+ = “Florentina”; nome*0+*4+ = “Florentina”;
nome*1+*0+ = “Florentina”; nome*1+*1+ = “Florentina”; nome*1+*2+ = “Florentina”; nome*1+*3+ = “Florentina”; nome*1+*4+ = “Florentina”;
}
Solução 2: {
String nome[5] [2];
Solução 3:
{
String nome[2] [5];
int L,C;
for L = 0 ; I < 2 ; L++)
for C = 0 ; I < 5 ; C++)
nome*L+ *C+ = “Florentina”;
}
Índices: (00) (01) (02) (03) (04) (10) (11) (12) (13) (14)
Há ocasiões nas quais se deseja que o arranjo, ao ser criado, já tenha valores default
atribuídos a seus itens.
Exemplo1:
C++ Builder
Exemplo2:
Suponha que desejamos confeccionar uma cartela de um bingo que geralmente são
confeccionadas com valores de 1 a 75 números.
B I N G O
1 19 33 47 61
3 26 34 53 65
6 27 35 54 68
10 28 42 56 73
11 29 44 60 75
Ou assim:
Solução
{
int cartela[5] [5] = {{ 1, 19, 33, 47, 61 },
{ 3, 26, 34, 53, 65 },
{ 6, 27, 35, 54, 68 },
{ 10, 28, 42, 56, 73 },
{ 11, 29, 44, 60, 75 }};
String linha[5];
int L, C;
ListBox1->Items->Add(“B I N G O”);
Exemplo 3
Suponha que queremos fazer um programa para compararmos a previsão do tempo em 5 cidades
do nosso país, na primeira semana do mês de maio/2008 todos os dias. Vamos usar o conceito de
vetor e matriz para resolver esta solução. Faça um programa em C++ para indicar qual a
temperatura e a cidade que está mais quente e qual a que está mais fria.
Tabela de simulação:
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 28
Programação e Estrutura de Dados
_____________________________________________________________________________
C++ Builder
{
float Temp[5][7];
String cid[5] = {"Aracajú", "Belém", "Belo Horizonte", "Boa Vista", "Brasilia"};
String dsem[7] = {"Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"};
int L,C ;
float tma, tme;
String cidf, cidq, dia;
for (C = 0 ; C < 7 ; C++)
Temp[0][0]=StrToFloat(Edit1->Text); {
Temp[0][1]=StrToFloat(Edit2->Text); cidq=cid[0] ; cidf=cid[0];
Temp[0][2]=StrToFloat(Edit3->Text); tma = Temp[0][C] ; tme=Temp[0][C];
Temp[0][3]=StrToFloat(Edit4->Text); for (L = 0 ; L < 5 ; L++)
Temp[0][4]=StrToFloat(Edit5->Text); {
Temp[0][5]=StrToFloat(Edit6->Text); dia = dsem[C];
Temp[0][6]=StrToFloat(Edit7->Text); if (Temp[L][C] > tma)
{
Temp[1][0]=StrToFloat(Edit8->Text); tma = Temp[L][C];
Temp[1][1]=StrToFloat(Edit9->Text); cidq = cid[L];
Temp[1][2]=StrToFloat(Edit10->Text); }
Temp[1][3]=StrToFloat(Edit11->Text); else
Temp[1][4]=StrToFloat(Edit12->Text); if (L > 0 && Temp[L][C] == tma)
Temp[1][5]=StrToFloat(Edit13->Text); cidq = cidq + "/" + cid[L];
Temp[1][6]=StrToFloat(Edit14->Text); if (Temp[L][C] < tme)
{
Temp[2][0]=StrToFloat(Edit15->Text); tme = Temp[L][C];
Temp[2][1]=StrToFloat(Edit16->Text); cidf = cid[L];
Temp[2][2]=StrToFloat(Edit17->Text); }
Temp[2][3]=StrToFloat(Edit18->Text); else
Temp[2][4]=StrToFloat(Edit19->Text); if (L > 0 && Temp[L][C] == tme)
Temp[2][5]=StrToFloat(Edit20->Text); cidf = cidf + "/" + cid[L];
Temp[2][6]=StrToFloat(Edit21->Text);
}
Temp[3][0]=StrToFloat(Edit22->Text); ListBox1->Items->Add(dia);
Temp[3][1]=StrToFloat(Edit23->Text); ListBox1->Items->Add("Maior Temp: “+FloatToStr(tma)+" -> "+cidq);
Temp[3][2]=StrToFloat(Edit24->Text); ListBox1->Items->Add("Menor Temp: “+ FloatToStr(tme)+" -> "+cidf);
Temp[3][3]=StrToFloat(Edit25->Text);
Temp[3][4]=StrToFloat(Edit26->Text); }
Temp[3][5]=StrToFloat(Edit27->Text); }
Temp[3][6]=StrToFloat(Edit28->Text);
Temp[4][0]=StrToFloat(Edit29->Text);
Temp[4][1]=StrToFloat(Edit30->Text);
Temp[4][2]=StrToFloat(Edit31->Text);
Temp[4][3]=StrToFloat(Edit32->Text);
Temp[4][4]=StrToFloat(Edit33->Text);
Temp[4][5]=StrToFloat(Edit34->Text);
Temp[4][6]=StrToFloat(Edit35->Text);
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 29
Programação e Estrutura de Dados
_____________________________________________________________________________
Ano Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez
2007 50.000 60.000 65.000 70.000 55.000 75.000 97.500 72.000 68.000 90.000 95.000 97.000
2008 70.000 65.000 75.000 77.000 78.000 80.000 83.000 85.000 88.000 91.000 98.000 100.000
1ª 2ª 3ª 4ª 5ª 6ª 7ª 8ª 9ª 10ª
A 1 0 0 0 0 0 0 1 1 0
B 0 0 0 0 0 1 0 0 0 0
C 0 0 1 0 1 0 0 0 0 0
D 0 1 0 0 0 0 0 0 0 1
E 0 0 0 1 0 0 1 0 0 0
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 30
Programação e Estrutura de Dados
_____________________________________________________________________________
7 PROCEDIMENTOS
A utilização de procedimentos permite que um conjunto de comandos possa ser usado várias
vezes dentro de um programa, sem a necessidade de reescrever o código várias vezes. Um bloco
de comandos é associado a um nome (nome do procedimento); sempre que for necessário
executar estes comandos, basta chamar o nome do procedimento. Linguagens como o DELPHI,
C++BUILDER e outras linguagens visuais, trabalham sempre com procedimento e funções.
Portanto, podemos aproveitar todo o nosso conhecimento e criarmos também nossos
procedimento e funções, caso necessite dentro dos nossos programas.
Exemplo1:
C++ Builder
TForm1 *Form1;
//------------ Procedimento------------------------------------------
void CalcularDelta(int a, int b, int c)
{
delta = pow(b,2) - 4 * a * c;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int va, vb, vc;
float x1, x2;
va = atoi(Edit1->Text.c_str());
vb = atoi(Edit2->Text.c_str());
vc = atoi(Edit3->Text.c_str());
Edit4->Text = delta;
if (delta < 0)
ShowMessage("Nao existe raiz reais...");
_____________________________________________________________________________
else
CEFET{ - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 31
x1 = (-vb + sqrt(delta)) / (2 * va);
x2 = (-vb - sqrt(delta)) / (2 * va);
Edit5->Text = x1;
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo2:
Receber o Nome do Produto, Preço Unitário, Desconto em %, em seguida calcular e mostrar:
O Nome do produto, valor do Desconto e o Valor do Produto com Desconto, usando o conceito
de Procedimentos.
TForm1 *Form1;
//------------ Procedimento1-----------------------------------------
void CalcularValor( float ValorUnit, float desc )
{
Desconto = (ValorUnit * desc ) / 100;
ValorProduto = ValorUnit – Desconto;
}
//------------ Procedimento2-----------------------------------------
void LimparTela(void )
{
Form1->Edit1->Clear();
Form1->Edit2->Clear();
Form1->Edit3->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float vu, dc;
String produto;
produto = Edit1->Text;
vu = atof(Edit2->Text.c_str());
dc = atof(Edit3->Text.c_str());
CalcularValor( vu, dc ) ;
ListBox1->Items->Add(“Produto : “+produto);
ListBox1->Items->Add(“Desconto: “+ FloatToStr(Desconto));
ListBox1->Items->Add(“Valor com Desconto: “+FloatToStr(ValorProduto));
LimparTela();
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 32
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo3:
O senhor Zequinha, mantém toda semana as mesmas cartelas e joga na Mega Sena. Ele joga
toda semana 10 cartelas com os mesmos números. Para conferir ele vai a casa lotérica e pega
os números sorteados a cada concurso. Ele confere através do programa abaixo, feito em C++
Builder, usando alguns recursos que já vimos em nossa disciplina (Vetor/Matriz/Repetições e
Procedimentos). Ele digita apenas os números e o programa informa para ele quais os
números sorteados em cada cartela que jogou.
C++ Builder
TForm1 *Form1;
//----------Variaveis Globais------------------------------------------------
int NumCartela[10];
String NumSort[10];
//----------------------------------------------------------------------------------
void CartelaMegaSena(int n1, int n2, int n3, int n4, int n5, int n6)
{
int cartela[10][6] = {{ 7, 13, 23, 32, 33, 42 },
{ 2, 17, 33, 35, 36, 57 },
{ 3, 21, 43, 44, 52, 53 },
{10, 13, 33, 47, 57, 60 },
{ 7, 17, 43, 52, 53, 57 },
{ 1, 10, 13, 17, 33, 47 },
{ 9, 17, 18, 31, 38, 46 },
{11, 12, 25, 29, 44, 45 },
{21, 22, 23, 54, 58, 60 },
{ 5, 15, 17, 39, 40, 43 }};
int L, C, ns;
int nsort[6] = { n1, n2, n3, n4, n5, n6 };
//---------------------------------------------------------------------------
v1 = atoi(Edit1->Text.c_str());
v2 = atoi(Edit2->Text.c_str());
v3 = atoi(Edit3->Text.c_str());
v4 = atoi(Edit4->Text.c_str());
v5 = atoi(Edit5->Text.c_str());
v6 = atoi(Edit6->Text.c_str());
8 FUNÇÕES
Uma função é um procedimento que retorna um valor (um resultado). Normalmente é um bloco
de comandos que executa uma tarefa específica, e após executá-la devolve o resultado das
operações realizadas. Este resultado pode ser atribuído a uma variável em qualquer parte do
programa principal. Tanto uma função, como um procedimento podem ser chamados (executados)
várias vezes, durante o funcionamento do programa.
Exemplo1:
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 34
Programação e Estrutura de Dados
_____________________________________________________________________________
C++ Builder
TForm1 *Form1;
//------------ Função-----------------------------------------
int CalcularDelta(int a, int b, int c)
{
int delta;
delta = pow(b,2) - 4 * a * c;
return delta;
}
Edit4->Text = d;
if (d < 0)
ShowMessage("Nao existe raiz reais...");
else
{
x1 = (-vb + sqrt(d)) / (2 * va);
x2 = (-vb - sqrt(d)) / (2 * va);
Edit5->Text = x1;
Edit6->Text = x2;
}
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 35
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo2:
Exemplo2:
C++ Builder
TForm1 *Form1;
//------------ Função----------------------------------------------------
float CalcularValor( float ValorUnit, float desc )
{
float ValorProduto;
ValorProduto = ValorUnit - (ValorUnit * desc ) / 100;
return ValorProduto;
}
//------------ Procedimento------------------------------------------
void LimparTela(void )
{
Form1->Edit1->Clear();
Form1->Edit2->Clear();
Form1->Edit3->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float vu, dc, vdc, nvp;
String produto;
produto = Edit1->Text;
vu = atof(Edit2->Text.c_str());
dc = atof(Edit3->Text.c_str());
ListBox1->Items->Add("Produto : "+produto);
_____________________________________________________________________________
ListBox1->Items->Add("Desconto:
CEFET "+ FloatToStr(vdc));
- Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 36
ListBox1->Items->Add("Valor com Desconto: "+FloatToStr(nvp));
LimparTela();
Programação e Estrutura de Dados
_____________________________________________________________________________
C++ Builder;
Conceito Nota
“E” >= 90%
“MB” >=80% e <90%
“B” >=70% e < 80%
“I” < 70%
====================Contracheque===============================
Funcionario: Fulano
Salário Bruto: 0,00
Número de Filhos: 0
====================
Desconto de INSS: 0,00
Desconto de IRRF: 0,00
Total de Desconto: 0,00
====================
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 37
Programação e Estrutura de Dados
_____________________________________________________________________________
INSS
Salário Desconto
Até R$ 911,70 8%
De R$ 911,71 a R$ 1.719,50 9%
De R$ 1.519,51 a R$ 3.038,99 11%
IRRF
Salário Desconto Dedução
Até R$ 1.372,81 Isento
De R$ 1.372,82 a 1.743,25 25% R$ 205,2
> R$ 1.743,26 27% R$ 548,82
SALÁRIO DE FAMÍLIA
Salário Valar a Receber
Até R$ 472,43 R$ 24,23
De R$ 472,44 a 710,08 R$ 17,07
FGTS
8% do salário bruto (será depositado no Banco)
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 38
Programação e Estrutura de Dados
_____________________________________________________________________________
Valores:
{
int a = 5;
char ch = “x”;
}
Para nós é fácil de entender que “a” e igual ao valor 5 e “ch” é igual ao valor “x”. Más para
entender o que um ponteiro mais adiante, este definição de valores não é suficiente. Tempos
que “baixar o nível” um pouco e ver da perspectiva do compilador e/ou processador. Vocês
concordam que para o compilador/processador “a” e “ch”não faz sentido?. Para o
compilador/processador “a” e “ch” são endereço de memória. Esta é a chave de tudo!. São
lugares de memória que contém no caso de “a” um inteiro com valor 5 e no caso “ch” um
caractere com o valor “x”. Isto é muito importante. Enquanto nós (humanos) entendemos “a”
é igual a 5 e “ch” é igual ao caractere “x” , ele (o computador) entender:
Endereço Valor
a 0100 00
0101 00 5
0102 00
0103 05
ch 0104 78 “x”
Vamos entender a figura, cada linha representa um byte. A coluna da direita (Verde)
representa a memória em si, e a coluna da esquerda (Azul) representa o endereço de cada
byte da memória. A notação utilizada é a hexadecimal, o endereço (Azul) foi escolhido
aleatoriamente, más o fato deles serem seqüenciais, não é coincidência. Notar que o que nós
enxergamos como “a” o computador (neste exemplo) enxerga como o endereço 0100 e pelo
fato de “a” ser do tipo int, ele ocupa 4 bytes. O mesmo acontece com “ch”, o computador
enxerga como o endereço 0104 e por ser do tipo char ocupa somente um byte. Resumindo, o
endereço 0100 (“a”) da memória tem o inteiro 5 e o endereço 0104 (“ch”) da memória tem
78 (valor ASCII hexadecimal do caractere “x”).
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 39
Programação e Estrutura de Dados
_____________________________________________________________________________
Ponteiros:
Um ponteiro é um endereço de memória e não um valor. Talvez seja interessante fazermos
uma analogia entre ponteiro e um link. Ponteiro nos leva de uma posição de memória até a
outra como um link nos leva de um site até o outro. Ponteiro é basicamente isto. O resto é só
entender a sintaxe.
No C, ao se definir:
É reservada uma área na memória com o tamanho especificado pelo tipo da variável (char =
1 byte). Esta área é identificada no programa por um nome (letra), mas internamente ao
sistema, por um valor numérico, chamado endereço da variável.
Para declarar e utilizar um ponteiro usa-se uma simbologia apropriada. O símbolo &(e-
comercial) se refere ao endereço de uma variável. O símbolo *(asterisco) declara um
ponteiro, e também serve para referenciar um conteúdo. A declaração é dada por:
tipo * nome_da_variável;
Assim, alterando a definição da variável letra do Exemplo acima, para o uso de ponteiro,
teremos (as linhas foram numeradas para explicar as linhas do trecho de programa):
Exemplo 1:
Na linha [1] criou-se uma variável do tipo char para armazenar uma letra.
Na linha [2] está sendo declarado um ponteiro chamado pLetra do mesmo tipo de letra
(char). Sempre um ponteiro, deve ser do mesmo tipo da variável a ser apontada. O símbolo *
(asterisco) indica que a variável é um ponteiro.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 40
Programação e Estrutura de Dados
_____________________________________________________________________________
Na linha [3] a variável letra (uma posição da memória) recebe o caractere 'A', ou seja, o
conteúdo a ser armazenado na área reservada para variável letra.
Na linha [4] o ponteiro pLetra recebe o endereço de memória da variável letra, ou seja, passa
a apontar para a variável letra. Usa-se o símbolo & (e-comercial) para acessar o endereço de
uma variável.
Se adicionarmos uma nova variável, aux, junto às definições de variáveis do exemplo:
Endereço Valor
letra 0100
*pletra 0101
letra 0100 41 “A”
pletra = &letra 0100
aux 0102
aux = *pLetra 0102 41 “A”
{
char letra; letra 0100: 41
char *pletra; aux 0102: 0100: 41
letra = “A”;
pletra = &letra;
char aux;
aux = *pletra;
}
Exemplo 2:
Dado o seguinte trecho de programa, qual o conteúdo das variáveis após a sua
execução?
{
int x = 1; // declara e atribui o valor 1em uma posição de memória
int y = 2; // declara e atribui o valor 2 em uma posição de memória
int *ip, *iy, *sxy ; // declaração de um ponteiro para inteiro
ip = &x; // o ponteiro ip recebe o endereço de x
y = *ip; // y recebe o conteúdo de x
*ip = 0; // x é zero
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 41
Programação e Estrutura de Dados
_____________________________________________________________________________
Memória Física
0100 00 00
0101 00 00
0102 00 00
0103 01 00
0104 00 00
0105 00 00
0106 00 00
0107 02 01
0108 00 00
0109 00 00
0110 00 00
0111 00 00
0112 00 00
0113 00 00
0114 00 00
0115 00 00
0116 00 00
0117 00 00
0118 00 00
0119 00 01
Então, no endereço reservado para „x‟ ficou armazenado o inteiro 0, no endereço reservado
para „y‟ ficou armazenado o inteiro 1 e no endereço reservado para „sxy‟ ficou o inteiro 1.
Exemplo 3:
Qual o valor da variável “y” e “z” após a execução do trecho de programa abaixo.
Edit2->Text = y;
Edit3->Text = *z;
}
Exemplo 4:
{
int x,y;
int *p1, *p2;
x = 1000;
p1 = &x;
p2 = p1;
ListBox1->Items->Add( IntToStr(p1));
ListBox1->Items->Add( IntToStr(p2));
ListBox1->Items->Add(*p1);
ListBox1->Items->Add(*p2);
Exemplo: (Adição)
{
int numero[5] = {5, 7, 9, 10, 12};
int *ptrnumero; Memória
ptrnumero = &numero[0];
100 5
ListBox1->Items->Add(IntToStr(*ptrnumero++)); 101 7
ListBox1->Items->Add(IntToStr(*ptrnumero++)); 102 9
ListBox1->Items->Add(IntToStr(*ptrnumero++)); 103 10
ListBox1->Items->Add(IntToStr(*ptrnumero++)); 104 12
ListBox1->Items->Add(IntToStr(*ptrnumero++));
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 43
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo: (Subtração)
String *ptr;
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 44
Programação e Estrutura de Dados
_____________________________________________________________________________
// procedimento do botão
sexo = (Edit1->Text);
altura = atof(Edit2->Text.c_str());
if (sexo == "F")
{
p_ideal_f(&altura); // chamar o procedimento feminino.
Edit3->Text = peso_ideal;
}
if (sexo == "M")
{
peso_ideal_masc = p_ideal_m(&altura); // chamar a função masculino
Edit3->Text = *peso_ideal_masc;
}
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 45
Programação e Estrutura de Dados
_____________________________________________________________________________
9.4 Exercícios
a) q = p c) &q = p
b) *q = p d) q = &p
4. Assumindo que o endereço de “num” foi atribuído a um ponteiro “pnum”, quais das
seguintes expressões são verdadeiras?
5. Faça um programa que o usuário entre com dois valores qualquer. Uma função receber os
endereços dos valores digitados, a mesma função calcula a soma dos dois ponteiros e
devolve para ser impresso ao programa principal.
7. Considere o valor das vendas dos últimos 3 anos da Empresa Sucata Duquinha Ltda,
na tabela abaixo:
Ano J F M A M J J A S O N D
06 9 10 8 11 8 9 7 6 11 10 12 13
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 46
Programação e Estrutura de Dados
_____________________________________________________________________________
07 10 11 15 17 18 19 12 10 16 15 11 10
08 11 13 12 10 15 17 18 19 15 17 16 15
O senhor Duquinha é o dono da Empresa. Ele quer saber a média de vendas e o valor
do lucro total de todas suas vendas, durante os 3 (três) anos de atividade da empresa,
na tabela. Considere o lucro de 60% do total das vendas. Faça um programa que
declare os valores em uma matriz, um ponteiro caminha cada endereço de memória e
soma cada conteúdo armazenado, e no final mostrar a situação da empresa para o
senhor Duquinha.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 47
Programação e Estrutura de Dados
_____________________________________________________________________________
Até aqui, na declaração de um vetor, foi preciso dimensioná-lo. Isto nos obrigava a saber,
de antemão, quanto espaço seria necessário, isto é, tínhamos que prever o número
máximo de elementos no vetor durante a codificação. Este pré-dimensionamento do vetor é
um fator limitante. Por exemplo, se desenvolvermos um programa para calcular a média
das notas de uma prova, teremos que prever o número máximo de alunos. Uma solução é
dimensionar o vetor com um número absurdamente alto para não termos limitações quando
da utilização do programa. No entanto, isto levaria a um desperdício de memória que é
inaceitável em diversas aplicações. Se, por outro lado, formos modestos no pré-
dimensionamento do vetor, o uso do programa fica muito limitado, pois não conseguiríamos
tratar turmas com o número de alunos maior que o previsto.
Uso da memória
Informalmente, podemos dizer que existem três maneiras de reservarmos espaço de
memória para o armazenamento de informações. A primeira delas é através do uso de
variáveis globais (e estáticas). O espaço reservado para uma variável global existe
enquanto o programa estiver sendo executado. A segunda maneira é através do uso de
variáveis locais. Neste caso, como já discutimos, o espaço existe apenas enquanto a
função que declarou a variável está sendo executada, sendo liberado para outros usos
quando a execução da função termina. Por este motivo, a função que chama não pode
fazer referência ao espaço local da função chamada. As variáveis globais ou locais podem
ser simples ou vetores. Para os vetores, precisamos informar o número máximo de
elementos, caso contrário o compilador não saberia o tamanho do espaço a ser reservado.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 48
Programação e Estrutura de Dados
_____________________________________________________________________________
Programa carregado
na memória.
Existem funções, presentes na biblioteca padrão stdlib, que permitem alocar e liberar
memória dinamicamente. A função básica para alocar memória é malloc. Ela recebe como
parâmetro o número de bytes que se deseja alocar e retorna o endereço inicial da área de
memória alocada.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 49
Programação e Estrutura de Dados
_____________________________________________________________________________
desejamos armazenar valores inteiros nessa área, devemos declarar um ponteiro de inteiro
para receber o endereço inicial do espaço alocado. O trecho de código então seria:
int *v;
v = malloc(10*4);
Após este comando, se a alocação for bem sucedida, v armazenará o endereço inicial de
uma área contínua de memória suficiente para armazenar 10 valores inteiros. Podemos,
então, tratar v como tratamos um vetor declarado estaticamente, pois, se v aponta para o
inicio da área alocada, podemos dizer que v[0] acessa o espaço para o primeiro elemento
que armazenaremos, v[1] acessa o segundo, e assim por diante (até v[9]).
v = malloc(10*sizeof(int));
Além disso, devemos lembrar que a função malloc é usada para alocar espaço para
armazenarmos valores de qualquer tipo. Por este motivo, malloc retorna um ponteiro
genérico, para um tipo qualquer, representado por void*, que pode ser convertido
automaticamente pela linguagem para o tipo apropriado na atribuição.
O comando para a alocação do vetor de inteiros fica então:
v = (int *) malloc(10*sizeof(int));
Se, por ventura, não houver espaço livre suficiente para realizar a alocação, a função
retorna um endereço nulo (representado pelo símbolo NULL, definido em stdlib.h).
Podemos cercar o erro na alocação do programa verificando o valor de retorno da função
malloc. Por exemplo, podemos imprimir uma mensagem e abortar o programa com a
função exit, também definida na stdlib. Exemplo:
v = (int*) malloc(10*sizeof(int));
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 50
Programação e Estrutura de Dados
_____________________________________________________________________________
if (v==NULL)
{
ShowMessage("Memoria insuficiente.");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}
Para liberar um espaço de memória alocado dinamicamente, usamos a função free. Esta
unção recebe como parâmetro o ponteiro da memória a ser liberada. Assim, para liberar o
vetor v, fazemos:
free (v);
Só podemos passar para a função free um endereço de memória que tenha sido alocado
dinamicamente. Devemos lembrar ainda que não podemos acessar o espaço na memória
depois que o liberamos.
Exemplo 1:
//-------------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int x, *v;
v = (int*) malloc(10*sizeof(int));
if (v==NULL)
{
ShowMessage("Memoria insuficiente.");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}
else
for (x=0 ; x< 10 ; x++)
{
v[x] = x;
ShowMessage(v[x]);
}
free(v);
}
//------------------------------------------------------------------------------------------
Exemplo 2:
Dado 3 valores tipo float (7.5, 9.0, 9.7). Alocar as posições de memória necessária para
armazenar os valores e média.
// ------------------Botão-------------------------------------------------------------
{
float *n;
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 51
Programação e Estrutura de Dados
_____________________________________________________________________________
n = (float*) malloc(4*sizeof(float));
if (n==NULL)
{
ShowMessage("Memoria insuficiente.");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}
else
{
n[0] = 7.5 ;
n[1] = 9.0 ;
n[2] = 9.7 ;
n[3] = (n[0] + n[1] + n[2]) / 3 ;
ShowMessage(n[3]);
free(n);
}
}
//---------------------------------------------------------------------------
Exemplo 3:
// Variáveis Globais---------------------------------------------------
String valor;
int n, x, *v;
// Botao Incluir--------------------------------------------------------
void __fastcall TForm1::IncluirClick(TObject *Sender)
{
n = atoi(Edit1->Text.c_str());
v = (int*) malloc(n*sizeof(int));
if (v==NULL)
{
ShowMessage("Memoria insuficiente.");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}
else
for (x=0 ; x < n ; x++)
{
}
}
// Imprimir---------------------------------------------------------------------
void __fastcall TForm1::ImprimirClick(TObject *Sender)
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 52
Programação e Estrutura de Dados
_____________________________________________________________________________
{
for (x=0 ; x < n ; x++)
ListBox1->Items->Add(v[x]);
// Liberar memória------------------------------------------------------
void __fastcall TForm1::LbMemoriaClick(TObject *Sender)
{
free(v);
}
//---------------------------------------------------------------------------
Uma lista encadeada tem necessariamente uma variável ponteiro apontando para o seu
primeiro elemento. Essa variável será utilizada sempre, mesmo que a lista esteja vazia, e
deverá apontar sempre para o início da lista (primeiro elemento). Caso esta primeira
variável não seja atualizada corretamente (no caso da inclusão de um elemento na primeira
posição), a lista poderá se perder na memória e não ser mais acessível.
Exemplo:
struct celula
{
int dados; /* campo para os dados */
struct celula *proximaCelula; /* ponteiro para a proxima celula */
};
celula *aux;
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 53
Programação e Estrutura de Dados
_____________________________________________________________________________
Uma vez que o primeiro elemento será uma célula, e cada célula é uma estrutura, então a
variável que apontará para o início da lista será um ponteiro de estrutura.
inicio = NULL;
Para uma lista vazia (sem células), a variável inicio possui valor NULL:
Temos então:
e precisamos atualizar os ponteiros para que a lista receba seu primeiro elemento. Sendo
assim:
1) aux->proximaCelula = NULL; // atribui NULL ao campo proximacelula da célula
apontada por aux.
Para inserir dados nesta primeira célula, podemos utilizar o ponteiro aux, que permanece
apontando para a célula.
aux->dados = 10; /*atribui o valor 10 ao campo dados da célula pontada por aux
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 54
Programação e Estrutura de Dados
_____________________________________________________________________________
O programa a seguir cria uma lista com três nós, conforme exibida a abaixo
inicio
matricula proximo
11 2 3
Exemplo 1:
// Estrutura global------------------------------------------------------------------
struct no /* nome da estrutura */
{
int matricula; /* tipo da dado matrícula a ser alocada */
struct no *proximo; /* ponteiro que aponta para próxima cela célula */
};
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 55
Programação e Estrutura de Dados
_____________________________________________________________________________
}
//---------------------------------------------------------------------------
Exemplo 2:
struct aluno
{
char nome[50];
int idade;
struct aluno *proximo;
};
// Aloca o nó na memória---------------------------------------------------------
void aloca(void)
{
novo = (aluno*) malloc(sizeof (aluno));
if (novo == NULL)
{
ShowMessage("Memoria insuficiente.");
exit(1);
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 56
Programação e Estrutura de Dados
_____________________________________________________________________________
aloca();
insere();
if (atual == NULL)
{
novo->proximo = NULL; /* nulo */
inicio = novo; /* inicio recebe o endereço do nó atual alocado */
atual = novo; /* atual recebe o endereço do nó atual alocado */
}
else
{
novo->proximo = NULL; /* nulo */
atual->proximo = novo; /* nó anterior aponta para o próximo nó */
atual = novo; /* atual recebe o endereço do nó alocado no momento */
}
}
// Botal2 posiciona o no registro 1 e lista cada registro alocado--------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
/* exibe os nós da lista */
atual = inicio;
while (atual != NULL)
{
ListBox1->Items->Add(atual->nome);
ListBox1->Items->Add(atual->idade);
atual=atual->proximo;
}
}
//---------------------------------------------------------------------------
matricula proximo A M P A M P
inicio
1 2 2
fim
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 57
Programação e Estrutura de Dados
_____________________________________________________________________________
Exemplo :
struct cliente // define cliente como uma estrutura composta com os dados abaixo.
{
char nome[20]; // declara nome com 20 caracteres.
char telefone[15]; // declara telefone com 15 caracteres.
char email[30]; // declara o email com 30 caracteres.
struct cliente *prox, *ant; // declara prox e ant como ponteiros para movimentar a
estrutura.
};
struct cliente *registro, *inicio, *ultimo, *pos; // declara todas as variaveis com ponteiro para
o controle da estrutura criada.
//-------------------------------------------------------------------------
struct cliente *nova(void) // define uma função para nova do tipo estrutura cliente.
{
struct cliente *x; // declara x como o ponteiro para estrutura cliente.
x = ALOCA; // chama a função definida aloca atribui o endereço a x.
x->ant = registro; // o ponteiro x aponta para o registro anterior que recebe o registro atual.
x->prox = NULL; // o ponteiro x aponta para o proximo registro que receber o nulo.
return (x); // retorna o endereço de x para a linha que o chamou a função nova.
}
//-------------------------------------------------------------------------
struct cliente* insere(struct cliente *pt) // declara a função insere do tipo estrutura cliente.
{
strcpy(pt->nome,Form1->Edit1->Text.c_str()); // copia o dado digitado para o endereço de nome.
strcpy(pt->telefone,Form1->Edit2->Text.c_str()); // copia o dado digitado para o endereço de telefone.
strcpy(pt->email,Form1->Edit3->Text.c_str()); // copia o dado digitado para o endereço de email.
pt->prox = nova(); // o ponteiro pt aponta para o prox e executa a função nova.
ultimo=pt->prox->ant; // o ultimo inserido, no o atual recebe o endereço do anterior.
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
inicio = registro = ALOCA; // inicia as variaveis o primeiro endereço criado por aloca.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bInsereClick(TObject *Sender)
{
registro = insere(registro); // chama a função insere e recebe o endereço do proximo.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 58
Programação e Estrutura de Dados
_____________________________________________________________________________
//---------------------------------------------------------------------------
void __fastcall TForm1::bApagaClick(TObject *Sender)
{
free(registro); // apaga todos as alocação de memoria ciada por alloc.
Close(); // fecha o formulário.
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::bInicioClick(TObject *Sender)
{
pos = inicio; // posiciona no inicio da alocação.
Edit1->Text = pos->nome; // edit1 recebe de volta o nome alocado.
Edit2->Text = pos->telefone; // edit2 recebe de volta o telefone alocado.
Edit3->Text = pos->email; // edit3 recebe de volta o email alocado.
registro = pos; // registro recebe a posiçao do atual.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bUltimoClick(TObject *Sender)
{
pos = ultimo; // posiciona no ultimo registro.
Edit1->Text = pos->nome; // edit1 recebe de volta o nome alocado.
Edit2->Text = pos->telefone; // edit2 recebe de volta o telefone.
Edit3->Text = pos->email; // edit3 recebe de volta o email.
registro = pos; // registro recebe a posiçao do atual.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bProximoClick(TObject *Sender)
{
pos = registro->prox; // recebe a posição do proximo.
if (registro->prox != NULL && registro != ultimo) // verifica se o proximo não é nulo e o
registro atual é diferente do ultimo, criado e não utilizado.
{
Edit1->Text = pos->nome; // edit1 recebe de volta o nome alocado.
Edit2->Text = pos->telefone; // edit2 recebe de volta o telefone.
Edit3->Text = pos->email; // edit3 recebe de volta o email.
registro = pos; // registro recebe a posição do atual.
}
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 59
Programação e Estrutura de Dados
_____________________________________________________________________________
9.8 Pilhas
Uma pilha é uma lista de variáveis do mesmo tipo (semelhantes a uma matriz, ou mesmo
uma matriz), onde utilizamos o conceito de que "o primeiro que entra é o último a sair".
Imaginemos um bloco de folhas. Normalmente utilizaremos primeiro a última folha do bloco
("a de cima"), enquanto que a primeira folha colocada ("a de baixo") será a última a ser
utilizada. Outro exemplo, uma pilha de prato, o ultimo da pilha e o primeiro a ser usado. Nos
exemplos a seguir serão utilizadas duas funções: push() e pop(). Usaremos push() para
inserir elementos na pilha e pop() para sacá-los.
Exemplo:
Push(A) A
Pusb(B) BA
Push(C) CBA
Pop() BA
Push(F) FBA
Pop() BA
Pop() A
Pop() vazia
Exemplo 1:
O programa abaixa empilha e desempilha cinco valores inteiros na memória.
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 60
Programação e Estrutura de Dados
_____________________________________________________________________________
// Variaveis------------------------------------------------------------------------
int pilha[5],*p1,*to, *max, valor; // vetor, ponteiros e variaveis normais
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
p1 = pilha; // ponteiro “p1” e “to” recebe a primeira posição do vetor pilha
to = p1;
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 61
Programação e Estrutura de Dados
_____________________________________________________________________________
// Procedimento botão-----------------------------------------------
{
Close(); // fechar
}
//---------------------------------------------------------------------------
Exemplo 2:
O programa empilha e desempilha valores com alocação de memória
// variaveis globaix-------------------------------------------------------------------
char x,y,*px; // declaração de variaveis comuns e ponteiro
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 62
Programação e Estrutura de Dados
_____________________________________________________________________________
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 63
Programação e Estrutura de Dados
_____________________________________________________________________________
9.9 FILAS
Uma fila é uma lista de variáveis do mesmo tipo (semelhantes a uma matriz, ou mesmo
uma matriz), onde utilizamos o conceito de que "o primeiro que entra é o primeiro a sair".
Imaginemos uma fila de um banco. Normalmente a primeira pessoa que chega é o primeiro
que será atendido. Nos exemplos a seguir serão utilizadas duas funções: Inseri() e
Remover(). Usaremos Inserir() para colocar elementos na fila e Remover() para tirá da fila.
Fila Simples:
Simulando uma fila em ação na memória
Inserir(A) A
Inserir(B) AB
Inserir(C) ABC
Remover() BC
Inserir(F) BCF
Remover() CF
Remover() F
Remover() vazia
Exemplo 1:
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 64
Programação e Estrutura de Dados
_____________________________________________________________________________
// Botão Inserir-----------------------------------------------------------
{
inserir("A");
inserir("B");
inserir("C");
remover();
ListBox1->Items->Clear();
for (x=0 ; x < MAX ; x++)
ListBox1->Items->Add(p[x]);
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 65
Programação e Estrutura de Dados
_____________________________________________________________________________
// Botão Listar-----------------------------------------------------------
{
int x;
ListBox1->Items->Clear();
for (x=0 ; x < 3 ; x++)
ListBox1->Items->Add(p[x]);
// Botão Fechar----------------------------------------------------------
{
Close();
}
Fila Circular:
Dizemos que uma fila é circular quando implementamos os índices de uma fila simples para
retornar ao início da matriz, em vez de termos uma para pelo programa.
Inserir(A) A
Inserir(B) AB
Inserir(C) ABC
Remover() BC
Inserir(F) BCF
Remover() CF
Remover() F
Remover() vazia
Obs: No procedimento do exemplo anterior, atribua o valor “NULL” aos indices, e assim o
programa reinicia a fila novamente em vez de para o programa.
// Procedimento remover da Fila-----------------------------------
void remover(void)
{
if (rpos==spos)
{
ShowMessage("Fila vazia");
spos = NULL ; rpos = NULL; // indice recebe o valor nulo, volta ao inicio da fila
return;
}
rpos++;
p[rpos-1]=""; // ponteiro na receber o valor nulo
}
_____________________________________________________________________________
CEFET - Curso Superior de Tecnologia em Sistemas para Internet - Prof. Pereira Página 66