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