Esempio n. 1
0
        public void LerArquivo()
        {
            if (dlgAbrir.ShowDialog() == DialogResult.OK)
            {
                StreamReader       arquivo = new StreamReader(dlgAbrir.FileName);
                int                linhas  = int.Parse(arquivo.ReadLine());           //Lê-se as quantidade de linhas e colunas do arquivo
                int                colunas = int.Parse(arquivo.ReadLine());
                ListaLigadaCruzada li      = new ListaLigadaCruzada(linhas, colunas); //Cria-se uma nova para não ser necessário
                                                                                      //escrever o código duas vezes

                while (!arquivo.EndOfStream)
                {
                    string texto = arquivo.ReadLine();

                    int    linha = int.Parse(texto.Substring(1, 2));//Busca de dentro da string os valores necessários para a inclusão
                    int    col   = int.Parse(texto.Substring(4, 2));
                    double valor = double.Parse(texto.Substring(7, 5));

                    li.InserirElemento(valor, linha, col);
                }

                if (rbLista1.Checked) //Caso foi solicitado pelo usuário que esse arquivo seja a lista1, exibi-la no primeiro DGV
                {
                    lista = li;
                    lista.ExibirDataGridview(dgvUm);
                }
                else //Caso não, exibi-lo no segundo
                {
                    lista2 = li;
                    lista2.ExibirDataGridview(dgvDois);
                }
            }
        }
        /// <summary>
        /// Faz a multiplicação de duas matrizes esparsas.
        /// </summary>
        /// <param name="outraMatriz"></param>
        /// <returns>Uma matriz esparsa representando a multiplicação.</returns>
        public ListaLigadaCruzada MultiplicarMatrizes(ListaLigadaCruzada outraMatriz)
        {
            if (this.Colunas != outraMatriz.Linhas)
            {
                throw new ArgumentException("Número de colunas de uma matriz deve ser igual o número de linhas da outra");
            }

            ListaLigadaCruzada matrizResultado;

            matrizResultado = new ListaLigadaCruzada(this.Linhas, outraMatriz.Colunas);


            double total = 0;

            for (int i = 0; i < this.Linhas; i++)
            {
                for (int j = 0; j < outraMatriz.Colunas; j++)
                {
                    total = 0;
                    int k;
                    for (k = 0; k < this.Colunas; k++)
                    {
                        total += this.ValorDe(i, k) * outraMatriz.ValorDe(k, j);
                    }
                    if (total != 0)
                    {
                        matrizResultado.InserirElemento(total, i, j);
                    }
                }
            }

            return(matrizResultado);
        }
        private void frmMatrizEsparsa_Load(object sender, EventArgs e)
        {
            // linhas e colunas iniciarão com o valor 1 (respectivos NumericUpDown)
            int linhas  = Convert.ToInt32(numLinhas.Value);
            int colunas = Convert.ToInt32(numColunas.Value);

            // primeira matriz do programa terá 1 linha e 1 coluna
            matrizEsparsa = new ListaLigadaCruzada(linhas, colunas);
            matrizEsparsa.ExibirDataGridView(dgMatrizEsparsa);
        }
        private void CriarMatriz(object sender, EventArgs e)
        {
            switch (Convert.ToInt32(((Button)sender).Tag))
            {
            case 0:
            {
                if (numColunasMatriz1.Value > 0 && numLinhasMatriz1.Value > 0)
                {
                    int linhas  = Convert.ToInt32(numLinhasMatriz1.Value);
                    int colunas = Convert.ToInt32(numColunasMatriz1.Value);

                    matrizEsparsa1 = new ListaLigadaCruzada(linhas, colunas);
                    matrizEsparsa1.ExibirDataGridView(dgMatrizEsparsa1);

                    // atualiza os campos necessários
                    numLinhaInsercaoMatriz1.Maximum  = matrizEsparsa2.Linhas - 1;
                    numColunaInsercaoMatriz1.Maximum = matrizEsparsa2.Colunas - 1;
                }
                else
                {
                    MessageBox.Show("Não é possível criar a matriz com esses valores! " +
                                    " Verifique se os valores das linhas e colunas são válidos.",
                                    "Atenção!",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                break;
            }

            case 1:
            {
                if (numColunasMatriz2.Value > 0 && numLinhasMatriz2.Value > 0)
                {
                    int linhas  = Convert.ToInt32(numLinhasMatriz2.Value);
                    int colunas = Convert.ToInt32(numColunasMatriz2.Value);

                    matrizEsparsa2 = new ListaLigadaCruzada(linhas, colunas);
                    matrizEsparsa2.ExibirDataGridView(dgMatrizEsparsa2);

                    // atualiza os campos necessários
                    numLinhaInsercaoMatriz2.Maximum  = matrizEsparsa2.Linhas - 1;
                    numColunaInsercaoMatriz2.Maximum = matrizEsparsa2.Colunas - 1;
                }
                else
                {
                    MessageBox.Show("Não é possível criar a matriz com esses valores! " +
                                    " Verifique se os valores das linhas e colunas são válidos.",
                                    "Atenção!",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                break;
            }
            }
        }
        /// <summary>
        /// Lê um arquivo contendo os dados da matriz esparsa (coordenadas e células diferente de 0).
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLerArquivo_Click(object sender, EventArgs e)
        {
            MessageBox.Show("O arquivo deve conter as coordenadas que a matriz terá e depois" +
                            " as células diferentes de 0 (elemento, linha, coluna). Exemplo: \n" +
                            " 3 3 \n 10 0 0 \n 15 0 2", "Orientações de arquivo de matriz esparsa:",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                StreamReader sr = new StreamReader(openFileDialog1.FileName);

                string linhaArquivo = sr.ReadLine();

                while (linhaArquivo.Contains("//")) // usado para pular comentários no arquivo
                {
                    linhaArquivo = sr.ReadLine();
                }

                string[] coordenadas = linhaArquivo.Split(' ');

                int linhas  = Convert.ToInt32(coordenadas[0]);
                int colunas = Convert.ToInt32(coordenadas[1]);

                matrizEsparsa = new ListaLigadaCruzada(linhas, colunas);

                while ((linhaArquivo = sr.ReadLine()) != null)
                {
                    if (linhaArquivo.Contains("//")) // pular comentários durante a inserção de células
                    {
                        continue;
                    }

                    string[] celula = linhaArquivo.Split(' ');

                    double elemento = Convert.ToDouble(celula[0]);
                    int    linha    = Convert.ToInt32(celula[1]);
                    int    coluna   = Convert.ToInt32(celula[2]);

                    matrizEsparsa.InserirElemento(elemento, linha, coluna);
                }
                sr.Close();

                // atualiza os campos necessários
                numLinhas.Value  = matrizEsparsa.Linhas;
                numColunas.Value = matrizEsparsa.Colunas;

                numLinhaPesquisa.Maximum  = numLinhaInsercao.Maximum = matrizEsparsa.Linhas - 1;
                numColunaPesquisa.Maximum = numColunaInsercao.Maximum = matrizEsparsa.Colunas - 1;

                matrizEsparsa.ExibirDataGridView(dgMatrizEsparsa);
            }
        }
        private void frmOperacoes_Load(object sender, EventArgs e)
        {
            // linhas e colunas iniciarão com o valor 1
            int linhas  = 1;
            int colunas = 1;

            // matrizes do formuláro iniciarão com 1 linha e 1 coluna
            matrizEsparsa1 = new ListaLigadaCruzada(linhas, colunas);
            matrizEsparsa2 = new ListaLigadaCruzada(linhas, colunas);
            matrizEsparsa3 = new ListaLigadaCruzada(linhas, colunas);

            matrizEsparsa1.ExibirDataGridView(dgMatrizEsparsa1);
            matrizEsparsa2.ExibirDataGridView(dgMatrizEsparsa2);
            matrizEsparsa3.ExibirDataGridView(dgMatrizEsparsa3);
        }
        /// <summary>
        /// Faz a soma de duas matrizes esparsas.
        /// </summary>
        /// <param name="outraMatriz"></param>
        /// <returns>Uma matriz esparsa representando a soma.</returns>
        public ListaLigadaCruzada SomarMatrizes(ListaLigadaCruzada outraMatriz)
        {
            if (this.linhas != outraMatriz.linhas || this.colunas != outraMatriz.colunas)
            {
                throw new ArgumentException("As Matrizes dever ser de mesma dimensão!");
            }

            ListaLigadaCruzada soma = new ListaLigadaCruzada(this.linhas, this.colunas);

            Celula atual = this.cabecaPrincipal.Abaixo.Direita;

            // Copia a matriz this na matriz soma
            for (int l = 0; l < this.linhas; l++)
            {
                for (int c = atual.Coluna; c >= 0; c = atual.Coluna)
                {
                    if (atual.Valor != null)
                    {
                        atual = atual.Direita;
                        soma.InserirElemento(this.ValorDe(l, c), l, c);
                    }
                }
                atual = atual.Abaixo.Direita;
            }

            atual = outraMatriz.cabecaPrincipal.Abaixo.Direita;

            for (int l = 0; l < outraMatriz.linhas; l++)
            {
                for (int c = atual.Coluna; c >= 0; c = atual.Coluna)
                {
                    if (atual.Valor != null)
                    {
                        double elem = soma.ValorDe(l, c) != 0 ? soma.ValorDe(l, c) + outraMatriz.ValorDe(l, c)
                                                                : outraMatriz.ValorDe(l, c);

                        soma.InserirElemento(elem, l, c);
                        atual = atual.Direita;
                    }
                }
                atual = atual.Abaixo.Direita;
            }

            return(soma);
        }
Esempio n. 8
0
        private void btnCriar_Click(object sender, EventArgs e)
        {
            if (numColuna.Value == 0 || numLinha.Value == 0)
            {
                MessageBox.Show("Não é possível criar matriz vazia");
            }


            //Cria-se uma nova, pelo mesmo motivo anteriror
            ListaLigadaCruzada lis = new ListaLigadaCruzada(Convert.ToInt32(numLinha.Value), Convert.ToInt32(numColuna.Value));

            if (rbLista1.Checked)
            {
                lista = lis; //Caso seja solicitado a lista1
                lista.ExibirDataGridview(dgvUm);
            }
            else
            {
                lista2 = lis; //Caso seja a lista2
                lista2.ExibirDataGridview(dgvDois);
            }
        }
        /// <summary>
        /// Cria a matriz esparsa de acordo com as coordenadas indicadas no programa.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCriarMatrizEsparsa_Click(object sender, EventArgs e)
        {
            if (numColunas.Value > 0 && numLinhas.Value > 0 && numColunas.Value < 656 && numLinhas.Value < 656)
            {
                int linhas  = Convert.ToInt32(numLinhas.Text);
                int colunas = Convert.ToInt32(numColunas.Text);

                matrizEsparsa = new ListaLigadaCruzada(linhas, colunas);
                matrizEsparsa.ExibirDataGridView(dgMatrizEsparsa);

                // atualiza os campos necessários
                numLinhaRemocao.Maximum = numLinhaPesquisa.Maximum = numLinhaInsercao.Maximum = matrizEsparsa.Linhas - 1;
                numColunaSoma.Maximum   = numColunaRemocao.Maximum = numColunaPesquisa.Maximum = numColunaInsercao.Maximum = matrizEsparsa.Colunas - 1;

                matrizEsparsa.ExibirDataGridView(dgMatrizEsparsa);
            }
            else
            {
                MessageBox.Show("Não é possível criar uma matriz esparsa! Verifique os valores dos campos de linha/coluna", "Atenção!",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void LerMatriz(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                StreamReader sr = new StreamReader(openFileDialog1.FileName);

                string linhaArquivo = sr.ReadLine();

                while (linhaArquivo.Contains("//")) // usado para pular comentários no arquivo
                {
                    linhaArquivo = sr.ReadLine();
                }

                string[] coordenadas = linhaArquivo.Split(' ');

                int linhas  = Convert.ToInt32(coordenadas[0]);
                int colunas = Convert.ToInt32(coordenadas[1]);

                switch (Convert.ToInt32(((Button)sender).Tag))
                {
                case 0:
                {
                    matrizEsparsa1 = new ListaLigadaCruzada(linhas, colunas);
                    break;
                }

                case 1:
                {
                    matrizEsparsa2 = new ListaLigadaCruzada(linhas, colunas);
                    break;
                }
                }

                while ((linhaArquivo = sr.ReadLine()) != null)
                {
                    if (linhaArquivo.Contains("//")) // pular comentários durante a inserção de células
                    {
                        continue;
                    }

                    string[] celula = linhaArquivo.Split(' ');

                    double elemento = Convert.ToDouble(celula[0]);
                    int    linha    = Convert.ToInt32(celula[1]);
                    int    coluna   = Convert.ToInt32(celula[2]);

                    switch (Convert.ToInt32(((Button)sender).Tag))
                    {
                    case 0:
                    {
                        matrizEsparsa1.InserirElemento(elemento, linha, coluna);

                        // Atualiza os campos necessários
                        numLinhaInsercaoMatriz1.Maximum  = matrizEsparsa1.Linhas - 1;
                        numColunaInsercaoMatriz1.Maximum = matrizEsparsa1.Colunas - 1;

                        numLinhasMatriz1.Value  = matrizEsparsa1.Linhas;
                        numColunasMatriz1.Value = matrizEsparsa1.Colunas;

                        matrizEsparsa1.ExibirDataGridView(dgMatrizEsparsa1);
                        break;
                    }

                    case 1:
                    {
                        matrizEsparsa2.InserirElemento(elemento, linha, coluna);

                        // Atualiza os campos necessários
                        numLinhaInsercaoMatriz2.Maximum  = matrizEsparsa2.Linhas - 1;
                        numColunaInsercaoMatriz2.Maximum = matrizEsparsa2.Colunas - 1;

                        numLinhasMatriz2.Value  = matrizEsparsa2.Linhas;
                        numColunasMatriz2.Value = matrizEsparsa2.Colunas;

                        matrizEsparsa2.ExibirDataGridView(dgMatrizEsparsa2);
                        break;
                    }
                    }
                }
                sr.Close();
            }
        }