Ementrio Noes de hardware e software Conceitos Fundamentais

  • Slides: 54
Download presentation
Ementário • Noções de hardware e software. • Conceitos Fundamentais. • Vetores, cadeia de

Ementário • Noções de hardware e software. • Conceitos Fundamentais. • Vetores, cadeia de caracteres e registros. • Definição e manipulação de arquivos externos. • Subprogramação. • Alocação dinâmica de memória. • Estruturas de dados básicas: listas lineares, pilha e fila. Árvores e grafos. • Métodos de ordenação. • Aplicações práticas utilizando uma linguagem estruturada de alto nível (Linguagem C). • Noções de Programação Orientada a Objetos com a Linguagem C++.

Programa = Algoritmo + Estrutura de Dados A todo momento durante a execução de

Programa = Algoritmo + Estrutura de Dados A todo momento durante a execução de qualquer tipo de programa os computadores estão manipulando informações, representadas pelos diferentes tipos de dados, armazenadas em sua memória.

Tipos de dados • valores que uma variável pode assumir – representação interna desses

Tipos de dados • valores que uma variável pode assumir – representação interna desses valores • operações que podem ser realizadas com essa variável

Classificação dos tipos de dados • Tipos de Dados Simples – Tipos de Dados

Classificação dos tipos de dados • Tipos de Dados Simples – Tipos de Dados Inteiros: int, long e unsigned int – Tipos de Dados Reais: float e double – Tipos de Dados Caracteres: char • Tipos de Dados Estruturados – cadeia de caracteres (string), vetores (array), registros (struct) e arquivos em disco. • ponteiros (alocação dinâmica de memória) • Classes e Objetos (Orientação a Objetos)

Tipos de Dados Simples Uma variável simples é uma entidade criada para permitir o

Tipos de Dados Simples Uma variável simples é uma entidade criada para permitir o acesso a uma posição de memória onde se armazena uma informação de um determinado tipo de dado pela simples referência a um nome simbólico. i = 0; j = 5; n = 50; int i, j, n; Memória Principal i 0 j 5 n 50

Utilizando variáveis de Tipos de Dados Simples: #include "stdio. h" int main() { int

Utilizando variáveis de Tipos de Dados Simples: #include "stdio. h" int main() { int nota 0 = 80; int nota 1 = 70; int nota 2 = 90; int nota 3 = 85; int nota 4 = 100; printf("nota 0 = %dn", nota 0); printf("nota 1 = %dn", nota 1); printf("nota 2 = %dn", nota 2); printf("nota 3 = %dn", nota 3); printf("nota 4 = %dn", nota 4); }

Tipos de Dados Estruturados • armazenam diversos itens de uma só vez • isto

Tipos de Dados Estruturados • armazenam diversos itens de uma só vez • isto significa: – em uma mesma estrutura de dados, é possível ter diversas variáveis de tipos de dados simples agrupadas

Utilizando variáveis de Tipos de Dados Estruturados: #include "stdio. h" int main() { //

Utilizando variáveis de Tipos de Dados Estruturados: #include "stdio. h" int main() { // tamanho do vetor #define n 5 // declarando e alimentando o vetor int nota[n] = {80, 70, 90, 85, 100}; // percorrendo todos os valores // armazenados no vetor for (int i=0; i<n; i++) { printf("nota[%d] = %dn", i, nota[i]); } }

Vetores 1/3 • representa um conjunto de valores do mesmo tipo (estrutura homogênea), referenciáveis

Vetores 1/3 • representa um conjunto de valores do mesmo tipo (estrutura homogênea), referenciáveis pelo mesmo nome e individualizados entre si através de sua posição dentro desse conjunto (variáveis indexadas) • uma sequência de endereçamentos (posições contíguas) de memória para armazenar os conteúdos de suas diversas posições dentro do vetor • sinônimos: variáveis indexadas, variáveis compostas, variáveis subscritas, arranjos, matrizes (bidimensionais), tabelas em memória ou arrays.

Vetores 2/3 Vetores são estruturas de dados que armazenam usualmente uma quantidade fixa de

Vetores 2/3 Vetores são estruturas de dados que armazenam usualmente uma quantidade fixa de dados de um certo tipo; por esta razão, também são conhecidos como estruturas homogêneas de dados. Internamente, um vetor armazena diversos valores, cada um associado a um número que se refere à posição de armazenamento, e é conhecido como índice. Os vetores são estruturas indexadas, em que cada valor que pode ser armazenado em uma certa posição (índice) é chamado de elemento do vetor. Cada elemento do vetor pode ser utilizado individualmente de forma direta, ou seja, pode ser lido ou escrito diretamente, sem nenhuma regra ou ordem preestabelecida, fazendo dos vetores estruturas de dados de acesso aleatório.

Vetores 3/3 O número de posições de um vetor corresponde ao tamanho que ele

Vetores 3/3 O número de posições de um vetor corresponde ao tamanho que ele tem; assim, um vetor de tamanho 10 tem esse número de elementos, isto é, pode armazenar até dez elementos distintos. Os diferentes elementos de um vetor são distinguidos unicamente pela posição que ocupam no vetor. Cada posição de um vetor é unicamente identificada por um valor inteiro positivo, linear e sequencialmente numerado. Ou seja: vetor[i] “i-ésimo” elemento do vetor, sendo que o valor da variável “i” deve pertencer ao intervalo do índice do vetor, ou seja, 0 i (n-1) As linguagens C e C++ como o Java são linguagens com vetores zero-based, isto é, as posições do vetor iniciam a numeração a partir do valor “ 0”, portanto, um vetor de tamanho 10 teria índices iniciados em 0 prosseguindo até o 9.

Vetores ou Variáveis Indexadas • O termo indexada provém da maneira como é feita

Vetores ou Variáveis Indexadas • O termo indexada provém da maneira como é feita a individualização dos elementos do conjunto de dados: por meio de índices. • Uma variável indexada pode ser definida como tendo um ou mais índices. – vetor, um único índice (unidimensionais) – matriz, dois índices (bidimensionais) – multidimensionais, pouco frequentes

Em Síntese: Características Básicas • estrutura de dados homogênea e indexada • todos os

Em Síntese: Características Básicas • estrutura de dados homogênea e indexada • todos os elementos da estrutura são igualmente acessíveis – tempo e tipo de procedimento para acessar qualquer um dos elementos do vetor são “iguais” • cada elemento componente deste tipo de estrutura de dados tem um nome próprio que é o nome do vetor seguido da posição, ou índice Nome. Da. Variável. Vetor[posição, ou índice]

Declarando Variáveis do Tipo Vetor (1/3) Na declaração de vetores deverão ser fornecidas três

Declarando Variáveis do Tipo Vetor (1/3) Na declaração de vetores deverão ser fornecidas três informações: (1) o nome do vetor, (2) o número de posições do vetor (seu tamanho) e (3) o tipo de dado que será armazenado no vetor. A declaração de um vetor para “inteiros”, de nome “vetor” e tamanho igual a 10, em C: #define n 10 int vetor[n]; // tamanho do vetor // declaração do vetor Podemos notar que as declarações de vetores são semelhantes às declarações de variáveis, os elementos sintáticos que diferenciam as variáveis do tipo vetor das outras variáveis são os colchetes.

Declarando Variáveis do Tipo Vetor (2/3) definindo o tamanho do vetor em tempo de

Declarando Variáveis do Tipo Vetor (2/3) definindo o tamanho do vetor em tempo de projeto (código fonte) #define n 100 // tamanho do vetor float salarios[n]; int a[10], b[10]; // declaração compacta Nos exemplos acima temos: a e b, são conjuntos de 10 componentes inteiros cada, ou seja, variáveis capazes de armazenar 10 números inteiros simultaneamente; salarios, com capacidade de armazenar um total de n (100) números reais;

Declarando Variáveis do Tipo Vetor (3/3) definindo o tamanho do vetor em tempo de

Declarando Variáveis do Tipo Vetor (3/3) definindo o tamanho do vetor em tempo de execução (usuário final) int n; // tamanho do vetor do { printf("Informe o tamanho do vetor: "); scanf("%d", &n); } while (n <= 0); int vetor[n]; No exemplo acima a quantidade de elementos que poderão ser armazenados na variável "vetor" dependerá do valor fornecido pelo usuário no comando de entrada: scanf("%d", &n);

vetores, individualizando valores: x[expressão] onde: x nome da variável do tipo vetor expressão posição

vetores, individualizando valores: x[expressão] onde: x nome da variável do tipo vetor expressão posição que define qual o elemento da estrutura de dados está sendo referenciado. Atenção: deve ser um valor pertencente ao intervalo do índice da variável. Observação: Os elementos de um vetor tem todas as características de uma variável comum e podem aparecer livremente em expressões e atribuições. vetor[5] = vetor[0] * vetor[i+j];

Compreendendo o armazenamento de um vetor: int main() { #define n 10 int a[n];

Compreendendo o armazenamento de um vetor: int main() { #define n 10 int a[n]; a[0] = 17; a[1] = 33; a[2] = 21; a[3] = 67; a[4] = 81; } 0 1 2 a[5] = 10; a[6] = 45; a[7] = 29; a[8] = 79; a[9] = 98; a[? ] 3 4 5 6 7 8 9 17 33 21 67 81 10 45 29 79 98

Em Síntese: #define n 5 // tamanho do vetor // declarando o vetor "v"

Em Síntese: #define n 5 // tamanho do vetor // declarando o vetor "v" com "n" // números inteiros int v[n]; int i; // índice ou posição // processando os "n" elementos do vetor "v" for (i=0; i<n; i++) { v[i] ---> i-ésimo elemento do vetor "v" } // representação interna v[0] v[1] v[2] v[3] v[4]

Operações básicas com vetores ou array’s: Do mesmo modo que acontece com variáveis simples,

Operações básicas com vetores ou array’s: Do mesmo modo que acontece com variáveis simples, também é possível realizar operações de atribuição (=), leitura (scanf) e escrita (printf) com variáveis indexadas. Contudo, não é possível operar diretamente com o conjunto completo, mas com cada um de seus elementos isoladamente. Por exemplo, para somar dois vetores é necessário somar cada um de seus componentes dois a dois. Da mesma forma, as operações de atribuição, leitura e escrita de conjuntos devem ser feitas elemento a elemento. sendo, int a[10], b[10], c[10]; Certo: for (int i=0; i<10; i++) c[i] = a[i] + b[i]; Errado: c = a + b; for (int i=0; i<10; i++) scanf("%d", &a[i]); scanf("%d", &a); for (int i=0; i<10; i++) printf("%dn", a[i]); printf("%d", a);

Atribuição (=) No caso de variáveis indexadas, além do nome da variável deve-se necessariamente

Atribuição (=) No caso de variáveis indexadas, além do nome da variável deve-se necessariamente fornecer também o(s) índice(s) que individualizam o elemento do conjunto onde será armazenado o resultado da avaliação da expressão. Nome. Da. Variável. Vetor[posição] = Expressão; int main() { int nota[5]; nota[0] = 80; nota[1] = 70; nota[2] = 90; nota[3] = 85; nota[4] = 100; . . . }

Leitura A leitura de um conjunto é feita passo, um componente por vez, usando

Leitura A leitura de um conjunto é feita passo, um componente por vez, usando a mesma sintaxe da instrução primitiva de entrada de dados (scanf). Mais uma vez, além do nome do conjunto, deve ser explicitada a posição do elemento no vetor que receberá o valor lido. #include "stdio. h" int main() { int nota[5]; for (int i=0; i<5; i++) { printf("n. Informe o valor da %da. Nota: ", i); scanf("%d", &nota[i]); } . . . // processo de saída ou escrita }

Escrita A escrita de um conjunto obedece à mesma sintaxe da instrução primitiva de

Escrita A escrita de um conjunto obedece à mesma sintaxe da instrução primitiva de saída de dados (printf). Mais uma vez, convém lembrar que, além do nome do conjunto, deve-se também especificar por meio de seu(s) índice(s) qual o elemento do vetor será escrito. #include "stdio. h" int main() { int nota[5]; . . . // processo de entrada ou leitura for (int i=0; i<5; i++) { printf("n%d- %d", i, nota[i]); } }

#include "stdio. h" int main() { #define n 5 // tamanho do vetor int

#include "stdio. h" int main() { #define n 5 // tamanho do vetor int v[n]; // declaração do vetor "v" int i; // índice ou posição for (i=0; i<n; i++) { printf("Informe %do. elemento de %d: ", (i+1), n); scanf("%d", &v[i]); } printf("n"); for (i=0; i<n; i++) { printf("v[%d] = %dn", i, v[i]); } }

Procedimentos auxiliares #include <stdlib. h> #include <time. h> • srand(time(NULL)): inicializar o gerador de

Procedimentos auxiliares #include <stdlib. h> #include <time. h> • srand(time(NULL)): inicializar o gerador de números aleatórios garantindo que a cada execução o valor da “semente” será diferente. • rand(): gerador de números aleatórios. (rand() % 10) → nros aleatórios no intervalo de 0 até 9 (rand() % 100) → nros aleatórios no intervalo de 0 até 99 (rand() % 1000) → nros aleatórios no intervalo de 0 até 999

Contadores- quantificar coisas: Variavel. Contador = Variavel. Contador + 1; Variavel. Contador++; 3 ou

Contadores- quantificar coisas: Variavel. Contador = Variavel. Contador + 1; Variavel. Contador++; 3 ou #include <stdio. h> #include <stdlib. h> #include <time. h> int main() { #define n 10 // tamanho do vetor int i; // índice ou posição int a[n]; // declaração do vetor "a" srand(time(NULL)); for (i=0; i<n; i++) { a[i] = (rand() % 50); } int ct = 0; // declaração e inicialização do contador for (i=0; i<n; i++) { // verifica "se" o i-ésimo item do vetor é menor que 10 if (a[i] < 10) ct = ct + 1; } for (i=0; i<n; i++) { if (a[i] < 10) printf("a[%d] = %2 d <=== menor que 10n", i, a[i]); else printf("a[%d] = %2 dn", i, a[i]); } // exibe o resultado printf("nn. Existem %d itens no vetor menores que 10. n", ct); return 0; }

Somatórios- somar coisas: Variavel. Somatorio = Variavel. Somatorio + Valor. Somado; ou Variavel. Somatorio

Somatórios- somar coisas: Variavel. Somatorio = Variavel. Somatorio + Valor. Somado; ou Variavel. Somatorio += Valor. Somado; #include <stdio. h> #include <stdlib. h> #include <time. h> int main() { #define n 10 // tamanho do vetor int i; // índice ou posição int a[n]; // declaração do vetor "a" srand(time(NULL)); for (i=0; i<n; i++) { a[i] = (rand() % 50); } int sm = 0; // declaração e inicialização do somatório for (i=0; i<n; i++) { // verifica "se" o i-ésimo item do vetor é par if ((a[i] % 2) == 0) sm = sm + a[i]; } for (i=0; i<n; i++) { if ((a[i] % 2) == 0) printf("a[%d] = %2 d <=== parn", i, a[i]); else printf("a[%d] = %2 dn", i, a[i]); } // exibe o resultado printf("nn. Soma dos pares = %dn", sm); return 0; }

Médias- calcular médias: Salário médio dos funcionário do sexo masculino Idade média dos alunos

Médias- calcular médias: Salário médio dos funcionário do sexo masculino Idade média dos alunos da disciplina de algoritmos média = soma / quantidade de valores; #include <stdio. h> #include <stdlib. h> #include <time. h> int main() { #define n 10 // tamanho do vetor int i; // índice ou posição int a[n]; // declaração do vetor "a" srand(time(NULL)); for (i=0; i<n; i++) { a[i] = (rand() % 50); } int sm = 0, ct = 0; // declara e inicializa as variáveis float media = 0; for (i=0; i<n; i++) { // verifica "se" o i-ésimo item do vetor é par if ((a[i] % 2) == 0) { sm = sm + a[i]; // soma os pares ct = ct + 1; // conta os pares printf("a[%d] = %2 d <=== %do. parn", i, a[i], ct); } else printf("a[%d] = %2 dn", i, a[i]); } // exibe os resultados if (ct != 0) media = float(sm) / ct; // calcula a média dos nros pares printf("nn. Soma dos pares = %3 dn", sm); printf("Qtd. de pares = %3 dn", ct); printf("Media dos pares = %6. 2 fn", media); return 0; }

Percentuais- calcular valores percentuais: % de funcionários do sexo masculino % de números pares

Percentuais- calcular valores percentuais: % de funcionários do sexo masculino % de números pares percentual = (valor parcial / valor total) * 100; #include <stdio. h> #include <stdlib. h> #include <time. h> int main() { #define n 10 // tamanho do vetor int i; // índice ou posição int a[n]; // declaração do vetor "a" srand(time(NULL)); for (i=0; i<n; i++) { a[i] = (rand() % 50); } int ct = 0; // declara e inicializa as variáveis float p = 0; for (i=0; i<n; i++) { // verifica "se" o i-ésimo item do vetor é par if ((a[i] % 2) == 0) { ct = ct + 1; printf("a[%d] = %2 d <=== %do. parn", i, a[i], ct); } else printf("a[%d] = %2 dn", i, a[i]); } // exibe o resultado p = (ct * 100. 0) / n; // calcula o percentual de nros pares printf("nn. Existem %d pares, ou seja, %. 2 f%%n", ct, p); return 0; }

Aplicações com Vetores • Classificação, organizar um conjunto de elementos em uma determinada ordem

Aplicações com Vetores • Classificação, organizar um conjunto de elementos em uma determinada ordem (alfabética, numérica ou cronológica) – Método da Bolha, mais popular • Pesquisa, verificar a existência de um valor dentro de um conjunto – Método de Pesquisa Sequencial – Método de Pesquisa Binária

Ordenação por Troca (Método da Bolha) A filosofia básica deste método consiste em: 1.

Ordenação por Troca (Método da Bolha) A filosofia básica deste método consiste em: 1. "Varrer" o vetor, comparando os elementos vizinhos entre si: if (a[j] > a[j+1]). 2. Caso estejam fora de ordem, os mesmos trocam de posição entre si (swap). 3. Procede-se assim até o final do vetor. Na primeira "varredura" verifica-se que o último elemento do vetor já está no seu devido lugar (no caso de ordenação crescente, ele é o maior de todos). A segunda "varredura" é análoga à primeira e vai até o penúltimo elemento. 4. Este processo é repetido até que seja feito um número de varreduras igual ao número de elementos a serem ordenados menos um. Ao final do processo o vetor está classificado segundo o critério escolhido.

#include "stdio. h" #include "stdlib. h" int main() { // declaração da estrutura de

#include "stdio. h" #include "stdlib. h" int main() { // declaração da estrutura de dados #define n 10 int i, j, a[n]; // entrada- gerar nros aleatórios para armazenar no vetor randomize(); for (i=0; i<n; i++) a[i] = random(10); // processamento: ordenação usando o método da bolha (Buble Sort) int aux; 4 for (i=1; i<=(n-1); i++) 3 for (j=0; j<(n-i); j++) if (a[j] > a[j+1]) { 1 aux = a[j]; // swap: troca dois elementos de posição a[j] = a[j+1]; 2 a[j+1] = aux; } // saída- imprime os resultados printf("i- Vetor Ordenadon"); for (i=0; i<n; i++) printf("%d- %8 dn", i, a[i]); }

Ordenação por Seleção Um dos algoritmos mais simples de ordenação. Neste método a classificação

Ordenação por Seleção Um dos algoritmos mais simples de ordenação. Neste método a classificação é efetivada por seleção sucessiva do menor valor de chave contido no vetor "a". A cada passo é feita uma varredura do segmento do vetor com os elementos ainda não selecionados e determinado aquele elemento de menor valor, o qual é colocado, por troca, em sua posição definitiva no vetor classificado e o processo repetido para o segmento que contém os elementos ainda não selecionados. Na Prática 1º passo: procura a posição do menor elemento do vetor (min) e em seguida realiza a troca deste elemento com aquele que está na primeira posição (a[i]); 2º passo: procura o menor elemento no subvetor que começa a partir da segunda posição e troca com o segundo elemento e assim por diante; O método deverá repetir sucessivamente o processo de seleção durante "n-1" passos.

#include "stdio. h" #include "stdlib. h" int main() { // entrada- declaração do vetor

#include "stdio. h" #include "stdlib. h" int main() { // entrada- declaração do vetor e gera nros aleatórios #define n 10 int aux, i, j, min, a[n]; randomize(); for (i=0; i<n; i++) a[i] = random(10); // processamento: ordenação por seleção (Selection Sort) for (i=0; i<(n-1); i++) { min = i; for (j=(i+1); j<n; j++) if (a[j] < a[min]) min = j; // min = posição do menor elemento aux = a[i]; // swap: troca dois elementos de posição a[i] = a[min]; a[min] = aux; } // saída- imprime os resultados printf("i- Vetor Ordenadon"); for (i=0; i<n; i++) printf("%d- %8 dn", i, a[i]); }

Método de Pesquisa Sequencial A pesquisa sequencial ou linear é o método mais objetivo

Método de Pesquisa Sequencial A pesquisa sequencial ou linear é o método mais objetivo para se encontrar um elemento particular em um conjunto não classificado. Esta técnica consiste: 1. na simples verificação de cada componente do conjunto sequencialmente, uma após a outra 2. até que o elemento desejado seja encontrado, neste caso, diz-se que a pesquisa foi bem sucedida 3. ou que todos os elementos do conjunto tenham sido verificados sem que o elemento procurado tenha sido encontrado, pesquisa mal sucedida.

int main() { . . . int x; printf("Informe o valor a ser procurado

int main() { . . . int x; printf("Informe o valor a ser procurado no vetor: "); scanf("%d", &x); // processamento: Método de Pesquisa Sequencial int encontrou = 0; // flag, 0 - pesquisa “mal” sucedida // 1 - pesquisa “bem” sucedida int p = 0; while ((p < n) && (encontrou == 0)) 1 if (a[p] == x) encontrou = 1; 2 // o elemento foi encontrado else p = p + 1; . . . if (encontrou == 0) printf("%d não está armazenado no vetor. n", x); else printf("%d está armazenado na posição %d. n", x, p); } 3

Método de Pesquisa Binária Quando os elementos de um vetor estão previamente classificados segundo

Método de Pesquisa Binária Quando os elementos de um vetor estão previamente classificados segundo algum critério, então pesquisas muito mais eficientes podem ser conduzidas. Entre estas destaca-se o método de pesquisa binária. Esta técnica consiste: 1. inicialmente o vetor é classificado 2. o elemento que divide o vetor ao meio com relação ao seu número de componentes é localizado e comparado ao valor procurado. 3. Se ele for igual ao valor procurado a pesquisa é dita bem sucedida e é interrompida. 4. no caso dele ser maior que o valor procurado, repete-se o processo na primeira metade do vetor. 5. no caso do elemento central do vetor ser menor que o valor procurado, repete-se o processo na segunda metade do vetor. 6. Este procedimento é continuado até que o elemento desejado seja localizado (pesquisa bem sucedida), ou então, até que não reste mais nenhum trecho do vetor a ser pesquisado (pesquisa mal sucedida).

int main() { . . . // classificar o vetor 1 int x; printf("Informe

int main() { . . . // classificar o vetor 1 int x; printf("Informe o valor a ser procurado no vetor: "); scanf("%d", &x); // processamento: Método de Pesquisa Binária int encontrou = 0; // flag, 0 - pesquisa “mal” sucedida // 1 - pesquisa “bem” sucedida int meio, inicio = 0, fim = (n – 1); while ((inicio <= fim) && (encontrou == 0)) { 6 meio = (inicio + fim) / 2; if (a[meio] == x) 2 encontrou = 1; 3 // o elemento foi encontrado else if (a[meio] > x) fim = meio – 1; 4 // primeira metade do vetor else inicio = meio + 1; 5 // segunda metade do vetor } if (encontrou == 0) printf("%d não está armazenado no vetor. n", x); else printf("%d está armazenado na posição %d. n", x, meio); }

Vetores Bidimensionais, ou Matrizes C suporta vetores multidimensionais. A forma mais simples de vetor

Vetores Bidimensionais, ou Matrizes C suporta vetores multidimensionais. A forma mais simples de vetor multidimensional é o vetor bidimensional, ou matriz (Ai, j). – tabela de linhas e colunas – armazenam vetores dentro de vetores Por exemplo, para declarar um vetor bidimensional de inteiros denominado “matriz” de tamanho 2 x 4, ou seja, 2 linhas por 4 colunas, deve-se escrever o seguinte código: int matriz[2][4]; Atenção: Muitas linguagens de programação usam vírgulas para separar as dimensões do vetor multidimensional; C, em contraste, coloca cada dimensão no seu próprio conjunto de colchetes.

Declarando um vetor bidimensional, ou matriz int A[2][4]; Referenciando as posições da matriz 1

Declarando um vetor bidimensional, ou matriz int A[2][4]; Referenciando as posições da matriz 1 a. Linha 2 a. Linha ------------A[0][0] = 17; A[1][0] = 13; A[0][1] = 33; A[1][1] = 81; A[0][2] = 21; A[1][2] = 97; A[0][3] = 15; A[1][3] = 67; 0 A[i][j] 1 2 3 0 17 33 21 15 1 13 81 97 67 i, linha j, coluna

Lendo e escrenvendo um vetor bidimensional, ou matriz A leitura de um conjunto bidimensional

Lendo e escrenvendo um vetor bidimensional, ou matriz A leitura de um conjunto bidimensional é feita, como nos vetores unidimensionais, passo a passo, um componente por vez, usando a mesma sintaxe das instruções primitivas de entrada (scanf) e saída (printf) informando o nome da matriz as posições da linha e da coluna como mostra o exemplo a seguir: #include "stdio. h" #include "conio. h" int main() { #define n 3 int matriz[n][n], i, j; for (i=0; i<n; i++) for (j=0; j<n; j++) { printf("Informe o valor da linha %d, coluna %d. n", i, j); scanf("%d", &matriz[i][j]); } clrscr(); for (i=0; i<n; i++) { for (j=0; j<n; j++) printf("%4 d ", matriz[i][j]); printf("n"); } }

Inicialização de Vetores C permite a inicialização de vetores no momento da declaração, como

Inicialização de Vetores C permite a inicialização de vetores no momento da declaração, como é demonstrado nos exemplos a seguir: int vetor[10] = {17, 33, 21, 67, 81, 10, 45, 29, 79, 98}; isso significa que vetor[0] terá o valor 17 e vetor[9] terá o valor 98 int matriz[2][4] = {17, 33, 21, 15, 13, 81, 97, 67}; nos vetores bidimensionais os valores são inicializados por linha, no exemplo, matriz[1][2] (segunda linha e terceira coluna) terá o valor 97

Vetor de Strings Para criar um vetor de strings, usa-se uma matriz bidimensional de

Vetor de Strings Para criar um vetor de strings, usa-se uma matriz bidimensional de caracteres. Na declaração o tamanho do índice esquerdo indica o número de strings e o “tamanho do índice direito especifica o comprimento máximo de cada string”. #include "stdio. h" int main() { char nome. Mes[12][3] = {"jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"}; for (int i=0; i<12; i++) { printf("%2 d-", (i+1)); for (int j=0; j<3; j++) printf("%c", nome. Mes[i][j]); printf("n"); } }

Vetores Multidimensionais C permite vetores com mais de duas dimensões. O limite exato, se

Vetores Multidimensionais C permite vetores com mais de duas dimensões. O limite exato, se existe, é determinado pelo compilador usado. A forma geral da declaração de um vetor multidimensional segue a seguinte sintaxe: tipo nome[Tamanho 1][Tamanho 2][Tamanho 3]. . . [Tamanho. N]; por exemplo, int x[2][2][4]; onde “x” representa uma estrutura de dados com 2 * 4 = 16 números inteiros, indexados da seguinte forma: x[0][0][0] x[0][1][0] x[1][0][0] x[1][1][0] x[0][0][1] x[0][1][1] x[1][0][1] x[1][1][1] x[0][0][2] x[0][1][2] x[1][0][2] x[1][1][2] x[0][0][3] x[0][1][3] x[1][0][3] x[1][1][3]

Conceitos sobre Matrizes • Matriz quadrada – número de linhas igual ao número de

Conceitos sobre Matrizes • Matriz quadrada – número de linhas igual ao número de colunas • Diagonal principal – Ai, j para todo i == j • Diagonal secundária – Ai, j para todo (i + j) == (n - 1) • Matriz esparsa – a maioria dos elementos da matriz é zero

Exemplo de Matriz Quadrada #define n 4 int A[n][n] = {17, 33, 21, 15,

Exemplo de Matriz Quadrada #define n 4 int A[n][n] = {17, 33, 21, 15, 13, 81, 97, 67, 13, 31, 24, 5, 3, 8, 92, 63}; i, linha 0 1 A[i][j] 2 3 0 17 33 21 15 1 13 81 97 67 2 13 31 24 3 3 8 j, coluna 5 92 63 diagonal secundária ((i+j)==(n-1)): A[0][3] 15 A[1][2] 97 A[2][1] 31 A[3][0] 3 diagonal principal (i==j): A[0][0] 17 A[1][1] 81 A[2][2] 24 A[3][3] 63

// Dado um vetor A de duas dimensões com 4 linhas e 4 colunas.

// Dado um vetor A de duas dimensões com 4 linhas e 4 colunas. Elaborar um programa que // calcule e escreva o valor da soma dos elementos deste vetor, ou matriz. #include "stdio. h" #include "stdlib. h" #include "conio. h" Alimentando a matriz por linha: i: 0, 1, 2, 3, j: 0, 1, 2, 3 int main() { // declaração da estrutura de dados #define n 4 int A[n][n]; // matriz quadrada de n linhas x n colunas int i, j, sm = 0; // entrada- gerar nros aleatórios para armazenar no vetor bidimensional randomize(); for (i=0; i<n; i++) for (j=0; j<n; j++) A[i][j] = random(10); // processamento: somando todos os elementos da matriz for (i=0; i<n; i++) for (j=0; j<n; j++) sm = sm + A[i][j]; // saída: imprime os resultados clrscr(); printf("Matriz An"); printf("=======n"); for (i=0; i<n; i++) { for (j=0; j<n; j++) printf("%2 d ", A[i][j]); printf("n"); } printf("n. A soma dos elementos da matriz é igual a %d", sm); }

Operações com Matrizes – Matriz Transposta Dada uma matriz A, chama-se transposta de A

Operações com Matrizes – Matriz Transposta Dada uma matriz A, chama-se transposta de A e indica-se por At a matriz que se obtém trocando-se ordenadamente as linhas pelas colunas de A. A = 1 4 7 2 5 8 3 6 9 At = 1 4 7 2 5 8 3 6 9 para todo 0 ≤ i < n Atj, i = Ai, j para todo 0 ≤ j < n tendo a seguinte estrutura de dados: #define n 3 int i, j, a[n][n], at[n][n]; transposição da matriz "a": for (i=0; i<n; i++) { for (j=0; j<n; j++) { at[j][i] = a[i][j]; } }

Operações com Matrizes – Matriz Simétrica 1. Uma matriz A diz-se simétrica se A

Operações com Matrizes – Matriz Simétrica 1. Uma matriz A diz-se simétrica se A = At. 2. Uma matriz é simétrica se for quadrada e os elementos situados em posições "simétricas" relativamente à diagonal principal forem iguais. A = 1 3 5 0 4 4 7 Ai, j == Aj, i para todo 0 ≤ i < n para todo 0 ≤ j < i tendo a seguinte estrutura de dados: #define n 3 int i, j, ehsimetrica, a[n][n]; verificando se a matriz "a" é simétrica: ehsimetrica = 1; // é simétrica for (i=0; i<n; i++) { for (j=0; j<i; j++) { if (a[i][j] != a[j][i]) { ehsimetrica = 0; // não é simétrica } } }

Operações com Matrizes – Produto de Matrizes (1/2) O produto AB da matriz A

Operações com Matrizes – Produto de Matrizes (1/2) O produto AB da matriz A pela matriz B, apenas está definido se o número de colunas de A for igual ao número de linhas de B. ABnxp = Anxm * Bmxp Somatório do produto dos elementos da i-esima linha da matriz "a" com os respetivos elementos da j-esima coluna da matriz "b". A = 1 3 0 2 5 1 4 0 2 B = 0 4 5 2 1 3 6 1 2 AB = (1*0)+(3*2)+(0*6) (1*4)+(3*1)+(0*1) (1*5)+(3*3)+(0*2) (2*0)+(5*2)+(1*6) (2*4)+(5*1)+(1*1) (2*5)+(5*3)+(1*2) (4*0)+(0*2)+(2*6) (4*4)+(0*1)+(2*1) (4*5)+(0*3)+(2*2) AB = 6 7 14 16 14 27 12 18 24

Operações com Matrizes – Produto de Matrizes (2/2) tendo a seguinte estrutura de dados:

Operações com Matrizes – Produto de Matrizes (2/2) tendo a seguinte estrutura de dados: #define n 3 int i, j, k, sm, a[n][n], b[n][n], ab[n][n]; for (i=0; i<n; i++) { for (j=0; j<n; j++) { // somatório do produto dos elementos da i-esima linha // da matriz "a" com os respetivos elementos da j-esima // coluna da matriz "b" sm = 0; for (k=0; k<n; k++) { sm = sm + (a[i][k] * b[k][j]); } ab[i][j] = sm; } }

Referência • C Completo e Total – Herbert Schildt. – São Paulo: MAKRON Books

Referência • C Completo e Total – Herbert Schildt. – São Paulo: MAKRON Books - 1996.