Capítulo VI – Variáveis Indexadas
date post
08-Jan-2016Category
Documents
view
37download
3
Embed Size (px)
description
Transcript of Capítulo VI – Variáveis Indexadas
Captulo VI Variveis Indexadas6.1 A necessidade de variveis indexadas6.2 Vetores e matrizes6.3 Aplicaes com vetores numricos6.4 Aplicaes com matrizes numricas6.5 Cadeias de caracteres6.6 Aplicaes com vetores de cadeias de caracteres
6.4 Aplicaes com Matrizes Numricas6.4.1 Transformar uma matriz quadrada em sua transposta
Matriz transposta de uma matriz quadrada aquela cujas linhas so as colunas da matriz original e cujas colunas so as linhas da mesma
Exemplo:
Se o objetivo fosse apenas obter o resultado na tela:
for (i = 0; i < n; i++) {for (j = 0; i < n; j++) printf (%5d, A[j][i]); printf (\n);}
Mas deseja-se transformar a original na transposta
Matriz quadrada 5 x 5 originalMatriz transposta da originalEscrevendo cada coluna numa linha da telaA
AOperao bsica para a transformao:
Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3,
Trocar A[2][3] com A[3][2]
AOperao bsica para a transformao:
Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3,
Trocar A[2][3] com A[3][2]
AOperao bsica para a transformao:
Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3,
Trocar A[2][3] com A[3][2]
AOperao bsica para a transformao:
Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3,
Trocar A[2][3] com A[3][2]Trocar (A[i][j], A[j][i]):
aux = A[i][j];A[i][j] = A[j][i];A[j][i] = aux;
APara transformar toda a matriz:
Percorr-la com 2 cursores i e je Trocar (A[i][j], A[j][i])
O percurso no pode abranger toda a matriz!!! Porqu???Sejam os comandos:
for (i = 0; i < n; i++) for (j = 0; j < n; j++) Trocar (A[i][j], A[j][i]);
que percorrem toda a matrizQuando (i, j) = (1, 3)Trocar (A[1][3], A[3][1])
Mais adiante, quando (i, j) = (3, 1)Trocar (A[3][1], A[1][3])
A troca anterior desfeita
ADeve-se planejar o percurso de i e de j
Para comear, a diagonal principal no precisa ser percorrida
A parte acima dessa diagonal deve ser trocada com a parte abaixo dela
AOs comandos:
for (i = 0; i
#include #include int main () {int A[10][10], i, j, n, aux;
/*Leitura e escrita da matriz*/
printf ("Dimensao da matriz quadrada: "); scanf ("%d",&n);printf ("\nElementos da matriz: \n");for (i = 0; i
/*Transformacao da matriz em sua transposta e sua escrita*/
for (i = 0; i
6.4.2 Sntese de sub-matrizes
Muito usada em processamento de imagens p. ex., para o controle de desmatamento numa regio
Dados captados pela cmera de um satlite so armazenados numa imensa matriz bidimensional, para serem usados na confeco de fotografias
Tipicamente uma foto constituda de uma matriz de pontos, de dimenses bem menores que as da matriz preenchida pela cmera
Ento cada ponto da foto deve conter uma sntese das informaes contidas numa sub-matriz da primeira matriz
A seguir, o desenvolvimento de um programa para sintetizar o contedo das sub-matrizes de uma grande matriz B em elementos de outra matriz A bem menor que a primeira
Dimenses: B(20 x 20) e A(5 x 5)
A sntese consiste na mdia aritmtica dos elementos de cada sub-matriz de B
Sendo inteiros os elementos de B, ento os de A devem ser reais
A seguir, um contedo possvel para a matriz B e o contedo correspondente da matriz A
Cada linha de A corresponde a 4 linhas de B
Cada coluna de A corresponde a 4 colunas de B
A linha i de A corresponde s linhas de 4i a 4i+3 de B
A coluna j de A corresponde s colunas de 4j a 4j+3 de B
A linha i de A corresponde s linhas de 4i a 4i+3 de B
A coluna j de A corresponde s colunas de 4j a 4j+3 de B
Clculo de A[i][j]:aux = 0;for (x = 4*i; x
Clculo de A[i][j]:
aux = 0;for (x = 4*i; x
#include #include int main () {
/*Declaracoes das variaveis*/
float A[5][5]; int B[20][20];int i, j, k, x, y, z; float aux; char c;
/*Formacao da matriz B (20 x 20)*/
for (i = k = 0; i < 20; i++)for (j = 0; j < 20; j++)B[i][j] = ++k;
/*Escrita da matriz B (20 x 20) no video*/
printf ("Matriz principal? (s/n): ");scanf ("%d", &c);if (c == 's' || c == 'S') { printf ("\n\n");for (i = 0; i < 20; i++) for (j = 0; j < 20; j++) printf ("%4d", B[i][j]);}Os 20 elementos preenchem uma linha inteira do vdeo
No preciso o \n no final de cada linha
/*Sintetizacao da Matriz B na matriz A*/
for (i = 0; i < 5; i++)for (j = 0; j < 5; j++) {aux = 0;for (x = 4*i; x
/*Escrita da matriz A(5 x 5) no video*/
printf ("\n\nMatriz reduzida? (s/n): ");scanf ("%d", &c);if (c == 's' || c == 'S') { printf ("\n\n");for (i = 0; i < 5; i++) {for (j = 0; j < 5; j++) printf ("%8.2f", A[i][j]);printf ("\n");}}
/*Fechamento da tela*/
printf ("\n\n"); system ("pause"); return 0;}
Exerccios 6.4:
Escrever um programa para ler os elementos de uma matriz A e quatro inteiros i, j, k, l, formando em seguida outra matriz B, contendo uma submatriz de A composta de suas linhas de i a j e de suas colunas de k a l; no final, o programa deve escrever a matriz B
A seguinte matriz tem o apelido de matriz ziguezague de dimenses 5 x 8:
Fazer um programa que leia 2 inteiros positivos m e n e em seguida construa e escreva no vdeo uma matriz ziguezague de dimenses m x n
As seguintes matrizes tm o apelido de matrizes-cebolas de dimenses (6 x 7) e (8 x 5):
Fazer um programa para ler m e n e construir uma matriz-cebola de dimenses m e n
As seguintes matrizes tm o apelido de matrizes-espirais de dimenses 5 e 6:
Fazer um programa para ler n e construir uma matriz-espiral de dimenso n
e
Fazer um programa para ler o valor de uma varivel inteira n, os valores dos elementos reais de uma matriz A triangular superior de dimenses (n x n) e de um vetor B de dimenso n, e resolver o seguinte sistema:
Captulo VI Variveis Indexadas6.1 A necessidade de variveis indexadas6.2 Vetores e matrizes6.3 Aplicaes com vetores numricos6.4 Aplicaes com matrizes numricas6.5 Cadeias de caracteres6.6 Aplicaes com vetores de cadeias de caracteres
6.5 Cadeias de Caracteres6.5.1 Cadeias de caracteres como variveis e constantes
Vetores de caracteres so denominados cadeias de caracteres (strings, em Ingls)
Podem ser manipulados de forma diferenciada em relao aos vetores numricos, pela maioria das linguagens de programao
Tudo comea pela existncia de constantes do tipo cadeia de caracteres, mas no de constantes vetores numricos
Constante cadeia de caracteres uma sequncia de caracteres delimitada por aspas (), como por exemplo:
abc DEF
Os componentes dessa constante so os caracteres da sequncia, sem as aspas, e mais o caractere \0, que o finalizador da cadeia
Ento, os caracteres componentes da constante anterior so:
a, b, c, , D, E, F e \0
A declarao sem inicializao de uma varivel cadeia de caracteres pode ser feita da mesma forma que a de vetores numricos
Exemplo: char cad[30];
Mas a declarao com inicializao pode ser feita da seguinte maneira:
char cad[] = ABCDE;
que equivalente s seguintes:
char cad[] = {A, B, C, D, E, \0};char cad[6] = ABCDE;char cad[6] = {A, B, C, D, E, \0};
char cad[] = ABCDE;
Esta declarao reserva espao na memria para os elementos cad[0], cad[1], cad[2], cad[3], cad[4] e cad[5]
e coloca neles os caracteres A, B, C, D, E, \0
Representao grfica:
Tal como em vetores numricos, os elementos de uma cadeia de caracteres podem ser referenciados individualmente
Exemplos: cad[3] = b; y = cad[i+1];
A seguinte atribuio no permitida:
cad = xyzwt;
Porm, se cad for declarada como sendo do tipo ponteiro para caracteres, isso ser permitido
6.5.2 Leitura e escrita de cadeias de caracteres
O formato %s pode ser usado nas funes printf e scanf para fazer escrita e leitura de valores de variveis do tipo cadeia de caracteres
Funo printf:
O formato %s faz com que os caracteres da varivel sejam escritos na tela at que o caractere \0 seja encontrado, no sendo ele escrito
Por exemplo, os comandos:char cad[10] = ABCDE;printf (%s, cad);escrevero na tela:ABCDE
Se a varivel cad no contiver o caractere \0:
printf continuar escrevendo todos os caracteres encontrados pela frente, invadindo locais reservados para outras finalidades, at encontrar um byte que contenha \0
Funo scanf :
O formato %s procura no buffer do teclado o primeiro caractere diferente do espao em branco, do enter e da tabulao
Ao encontr-lo, scanf passa a transportar para a varivel alvo da leitura todos os caracteres do buffer, at encontrar um caractere espao em branco, um enter ou uma tabulao
Da, em vez de transportar o espao em branco, a tabulao ou o enter, scanf coloca na varivel o finalizador \0, encerrando a leitura para essa varivel
Exemplo: seja o seguinte trecho de programa:
char cad[20], c;scanf ("%s%c", cad, &c);printf ("\ncadeia lida:%s; caractere lido:%d", cad, c);
Se o operador digitar ABCDE FGHASCII ( ) = 32Se o operador digitar 4 espaos e o enter: o buffer se esvaziar e o computador ficar esperando nova digitao encerrada por enterNo usar &cad
O nome de uma varivel indexada por si s um endereo (cf. ponteiros)
Cuidado: na leitura de uma varivel cadeia de caracteres, o nmero de caracteres digitados no deve exceder o espao reservado para ela
Exemplo experimental