Exemple #1
0
        private void LerMatriz(ref ListaCruzada lista, DataGridView dgv, RadioButton qualRb)  //Método para ler um arquivo e construir uma matriz a partir de seus dados
        {
            try
            {
                if (dlgAbrir.ShowDialog() == DialogResult.OK)                 //Verifica se o 'openFileDialog' foi aberto corretamente
                {
                    txtErro.Items.Clear();
                    var    arquivo           = new StreamReader(dlgAbrir.FileName);                                                       //Seleção do arquivo pelo usuário
                    string numeroLinhaColuna = arquivo.ReadLine();                                                                        //variável do tipo string que guarda a linha inteira lida
                    lista = new ListaCruzada(int.Parse(numeroLinhaColuna.Substring(0, 5)), int.Parse(numeroLinhaColuna.Substring(5, 5))); //Instanciação da matriz passada como parâmetro com os valores lidos da primeira linha do arquivo, que guarda o número de linhas e de colunas que a matriz deve ter

                    AjustarDataGridView(dgv, lista.NumLinhas, lista.NumColunas);                                                          //Chama o método que adapta o DataGridView escolhido ao tamanho da matriz lida
                    IniciarControles(true);                                                                                               //Habilitar os botões que agora(após a instanciação da matriz) podem ser selecionados

                    bool teveErro = false;                                                                                                //Variável do tipo boolean que é usada para informar o programa e o usuário na ocorrência de algum erro

                    while (!arquivo.EndOfStream)                                                                                          //Loop que garante que todas as linhas do arquivo serão lidas
                    {
                        Celula lida = Celula.LerRegistro(arquivo);                                                                        //Uma nova célula é criada a partir dos dados lidos, por meio do método da classe Celula LerRegistro, que se encarrega de criar uma nova celula ao ler uma linha por vez

                        if (lida.Coluna < 0 || lida.Linha < 0 || lida.Linha >= lista.NumLinhas || lida.Coluna >= lista.NumColunas)        //Caso os índices de posicionamento da célula seja inválido, a celula não será criada e o erro aparecerá para o usuário
                        {
                            teveErro = true;
                            txtErro.Items.Add($"({lida.Linha}, {lida.Coluna})");
                            continue;
                        }

                        lista.InserirElemento(lida.Linha, lida.Coluna, lida.Valor);   //Caso não haja erro, a célula será criada  e o loop continuará
                    }

                    if (teveErro)                                                        //Em caso de erro, uma mensagem será apresentada ao usuário
                    {
                        lblErro.Text = "Células com index não suportados pela matriz: "; //Mensagem de erro específica à invalidação do posicionamento da célula lida
                    }
                    arquivo.Close();                                                     //Depois do fim da leitura do arquivo, o arquivo é fechado
                    lista.Listar(dgv);                                                   //Listagem da matriz lida no dgv escolhido
                    ExibirInformacoes(lista, 0, 0);
                    if (lista == matrizA)
                    {
                        dgvB.ClearSelection();
                    }
                    else
                    {
                        dgvA.ClearSelection();
                    }
                    qualRb.Checked = true;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Selecione um arquivo texto correto", "Erro na leitura da matriz", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        public ListaCruzada(int linhas, int colunas) //construtor que cria uma lista cruzada com tamanho já definidos
        {
            if (linhas < 0)                          //Se o número de linhas for negativo não é possível criar a lista cruzada, por isso lançamos uma exceção
            {
                throw new Exception("Index de linha inválido");
            }
            if (colunas < 0)//Se o número de colunas for negativo não é possível criar a lista cruzada, por isso lançamos uma exceção
            {
                throw new Exception("Index de coluna inválido");
            }

            cabeca     = new Celula(-1, -1, 0, null, null); //Ao criarmos a cabeca, passamos como parâmetro números negativos porque a célula cabeca não está na matriz, serve como ponto referência para conseguirmos percorrer a lista
            qtdValores = 0;                                 //No momento inicial, não existe nenhum elemento, portanto atribuimos zero à variável qtdValores
            numLinhas  = linhas;                            //Atribuimos ao atributo da classe o numero de linhas desta
            numColunas = colunas;                           //Atribuimos ao atributo da classe o numero de colunas desta

            Celula atual = cabeca;                          //Para percorrer a lista cruzada, precisamos de um começo, a cabeca é o nosso ponto de partida

            for (int i = 0; i < linhas; i++)                //Em um loop, criamos as células da lista
            {
                Celula novaCelula = new Celula(i, -1, 0, null, null);
                atual.Abaixo  = novaCelula;  //Ao adicionarmos um novo elemento à uma lista, precisamos ajustar os ponteiros para não perdemos o novo elemento
                atual         = novaCelula;
                atual.Direita = atual;
            }
            atual.Abaixo = cabeca;

            atual = cabeca;                   //Para percorrer a lista cruzada, precisamos de um começo, a cabeca é o nosso ponto de partida
            for (int i = 0; i < colunas; i++) //Em um loop, criamos as células da lista
            {
                Celula novaCelula = new Celula(-1, i, 0, null, null);
                atual.Direita = novaCelula; //Ao adicionarmos um novo elemento à uma lista, precisamos ajustar os ponteiros para não perdemos o novo elemento
                atual         = novaCelula;
                atual.Abaixo  = atual;
            }
            atual.Direita = cabeca;
        }
 public ListaCruzada()   // construtor padrão que instancia a classe vazia
 {
     cabeca     = new Celula(-1, -1, 0, null, null);;
     qtdValores = 0;
 }