Capítulo VI – Variáveis Indexadas

Slides:



Advertisements
Apresentações semelhantes
Melhoramento de Imagens
Advertisements

Usando o botões de comando, label e textbox
Algoritmos em Grafos Celso C. Ribeiro Caroline T. Rocha.
PROGRESSÃO ARITMÉTICA P.A.
MATLAB 6 OTÍLIA GEROTTO R12. O que é o Matlab? - MATLAB (Matrix Laboratory) – software p/ cálculo numérico e científico de visualização de alta performance.
Introdução a Resolução Numérica de Equações Diferenciais Ordinárias
FORTRAN 90 Denise Yumi Takamura.
SQL Procedural Junho/2006.
Funções de Linha 24/04/06. Funções de Linha Gerar ou construir novo valor não existente na tabela inicial. Valor construído a partir de dados de uma ou.
 MORAL DA HISTÓRIA?? Nesse caso, os e - de maior  contribuição importante   pressão do gás; é a chamada PRESSÃO DE DEGENERESCÊNCIA. ►►
VI: EQUILÍBRIO RADIATIVO
Arquiteturas de 4, 3, 2, 1 e 0 endereços.
Utilização do montador Daedalus
Teste Funcional de Software
Análise e Solução de Problemas
Algoritmos com Seleção
Objetivo Receber propriedades rurais georreferenciadas e analisar a situação da Reserva Legal - RL, das áreas de Preservação Permanente - APP e das áreas.
Técnicas de Processamento Imagens
Pesquisa Operacional Modelos, Conceitos Básicos para PL
Geração de Código Otimizações independentes de máquina.
Banco de Dados I Profa. Jiani Cardoso 2/2005
HAND: Height Above the Nearest Drainage
Técnicas de Amostragem
CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica.
Capítulo VII – Tipos Enumerativos e Estruturas 7.1 – Tipos enumerativos 7.2 – A necessidade de estruturas 7.3 – Manipulação dos campos de uma estrutura.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo III Comandos de Controle.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013
1.3 – Interpretadores – Compiladores versus Interpretadores
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VII Tipos Enumerativos e Estruturas.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo VII Variáveis Indexadas Numéricas.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo XI Noções de Estruturas de Dados.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo XI Encadeamento de Estruturas por Ponteiros.
Capítulo IX – Ponteiros 9.1 – Introdução 9.2 – Relação entre ponteiros e variáveis indexadas 9.3 – Alocação dinâmica de memória 9.4 – Variáveis indexadas,
Exemplo: ordenação de uma lista pelo Selection-Sort:
Capítulo V Análise Sintática
1 Definição de Dicionário Dicionário é um sistema de informações: Equivalente a um conjunto de elementos não repetidos Equivalente a um conjunto de elementos.
ESTA TELA, QUANDO ESTA CARREGANDO O ARQUIVO, NÃO GOSTARIA QUE APARECESSE ESSES EFEITOS PARECIDO COM ESTRELINHA...GOSTARIA QUE A TELA FOSSE DA SEGUINTE.
Função Gráficos. Domínio e imagem no gráfico.
Probabilidade e Esperança Condicional
Intervalos de confiança Sejam X 1, X 2, …, X n i.i.d. com distribuição F. Um intervalo de confiança de nível 1– para é um par de estatísticas [T 1 (X),
Variáveis Aleatórias Uma variável aleatória associa um número real a cada resultado de um experimento aleatório. Mais precisamente…
Esperança Idéia: a esperança (ou valor esperado) de uma v.a. é o valor médio que se espera obter ao se repetir um experimento aleatório um grande número.
Estatística Dados valores (amostras) de variáveis aleatórias X 1, X 2,..., X n, cuja distribuição conjunta é desconhecida, inferir propriedades desta distribuição.
Curso Técnico em Informática La Salle - Canoas
5W1H.
FERRAMENTAS DE CRIATIVIDADE
Missão Visão Valores.
GERAÇÃO DE DIVERSIDADE DE ANTICORPOS
TÉCNICAS DE CODIFICAÇÃO DE SINAIS
TE 043 CIRCUITOS DE RÁDIO-FREQÜÊNCIA
4. Parâmetros de Espalhamento
TE 043 CIRCUITOS DE RÁDIO-FREQÜÊNCIA
Aritmética de ponto flutuante Erros
Sistemas Lineares Parte 2
Resolução de Sistemas Lineares- Parte 1
Desempenho A rápida taxa de melhoria na tecnologia de computadores veio em decorrência de dois fatores: avanços na tecnologia utilizada na construção.
Tecnologia para Web JavaScript Enrique Pimentel Leite de Oliveira
Marco Antonio Montebello Júnior
The Data Warehouse Toolkit
Frações Professor: Graciano Pianezzer Beletti.
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
Curso de Programação em C++
Sistemas de Informação Prof. Me. Everton C. Tetila Modelo de dados relacional Banco de Dados I.
Robótica: Sistemas Sensorial e Motor
Computação Gráfica Geometria de Transformações
1 Seja o resultado de um experimento aleatório. Suponha que uma forma de onda é associada a cada resultado.A coleção de tais formas de ondas formam um.
8. Uma Função de duas Variáveis Aleatórias
Exercícios de revisão.

Transcrição da apresentação:

Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres

6.4 – Aplicações com Matrizes Numéricas 6.4.1 – Transformar uma matriz quadrada em sua transposta Matriz transposta de uma matriz quadrada é aquela cujas linhas são as colunas da matriz original e cujas colunas são as linhas da mesma

Matriz quadrada 5 x 5 original Matriz transposta da original 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 A Matriz quadrada 5 x 5 original Matriz transposta da original Escrevendo cada coluna numa linha da tela

A Operação básica para a transformação: Trocar A[i][j] com A[j][i] Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A

A Operação básica para a transformação: Trocar A[i][j] com A[j][i] Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A aux 14

A Operação básica para a transformação: Trocar A[i][j] com A[j][i] Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 18 15 16 17 19 20 21 22 23 24 25 A aux 14

A Operação básica para a transformação: Trocar A[i][j] com A[j][i] Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 18 15 16 17 14 19 20 21 22 23 24 25 A Trocar (A[i][j], A[j][i]): aux = A[i][j]; A[i][j] = A[j][i]; A[j][i] = aux; aux 14

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Para transformar toda a matriz: Percorrê-la com 2 cursores ‘i’ e ‘j’ e Trocar (A[i][j], A[j][i]) O percurso não pode abranger toda a matriz!!! Porquê??? A 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 matriz Quando (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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Deve-se planejar o percurso de ‘i’ e de ‘j’ Para começar, a diagonal principal não precisa ser percorrida A parte acima dessa diagonal deve ser trocada com a parte abaixo dela A

Variação de j 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 i vai de 0 até n-2 j vai de i+1 até n-1 Variação de i A Os comandos: for (i = 0; i <= n-2; i++) for (j = i+1; j <= n-1; j++) Trocar (A[i][j], A[j][i]); percorrem a parte acima da diagonal principal e fazem a troca desejada A seguir um programa completo

#include <stdio.h> #include <conio.h> void 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 <= n-1; i++) for (j = 0; j <= n-1; j++) scanf ("%d", &A[i][j]); printf ("\nMatriz original:\n\n"); for (i = 0; i <= n-1; i++) { for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]); printf ("\n"); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A

/* Transformacao da matriz em sua transposta e sua escrita */ for (i = 0; i <= n-2; i++) { for (j = i+1; j <= n-1; j++) { aux = A[i][j]; A[i][j] = A[j][i]; A[j][i] = aux; } printf ("\nMatriz transposta:\n\n"); for (i = 0; i <= n-1; i++) { for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]); printf ("\n"); printf ("\n\nDigite algo para encerrar: "); getch (); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A

6.4.2 – Síntese de sub-matrizes Muito usada em processamento de imagens – p. ex., para o controle de desmatamento numa região Dados captados pela câmera de um satélite são armazenados numa imensa matriz bidimensional, para serem usados na confecção de fotografias Tipicamente uma foto é constituída de uma matriz de pontos, de dimensões bem menores que as da matriz preenchida pela câmera Então cada ponto da foto deve conter uma síntese das informações contidas numa sub-matriz da primeira matriz

A seguir, o desenvolvimento de um programa para sintetizar o conteúdo das sub-matrizes de uma grande matriz B em elementos de outra matriz A bem menor que a primeira Dimensões: B(20 x 20) e A(5 x 5) A síntese consiste na média aritmética dos elementos de cada sub-matriz de B Sendo inteiros os elementos de B, então os de A devem ser reais A seguir, um conteúdo possível para a matriz B e o conteúdo 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 Cálculo de A[i][j]: aux = 0; for (x = 4*i; x <= 4*i + 3; x++) for (y = 4*j; y <= 4*j + 3; y++) aux += B[x][y]; A[i][j] = aux/16;

Cálculo de toda a matriz A: Cálculo de A[i][j]: aux = 0; for (x = 4*i; x <= 4*i + 3; x++) for (y = 4*j; y <= 4*j + 3; y++) aux += B[x][y]; A[i][j] = aux/16; Cálculo de toda a matriz A: for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) Cálculo de A[i][j]; A seguir um programa completo

#include <stdio.h> #include <conio.h> void 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): "); c = getche (); 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 vídeo Não é 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 <= 4*i + 3; x++) for (y = 4*j; y <= 4*j + 3; y++) aux += B[x][y]; A[i][j] = aux/16; }

/* Escrita da matriz A(5 x 5) no video */ printf ("\n\nMatriz reduzida? (s/n): "); c = getche (); 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\nDigite algo para encerrar: "); getch ();

Exercícios 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 dimensões 5 x 8: Fazer um programa que leia 2 inteiros positivos m e n e em seguida construa e escreva no vídeo uma matriz ziguezague de dimensões m x n

As seguintes matrizes têm o apelido de matrizes-cebolas de dimensões (6 x 7) e (8 x 5): Fazer um programa para ler m e n e construir uma matriz-cebola de dimensões m e n

As seguintes matrizes têm o apelido de matrizes-espirais de dimensões 5 e 6: Fazer um programa para ler n e construir uma matriz-espiral de dimensão n e

Fazer um programa para ler o valor de uma variável inteira n, os valores dos elementos reais de uma matriz A triangular superior de dimensões (n x n) e de um vetor B de dimensão n, e resolver o seguinte sistema:

Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres

6.5 – Cadeias de Caracteres 6.5.1 – Cadeias de caracteres como variáveis e constantes Vetores de caracteres são denominados cadeias de caracteres (strings, em Inglês) Podem ser manipulados de forma diferenciada em relação aos vetores numéricos, pela maioria das linguagens de programação Tudo começa pela existência de constantes do tipo cadeia de caracteres, mas não de constantes vetores numéricos

‘a’, ‘b’, ‘c’, ‘ ’, ‘D’, ‘E’, ‘F’ e ‘\0’ Constante cadeia de caracteres é uma sequência de caracteres delimitada por aspas (“”), como por exemplo: “abc DEF” Os componentes dessa constante são os caracteres da sequência, sem as aspas, e mais o caractere ‘\0’, que é o finalizador da cadeia Então, os caracteres componentes da constante anterior são: ‘a’, ‘b’, ‘c’, ‘ ’, ‘D’, ‘E’, ‘F’ e ‘\0’

Mas a declaração com inicialização pode ser feita da seguinte maneira: A declaração sem inicialização de uma variável cadeia de caracteres pode ser feita da mesma forma que a de vetores numéricos Exemplo: char cad[30]; Mas a declaração com inicialização 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’};

cad[0], cad[1], cad[2], cad[3], cad[4] e cad[5] char cad[] = “ABCDE”; Esta declaração reserva espaço na memória 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’ Representação gráfica: ‘A’ ‘B’ 1 ‘C’ 2 ‘D’ 3 ‘E’ 4 ‘\0’ 5 cad

Exemplos: cad[3] = ‘b’; y = cad[i+1]; Tal como em vetores numéricos, os elementos de uma cadeia de caracteres podem ser referenciados individualmente Exemplos: cad[3] = ‘b’; y = cad[i+1]; A seguinte atribuição não é permitida: cad = “xyzwt”; Porém, 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 funções printf e scanf para fazer escrita e leitura de valores de variáveis do tipo cadeia de caracteres Função printf: O formato “%s” faz com que os caracteres da variável sejam escritos na tela até que o caractere ‘\0’ seja encontrado, não sendo ele escrito Por exemplo, os comandos: char cad[10] = “ABCDE”; printf (“%s”, cad); escreverão na tela: ABCDE

Se a variável cad não 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’ ‘A’ ‘B’ 1 ‘C’ 2 ‘D’ 3 ‘E’ 4 ‘F’ 5 cad

Função scanf : O formato “%s” procura no buffer do teclado o primeiro caractere diferente do espaço em branco, do ‘enter’ e da tabulação Ao encontrá-lo, scanf passa a transportar para a variável alvo da leitura todos os caracteres do buffer, até encontrar um caractere espaço em branco, um ‘enter’ ou uma tabulação Daí, ao invés de transportar o espaço em branco, a tabulação ou o ‘enter’, scanf coloca na variável o finalizador ‘\0’, encerrando a leitura para essa variável

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 Não usar &cad O nome de uma variável indexada é por si só um endereço (cf. ponteiros) Se o operador digitar 4 espaços e o ‘enter’: o buffer se esvaziará e o computador ficará esperando nova digitação encerrada por ‘enter’ ‘A’‘B’‘C’‘D’‘E’‘\0’ . . . . . cad ABCDE FGH<enter> ‘ ’ c FGH<enter> Sobra do buffer do teclado ABCDE FGH cadeia lida:ABCDE; caractere lido:32 No vídeo ASCII (‘ ’) = 32

Exemplo experimental: seja o seguinte trecho de programa: Cuidado: na leitura de uma variável cadeia de caracteres, o número de caracteres digitados não deve exceder o espaço 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 <= 4; i++) printf ("\n\tcad[%d] = %c", i, cad[i]); abcdefghi<enter> Cadeia digitada

Cadeia digitada Resultado no vídeo erro de execução!!! 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 <= 4; i++) printf ("\n\tcad[%d] = %c", i, cad[i]); abcdefghi<enter> Cadeia digitada ‘b’ ‘c’ ‘d’ ‘e’ ‘i’ ‘a’ cad ‘f’ d ‘g’ c ‘h’ b ‘\0’ a Digite uma cadeia de caracteres: abcdefghi cadeia lida:abcdefghi a=0; b=h; c=g; d=f; cad[0] = a cad[1] = b cad[2] = c cad[3] = d cad[4] = e Resultado no vídeo Alocação das variáveis na memória, pelo compilador Digitando uma sequência maior de caracteres: erro de execução!!!

Função gets : A função scanf usando o formato %s encerra a leitura de uma cadeia quando encontra um espaço em branco Então, cadeias contendo espaços em branco não podem ser lidas por ela No entanto, o arquivo stdio.h da biblioteca de C tem a função gets que resolve esse problema Ela recebe como argumento a variável do tipo cadeia para a qual se deseja fazer a leitura Seu retorno, que no momento não tem relevância, é um ponteiro (assunto a ser estudado em capítulo específico)

Exemplo: um programa com gets #include <stdio.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, n; cadeia frases [10]; printf ("Numero de frases (ate 10): "); scanf ("%d", &n); printf ("\n"); for (i = 0; i <= n-1; i++) { printf ("Digite a %da frase: ", i+1); fflush (stdin); gets (frases[i]); } printf ("\nListagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("%d) %s\n", i+1, frases[i]); printf ("\n\nDigite algo para encerrar"); getch (); Exemplo: um programa com gets Tipo cadeia: para variáveis cadeias de 50 caracteres Variável ‘frases’: vetor de cadeias ou matriz de caracteres A função ‘fflush’ esvazia o buffer do teclado antes da chamada de ‘gets’ Numeração na tela a partir de 1

#include <stdio.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, n; cadeia frases [10]; printf ("Numero de frases (ate 10): "); scanf ("%d", &n); printf ("\n"); for (i = 0; i <= n-1; i++) { printf ("Digite a %da frase: ", i+1); fflush (stdin); gets (frases[i]); } printf ("\nListagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("%d) %s\n", i+1, frases[i]); printf ("\n\nDigite algo para encerrar"); getch (); Resultado de uma execução: Numero de frases (ate 10): 4 Digite a 1a frase: Gosto muito de Computacao! Digite a 2a frase: A Linguagem C eh fantastica! Digite a 3a frase: Programar eh Engenharia! Digite a 4a frase: Engenheiros devem saber algoritmos! Listagem das frases: 1) Gosto muito de Computacao! 2) A Linguagem C eh fantastica! 3) Programar eh Engenharia! 4) Engenheiros devem saber algoritmos! Digite algo para encerrar

fgets (cad, expr, filein); Função fgets : É uma versão da função gets, só que para leitura em arquivos Pertence ao arquivo stdio.h da biblioteca de C Chamada de fgets: fgets (cad, expr, filein); cad: variável cadeia para a qual se deseja fazer a leitura filein: variável FILE de onde fazer a leitura expr: a função para de ler quando interar expr-1 caracteres lidos ou quando encontrar ‘enter’ Quando lido o ‘enter’, ele é colocado em cad antes do ‘\0’

Exemplo: um programa com fgets #include <stdio.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r"); fscanf (filein, "%d", &n); for (i = 0; i <= n-1; i++) { fscanf (filein, "%d", &Num[i]); fgets (frases[i], 49, filein); } printf ("Listagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("\n%d %s\n\tComprimento: %d\n", Num[i], frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); Exemplo: um programa com fgets No arquivo, há um número a ser lido, antes de cada frase Serão lidos no máximo 48 caracteres Para conferir o número de caracteres lidos

#include <stdio.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r"); fscanf (filein, "%d", &n); for (i = 0; i <= n-1; i++) { fscanf (filein, "%d", &Num[i]); fgets (frases[i], 50, filein); } printf ("Listagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("\n%d %s\n\tComprimento: %d\n", Num[i], frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); 4 1Gosto muito de Computacao! 2A Linguagem C eh fantastica! 3Programar eh Engenharia! 4Engenheiros devem saber algoritmos! Conteúdo do arquivo ‘filefrases’ Não há espaço entre o número inicial e a frase Se houvesse, ele seria lido para a frase

#include <stdio.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r"); fscanf (filein, "%d", &n); for (i = 0; i <= n-1; i++) { fscanf (filein, "%d", &Num[i]); fgets (frases[i], 50, filein); } printf ("Listagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("\n%d %s\n\tComprimento: %d\n", Num[i], frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); Listagem das frases: 1 Gosto muito de Computacao! Comprimento: 27 2 A Linguagem C eh fantastica! Comprimento: 29 3 Programar eh Engenharia! Comprimento: 25 4 Engenheiros devem saber algoritmos! Comprimento: 36 Digite algo para encerrar Resultado no vídeo O ‘enter’ no final é escrito e contado pelo strlen

6.5.3 – Funções para conversão de cadeias de caracteres Função atoi (ASCII to int): converte uma cadeia de caracteres no inteiro correspondente Função atof (ASCII to float): converte uma cadeia de caracteres no real correspondente Função itoa (int to ASCII): converte um inteiro numa cadeia de caracteres correspondente, especificada a base numérica para a escrita

Função atoi: converte uma cadeia de caracteres no inteiro correspondente: #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i; char c; cadeia cad; printf ("Converter cadeia em inteiro? (s/n): "); c = getche (); while (c == 's' || c == 'S') { printf ("\n\n\tDigite a cadeia: "); scanf ("%s", cad); i = atoi (cad); printf ("\tatoi (\"%s\") = %d", cad, i); printf ("\n\nConverter cadeia em inteiro? (s/n): "); c = getche (); } Converter cadeia em inteiro? (s/n): s Digite a cadeia: 728391 atoi ("728391") = 728391 Digite a cadeia: pe182 atoi ("pe182") = 0 Digite a cadeia: 625xyz atoi ("625xyz") = 625 Converter cadeia em inteiro? (s/n): n Resultado de uma execução Exemplo: seja o seguinte programa

Função atof: converte uma cadeia de caracteres no real correspondente: #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { float x; char c; cadeia cad; printf ("Converter cadeia em real? (s/n): "); c = getche (); while (c == 's' || c == 'S') { printf ("\n\n\tDigite a cadeia: "); scanf ("%s", cad); x = atof (cad); printf ("\tatof (\"%s\") = %g", cad, x); printf ("\n\nConverter cadeia em real? (s/n): "); c = getche (); } Converter cadeia em real? (s/n): s Digite a cadeia: 52.1753 atof ("52.1753") = 52.1753 Digite a cadeia: 167.23e32 atof ("167.23e32") = 1.6723e+34 Digite a cadeia: 0.0012e-15 atof ("0.0012e-15") = 1.2e-18 Converter cadeia em real? (s/n): n Resultado de uma execução Exemplo: seja o seguinte programa

Função itoa: converte um inteiro numa cadeia de caracteres correspondente, especificada a base numérica para a escrita: #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, base; char c; cadeia cad; printf ("Converter inteiro em cadeia? (s/n): "); c = getche (); while (c == 's' || c == 'S') { printf ("\n\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): "); c = getche (); } Converter inteiro em cadeia? (s/n): s Digite o int e a base: 2561 10 (2561)10 = ("2561")10 Digite o int e a base: 87 8 (87)10 = ("127")8 Digite o int e a base: 2871936 16 (2871936)10 = ("2bd280")16 Converter inteiro em cadeia? (s/n): n Resultado de uma execução Exemplo: seja o seguinte programa

6.5.4 – Funções para manipulação de cadeias de caracteres Função strlen (string length): número de caracteres de uma cadeia Função strcat (string concatenation): concatena 2 cadeias de caracteres Função strcmp (string comparision): compara lexicograficamente 2 cadeias de caracteres Função strcpy (string copy): copia o conteúdo de uma cadeia de caracteres em outra As 4 funções pertencem ao arquivo string.h da biblioteca

Função strlen: Seu argumento é uma cadeia de caracteres Retorna o número de caracteres de seu argumento, sem contabilizar o finalizador ‘\0’ A seguir, modificação do programa das frases digitadas, com a contagem dos caracteres de cada uma

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, n; cadeia frases [10]; printf ("Numero de frases (ate 10): "); scanf ("%d", &n); printf ("\n"); for (i = 0; i <= n-1; i++) { printf ("Digite a %da frase: ", i+1); fflush (stdin); gets (frases[i]); } printf ("\nListagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("%d) %s\n\t%d caracteres\n", i+1, frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); Listagem das frases: 1) Gosto muito de Computação! 26 caracteres 2) A Linguagem C eh fantastica! 28 caracteres 3) Programar eh Engenharia! 24 caracteres 4) Engenheiros devem saber algoritmos! 35 caracteres

Faz a concatenação de 2 cadeias recebidas como argumentos Função strcat: Faz a concatenação de 2 cadeias recebidas como argumentos Ela concatena o segundo argumento no primeiro O primeiro argumento deve ser uma variável cadeia de caracteres O segundo argumento deve ser uma variável ou uma constante do mesmo tipo Depois de executada a função, o primeiro argumento guardará a concatenação e o segundo permanecerá inalterado Ver o programa a seguir

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { cadeia cad1, cad2; printf ("Digite uma cadeia: "); gets (cad1); printf ("Digite outra cadeia: "); gets (cad2); printf ("\nAntes da Concatenacao:"); printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2); strcat (cad1, cad2); printf ("\n\nDepois de strcat (cad1, cad2):"); strcat (cad1, "ijk"); printf ("\n\nDepois de strcat (cad1, \"ijk\"):"); printf ("\n\nDigite algo para encerrar: "); getch (); } Digite uma cadeia: abcde Digite outra cadeia: fgh Antes da Concatenacao: cad1: abcde cad2: fgh Depois de strcat (cad1, cad2): cad1: abcdefgh Depois de strcat (cad1, "ijk"): cad1: abcdefghijk Digite algo para encerrar:

Compara lexicograficamente 2 cadeias recebidas como argumentos Função strcmp: Compara lexicograficamente 2 cadeias recebidas como argumentos Os 2 argumentos podem ser variáveis ou constantes do tipo cadeia de caracteres ‘strcmp’ retorna um valor inteiro menor, igual ou maior que zero, dependendo do primeiro argumento ser menor, igual ou maior que o segundo Ver o programa a seguir

A seguir, o resultado de uma execução #include <stdio.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { cadeia cad1, cad2; char c; printf ("Comparar cadeias? (s/n): "); do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N'); while (c == 's' || c == 'S') { printf ("\n\nDigite as cadeias: "); scanf ("%s%s", cad1, cad2); if (strcmp (cad1, cad2) < 0) printf ("\n\t%s eh lexicograficamente menor que %s", cad1, cad2); else if (strcmp (cad1, cad2) == 0) printf ("\n\t%s eh lexicograficamente igual a %s", cad1, cad2); else printf ("\n\t%s eh lexicograficamente maior que %s", cad1, cad2); printf ("\n\nComparar mais cadeias? (s/n): "); } A seguir, o resultado de uma execução

Comparar cadeias? (s/n): s Digite as cadeias: Alfredo Maria Alfredo eh lexicograficamente menor que Maria Comparar mais cadeias? (s/n): s Digite as cadeias: Carlos Carlos Carlos eh lexicograficamente igual a Carlos Digite as cadeias: Fausto Bianca Fausto eh lexicograficamente maior que Bianca Digite as cadeias: Nivaldo nivaldo Nivaldo eh lexicograficamente menor que nivaldo Comparar mais cadeias? (s/n): n

O primeiro argumento deve ser uma variável cadeia de caracteres Função strcpy: Recebendo duas cadeias como argumentos, strcpy copia a segunda para a primeira O primeiro argumento deve ser uma variável cadeia de caracteres O segundo argumento deve ser uma variável ou uma constante do mesmo tipo Depois de executada a função, o primeiro argumento guardará uma cópia do segundo e esse último permanecerá inalterado Ver o programa a seguir

Resultado de uma execução #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { cadeia cad1, cad2; printf ("Digite uma cadeia para cad2: "); gets (cad2); strcpy (cad1, cad2); printf ("\nDepois da Copia de cad2 para cad1:"); printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2); strcpy (cad2, "xyz"); printf ("\n\nDepois da Copia de \"xyz\" para cad2:"); printf ("\n\nDigite algo para encerrar"); getch (); } Digite uma cadeia para cad2: abcde Depois da Copia de cad2 para cad1: cad1: abcde cad2: abcde Depois da Copia de "xyz" para cad2: cad2: xyz Digite algo para encerrar Resultado de uma execução

Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres

6.6 – Aplicações com Vetores de Cadeias de Caracteres 6.6.1 – Bubble-sort para vetores de nomes O programa do Bubble-Sort para vetores numéricos pode ser adaptado para ordenar vetores de cadeias de caracteres Os elementos do vetor devem ser nomes (cadeias de caracteres) A leitura e a escrita dos elementos utilizam o formato %s A comparação de dois nomes é feita com a função strcmp e as atribuições entre elementos são feitas pela função strcpy

Programa do Bubble-Sort para nomes #include <stdio.h> #include <string.h> #include <conio.h> /* Criacao do tipo logic e suas constantes */ typedef char logic; const logic false = 0, true = 1; /* Criacao do tipo nome */ typedef char nome[15]; /* Cabecalho e declarações locais */ void main () { int n, i, p; logic trocou; nome V[50], aux; Programa do Bubble-Sort para nomes

/* Leitura do vetor de nomes a ser ordenado */ printf ("Ordenacao de nomes pelo Bubble-Sort\n\n"); printf ("\tNumero de nomes do vetor: "); scanf ("%d",&n); printf ("\n\tNomes: "); for (i = 0; i < n; i++) scanf("%s", V[i]); /* Escrita do vetor desordenado */ printf ("\n\nVetor desordenado:\n"); for (i = 0; i < n; i++) printf("\n%s", V[i]);

/* Aplicação do metodo bubble-sort */ for (trocou = true, p = n-2; p >= 0 && trocou == true; p--) { for (trocou = false, i = 0; i <= p; i++) if (strcmp(V[i], V[i+1]) > 0) { strcpy(aux, V[i]); strcpy(V[i], V[i+1]); strcpy(V[i+1], aux); trocou = true; } /* Escrita do vetor ordenado */ printf ("\n\nVetor ordenado:\n"); for (i = 0; i < n; i++) printf("\n%s", V[i]); /* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch ();

6.6.2 – Procura binária em vetores de nomes O programa da Procura Binária para vetores numéricos pode ser adaptado para procurar nomes em vetores de nomes Os elementos do vetor devem ser nomes (cadeias de caracteres) O elemento a ser procurado deve ser um nome A comparação do nome procurado com os elementos do vetor é feita com a função strcmp A seguir, um programa da procura binária para nomes

/* Diretivas de preprocessamanto e declaracoes */ #include <stdio.h> #include <conio.h> #include <string.h> typedef char logic; const logic false = 0, true = 1; typedef char nome[15]; void main () { int n, i, inf, sup, med; nome V[50], nome; logic achou, erro; char c;

/* Leitura dos elementos do vetor */ printf ("PROCURA BINARIA EM VETORES DE NOMES\n\n"); printf ("Numero de nomes do vetor: "); scanf ("%d", &n); printf ("\nNomes: "); for (i = 0; i < n; i++) scanf ("%s", V[i]); /* Verificacao da ordenacao do vetor */ for (i = 0, erro = false; i < n-1 && erro == false; i++) if (strcmp(V[i], V[i+1]) > 0) erro = true; if (erro == true) printf ("\n\tRelacao desordenada: nao havera procuras\n");

/* Secao de procuras */ else { clrscr (); printf ("Secao de Procuras:\n\n"); printf ("Procurar nome (s/n)?: "); do c = getche(); while (c != 's' && c != 'n' && c != 's' && c != 'n'); while (c == 's' || c == 'S') { printf ("\n\n\tNome: "); scanf ("%s", nome);

/* Procura de um numero no vetor */ achou = false; inf = 0; sup = n - 1; do { med = (inf + sup) / 2; if (strcmp(nome, V[med]) == 0) achou = true; else if (strcmp(nome, V[med]) < 0) sup = med - 1; else inf = med + 1; } while (!achou && inf <= sup);

/* Emissao do resultado da procura */ if (achou) printf ("\n\t%s estah na posicao %d da relacao\n\n", nome, med); else printf ("\n\t%s nao estah na relacao\n\n",nome); printf ("Procurar outro numero (s/n)?: "); do c = getche(); while (c != 's' && c != 'n' && c != 's' && c != 'n'); } /* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch ();

6.6.3 – Limpeza de textos Seja um arquivo-texto contendo cadeias de caracteres imprimíveis separadas umas das outras por um ou vários espaços em brancos e/ou ‘enter’s O programa a seguir produz outro arquivo contendo uma cópia de cada cadeia do primeiro que for uma sequência somente de letras ou somente de dígitos decimais Cadeias contendo simultaneamente letras e dígitos decimais não devem fazer parte do novo arquivo Entre as cadeias do novo arquivo deve haver apenas um espaço

%&() bxnDJk 953481 B 1 123h asdf8 ; ABCDEfg Exemplo: Se o conteúdo do arquivo original textoin.dat for: %&() bxnDJk 953481 B 1 123h asdf8 ; ABCDEfg Então o novo arquivo textout.dat deverá conter: bxnDJk 953481 B 1 ABCDEfg

#include <stdio.h> #include <string.h> #include <ctype.h> /* Declaracao dos tipos e constantes logicas e do tipo cadeia */ typedef char logic; const logic TRUE = 1, FALSE = 0; typedef char cadeia[50]; /* Cabecalho e declaracoes locais */ void main () { int n, i; logic erro; cadeia cad; FILE *fin, *fout;

/* Abertura dos arquivos de entrada e de saida */ fin = fopen ("textoin.dat", "r"); fout = fopen ("textout.dat", "w"); /* Leitura de uma cadeia do arquivo de entrada e teste de fim de arquivo */ while (fscanf(fin, "%s", cad) == 1) { erro = FALSE; /* Se o primeiro caractere da cadeia for letra, os outros tambem devem ser */ if (isalpha (cad[0])) { for (i = 1, n = strlen (cad); i < n && !erro; i++) if (! isalpha (cad[i])) erro = TRUE; }

/* Se o primeiro caractere da cadeia for digito, os outros tambem devem ser */ else if (isdigit (cad[0])) { for (i = 1, n = strlen (cad); i < n && !erro; i++) if (! isdigit (cad[i])) erro = TRUE; } /* Se o primeiro caractere da cadeia nao for letra nem digito: erro */ else erro = TRUE; /* Se nao ha erro na cadeia, escreve-la no arquivo de saida */ if (! erro) fprintf (fout, "%s ", cad);

Exercícios 6.6: Escrever um programa para ler várias cadeias de 16 caracteres encerradas por um enter; para cada cadeia: Encará-la como a representação binária em complemento de 2 de um número inteiro no intervalo [-32768 .. 32767] Verificar se ela é realmente uma tal representação; se for, encontrar e escrever o número correspondente na base 10 (não esquecer que o número pode ser negativo); senão, emitir uma mensagem de erro Calcular e escrever, na base 10, a somatória dos números encontrados Obs.: A cadeia de caracteres estará errada se não tiver exatamente 16 caracteres ou se tiver algum caractere diferente de ‘0’ e de ‘1’.