Ir ao conteúdo
  • Cadastre-se

Vitor Avancini

Membro Pleno
  • Posts

    23
  • Cadastrado em

  • Última visita

Reputação

0
  1. Tenho uma variável static "fieldOrder" que seleciona a ordem dos campos no registro, exemplo: name, cpf, phone, course, age, active ou poderia ser cpf, age, name, course, phone, active, o usuário do sistema vai decidir isso. Gostaria de armazená-lo em um buffer, com um caractere especial separando cada campo, para então guardar em um arquivo(mas guardar no arquivo não vem ao caso agora). O problema aqui é que entra nos cases corretamente (testei isso), porém o buffer não está recebendo gets. Não sei o porque acontece isso ou como fazer isso funcionar. Alguma ideia? Fiz algo errado? Aqui vai o método: public String registroOrdemCampo(Student std) { String buffer = null; for (int i = 0; i < 6; i++) { /*name = 1 -- cpf = 2 -- phone = 3 -- course = 4 -- age = 5 -- active = 6*/ switch (Descriptor.fieldOrder[i]) { case 1: buffer = std.getName(); break; case 2: buffer = std.getCpf(); break; case 3: buffer = std.getPhone(); break; case 4: buffer = std.getCourse(); break; case 5: buffer = Integer.toString(std.getAge()); break; case 6: buffer = Integer.toString(std.getActive()); break; default: System.out.println("ERRO!"); } if(i < 6) buffer = Descriptor.fieldSeparator; } return buffer; }
  2. Boa noite, galera! Preciso fazer um programa que lê e escreve objetos em um arquivo (.txt), no qual existe um arquivo .ini que define algumas parametrizações para o software. Uma dessas configurações é em qual ordem os campos serão salvos no arquivo (FieldOrder: ordem dos atributos no arquivo: name / cpf / phone / course / age / active). Tenho um método chamado "generate" que cria um objeto, solicita as entradas ao usuário e grava no arquivo. A dúvida aqui é, como eu faço para colocar na ordem definida por esse .ini O .ini é lido e cada configuração é uma variável public class Descriptor { public static final char registerType = 'a'; public static final String fieldSeparator = "a"; public static final String fieldOrder = "name/cpf/phone/course/age/active"; public static final String registerSeparator = "a"; public static final int blockSize = 0; public static final char blockingType = 'a'; public static final char blockingMethod = 'a'; public static final String blockingPath = "a"; public static final int maxNumberOfRecordsInMemory = 0; } Inicializei dessa forma, para depois fazer a leitura do arquivo e setar cada variável. Eu poderia trocar os campos de lugares para seguir qualquer ordem para armazenar no txt. Como eu poderia fazer um método que conseguiria ler o fieldOrder e assim armazenar o objeto em um buffer (uma variavel do tipo string) com a ordem escolhida e assim guardar no arquivo?
  3. Ah sim, me desculpe. Não sabia que colchetes era operador
  4. eu tentei inicializar a matriz colocando 0 em todas as posições, não foi isso que aconteceu?
  5. Quando a função Imprimir é chamada o programa simplesmente fecha
  6. O que está dando problema agora é a função para imprimir o tabuleiro
  7. Código completo: main.c: #include<stdio.h> #include "cabecalho.h" void main () { int i, j, ri, rj; int teste = 1; int **tabuleiro; int **matrizAdj; int n, qtdRainhas = 0; int p1, p2, op; int verifica; printf("Insira o tamanho do tabuleiro e a quantidade de rainhas (N): "); scanf("%i", &n); construirMatriz(tabuleiro, n); printf("\nConstruiu tabuleiro\n"); printf ("\nInsira o metodo de insercao: "); printf("\n1 - Manual"); printf("\n2 - XGH"); printf("\n3 - Heurística"); printf("\n"); scanf ("%i", &op); switch (op) { case 1: while (qtdRainhas < n) { printf("\nInsira a linha: "); scanf("%i", &ri); printf("\nInsira a coluna: "); scanf("%i", &rj); verifica = verificaConflitos(ri-1, rj-1, tabuleiro, n); printf("verificou"); if (verifica == 0) { printf("\nentrou if\n"); tabuleiro[ri][rj] = 1; printf("Inseriu rainha %i" , i); qtdRainhas++; } else printf("\nPosicao invalida, insira novamente!"); } printf("\n"); Imprimir(tabuleiro, n); break; case 2: while(qtdRainhas < n) { for (i = 0; i < n; i++) { for(j = 0; j < n; j++) { if (!verificaConflitos(i-1, j-1, tabuleiro, n)) { tabuleiro [i] [j] = 1; printf("\nInseriu rainha"); qtdRainhas++; } } } } printf("\n"); Imprimir(tabuleiro, n); break; case 3: while (qtdRainhas < n) { if (testaLinha(tabuleiro, i-1, j-1, n)) { if (testaColuna(tabuleiro, i-1, j-1, n)) { if (!verificaConflitos(i-1, j-1, tabuleiro, n)) { tabuleiro[i] [j] = 1; qtdRainhas++; printf("Inseriu rainha "); } } else j++; } else i++; } printf("\n"); Imprimir(tabuleiro, n); break; default: printf("\nOpcao invalida!"); } LiberarMatriz(n, tabuleiro); } cabecalho.h #ifndef CABECALHO_H_INCLUDED #define CABECALHO_H_INCLUDED #include "funcoes.c" /**Imprime todas as posições do tabuleiro*/ void Imprimir(int **tabuleiro, int n); /**VERIFICA SE É POSSÍVEL POSICIONAR A RAINHA EM matriz(ri, rj). RETORNA 1 SE NÃO É POSSÍVEL E 0 SE FOR POSSÍVEL*/ int verificaConflitos (int ri, int rj, int **tabuleiro, int n); /**ALOCA A MATRIZ DINAMICAMENTE DE TAMANHO N*N*/ void construirMatriz(int **tabuleiro, int n); /*TESTAR SE EXISTE RAINHA NA LINHA RETORNA 1 SE NÃO EXISTE RAINHA NA LINHA*/ int testaLinha(int **tabuleiro, int ri, int rj, int n); /*TESTA SE EXISTE RAINHA NA COLUNA RETORNA 1 SE NÃO EXISTE RAINHA NA LINHA COLUNA*/ int testaColuna(int **tabuleiro, int ri, int rj, int n); /*LIBERA A MEMÓRIA*/ void LiberarMatriz(int n, int **matriz); #endif // CABECALHO_H_INCLUDED funcoes.c #include<stdio.h> #include <stdlib.h> #include "cabecalho.h" void construirMatriz(int **tabuleiro, int n) { int i, j; tabuleiro = (int**) malloc (n * sizeof(int*)); for (i = 0; i < n; i++) tabuleiro[i] = (int *) malloc (n * sizeof(int)); for (i = 0; i < n; i++) for (j = 0; j < n; j++) tabuleiro[i] [j] = 0; } int testaLinha(int **tabuleiro, int ri, int rj, int n) { int i, teste; /**TESTA SE EXISTE ALGUMA RAINHA NA MESMA LINHA*/ for (i = 0; i < n; i++) { if (tabuleiro[ri][i] == 1) return 0;//EXISTE RAINHA NA LINHA(POSIÇÃO INVÁLIDA) } return 1;//NÃO EXISTE RAINHA NA LINHA(POSIÇÃO VÁLIDA) } int testaColuna(int **tabuleiro, int ri, int rj, int n) { int i, teste; /**TESTA SE EXISTE ALGUMA RAINHA NA COLUNA*/ for (i = 0; i < n; i++) { if (tabuleiro[i][rj] == 1) return 0;//EXISTE RAINHA NA COLUNA(POSIÇÃO INVÁLIDA) } return 1;//NÃO EXISTE RAINHA NA COLUNA(POSIÇÃO VÁLIDA) } int verificaConflitos (int ri, int rj, int **tabuleiro, int n) { int i, i1, i2, j, j1, j2; int teste = 0; i1 = ri; i2 = ri; j1 = rj; j2 = rj; printf("\nentrou verificaConflito"); /**TESTA SE EXISTE ALGUMA NA MESMA LINHA OU COLUNA*/ for (i = 0; i < n; i++) { printf("\nentrou for"); if (tabuleiro[ri][i] == 1 || tabuleiro[i][rj] == 1) { teste = 1; printf("\nentrou if"); break; } printf("\nsaiu for"); } printf("\ntestou linha e coluna"); if (teste == 0) { /**ACHA INICIO DA DIAGONAL PRINCIPAL*/ while (i1 > 0 && j1 > 0) { i1--; j1--; } /**ACHA INICIO DA DIAGONAL SECUNDÁRIA*/ while (i2 > 0 && j2 < (n-1)) { i2--; j2++; } /**TESTE DIAGONAL PRINCIPAL*/ for (i = i1; i < ((n-1) - i1); i++, j1++)/**LINHA E COLUNA*/ { if (i != ri && j1 != rj && tabuleiro[i][j1] == 1) { teste = 1; break; } } printf("\ntestou diagonal primaria"); /**TESTE DIAGONAL SECUNDARIA*/ for (i = i2; i < ((n-1) - i2); i++, j2--)/**LINHA E COLUNA*/ { if (i != ri && j2 != rj && tabuleiro[i][j2] == 1) { teste = 1; break; } } printf("\ntestou diagonal secundaria"); } return teste; } void Imprimir(int **tabuleiro, int n) { int i, j; printf("\n"); for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) printf("%i ", tabuleiro[i][j]); printf("\n"); } } void LiberarMatriz(int n, int **matriz) { int i; if (matriz == NULL) return; for (i = 0; i < n; i++) free (matriz[i]);/* LIBERA AS LINHAS DA MATRIZ*/ free (matriz);/* LIBERA A MATRIZ */ }
  8. Quando chega na parte que comentei que da erro, o programa fecha. Gostaria de entender o erro e saber qual a maneira correta. adicionado 2 minutos depois A execução do programa fica assim:
  9. Como comparar uma determinada posição de uma matriz através de colchetes sendo que passei como ponteiro de ponteiro (int **matriz) Main: while (qtdRainhas < n) { printf("\nInsira a linha: "); scanf("%i", &ri); printf("\nInsira a coluna: "); scanf("%i", &rj); verifica = verificaConflitos(ri-1, rj-1, tabuleiro, n); printf("verificou"); if (verifica == 0) { printf("\nentrou if\n"); tabuleiro[ri][rj] = 1; printf("Inseriu rainha %i" , i); qtdRainhas++; } else printf("\nPosicao invalida, insira novamente!"); } printf("\n"); Imprimir(tabuleiro, n); .h /**Imprime todas as posições do tabuleiro*/ void Imprimir(int **tabuleiro, int n); /**VERIFICA SE É POSSÍVEL POSICIONAR A RAINHA EM matriz(ri, rj). RETORNA 1 SE NÃO É POSSÍVEL E 0 SE FOR POSSÍVEL*/ int verificaConflitos (int ri, int rj, int **tabuleiro , int n); funcoes.c int verificaConflitos (int ri, int rj, int **tabuleiro, int n) { int i, i1, i2, j, j1, j2; int teste = 0; i1 = ri; i2 = ri; j1 = rj; j2 = rj; printf("\nentrou verificaConflito"); /**TESTA SE EXISTE ALGUMA NA MESMA LINHA OU COLUNA*/ for (i = 0; i < n; i++) { printf("\nentrou for"); if (tabuleiro[ri][i] == 1 || tabuleiro[i][rj] == 1)//o erro acontece aqui! { teste = 1; printf("\nentrou if"); break; } printf("\nsaiu for"); }
  10. Meu programa tá ficando com cara de gambiarra kkkkkkkkkkk mas valeu pela ajuda!
  11. Mas eu preciso reservar essas 10 posições uma única vez, porém o método "writeEA" será chamado a cada nova inserção.
  12. Então, @vangodp, o meu problema determina que eu comece a escrever no arquivo a partir da décima posição, ou seja, não posso utilizar as 10 primeiras posição. Caso você esteja curioso para saber o porque devo não utilizar as 10 primeiras posições a resposta é que nesse local não utilizado eu irei preencher com outras informações, por exemplo o tamanho total do arquivo, o "endereço" para um registro excluído etc. Bom, acredito que deu pra entender o que quis dizer. Há alguma forma de escrever no arquivo pulando as 10 primeiras posições?
  13. O que eu me pergunto é: por que o seekp não funciona? arq.seekp(9, ios::beg) isso deveria ser responsável por mexer com os ponteiros do arquivo, ou estou errado?

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...