Professional Documents
Culture Documents
1 Programas C++
Essencialmente, um programa C++ consiste de uma ou mais partes chamadas
funes1. Alm disso, um programa em C++ deve definir pelo menos uma
funo chamada main. Esta funo marca o ponto de incio de execuo do
programa.
Programas C++ tem a seguinte estrutura geral:
#include
iostream
int main()
{
declarao de variveis
....
sentenas
....
}
x = 3;
Composta:
{
i = 3;
cout << i << endl;
i = i + 1;
}
entre apstrofes ('). Por exemplo, 'C', 'a', '5', '$'. Note que '5' um caracter, e
no o inteiro 5.
escrito como
. Neste caso, a mantissa 6.023 e o expoente 23.
Estes nmeros so armazenados de uma forma padro, tal que a mantissa tem
apenas um dgito para a esquerda do ponto decimal. Desta forma, 3634.1
escrito como 3.6341e3, e 0.0000341 escrito 3.41e-5. Note tambm que a
preciso limitada pela mantissa. Somente os 6 dgitos mais significativos so
armazenados. Em Code::Blocks um float ocupa 4 bytes de memria. H
muitos outros tipos ( short, long, double), que sero descritos no futuro.
Maisculas
Minsculas;
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
main
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
sempre uma boa idia ter certas regras (para voc mesmo) para nomear
variveis para tornar o programa mais legvel:
D nomes significativos as variveis (mas no muito longos);
Use nomes de variveis do tipo i, j, k somente para variveis tipo
contadores;
Pode-se usar letras maisculas ou '_' para juntar palavras. Por
exemplo, horaInicio ou hora_inicio. Use o que voc preferir, mas
SEJA CONSISTENTE em sua escolha.
Os tipos bsicos de dados existentes em C++ so:
Tipo de Dado
Bits
Faixa de Valores
char
-128 a 127
bool
true ou false
int
32
-2.147.483.647 a 2.147.483.647
float
32
7 dgitos significativos
double
64
15 dgitos significativos
pera = 3;
qualidade = 'A';
peso = 0.653;
...
}
...
}
1.4 Constantes
Em C++ , alm de variveis, ns podemos usar tambm nmeros ou
caracteres cujos valores no mudam. Eles so chamados de constantes.
Constantes no so associados a lugares na memria.
Assim como variveis, constantes tambm tm tipos. Uma constante pode ser
do tipo int, char, etc. Voc nao tem que declarar constantes, e pode utiliz-las
diretamente (o compilador reconhece o tipo pela maneira que so escritos).
Por exemplo, 2 do tipo int, e 2.0 do tipo double. Por conveno, todas as
constantes reais so do tipo double.
iostream
cout
endl;
#include
iostream
int main()
int pera = 3;
cout
qualidade
"Existem "
cout
pera
peso
" quilos."
endl;
PRECO
peso * PRECO
endl;
#include
iostream
int main()
{
int idade;
cout
cin
cout
idade
idade
"anos."
endl;
#include
iostream
int main()
{
cout
cin
dia
cout
"/"
mes
ano;
dia
"/"
mes
endl;
/* Terminar Programa */
FIM_ALGORITMO PERIMETRO_AREA
Programa em C++
/* programa que calcula o permetro e a rea de uma
circunferncia de raio R (fornecido pelo usurio) */
#include <iostream> /* inclui diretivas de
entrada-sada */
#include <cmath> /* inclui diretivas das funes matemticas */
using namespace std;
#define
PI
3.14159
int main( )
{
/* Definir variaveis */
int Raio;
float Perim, Area;
/* Obter Raio da circunferencia */
cout << "Entre com o valor do raio: ";
cin >> Raio;
/* Calcular Perimetro do Circulo */
Perim = 2 * PI * Raio;
/* Calcular Area da Circunferencia */
Area = PI * pow(Raio, 2);
/* Exibir Resultados */
cout << "O perimetro da circunferencia de raio " << Raio
<< " eh " << Perim << endl;
cout << "e a area eh " << Area << endl;
/
diviso
%
resto (mdulo)
Estas operaes podem ser usadas como mostram os exemplos abaixo,
assumindo que as variveis necessrias j esto declaradas:
celsius = (fahrenheit - 32) * 5.0 / 9.0;
forca =
massa * aceleracao;
i = i + 1;
% 5
).
ter valor 2.
Note que % s pode ser utilizados entre dois inteiros. Usando ele com um
operando do tipo float causa um erro de compilao (como em 22.3 % 5).
2.1.3 Expresses e Variveis
Expresses aritmticas podem ser usadas na maior parte dos lugares em que
uma varivel pode ser usada.
menor que
maior que
==
igual a
!=
no igual a (
17;
"Pode tirar carteira de motorista? " << (idade >= 18)
35;
"Pode tirar carteira de motorista? " << (idade >= 18)
>= 18
>= 18
falso, que 0.
verdadeiro, que 1.
int main() {
int score = 5;
cout
cout
cout
cout
cout
<<
<<
<<
<<
<<
5 + 10 * 5 % 6;
10 / 4;
10.0 / 4.0;
'A' + 1
score + (score == 0);
//
//
//
//
//
7
2
2.5
B
5
}
#include <iostream>
using namespace std;
int main() {
int n1, n2, n3;
cout << "Entre com um numero inteiro: ";
cin >> n1;
n2 = n1 / 5;
n3 = n2 % 5 * 7;
cout << n2 << " " << n3 << " " << (n2 != n3 + 21) << endl;
}
int main() {
int n1, n2, n3;
int soma;
cout << "Entre com 3 numeros inteiros: ";
cin >> n1 >> n2 >> n3;
soma = n1 + n2 + n3;
cout << "Soma = " << soma << endl;
cout.setf (ios::fixed | ios::showpoint); // reais em ponto fixo
cout.precision(2);
// 2 casa decimais
Associatividade
()
(unrios)
* / %
+ -
== !=
tem valor 3;
3 < 5
tem valor 1;
x + 1
(x < 1) || (x > 4)
(1)
Um
(do ingls ``left-hand-side value'' - valor a esquerda) um valor
que se refere a um endereo na memria do computador. At agora, o nico
``lvalue'' vlido visto no curso o nome de uma varivel. A maneira que a
atribuio funciona a seguinte: a expresso do lado direito avaliada, e o
valor copiado para o endereo da memria associada ao ``lvalue''. O tipo do
objeto do ``lvalue'' determina como o valor da
memria.
armazenada na
tem valor 3;
x = y+1
O corpo do desvio, por sua vez, pode ser uma sentena simples ou composta
(veja Seo 1.1).
Quando uma sentena if encontrada em um programa,
1. O teste na
em parnteses avaliada.
Figura 1: O comando if
Considere o seguinte exemplo que converte uma frao digitada pelo usurio
(numerador e denominador) em decimal e imprime o resultado:
#include <iostream>
using namespace std;
int main( ){
int a, b;
cout << "Entre com uma
cin >> a >> b;
}
cout << "A fracao em decimal eh " << 1.0 * a / b << endl;
if (b != 0)
cout << "A fracao em decimal eh " << 1.0 * a / b << endl;
}
Exemplo 2:
Programa que l dois nmeros e ordena o par caso o primeiro nmero digitado
for maior que o segundo.
#include <iostream>
using namespace std;
int main( ){
int num1, num2, aux;
cout << "Entre com dois numeros inteiros: ";
cin >> num1 >> num2;
if (num1 > num2) {
aux = num1;
num1 = num2;
num2 = aux;
cout << "Trocou \n";
}
cout << "Os numeros ordenados: " << num1 << " " << num2 << endl;
}
else
- else.
O formato
Primeiro, a
(que usualmente chamamos de condio) avaliada.
Caso a condio seja verdadeira (o que equivalente a dizer que o valor
diferente de zero), entao a
a
executada.
Note que uma sentena pode ser simples ou composta. Se voc quiser agrupar
diversas sentenas para serem executadas, voc pode coloc-las entre chaves
({ e }).
Por hora, vamos continuar com nosso exemplo simples e torn-lo mais
explicativo:
Exemplo 3:
#include <iostream>
using namespace std;
int main( ){
int a, b;
cout << "Entre com uma fracao (numerador and denominador): ";
cin >> a >> b;
if (b != 0)
cout << "A fracao decimal eh " << 1.0 * a / b << endl;
else
cout << "Erro: denominador zero!\n";
}
Exemplo 4:
Considere agora o exemplo j visto que pede que um usurio entre com um
nmero e verifique se o nmero par. Porm agora, queremos que o programa
imprima ``o numero e par'' ou ``o numero e impar''.
#include <iostream>
using namespace std;
int main( ){
int num;
// obtem um numero do usuario
cout << "Entre com um inteiro: ";
cin >> num;
// imprime uma mensagem dizendo se o numero e par ou impar
if (num % 2 == 0)
cout << "O numero eh par.\n";
else
cout << "O numero eh impar.\n";
}
saldo = 2000;
if (saldo == 1)
cout << "Voce esta quebrado! " << endl;
else
cout << "Seu saldo eh " << saldo << endl;
Como a sentena saldo = 2000 inicializa o valor da varivel saldo com 2000,
a expresso saldo == 1 tem valor 0. Portanto, a sentea que segue o else ser
executada, e a mensagem
Seu saldo e 2000
ser impressa.
Agora, suponha que, devido a um erro, voc tenha colocado = ao invs de ==:
int saldo = 2000;
if (saldo = 1)
cout << "Voce esta quebrado! " << endl;
else
cout << "Seu saldo eh " << saldo << endl;
Para evitar este problema, chaves ({ e }) devem ser usadas para tirar a
ambiguidade. O exemplo abaixo mostra como as chaves podem ser inseridas
para corrigir o programa acima.
#include <iostream>
using namespace std;
int main( ){
int num;
// Obtem um numero do usuario
cout << "Entre com o numero de peras: ";
cin >> num;
// Como corrigir o problema (este programa funciona)
if (num != 0) {
if (num == 1)
cout << "Voce tem uma pera.\n";
}
else
cout << "Voce nao tem nenhuma pera.\n";
Exerccio 1:
Faa um programa que leia 3 nmeros e imprima o maior.
/usr/local/lib/tex/inputs///Programas/Exercicio_04-1.cpp
6 Operadores Lgicos
Todos os programas at agora consideraram if com condies de teste
simples. Alguns exemplos de testes simples: b != 0, contador <= 5. Estas
expresses testam uma condio. Portanto, quando mais de uma condio
precisa ser testada, precisamos usar sentenas if e if-else aninhadas.
A linguagem C++ , assim como a maioria das linguagens de programao de
alto nvel suportam operadores lgicos que podem ser usados para
criar operaes lgicas mais complexas, combinando condies simples. O
valor de uma expresso lgica ou VERDADEIRO ou FALSO. Lembre que
no h constantes lgicas VERDADEIRO e FALSO em C++ ; em expresses
lgicas 0 interpretado como FALSO, e qualquer valor diferente de zero
interpretado como VERDADEIRO.
Os operadores lgicos so
!
&&
||
exemplo:
!0
!1
(verdadeiro se ambos a
a==0 || b==0
== 0
eb
== 0,
portanto se a e b so 0)
Associatividade
()
! -
(unrios)
* / %
+ -
== !=
&&
||
valores devem ser positivos, e que o quadrado de um dos lados deve ser igual
a soma dos quadrados dos outros lados (Teorema de Pitgoras) para
determinar se o tringulo reto.
#include <iostream>
using namespace std;
int main( ){
int lado1, lado2, lado3;
int s1, s2, s3;
cout << "Entre com o tamanho dos lados do triangulo: ";
cin >> lado1 >> lado2 >> lado3;
//
s1
s2
s3
equivalente a !x
|| !y
equivalente a !x
&& !y
e
!(x || y)
7 Exemplos
7.1 IF - ELSE
Assuma as seguintes declaraoes de variveis:
int x = 4;
int y = 8;
if (y = 8)
2.
3.
4.
5.
6.
7.
8.
9.
if (x = 5)
cout << "a ";
else
cout << "b ";
cout << "c ";
cout << "d" << endl;
==> a c d
10.
11. mude = para ==
12.
==> b c d
2.
a d
ey
= 8
= 5
ey
= 7
o Assuma x
= 5
1.
b c d
ey
= 8.
if (x == 5 && y == 8)
cout << "a" << endl;
else
cout << "b" << endl;
6. Assuma x
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
= 5
= 4
ey
==> a
= 8.
if (x == 5 || y == 8)
cout << "a" << endl;
else
cout << "b" << endl;
==> a
if !(x == 5 || y == 8)
// equiv. (x != 5 && y != 8)
cout << "a" << endl;
else
cout << "b" << endl;
==> b
if !(x == 5 && y == 8)
// equiv. (x != 5 || y != 8)
20.
21.
22.
cout <<
else
cout <<
23.Precedncia: !
==> a
24.
if (x == 5 || y == 8 && z == 10)
25.
26. equiv.
27.
28.
if (x == 5 || (y == 8 && z == 10))
8 A construo else-if
Embora ela no seja um tipo diferente de sentena, a seguinte construo
bastante comum para programar decises entre diversas alternativas:
if
else if
else if
else if
else
Exemplo 9:
O seguinte exemplo mostra um else-if de trs opes. O programa l dois
nmeros e diz se eles so iguais ou se o primeiro nmero menor ou maior
que o segundo.
#include <iostream>
using namespace std;
int main( ){
int num1, num2;
// obtem 2 numeros do usuario
cout << "Entre um numero: ";
cin >> num1;
cout << "Entre com um outro numero: ";
cin >> num2;
// mostra a mensagem de comparacao
if (num1 == num2)
cout << "Os numeros sao iguais\n";
else if (num1 < num2)
cout << "O primeiro numero e menor\n";
else
cout << "O primeiro numero e maior\n";
9 Funes
Observe que o cdigo que verifica o maior valor dentre 3 nmeros teve que
ser reproduzido dentro do programa por duas vezes (para descobrir o maior
valor de dois conjuntos diferentes de 3 nmeros).
Um dos benefcios mais bvios de usar funes que podemos
evitar repetio de cdigo. Em outras palavras, se voc quiser executar uma
operao mais de uma vez, voc pode simplesmente escrever a funo uma
vez e utiliz-la diversas vezes ao invs de escrever o mesmo cdigo vrias
vezes. Outro benefcio que se voc desejar alterar ou corrigir alguma coisa
mais tarde, mais fcil alterar em um nico lugar.
O exemplo acima poderia ser simplificado pela criao de uma funo
chamada maior, que dados trs nmeros , , e , d como resultado o maior
valor dentre os trs valores fornecidos:
/usr/local/lib/tex/inputs///Programas/maior.cpp
}
// definicao da funcao main()
int main ()
{
int i;
i = 1;
while (i <= 3)
{
alo();
i = i + 1;
}
declaraes e sentenas
}
nome-da-funo(void)
O primeiro void significa que esta funo no tem tipo de retorno (no retorna
um valor), e o segundo significa que a funo no tem argumentos (ela no
precisa de nenhuma informao externa para ser executada). Isso no significa
que a funo no faz nada. Ela pode realizar alguma ao, como imprimir uma
mensagem. O exemplo abaixo mostra um programa que usa uma funo como
essa:
#include <iostream>
using namespace std;
// DEFINIO da funo alo()
void alo(void)
{
cout << "Alo." << endl;
}
// Programa Principal
int main()
{
alo();
}
main())
possuem
pode ento usar o resultado. Para retornar um valor para a funo chamadora,
a funo usa a sentena return.
O formato da sentena return a seguinte:
return
expresso;
atribuir 25 a varivel x, e
area = quadrado(tamanho);
a = obtem_valor();
b = obtem_valor();
cout << "soma = " << a + b << endl;
Este programa obtm dois inteiros do usurio e mostra a sua soma. Ele usa a
funo obtem valor() que mostra uma mensagem e obtm o valor do usurio.
Um exemplo de sada deste programa :
Entre um valor: 15
Entre um valor: 4
soma = 19
Em uma funo void, return; (s com ;) pode ser usado para sair de uma
funo. O exemplo seguinte, pede instrues ao usurio. Se o usurio
reponder nao, a funo termina. Do contrrio, ele imprime as instrues e
depois termina.
void instrucoes(void)
{
int ch;
return x;
int main()
{
int n;
endl;
}
Como voc pode ver, esta funo tem somente um argumento do tipo float.
Um exemplo de chamada desta funo poderia ser:
fervura = fahr_para_cels(212.0);
Esta funo possui dois argumentos do tipo float. Para chamar uma funo
com mais de um argumento, os argumentos devem ser separados por vrgula.
A ordem em que os argumentos so passados deve ser na mesma em que so
definidos. Neste exemplo, o primeiro valor passado ser a largura e o segundo
a altura. Um exemplo de chamada seria
tamanho = area(14.0, 21.5);
Depois desta sentena, o valor de tamanho (que do tipo float) ser 301.0.
int main()
{
obtem_int();
/* **** Isto esta' errado **** */
cout << "Voce digitou " << x << endl;
}
A funo obtem novo int() usa uma varivel local chamada x para armazenar o
valor digitado e retorna como resultado o valor de x. main() usa outra varivel
local, tambm chamada de x para receber o resultado retornado por obtem novo
int(). Cada funo tem sua prpria varivel x.
9.9 Prottipos
9.11 Comentrios
Voc pode colocar comentrios no seu programa para documentar o que est
fazendo. O compilador ignora completamente o que quer esteja dentro de um
comentrio.
Comentrios em C++ so textos que comeam com // em cada linha, ou so
delimitados por /* e */. Os smbolos // no possuem espao entre si. Alguns
exemplos:
// Este um comentrio sem graa
// Este um comentrio um pouco
// maior que tem diversas linhas
/* Este um outro comentrio maior
ainda e que tem vrias linhas
explicando qualquer aspecto mais detalhado
do programa
*/
Regras para comentrio
sempre uma boa idia colocar comentrios em seu programa das coisas que
no so claras. Isto vai ajudar quando mais tarde voc olhar o programa que
escreveu j h algum tempo ou vai ajudar a entender programas escritos por
outra pessoa.
Um exemplo de comentrio til:
/* converte temperatura de farenheit para celsius */
celsius = (fahrenheit - 32) * 5.0 / 9.0;
= i + 1
j auto explicativo.
";
10 Estruturas de Repetio
A linguagem C++ possui comandos para repetir uma sequncia de instrues.
Estas estruturas de repetio, tambm conhecidas como laos (do
ingls loops). Nesta seo veremos a estrutura while, Sendo que as demais
estruturas de repetio em C++ , for e do ... while sero vistas na Seo 19.
Sada:
contador = 0
contador = 1
contador = 2
contador = 3
contador = 4
ACABOU !!!!
}
}
Exemplo de sada:
Total
Entre
Total
Entre
Total
Entre
Final
= 0
com um numero: 3
= 3
com um numero: 8
= 11
com um numero: 15
total = 26
Embora as chaves possam ser omitidas, h uma nica razo para coloc-las
sempre. Considere o caso simples abaixo:
while( i < 5 ) {
i = i + 1;
}
while( i < 5 )
i = i + 1;
j = j + 1;
ou
while (i<5)
ou
while( i < 5 )
Isto tambm uma escolha pessoal. Porm seja consistente em sua escolha !
10.2.4 Laos aninhados
possvel colocar um lao dentro de outro (lao aninhado).
Exemplo 2:
#include <iostream>
#include <iomanip> // Necessrio para se usar a funo setw() em
cout
using namespace std;
int main( ){
int linha, coluna;
linha = 1;
while (linha < 5)
{
coluna = 1;
while (coluna < 5)
{
cout << setw(3) << linha * coluna;
coluna = coluna + 1;
}
linha = linha + 1;
}
cout << endl;
Sada:
1
2
3
4
2 3 4
4 6 8
6 9 12
8 12 16
No exemplo acima, para cada iterao do lao externo, o lao interno imprime
uma linha com nmeros e depois pula de linha.
Exemplo 3:
Este exemplo parecido com o anterior, exceto que o cout que produz a
mudana de final de linha colocado dentro do lao interno. Como era de se
esperar uma nova linha impressa aps cada valor ao invs de ser depois de 4
valores.
#include <iostream>
#include <iomanip> // Necessrio para se usar a funo setw() em
cout
using namespace std;
int main( ){
int linha, coluna;
linha = 1;
while (linha < 5)
{
coluna = 1;
while (coluna < 5)
{
cout << setw(3) << linha * coluna;
cout << endl;
coluna = contador + 1;
}
linha = linha + 1;
}
Sada:
1
2
3
4
2
4
6
8
3
6
9
12
4
8
12
16
Exemplo 4:
Este exemplo imprime um tringulo de asteriscos, de forma que a quantidade
de asteriscos em uma linha igual ordem da linha (na linha 1, 1 asterisco, na
linha 2, 2 asteriscos, etc.)
#include <iostream>
using namespace std;
int main( ){
int linha, coluna;
cout << endl;
linha = 1;
while (linha < 8)
{
cout << "\t";
coluna = 1;
while (coluna < linha)
{
cout << "*";
coluna = coluna + 1;
}
cout << endl;
linha = linha + 1;
}
}
Sada:
*
**
***
****
*****
******
*******
********
cout << "Trocados, eles sao " << a << " e " << b << endl;
cout << "Voce entrou com " << a << " e " << b << endl;
// Troca a com b
troca(a, b);
}
cout << "Trocados, eles sao " << a << " e " << b << endl;
A varivel inteira i est armazenada no endereo 1342. Ela usa dois bytes de
memria (quando um objeto usa mais de um byte, seu endereo onde ele
comea - neste caso, 1342 e no 1343). A varivel do tipo char c est
armazenada no endereo 1346 e usa um byte de memria. O compilador que
controla do local de armazenamento destas variveis em memria.
temp = px;
px = py;
py = temp;
int main()
{
int a, b;
cout << "Entre dois numeros: ";
cin >> a >> b;
cout << "Voce entrou com " << a << " e " << b << endl;
// Troca a com b -- passa argumentos por referencia
troca(a, b);
cout << "Trocados, eles sao " << a << " e " << b << endl;
}
12 O pr-processador
3.14159265
int main()
{
double raio;
cout << "Entre com o raio: ";
colocada nos arquivos fontes que contm as funes geomtricas far com que
todos eles usem o nome simblico PI ao invs de 3.14159265. O fato do nome
do arquivo estar em aspas significa que o arquivo geom.h est no mesmo
diretrio que os arquivos fontes (ao invs do diretrio onde se encontram as
bibliotecas padro de C++ ).
A diretiva
#include <iostream>
12.3 Comentrios
De um modo geral, o pr-processador dos compiladores existentes remove
todos os comentrios do arquivo fonte antes do programa ser compilado.
Portanto, o compilador nunca v realmente os comentrios.
13 Vetores ou Arrays
Considere o seguinte programa. Este programa pede ao usurio notas de 4
estudantes, calcula a mdia e imprime as notas e a mdia.
int main()
{
int nota0, nota1, nota2, nota3;
int media;
cout << "Entre
cin >> nota0;
cout << "Entre
cin >> nota1;
cout << "Entre
cin >> nota2;
cout << "Entre
cin >> nota3;
Este programa bem simples, mas ele tem um problema. O que acontece se o
nmero de estudantes aumentar ? O programa ficaria muito maior (e feio !!).
Imagine o mesmo programa se existissem 100 estudantes.
O que precisamos uma abstrao de dados para agrupar dados relacionados.
Este o objetivo de arrays em C++ .
Um array uma coleo de um ou mais objetos, do mesmo tipo, armazenados
em endereos adjacentes de memria. Cada objeto chamado de elemento do
array. Da mesma forma que para variveis simples, damos um nome ao array.
O tamanho do array o seu nmero de elementos. Cada elemento do array
numerado, usando um inteiro chamado de ndice. Em C++ , a numerao
Associatividade
() []
! - &
* / %
+ -
== !=
&&
||
";
total = 0;
indice = 0;
while (indice < 4)
{
cout << nota[indice] << " ";
total = total + nota[indice];
indice = indice + 1;
}
cout << endl << "Media: " << total / 4 << endl;
Exemplo de Sada:
Entre a
Entre a
Entre a
Entre a
Notas:
nota
nota
nota
nota
do
do
do
do
estudante 0:
estudante 1:
estudante 2:
estudante 3:
93 85 74 100
93
85
74
100
Media: 88
";
total = 0;
indice = 0;
while (indice < ESTUDANTES)
{
cout << nota[indice] << " ";
total = total + nota[indice];
indice = indice + 1;
}
cout << endl << "Media: " << total / ESTUDANTES << endl;
73
85
42
-103
15
Em main() a chamada para array max() tem valor como seu argumento, que
copiado para o parmetro formal a, que um array de inteiros. Note que o
tamanho no foi especificado, somente o nome do array, a. Porm tambm
correto incluir o tamanho (isto uma questo de estilo - escolha o que voc
preferir):
int array_max(int a[TAMANHO])
{
...
}
A sada do programa :
v[0]=30
v[0]=60 v[1]=70 v[2]=80
3. Definio:
4. /* Procura uma chave em um array
5. * entrada: array a ser pesquisado (arr ), tamanho do array
(tam),
6. *
chave a ser procurada (chave)
7. * saida: o indice do elemento que e' igual a chave ou -1 caso
nao ache
8. * suposicao: nao assume que o array esteja ordenado
9. */
10. int pesquisa_linear(int arr[], int tam, int chave)
11. {
12.
int i;
13.
14.
i = tamanho - 1;
15.
while (i >= 0)
16.
{
17.
if (arr[i] == chave)
18.
{
19.
return i;
20.
}
21.
22.
i = i - 1;
23.
}
24.
return -1;
25. }
Escrever uma funo que some dois arrays de floats, do mesmo tamanho.
Dar o resultado em um terceiro array. O tamanho dos arrays tambm
passado para a funo.
1. Prottipo:
2.
1 -->
2 -->
3 -->
4 -->
5 -->
6 -->
7 -->
8 -->
3. Definicao
4. /
usr/local/lib/tex/inputs///Programas/ordena_array_02
.cpp
1 -->
2 -->
3 -->
4 -->
5 -->
6 -->
7 -->
8 -->
Note que, tambm aqui, mesmo que se comessemos com um array ordenado
de 9 elementos, ainda assim o algoritmo dado faz 8 passagens sobre o array.
Isto pode ser melhorado da seguinte forma: Antes de comear cada passagem,
inicializamos uma varivel ordenado com 1. Se durante a passagem uma troca
de valores ocorrer, trocamos o valor da varivel para 0. Assim, se depois da
passagem, o valor da varivel continuar sendo 1, isso significa que nenhuma
troca ocorreu e que o array est ordenado.
13.8.1 Algoritmo Bubble Sort otimizado
Enquanto o array nao estiver ordenado
1. inicializar ordenado com 1
2. comparar pares adjacentes do array
troque seus valores se estiver fora de ordem
ordenado = 0.
13.8.2 Prottipo da funo e definio
1. Prottipo
2. void bubbleSort(int [], int);
3. Definicao
4. /
usr/local/lib/tex/inputs///Programas/ordena_array_01
.cpp
14 Matrizes ou Arrays
Multidimensionais
Nas notas de aula anteriores, apresentamos arrays unidimensionais. Em C++ ,
possvel tambm definir arrays com 2 ou mais dimenses. Eles so arrays de
arrays. Um array de duas dimenses podem ser imaginado como uma matriz
(ou uma tabela).
Como voc deve ter imaginado, para definir e acessar arrays de dimenses
maiores, usamos colchetes adicionais ([ e ]). Por exemplo:
int tabela[3][5];
int x;
int y;
char matriz [ALTURA] [LARGURA];
num_cols]
//
//
//
//
numero da coluna
numero da linha
array 2-D [num_lins,
y = 0;
while(y < ALTURA)
{
x = 0;
while(x < LARGURA)
{
matriz[y][x] = 0;
x= x + 1;
}
y= y + 1;
}
//
cout << endl << "Entre coordenadas na forma \"y x\"." << endl;
cout << "Use valores negativos para sair do programa." << endl;
cout << "Coordenadas: ";
cin >> y >> x;
while (x >= 0 && y >= 0)
{
matriz[y][x] = 1;
//
y = 0;
while (y < ALTURA)
// imprime o array todo
{
x = 0;
while (x < LARGURA)
{
cout << matriz[y][x] << " ";
x = x + 1;
}
cout << endl << endl;
y = y + 1;
}
cout << endl;
cout << "Coordenadas: ";
cin >> y >> x;
}
#include <iostream>
#include <iomanip>
using namespace std;
#define LIN 10
#define COL 10
int main()
{
int x;
int y;
int tabela[LIN] [COL];
//
//
//
//
numero da coluna
numero da linha
tabela de taboada
preenche a tabela
y = 0;
while (y < LIN)
{
x = 0;
while (x < COL)
{
tabela[y][x] = y*x;
x = x + 1;
}
y = y + 1;
}
cout << endl << "
//
y = 0;
while (y < LIN)
{
cout << setw(2) << y << "|";
x = 0;
A sada do programa :
Tabela de Multiplicacao
0 1 2 3 4 5 6 7 8 9
-----------------------------0| 0 0 0 0 0 0 0 0 0 0
1| 0 1 2 3 4 5 6 7 8 9
2| 0 2 4 6 8 10 12 14 16 18
3| 0 3 6 9 12 15 18 21 24 27
4| 0 4 8 12 16 20 24 28 32 36
5| 0 5 10 15 20 25 30 35 40 45
6| 0 6 12 18 24 30 36 42 48 54
7| 0 7 14 21 28 35 42 49 56 63
8| 0 8 16 24 32 40 48 56 64 72
9| 0 9 18 27 36 45 54 63 72 81
14.1 Inicializao
Arrays multidimensionais podem ser inicializados usando listas aninhadas de
elementos entre chaves. Por exemplo, um array bidimensional tabela com trs
linhas e duas colunas pode ser inicializado da seguinte forma:
double tabela[3][2] = { {1.0, 0.0},
{-7.8, 1.3},
{6.5, 0.0}
};
//
//
//
linha 0
linha 1
linha 2
//
//
//
linha 0
linha 1
linha 2
, onde o nmero de
, respectivamente, :
consistindo de um total
de dimenso
15,
22,
33,
42,
17,
24,
35,
44,
19,
26,
37,
46,
21},
28},
39},
48} };
--->
--->
--->
--->
{13,
{20,
{31,
{40,
15,
22,
33,
42,
17,
24,
35,
44,
19,
26,
37,
46,
21}
28}
39}
48}
#include <iostream>
#include <iomanip>
using namespace std;
#define LIN 10
#define COL 10
//
numero da coluna
numero da linha
preenche o array
y=0;
while (y < LIN)
{
x=0;
while(x < COL)
{
arr[y][x] = y*x;
x = x + 1;
}
y = y + 1;
}
}
//
//
//
numero da coluna
numero da linha
y = 0;
while (y < LIN)
{
cout << setw(2) << y << "|";
x = 0;
while (x < COL)
{
cout << setw(3) << arr[y][x];
x = x + 1;
}
cout << endl;
y = y + 1;
}
}
int main()
{
int tabela[LIN] [COL];
inicializa_arr(tabela);
cout << endl << "
imprime_arr(tabela);
}
#include <iostream>
using namespace std;
#define ALTURA 7
#define LARGURA 7
// *** DEFINICAO DE FUNCOES *******
// funcao que imprime um array 2-D ALTURA X LARGURA
void imprime_matriz(char matriz[][LARGURA])
{
int x,y;
y = 0;
while (y < ALTURA)
{
x = 0;
while (x < LARGURA)
{
cout << matriz[y][x] << " ";
x = x + 1;
}
cout << endl << endl;
y = y + 1;
}
}
y = 0;
while (y < ALTURA)
{
x = 0;
while (x<LARGURA)
{
matriz[y][x] = '.';
x = x + 1;
}
y = y + 1;
}
while (x <= y)
{
matriz[y][x] = '@';
x = x + 1;
}
y = y + 1;
}
// funcao que rotaciona ('flip') cada linha array tendo
da
// diagonal principal como centro da rotao
void flip(char matriz[][LARGURA])
{
int x, y;
int temp;
o elemento
// funcao que espera ate que uma tecla qualquer seja digitada
void pausar() {
char c;
cin.get(c);
}
// ********* MAIN ***********
// alguns exemplos de chamadas de funcoes com argumentos array 2-D
int main()
{
char matriz [ALTURA] [LARGURA];
pontos(matriz);
seleciona_elem(matriz);
pausar();
flip(matriz);
imprime_matriz(matriz);
pausar();
marca_triang( matriz);
imprime_matriz( matriz);
pausar();
flip( matriz);
imprime_matriz(matriz);
pausar();
Notas de rodap
... funes1
Na verdade, um programa C++ composto pela definio de funes e
de elementos estruturais denominados classes. Estes so tema de estudo
em cursos avanados de programao orientada a objetos.
2
... cin
cout e cin so na verdade objetos das classes ostream e istream. Mas
este detalhe no abordado nestas notas de aula. Ser visto apenas o
uso destes objetos como primitivas simples para Entrada e Sada de
dados.
... lgicos3
Operadores lgicos && e || sero vistos na prxima aula.
Subseces
o 1 Programas C++
1.1 Sentenas: simples e compostas
1.2 Variveis em C++
1.3 Definio de Varivel em C++
1.4 Constantes
1.5 Caracteres Constantes
1.6 Entrada e Sada
1.6.1 Exibindo informaes na tela: cout
1.6.2 Lendo informao: cin
1.7 Algoritmo X Programa
o 9 Funes
9.1 Funes: o que so e por que us-las
9.2 Definindo funes
9.3 Funes simples
9.3.1 Argumentos
9.4 Funes que retornam um valor
9.5 Mais sobre o return
9.6 Mais sobre Argumentos
9.7 Chamada por valor
9.8 Variveis locais
9.9 Prottipos
9.10 Documentao de funes
9.11 Comentrios
o 10 Estruturas de Repetio
10.1 O comando de repetio while
10.2 Estilo de formatao para estruturas de repetio
10.2.1 Colocao das chaves
10.2.2 Necessidade ou no das chaves
10.2.3 Uso de espao em branco
10.2.4 Laos aninhados
o 11 Mais sobre funes: Quando return no suficiente
11.1 Usando referncia
11.2 Argumentos por referncia em funes
o 12 O pr-processador
12.1 A diretiva #define
12.2 A diretiva #include
12.3 Comentrios
o 13 Vetores ou Arrays
13.1 Definindo arrays e acessando seus elementos
13.2 Inicializao de arrays
13.3 Verificao de Limite
13.4 Arrays como argumentos de funes
13.5 Exemplo: pesquisa linear de um array
13.5.1 O Problema
13.6 Exemplo: somar os elementos de dois arrays
13.6.1 O Problema
13.7 Exemplo: Ordenao de um vetor - Verso 1
13.7.1 Prottipo da funo e definio
13.8 Exemplo: Ordenao de um vetor - Verso 2
13.8.1 Algoritmo Bubble Sort otimizado
13.8.2 Prottipo da funo e definio
13.9 Comentrios Finais
o 14 Matrizes ou Arrays Multidimensionais
14.1 Inicializao
14.2 Arrays Multidimensionais - arrays de arrays