Capítulo VI – Variáveis Indexadas

Download Capítulo  VI – Variáveis Indexadas

Post on 08-Jan-2016

31 views

Category:

Documents

3 download

Embed Size (px)

DESCRIPTION

Captulo VI Variveis Indexadas. 6.1 A necessidade de variveis indexadas 6.2 Vetores e matrizes 6.3 Aplicaes com vetores numricos 6.4 Aplicaes com matrizes numricas 6.5 Cadeias de caracteres 6.6 Aplicaes com vetores de cadeias de caracteres. - PowerPoint PPT Presentation

TRANSCRIPT

  • 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: seja o seguinte trecho de programa:char a, b, c, d, cad[5]; int i;printf ("Digite uma cadeia de caracteres:\n\n");scanf ("%s", cad);printf ("\ncadeia lida:%s", cad);printf ("\n\na=%d; b=%c; c=%c; d=%c;\n", a, b, c, d);for (i = 0; i

  • char a, b, c, d, cad[5]; int i;printf ("Digite uma cadeia de caracteres:\n\n");scanf ("%s", cad);printf ("\ncadeia lida:%s", cad);printf ("\n\na=%d; b=%c; c=%c; d=%c;", a, b, c, d);for (i = 0; i
  • Funo gets :

    A funo scanf usando o formato %s encerra a leitura de uma cadeia quando encontra um espao em branco

    Ento, cadeias contendo espaos em branco no podem ser lidas por ela

    No entanto, o arquivo stdio.h da biblioteca de C tem a funo gets que resolve esse problema

    Ela recebe como argumento a varivel do tipo cadeia para a qual se deseja fazer a leitura

    Seu retorno, que no momento no tem relevncia, um ponteiro (assunto a ser estudado em captulo especfico)

  • #include #include typedef char cadeia[50];int main ( ) {int i, n; cadeia frases [10];printf ("Numero de frases (ate 10): ");scanf ("%d", &n);printf ("\n");for (i = 0; i
  • #include #include typedef char cadeia[50];int main ( ) {int i, n; cadeia frases [10];printf ("Numero de frases (ate 10): ");scanf ("%d", &n);printf ("\n");for (i = 0; i

  • Funo fgets :

    uma verso da funo gets, s que para leitura em arquivos

    Pertence ao arquivo stdio.h da biblioteca de C

    Chamada de fgets:

    fgets (cad, expr, filein);

    cad: varivel cadeia para a qual se deseja fazer a leiturafilein: varivel FILE de onde fazer a leituraexpr: a funo para de ler quando interar expr-1 caracteres lidos ou quando encontrar enter

    Quando lido o enter, ele colocado em cad antes do \0

  • #include #include #include typedef char cadeia[50];int main ( ) {int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r");fscanf (filein, "%d", &n);for (i = 0; i
  • #include #include #include typedef char cadeia[50];int main ( ) {int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r");fscanf (filein, "%d", &n);for (i = 0; i
  • #include #include #include typedef char cadeia[50];int main ( ) {int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r");fscanf (filein, "%d", &n);for (i = 0; i
  • 6.5.3 Funes para converso de cadeias de caracteres

    Funo atoi (ASCII to int): converte uma cadeia de caracteres no inteiro correspondente

    Funo atof (ASCII to float): converte uma cadeia de caracteres no real correspondente

    Funo itoa (int to ASCII): converte um inteiro numa cadeia de caracteres correspondente, especificada a base numrica para a escrita

  • Funo atoi: converte uma cadeia de caracteres no inteiro correspondente:

    #include #include typedef char cadeia[50];int main ( ) {int i; char c; cadeia cad;printf ("Converter cadeia em inteiro? (s/n): "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); i = atoi (cad);printf ("\tatoi (\"%s\") = %d", cad, i);printf ("\n\nConverter cadeia em inteiro? (s/n): "); scanf (" %c", &c); }printf ("\n\n"); system ("pause"); return 0;}

    Exemplo: seja o seguinte programaConverter cadeia em inteiro? (s/n): s

    Digite a cadeia: 728391 atoi ("728391") = 728391

    Converter cadeia em inteiro? (s/n): s

    Digite a cadeia: pe182 atoi ("pe182") = 0

    Converter cadeia em inteiro? (s/n): s

    Digite a cadeia: 625xyz atoi ("625xyz") = 625

    Converter cadeia em inteiro? (s/n): nResultado de uma execuo

  • Funo atof: converte uma cadeia de caracteres no real correspondente:

    #include #include typedef char cadeia[50];int main ( ) {float x; char c; cadeia cad;printf ("Converter cadeia em real? (s/n): "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); x = atof (cad);printf ("\tatof (\"%s\") = %lf", cad, x);printf ("\n\nConverter cadeia em real? (s/n): "); scanf (" %c", &c); }printf ("\n\n"); system ("pause"); return 0;}Exemplo: seja o seguinte programaConverter cadeia em real? (s/n): s

    Digite a cadeia: 52.1753 atof ("52.1753") = 52.1753

    Converter cadeia em real? (s/n): s

    Digite a cadeia: 167.23e32 atof ("167.23e32") = 1.6723e+34

    Converter cadeia em real? (s/n): s

    Digite a cadeia: 0.0012e-15 atof ("0.0012e-15") = 1.2e-18

    Converter cadeia em real? (s/n): nResultado de uma execuo

  • Funo itoa: converte um inteiro numa cadeia de caracteres correspondente, especificada a base numrica para a escrita:

    #include #include typedef char cadeia[50];int main ( ) {int i, base; char c; cadeia cad;printf ("Converter inteiro em cadeia? (s/n): "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("\n\tDigite o int e a base: "); scanf ("%d%d", &i, &base); itoa(i, cad, base);printf ("\t(%d)10 = (\"%s\")%d", i, cad, base);printf ("\n\nConverter inteiro em cadeia? (s/n): "); scanf (" %c", &c);}printf ("\n\n"); system ("pause"); return 0;}Exemplo: seja o seguinte programaConverter inteiro em cadeia? (s/n): s

    Digite o int e a base: 2561 10 (2561)10 = ("2561")10

    Converter inteiro em cadeia? (s/n): s

    Digite o int e a base: 87 8 (87)10 = ("127")8

    Converter inteiro em cadeia? (s/n): s

    Digite o int e a base: 2871936 16 (2871936)10 = ("2bd280")16

    Converter inteiro em cadeia? (s/n): nResultado de uma execuo

  • 6.5.4 Funes para manipulao de cadeias de caracteres

    Funo strlen (string length): nmero de caracteres de uma cadeia

    Funo strcat (string concatenation): concatena 2 cadeias de caracteres

    Funo strcmp (string comparision): compara lexicograficamente 2 cadeias de caracteres

    Funo strcpy (string copy): copia o contedo de uma cadeia de caracteres em outra

    As 4 funes pertencem ao arquivo string.h da biblioteca

  • Funo strlen:

    Seu argumento uma cadeia de caracteres

    Retorna o nmero de caracteres de seu argumento, sem contabilizar o finalizador \0

    A seguir, modificao do programa das frases digitadas, com a contagem dos caracteres de cada uma

  • #include #include #include typedef char cadeia[50];int main ( ) {int i, n; cadeia frases [10];printf ("Numero de frases (ate 10): "); scanf ("%d", &n);printf ("\n");for (i...

Recommended

View more >