You are on page 1of 62

Professora ANITA LOPES

FUNDAMENTOS DA LINGUAGEM C++


1 A linguagem C++
1.1

Introduo

A linguagem C++ foi desenvolvida nos Laboratrios da BELL. Ela baseada na linguagem
C, mas acrescenta caractersticas de uma linguagem orientada a objetos.
Nosso estudo no far meno a orientao a objetos.
A linguagem C++ "Case Sensitive", isto , maisculas e minsculas fazem diferena.
1.2

Estrutura de um programa em C++

Um programa em C++ constitudo de:


cabealhos que contm definies de pr-processamento tais como os arquivos de
cabealho, as definies de constantes simblicas, uso de namesapces,declarao
de variveis globais, declarao de rotinas, etc.
um bloco da funo principal e outros blocos de funes.
comentrios.
[ <definies de pr-processamento> ]
[ <declarao de variveis globais> ]
int main()
{
Bloco de comandos
}
<tipo de retorno da funo> <nome_da_funo1 >( <parmetros>) >
{
Bloco de comandos da funo1
}
...
<tipo de retorno da funo> <nome_da_funon >( <parmetros>) >
{
Bloco de comandos da funo2
}
Exemplo de um programa em C++
#include <iostream>
usingnamesapce std;
int main()
{
cout<<"\nPRIMEIRO PROGRAMA EM C++";
}
Explicando:
1

Professora ANITA LOPES


#include <iostream> instrui o compilador a usar a biblioteca padro de entrada e
sada
using namesapce std; uso do namespace padro std
int main()
main o nome da funo principal;
{
inicia a funo
cout
imprime na tela a msg aps alimentar linha
}
finaliza a funo

1.2.1 Conjunto de caracteres


Um programa fonte em C++ um texto no formatado escrito em um editor de textos
usando um o conjunto padro de caracteres ASCII.
Caracteres vlidos:
As letras minsculas e maisculas no acentuadas
Os algarismos de 0 - 9
+-*/\=|&!?#%(){}[]_.,:<>
Observao: Qualquer outro caracter valido para as strings.
1.2.2 Comentrios
Os comentrios em C++ podem aparecer em qualquer lugar do programa e tm como
objetivo fazer um esclarecimento sobre uma linha ou trecho do programa.
Os comentrios de bloco tero um /* antes e um */ depois, ou // quando se deseja
comentar uma linha.
Exemplo:
/* programar em
C++ eh facil */
// so uma linha
1.2.3 Diretivas de Compilao
Na linguagem C++, alguns comandos so processados durante a compilao. Estes
comandos so chamados de diretivas de compilao e so eles que informam quais bibliotecas
e constantes simblicas devero ser anexadas quando for gerado o programa executvel.
A diretiva #include diz ao compilador para incluir na compilao do programa outros
arquivos. Geralmente estes arquivos contem bibliotecas de funes ou rotinas do usurio.
As bibliotecas agrupam funes de acordo com as finalidades. Se no fizssemos uso
delas, nossos programas seriam muito extensos e teramos problemas na linkedio.
Sintaxes:
2

Professora ANITA LOPES


#include <nome_da_biblioteca >
#include ...nome_da_biblioteca
onde nome_da_biblioteca o nome da biblioteca que se deseja incluir. Estando entre
os sinais < e > significa que est no diretrio padro e ficando entre , significa que precisamos
fornecer o caminho onde se encontra a biblioteca.
Exemplos de bibliotecas:
BIBLIOTECA ctype.h
Converte para maiscula ou para minscula uma letra
toupper(letra)
tolower(letra)

BIBLIOTECA math.h
Calcula o valor absoluto real d

fabs(double d)
sin(double arco)
cos(double arco)
tan(double arco)
asin(double arco)
acos(double arco)
atan(double arco)

Funes trigonomtricas do ngulo arco, em radianos

Funes de arredondamento para inteiro


ceil(double num)
Ex. ceil(3.2) => 4.0 arredonda pra cima
floor(double num)
Ex. floor(3.2) => 3.0 arredonda para baixo
Funes logartmicas: log() logaritmo natural (base e), log10() logaritmo decimal
(base 10)
log(double num)
log10(double num)
Funes: potncia e raiz quadrada
pow(double base, double exp); Potenciacao: pow(3.2,5.6) => 3.2 5.6
sqrt(double num);
Raiz quadrada: sqrt(9.0) = >3.0.
BIBLIOTECA stdlib.h
Calcula o valor absoluto do inteiro i e do real d, respectivamente
abs(int /float)
rand()

BIBLIOTECA string.h
3

Professora ANITA LOPES


Concatena duas strings
strcat(str1, str2);
Copia o contedo de uma varivel em outra varivel
strcpy(str1, str2)
/* no permitido: str1 =str2;*/
Fornece o nmero de caracteres de uma string
strlen(str1)
Compara duas strings
devolve nmero menor que 0 se str1 vier antes de str2
strcmp(str1, str2) devolve nmero maior que 0 se str1 vier depois de str2
devolve 0 se str1 for igual str2

2. Sada
O objeto cout permite que enviemos dados/mensagens para a tela.

Usando: using namespace std;

Usando: using std::cout;

No usando namespace

Controle/Caracter
nulo (null)
campainha (bell)
retrocesso (backspace)
tabulacao horizontal
nova linha (new line)
tabulacao vertical
alimentacao de folha (form feed)
retorno de carro (carriage return)
aspas (")
apostrofo (')
interrogacao (?)
barra invertida (\)

cout<< ;
cout<<variavel<<endl;
cout<< ;
cout<<variavel<<endl;
std::cout<< ;
std::cout<<variavel<<endl;
Seqncia de escape
\0
\a
\b
\t
\n
\v
\f
\r
\"
\'
\?
\\

Professora ANITA LOPES


#include <iostream>
using namespace std;
int main()
{ cout<<"Aprendendo a usar \"cout\"\n" ;
// o caracter \" imprime aspas na tela
cout<<"O operador de insercao << separa os elementos que se desja colocar na tela\n";
cout<<"O caracter de controle \'\\n\' equivale a endl, alimenta linha"<<endl;
cout<<"Usando \'\\t\' \timprime-se na proxima zona\n";
// o caracter \ imprime apostrofo na tela e o carcater \\ imprime \ na teal
system("pause");
}

3. Constantes e variveis
3.1 Constantes
O C++ possui quatro tipos bsicos de constantes: inteiras, de ponto flutuante,
caracteres e strings. Constantes inteiras e de ponto flutuante representam nmeros de um
modo geral.
3.1.1 Constantes inteiras
As constantes inteiras na linguagem C++ podem ser escritas no formato decimal (base
10), hexadecimal (base 16) ou octal (base 8).
Exemplos:
Decimal: 12
Octal : 033 ( em decimal vale 27. O zero antes do nmero caracteriza a constante
octal)
Hexadecimal: 0xff ( em decimal vale 255. O zero e o x antes do nmero caracterizam
a constante hexadecimal)
3.1.2 Constantes de ponto flutuante
So nmeros reais com um ponto decimal e (opcionalmente) um expoente.
Exemplos:
5

Professora ANITA LOPES


1.876 476.65 1.23e-9 -1.e2 10.6e18 -.853E+67
3.1.3 Constantes caracteres
Uma constante caracter uma letra ou smbolo colocado entre plicas.
Exemplo:
A
N
I
T A
As constantes caracter so armazenadas como nmeros inteiros. Estes nmeros
correspondem aos valores de cada caracter dentro do cdigo ASCII.

3.1.4 Constantes strings


Uma constante string consiste de um conjunto de caracteres do cdigo ASCII padro
ou estendido, colocados entre aspas duplas.
Exemplo:
UAL!
Matemtica
APRENDENDO A PROGRAMAR EM C++
Na linguagem, C++ uma string um vetor de caracteres terminado com um caracter nulo.
O caracter nulo um caracter com valor inteiro igual a zero (cdigo ASCII igual a 0). O
terminador nulo tambm pode ser escrito usando a conveno de barra invertida do C como
sendo '\0'.

char nome_da_string[tamanho];
Como precisamos reservar uma posio para o terminador, sempre iremos declarar o
tamanho necessrio mais um.
Vamos supor que declaremos uma varivel de nome palavra de 11 posies(char
palavra[11]; ) e armazenemos a palavra PROGRAMAS nela.

bom ressaltar que a linguagem C++ no inicializa as variveis e toda clula no usada
tm valor indeterminado.
No se esquea de inicializar as variveis de seus programas, pois coisas incrveis
podem acontecer!
As strings so consideradas vetores de caracteres( matriz linha). Como na Matemtica,
para se acessar um determinado caracter de uma string, basta "indexarmos".

Professora ANITA LOPES


str[1] = 'o'
str[2] = 'a'
No exemplo acima, percebemos que o primeiro caracter se encontra na posio 0( em
algumas linguagens, seria a posio 1). Desta forma, se indexarmos com 1, na verdade
estaremos nos referindo ao segundo caracter da string; se indexarmos com 2, na verdade
estaremos nos referindo ao terceiro caracter da string e assim sucessivamente.
3.1.5 Constantes Simblicas
A Matemtica define pi como tendo o valor 3,14159265. Muitas vezes precisaremos
definir algumas constantes em nossos programas.
3.1.5.1 Constantes definidas pelo programador
O programador pode definir constantes simblicas em qualquer programa.
Sintaxe:

#define <nome> < valor >


Onde #define uma diretiva de compilao que diz ao compilador para trocar as
ocorrncias do texto nome por valor. Observe que no h ; no final da instruo pois trata-se
de um comando para o compilador e no para o processador. A instruo #define deve ser
escrita antes da instruo de declarao da rotina principal.
O uso da diretiva #define no se restringe apenas para declarar constante(#define pi
3.14159265 ) mas tambm podemos us-la para definir macro instrues(#define conv(x)
(x*pi/180) ou #define quadrado(x) (x*x) ).

3.2 Variveis
A varivel um lugar(endereo) na memria principal que armazena um dado e tem um
nome associado para facilitar a programao .
Em C++, as variveis podem ser declaradas no inicio do programa, mas poderemos
tambm declarar dentro de algumas estruturas, diferentemente de outras linguagens. Estas
variveis podem ser de vrios tipos: int (inteiro), float (real de simples preciso) , char
(caracter nico), double (real de dupla preciso).
A classe String ser vista em outro momneto.

Professora ANITA LOPES


Tipo
char
int
float
double

Tamanho
1 byte
4 bytes
4 bytes
8 bytes

Intervalo
-128 a 127
-2147483648 a 2147483647
3.4e-38 a 3.4e38
1.7e-308 a 1.7e308

Uso
nmero muito pequeno e caracter ASCII
contador, controle de lao
real (preciso de 6dgitos)
cientfico (preciso de 10 dgitos)

Quando se define um tipo de varivel, informamos ao computador quanto de memria


ser necessria para armazenar este dado e que tipos de operaes podero ser realizadas
com este dado.
Para se declarar uma varivel, usamos a seguinte sintaxe:
< tipo> nome_da_varivel ;
O nome de uma varivel deve obedecer algumas regras:
1. O primeiro caracter pode ser uma letra ( maiscula ou minscula) ou o caracter
sublinha. Aconselha-se a no usar o caracter sublinha no inicio para no confundir
com algumas funes.
2. Os demais caracteres, letras algarismos ou o caracter sublinha.
Exemplos:
int a; float peso; char sexo; int idade1, idade2;

3.2.1 Palavras reservadas


Existem certos nomes que no podero ser usados como identificadores. So chamadas
as palavras reservadas e so de uso restrito da linguagem C++.
3.2.2 Tipos modificados
Alm dos tipos de dados mencionados, existem os modificadores: long, short, signed e
unsigned. Tipicamente o modificador long aumenta o nmero de bytes usados para o registro
do nmero. O modificador unsigned, usado somente em inteiros, permite que um bit usado
para guardar o sinal do nmero seja usado para guardar o valor do nmero.
Tipo
Tamanho (bytes)
Intervalo
unsigned char
1
0 a 255
unsigned int
2
0 a 65 535
unsigned long int
4
0 a 4 294 967 295
long int (int)
4
-2 147 483 648 a 2 147 483 647
short int
2
-32768 a 32767
long double
10
3.4e-4932 a 1.1e4932
Observao: Alguns outros tipos so possveis em ISO C90
3.2.3 Converso de tipo (Casting)
8

Professora ANITA LOPES


Algumas vezes queremos, momentaneamente, modificar o tipo de dado representado
por uma varivel, isto , queremos que o dado seja apresentado em um tipo diferente do qual a
varivel foi inicialmente declarada. Por exemplo: ao fazermos uma diviso entre dois inteiros,
a linguagem C++ trunca a parte fracionria e podemos desejar que isto no acontea. Este
procedimento chamado de converso de tipo ou casting .
Sintaxe:
(tipo) varivel
onde tipo o nome do tipo ao qual queremos converter o dado armazenado em varivel.
Exemplo:
#include <iostream>
using namespace std;
int main()
{ cout<<"\nNumero 7 DIVIDIDO por 3" ;
cout<<"\n\nsem conversao: "<<7/3<<"\tcom conversao: "<< (float)7/3<<"\n\n";
system("pause");

3.2.4 Varivel ponteiro


Ns j sabemos que uma varivel um endereo na MP que armazena um dado. bom
deixar claro que no um nico endereo, pois, dependendo do tipo, poderemos estar alocando
1, 2, 4, 8 ou mais posies para cada varivel como vimos na ltima tabela.
Uma varivel ponteiro armazena o endereo de outra varivel. Mais adiante
estudaremos este tipo de varivel uma vez que se no trabalharmos bem com este tipo de
varivel, no conseguiremos programar bem na linguagem C++.

4. Atribuio
Consiste em atribuir um valor a uma varivel. Em C ++, o comando de atribuio tem a
seguinte sintaxe:
< nome_da_varivel > = <contedo> ;
Exemplos:
a = 12 ;
peso = 65.2; sexo ='f'; idade1 = 21; idade2 = 34;
Observao 1: Em C++, possvel declarar e inicializar uma varivel: int a = 12;
Observao 2: Em C++, possvel inicializar vrias variveis: x =t =s = 0;
9

Professora ANITA LOPES


Na atribuio mltipla as operaes ocorrem da direita para a
esquerda, isto , inicialmente o valor 0 atribudo a s, depois o valor de
s atribudo a t e, por ltimo, o valor de t atribudo a x.
4.1 Atribuio mltipla.
A linguagem C++ permite que se atribua um valor a muitas variveis. em uma nica
instruo.
Sintaxe:
var_1 = [var_2 = ... ] = valor;
Exemplo:
a = b = 0;

5. Entrada de dados
scanf
5.1 cin

cin>>nomedavarivel;
cin>>nomedavarivel1>> nomedavarivel2;
O objeto cin permite que o usurio digite dados atravs do dispositivo padro de
entrada: teclado. O operador >> chamado de extrao.
#include <iostream>
using namespace std;
int main()
{ int idade; float altura;
cout<<"\nDigite idade: " ; cin>>idade;
cout<<"\nDigite altura: " ; cin>>altura;
cout<<"\n\n\nIdade: "<<idade;
cout<<"\nAltura: "<<altura<<endl;
system("pause");

#include <iostream>
using namespace std;
int main()
10

Professora ANITA LOPES


{

char sexo; char nome[30];


cout<<"\nDigite nome: " ; cin>>nome;
cout<<"\nDigite sexo(m/f): " ; cin>>sexo;
system("pause");
system("cls");
cout<<"\nNome; "<<nome;
cout<<"\nSexo; "<<sexo<<endl;;
system("pause");

O objeto cin quando l um vetor de char(string) termina a leitura no primeiro espao,


deixando RENATO no buffer.
Quando um outro cin para ler o sexo executado, o teclado no liberado e a letra R
apanhada e armazenada na varivel sexo.
Por estas razes, precisamos conhecer outros mtodos.

5.2 cin.getline
Este mtodo permite a leitura de um vetor de char inclusive com espaos e no
deixando nada no buffer.
Sintaxe:
cin.getline( <nome do vetor de caracteres>, <tamanho-1> );
#include <iostream>
using namespace std;
int main()
{ char sexo; char nome[30];
cout<<"\nDigite nome: " ; cin.getline(nome,29);
cout<<"\nDigite sexo(m/f): " ; cin>>sexo;
cout<<"\n\n\nNome: "<<nome;
cout<<"\nSexo: "<<sexo<<endl;;
system("pause");
}

5.3 cin.get
Este mtodo permite a leitura de um char.
11

Professora ANITA LOPES


Sintaxes:
cin.get(<nome da varivel char);
cin.get();
A primeira sintaxe serve para ler uma varivel do tipo char, mas deixa enter no buffer
enquqnto que o objeto cin sempre libera o teclado para o usurio digitar.
#include <iostream>
using namespace std;
int main()
{ char sexo1,sexo2;
cout<<"\nDigite sexo(m/f) " ;
cin.get(sexo1);
cout<<"\nDigite sexo(m/f): " ;
cin.get(sexo2);
cout<<"\n\n\nSexo: "<<sexo1;
cout<<"\nSexo: "<<sexo2<<endl;;
system("pause");
}

#include <iostream>
using namespace std;
int main()
{ char sexo1,sexo2;
cout<<"\nDigite sexo(m/f) " ;
cin>>sexo1;
cout<<"\nDigite sexo(m/f): " ;
cin>>sexo2;
cout<<"\n\n\nSexo: "<<sexo1;
cout<<"\nSexo: "<<sexo2<<endl;;
system("pause");
}

No se surpreenda se econtrar alguns bugs quando usar cin, cin.get() ou cin.getline() em


alguns compiladores.

No gosta de usar system(pause); ? Veja o exemplo abaixo:


#include <iostream>
using namespace std;
int main()
{ char sexo1,sexo2;
cout<<"\nDigite sexo(m/f) " ; cin>>sexo1;
cout<<"\nDigite sexo(m/f): " ; cin>>sexo2;
cout<<"\n\n\nSexo: "<<sexo1;
cout<<"\nSexo: "<<sexo2<<endl;;
cin.get();cin.get();
// o primeiro limpa o buffer e o segundo aguarda o pressionamento de uma
tecla
}

12

Professora ANITA LOPES

6. Operadores Aritmticos
Existem cinco operadores aritmticos em C ++. Cada operador aritmtico est
relacionado a uma operao aritmtica elementar: adio, subtrao, multiplicao e diviso.
Existe ainda um operador (%) chamado operador de mdulo cujo significado o resto da
diviso inteira.
Operador
+
*
/
%

Operao
adio
subtrao
multiplicao
diviso
mdulo (resto da diviso inteira)

Sintaxe:
operando1 operador operando2
onde operador um dos smbolos mostrados acima e operando uma constante ou um
identificador de varivel.
Exemplos:
12 + 5 -> 17
12 * 5 -> 60
12 / 5 -> 2 quando se divide dois inteiros, o resultado um inteiro
12 % 5 -> 2 resto da diviso inteira
Observao: Se voc precisar dividir dois nmeros inteiros e quiser a resposta em
real, existe duas sadas:
1- Coloque um ponto em um dos operandos caso, pelo menos um, seja uma
constante: 12 / 5. .
2- Caso os dois operandos sejam variveis, faa: (float) a/b .
No existe em C++, como existe em outras linguagens, um operador especfico para a
operao de potenciao (ab). Existe, porm, uma funo de biblioteca (pow(...,...)) que
realiza esta operao, ou voc poder criar quando aprender a usar as funes log e exp..
6.1

Hierarquia das operaes


13

Professora ANITA LOPES


Categoria

Operadores

Prioridade

parnteses

()

interno externo

funo

nome()

ED

incremental, lgico

++ -- !

ED

aritmtico

*/%

ED

aritmtico

+-

ED

relacional

< > <= >=

ED

relacional

== !=

ED

lgico

&&

ED

lgico

||

ED

condicional

?:

ED

atribuio

= += -= *= /= %=

ED

6.2

Operadores de Atribuio Aritmtica

Muitas vezes queremos alterar o valor de uma varivel realizando alguma operao
aritmtica com ela.
A linguagem C++ apresenta instrues otimizadas com o uso de operadores ditos
operadores de atribuio aritmtica. Os smbolos usado so (+=, -=, *=, /= , %=).
Sintaxes:

var += exp; var = var + exp;


var -= exp; var = var - exp;
var *= exp; var = var * exp;
var /= exp; var = var / exp;
var %= exp; var = var % exp;
onde var o identificador da varivel e exp uma expresso vlida. Estas instrues
so equivalentes as seguintes:

14

Professora ANITA LOPES


Exemplos:
Atribuio Aritmtica
cont += 1;
j -= i ;
num *= 1 + k;
divide /= 5;
resto %= 2;

Instruo Equivalente
cont = cont + 1;
j=ji;
num = num * (1 + k);
divide = divide / 5;
resto = resto % 2;

O operador de atribuio aritmtica tem precedncia menor que os outros operadores


at aqui discutidos.
6.3

Operadores Incrementais

Em programao existem instrues muito comuns chamadas de incremento e


decremento. Uma instruo de incremento adiciona uma unidade ao contedo de uma varivel.
Uma instruo de decremento subtrai uma unidade do contedo de uma varivel.
Existem, em C++, operadores especficos para realizar as operaes de incremento (++)
e decremento (--). Eles so genericamente chamados de operadores incrementais.
Sintaxe:
Instruo Equivalente
++ var;
var = var + 1;
var ++ ;
var = var + 1;
-- var ;
var = var 1;
var -- ;
var = var 1;
onde var o nome da varivel da qual se quer incrementar ou decrementar um unidade.
Observe que existe duas sintaxes possveis para os operadores: pode-se colocar o
operador como prefixo ou como sufixo. Nos dois casos o valor da varivel ser incrementado
(ou decrementado) de uma unidade. Porm se o operador for colocado como prefixo, o valor da
varivel ser incrementado (ou decrementado) antes que a varivel seja usada em alguma
outra operao. Caso o operador seja colocado como sufixo, o valor da varivel ser
incrementado (ou decrementado) depois que a varivel for usada em alguma outra operao.
#include <iostream>
using namespace std;
int main()
{ int n,n1,n2,pre,suf;
cout<<"\nnumero:";
cin>>n;
n1=n; //para nao perder o valor de n
n2=n; //para nao perder o valor de n
pre=++n1;
cout<<"\n\nprefixo= "<<pre<<"\t n= "<<n1<<endl;
suf=n2++;
cout<<"\n\nsufixo= "<<suf<<"\t n= "<<n2<<endl;
cin.get();cin.get();

}
15

Professora ANITA LOPES

6.4

Operadores Relacionais e Lgicos

As expresses lgicas usadas nas estruturas de teste so formadas pelos operadores


relacionais e lgicos.
6.4.1 Operadores relacionais
Operadores relacionais verificam a relao de magnitude e
valores. So seis os operadores relacionais em C:
Operador
>
<
>=
<=
==
!=

igualdade entre dois

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

Sintaxe:

expresso_1 operador expresso_2


onde expresso_1 e expresso_2 so duas expresses numricas quaisquer, e operador
um dos operadores relacionais.
Ao contrrio de outras linguagens, em C++ no existem tipos lgicos, portanto o resultado
de uma expresso lgica um valor numrico: uma expresso avaliada verdadeira recebe o
valor 1, uma expresso lgica avaliada falsa recebe o valor 0.
Os operadores relacionais de igualdade (== e !=) tem precedncia menor que os de
magnitude (>, <, >= e <=). Estes, por sua vez, tem precedncia menor que os operadores
aritmticos.

16

Professora ANITA LOPES


6.4.2 Operadores lgicos
So trs os operadores lgicos de C: &&, || e !. Estes operadores tm os mesmos
significados dos operadores lgicos Booleanos AND, OR e NOT.
Sintaxes:

expr_1 && expr_2


expr_1 || expr_2
!expr
onde expr_1 , expr_2 e expr so expresses quaisquer.
Observe que os operadores lgicos atuam sobre expresses de quaisquer valores. Para
estes operadores todo valor numrico diferente de 0 considerado 1.
Operador
conjuno
disjuno
negao

Matemtica
e
^
ou
v
no |

C
&&
||
!

TABELA VERDADE DO OPERADOR &&


Suponha duas perguntas feitas a quatro pessoas. Se a resposta do candidato for
negativa, dever falar 0, caso contrrio, falar 1.
Suponha tambm que s ser chamado para entrevista o candidato que dominar as
duas linguagens.
Voc conhece C++? Voc conhece PASCAL?
SADA
0
0
0
0
1
0
1
0
0
1
1
1
Neste exemplo, somente o quarto candidato seria chamado para a entrevista, pois o
operador && (e), s considera a expresso como verdadeira se todas as expresses
testadas forem verdadeiras.
TABELA VERDADE DO OPERADOR ||
Suponha duas perguntas feitas a quatro pessoas. Se a resposta do candidato for
negativa, dever falar 0, caso contrrio, falar 1.
Suponha tambm que ser chamado para entrevista o candidato que dominar pelo
menos uma linguagem.

17

Professora ANITA LOPES


Voc conhece C++?
0
0
1
1

Voc conhece JAVA?


0
1
0
1

SADA
0
1
1
1

Neste exemplo, somente o primeiro candidato no seria chamado para a entrevista ,


pois o operador || (ou), considera a expresso como verdadeira se, pelo menos uma
expresso testada for verdadeira.
Observao:O Operador && tem precedncia sobre o operador ||. Estes dois tm
precedncia menor que os operadores relacionais.
TABELA VERDADE DO OPERADOR !
Suponha uma pergunta feita a duas pessoas. Se a resposta do candidato for negativa,
dever falar 0, caso contrrio, falar 1.
Voc No conhece C++?
SADA
1
0
0
1
Observao:
O operador ! tem a mesma precedncia que os operadores incrementais.

7. Estruturas de seleo - if / switch


Nossos programas at agora seguiram um mesmo padro: entrava-se com dados, estes
eram processados e alguma informao era mostrada na tela.
Agindo desta forma, o computador mais parecia uma mquina de calcular. O
aprendizado de novos conceitos como a da estrutura de seleo nos dar uma viso maior
da complexidade de tarefas que ele poder executar.
7.1

Estrutura de deciso - if...else

A estrutura if...else uma estrutura de controle do C++ muito fcil de ser usada.
Aps o teste, o fluxo poder seguir dois caminhos, isto , se o teste resultar em uma
verdade, ser executado o comando ou bloco de comandos que se encontra aps o fecha
parnteses do teste, caso contrrio, se existir, ser executado o comando ou bloco de
comandos que se encontra aps o comando else.

18

Professora ANITA LOPES


7.1.1 Estrutura de deciso com um bloco
Sintaxe:
if(condio)
{
bloco
}
onde: condio uma expresso lgica ou relacional.
bloco um conjunto de instrues, separadas por ponto-e-vrgula.
{ e } s sero obrigatrias se tiver mais de uma ao para ser executada.
Se a condio for verdadeira, o bloco executado. Caso contrrio, o bloco no
executado.

7.1.2 Estrutura de deciso com dois blocos


Sintaxe:
if(condio)
{
bloco
}
else
{
bloco
}
onde: condio uma expresso lgica ou relacional.
bloco 1 e bloco 2 so conjuntos de instrues.
Se a condio for verdadeira o bloco 1 executado. Caso contrrio, o bloco 2
executado.
7.1.3 Deciso de mltiplos blocos (if...else if...)
Muitas vezes, nossos programas podero envolver vrias condies excludentes.
Programas que envolvem faixas salariais ou faixas de idades so exemplos clssicos do uso da
instruo if ... else if ... .
Sintaxe: Deciso de mltiplos blocos:

19

Professora ANITA LOPES

onde:condio
1,
lgicas ou relacionais.
instrues.

if(condio 1)
{
bloco 1
}
...
else if(condio N)
{
bloco N
}
else
{
bloco P
}

condio 2, ... so expresses


bloco 1 , bloco 2,... so conjuntos de

Se a condio 1
for verdadeira o bloco 1
executado. Caso contrario, as condies sero avaliadas, sucessivamente at que seja
verdadeira ou chegue ao ltimo else, onde o bloco P seria executado. Observe que
apenas um dos blocos executado.
7.2

Estrutura switch...case

A estrutura switch...case, tambm conhecida como alternativa de mltiplas


escolhas, uma estrutura que simplifica nossos programas no uso de deciso de
mltiplos blocos quando a expresso de controle( a condio) envolver tipos int ou char
(de um caracter que tambm considerada inteira). O resultado desta expresso
comparado ao valor de cada um dos rtulos, e os comandos so executadas a partir
desde rtulo.
Sintaxe:
switch(expresso)
{
case rtulo_1:{
bloco1;
break;}
case rtulo_2:{
bloco2;
break;}
...
case rtulo_n:{
bloco n;
break;}
<default>:{
bloco d;}
}

20

Professora ANITA LOPES


onde: expresso uma expresso inteira ou char de um caracter.
rtulo_1,rtulo_2,...rtulo_n e rtulo_d so constantes inteiras ou char
de um caracter.
bloco 1, bloco 2, ..., bloco n e bloco d so conjuntos de instrues.
Execuo:
A expresso avaliada e o fluxo desviado para o conjunto cujo rtulo igual ao
resultado da expresso. O bloco abaixo do rtulo executado. Se o valor da expresso
no for igual a nenhum rtulo, o bloco do defualt executado. Voc no obrigado a
colocar o rtulo do default e por esta razo ele se encontra entre os sinais de menor e
maior.
Por que usar break?
Normalmente, em outras linguagens de programao, aps a avaliao da expresso
e a execuo do bloco correspondente, o fluxo do programa passa para a pro'xima
instruo, ignorando todos os outros rtulos. Na linguagem C ++ isto no acontece e
poder trazer srias conseqncias em seus programas. O uso do break forar a
sada do comando switch e a execuo do prximo comando.
Existir alguma situao que no ser necessrio usar break?
Sim. Lembre-se do exerccio dos trinios.

8. Estruturas de repetio
Trs so as estruturas de repetio disponveis na linguagem C ++: for, while e do ...
while. Em todas as estruturas estar presente pelo menos uma expresso para
controlar a repetio.
8.1 Estrutura de repetio: for
A estrutura do for a mais simples estrutura de repetio e usada para repetir
um ou vrios comandos tantas vezes quanto desejarmos. a estrutura mais indicada
quando o nmero de repeties for conhecido embora, as outras duas estruturas
tambm possam ser usadas. O controle do nmero de repeties, na maioria das vezes,
feito por uma varivel chamada de varivel contadora.
A estrutura do for na linguagem C++ um pouco diferente das demais linguagens,
pois a condio pode no se prender somente a uma varivel contadora.

21

Professora ANITA LOPES


Sintaxes:
for (inicializao;condio;incremento) declarao;
for (inicializao ;condio ;incremento)
{
bloco de comandos
}
onde: inicializao uma expresso de inicializao da varivel contadora e s
executada uma vez..
condio uma expresso lgica de controle de repetio.
incremento uma expresso de incremento da varivel contadora.
bloco de comandos um conjunto de instrues a ser executado.
8.2 Estrutura de repetio: while
A estrutura while uma estrutura "poderosa" da programao. Muitos
programadores fazem uso somente desta estrutura. Ela testa primeiro a condio e
poder nem executar o bloco caso a condio seja falsa. Logo, a estrutura do while
repete enquanto a condio for verdadeira .
importante que a varivel presente na condio tenha seu valor alterado dentro
da repetio, pois, caso contrrio, entrar em loop.
Normalmente, todos os autores mostram simplesmente a sintaxe da estrutura,
mas esquecem de informar como na prtica ela dever ser escrita.
Abaixo, apresentarei a sintaxe geral e a sintaxe usada na prtica:

Sintaxe

Sintaxe na prtica

while(condio)
{
bloco de comandos
}

atribuio ou leitura da varivel presente na condio


while(condio)
{
bloco de comandos
atribuio ou leitura da varivel presente na condio
}

onde: condio uma expresso lgica ou numrica.


bloco de comandos um conjunto de instrues.

22

Professora ANITA LOPES


8.3

Estrutura de repetio: do...while

Esta estrutura parecida com while. Sua diferena que o bloco executado pelo
menos uma vez, pois testa ao final . Esta estrutura repete enquanto a condio for
verdadeira.
Sintaxe:
do
{
bloco de comandos
}
while(condio);
onde: condio uma expresso lgica ou numrica.
bloco de comandos um conjunto de instrues.

8.4 Comandos associados


As estruturas de repetio podem, mas no devem, sofrer desvios e interrupes
em sua seqncia normal.
8.4.1 break
Assim como o foi usado para interromper o comando switch, poder ser usado com
qualquer um dos trs comandos de repetio.

9 Estruturas
As estruturas em C++ podem ser homogneas e heterogneas. Inicialmente, vamos
abordar as homogneas, pois so mais familiares uma vez que conhecemos seu conceito
da matemtica quando estudamos matrizes.
9.1 Estruturas homogneas
Em C++, o uso de matrizes de fundamental importncia e existe uma relacionamento
estreito entre matrizes e ponteiros que estudaremos mais adiante.
A grande novidade que estudaremos ser o uso de matrizes com estruturas
heterogneas.
As matrizes so tabelas na MP e podem ter uma ou mais dimenso. Quando tem
somente uma dimenso, tambm chamamos de vetor.

23

Professora ANITA LOPES


Na linguagem C++, como j vimos, uma varivel char ,que precisa armazenar mais de um
caracter, faz uso de matriz, pois podemos acessar cada um de seus caracteres em separado,
usando o nome da varivel e sua posio entre colchetes.
Por que ser que na linguagem C++ a posio do primeiro caracter 0 ?
O endereo guardado o do primeiro caracter que chamamos de base, logo qualquer
outro caracter ser acessado pelo endereo base mais sua posio. Se o endereo o da
primeira posio, somente o 0 poderia ser acrescido para permanecer na mesma posio.

Se declararmos pal com tamanho 5, lembre-se de que s podemos usar 4 posies, pois
uma reservada para o finalizador \0 que indica o fim do vetor.
bom voc j ir se acostumando com este conceito de apontamento, pois para se
programar bem em C, precisaremos dominar o conceito de ponteiros.
9.1.1 Declarando uma matriz:
tipo nome do conjunto [ ... ] [ ...] ... ;
Exemplos:
/* declara uma matriz unidimensional de 5 elementos inteiros */
int num[ 5 ];
/* declara uma matriz bidimensional com 100 linhas e 4 colunas do tipo float */
float notas [ 100 ][ 4 ];
/* declara uma matriz bidimensional com 100 linhas e 30 colunas do tipo char */
char nomes [ 100 ][ 30 ];
Toda matriz para guardar nomes, na linguagem C ++, bidimensional, pois o primeiro
ndice indica a quantidade de nomes e o segundo o nmero de caracteres 1 que sero
armazenados em cada nome.
9.1.2 Armazenamento
O armazenamento na matriz poder ser feito atravs de um comando de leitura ou de
atribuio.

24

Professora ANITA LOPES


9.1.2.1 Leitura
/*um dimensao */
...
for(a=0;a<tamanho;a++)
{
cout<<"\n: "<<a+1;
cin>>nomeVetor[a];
}
...
/*duas dimensoes */
...
for(L=0;L<tamanhoLinha;L++)
for(c=0;c<tamanhoColuna;c++)
{
cout<<\nNumero da linha <<L+1<< coluna "<<c+1<<: ;
cin>>nomeMatriz[L][c];
}
...

9.1.2.2 Atribuio
Podemos tambm inicializar as matrizes atravs de atribuies:
Exemplos:
int vet[4]={6,7,8,9};
float nota[3]={8.5,6.2,9.8};
char nome[12]="Joo Renato";
char nomes[4][30]={"JOO", "MARIA", "PEDRO","FILIPE"};
int mat[][3]={1,2,3,4,5,6,7,8,9};
/* na declarao/atribuio acima, assumido 3 como nmero de linhas */
#include <iostream>
using namespace std;
int main()
{int L,c;
int ias_meses[][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,
31,30,31,31,30,31,30,31};
cout<<"\n\nPara anos nao bissextos, primeira linha e para bissextos,
segunda linha\n\n";
for(L=0;L<2;L++)
{ for(c=0;c<12;c++)
cout<<dias_meses[L][c]<<"
";
cout<<"\n\n";
}
system("pause");
}

25

Professora ANITA LOPES

9.1.3 Sada
/*um dimensao MATRIZ COLUNA*/
/*um dimensao MATRIZ LINHA*/
...
...
system(cls);
system(cls);
cout<<\nTitulo\n;
cout<<\nTitulo\n;
for(a=0;a<tamanho;a++)
for(a=0;a<tamanho;a++)
cout<<"\n: "<<nomeVetor;
cout<<nomeVetor <<"\t";
...
...
/*duas dimensoes TODOS OS ELEMENTOS*/
...
system(cls);
cout<<\nTitulo\n;
for(L=0;L<tamanhoLinha;L++)
{ for(c=0;c<tamanhoColuna;c++)
cout<<nomeMatriz[L][c]<<"\t";
cout<<\n;
}
...
/*duas dimensoes ALGUNS ELEMENTOS*/ Condio
...
system(cls);
(L==c)
cout<<\nTitulo\n;
s diagonal Principal
for(L=0;L<tamanhoLinha;L++)
{ for(c=0;c<tamanhoColuna;c++)
(L!=c)
if( condio )
todos
menos
a
diagonal
cout<<nomeMatriz[L][c]<<"\t"; Principal
else
cout<<"\t";
(L<c)
elementos
acima
da
cout<<\n;
diagonal principal
}
...
(L>c) elementos abaixo da
diagonal principal

9.1.4 Matrizes somaLinha e somaColuna


26

Professora ANITA LOPES

9.1.4.1 Matriz somaLinha


uma matriz unidimensional(vetor ou matriz coluna) que ter tantas linhas
quantas forem as linhas da matriz original e cada elemento ser a soma de todos
os elementos da linha correspondente na matriz original. Em outras palavras, cada
elemento soma de todos os elementos das colunas de uma linha.
9.1.4.1.1 Inicializando a matriz somaLinha
Como uma matriz de acumuladores precisa ser inicializada.
for(L=0; L<tamanhoLinha; L++)
somaLinha[L]=0;
9.1.4.1.2 Gerando a matriz somaLinha
for(L=0;L< tamanhoLinha;L++)
for(C=0;C< tamanhoColuna;C++)
somaLinha[L]+=mat[L][C];
9.1.4.1.3 Imprimindo a matriz somaLinha sozinha
for(L=0;L< tamanhoLinha;L++)
cout<<somaLinha[L]<<\n;
cout<<endl;
9.1.4.1.4 Imprimindo a matriz somaLinha com a matriz original
system("cls");
cout<<"\nMatriz Original com matriz SomaLinha\n\n";
for(L=0;L< tamanhoLinha;L++)
{ for(C=0;C< tamanhoColuna;C++)
cout<<matOriginal[L][c]<<"\t";
cout<<somaLinha[x]<<"\n";
}
9.1.4.2 Matriz somaColuna
27

Professora ANITA LOPES


uma matriz unidimensional(vetor ou matriz linha) que ter tantas colunas
quantas forem as colunas da matriz original e cada elemento ser a soma de todos
os elementos da coluna correspondente na matriz original. Em outras palavras,
cada elemento a soma de todos os elementos das linhas de uma coluna.
9.1.4.2.1 Inicializando a matriz somaColuna
Como uma matriz de acumuladores precisa ser inicializada.
for(c=0; c<tamanhoColuna; c++)
somaLinha[c]=0;
9.1.4.2.2 Gerando a matriz somaColuna
for(L=0;L< tamanhoLinha;L++)
for(c=0;c< tamanhoColuna;c++)
somaColuna[c]+=mat[L][c];
9.1.4.2.3 Imprimindo a matriz somaColuna sozinha
for(c=0;L< tamanhoColuna;c++)
cout<<somaColuna[c]<<\t;
cout<<endl;
9.1.4.2.4 Imprimindo a matriz somaColuna com a matriz original
system("cls");
cout<<"\nMatriz Original com matriz SomaColuna\n\n";
for(L=0;L< tamanhoLinha;L++)
{ for(c=0;c< tamanhoColuna;c++)
cout<<matOriginal[L][c]<<"\t";
cout<<"\n";
}
for(c=0;c< tamanhoColuna;c++)
cout<<somaColuna[c]<<"\t";
cout<<"\n";

9.1.5 Operaes
28

Professora ANITA LOPES


Em relao s matrizes numricas, podemos realizar todas as operaes que j
conhecemos com matrizes: produto escalar, soma, subtrao, multiplicao por escalar,
multiplicao de matrizes, clculo do determinante, etc.

9.1.6 Ordenao
Vrios so os mtodos de ordenao. Alguns so mais eficientes e mais complicados e
outros menos eficientes para um grande conjunto de dados, porm mais simples.
Para que possamos ordenar nomes, precisaremos conhecer duas funes que fazem
parte da biblioteca string.h:
Funo strcmp
Esta funo tem dois argumentos do tipo vetor de char(ou cadeia de caracteres).
Os argumentos so comparados e devolvido um dos resultados:
strcmp(arg1,arg2)
0
se os dois argumentos forem iguais.
nmero > 0 - se o primeiro argumento vier na ordem alfabtica depois do segundo.
nmero < 0 - se o primeiro argumento vier na ordem alfabtica antes do segundo.
Observao: Voc deve estar estranhando a necessidade desta funo, mas na
linguagem C++, como j falamos a varivel vetor de char um endereo, e no tem
sentido comparamos endereos. , portanto, expressamente proibido usar operadores
relacionais para comparar este tipo de varivel.
Funo strcpy
Esta funo tem dois argumentos: o primeiro o destino e o segundo, a origem. Copia
a origem no destino.
strcpy(arg1,arg2);
Observao: , portanto, expressamente proibido usar comando de atribuio este
tipo de varivel.
1: Ordenao por Insero
Ordena a matriz somente quando realmente for necessrio.
for( L = 1 ; L < tamanho; L++)
{ tmp= nomeVetor[L];
for (c = L; c >0 && tmp < nomeVetor[c-1]; c--)
nomeVetor[c] = nomeVetor[c-1] ;
nomeVetor[c] = tmp ;
}
29

Professora ANITA LOPES


2: Ordenao por Seleo
Localiza qual elemento deve ficar na posio 0, na posio 1, etc.
for(L=0;L<tamanho -1;L++)
{ tmp=L;
for(c=L+1;c<tamanho;c++)
if(vet[tmp]> vet[c])
tmp=c;
aux= vet[tmp]; vet[tmp]= vet[L];
}
3: Ordenao Bubble Sort
Comeando da base para o topo.
for( L = 0 ; L < tamanho -1; L++)
for (c = tamanho -1; c > L; c--)
if(nomeVetor[c-1]> nomeVetor[c])
{aux = nomeVetor[c];
nomeVetor[c] = nomeVetor[c-1];
nomeVetor[c-1] = aux;
}

Bubble Sort

vet[L]=aux;

Comeando do topo para base.


for( L = 0 ; L < tamanho -1; L++)
for (c = L+1; c < tamanho; c++)
if(nomeVetor [L]> nomeVetor [c])
{aux = nomeVetor[L];
nomeVetor[L] = nomeVetor[c];
nomeVetor[c] = aux;
}

Comparando os trs mtodos


Insero
Seleo
Duas vezes mais comparaes e o Mesmo nnero de comparaes e
mesmo nmero de movimentos.
tamanho vezes mais movimentos.

Mtodos de ordenao mais eficientes


4: Ordenao Merge Sort
Une metades de vetores em um vetor ordenado.
tam = 1; //intercala subvetores de tamanho 1
while (tam < tamanho )
{
a1 = k = 0;
while ((a1 + tam) < tamanho )
{
a2 = a1 + tam;
u1 = a2 - 1;
u2 = (a2+tam-1 < tamanho) ? a2+tam-1 : tamanho-1;
for(i = a1, j = a2; i <= u1 && j <= u2; k++)
if (nomeVetor[i] <= nomeVetor[j]) aux[k] = nomeVetor[i++];
else aux[k] = nomeVetor[j++];
for( ; i <= u1; k++) aux[k] = nomeVetor[i++];
for( ; j <= u2; k++) aux[k] = nomeVetor[j++];
a1 = u2+1;
}
//copia o restante de x em aux
for(i = a1; k < tamanho; i++) aux[k++] = nomeVetor[i];
//copia aux em x
for(i = 0; i < tamanho; i++) nomeVetor[i] = aux[i];
30

Professora ANITA LOPES


}

tam *= 2;

5: Ordenao Quick Sort


Divide o vetor em duas partes: uma contem valores menores ou iguais a uma chave e a
outra, valores maiores.
void particiona(int x[], int inicio, int fim, int *pj)
{
int a, temp, i, f;
a = x[inicio];
f = fim;
i = inicio;
while ( i < f )
{
while ( x[i] <= a && i < fim ) i++;
while ( x[f] > a ) f--;
if ( i < f )
{ temp = x[i];
x[i] = x[f];
x[f] = temp;
}
}
x[inicio] = x[f];
x[f] = a;
*pj = f;
}
void quicksort(int x[], int inicio, int fim)
{
int j;
if (inicio >= fim ) return;
particiona(x, inicio,fim,&j);
quicksort(x, inicio,j-1);
quicksort(x,j+1, fim);
}

9.1.4 Pesquisa
9.1.4.1 Seqencial
Este mtodo o mais simples, pois comea no primeiro elemento s para quando
encontra ou chega ao final.
cout<<"\nQual ... a ser procurado(a)? ";
cin>>nomeProcura;
achou=0;
for(L=0;L<5 && achou==0;L++)
{ if(n_mat==mat[L])
{
achou=1;
pos=L;
}
31

Professora ANITA LOPES


}
if(achou==1)
cout<<"\n... achado(a) na posicao: "<<pos+1<<endl;
else
cout<<"\n... nao achado(a)\n";
9.1.4.2 Binria
Este mtodo ser mais eficiente se o conjunto estiver ordenado.
Baseia-se em reduzir o espao a ser pesquisado.
1. Inicialmente, aponta-se para o centro da tabela. Como se faz isto?
Suponha um vetor de 8 elementos:
centro = (0 + 7) /2; /* valor 3 */
2. Depois, perguntamos se o elemento pesquisado igual ao que est sendo apontado.
Se no for, continua-se com a pesquisa.
3. Se continuarmos com a pesquisa, verificamos se o elemento pesquisado
maior(menor) do o que est sendo apontado.
4. Se for, calculamos o novo centro:
centro = (posio do apontador +1 +7) /2;
Se no for:
centro = (0 + posio do apontador -1) /2;
5. E assim, sucessivamente at acharmos, ou no.
#include <iostream>
#define N 5
using namespace std;
int main()
{ int L,c,inicio,fim,meio,vet[N],aux,procura;
for(L=0;L<N;L++)
{ cout<<"\nDigite "<<L+1<<"o elemento: ";
cin>>vet[L];
}
/*ORDENA*/
for(L=0;L<N-1;L++)
for(c=L;c<N ;c++)
if(vet[L]>vet[c])
{aux=vet[L];
vet[L]=vet[c];
vet[c]=aux;
}
cout<<"\n\n\nVETOR ORDENADO\n\n";
for(L=0;L<N;L++)
cout<<"\n"<<vet[L];
32

Professora ANITA LOPES


/*PESQUISA BINARIA*/
cout<<"\nDigite ... a ser procurado(a) ou 0 para terminar: ";
cin>>procura;
while(procura!=0)
{ inicio=0;fim=N-1;
do
{ meio=(inicio+fim)/2;
if(vet[meio]<procura)
inicio=meio+1;
else
fim=meio-1;
}
while((inicio<=fim) && (vet[meio]!=procura));
if(vet[meio]==procura)
cout<<"\n... encontrado(a) na posicao: "<<meio+1<<endl;
else
cout<<"\n... nao encontrado\n";
cout<<"\nDigite ... a ser procurado(a) ou 0 para terminar: ";
cin>>procura;

system("pause");
}

9.2 Estrutura heterognea (struct)


Uma estrutura(struct) , na verdade, um conjunto de variveis que podem ter tipos
diferentes.
Suponha que voc deseje armazenar nome, e duas notas de um aluno. Se voc usar
variveis simples, precisar declarar trs variveis simples e, para que fiquem claras que
existe uma relao entre elas, precisamos nome-las de uma forma que nos faa entender que
elas se relacionam. Usando struct fica mais claro o relacionamento entre elas.
Suponha tambm que voc deseje armazenar nome, e duas notas de trs alunos. Se
voc usar matrizes, precisar declarar uma matriz para guardar os nomes e uma matriz
bidimensional para guardar as notas(pode ser tambm duas matrizes unidmensionais). Se voc
usar uma matriz de struct, ser necessria somente uma matriz.
As variveis de um struct so chamadas de campos ou membros.
Normalmente, costumamos associar um nome estrutura para que possamos definir
novos tipos.
9.2.1 Declarando um struct
sintaxe 1
struct
{ tipo da varivel 1 nome da varivel 1;
33

Professora ANITA LOPES


tipo da varivel 2 nome da varivel 2;
tipo da varivel n nome da varivel n;
}nome do struct1, nome do struct2;

sintaxe 2
struct nome da estrutura
{ tipo da varivel 1 nome da varivel 1;
tipo da varivel 2 nome da varivel 2;
tipo da varivel n nome da varivel n;
};
struct nome da estrutura nome do struct1, nome do struct2;
/* ao fazermos esta declarao, dizemos que os dois structs
so do tipo nome da estrutura*/

9.2.2 fazendo referncia a um membro um struct


nome do struct. nome do membro

-> struct simples

Exemplos:
cin>>dados.idade;
cout<<\n<<dados.idade;
nome do struct[posio]. nome do membro -> matriz de struct
Exemplos:
cin>>cad[3].idade;
cout<<\n<<cad[3].idade;
Exemplo 1:
Guardar nome e duas notas de um aluno e imprimir a mdia e o nome.
#include <iostream>
using namespace std;
int main()
{
struct
{ char nome[30];
float nota1,nota2;
}aluno;
cout<<"\nNome : "; cin.getline(aluno.nome,29);
cout<<"\nNota 1: "; cin>>aluno.nota1;
cout<<"\nNota 2: "; cin>>aluno.nota2;
cout<<"\nMedia: "<<(aluno.nota1+aluno.nota2)/2;
cout<<"\t"<<aluno.nome<<"\n";
system("pause");
}

34

Professora ANITA LOPES

Exemplo 2:
Guardar nome e duas notas de trs alunos e imprimir a mdia e o nome.
#include <iostream>
using namespace std;
int main()
{ int a;
struct Cadastro
{ char nome[30];
float nota1,nota2;
}aluno[3];
for(a=0;a<3;a++)
{ cout<<"\nNome : ";cin.getline(aluno[a].nome,29);
cout<<"\nNota 1: "; cin>>aluno[a].nota1;
cout<<"\nNota 2: "; cin>>aluno[a].nota2;
cin.get();
}
system("cls");
cout<<"\n\nMedia\tNome\n\n";
for(a=0;a<3;a++)
{ cout<<"\n"<<(aluno[a].nota1+aluno[a].nota2)/2<<"\t";
cout<<aluno[a].nome<<"\n";
}
system("pause");
}

35

Professora ANITA LOPES


Observao: Nos exemplos abaixo, voc ver uma das maiores vantagens de se usar uma
matriz de struct, pois quando precisarmos ordenar, no teremos que fazer muitos
trechos de troca. A grande vantagem que podemos trocar de lugar todo o struct.
Observe que foi criada uma estrutura de nome aux para poder fazer a troca.
Exemplo 3: Faa um programa usando matriz de estruturas para armazenar matricula,
trs nota e a mdia de 5 alunos. Calcule a mdia(as duas maiores notas). Ordene pela
matrcula e liste.
#include <iostream>
using namespace std;
int main()
{int op,L,c,x;
struct reg
{int mat;
float av1,av2,av3,m;
}aluno[5],aux;
for(x=0;x<5;x++)
{cout<<"\nMatricula: "; cin>>aluno[x].mat;
cout<<"\nAV1: "; cin>>aluno[x].av1;
cout<<"\nAV2: "; cin>>aluno[x].av2;
cout<<"\nAV3: "; cin>>aluno[x].av3;
}
//Calcula media
for(x=0;x<5;x++)
{ if(aluno[x].av1< aluno[x].av2 && aluno[x].av1< aluno[x].av3)
aluno[x].m=(aluno[x].av2+ aluno[x].av3)/2;
else if(aluno[x].av2< aluno[x].av3)
aluno[x].m=(aluno[x].av1+ aluno[x].av3)/2;
else
aluno[x].m=(aluno[x].av1+ aluno[x].av2)/2;
}
// Ordena pela matricula
for(L=0;L<4;L++)
for(c=L+1;c<5;c++)
if(aluno[L].mat>aluno[c].mat)
{aux=aluno[L];aluno[L]= aluno[c]; aluno[c]=aux;}
system("cls");
cout<<"\nMat\tAV1\tAV2\tAV3\tMedia\n";
for(x=0;x<5;x++)
cout<<"\n"<<aluno[x].mat<<"\t"<< aluno[x].av1<<"\t"<<
aluno[x].av2<<"\t"<< aluno[x].av3<<"\t"<< aluno[x].m;
cout<<"\n\n";
system("pause");
}

36

Professora ANITA LOPES

9.2.3 Declarando ou definindo

A principal diferena que quando se declara, no se aloca espao na MP e quando se


define, sim.

9.2.4 Embutindo a definio na declarao


Veja exemplo abaixo:
struct Notas
{float n1,n2,media;}
struct
{ char nome[3];
struct notas notasAluno;
}Auno;

Observao: No primeiro, estamos associando uma etiqueta(nome) ao struct: Notas.


Estamos definindo um novo tipo de dado.
No segundo, estamos declarando um struct de nome Aluno que tem embutindo uma
definio na declarao.
Quando precisarmos nos referenciar varivel n1, por exemplo:
.... Aluno.notasAluno.n1

37

Professora ANITA LOPES


10 Funes
10.1 Conceito
Funo um trecho de programa com atribuies especficas, simplificando o
entendimento do programa, proporcionando ao programa menores chances de erro e de
complexidade.
A linguagem C++ formada de vrias funes.

10.2 Vantagens
As funes atravs da passagem de parmetros e atravs do seu nome permitem que
sejam retornados valores rotina chamadora e desta forma, esses valores podero ser
impressos, atribudos a uma varivel ou podem servir em operaes aritmticas entre
outras.
Os principais objetivos de uma funo so:
Dividir e estruturar um algoritmo em partes logicamente coerentes;
Facilidade em testar os trechos em separados;
O programador poder criar sua prpria biblioteca de funes, tornando sua
programao mais eficiente uma vez que poder fazer uso de funes por ele escritas em
vrios outros programas com a vantagem de j terem sido testadas;
Maior aumentar a legibilidade de um programa;
Evitar que uma certa seqncia de comandos necessria em vrios locais de um
programa tenha que ser escrita repetidamente nestes locais, diminuindo tambm, o cdigo
fonte, ;
Tudo isto justifica o uso de funes em nossos programas

10.3. Funes Pr-definidas


O conjunto de funes pr-definidas muito extenso e aqui vamos estudar algumas
funes das bibliotecas: cmath, cstring.
Quando estudamos uma funo, temos vrios parmetros a observar. Veja, por exemplo
a seguinte funo pr-definida da biblioteca cmath:
double sqrt(double x)
Este o prottipo da funo, isto , informaes sobre o tipo de retorno da funo e
tipos dos parmetros.
Esta funo retorna um valor double, seu nome sqrt e o tipo da varivel que recebe o
valor passado double.
38

Professora ANITA LOPES


Quando voc criar suas funes, elas precisaro ter uma declarao semelhante a esta.
As funes podero ser localizadas antes da funo principal(main) ou depois. Se uma
funo for declarada antes, o prottipo da funo no precisar ser declarado na funo
main, mas se declarada depois, o prottipo precisar ser declarado na funo main.
Declarao de uma funo:
tipo
int, float, char, void

identificador
Nome da funo

(lista de parmetros)
( tipo1 nome1, tipo2 nome2 )

Exemplos:
int quadrado(int l)
char maiuscula(char n[] )

10.3.1 Funes Numricas


Biblioteca: cmath
#include <iostream>
#include <cmath>
#define PI 3.14159265
using namespace std;
int main()
{ float f;
cout<<"\nFUNCOES NUMERICAS\n";
cout<<"\nDigite numero real: ";
cin>>f;
cout<<"\nNumero: "<<f;
cout<<"\nABSOLUTO: "<<fabs(f);
cout<<"\nCEIL: "<<ceil(f);
cout<<"\nFLOOR: "<<floor(f);
cout<<"\nTRUNC: "<<trunc(f);
cout<<"\nROUND: "<<lround(f);
cout<<"\nFMOD: "<<fmod(f,3);
cout<<"\nSQRT: "<<sqrt(f+0.5);
cout<<"\nSeno de 30: "<<sin(30*PI/180);
cout<<"\nCo-seno de 30: "<<cos(30*PI/180);
cout<<"\nTangente de 30: "<<tan(30*PI/180);
cout<<"\nPotencia de 2 elevado a 3: "<<pow(2.0,3);
cout<<"\nLogaritmo de 8 na base neperiana: "<<log(8.0);
cout<<"\nLogaritmo de 8 na base 10: "<<log10(8.0);
cout<<"\nLogaritmo 8 na base 2: "<<log(8.0)/log(2.0);
cout<<"\nRaiz cubica de 8: "<< pow(8,1.0/3);
cout<<"\n\n";
system("pause");

39

Professora ANITA LOPES

10.3.2 Funes Strings


Biblioteca: cstring/cctype
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{char c,s1[40],s2[30];
cout<<"\nBIBLIOTECA cctype\n";
cout<<"\nLetra: ";
cin>>c;cin.get();
c=toupper(c);
cout<<"Convertida para maiuscula: "<<c;
c=tolower(c);
cout<<"\nConvertida para minuscula: "<<c;
cout<<"\n\nBIBLIOTECA cstring\n";
cout<<"\nDigite palavra: "; cin.getline(s1,29);
strcat(s1,"FIM");
cout<<"\nConcatenacao com FIM: "<<s1;
cout<<"\nDigite palavra: "; cin.getline(s2,29);
strcpy(s1,s2);
cout<<"\nApos copia de toda palavra2: "<<s1;
cout<<"\nTamanho de s2: "<<strlen(s2);
cout<<"\n\nComparando strings\n";
cout<<"Digite PAZ: "; cin.getline(s1,29);
cout<<"Digite PAZ: "; cin.getline(s2,29);
if(strcmp(s1,s2)==0)
cout<<"\nIGUAIS";
else
cout<<"\nDiferentes";
cout<<"\nDigite PAZ: "; cin.getline(s1,29);
cout<<"Digite AMOR: "; cin.getline(s2,29);
if(strcmp(s1,s2)!=0)
40

Professora ANITA LOPES


cout<<"\nDIFERENTES";
else
cout<<"\nIguais";
cout<<"\n";system("pause");

10.4. Diretiva #define


Define um identificador e um contedo que ir ser substitudo toda vez que o
identificador aparecer em um programa.
Esta diretiva pode ser associada a uma string ou a uma macro semelhante a uma
funo.
Se o tamanho da macro for pequena, substitui com vantagens o uso de funes.
Exemplo 1:
#include <iostream>
#define quadrado(x) ((x)*(x))
#define pi (3.14159265)
#define NP (2.71828182846)
#define conv(x) ((x)*(pi)/(180))
...
Exemplo 2:
#include <iostream>
#define AREA(b,h) (b*h)

Exemplo 3:
41

Professora ANITA LOPES


#include <iostream>
#define HIPO(c1,c2) (sqrt(c1*c1+c2*c2))

10.5 Chamada da funo


No devemos ficar preocupados como isso ir acontecer, pois j fizemos uso de vrios
funes internas(funes do tradutor) e, da mesma forma, chamaremos as funes feitas por
ns.
Quando uma funo chamada, o fluxo de controle desviado para a funo, no
momento em que ela ativada no algoritmo principal. Ao terminar a execuo dos comandos
da funo, o fluxo de controle retorna ao comando seguinte quele onde ela foi ativada,
exatamente como na figura abaixo:
main()

funcao1( ...)

{...

{ ...

...
< chamada da funo 1 >
...

main()
}
{...

retorna(...);

funcao1( ...)
{ ...
retorna(...);

...
}

...

< chamada da funo 1 >

...
...
}

10.6 Estrutura de uma funo


Uma funo um bloco contendo incio e fim, sendo identificada por um nome , pelo
qual ser referenciada em qualquer parte e em qualquer momento do programa. A funo
serve para executar tarefas menores como ler, calcular, determinar o maior/menor valor
entre uma lista de valores, ordenar, converter para maisculas, entre outras.
Aps executar estas tarefas menores, a funo retorna, ou no, um determinado valor
para a funo chamadora.

42

Professora ANITA LOPES


Quando a funo no retornar nada(nulo) usaremos o tipo void, pois sugerido pelo
comit de padronizao ANSI.
Dentro da funo, podem ser declaradas variveis que chamamos de variveis
locais, pois s so visveis dentro da funo.
Sintaxe da funo:
<tipo de funo> nome_da_funo (declaraes dos parmetros)
{
declarao das variveis locais
comandos que formam o corpo da funcao
return( valor ) ; /* ou return; ou nada */
}
tipo de funo
nome da funo
parmetros
declaraes dos parmetros
{
variveis locais
corpo da funo
return( .. )
}

: tipo de dado que a funo dar retorno. Pode ser int,


float, char ou void
: segue as mesmas regras de declarao de variveis
: nomes das variveis, seguem as mesmas regras de
declarao de variveis
: declaraes de variveis da funo(tipo e nome)
: incio da funo
: declaraes de variveis que sero utilizadas dentro da
funo( tipo e nome)
: seqncia de comandos
: o que vai ser retornado para o algoritmo ou no existe
: fim da funo

10.7. Localizao das funes


Podem ser colocadas antes ou depois da main. Se for depois da main, os prottipos
precisam ser colocados na funo principal(main).
main()
{ prottipo da funcao1; prottipo da funcao2; prottipo da funcao3;
...
}
funcao1(...)
{...
}
funcao2(...)
43

Professora ANITA LOPES


{...
}
funcao3(...)
{...
}
10.8. Dividindo o programa em funes
Ns podemos modularizar nossos programas para que possamos deix-lo mais claro. Se
as funes manipulam as mesmas variveis, deveremos declar-las com variveis globais, isto
, fora de todas as funes.

10.9 Tipos de Funes


10.9.1 Funes void ( no retornam nada)
Este tipo de funo no tem nenhum dado de retorno para a funo principal. Ela
executa o trecho e retorna para a funo seguinte da sua chamada. A funo pode no ter
parmetros e ser do tipo void, tambm.
Exemplo:
#include <iostream>
using namespace std;
int main()
{void linha();/*prototipo da funo(tipo de retorno, nome e (argumentos)
*/
cout<<"\nUNESA\n";
linha();
cout<<"\nAlgoritmos e Estruturas de Dados\n";
linha();
cout<<"\nPolitecnico e SI\n";
linha();
cout<<"\nPROF. ANITA LOPES\n";
linha();
cout<<"\n";
system("pause");
}
void linha()
{int a;
for(a=1;a<=50;a++)
cout<<"*";
}

10.9.2 Funes com passagem de valor

44

Professora ANITA LOPES


A linguagem C++ passa os valores para funes atravs de argumentos das chamadas das
funes para os parmetros das funes, na verdade variveis que recebero cpias dos
dados. Desta maneira, os dados de origem no so alterados.
Uma boa dica: Suponha que voc comprou um livro e descobriu alguns erros. Voc
corrige no seu livro, mas no altera o original que, enquanto o autor no corrigir, os erros
permanecero.
Exemplo 1: Funo linha com nmero variado de asteriscos
#include <iostream>
using namespace std;
int main()
{void linha(int x);
cout<<"\nUNESA\n";
linha(5);
cout<<"\nAlgoritmos e Estruturas de Dados\n";
linha(32);
cout<<"\nPolitecnico e SI\n";
linha(16);
cout<<"\nPROF. ANITA LOPES\n";
linha(17);
cout<<"\n";
system("pause");
}
void linha(int x)
{int a;
for(a=1;a<=x;a++)
cout<<"*";
}
Exemplo 2: Funo linha com nmero variado de qualquer caracter
#include <iostream>
using namespace std;
void linha(int x,char c)
{int a;
for(a=1;a<=x;a++)
cout<<c;
}
int main()
{
cout<<"\nUNESA\n";
linha(5,'#');
cout<<"\nAlgoritmos e Estruturas de Dados\n";
linha(32,'*');
cout<<"\nPolitecnico e SI\n";
linha(16,'@');
cout<<"\nPROF. ANITA LOPES\n";
linha(17,'=');
cout<<"\n";
system("pause");
45

Professora ANITA LOPES


}
Exemplo 3: funo PA.
void PA(int x,int y,int z)
{int c;
for(c=1;c<=z;c++)
{cout<< x<<\t;
x+=y;
}
}
Exemplo 4: Funo RAIZ.
float RAIZ(float rad,int ind)
{ return pow(rad,1.0/ind);}

10.9.2.1 Funes recursivas


As funes recursivas, embora mais elegantes que as funes normais, so muito mais
lentas e, muitas vezes de difcil compreenso.
"Quando uma funo chama a si prpria, as novas variveis locais e os argumentos so
alocados na pilha, e o cdigo da funo executado com esses novos valores a partir do incio.
Uma chamada recursiva no faz uma nova cpia da funo. Somente os argumentos e as
variveis so novos. Quando cada chamada recursiva retorna, as antigas variveis locais e os
parmetros so removidos da pilha e a execuo recomea no ponto de chamada da funo
dentro da funo dentro da funo. Tendo em vista que o local para os argumentos de funes
e para as variveis locais a pilha e que a cada nova chamada criado uma cpia destas
variveis na pilha, possvel ocorrer overflow da pilha (stack overflow) e o programa
trancar."( FERNANDO CSAR COMPARSI DE CASTRO)
Exemplo 1: Conta algarismos de um nmero.
int contaAlgarismos(int a)
{if(a==0)
return a;
else
return 1+ contaAlgarismos (a/10);
}
Exemplo 2:. Soma algarismos de um nmero.
int somaAlgarismos(int a)
{
if(a==0)
return(a);
if(a>0)
return(a%10+somaAlgarismos(a/10));

}
Exemplo 3:. Multiplica dois nmeros.
int mult(int m1,int m2)
{int m;
46

Professora ANITA LOPES


if(m1==0)
return m1;
else
return m2+mult(m1-1,m2);

}
Exemplo 4: Soma os pares em um intervalo de 1 at n-1.
int somaPares(int n)
{
if(n==0)
return(n);
else
if(n%2==0)
return n+somaPares(n-1);
else
return somaPares(n-1);
}
Exemplo 5: Potncia de 10.
int pot10(int pot)
{
if(pot==0)
return(1);
if(pot>0)
return(10*pot10(pot-1));
}
Exemplo 6: Fatorial de um nmero.
int fat(long int m1)
{ if(m1==0)
return 1;
else
return m1*fat(m1-1);
}

10.9.3 Funes com passagem por referncia


Para melhor compreenso deste item, precisaremos estudar PONTEIROS.
Ns j trabalhamos com ponteiros embora, claramente no tenhamos usado esta
nomenclatura.
Continuando o estudo de matrizes, tomamos conhecimento que ao declaramos uma
matriz, era feita uma alocao na MP para todos os elementos da matriz de forma contgua,
porm s era guardado o primeiro endereo do primeiro elemento da matriz .
Suponha a declarao: int vet[5]; e a tabela criada durante a execuo do programa:
Nome da matriz
vet

Tipo da matriz
int

Endereo
60000
47

Professora ANITA LOPES


No se lembrou ainda?
Ento mais uma recordada: quando fazemos referncia a um elemento da matriz,
usamos o nome da matriz e, entre pares de colchetes, a posio do elemento dentro da matriz.
Tomemos como exemplo a declarao int vet[5]; :
vet[0]
vet[1]
vet[2]
vet[3]
vet[4]
lixo
lixo
lixo
lixo
lixo
60000

60001

60002

60003

60004

60005

60006

60007

60008

60009

60010

60011

60012

60013

60014

60015

60016

60017

60018

60019

Ento podemos concluir que o ndice um deslocamento do endereo bsico (no


exemplo, 60000) para chegarmos a outro elemento da matriz.
Sendo int uma varivel de tamanho de 4 bytes, chegamos a seguinte frmula para o
deslocamento:
ndice * 4 + endereo bsico
Exemplo: deslocando para o terceiro elemento: 2*4+60000=60008
Exemplo 1: Funo maiuscula
char maiuscula(char n[])
{int c;

for(c=0;c<strlen(n);c++)
n[c]=toupper(n[c]);

}
Exemplo 2: Funo Troca
char troca1(char x[], char y[])
{ char aux[30];
strcpy(aux,x);
strcpy(x,y);
strcpy(y,aux);
}
Exemplo 3: Funo ordena vetor
void ordena(int v[],int t)
{ int c,l,aux;
for(c=0;c<t-1;c++)
for(l=c+1;l<t;l++)
if(v[c]<v[l])
{aux=v[c];v[c]=v[l];v[l]=aux;}
}

48

Professora ANITA LOPES


11 PONTEIROS
11.1 Consideraes
A MP consiste de milhes de posies para armazenamento de dados, SO, programas,
etc.

O tamanho da MP depende da capacidade instalada em seu computador.


Ns j vimos que, ao declaramos uma varivel, o "nome" dado associado a uma posio
de memria (endereo) e quanto cada tipo de varivel ocupa na MP. A varivel do tipo struct
ocupa o somatrio das variveis que a compe.
O ponteiro uma varivel que contem o endereo de outra varivel.
O uso de ponteiros nos d uma grande flexibilidade em programao, pois
determinadas rotinas em outras linguagens s podem ser feitas em assembly.
Uma boa dica para entender como funciona a varivel ponteiro: voc viu no jornal um
anncio de uma loja que vende notebook muito facilitado para alunos que esto cursando
Engenharia ou Informtica. Ao ligar para a loja, voc pede o endereo e anota na sua
agenda. Voc vai at loja(na linguagem C, &loja) para verificar as condies de
pagamento e at dar uma "pechinchada"(na linguagem C, *loja) porque quem sabe voc,
com muita choradeira consegue um bom desconto.
A varivel ponteiro precisa ser declarada como qualquer outra varivel.
Como se declara?
tipo *nome da vrivel ponteiro ;

O que significa tipo para uma varivel ponteiro?


Quando declaramos uma varivel ponteiro, precisamos informar o tipo de varivel que
ser apontada pelo ponteiro.
Quando usamos o operador & antes de uma varivel?
Quando precisarmos informar varivel ponteiro que ela armazenar o endereo de
outra varivel. Neste momento, estaremos incializando a varivel ponteiro.
Lembre-se de que sempre precisamos inicializar uma varivel ponteiro.
11.2 Atribuio de ponteiros
Exemplo:
.
int x,*px;
px=&x;
.

49

Professora ANITA LOPES


Quando usamos o operador * antes da varivel ponteiro?
Quando desejarmos o contedo do endereo apontado pela varivel ponteiro.
#include <iostream>
using namespace std;
int main()
{int a,b;
int *pa,*pb;
struct reg
{int mat;
float av1,av2,av3;
}aluno;
int n[4];
aluno.mat=11;
aluno.av1=8;aluno.av2=9;aluno.av3=10;
cout <<"\nEndereco do vetor n: "<<&n<<endl;
cout
<<"\nEndereco
de
n0:
"<<&n[0]<<"\tEndereco
de
n1:
"<<&n[1]<<"\n\n";
cout
<<"\nEndereco
de
n2:
"<<&n[2]<<"\tEndereco
de
n3:
"<<&n[3]<<"\n\n";
cout <<"\nEndereco
de mat: "<<&aluno.mat<<"\tEndereco de av1:
"<<&aluno.av1<<"\n\n";
cout <<"\nEndereco
de av2: "<<&aluno.av2<<"\tEndereco de av3:
"<<&aluno.av3<<"\n\n";
cout <<"\nEndereco de pb: "<<&pb<<"\tEndereco de pa: "<<&pa<<endl;
cout <<"\nEndereco de b: "<<&b<<"\tEndereco de a: "<<&a<<"\n\n";
a=23; b=52;
pa=&a; pb=&b;
cout <<"\nConteudo de a: "<< a<<"\t\tConteudo de b: "<<b<<endl;
cout <<"\nConteudo de pa: "<<pa<<"\tConteudo de pb: "<<pb<<endl;
cout<<*pa<<"\t\t"<<*pb<<endl;
system("pause");
}
11.4 Ponteiros e Matrizes
A relao entre ponteiros e matrizes muita intensa como j falamos anteriormente e,
por esta razo, vamos reescrever um programa j visto:
LEIA COM ATENO AS CONSIDERAES ABAIXO E ANALISE O PROGRAMA
Consideraes:
1. ps=s; ps foi associado ao endereo do primeiro elemento do vetor s(Relembrando
que ao usarmos o nome do vetor sem ndice estamos na verdade fornecendo o endereo do
comeo do vetor).
2. ps+l como j foi dito, voc pode somar ou subtrair inteiros. Neste caso, o contedo
da varivel l, ser o incremento do ponteiro.
*( ps + l) o contedo da varivel l ser somado ao endereo bsico apontado por ps. A
expresso *( ps + l) representa o contedo do endereo. Como ps um apontador para int, o
ponteiro incrementado de 4 bytes, isto , embora ps seja incrementado de 1, em verdade,
cada 1, equivale a 4.

50

Professora ANITA LOPES


#include <iostream>
using namespace std;
int main()
{int s[5],l,*ps;
ps=s;
for(l=0;l<5;l++)
{cout<<"\ndigite "<<l+1<<"o numero: ";
cin>>*(ps+l);
}
system("cls");
cout<<"\n\n\nVETOR\n\n";
for(l=0;l<5;l++)
cout<<*(ps+l)<<endl;;
system("pause");
}
LEIA COM ATENO AS CONSIDERAES ABAIXO
Consideraes:
1. p=&mat[0][0]; p foi associado ao endereo do primeiro elemento da primeira linha
da matriz mat.
2. (p+2*l+c)); como cada vez que o ponteiro incrementado ele desloca tantas
posies quanto for o tamanho da varivel que ele aponta, para se chegar ao endereo de um
elemento da matriz, usamos a seguinte frmula:
nmero de colunas da matriz * nmero da linha desejada + nmero da coluna na linha

3. *(p+2*l+c) o contedo da varivel l multiplicado por 2(nmero de colunas da


matriz), somado com c(nmero da coluna desejada na linha) e somado ao endereo bsico
apontado por p A expresso *(p+2*l+c) representa o contedo do endereo.
#include <iostream>
using namespace std;
int main()
{int mat[3][2],L,c,*p;
p=&mat[0][0];
for(L=0;L<3;L++)
for(c=0;c<2;c++)
{ cout<<"\ndigite elemento "<<L+1<<","<<c+1<<": ";
cin>>*(p+2*L+c);
}
system("cls");
cout<<"\n\n\nMATRIZ\n\n";
for(L=0;L<3;L++)
{ for(c=0;c<2;c++)
cout<<*(p+2*L+c)<<"\t";
cout<<"\n";
}
system("pause");
}

51

Professora ANITA LOPES


Exemplo: Observe a soluo abaixo para matrizes bidimensionais:
#include <stdio.h>
main()
{int mat[3][2],l,c;
for(l=0;l<3;l++)
for(c=0;c<2;c++)
{ printf("\ndigite elemento %d-%d: ", l+1,c+1);
scanf("%d",*(mat+l)+c);
}
printf("\n\n\nMATRIZ\n\n");
for(l=0;l<3;l++)
{ for(c=0;c<2;c++)
printf("%d\t",*(*(mat+l)+c));
printf("\n");
}
printf("\n\n");
}
Vamos explicar melhor a expresso em negrito: *(*(mat+l)+c), supondo L=1 e c=1:
1. *(mat+1 ) +1)
mat[0][0]
lixo
60000

...

mat[0][1]
lixo

6003

60004

1 linha

...

6007

mat[1][0]
lixo
60008

...

mat[1][1]
lixo

60011

60012

2 linha

...

60015

mat[2][0]
lixo
60016

...

mat[2][1]
lixo

60019

60020

...

60023

3 linha

Deslocamento entre linhas:


a) mat um array de 3 por 2 e convertida para um endereo para a 1 a linha- 60000.
b) mat + 1 um endereo para a 2 a linha, iniciando em 60008- (equivale: 60000 +
2(colunas) * 1(deslocamento) * 4(bytes)).
Deslocamento entre colunas de uma linha:
c) *(mat +1) convertida para um endereo para o primeiro inteiro da 2 a linha (comea
em 60008 e termina em 60011).
d) *(mat +1) + 1 um endereo para o segundo inteiro da 2 a linha (comea em 60012
e termina em 60015, pois 60008 + 4(bytes) igual 60012).
e) *( *(mat +1) + 1 ) - o segundo inteiro da 2a linha.
Observao: A aritmtica de ponteiros(uso do * ), na maioria da vezes, mais
rpida e eficiente em se tratando de um acesso seqencial do que a indexao de
matrizes, porm no devemos achar que nunca mais usaremos a indexao porque a
aritmtica de ponteiros pode ser to complexa e confusa que,s vezes, mais fcil
codificar usando a indexao, principalmente se for usada randomicamente.
VIU COMO A MATRIZ TRATADA COMO PONTEIRO NA LINGUAGEM C ++ ?

52

Professora ANITA LOPES


11.5 Ponteiros para Estruturas
Quando se passa uma estrutura para uma funo, gera-se uma sobrecarga da pilha
implicando em perda de tempo na transferncia de dados entre uma funo chamadora e
funo chamada. Tendo em vista isto, aconselha-se a passar para a funo somente um
ponteiro como argumento, pois estaremos passando o endereo da estrutura, tornando a
chamada extremamente rpida .

Existe duas formas de se acessar o elemento atravs do ponteiro:


1. ...(*ptr).elemento
2. ...ptr ->elemento /* mais recomendvel */

Para se atribuir o endereo de uma estrutura a um ponteiro, usamos:


ptr= &nome;
Veja o exemplo 1 onde passamos para uma funo um ponteiro de estrtura:
#include <iostream>
#include <cctype >
#include <cstring>
using namespace std;
struct CADASTRO
{ char nome[30];
float nota;
};
void imp(struct CADASTRO *m)
{ int c;
for(c=0;c<strlen(m->nome);c++)
m->nome[c]=toupper(m->nome[c]);
}
int main()
{
struct CADASTRO aluno,*p;
char c;
cout<<"\nNome : ";
cin.getline(aluno.nome,29);
cout<<"\nNota: ";
cin>>aluno.nota;
p=&aluno;
imp(p);
system("cls");
cout<<"\nNOME: "<<p->nome;
cout<<"\nNOTA: "<<p->nota<<endl;;
system("pause");
}

Consideraes sobre FUNES


53

Professora ANITA LOPES


1. Quando usamos funes, nossos programas ficam menores, pois no temos que repetir
o cdigo vrias vezes.
2. Os prottipos de funo servem para declarar as funes, isto , indicar para o
compilador qual o seu nome, tipo de retorno e o nmero e tipos dos parmetros
3. As variveis declaradas em uma funo s so acessveis na funo
4. Funes podem ser chamadas por outras funes, mas no podem ser definidas dentro
de outras funes
5. Uma funo que no retorna nada deve ser declarada como void
6. Os parmetros recebidos por uma funo com passagem por valor armazenam cpias
das variveis usadas na chamada da funo
7. Quando desejarmos alterar os contedos das variveis que so passadas como
parmetros para uma funo, devemos declar-las como ponteiros na funo
8. Quando utilizamos um vetor como parmetro para uma funo, estamos fornecendo o
endero do primeiro elemento do vetor
9. Em um programa C, as funes de um programa podem estar em vrios arquivo.c
10. Variveis globais so conhecidas e podem ser alteradas por todas as funes do
programa
11. A funo scanf necessita receber como parmetro o endereo da varivel de entrada,
porque ela precisa alterar esta varivel. (Lembre-se de usar o operador & para
variveis numricas e char de um caracter. A varivel vetor de char no precisa, pois
j um endereo)
12. As bibliotecas contm o prottipo de algumas funes da biblioteca do C
13. Funes no rodam mais rpido
14. Funes modularizam o programa e podem ser testadas em separado
Retorno da funo
1. Uma funo pode ter vrios comando return
2. Voc s pode retornar o contedo de uma varivel atravs do comando return
3. Uma funo pode retornar um ponteiro
4. O retorno da funo main feito para o sistema operacional
Consideraes sobre PONTEIROS
1. Aps a atribuio pa=&a[0]; pa e a possuem valores idnticos, isto , apontam para o
mesmo endereo
2. A atribuio pa=&a[0]; pode ser escrita como pa=a;
3. a[i] pode ser escrito como *(a+i)

54

Professora ANITA LOPES


Estruturas de Dados
Estruturas de dados so construes de uma linguagem de
programao que agregam um ou mais elementos de dados para formar
um tipo de dado que armazena uma quantidade maior de
informaes(Oliveira,R,taveira,G, Botini,J,2003)
Vrias so as formas de se organizar dados: pilhas, filas, listas, rvores, etc.
O objetivo das estruturas de dados tornar o algoritmo mais eficiente.

Pilhas
1. Conceitos
a ED mais simples e por esta razo muito utilizada.
Estruturas de dados dinmicas onde os elementos podem ser estruturas estticas ou
dinmicas.
No existe buracos.
So conhecidas como estruturas FILO first in, last out (o primeiro elemento que
entra o ltimo a sair. A sigla LIFO last in, first out tem o mesmo significado:
ltimo a entrar, primeiro a sair).
A insero sempre no topo da pilha e a remoo tambm.
Muito usadas pelo SO: um exemplo na chamada de funes onde o endereo de
retorno empilhado.

No confundir o termo heap da figura que uma rea de armazenagem alocada,


como por exemplo: malloc com a ED Heap(rovre)
Quando se pensa em um pilha, fazemos aluso a duas operaes: PUSH(empilha) e
POP(desempilha).

55

Professora ANITA LOPES

Se a pilha cresce descontrolada, pode acontecer um estouro de pilha(overflow).


2. Operaes realizadas com a Pilha

criar uma estrutura de pilha;


inserir um elemento no topo;
retirar o elemento do topo;
verificar se a pilha est vazia;
liberar a pilha.

3. Programa que manipula uma PILHA


#include <iostream>
using namespace std;
/* variaveis globais que podem ser alteradas todas as funes */
int qtde=0,
pilha[10];

/* numero de elementos ja inseridos na pilha */

/* Insere */
void empilha(int valor)
{ int x;
if(qtde == 10)
/* se a pilha estiver cheia */
cout<<"\nPILHA CHEIA. O VALOR DIGITADO NAO FOI INSERIDO.";
else
{ for(x=qtde;x>0;x--)
pilha[x]=pilha[x-1];
pilha[0]=valor;
qtde++;
}
}

56

Professora ANITA LOPES


/* Remove */
int desempilha()
{
int x; int valor;
if(qtde == 0)
{ cout<<"\nPILHA Vazia";
valor=-999;
}
else
{
valor=pilha[0];
for(x=1;x<qtde;x++)
pilha[x-1]= pilha[x];
qtde--;
}
return valor;
}

/* se a pilha estiver vazia */

/* guarda valor removido */

/* Mostra a pilha */
void imprime()
{
int i;
if(qtde==0) cout<<"\nPILHA vazia";
else
{
cout<<"\n\nElementos da PILHA\n\n";
for(i=0;i<qtde;i++)
cout<<"\n"<<pilha[i];
cout<<"\n\nQuantidade de elementos da pilha: " << qtde<<" \n\n";
}
}
/* Limpa a pilha */
void limparPilha()
{
while(qtde != 0)
desempilha();
cout<<"\nPILHA Vazia";
}
int main()
{ int op, v, val;
57

Professora ANITA LOPES


do
{ system("cls");
cout<<"\n\n\nPILHA FIFO- First in - Last out\n\n";
cout<<"\n1 - Empilha";
cout<<"\n2 - Desempilha";
cout<<"\n3 - Mostra a pilha";
cout<<"\n4 - Sai";
cout<<"\nOpcao.: "; cin>>op;
switch(op)
{ case 1: cout<<"Digite o valor e ser empilhado: \n";
cin>>val;
empilha(val);
break;
case 2: v=desempilha();
if(v !=-999)
break;

cout<<"Desempilhou: "<<v<<endl;;

case 3: imprime();
break;
case 4: limparPilha();
break;
default: cout<<"\nOPCAO INVALIDA";
}
cout<<"\n\n";system("pause");
} while(op != 4);
}

58

Professora ANITA LOPES


Filas
1. Conceitos
uma estrutura de dados muito usada em computao.
A Fila segue a regra chamada: FIFO first in, first out (o primeiro elemento que
entra o primeiro que sai).
A insero de um elemento na Fila acontece sempre ao final.
A remoo de um elemento da Fila acontece sempre no incio.

No difcil de fazer uma analogia com estrutura da Fila e as filas que enfrentamos no
nosso dia-a-dia: a fila do banco, a fila para comprar um ingresso no cinema, etc.
Se pensarmos em termos de um SO para gerenciar a impresso de vrios documentos
tambm fica fcil entendermos a filosofia da estrutura da Fila: o primeiro documento a
chegar, o primeiro a ser impresso.
2. Operaes realizadas com a Fila

criar uma estrutura de fila;


inserir um elemento no fim;
retirar o elemento do incio;
verificar se a fila est vazia;
liberar a fila.

3. Programa que manipula uma FILA


#include <iostream>
using namespace std;
/* variaveis globais manipuladas por todas as funcoes*/
int qtde=0,
fila[10];

/* numero de elementos ja inseridos na fila */

/* Inserir */
void inserir( int valor)
{
if (qtde == 10)
/* se a fila estiver cheia */
cout<<"\nFILA CHEIA. O VALOR DIGITADO NAO FOI INSERIDO.";
59

Professora ANITA LOPES

*/
}

else
{
fila[qtde]= valor;
qtde++;

/* insere elemento na ultima posicao


/* incrementa qtde */

}
/* Remover */
void remover()
{ int x;
if (qtde == 0)
cout<<"\nFILA Vazia";
else
{ cout<<"\nValor removido:"<<fila[0]<<endl;
for(x=1;x<qtde;x++)
fila[x-1]= fila[x];
qtde--;
}
}

/* se a fila estiver vazia */

/* mostra valor removido */

/* Mostrar a Fila */
void listar()
{ int x;
if(qtde==0) cout<<"\nFILA vazia";
else
{
cout<<"\n\nElementos da fila\n\n";
for(x=0;x<qtde;x++)
cout<< fila[x]<<"\t";
cout<<"\n\nQuantidade de elementos da fila: "<<qtde<<endl;
}
}

/* Limpa a Fila */
void limparFila()
{ int x;
while (qtde != 0)
{ for(x=1;x<qtde;x++)
fila[x-1]= fila[x];
qtde--;
}
60

Professora ANITA LOPES


}

cout<<"\nFILA Vazia";

int main()
{ int op, val;
do
{system("cls");
cout<<"\n\n\nFILA FIFO - First in - First out\n";
cout<<"\n1- Inserir um valor na fila";
cout<<"\n2- Remover um valor da fila";
cout<<"\n3- Mostrar a fila";
cout<<"\n4- Sair";
cout<<"\nOPCAO: "; cin>>op;
switch(op)
{
case 1: cout<<"\nDigite um valor: ";
cin>>val;
inserir(val);
break;
case 2: remover();
break;
case 3: listar();
break;
case 4: limparFila();
break;
default: cout<<"\nOPCAO INVALIDA";

}
cout<<"\n\n";system("pause");
} while(op != 4);

61

Professora ANITA LOPES


Bibliografia:
1. LOPES, Anita, GARCIA, Guto. Introudo Programao- 500 Algoritmos. 6 ed.Rio
de Janeiro: Campus, 2002.
2. LOPO,Erik de Castro, JONES Bradlely, AIKTEN Peter. C for Linux Programming
.SAMS
3. EVARISTO, Jayme. Aprendendo a Programar em C. Rio de Janeiro: Book Express,
2001.
4. Kernighan, Brian W. Ritchie, Dennis M. C- A linguagem de Programao padro
ANSI . Rio de Janeiro , Campus , 2002
5. MIZRAHI, V.V. Treinamento dem liguagem C Curso completo.Mdulos 1 e 2. So
Paulo: Mc Graw Hill, 1990
6. MRALES,Celso R. Estruturas de daos e Algoritmos. So Paulo: Berkley,2001.
7. SCHILDT, Herbert. C completo e total. Makron Book
8. UFMG. Apostila de C.
9. UNIVERSIDADE DE CAXIAS DO SUL. Apostila de C.
10. PROF. SILVIO Anotaes. ni.faj.br/nourau/document/get.php/2934/aula8.pdf

62

You might also like