Dark Skyllen 7 #1 Postado 29 Abril, 2010 (editado) Vetores e Matrizes parte 2 Bom, vamos continuar nossa aula de Vetores e Matrizes! OiaeuMae O que é uma Matriz?Pra quem já sabe o que é um vetor, uma matriz se torna muito mais fácil. No vetor, temos uma "linha fatiada" de espaços na variável pra guardar valores. Na matriz teremos linhas e colunas. Vejam a imagem e diferenciem vetores de matrizes. Se declararmos uma matriz[7][6]: É como se tivessemos 7 vetores de 6 posições! :coolface: Agora, suponhando que eu queria pegar o valor que estiver na linha 5 e na coluna 4: Como faríamos para acessar esse valor? Usando a mesma for para vetores: matriz[4][3] Lembrando que temos o 0, por isso há essa mudança de números o que pode confundir vocês! Agora que aprendemos um pouco sobre matrizes, vamos colocá-las em uso? #include <iostream.h> #include <conio.h> int main() { int matriz[3][3] = {1,2,3, 4,5,6, 7,8,9}; cout << "Acessando valor da 2 linha e 2 coluna: " << matriz[1][1]; getch(); } O código acima inicializa a matriz no braço e depois exibe as coordenadas passadas. Agora vamos ver como preencher a matriz inteira: #include <iostream.h> #include <conio.h> int main() { int matriz[3][3]; /* Inicia a matriz com os valores digitados pelo usuário */ for (int linha=0; linha<3; linha++) /* Quando o for da coluna terminar, ai sim ele implementa esse */ for (int coluna=0; coluna<3; coluna++) { cout << "Digite o valor da coordenada matriz[" << linha << "][" << coluna << "]: "; cin >> matriz[linha][coluna]; } /* Printa a matriz inteira */ for (int linha=0; linha<3; linha++) { for (int coluna=0; coluna<3; coluna++) cout << matriz[linha][coluna] << "\t"; /* Quando acabar o for da coluna, ele quebra a linha */ cout << "\n"; } getch(); } Sobre matriz é isso pessoal! Qualquer dúvida perguntar no tópico! Calloc Usando o calloc!Chegamos em uma parte complicada, que vai dar dor de cabeça em muitos. Mas não é possível declarar um vetor sem especificar o tamanho do mesmo, a não ser que utilizamos um comando chamado calloc. O calloc vai dizer pra memória quantos espacinhos fatiados e quantos bytes o vetor irá ocupar. Com isso a memória consegue entender que aquele endereço de memória pertence/pertencerá a um vetor.Na verdade o que fazeremos a seguir, é fazer com que o ponteiro aponte para um endereço de memória "fatiado", e ele possa ser usado como vetor. O comando é simples: calloc(Quantos espaços, Quantos BYTES pra cada espacinho) Já expliquei na parte 1 dessa aula como pegar os BYTES ocupados por cada tipo de variável, mas se alguém quiser, faça isso: sizeof(tipo_de_dado) // ex: int, float, long int, double... Como vamos trabalhar com endereços de memória, o nosso vetor precisa ser do tipo ponteiro. Vou dar um exemplo de alocação de vetores, bem explicado e detalhado: #include <iostream.h> #include <conio.h> #include <stdlib.h> /* Nova lib pra uso do EXIT_FAILURE */ int main() { int* vetor; int tam; cout << "Digite o tamanho do vetor: "; cin >> tam; if (tam < 1) /* Não podemos abrigar um vetor com 0 ou posições negativas */ exit(EXIT_FAILURE); /* Fecha o programa */ if ((vetor = (int*)/* Força a entrada apenas de int* */ calloc(tam, sizeof(int*)))/* Tenta "fatiar" o endereço de memória do vetor */ == NULL) /* Se toda a tentativa de alocação for nula, não tem espaço na memória ou ocorreu algum erro. Então fecha o programa */ exit(EXIT_FAILURE); /* Preenche vetor */ for (int i=0; i<tam; i++) { cout << "Digite o " << i+1 << "o valor do vetor: "; cin >> vetor[i]; } /* Exibe o vetor */ for (int i=0; i<tam; i++) cout << "\nVetor[" << i << "] = " << vetor[i]; free(vetor); /* Libera a memória que o vetor está utilizando */ getch(); } Sim, eu sei, é bem complicado, mas é essencial. Leia quantas vezes for necessário para vocês entenderem! OiaeuMae Exercícios: 1 - Faça uma matriz[5][5] que receba somente valores de 0 à 10. Depois de receber os valores, verifique quantos números '1' existem na matriz. Escreva a quantidade de números '1' encontrados. 2- Faça um vetor onde o usuário decida o tamanho dele, preencha ele e depois ordene de ordem crescente os elementos do vetor. Exiba o vetor em ordem crescente. Por hoje é só pessoal! Até a próxima aula, Abraços! Editado 11 Agosto, 2010 por Dark Skyllen Compartilhar este post Link para o post Compartilhar em outros sites
Raphael Carnaúba 1 #2 Postado 30 Abril, 2010 Exercicio 1: int main() { int vetor[5][5]; int n, cont=0; for(int i =0; i < 5; i++) { for(int j=0; j < 5; j++) { cin >> n; if(!(n <= 10)) j--; else vetor[i][j] = n; if(vetor[i][j] == 1) cont++; } } cout << "Numero 1 encontrados: " << cont << endl; return 1; } Compartilhar este post Link para o post Compartilhar em outros sites
Dark Skyllen 7 #3 Postado 30 Abril, 2010 @Raphael Carnaúba Perfeito cara. Exatamente o que eu queria, só faltou o exercício 2. Faz o exercício 2 e posta para avaliação.. Compartilhar este post Link para o post Compartilhar em outros sites
Raphael Carnaúba 1 #4 Postado 30 Abril, 2010 Exercicio 2: int main() { int M, N; cin >> M >> N; int vetor[M][N]; int n; for(int i =0; i < M; i++) { for(int j=0; j < N; j++) { cin >> vetor[i][j]; } } for(int i =0; i < M; i++) { for(int j=0; j < N; j++) { cout << "|" << vetor[i][j]; } cout << "|" << endl; } return 1; } Compartilhar este post Link para o post Compartilhar em outros sites
Dark Skyllen 7 #5 Postado 30 Abril, 2010 @Rapha Na verdade faltou ordenar os valores do vetor em ordem crescente, só isso. E também você fez uma matriz, sendo que era um vetor, mas não é problema, contanto que você consiga ordenar em ordem crescente. Compartilhar este post Link para o post Compartilhar em outros sites
dragonlorde 0 #6 Postado 30 Abril, 2010 Nao entendi essa linha: if ((vetor = (int*)/* Força a entrada apenas de int* */ calloc(tam, sizeof(int*)))/* Tenta "fatiar" o endereço de memória do vetor */ == NULL) Poderia explicar? Compartilhar este post Link para o post Compartilhar em outros sites
Dark Skyllen 7 #7 Postado 30 Abril, 2010 @dragonlorde Não sei se você lembra das aulas de ponteiros, mas a função deles é apontar para um endereço de memória, correto? Ao usarmos o comando calloc, ele vai "fatiar" um endereço de memória pra que este endereço seja igual ao de um vetor. O que a variável ponteiro irá fazer, é apontar para esse endereço "fatiado", entendeu? Com isso a variável ponteiro ficará como se fosse um vetor. Compartilhar este post Link para o post Compartilhar em outros sites
Antharaz 4 #8 Postado 8 Agosto, 2010 Como faríamos para acessar esse valor?Usando a mesma for para vetores: Citação: matriz[5][4] No caso, seria matriz[4][3] para acessar o valor já que começa do 0, ou estou errado? Compartilhar este post Link para o post Compartilhar em outros sites
Baxnie 8 #9 Postado 30 Novembro, 2010 Agora só falta ensinar a declarar matrizes grandes. Compartilhar este post Link para o post Compartilhar em outros sites