E S T RU T U R A S D E DA D O S H O M O G Ê N E A S
PROGRAMAÇÃO I
Tópicos
2
Vetores
Matrizes
Cadeia de caracteres (Strings)
Conjuntos de uma dimensão: Vetores
3
Vetores são estruturas de dados que permitem armazenar um conjunto de valores na memória do computador.
O vetor é um grupamento de variáveis de mesmo tipo que ocupa uma região contínua de memória.
O vetor é uma estrutura de uma dimensão.
Declaração de vetores
4
Sintaxe: A sintaxe para a declaração de um vetor é a seguinte:
tipo nome[tam];
onde:
tipo é o tipo dos elementos do vetor: int, float, double ...
nome é o nome identificador do vetor. As regras de nomenclatura dos nomes de vetores são as mesmas usadas na declaração de variáveis .
tam é o tamanho do vetor, isto é, o número de elementos que o vetor pode armazenar.
Atenção: o sistema de execução não verifica se um determinado
acesso está dentro dos limites de um vetor. O programador deve
Declaração de vetores
5
Exemplo:
int notas[5];
A declaração acima reserva um espaço na memória para 5 inteiros.
A quantidade de memória (em bytes) usada para armazenar um vetor pode ser calculada como:
quantidade de memória = tamanho do tipo * tamanho do vetor
No exemplo acima, a quantidade de memória
utilizada pelo vetor é 10 bytes (2*5).
Acesso aos elementos do vetor
6
Cada elemento do vetor é referenciado pelo nome do vetor seguido de um índice escrito entre colchetes.
O índice de um vetor deve ser um valor inteiro .
Exemplo:
int i = 7;
float valor[10]; // declaração de vetor
valor[1] = 6.645; // atribuindo valor a um // elemento do vetor
valor[5] = 3.867;
valor[i] = 7.645;
Inicialização de vetores
7
Sintaxe: A sintaxe para a inicialização dos elementos de um vetor é:
tipo nome[tam] = {lista de valores};
onde:
lista de valores é uma lista contendo os valores de cada elemento do vetor, separados por vírgulas.
Exemplos:
int dia[7] = {12,30,14,7,13,15,6};
float nota[5] = {8.4,6.9,4.5,4.6,7.2};
Exemplo de uso de Vetores
8
Imprimindo dados de um vetor
#include <stdio.h>
#include <stdlib.h>
int main () {
int i;
float v[6] = {2.3, 5.4, 1.0, 7.6, 8.8, 3.9};
printf("Dados do vetor: \n\n");
for (i=0; i<6; i++) {
printf("%f ", v[i]);
}
printf("\n\n");
system("pause");
return 0;
Exemplo de uso de Vetores
9
Inserindo dados aleatórios em um vetor
#include <stdio.h>
#include <stdlib.h>
int main () {
int i;
int v[6];
printf("Dados do vetor: \n\n");
for (i=0; i<6; i++) {
v[i] = rand() %100;
printf("%d ", v[i]);
}
printf("\n\n");
Exemplo de uso de Vetores
10
Calculando a somatória do vetor
#include <stdio.h>
#include <stdlib.h>
int main () {
int i;
float soma = 0.0; //declara e inicializa a soma
float v[6] = {2.3, 5.4, 1.0, 7.6, 8.8, 3.9}; // declara e inicializa o vetor printf("Dados do vetor: \n\n");
for (i=0; i<6; i++) {
printf("%.2f ", v[i]); // imprime o valor armazenado no índice i do vetor soma = soma + v[i]; // calcula a soma
} // fim do laço for
printf("\n\nSoma=%.2f\n\n", soma);
system("pause");
return 0;
Exercícios
11
1. Faça um programa para preencher, por entrada de dados, um vetor A de n números inteiros (no máximo 10). Solicitar um valor via teclado.
Pesquisar se esse número existe no vetor. Se existir, imprimir em qual posição o valor encontra-se armazenado do vetor.
2. Dado um vetor de n números, exibir em tela os
dados em ordem inversa.
Conjuntos de duas dimensões: Matrizes
12
Uma matriz representa um conjunto de valores de duas dimensões;
Similar a variáveis simples e vetores, matrizes devem ser declaradas para que o espaço de
memória apropriado seja reservado.
Como a matriz representa um conjunto bi-
dimensional, devemos especificar as duas
dimensões na declaração: o número de linhas e o
número de colunas.
Declaração de matrizes
13
Sintaxe: A sintaxe para a declaração de uma matriz é a seguinte:
tipo nome[tam1][tam2];
onde:
tipo é o tipo dos elementos da matriz: int, float, ...
Nome é o nome identificador da matriz. As regras de nomenclatura dos nomes são as mesmas usadas na declaração de variáveis .
tam1 representa o número de linhas
tam2 representa o número de colunas.
Declaração de matrizes
14
Exemplo:
float mat[3][4] ;
– Declara uma matriz de 3 linhas por 4 colunas (armazenamento de 12 valores do tipo float).
– O nome da variável mat representa uma
referência para o espaço de memória reservado.
– O índice de linha varia de 0 a 2.
– O índice de coluna varia de 0 a 3.
Matriz multidimensional
15
Declarando uma matriz multidimensional
<tipo> nome da matriz [<tam
1>] [<tam
2>] ...[<tam
n>]
Essa matriz possui tam 1 x tam 2 x ... x tam n variáveis do tipo <tipo>
O índice da cada dimensão é numerada de 0 a
tam i -1
Acesso aos elementos da matriz
16
Para acessar um elemento da matriz, utilizamos indexação dupla, da seguinte forma:
nome_da_matriz [<linha] [<coluna>]
Exemplo: mat[i][j]
– Para uma matriz com m linhas e n colunas, os índices usados no acesso aos elementos devem satisfazer:
0<=i<m e 0<=j<n
– O compilador não verifica se foram utilizados valores válidos para os índices de linha e de coluna. É
responsabilidade do programador fazer essa
verificação.
Acesso aos elementos da matriz
17
2 | 3 | 1 | 9 | 4 | 7
m[i][j] = i *n + j onde n é o número de colunas.
Exemplo: m[1][2] = 1*3 + 2 = 5
0 1 2 3 4 5
Como uma matriz é armazenada na memória – A memória do computador é linear.
– Uma matriz declarada em C é armazenada na memória linha por linha.
7 4 9
1
3
2
Inserindo dados em uma Matriz
18
Lendo dados do teclado e inserindo na matriz (matriz 4x4)
/*Leitura*/
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++) {
printf ("Matriz[%d][%d]: ", i, j);
scanf ("%d", &matriz[i][j]);
}
Exibindo dados de uma Matriz
19
Escrevendo uma matriz na tela (matriz 4x4) /*Escrita*/
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
printf ("%3d ", matriz[i][j]);
printf ("\n");
}
Exemplo de uso de matrizes
20
printf("Digite o numero de alunos da turma: ");
scanf("%d",&n);
nalunos = 0;
/* lê dados dos alunos*/
while (nalunos < n) {
printf("\nAluno %d: \n",nalunos+1);
printf("\tDigite a 1a. nota: ");
scanf("%f",¬as[nalunos][0]);
printf("\tDigite a 2a. nota: ");
scanf("%f",¬as[nalunos][1]);
printf("\tDigite a 3a. nota: ");
scanf("%f",¬as[nalunos][2]);
nalunos++;
Exemplo de uso de matrizes
21 /* calcula média */
for (i=0;i<n;i++) {
for (j=0; j<3; j++) {
soma = soma + notas[i][j];
} }
media = soma / (3*nalunos);
/* exibe média calculada */
printf("\nMedia da disciplina: %.2f\n", media);
system("pause");
return 0;
Cadeias de caracteres (Strings)
22
A linguagem C não possui um tipo primitivo que permita a manipulação de cadeias de caracteres (strings).
Em C, uma string é representada por um vetor do
tipo char terminado pelo caractere nulo. O
caractere nulo tem configuração binária
00000000 (o seu código ASCII é 0), e é
representado pela sequência '\0' ou pela macro
NULL.
Declaração de Strings
23
A declaração geral para uma string é:
char nome_da_string[tamanho+1];
Deve-se declarar o vetor com uma posição a mais do que o tamanho desejado para que se possa incluir o marcador ’\0’ no final da string.
Exemplo: para armazenar uma string de até 10
caracteres deve-se declarar um vetor de caracteres de
tamanho 11; no exemplo abaixo, str é o nome da
variável string :
Inicialização de Strings
24
O vetor de caracteres pode ser inicializado de duas maneiras distintas:
1. listando os caracteres um a um, e acrescentando o caractere nulo no final. Exemplo:
char str[10]={'a','l','o',' ','m','u','n','d','o','\0'};
2. usando uma constante do tipo cadeia de caracteres; neste caso, o compilador acrescenta o caracter nulo automaticamente. Exemplo:
char str[10]="alo mundo";
Declaração e Inicialização de Strings
25
Exemplos
char s1[ ] = "";
char s2[ ] = "Rio de Janeiro";
char s3[81];
char s4[81] = "Rio";
s1 é uma cadeia de caracteres vazia (vetor com 1 elemento que armazena apenas o caractere '\0');
s2 é uma cadeia de 14 caracteres armazenada em vetor com 15 elementos, inicializada com o conteúdo declarado e terminada com '\0';
s3 pode armazenar uma cadeia com até 80 caracteres em um vetor com 81 elementos (já que uma cadeia de caracteres sempre tem que ser terminada com o caractere ‘\0’, que ocupa uma posição a mais no vetor).
A cadeia s3 não foi inicializada;
s4 pode armazenar uma cadeia com até 80 caracteres em um vetor com 81
Leitura de Strings
26
A biblioteca padrão de E/S, stdio.h, fornece funções para E/S com strings.
gets
A função gets() lê uma string do teclado. Sua forma geral é:
gets (nome_da_string);
Os caracteres digitados são transferidos para a memória após um Enter. O Enter não se torna parte do string; em seu lugar é colocado o caractere nulo (‘\0’).
Leitura de Strings
27
O programa abaixo demonstra o funcionamento da função gets():
#include <stdio.h>
#include <stdlib.h>
int main ()
{ char nome[51];
printf ("Digite o seu nome: ");
gets (nome);
printf ("\n Ola %s!\n\n",nome);
system("pause");
Leitura de Strings
28
scanf()
A função scanf() é utilizada para ler uma cadeia de caracteres do teclado usando o especificador de formato %s.
scanf ("%s", nome_string);
Note que não se utiliza o & para strings, pois o nome de um vetor já é um endereço de memória (o endereço de memória do começo do vetor).
O %s faz com que scanf( ) leia caracteres até que seja encontrado um caractere de espaço.
Os caracteres lidos são colocados em um vetor de caracteres
apontado pelo argumento correspondente, e o resultado tem
terminação nula (‘\0’).
Leitura de Strings
29
Infelizmente, a leitura a partir do teclado utilizando o scanf lê somente até o primeiro espaço, ou seja, lê somente uma palavra, o que torna o seu uso restrito.
Para contornar isso, pode-se utilizar a função gets, que faz a leitura até encontrar o caracter de fim de linha ( enter ).
gets(texto);
Leitura de Strings
30
Outra opção é explorar outras possibilidades fornecidas pela função scanf. Por exemplo, a opção abaixo
scanf("%[^\n]");
lê uma cadeia de caracteres até encontrar um
enter.
Leitura de Strings
31
O programa abaixo demonstra o funcionamento da função gets():
#include <stdio.h>
#include <stdlib.h>
int main ()
{ char nome[51];
printf ("Digite o seu nome: ");
scanf("%[^\n]", nome);
printf ("\n Ola %s!\n\n",nome);
system("pause");
Leitura de Strings
32
Exemplo:
lê uma sequência de caracteres até que seja encontrado o caractere de mudança de linha
captura linha fornecida pelo usuário até que ele tecle “Enter”
inclusão do espaço no formato garante que eventuais caracteres brancos que precedam a cadeia de caracteres sejam descartados char cidade[81];
... scanf(" %80[^\n]", cidade);
...
Leitura de Strings
33
scanf com o especificador de formato %[...]
%[...] lista entre os colchetes todos os caracteres aceitos na leitura
%[^...] lista entre os colchetes todos os caracteres não aceitos na leitura
exemplos :
%[aeiou]
lê sequências de vogais
leitura prossegue até encontrar um caractere que não seja uma vogal
%[^aeiou]
lê sequências de caracteres que não são vogais
leitura prossegue até encontrar um caractere que seja uma
Leitura de Strings
34
Aqui, deparamos com outro problema: tanto o comando scanf quanto o gets podem ler mais caracteres que os existentes na string, provocando erros.
A solução aqui é utilizar uma função que tenha o mesmo comportamento do gets, mas que permita limitar a leitura a um tamanho máximo. As opções são:
fgets (texto, 50, stdin);
scanf("%50[^\n]");
Escrita de Strings
35
printf ()
Pode-se escrever uma string na tela caracter a caracter, mas é mais simples escrever utilizando o comando printf, com o mesmo comando utilizado para leitura (%s)
printf ("%s", nome_string);
Escrita de Strings
36
De forma análoga ao gets e fgets, temos o puts e fputs, que escrevem a string na tela.
puts (texto);
fputs (texto, stdout);
Funções básicas para Strings
37
A biblioteca string.h, fornece uma gama variada de funções para a manipulação de strings. As mais comuns são fornecidas pela maioria dos compiladores C. São elas:
strlen(texto) : Retorna o número de caracteres da string. O caracter ‘\0’ não é contado.
strcpy(destino, fonte) : Copia a string fonte para
a string destino
Funções básicas para Strings
38
strcmp(str1, str2) : Compara duas cadeias e caracteres e retorna um valor
= 0 - se str1 e str2 forem iguais
< 0 - se str1 for menor que str2
> 0 - se str1 for maior que str2
strcat(destino, fonte) : Concatena a string fonte no
fim da string destino
Exemplos de uso das funções básicas
39
strlen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char nome[41];
printf("Informe um nome: ");
gets(nome);
printf("\n%s contem %d caracteres\n\n",nome ,strlen(nome));
system("pause");
return 0;
Exemplos de uso das funções básicas
40
strcpy
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{ char nome[41], aluno[41];
printf("Informe um Nome: ");
gets(nome);
strcpy(aluno,nome);
printf("\nO nome do aluno e' %s\n\n",aluno);
system("pause");
return 0;
Exemplos de uso das funções básicas
41
strcmp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{ char nome1[41], nome2[41];
printf("Informe um nome: ");
gets(nome1);
printf("\nInforme outro nome: ");
gets(nome2);
if(strcmp(nome1,nome2)==0)
printf("\nOs nomes sao iguais");
else
printf("\nOs nomes sao diferentes");
printf("\n\n");
Exemplos de uso das funções básicas