fallo inexplicable en este programa, ayuda por favor

Iniciado por Adri124, 11 Octubre 2010, 20:37 PM

0 Miembros y 3 Visitantes están viendo este tema.

Adri124

Hola buenas, desde hace algunos dias me he roto la cabeza con este programa, el cual consiste en un tablero de sudoku que pide numeros (en este caso caracteres) para ir rellenando dicho tablero de sudoku.

La version de este programa que utiliza enteros en vez de caracteres me salió sin ningún problema, pero en esta version, en la que se pide realizar lo mismo pero con caracteres no entiendo por qué se salta scanf's, rellena irracionalmente espacios, desordenando el tablero, etc...

He comprobado que el tipo de datos valor sea char, que los scanf recojan los caracteres con %c, que el tablero muestre los numeros con %c...

El fallo parece estar a partir de introducir el primer valor que se pide, a partir de ahí es el caos, repite todo de 2 en 2.

Creedme, si no estuviera tan desquiciado no habría preguntado. Puede que sea una tontería, pues estoy empezando, pero no lo entiendo. Respecto al uso de bucles, no he usado porque no nos lo permiten aún, así como punteros, etc... la estructura que tengo es la pedida.

Aquí el código fuente del programa:

#include <stdio.h>
#define TAM 9  //Por mayor comodidad y fiabilidad, establecemos que TAM equivalga a la constante 9

void main()
{
char valor[TAM];
int hueco = TAM;  //El número de huecos del tablero será igual a TAM hasta que se decremente en una unidad sucesivamente

double porcentaje;  //Declaramos el tipo de dato double porcentaje para mostrar el % adecuado en cada momento



valor [0]='.';
valor [1]='.';
valor [2]='.';
valor [3]='.';
valor [4]='.';  //Inicializamos con '.' todas las variables, como se pide.
valor [5]='.';
valor [6]='.';
valor [7]='.';
valor [8]='.';


printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);  //Mostramos el tablero con todos los huecos (variables) con '.'
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


printf("Primer Valor: ");
scanf("%c", &valor[0]);  //En ésta ocasión y las siguientes, iremos almacenando en el tablero los valores del usuario

porcentaje = (100/9.)*(TAM-8);  //Cálculo del porcentaje, que se irá actualizando conforme vayamos restando una unidad a TAM

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);  //Comienzo del proceso que se repite hasta alcanzar el número de
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);  //huecos 0 y porcentaje del tablero lleno 100.00%
printf("- - - - - -\n");
printf("\n");


valor [0];
valor [1]='.';
valor [2]='.';
valor [3]='.';
valor [4]='.';
valor [5]='.';
valor [6]='.';
valor [7]='.';
valor [8]='.';



printf("Segundo valor: ");
scanf("%c", &valor[1]);

porcentaje = (100/9.)*(TAM-7);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


   valor [0];
valor [1];
valor [2]='.';
valor [3]='.';
valor [4]='.';
valor [5]='.';
valor [6]='.';
valor [7]='.';
valor [8]='.';



printf("Tercer valor: ");
scanf("%c", &valor[2]);

porcentaje = (100/9.)*(TAM-6);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


   valor [0];
valor [1];
valor [2];
valor [3]='.';
valor [4]='.';
valor [5]='.';
valor [6]='.';
valor [7]='.';
valor [8]='.';



printf("Cuarto valor: ");
scanf("%c", &valor[3]);

porcentaje = (100/9.)*(TAM-5);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


   valor [0];
valor [1];
valor [2];
valor [3];
valor [4]='.';
valor [5]='.';
valor [6]='.';
valor [7]='.';
valor [8]='.';



printf("Quinto valor: ");
scanf("%c", &valor[4]);

porcentaje = (100/9.)*(TAM-4);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


   valor [0];
valor [1];
valor [2];
valor [3];
valor [4];
valor [5]='.';
valor [6]='.';
valor [7]='.';
valor [8]='.';



printf("Sexto valor: ");
scanf("%c", &valor[5]);

porcentaje = (100/9.)*(TAM-3);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


   valor [0];
valor [1];
valor [2];
valor [3];
valor [4];
valor [5];
valor [6]='.';
valor [7]='.';
valor [8]='.';


printf("Septimo valor: ");
scanf("%c", &valor[6]);

porcentaje = (100/9.)*(TAM-2);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


   valor [0];
valor [1];
valor [2];
valor [3];
valor [4];
valor [5];
valor [6];
valor [7]='.';
valor [8]='.';


printf("Octavo valor: ");
scanf("%c", &valor[7]);

porcentaje = (100/9.)*(TAM-1);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");


   valor [0];
valor [1];
valor [2];
valor [3];
valor [4];
valor [5];
valor [6];
valor [7];
valor [8]='.';



printf("Ultimo valor: ");
scanf("%c", &valor[8]);

porcentaje = (100/9.)*(TAM);

hueco--;

printf("\nNumero de huecos: %d. Porcentaje del tablero lleno: %.2lf %%\n\n", hueco, porcentaje);
printf("  | 1 2 3 |\n");
printf("- + - - - +\n");
printf("A | %c %c %c |\n", valor[0], valor[1], valor[2]);
printf("B | %c %c %c |\n", valor[3], valor[4], valor[5]);
printf("C | %c %c %c |\n", valor[6], valor[7], valor[8]);
printf("- - - - - -\n");
printf("\n");

       valor [0];
valor [1];
valor [2];
valor [3];
valor [4];
valor [5];
valor [6];
valor [7];
valor [8];
}

xassiz~

Para este tipo de cosas como tableros, te recomendaría trabajar con arrays de dos dimensiones (una tabla).

Adri124

#2
Ya lo pensé, pero tampoco nos dejan porque aún no está explicado en clase

Lh: No hagas doble post, utiliza el botón modificar.

por curiosidad he probado con tabla (dos dimensiones) y tampoco

iCore

Cita de: Adri124 en 11 Octubre 2010, 22:14 PM
por curiosidad he probado con tabla (dos dimensiones) y tampoco

Que compilador usas?

Adri124

Hola, uso el compilador del codeblocks en windows, el GCC adaptado a windows.

iCore

#5
Cita de: Adri124 en 12 Octubre 2010, 00:11 AM
Hola, uso el compilador del codeblocks en windows, el GCC adaptado a windows.

Vale, aunque el compilador es lo de menos, ya que C/C++ son casi las mismas sintaxis, voy a probar tu código y te aviso si encontré la falla vale?.

Regards;

-----------------------------------------------------------------------------------------------

Edito:

Te habeis dado cuenta lo que pasa si en un principio como valor 1, colocas los numeros que quieras (completando una cadena de 9)?

Se rellenan tdos los recuadros con todo el orden, menuda locura :xD... me ando iniciando con C++ y valla que no encuentro la falla aún... espero dar con ella pronto :P.

Prueba:


Regards;

Adri124

#6
No había caido en eso!! salta a la ultima posicion si pones 012345678!! tambien he pensado que este problema venga precisamente de que se trabaja con caracteres y haya que limitarlos con /0 pero ni idea...

Tambien acabo de probar a hacer la tabla con strings (una locura) y el programa revienta por todas partes, no hay forma

Lh: No hagas doble post, utiliza el botón modificar.

Ya está resuelto!!! al final el único misterio que tenía era el siguiente, por si alguna vez os pasa: antes del especificador de formato %c del scanf hay que dejar un espacio, para indicarle que no coja espacios (me estaba inundando de espacios el tablero y se descolocaba), quedando al final así: scanf(" %c", &valor[0]);

iCore

Cita de: Adri124 en 12 Octubre 2010, 12:13 PM
No había caido en eso!! salta a la ultima posicion si pones 012345678!! tambien he pensado que este problema venga precisamente de que se trabaja con caracteres y haya que limitarlos con /0 pero ni idea...

Tambien acabo de probar a hacer la tabla con strings (una locura) y el programa revienta por todas partes, no hay forma

Lh: No hagas doble post, utiliza el botón modificar.

Ya está resuelto!!! al final el único misterio que tenía era el siguiente, por si alguna vez os pasa: antes del especificador de formato %c del scanf hay que dejar un espacio, para indicarle que no coja espacios (me estaba inundando de espacios el tablero y se descolocaba), quedando al final así: scanf(" %c", &valor[0]);

Valla valla yo me lié con otras cosas, de hecho intentaba con arrays y ni así lograba :xD un gusto que hayas solucionado tu problema, aunque no ayude en nada igual te las arreglaste!; esa info me servirá para después.

Regards;