• Nenhum resultado encontrado

Funciona como uma matriz unidimensional, mas tem mais de um índice. Sintaxe:

N/A
N/A
Protected

Academic year: 2021

Share "Funciona como uma matriz unidimensional, mas tem mais de um índice. Sintaxe:"

Copied!
8
0
0

Texto

(1)

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.

(2)

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]

(3)

#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

(4)

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.

(5)

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){

...

(6)

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.

(7)

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.

(8)

Referências

Documentos relacionados

Mais do que um campo para sediar a Copa do Mundo, o projeto de construção de um estádio no Rio de Janeiro gestado em 1943 por imprensa, clubes, FMF e governos municipal e

Além do cálculo geral da média do audit delay, também realizou-se o cálculo separando a amostra em empresas auditadas pelas empresas de auditoria BIG4 e Não-BIG4, separou-se

Médio Tejo, EPE, o Hospital Distrital de Santarém, EPE, a Unidade Local de Saúde do Alto Minho, EPE, e a Unidade Local de Saúde do Baixo Alentejo, EPE, remeteram os

Em São Jerônimo da Serra foram identificadas rochas pertencentes à Formação Rio do Rasto (Grupo Passa Dois) e as formações Pirambóia, Botucatu e Serra Geral (Grupo São

Nos dois primeiros animais do presente relato, os sinais clínicos foram discretos e mais associados às doenças concomitantes, o que dificultou a inclusão da dirofilariose

Neste trabalho avaliamos as respostas de duas espécies de aranhas errantes do gênero Ctenus às pistas químicas de presas e predadores e ao tipo de solo (arenoso ou

O valor da reputação dos pseudônimos é igual a 0,8 devido aos fal- sos positivos do mecanismo auxiliar, que acabam por fazer com que a reputação mesmo dos usuários que enviam

Propondo a problematização dessas relações, os livros infantis que transportam essas posturas desgenderizadas para suas narrativas estão longe de ser meros recursos