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; }