FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA LINGUAGEM C – VETORES
Revisão Sobre Caracteres Cadeia de Caracteres Vetores Bidimencionais SUMÁRIO Revisão Sobre Caracteres Cadeia de Caracteres Vetores Bidimencionais Declaração de Vetores Bidimencionais Vetores para Funções
Cadeia de Caracteres
REVISÃO SOBRE CARACTERES De forma genérica, tudo o que um computador faz é executar cálculos com números. Ele é incapaz de entender o texto. Portanto, devemos fazer uma escolha: que número utilizaremos para representar a letra "A"? E para os sinais de pontuação, que números usar?
REVISÃO SOBRE CARACTERES Existem diversas convenções (códigos) para fazer a correspondência entre códigos e caracteres. Como exemplo destas convenções podemos citar: ASCII UNICODE UTF-8 LATIN 1 (ISO-8859-1) WIN-1252
REVISÃO SOBRE CARACTERES Um dos mais conhecidos é o código ASCII (American Standard Code for Information Interchange). O ASCII é um código binário (cadeias de bits: 0s e 1s) que codifica um conjunto de 128 sinais, sendo que cada código binário possui 8 bits (equivalente a 1 byte), sendo 7 bits para o propósito de codificação e 1 bit de paridade (detecção de erro).
REVISÃO SOBRE CARACTERES Dos 128 sinais codificados em ASCII: 95 são sinais gráficos (letras do alfabeto latino, sinais de pontuação e sinais matemáticos); E 33 sinais de controle.
REVISÃO SOBRE CARACTERES A seguir são ilustrados 95 sinais gráficos segundo a tabela ASCII:
REVISÃO SOBRE CARACTERES A linguagem C normalmente trata a correspondência entre os caracteres e seus códigos numéricos através da tabela ASCII. E a diferença entre caracteres e inteiros é feita apenas através da maneira pela qual são tratados.
REVISÃO SOBRE CARACTERES Por exemplo, para um mesmo caractere podemos imprimir o mesmo valor de duas formas diferentes usando formatos diferentes. 1. char c = 65; 2. printf("%d %c\n",c,c); // Será impresso na tela o código e // sinal gráfico correspondente, // neste caso a letra ‘A’.
REVISÃO SOBRE CARACTERES A linguagem C permite a escrita de constantes caracteres, a qual é escrita envolvendo o caractere com aspas simples. Assim, a expressão ‘A’ representa uma constante caractere e resulta no valor numérico associado ao caractere ‘A’, no caso 65.
REVISÃO SOBRE CARACTERES O uso de constantes caracteres nos livra de conhecermos os códigos associados a cada caractere. A seguir, o exemplo anterior utilizando este recurso: 1. char c = ‘A’; 2. printf("%d %c\n",c,c); // Será impresso na tela o código e // sinal gráfico correspondente, // neste caso a letra ‘A’.
REVISÃO SOBRE CARACTERES Independente da tabela de códigos numéricos utilizada, garante-se que os dígitos são codificados em seqüência. Deste modo, se o dígito zero tem código 48, o dígito um tem obrigatoriamente código 49, e assim por diante. As letras minúsculas e as letras maiúsculas também formam dois grupos de códigos seqüenciais.
REVISÃO SOBRE CARACTERES Valendo-se desta sequência de caracteres, considere o exemplo a seguir: Escreva uma função para testar se um caractere c é um dígito númerico(um dos caracteres entre '0' e '9').
REVISÃO SOBRE CARACTERES Solução: int digito(char c){ if ((c>='0')&&(c<='9')) return 1; else return 0; }
Cadeia de Caracteres
Cadeia de Caracteres Em C, cadeias de caracteres (strings), são representadas por vetores do tipo char terminadas pelo caractere nulo ('\0'). O código de formato %s da função printf permite imprimir uma cadeia de caracteres. A função printf então recebe um vetor de char e imprime elemento por elemento, até encontrar o caractere nulo.
O código abaixo ilustra a representação de uma cadeia de caracteres: 1. char cidade[4]; 2. cidade[0] = 'R'; 3. cidade[1] = 'i'; 4. cidade[2] = 'o'; 5. cidade[3] = '\0'; 6. printf("%s \n", cidade);
2. cidade[0] = 'R'; 3. cidade[1] = 'i'; 4. cidade[2] = 'o'; Cadeia de Caracteres . 1. char cidade[4]; 2. cidade[0] = 'R'; 3. cidade[1] = 'i'; 4. cidade[2] = 'o'; 5. cidade[3] = '\0'; 6. printf("%s \n", cidade); Se o caractere '\0' não fosse colocado, a função printf executaria de forma errada, pois não conseguiria identificar o final da cadeia
char cidade[ ] = {'R', 'i', 'o', '\0'}; printf("%s \n", cidade); } Cadeia de Caracteres Como as cadeias de caracteres são vetores, podemos reescrever o código acima inicializando os valores dos elementos do vetor na declaração: int main( ){ char cidade[ ] = {'R', 'i', 'o', '\0'}; printf("%s \n", cidade); }
Cadeia de Caracteres A inicialização de cadeias de caracteres é tão comum em códigos C que a linguagem permite que elas sejam inicializadas escrevendo-se os caracteres entre aspas duplas ( “ “ ). 1. char cidade[ ] = "Rio"; 2. printf("%s \n", cidade); /* Neste caso, o caractere nulo é representado implicitamente.*/
REVISÃO SOBRE CARACTERES Outro exemplos: char s1[ ] = ""; /* A variável s1 armazena uma cadeia de caracteres com um único elemento, o caractere '\0‘ */ char s2[ ] = "Rio de Janeiro"; /* A variável s2 representa um vetor com 15 elementos. */ char s3[81]; /* A variável s3 representa uma cadeia de caracteres capaz de representar cadeias com até 80 caracteres, */ char s4[81] = "Rio"; /* A variável s4 também foi dimensionada para armazenar cadeias até 80 caracteres, mas seus primeiros quatro elementos foram atribuídos na declaração. */
REVISÃO SOBRE CARACTERES O uso do especificador %s se limita a função printf, pois quando utilizado na comando scanf, em alguns compiladores tende a pular os eventuais caracteres brancos e capturar a seqüência de caracteres não brancos ou e outros compiladores, tende a cessar a leitura ao encontrar um caractere branco.
REVISÃO SOBRE CARACTERES Por exemplo, em: char cidade[81]; ... scanf("%s", cidade); /* Se o usuário digitar Rio de Janeiro, apenas a palavra Rio será capturada, pois o %s lê somente uma seqüência de caracteres não brancos. */
REVISÃO SOBRE CARACTERES Para capturarmos estes nomes, podemos usar o especificador de formato %[...], no qual listamos entre os colchetes todos os caracteres que aceitaremos na leitura. Assim, ao utilizar este código de formato, a leitura dos dados do teclado cessa quando for informado um caractere diferente do listado entre colchetes.
REVISÃO SOBRE CARACTERES Se o primeiro caractere entre colchetes for o acento circunflexo (^), teremos o efeito inverso (negação). Assim,com o formato "%[^a]" a leitura prossegue enquanto a vogal ‘a’ não for encontrada.
REVISÃO SOBRE CARACTERES Exemplos: char str1[81] , str2[81]; scanf( “%[1234567890],” , str1); /*neste comando scanf, foi especificado que só será aceito texto contendo números.*/ scanf( “%[^1234567890],” , str2); /*neste comando scanf, foi especificado que só será aceito texto sem dígitos númericos.*/
REVISÃO SOBRE CARACTERES Exemplos: char str3[81], str4[9]; scanf( “%[^\n],” , str3); /*neste comando scanf, foi especificado que o comando irá ler o texto fornecido até encontrar uma quebra de linha.*/ scanf( “%8[^\n],” , str4); /*neste comando scanf, foi especificado que o comando irá ler o apenas os primeiros 8 caracteres fornecidos ou irá encerrar a leitura do texto do fornecido quando encontrar uma quebra de linha.*/
REVISÃO SOBRE CARACTERES Exemplos: char str4[9]; scanf( “%8[^\n],” , str4); /*Devemos notar que não usamos o caractere & na passagem da cadeia para a função, pois a cadeia é um vetor (a variável str4 é uma constante que aponta para o endereço do primeiro elemento do vetor e a função atribui os valores dos elementos a partir desse endereço).*/
Vetores Bidimencionais
Vetores Bidimencionais Um vetor bidemensional é uma estrutura bidimensional capaz de armazenar dados de um mesmo tipo. Vetores bidimensionais são conhecidos também por Matrizes e podemos considerar o conceito de Matriz como uma extensão do conceito de vetores, onde vetores corresponderia a uma estrutura unidimensional.
Vetores Bidimencionais A dimensão de um vetor bidemensional (matriz) é definida através de 2 números, o número de linhas e o de colunas. Na linguagem C, o primeiro índice sempre corresponde à linha, e o segundo índice, à coluna a ser acessada.
DECLARAÇÃO DE VETORES BIDIMENCIONAIS
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Um vetor bidimensional deve ser declarada da seguinte forma: tipo_do_vetor nome_do_vetor [num_linhas][num_colunas];
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Por exemplo, para declararmos um vetor bidemensional de valores reais com 4 linhas e 3 colunas, fazemos: float mat[4][3]; Outro exemplos: int matInt [6][2]; /* matriz com 6 linhas e 2 colunas de inteiros */ float matReal [5][7]; /* matriz com 5 linhas e 7 colunas de floats */ char matChar [3][4]; /* matriz com 3 linhas e 4 colunas de chars */
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Pilha de execução para a matriz float mat[4][3]:
DECLARAÇÃO DE VETORES BIDIMENCIONAIS As matrizes também podem ser inicializadas na declaração: float mat[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; Ou podemos inicializar seqüencialmente: float mat[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; O número de elementos por linha pode ser omitido numa inicialização, mas o número de colunas deve, obrigatoriamente, ser fornecido: float mat[ ][3] = {1,2,3,4,5,6,7,8,9,10,11,12};
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Após a declaração de uma matriz, a variável que representa a matriz, mat no exemplo anterior, representa um ponteiro para o primeiro “vetor- linha”, composto por 3 elementos. Com isto, mat[1] aponta para o segundo “vetor-linha”, e assim por diante.
VETORES PARA FUNÇÕES
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Em C, a forma mais prática de se passar um vetor para uma função é através de um parâmetro do tipo ponteiro. Salientamos que a expressão “passar um vetor para uma função” deve ser interpretada como “passar o endereço inicial do vetor”.
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Exemplo: Escreva uma função que retorne a média aritmética dos valores inseridos em um vetor. float media (int n, float *v){ int i; float s = 0.0; for (i = 0; i < n; i++) s += v[i]; return s/n; }
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Exemplo: Escreva uma função que receba uma cadeia de caracteres e imprima caractere por caractere. void imprime (char *s){ int i; for (i=0; s[i] != '\0'; i++){ printf("%c",s[i]); printf("\n"); }
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Quanto a Matrizes (Vetores Bidimensionais), a forma usual de se declarar o parâmetro de uma função como matriz, é omitindo o número de linhas: void f (..., float mat[ ][3], ...); Outra forma, é declarando o parâmetro como ponteiro e definindo o número de colunas: void f (..., float (*mat)[3], ...);
DECLARAÇÃO DE VETORES BIDIMENCIONAIS Exemplo: Escreva uma função que receba um matriz e imprima todos os seus elementos. void exibir(int matriz[][4]) { int linha, coluna; for(linha=0 ; linha < 4 ; linha++) { for(coluna=0 ; coluna < 4 ; coluna++) { printf("%3d ", matriz[linha][coluna]); } printf("\n");