Buscar

03 - vetores-matrizes-string

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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 dia­do­ano: ");
   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

Outros materiais