private void LerArquivo(StreamReader arq, MatrizEsparsa mat) { bool primeiraLeitura = true; string linha = ""; string[] chars; while (!arq.EndOfStream) { if (primeiraLeitura) { linha = arq.ReadLine(); chars = linha.Split(';'); if ((int.Parse(chars[0]) <= 600 && int.Parse(chars[1]) <= 600)) { mat.CriarNosCabecas(int.Parse(chars[0]), int.Parse(chars[1])); } primeiraLeitura = false; } else { var celulaNova = Celula.LerRegistro(arq); mat.InserirCelulaMatriz(celulaNova); } } }
public void FazerLeitura(ref MatrizEsparsa qualMatriz, DataGridView dgv) { if (dlgAbrir.ShowDialog() == DialogResult.OK) { var arquivo = new StreamReader(dlgAbrir.FileName); LerArquivo(ref qualMatriz, arquivo); Exibir(dgv, qualMatriz); } }
private void Esvaziar(ref MatrizEsparsa matriz) { //É verificado se a matriz está vazia, //para então limparmos ela, pois é impossível remover dados //de uma matriz que não possui dados if (matriz != null) { matriz.EsvaziarMatriz(); } }
public void Exibir(DataGridView dgv, MatrizEsparsa matriz) { dgv.Rows.Clear(); dgv.Refresh(); Celula atualColuna = matriz.NoCabeca.Direita; Celula atual = atualColuna.Abaixo; dgv.RowCount = matriz.NumeroLinhas; dgv.ColumnCount = matriz.NumeroColunas; //percorremos a nossa matriz e exibimos os dados no gridview while (atualColuna != matriz.NoCabeca) { while (atual != atualColuna) { if (atual.Valor != default(double)) { dgv.Rows[atual.Linha - 1].Cells[atual.Coluna - 1].Value = atual.Valor; dgv.Columns[atual.Coluna - 1].SortMode = DataGridViewColumnSortMode.NotSortable; } atual = atual.Abaixo; } atualColuna = atualColuna.Direita; atual = atualColuna.Abaixo; } //adicionamos índices aos cabeçalhos de linhas e colunas do gridview foreach (DataGridViewRow linha in dgv.Rows) { linha.HeaderCell.Value = (linha.Index + 1).ToString(); } foreach (DataGridViewColumn coluna in dgv.Columns) { coluna.HeaderCell.Value = (coluna.Index + 1).ToString(); } }
private void LerArquivoCidades(string filePath) { int inicioIdCidade = 0; int tamanhoIdCidade = 3; int inicioNomeCidade = tamanhoIdCidade; int tamanhoNomeCidade = 15; int inicioCoordenadaX = inicioNomeCidade + tamanhoNomeCidade; int tamanhoCoordenadaX = 5; int inicioCoordenadaY = inicioCoordenadaX + tamanhoCoordenadaX; int tamanhoCoordenadaY = 5; /*DialogResult resultado = dlgAbrir.ShowDialog();*/ // exibir a caixa de diálogo para o usuário escolher o arquivo a ser lido //if (resultado == DialogResult.OK) // se o usuário selecionar e abrir o arquivo //{ StreamReader arquivoCidades = new StreamReader(filePath + @"\CidadesMarte.txt", System.Text.Encoding.UTF7); while (!arquivoCidades.EndOfStream) // ou usa ReadAllLines e joga em um vetor { string linha = arquivoCidades.ReadLine(); int idCidade = int.Parse(linha.Substring(inicioIdCidade, tamanhoIdCidade)); string nomeCidade = linha.Substring(inicioNomeCidade, tamanhoNomeCidade); int coordenadaX = int.Parse(linha.Substring(inicioCoordenadaX, tamanhoCoordenadaX)); int coordenadaY = int.Parse(linha.Substring(inicioCoordenadaY, tamanhoCoordenadaY)); Cidade cidade = new Cidade(idCidade, nomeCidade, coordenadaX, coordenadaY); cidades.Incluir(cidade); } arquivoCidades.Close(); Listar(cidades.Raiz); int qtasCidades = cidades.QuantosDados; caminhos = new MatrizEsparsa <CaminhoEntreCidades>(qtasCidades, qtasCidades); pbMapa.Invalidate(); }
private void frmMatriz_Load(object sender, EventArgs e) { matriz1 = new MatrizEsparsa(); matriz2 = new MatrizEsparsa(); }
public MatrizEsparsa MultiplicarMatrizes(MatrizEsparsa matriz1, MatrizEsparsa matriz2) { MatrizEsparsa resultado; //Verifica se as matrizes estão em condições ideias para efetuar a multiplicação if (matriz1.NumeroColunas == matriz2.NumeroLinhas && matriz1 != null && matriz2 != null) { //Geramos uma terceira matriz para armazenar o resultado da multiplicação resultado = new MatrizEsparsa(matriz1.NumeroLinhas, matriz2.NumeroColunas); //Variável para armazenar a soma dos elementos multiplicados //que serão dispostos em uma célula da matriz resultante double valorCelulaAInserir = 0; //Índice auxiliar que percorrerá tanto as colunas da matriz1, //quanto as linhas da matriz2 int quantoPercorrer = matriz1.NumeroColunas; //Percorre uma linha da matriz resultante for (int linha = 1; linha <= resultado.NumeroLinhas; linha++) { //Percorre uma linha da matriz resultante for (int coluna = 1; coluna <= resultado.NumeroColunas; coluna++) { //Percorre uma coluna da matriz1 e uma linha da matriz2 em paralelo for (int indice = 1; indice <= quantoPercorrer; indice++) { //Caso o objeto retornado seja nulo, isso significado //que o valor da célula é zero if (matriz1.Procurar(indice, linha) == default(Celula)) { if (matriz2.Procurar(coluna, indice) == default(Celula)) { valorCelulaAInserir += 0; } else { valorCelulaAInserir += 0 * matriz2.Procurar(coluna, indice).Valor; } } else if (matriz2.Procurar(coluna, indice) == default(Celula)) { valorCelulaAInserir += matriz1.Procurar(indice, linha).Valor * 0; } else { valorCelulaAInserir += matriz1.Procurar(indice, linha).Valor *matriz2.Procurar(coluna, indice).Valor; } } //Após efetuar a multiplicação, inserimos o a somatória das multiplicações //na linha e coluna atual, caso ele seja diferente de zero, pois não há //necessidade de armazenar o zero if (valorCelulaAInserir != 0) { resultado.Inserir(new Celula(valorCelulaAInserir, linha, coluna, null, null)); } //reiniciamos a variável que armazena a somatória das multiplicações valorCelulaAInserir = 0; } } } else { throw new Exception("O número de colunas da matriz A não corresponde ao número de linhas da matriz B!"); } return(resultado); }
private void CriarMatriz(ref MatrizEsparsa matriz) { matriz = new MatrizEsparsa(int.Parse(txtLinhas.Text.Trim()), int.Parse(txtColunas.Text.Trim())); dgvMatriz3.Rows.Clear(); dgvMatriz3.Refresh(); }
public MatrizEsparsa SomarMatrizes(MatrizEsparsa matriz1, MatrizEsparsa matriz2) { MatrizEsparsa resultado; if (matriz1.NumeroLinhas == matriz2.NumeroLinhas && matriz1.NumeroColunas == matriz2.NumeroColunas) { resultado = new MatrizEsparsa(matriz1.NumeroLinhas, matriz1.NumeroColunas); Celula topo1 = matriz1.NoCabeca.Direita, topo2 = matriz2.NoCabeca.Direita; Celula atual1 = topo1.Abaixo, atual2 = topo2.Abaixo; while (topo1 != matriz1.NoCabeca && topo2 != matriz2.NoCabeca) { if (atual1.Linha == atual2.Linha && atual1.Coluna == atual2.Coluna) { if (atual1.Valor + atual2.Valor != 0) { resultado.Inserir(new Celula(atual1.Valor + atual2.Valor, atual1.Linha, atual1.Coluna, default(Celula), default(Celula))); } atual1 = atual1.Abaixo; atual2 = atual2.Abaixo; } else if (atual1.Linha < atual2.Linha && atual1.Coluna == atual2.Coluna) { resultado.Inserir(new Celula(atual1.Valor, atual1.Linha, atual1.Coluna, default(Celula), default(Celula))); atual1 = atual1.Abaixo; } else if (atual2.Linha < atual1.Linha && atual2.Coluna == atual1.Coluna) { resultado.Inserir(new Celula(atual2.Valor, atual2.Linha, atual2.Coluna, default(Celula), default(Celula))); atual2 = atual2.Abaixo; } else if (atual1.Coluna != atual2.Coluna) { if (atual1.Coluna < atual2.Coluna) { resultado.Inserir(new Celula(atual1.Valor, atual1.Linha, atual1.Coluna, default(Celula), default(Celula))); atual1 = atual1.Abaixo; } else { resultado.Inserir(new Celula(atual2.Valor, atual2.Linha, atual2.Coluna, default(Celula), default(Celula))); atual2 = atual2.Abaixo; } } while (atual1 == topo1) { topo1 = topo1.Direita; atual1 = topo1.Abaixo; } while (atual2 == topo2) { topo2 = topo2.Direita; atual2 = topo2.Abaixo; } } while (topo1 != matriz1.NoCabeca) { resultado.Inserir(new Celula(atual1.Valor, atual1.Linha, atual1.Coluna, default(Celula), default(Celula))); atual1 = atual1.Abaixo; if (atual1 == topo1) { topo1 = topo1.Direita; atual1 = topo1.Abaixo; } } while (topo2 != matriz2.NoCabeca) { resultado.Inserir(new Celula(atual2.Valor, atual2.Linha, atual2.Coluna, default(Celula), default(Celula))); atual2 = atual2.Abaixo; if (atual2 == topo2) { topo2 = topo2.Direita; atual2 = topo2.Abaixo; } } } else { throw new Exception("Matrizes com dimensões diferentes não podem ser somadas!"); } return(resultado); }
public void LerArquivo(ref MatrizEsparsa qualMatriz, StreamReader arquivo) { if (!arquivo.EndOfStream) { int posX = 0; string linha = arquivo.ReadLine(); // for para descobrir as proporções da matriz for (int i = 0; i < linha.Trim().Length; i++) { if (linha[i] == 'x') { posX = i; break; // interrompe o for quando o 'x' for encontrado } } // define as proporções das matrizes qualMatriz = new MatrizEsparsa(int.Parse(linha.Substring(posX + 1).Trim()), int.Parse(linha.Substring(0, posX))); int primeiraSeparacao = 0; int segundaSeparacao = 0; // while para pegar os dados while (!arquivo.EndOfStream) { linha = arquivo.ReadLine(); //for para identificar as separações, para que seja possível //quebrar a string linha em "valor, coluna e linha" for (int i = 0; i < linha.Trim().Length; i++) { if (linha[i] == ';') { //se a primeiraSeparacao já foi encontrada, //segundaSeparacao receberá o índice onde foi encontrado //o ponto e vírgula, senão a primeiraSeparação receberá esse índice if (primeiraSeparacao != 0) { segundaSeparacao = i; } else { primeiraSeparacao = i; } } } //estabelecemos variáveis auxiliares para encurtar os parâmetros para a criação //de um objeto da classe Celula int colunaDado = int.Parse(linha.Substring(0, primeiraSeparacao)); int linhaDado = int.Parse(linha.Substring(primeiraSeparacao + 1, segundaSeparacao - (primeiraSeparacao + 1))); double valorDado = double.Parse(linha.Substring(segundaSeparacao + 1).Trim()); //insere a célula lida na matriz Celula celulaAtual = new Celula(valorDado, linhaDado, colunaDado, default(Celula), default(Celula)); if (linhaDado > qualMatriz.NumeroLinhas || colunaDado > qualMatriz.NumeroColunas) { throw new Exception("Célula fora das dimensões da Matriz!"); } else { qualMatriz.Inserir(celulaAtual); } } arquivo.Close(); } }