Matrizes e Estruturas

Propaganda
C++ - Matrizes
É um conjunto de variáveis, do mesmo tipo, referenciadas por um único
nome, onde cada variável é diferenciada por meio de um número entre colchetes
chamado índice.
Declaração : tipo nome [tamanho];
(tamanho deve ser constante)
Ex.: int notas [5]; (cinco elementos do tipo int, com índices de 0 a 4, numa
seqüência contínua de memória)
Observ.: C++ não avisa quando o limite de uma matriz foi excedido. Providenciar
a verificação é responsabilidade do programador.
Inicialização : tipo nome [tamanho] = { valor1, valor2, ...};
Ex.: Imprime o número de dias até a data especificada.
#include <iostream.h>
void main( )
{
int dmes[ ]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int dia, mes, ano;
cout << “\nDigite a data no formato DD/MM/AAAA: “;
{
char ch;
cin >> dia >> ch >> mês >> ch >> ano;
}
if ( ano%4 == 0 && ano%100 || ano%400 == 0)
dmes[1] = 29;
// ano bissexto
int total = dia;
for (int i = 0; i< mes-1; i++)
total+=dmes[i];
cout << “\nTotal de dias transcorridos : “ << total;
}
Observ.: Na inicialização de uma matriz, a dimensão pode ser omitida, colocando
apenas um par de colchetes vazios.
Matrizes de mais de uma dimensão
Matrizes cujos elementos são matrizes.
Ex.: int doisd[2][3];
int tresd[2][3][4];
Inicialização : int doisd[2][3] = { {1, 2, 3}, {4, 5, 6} };
(constantes separadas por vírgula e envoltas por chaves)
Matrizes como argumentos de funções
Ex.: Cálculo da média através de uma função
#include <iostream.h>
int media (int lista[ ], int tamanho);
void main ( )
{
const MAXI = 20;
int notas [MAXI];
for ( int i=0; i<MAXI; i++)
{
cout << “Digite a nota do aluno “ << (i+1) << “ : “;
cin >> notas[i];
if (notas[i] < 0) break;
int m = media (notas, i);
cout << “\nMedia das notas : “ << m;
}
int media ( int lista[ ], int tamanho)
{
int m=0;
for (int i=0; i < tamanho; i++) m+=lista[i];
return (m/tamanho);
}
}
O nome de uma matriz desacompanhado de colchetes representa o endereço
de memória onde a matriz foi armazenada.
Passando o nome de uma matriz para uma função, não é criada uma nova
cópia da matriz. A passagem é por referência.
A declaração de uma matriz com mais de uma dimensão na função e no
protótipo exige que a segunda dimensão seja informada. Ex.: int pecas[ ][12];
Strings
Matriz do tipo char que armazena um texto formado de caracteres e sempre
terminado por ‘\0’ (NULL).
Ex.: Mostra o uso de strings
#include <iostream.h>
void main ( )
{
char nome[80];
cout << “\nDigite o seu nome : “;
cin >> nome;
cout << “\nSeu nome é : << nome;
}
Execute e observe a saída. Se você colocou mais de um nome separado por
espaço, o programa só imprimiu o primeiro. Isto porque cin entende que um
espaço em branco termina a entrada. Para resolver este problema, use a função
gets( ) com protótipo em stdio.h para leitura de textos. Assim substitua
cin >> nome ;
por
gets(nome);
Inicialização de strings : duas maneiras:
char nome[ ] = { ‘A’, ‘n’, ‘a’, ‘\0’};
ou
char nome[ ] = “Ana”;
Aritmética com endereços
O nome de uma matriz é o endereço do primeiro elemento da matriz. Assim
nome é o endereço de nome[0], que é uma variável char. O que significa nome +
1?
O número 1 desta soma tem uma unidade estranha : significa
• um byte se o endereço é de uma variável char
• dois bytes se o endereço é de uma variável int
• quatro bytes se o endereço é de uma variável float e assim por diante...
Em geral, se M é o nome de uma matriz e i uma variável int, então
é equivalente ao endereço da variável M[i]
#include <stdio.h>
#include <iostream.h>
void main ( )
{
char nome[80];
cout << “\nDigite o seu nome : “;
gets(nome);
cout << “\nBom dia, “ << (nome+5);
}
Funções de manipulação de strings (string.h)
M + i
• int strlen(char s[]); retorna o número de caracteres armazenados na string s
(tamanho de s).
• void strcat (char s1[], char s2[]); concatena uma cadeia de caracteres em
outra (acrescenta s2 ao final de s1).
• int strcmp (char s1[], char s2[]); retorna um inteiro que indica a diferença
numérica do primeiro caracter diferente da primeira cadeia com o da segunda.
Então, se este número for:
• menor que zero
- s1 é menor que s2
• igual a zero
- s1 é igual a s2
• maior que zero
- s1 é maior que s2
(menor, igual ou maior em ordem alfabética)
• void strcpy (char s1[], char s2[]); copia o conteúdo de s2 em s1.
• strncat( ), strncmp( ), strncpy( ); recebem um terceiro argumento indicando o
número de caracteres a processar.
Ex.: Uma matriz de strings
#include <iostream.h>
#include <conio.h>
int dsemana (int dia, int mês, int ano);
void main( )
{
char diasemana[7][14] = { “Domingo”, “Segunda-feira”, “Terça-feira”,
“Quarta-feira”, “Quinta-feira”, “Sexta-feira”, “Sábado” };
int dia, mes, ano;
const char ESC= 27;
do
{cout << “\nDigite a data no formato dd mm aaaa “;
cin >> dia >> mes >> ano;
cout << ‘\n’ << diasemana[dsemana( dia, mes, ano)];
}while (getch( ) != ESC);
}
int dsemana( int dia, int mes, int ano)
{
int f = ano + dia + 3*(mes-1) -1;
if(mês <3) ano--;
else
f -= int(0.4*mes+2.3);
f += int(ano/4) - int((ano/100 + 1)*0.75);
f %= 7;
return (f);
}
Estruturas
A Linguagem C++ oferece cinco meio de criar novos tipos de dados :
matrizes, estruturas, dados enumerados, uniões e classes.
Estruturas são tipos de variáveis que agrupam dados geralmente
heterogêneos. Os itens de dados são chamados membros.
Definição : struct nome
{
tipo membro_1;
tipo membro_2;
...
tipo membro_n;
};
Ex.: Estrutura para armazenar informações de um aluno
struct aluno
{
char matricula[8];
float nota;
int faltas;
};
aluno ana;
// definição da estrutura
// declaração de variável
ou
// definição da estrutura
struct
{
char matricula[8];
float nota;
int faltas;
} ana ;
// declaração de variável
Acessando membros da estrutura : através do operador ponto.
Ex.: ana.nota = 8.5;
Inicializando estruturas : aluno ana = { “9820460”, 8.5, 4};
Atribuição entre estruturas (de mesmo tipo) :
aluno ana, maria;
...
ana = maria;
Estruturas aninhadas : estruturas com membros que são estruturas.
Ex.: struct data
{
int dia;
char mes[10];
int ano;
};
struct venda
{
int pecas;
float preco;
data diavenda;
};
• acesso aos membros: venda A;
A.diavenda.ano = 1999;
• inicialização : venda A = {20, 110.50, {30, ”Abril”, 1999} } ;
Passando estruturas para funções : da mesma forma que variáveis simples, ou
seja, por valor e por referência.
Ex.: void listavendas (venda C, venda D);
// protótipo
...
listavendas (A, B)
// chamada por valor
...
void listavenda (venda& C, venda& D);
// protótipo
listavenda (A, B);
// chamada por referência
Funções que retornam estruturas : Ex.:
venda novavenda (void)
{
venda X;
cout << “\nInsira o número de peças : “;
cin >> X.pecas;
cout << “\nInsira o preço : “;
cin >> X.preco;
cout << “\nInsira o data da venda no formato dd mm aaaa: “;
cin >> X.diavenda.dia >> X.diavenda.mes >> X.diavenda.ano;
return (X);
}
Matrizes de estruturas : Várias vendas Ex.:
venda vendas[50];
• acesso ao preço da décima venda : vendas[9].preco = 95.40;
Tipos de dados anumerados : enum
São usados quando conhecemos o conjunto de valores que uma variável
pode assumir, objetivando tornar clara e simples a escrita do programa. A variável
é sempre int e para cada um dos valores do conjunto atribuímos um nome
significativo.
A palavra enum enumera a lista de nomes automaticamente, dando-lhes
números em seqüência (0, 1, 2 ...). Caso seja necessário podemos mudar estes
valores.
Variáveis do tipo enumerado podem ter qualquer valor listado na definição.
São tratadas internamente como inteiros, portanto qualquer operação com inteiros
é permitido com elas.
Ex.: enum mes {Jan=1, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set,
Out, Nov, Dez};
mes m1, m2;
enum sexo { masculino, feminino};
enum chave {OFF, ON};
enum direção {Norte=50, Sul=80, Leste=92, Oeste=100};
Uniões
Semelhante a struct, só que os membros compartilham o mesmo espaço de
memória. São usadas para poupar memória. Quando declaramos uma variável do
tipo union, automaticamente é alocado espaço de memória suficiente para conter
seu maior membro.
Ex.: union dado { char str[10];
// definição da união
int i;
float f;
} x; // declaração da variável
Operador sizeof : opera sobre o nome de um tipo de dados ou de uma variável
resultando seu tamanho em bytes. Ex.: sizeof(dado) resulta 10 (tamanho em bytes
do maior membro).
Operador de endereços & : &x resulta o endereço da variável x
Download