Baixe o app para aproveitar ainda mais
Prévia do material em texto
Italo Valcy Programação em C, 2013.1 Programação C Italo Valcy <italo@dcc.ufba.br> Aula 03 – Vetores, Matrizes e Strings Italo Valcy Programação em C, 2013.1 2 / 35 Todo o material aqui disponível pode, posteriormente, ser utilizado sobre os termos da: Creative Commons License: Atribuição - Uso não comercial - Permanência da Licença http://creativecommons.org/licenses/by-nc-sa/3.0/ Licença de uso e distribuição Este curso foi baseado no curso “Algoritmos e Programação de Computadores” do prof. Centoducatte, da UNICAMP, disponível em <http://www.ic.unicamp.br/~ducatte/mc102/mc102.html>, e nas aulas de prof. Luciano Oliveira. Italo Valcy Programação em C, 2013.1 3 / 35 Vetores e Matrizes Italo Valcy Programação em C, 2013.1 4 / 35 Vetores Conjunto de elementos consecutivos, do mesmo tipo, que podem ser acessados individualmente a partir de um único nome. Vetores == Arranjos unidimensionais Declaração: tipo nome_variavel [quantidade] 4.8 5.0 4.5 5.6 6.7 3.2 2.9 (0) (1) (2) (3) (4) (5) (6) Notas Italo Valcy Programação em C, 2013.1 5 / 35 Vetores Exemplo de declaração: int numero_matricula[20]; float notas[20]; Os índices do vetor de tamanho n variam de 0 à n-1. Ex: float notas[4]; notas[0] = 6.4; // primeiro elemento notas[3] = 5.3; // ultimo elemento Italo Valcy Programação em C, 2013.1 6 / 35 Vetores Dicas de inicialização de vetores: int v[3] = {1,2,3}; int v[5] = {5,4}; // igual a {5,4,0,0,0} int v[] = {6,7,8,9}; Incorreto: int v[]; Italo Valcy Programação em C, 2013.1 7 / 35 Vetores #include <stdio.h> #define N 10 main() { float alunos[N], avg; int i; // leitura de dados for (i=0; i < N; i++) { printf("nota do aluno %d: ", i+1); scanf("%f",&alunos[i]); } // processamento for (i=0; i < N; i++) avg += alunos[i]; avg = avg / N; printf("media da turma: %.2f\n", avg); } Exemplo Italo Valcy Programação em C, 2013.1 8 / 35 Matrizes Em C podemos ter arranjos multidimensionais (2d, 3d, 4d), para indexação mais seletiva 2d => matrizes Formato geral tipo nome [linhas][colunas] tipo nome [tam1][tam2]...[tamN] Italo Valcy Programação em C, 2013.1 9 / 35 Matrizes Atenção: não confundir as dimensões com células de armazenamento! As dimensões servem apenas para índice Os arranjos de qualquer dimensão terão apenas uma célula de armazenamento! a ij j i Italo Valcy Programação em C, 2013.1 10 / 35 Matrizes #include <stdio.h> main() { int tab_dia[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}, // ano normal {0,31,29,31,30,31,30,31,31,30,31,30,31}, // ano bissexto }; int ano, dia; int mes, bissexto; printf("Digite o ano e diadoano: "); scanf("%d %d", &ano, &dia); bissexto = ano%4==0 && ano%100!=0 || ano%400==0; for (mes=1; dia > tab_dia[bissexto][mes]; mes++) dia = tab_dia[bissexto][mes]; printf("Data (dd/mm/aaaa): %02d/%02d/%d\n", dia, mes, ano); } Exemplo Italo Valcy Programação em C, 2013.1 11 / 35 Exercício Fazer um programa que leia uma matriz de inteiros A (3x3) e calcule uma matriz B, resultado da soma de A com sua transposta. Imprimir a matriz A, sua transposta e a matriz B. Italo Valcy Programação em C, 2013.1 12 / 35 Exercício A + At: (apenas trechos importantes) int main() { // calcula transposta for (i=0; i<3; i++) { for (j=0; j<3; j++) { at[j][i] = a[i][j]; } } // imprime a soma printf("Matriz B: A + At\n"); printf("================\n"); for (i=0; i<3; i++) { for (j=0; j<3; j++) { printf("%d ", a[i][j] + at[i][j]); } printf("\n"); } } Italo Valcy Programação em C, 2013.1 13 / 35 Strings Italo Valcy Programação em C, 2013.1 14 / 35 Strings Uma string é um conjunto de caracteres armazenados em um vetor Exemplos: “Marcelo” // Exemplo de string “Jose Maria da Silva” // Exemplo de string 'L' // Exemplo de caracter '\n' // Exemplo de caracter especial Italo Valcy Programação em C, 2013.1 15 / 35 Strings Strings são cadeias de caracteres: palavras, frases, textos, etc. Não é um tipo básico de C Na prática: vetor de char Forma geral: char nome_da_string [tamanho] Exemplos: char nome[20]; char nome[20] = “Maria Jose”; char nome[] = “Micalateia”; Italo Valcy Programação em C, 2013.1 16 / 35 Strings A linguagem usa um marcador para indicar final da string: '\0' Exemplo: char nome[20] = “Maria”; Quando sua intenção é declarar um vetor de 20 caracteres, lembre-se do marcador: char sobrenome[21]; m a r i a \0 nome Italo Valcy Programação em C, 2013.1 17 / 35 Strings Leitura e escrita de strings podem ser feitas com funções conhecidas, scanf e printf, ou com funções específicas: puts/gets; A leitura de strings merece atenção especial... Italo Valcy Programação em C, 2013.1 18 / 35 Strings printf printf(“Testando a funcao!\n”); printf(“Nome: %s\n”, nome); Strings – Escrita Italo Valcy Programação em C, 2013.1 19 / 35 Strings Para leitura de strings temos em geral três opções: scanf(“%s”, str); Leitura de string Italo Valcy Programação em C, 2013.1 20 / 35 Strings scanf exemplo: Problema: lê os caracteres até encontrar <ESPACO>, <TAB> ou <ENTER> Leitura de string #include <stdio.h> int main() { char nome[80]; printf("Digite seu nome: "); scanf("%s", &nome); printf("Ola %s!\n", nome); } Digite seu nome: maria joao Ola maria! Italo Valcy Programação em C, 2013.1 21 / 35 Strings scanf exemplo (medida de contorno): scanf suporta regex! Leitura de string #include <stdio.h> int main() { char nome[80]; printf("Digite seu nome: "); scanf("%[^\n]", &nome); printf("Ola %s!\n", nome); } Italo Valcy Programação em C, 2013.1 22 / 35 Strings Problema 2: scanf deixa um \n (newline)... Leitura de string #include <stdio.h> int main() { int id; char nome[50]; float salario; while (1) { printf("Identidade: "); scanf("%d", &id); if (id == 0) break; printf("Nome: "); scanf("%[^\n]", &nome); printf("salario: "); scanf("%f", &salario); printf("|%d|%s|%f|\n", id, nome, salario); } return 0; } Italo Valcy Programação em C, 2013.1 23 / 35 Strings Solução “definitiva”: Ainda temos o problema de estouro de buffer (mais conhecido como buffer overflow) http://www.linuxjournal.com/article/6701 Leitura de string #include <stdio.h> int main() { char nome[80]; printf("Digite seu nome: "); scanf("\n\r%[^\n]", &nome); printf("Ola %s!\n", nome); } Italo Valcy Programação em C, 2013.1 24 / 35 Strings Fazer um programa para retornar o tamanho de uma string lida do teclado (quantidade de caracteres, exceto o marcador de fim) Exercício Italo Valcy Programação em C, 2013.1 25 / 35 Strings Fazer um programa para retornar o tamanho de uma string lida do teclado (quantidade de caracteres, exceto o marcador de fim) Exercício #include <stdio.h> #include <string.h> void main (){ char name [30]; int i = 0; printf (”Seu nome\n"); gets (name); while (name [i] != '\0'){ i++ ; } printf (”Tamanho da string %d\n", i); } Italo Valcy Programação em C, 2013.1 26 / 35 Strings Operações com strings não são triviais: str1 = str2; // cópia não funciona assim str1 = str1 + str2 // nem concatenação str1 == str2 // nem comparação … A biblioteca padrão do C possui várias funções para manipular strings: #include <string.h> Italo Valcy Programação em C, 2013.1 27 / 35 Strings char* strcpy(char* destino, const char* origem); Copia a string C em origem para destino destino deve ter tamanho maior ou igual a origem Funções da biblioteca string.h /* strcpy example */ #include <stdio.h> #include <string.h> int main () { char str1[]="Sample string"; char str2[40]; char str3[40]; strcpy(str2,str1); strcpy(str3,"copy successful"); printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3); return 0; } str1: Sample string str2:Sample string str3: copy successful Saída: Italo Valcy Programação em C, 2013.1 28 / 35 Strings char* strcat(char* destino, const char* origem); Anexa a string C em origem para destino A string de origem permanecerá inalterada e será anexada ao fim da string de destino Funções da biblioteca string.h /* strcat example */ #include <stdio.h> #include <string.h> int main () { char str[80]; strcpy (str,"these "); strcat (str,"strings "); strcat (str,"are "); strcat (str,"concatenated."); puts (str); return 0; } these strings are concatenated. Saída: Italo Valcy Programação em C, 2013.1 29 / 35 Strings size_t strlen(const char* str); A função strlen() retorna o comprimento da string fornecida O tamanho é determinado pelo terminador nulo de string ('\0), porém não é contado Funções da biblioteca string.h j u s t t e s t i n g \0 => strleng() = 12 Italo Valcy Programação em C, 2013.1 30 / 35 Strings size_t strlen(const char* str); Exemplo: Saída Funções da biblioteca string.h /* strlen example */ #include <stdio.h> #include <string.h> int main () { char szInput[256]; printf ("Enter a sentence: "); gets (szInput); printf ("The sentence entered is %d " "characters long.\n",strlen(szInput)); return 0; } Enter sentence: just testing The sentence entered is 12 characters long. Italo Valcy Programação em C, 2013.1 31 / 35 Strings int strcmp(const char* str1, const char* str2); A função strcmp() compara a string 1 com a string 2 e retorna: 0 se as strings forem iguais > 0 se str1 é maior que str2 < 0 se str1 é menor que str2 Funções da biblioteca string.h Italo Valcy Programação em C, 2013.1 32 / 35 Strings int strcmp(const char* str1, const char* str2); Exemplo: Saída: Funções da biblioteca string.h #include <stdio.h> #include <string.h> int main() { printf("beatriz <=> beatriz : %d\n", strcmp("beatriz", "beatriz")); printf("beatriz <=> bete : %d\n", strcmp("beatriz", "bete")); printf("beatriz <=> beata : %d\n", strcmp("beatriz", "beata")); return 0; } beatriz <=> beatriz : 0 beatriz <=> bete : 1 beatriz <=> beata : 1 Italo Valcy Programação em C, 2013.1 33 / 35 Strings Exercício: fazer um programa para ler nomes de alunos da entrada padrão e depois imprimi- los em ordem alfabética. Antes de ler os nomes, deve-se ler do usuário quantos alunos serão inseridos. Exemplo de entrada: 5 Jeremias Pedro Maria Jose Maria Joao Ana Bianca Exemplo de saida: Ana Bianca Jeremias Maria Joao Maria Jose Pedro Italo Valcy Programação em C, 2013.1 34 / 35 Strings Exer03: Cifra de César (cesar.c): Na criptografia de textos, deseja-se tornar uma mensagem legível apenas para as partes que possuem a chave de criptografia. Dessa forma, caso a mensagem seja capturada, ela não poderá ser lida (pois o interceptor não possui a chave). Para cifrar (tornar uma mensagem ilegível para quem não possui a chave), existem diversos algoritmos. Um dos primeiros foi a Cifra de César, onde cada letra do alfabeto é deslocada da sua posição um número N de lugares (N é a chave de criptografia nesse caso). Por exemplo, se tiver um deslocamento de 3 (N=3), A torna-se D, B torna-se E, X torna-se A, etc. Assim, apenas quem conhecia o valor de N poderia entender o texto cifrado. Você deve implementar um programa para cifrar uma mensagem fornecido pelo usuário com uma chave também fornecida pelo usuário. Italo Valcy Programação em C, 2013.1 35 / 35 Strings Entrada A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrão (normalmente o teclado). A entrada contém apenas duas linhas. A primeira linha contém a chave (inteiro, entre 1 e 25). A segunda linha contém o texto a ser cifrado (tamanho máximo: 200 caracteres, apenas caracteres alfabéticos com letras em maiúsculo ou minúsculo e espaços). Saída Seu programa deve imprimir, na saída padrão, uma única linha, contendo o texto criptografado. Apenas os caracteres alfabéticos devem ser cifrados. Exemplos: Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35
Compartilhar