logo - rcosta62br.unifei.edu.brrcosta62br.unifei.edu.br/escola/eip_04.pdf · • cout

66
Logo

Upload: nguyendien

Post on 16-Dec-2018

245 views

Category:

Documents


0 download

TRANSCRIPT

Logo

2

Aula 04Aula 04

● Agregados Homogêneos

– Matrizes

● Agregados Heterogêneos

3

MatrizMatriz

• Da mesma forma que as variáveis indexadas vetoriais, vistas anteriormente, as variáveis indexadas bidimensionais são utilizadas para o armazenamento de informações em forma de conjuntos;

• No caso, a representação de tais conjuntos é tal como apresentado na matemática tradicional, onde dois índices são utilizados e por isto são denominados de matrizes.

4

MatrizMatriz

• Conceito: Matriz é um conjunto de variáveis, onde cada uma pode armazenar uma informação diferente, mas todas compartilham o mesmo nome. São associados índices a esse nome, que representam as posições da linha e coluna da matriz, permitindo assim, individualizar os elementos.

5

MatrizMatriz

• A memória do computador para armazenar a matriz seria mais ou menos da seguinte forma:

M=[0 1 2

0 m00 m01 m02

1 m10 m11 m12

2 m20 m21 m22]

6

MatrizMatriz

• Na linguagem C/C++, agregado homogêneo é definido da seguinte forma:

tipo NOME_DA_VARIAVEL [ linha ] [ coluna];

• Onde :– linha e colunalinha e coluna = quantidade de células do

agregado;• deve ser sempre maior que zero;• deve ser sempre inteiro;• tem que ter um valor especificado.

7

MatrizMatriz

• Para o exemplo anterior tem-se:

int V[10];

• Porquê 10? Porque o vetor começa na posição 0 e vai até a posição 9, totalizando 10 elementos.

8

MatrizMatriz

• Considere a seguinte matriz 3x3.

M=[10 5 1213 11 81 7 0 ]

9

Manipulando 0 vetorManipulando 0 vetor

• cout << M[0][1] << endl;cout << M[0][1] << endl;– Esse comando vai mostrar o valor 5.

• M[3][0] = 21;M[3][0] = 21;

– Essa atribuição vai colocar o valor 21 na posição 3 0 da matriz, tem que se preocupar em preencher os demais valores da linha.

• cout << M[X][Y] << endl;cout << M[X][Y] << endl;

– Esse comando vai depender do valor de X e Y para mostrar o conteúdo de M[X][Y].

– Exemplo:Exemplo: X = 2 e Y = 1; o valor que irá aparecer é 7.

10

Manipulando 0 vetorManipulando 0 vetor

• cout << M[X – 2][Y + 1] << endl;cout << M[X – 2][Y + 1] << endl;– Esse comando vai depender do valor de X e Y

para mostrar o conteúdo de M[X – 2][Y + 1].

– No caso você está andando duas casas atrás na linha e uma casa a frente na coluna.

Cuidado com as faixas inferiores e superiores Cuidado com as faixas inferiores e superiores da matriz, pois pode dar erro no programa.da matriz, pois pode dar erro no programa.

11

Lendo valores para armazenar Lendo valores para armazenar na Matrizna Matriz

#include <bits/stdc++.h>using namespace std;int main(){

int i, j, lin, col, M[100][100];scanf("%d %d", &lin, &col);for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

scanf("%d", &M[i][j]);}

}return 0;

}

Para ler uma matriz, ou seja, para preencher uma matriz

com informações (dados) é necessária duas estruturas

de repetição, pois uma matriz possui várias posições de

linha e coluna. No exemplo,preenche primeiro a linha e

passa em seguida para alinha seguinte, até estartoda matriz preenchida.

12

Imprimindo valores de uma Imprimindo valores de uma MatrizMatriz

#include <bits/stdc++.h>using namespace std;int main(){

int i, j, lin, col, M[100][100];scanf("%d %d", &lin, &col);for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

scanf("%d", &M[i][j]);}

}

13

Imprimindo valores de uma Imprimindo valores de uma MatrizMatriz

for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

if (j < col - 1){

printf("%d ", M[i][j]);} else {

printf("%d\n", M[i][j]);}

}}return 0;

}

Para imprimir uma matriz, ou seja, para escrever o escrever o

conteúdo de cada posição da conteúdo de cada posição da matrizmatriz, também

precisamos utilizar duasestruturas de repetição.E imprimi uma linha de

cada vez, como o exemplo.

14

Entrada e saídaEntrada e saída

Entrada:Entrada:3 25 2212 114 21

Saída:Saída:5 2212 114 21

15

Entrada e saídaEntrada e saída

• Reparem que na saída os números ficaram desorganizados, pois os números tem a quantidade de dígitos diferentes. Para arrumar basta determinar o maior valor da matriz e aplicar a ele a fórmula:

x = cell(log10(maior));x = cell(log10(maior));

• A seguir acrescentar nos dois printf("%*d ", x, printf("%*d ", x, M[i][j]);M[i][j]);

16

Imprimindo valores de uma Imprimindo valores de uma MatrizMatriz

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);const int INF = -0x3f3f3f3f;int i, j, lin, col, M[100][100];int x, maior;scanf("%d %d", &lin, &col);maior = INF;

17

Imprimindo valores de uma Imprimindo valores de uma MatrizMatriz

for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

scanf("%d", &M[i][j]);if (maior < M[i][j]){

maior = M[i][j];}

}}

18

Imprimindo valores de uma Imprimindo valores de uma MatrizMatriz

x = ceil(log10(maior));for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

if (j < col - 1){

printf("%*d ", x, M[i][j]);} else {

printf("%*d\n", x, M[i][j]);}

}}return 0;

}

19

Entrada e saídaEntrada e saída

Entrada:Entrada:3 25 2212 114 21

Saída:Saída: 5 2212 11 4 21

20

Soma de duas MatrizesSoma de duas Matrizes

• Faça um programa que leia duas matrizes A e B, de mesma dimensão, e faça a soma delas.

21

SoluçãoSolução

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);const int INF = -0x3f3f3f3f;int i, j, lin, col, x, maior;int A[100][100], B[100][100], C[100][100];scanf("%d %d", &lin, &col);

22

SoluçãoSolução

for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

scanf("%d", &A[i][j]);}

}for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

scanf("%d", &B[i][j]);}

}

23

SoluçãoSolução

maior = INF;for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

C[i][j] = A[i][j] + B[i][j];if (maior < C[i][j]){

maior = C[i][j];}

}}

24

SoluçãoSolução

x = ceil(log10(maior));for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

if (j < col - 1){

printf("%*d ", x, C[i][j]);} else {

printf("%*d\n", x, C[i][j]);}

}}return 0;

}

25

Entrada e saídaEntrada e saída

Entrada:Entrada:3 25 211 24 211 32 1221 4

Saída:Saída: 6 513 1425 25

26

Linha, Coluna e DiagonalLinha, Coluna e Diagonal

• Faça um programa que leia uma matriz M de tamanho 3x3 e determine.

– A soma dos elementos da diagonal principal;

– A soma dos elementos da diagonal secundária;

– A soma dos elementos da linha 1;

– A soma dos elementos da coluna 0.

27

SoluçãoSolução

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);int i, j, lin, col, M[100][100];int s1, s2, s3, s4;scanf("%d %d", &lin, &col);for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

scanf("%d", &M[i][j]);}

}

28

SoluçãoSolução

s1 = 0;for (i = 0; i < lin; i++){

s1 += M[i][i];}s2 = 0;for (i = 0; i < lin; i++){

s2 += M[i][lin - i - 1];}

29

SoluçãoSolução

s3 = 0;for (i = 0; i < lin; i++){

s3 += M[1][i];}s4 = 0;for (i = 0; i < lin; i++){

s4 += M[i][0];}

30

SoluçãoSolução

printf("A soma dos elementos da diagonal principal: %d\n", s1);printf("A soma dos elementos da diagonal secundaria: %d\n", s2);printf("A soma dos elementos da linha 1: %d\n", s3);printf("A soma dos elementos da coluna 0: %d\n", s4);return 0;

}

31

Entrada e saídaEntrada e saída

Entrada:Entrada:4 41 2 3 44 3 2 11 2 3 44 3 2 1

Saída:Saída:A soma dos elementos da diagonal principal: 8A soma dos elementos da diagonal secundaria: 12A soma dos elementos da linha 1: 10A soma dos elementos da coluna 0: 10

32

Multiplicação de duas MatrizesMultiplicação de duas Matrizes

• Faça um programa que leia duas matrizes A e B. Faça a multiplicação entre elas. Verifique a condição da matriz A ter o mesmo número de coluna da linha da matriz B.

33

SoluçãoSolução

#include <bits/stdc++.h>using namespace std;int main(){ freopen("entrada.txt", "r", stdin); const int INF = -0x3f3f3f3f;

int i, j, k, lin1, col1, lin2, col2, x, maior;int A[100][100], B[100][100], C[100][100];scanf("%d %d", &lin1, &col1);scanf("%d %d", &lin2, &col2);

34

SoluçãoSoluçãoif (col1 == lin2){

for (i = 0; i < lin1; i++){

for (j = 0; j < col1; j++){

scanf("%d", &A[i][j]);}

}for (i = 0; i < lin2; i++){

for (j = 0; j < col2; j++){

scanf("%d", &B[i][j]);}

}

35

SoluçãoSoluçãomaior = INF;for (i = 0; i < lin1; i++){

for (j = 0; j < col2; j++){

C[i][j] = 0;for (k = 0; k < col1; k++){

C[i][j] += A[i][k] * B[k][j];if (maior < C[i][j]){

maior = C[i][j];}

}}

}

36

SoluçãoSoluçãox = ceil(log10(maior));for (i = 0; i < lin1; i++){

for (j = 0; j < col2; j++){

if (j < col2 - 1){

printf("%*d ", x, C[i][j]);} else {

printf("%*d\n", x, C[i][j]);}

}}

} else {printf("Nao pode multiplicar as matrizes\n");

}return 0;

}

37

Entrada e saídaEntrada e saída

Entrada:Entrada:2 33 25 -211 2-4 211 -3 212 21 4

Saída:Saída:232 5435 30

38

Matriz com vectorMatriz com vector

• Para utilizar o vector em duas dimensões tem-se que fazer a declaração da seguinte forma:

vector <vector <tipo>> nome_variavel;vector <vector <tipo>> nome_variavel;

39

Leitura de elementosLeitura de elementos

• Para ler elementos tem-se que ter em mente que você quer obter um vetor dentro de um vetor. O programa a seguir mostra como isso é feito.

40

Leitura com vectorLeitura com vector

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);int i, j, lin, col, x;vector <vector <int> > M;vector <int> V;scanf("%d %d", &lin, &col);

41

Leitura com vectorLeitura com vector

for (i = 0; i < lin; i++){

for (j = 0; j < col; j++){

scanf("%d", &x);V.push_back(x);

}M.push_back(V);V.clear();

}return 0;

}

NÃO VALEA PENA!!

42

ExercíciosExercícios

• https://www.urionlinejudge.com.br/judge/en/login

– URI 1181 a 1190, 1435, 1478, 1534, 1557, 1827, 2163, 2168, 2552.

43

Vetor de StringVetor de String

• Um vetor de string é a coleção de uma matriz com linha e tamanho de carácter, isto é:

char nome_variavel[linha][quantidade_carácter];char nome_variavel[linha][quantidade_carácter];

44

Vetor de StringVetor de String

• Dada a seguinte lista: char lista[10][20] =char lista[10][20] =

{“Casa”, “Apartamento” ,”Terreno”, ”Loja”};{“Casa”, “Apartamento” ,”Terreno”, ”Loja”};

• cout << lista[1] << endl;cout << lista[1] << endl;– Esse comando vai mostrar o valor

Apartamento.

• copy(lista[4], “Imovel”);copy(lista[4], “Imovel”);

– Essa atribuição vai colocar o valor Imovel na posição 4 da linha do vetor de string.

45

Lendo valores para o vetor de Lendo valores para o vetor de stringstring

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);int i, n, x;char lista[100][40];scanf("%d", &n);for (i = 0; i < n; i++){

scanf(" %[^\n]", lista[i]);}return 0;

}

46

Imprimindo valores de Imprimindo valores de vetor vetor de stringde string

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);int i, n, x;char lista[100][40];scanf("%d", &n);for (i = 0; i < n; i++){

scanf(" %[^\n]", lista[i]);}

47

Imprimindo valores de Imprimindo valores de vetor vetor de stringde string

for (i = 0; i < n; i++){

printf("%s\n", lista[i]);}return 0;

}

48

Entrada e saídaEntrada e saída

Entrada:Entrada:4CasaApartamentoTerrenoLoja

Saída:Saída:CasaApartamentoTerrenoLoja

49

ExemploExemplo

• O professor pegou a lista de chamada e resolver conferir se todos os alunos que tenham o nome começando com a letra ‘A’ estão na sala. Você pode fazer um programa para ajudá-lo a saber quais são os nomes que começam com ‘A’.

50

SoluçãoSolução

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);int i, n, x;char nome[100][40];scanf("%d", &n);for (i = 0; i < n; i++){

scanf(" %[^\n]", nome[i]);}

51

SoluçãoSolução

for (i = 0; i < n; i++){

if (nome[i][0] == 'A'){

printf("%s\n", nome[i]);}

}return 0;

}

52

Entrada e saídaEntrada e saída

Entrada:Entrada:5Antonio CarlosPedro MiguelAna PaulaFatima SantosFujiro Nakombi

Saída:Saída:Antonio CarlosAna Paula

53

Vector de StringVector de String

• Pode-se usar um vector de string da seguinte forma:

vector <string> nome_variavel;vector <string> nome_variavel;

• Mas ela tem que ser lida primeira por uma string e depois colocada no vector.

54

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;int main(){

freopen("entrada.txt", "r", stdin);int i, n;string x;vector <string> nome;cin >> n;for (i = 0; i < n; i++){

getline(cin, x);nome.push_back(x);

}

55

ProgramaPrograma

for (i = 1; i <= n; i++){

if (nome[i][0] == 'A'){

cout << nome[i] << endl;}

}return 0;

}

MEU PROGRAMADEU ERRO!!!

56

Entrada e saídaEntrada e saída

Entrada:Entrada:5Antonio CarlosPedro MiguelAna PaulaFatima SantosFujiro Nakombi

Saída:Saída:Antonio CarlosAna Paula

57

ExercíciosExercícios

• https://www.urionlinejudge.com.br/judge/en/login

– URI 2137, 2174, 2587

• Vá no URI e comece a resolver os problemas de string.

58

Agregados HeterogêneosAgregados Heterogêneos

• Na linguagem C/C++, assim como nas linguagens atuais, existe uma forma de agregar-se informações de tipos diferentes, sem a necessidade de utilização de várias variáveis, ou seja, utilizando-se apenas uma única variável.

59

Agregados HeterogêneosAgregados Heterogêneos

• Uma das formas genéricas de se fazer isto na linguagem C/C++ é a seguinte:

struct NOME_DA_ESTRUTURA {struct NOME_DA_ESTRUTURA {tipotipo11 campo campo11;;tipotipo22 campo campo22;;tipotipo33 campo campo33;;......tipotiponn campo camponn;;

};};

60

ExemploExemplo

• Um professor que sua ajuda para fazer um programa que leia: o nome, matricula e as 4 notas que o professor vai atribuir ao aluno. O nome tem no máximo 50 caracteres, a matricula é um numero inteiro e as notas são valores reais com 1casa decimal. O programa deve imprimir todos os dados de entrada, a média final dos alunos, bem como, se ele for aprovado o conceito ‘A’ se a média for maior e igual a 6.0, ou se for reprovado o conceito ‘R’, com a média for menor que 6.0. O professor tem no máxima 100 alunos.

61

ProgramaPrograma

int main(){

freopen("entrada.txt", "r", stdin);int i, j, n;struct ALUNOS V[100];double soma;scanf("%d", &n);

62

ProgramaPrograma

for (i = 0; i < n; i++){

soma = 0.0;scanf(" %[^\n]", V[i].nome);scanf("%d", &V[i].mat);for (j = 0; j < 4; j++){

scanf("%lf", &V[i].nota[j]);soma += V[i].nota[j];

}V[i].media = soma / 4;

}

63

ProgramaProgramafor (i = 0; i < n; i++){

printf("%-20s - ", V[i].nome);printf("%10d - ", V[i].mat);for (j = 0; j < 4; j++){

printf("%4.1lf - ", V[i].nota[j]);}printf("%4.1lf - ", V[i].media);if (V[i].media >= 6.0){

printf("A\n");} else {

printf("R\n");}

}return 0;

}

64

EntradaEntradaEntrada:Entrada:5Antonio Carlos201801202110.0 5.0 4.0 8.3Pedro Miguel20180112122.0 3.5 4.3 7.2Ana Paula20180333236.0 2.0 9.0 1.3Fatima Santos20180000274.5 5.5 4.5 5.5Fujiro Nakombi20180125556.0 6.0 6.0 6.0

65

SaídaSaída

Saída:Saída:Antonio Carlos - 2018012021 - 10.0 - 5.0 - 4.0 - 8.3 - 6.8 - APedro Miguel - 2018011212 - 2.0 - 3.5 - 4.3 - 7.2 - 4.2 - RAna Paula - 2018033323 - 6.0 - 2.0 - 9.0 - 1.3 - 4.6 - RFatima Santos - 2018000027 - 4.5 - 5.5 - 4.5 - 5.5 - 5.0 - RFujiro Nakombi - 2018012555 - 6.0 - 6.0 - 6.0 - 6.0 - 6.0 - A

66

ExercíciosExercícios

• https://www.urionlinejudge.com.br/judge/en/login

– URI 2693