Logo - rcosta62br.unifei.edu.brrcosta62br.unifei.edu.br/escola/EIP_04.pdf · • cout
-
Upload
nguyendien -
Category
Documents
-
view
245 -
download
0
Transcript of Logo - rcosta62br.unifei.edu.brrcosta62br.unifei.edu.br/escola/EIP_04.pdf · • cout
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.
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.
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;
}
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