示例#1
0
        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);
                }
            }
        }
示例#2
0
 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);
     }
 }
示例#3
0
 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();
     }
 }
示例#4
0
        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();
            }
        }
示例#5
0
        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();
        }
示例#6
0
 private void frmMatriz_Load(object sender, EventArgs e)
 {
     matriz1 = new MatrizEsparsa();
     matriz2 = new MatrizEsparsa();
 }
示例#7
0
        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);
        }
示例#8
0
 private void CriarMatriz(ref MatrizEsparsa matriz)
 {
     matriz = new MatrizEsparsa(int.Parse(txtLinhas.Text.Trim()), int.Parse(txtColunas.Text.Trim()));
     dgvMatriz3.Rows.Clear();
     dgvMatriz3.Refresh();
 }
示例#9
0
        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);
        }
示例#10
0
        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();
            }
        }