Instituto Federal de Santa Catarina - Câmpus Chapecó
Ensino Médio Integrado em Informática
Professora: Lara Popov Zambiasi Bazzi Oberderfer
Linguagem C: Vetores e Matrizes
Sumário
1 Matrizes... 1
1.1 Matrizes Unidimensionais (Vetores):...1
1.2 Matrizes Multidimensionais:...1
1.3 Inicialização de Matriz... 1
1.4 Inicialização de Matrizes Adimensionais...2
1.5 Matrizes de Strings... 2
1.6 Matrizes Bidimensionais...3
1.6.1 Inicialização... 4
1.6.2 Inicialização sem especificar o tamanho...4
2 Referências Bibliográficas... 6
1 Matrizes
São alocações contíguas de memória.
1.1 Matrizes Unidimensionais (Vetores):
As matrizes precisam ser explicitamente declaradas para que o compilador aloque espaço em memória para elas. Em tipo definimos que tipo de dado é cada elemento da matriz, nome conterá o nome de acesso à matriz. E tamanho são a quantia de elementos que a matriz terá. Sintaxe:
tipo nome[tamanho];
1.2 Matrizes Multidimensionais:
Funciona como uma matriz unidimensional, mas tem mais de um índice. Sintaxe:
tipo nome[tamanho][tamanho]...;
1.3 Inicialização de Matriz
Se você reparou bem o programa acima viu algo novo, a inicialização de uma matriz logo em sua declaração.
Forma geral:
especificador_de_tipo nome_da_matriz[tamanho1]…[tamanhoN] = {lista_valores}; Como a matriz é armazenada sequencialmente na memória, a lista_valores é uma lista separada por vírgulas apenas. No exemplo abaixo, incializamos uma matriz de 10 elementos com números de 1 à 10:
int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; O valor de i[0] é 1 e i[9] é 10.
Matrizes de caracteres que contêm strigns podem ser inicializadas de forma abreviada:
char str[14] = “Eu gosto de C”; // é o mesmo que usar:
char str[14] = {'E','u',' ','g','o','s','t','o',' ','d','e',' ','C', '\0'};
Como as strings terminam com o caractere nulo ‘\0’, devemos sempre assegurar que a matriz declarada será longa o bastante para incluí-lo.
Matrizes multidimensionais são inicializadas da mesma maneira: int matrix[2][3] = {
1,10,11, 2,23,98 };
1.4 Inicialização de Matrizes Adimensionais
É um tanto quanto tedioso ficar contando a quantidade de caracteres ao criar uma matriz. Para resolver este problema o compilador C faz isto automaticamente, logo podemos iniciar a string anterior desta maneira:
char str[ ] = “Eu gosto de C”;
Podemos fazer o mesmo para inicializar uma matriz multidimensional: int matrix[ ] [3] = {
1,10,11, 2,23,98 }
Devemos especificar todas as dimensões, exceto a que está mais à esquerda. A vantagem é que podemos aumentar ou diminuir o tamanho da tabela, sem alterar as dimensões da matriz.
1.5 Matrizes de Strings
Matrizes de strings são matrizes bidimensionais. Imagine uma string. Ela é um vetor. Se fizermos um vetor de strings estaremos fazendo uma lista de vetores. Esta estrutura é uma matriz bidimensional de chars. Podemos ver a forma geral de uma matriz de strings como sendo:
char nome_da_variável [num_de_strings][compr_das_strings];
Aí surge a pergunta: como acessar uma string individual? Fácil. É só usar apenas o primeiro índice. Então, para acessar uma determinada string faça:
nome_da_variável [índice]
#include <stdio.h> int main (){ char strings [5][100]; int count; for (count=0;count<5;count++) {
printf ("\n\nDigite uma string: "); gets (strings[count]);
}
printf ("\n\n\nAs strings que voce digitou foram:\n\n"); for (count=0;count<5;count++)
printf ("%s\n",strings[count]); return(0);
}
1.6 Matrizes Bidimensionais
C suporta matrizes multidimensionais. Sua forma geral é:
tipo_da_variável nome_da_variável [tam1][tam2] ... [tamN]; A forma mais simples desta matriz é a bidimensional, por exemplo: int d[10][20];
Acima é uma matriz bidimensional que contém 10 linhas e 20 colunas. Para acessarmos o endereço 1,2 da matriz, usaríamos:
d[1][2];
O programa abaixo cria uma matriz bidimensional com números de 1 a 12 e escreve-os de linha à linha.
#include <stdio.h> void main(void) { int t, i, num[3][4]; for (t = 0; t < 3; ++t) for (i = 0; i < 4; i++) num[t][i] = (t * 4) + i + 1; // Exibindo os dados for (t = 0; t < 3; ++t) { for (i = 0; i < 4; ++i) printf("%3d ", num[t][i]); printf("\n"); } }
Vamos ver como poderíamos acessar esta matriz: 0 1 2 3
0 1 2 3 4 1 5 6 7 8 2 9 10 11 12
Aqui a posição num[0][0] tem o valor 1, enquanto que num[0][1] tem valor 2, num[2][3] tem o valor 12 e assim por diante. O primeiro índice indica a linha e o
segundo sempre indica a coluna.
Para matriz bidimensional esta fórmula calcula seu tamanho na memória: bytes = tamanho do 1º índice * tamano do 2º indice * sizeof(tipo base)
Este programa calcula o tamanho da matriz acima mostrada: #include <stdio.h>
int main() {
printf("sizeof matriz[3][4]: %ld\n", 3 * 4 * sizeof(int)); }
No meu caso, ela ocupou 48 bytes na memória RAM.
Ao passarmos uma matriz bidimensional como argumento para uma função, apenas o ponteiro para o primeiro elemento é realmente passado. Já a função que recebe esta matriz precisa definir ao menos o comprimento da segunda dimensão. Do contrário o compilador não tem como saber o comprimento de cada linha para indexar a matriz corretamente. Por exemplo:
func1 (int x[ ][10]); { … }
A função acima recebe uma matriz bidimensional de inteiros com dimensões 10,10. Não precisamos especificar a primeira dimensão, mas se o fizer não terá
problema algum.
Em sentenças como esta x[2][4]
o compilador precisa saber o tamanho da segunda dimensão, do contrário não saberá onde começar a terceira linha.
1.6.1
Inicialização
Podemos inicializar matrizes, assim como podemos incializar variáveis (3.3). A forma geral de uma matriz como inicialização é:
tipo_da_variável nome_da_variável [tam1][tam2] ... [tamN] = {lista_de_valores};
A lista de valores é composta por valores (do mesmo tipo da variável) separados por vírgula. Os valores devem ser dados na ordem em que serão colocados na matriz. Abaixo vemos alguns exemplos de inicializações de matrizes:
float vect [6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };
int matrx [3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; char str [10] = { ’J’, ’o’, ’a’, ’o’, ’\0’ };
char str [10] = "Joao";
char str_vect [3][10] = { "Joao", "Maria", "Jose" };
O primeiro demonstra inicialização de vetores. O segundo exemplo demonstra a inicialização de matrizes multidimensionais, onde PDWU[ está sendo inicializada com 1, 2, 3 e 4 em sua primeira linha, 5, 6, 7 e 8 na segunda linha e 9, 10, 11 e 12 na última linha. No terceiro exemplo vemos como inicializar uma string e, no quarto exemplo, um modo mais compacto de inicializar uma string. O quinto exemplo combina as duas técnicas para inicializar um vetor de strings. Repare que devemos incluir o ; no final da inicialização.
1.6.2
Inicialização sem especificar o tamanho
Podemos, em alguns casos, inicializar matrizes das quais não sabemos o tamanho a priori. O compilador C vai, neste caso verificar o tamanho do que você declarou e considerar como sendo o tamanho da matriz. Isto ocorre na hora da compilação e não poderá mais ser mudado durante o programa, sendo muito útil, por exemplo, quando vamos inicializar uma string e não queremos contar quantos caracteres serão necessários. Alguns exemplos:
char mess [] = "Linguagem C: flexibilidade e poder."; int matrx [][2] = { 1,2,2,4,3,6,4,8,5,10 };
No primeiro exemplo, a string mess terá tamanho 36. Repare que o artifício para realizar a inicialização sem especificação de tamanho é não especificar o tamanho! No segundo exemplo o valor não especificado será 5.
Exemplo:
# include <stdio.h> int main(){
int t, i, M[3][4]; for (t=0; t<3; ++t)
for (i=0; i<4; ++i)
M[t][i] = (t*4)+i+1; for (t=0; t<3; ++t)
{
for (i=0; i<4; ++i)
printf ("%3d ", M[t][i]); printf ("\n");
}
return(0); }
2 Listas de Exercícios - Vetores
Escreva um programa que compile e execute corretamente para cada uma das
questões abaixo. Todos os programas deverão ser comentados (nome, data e um breve
comentário da funcionalidade do programa).
Pode ser realizado um programa só com funções para cada uma das questões
abaixo.
1. [Função] Continue o código abaixo que Imprimir a tabuada de qualquer número n.
#include <stdio.h>
void tabuada (int); //protótipo da função
void main(){
…
tabuada(numero); //usando a função
...
}
//função
void tabuada (int numero){
...
2. [Função] Ler um número e escreva se ele "é primo" ou "não é primo".
3. [Função, Vetor] Calcular a média final dadas as notas das 3 provas e produzir
uma saída com a média e a situação do aluno de acordo com o seguinte critério:
média >= 7, aprovado; 3 <= média < 7, recuperação; média < 3, reprovado.
Considerar também o número de faltas do aluno: se forem mais que sete faltas, o
aluno estará automaticamente reprovado (o usuário deve fornecer o numero de
faltas). Se o aluno se encontrar em recuperação, solicitar a nota da quarta prova e,
após calcular a media final, informar se o aluno passou (media final >=5) ou não.
4. [Função, Vetor] Modifique o programa da média (questão 3) para que ao final
pergunte ao usuário se deseja calcular a média de outro aluno. O programa só será
finalizado quando o usuário não desejar mais calcular nenhuma media.
5. [Função, Vetor] Gere um número aleatório inteiro (utilize a função rand() ) entre 0
e 100 e solicite um número ao usuário. O objetivo é que o usuário acerte o número
gerado. Se o número digitado for menor que o gerado, diga “MAIOR”, se for maior
diga “MENOR”, e solicite um número ao usuário novamente. Repita este processo
até que o usuário acerte o número gerado. Após isso, informe em quantas
tentativas o usuário acertou.
6. [Função, Vetor] Modifique a questão 4 da segunda lista de exercícios incluindo
mais uma opção ao usuário: 6 – Finalizar programa
Desse modo, o programa deve continuar disponibilizando ao usuário o menu de
opções para os seus dois números digitados após a realização de uma operação,
finalizando apenas quando ele escolher a opção 6, onde ser dada uma mensagem
de encerramento do programa.
3 Lista de Exercícios - Matrizes
Para cada execício abaixo defina a função solicitada e crie um programa em C para testar seu funcionamento.
1. Ler um vetor vet de 10 elementos e obter um vetor quadrado cujos componentes deste vetor são o quadrado dos respectivos componentes de vet.
2. Criar um algoritmo que leia os elementos de uma matriz inteira de 4 x 4 e imprimir os elementos da diagonal principal.
3. Criar um algoritmo que leia os elementos de uma matriz inteira de 3 x 3 e imprimir todos os elementos, exceto os elementos da diagonal principal.
4. Criar um algoritmo que leia os elementos de uma matriz inteira de 3 x 3 e imprimir outra matriz multiplicando cada elemento da primeira matriz por 2.
4 Referências Bibliográficas
1. UNICAMP. Introdução a Linguagem C. Disponível em:
http://www.fsc.ufsc.br/~canzian/root/tutorial-c-unicamp.pdf . Acesso em: 25/03/2013. 2. TRENTIN, Paulo. Curso gratuito de programação em C. Disponível em:
http://www.paulotrentin.com.br/programacao/curso-gratuito-programacao-c/ .
Acesso em: 10/04/2013.
3. NETO, Samuel Dias. Linguagem C: Intermediário. Disponível em:
http://homepages.dcc.ufmg.br/~joaoreis/Site%20de%20tutoriais/c_int/es.htm. Acesso em: 11/02/2013.