Problema con Javascript

xPipOx

Estoy aprendiendo algo de javascript y no entiendo una cosa, quiza es por que tengo algo mal, ni idea a ver si alguien me puede echar una manita.

function letra_a(N,C){
var i;
window.document.write("<table border=5px bordercolor=silver cellspacing=5px><tr>");
for (i=1; i<=N*N; i++) {
	
if (i<=N || ((i>(N*N)/2) && (i<=((N*N)/2)+10))) {
window.document.write("<td style='color:black;background-color:"+C+"'>O</td>");
}
else{
window.document.write("<td style='color:black;background-color:white'>O</td>");
}



if(i%N===0) {
window.document.write("<tr/><tr>");
}
}	
window.document.write('<tr/></table>');
}

A esa funcion le entran unos valores por un prompt de otra funcion pero bueno la cuestion esta aqui.

if (i==1 || i<=N || ((i> (NN)/2) && (i<=((NN)/2)+10)))

Si la hago asi y le pongo el tamaño 10 perfectamente la primera fila y la fila del medio se colorea de otro color, pero si le pongo la variable N para de mi y me colorea todo a partir de N*N/2. He puesto 3213 parentesis a ver si era por eso, los he quitado, no se : s, ¿que tengo mal?

pdj

¿Que quieres hacer?

1 respuesta
Shendraf

No me ha quedado claro lo que pides, pero si lo que buscabas era crear una tabla de tamaño N*N con filas impares coloreadas de color C, esto funciona:

function letra_a(N,C){
   var i, j;
   window.document.write("<table border=5px bordercolor=silver cellspacing=5px>");
   for (i=0; i<N; i++) {
   	window.document.write("<tr>");
		for (j=0; j<N; j++) {
			if(i%2==0) {
        window.document.write("<td style='color:black;background-color:"+C+"'>O</td>");
      }
      else{
        window.document.write("<td style='color:black;background-color:white'>O</td>");
      }
    }
    window.document.write("</tr>");
           
}
window.document.write('</table>'); }

Si quieres colorear las filas pares, cambia esto: if(i%2==1) {

1 respuesta
xPipOx

#2 #3 En resumen quiero hacer una A mayuscula cuadriculada. Vamos se tiene que pintar la primera fila, las columnas exteriores y la fila de en medio.

Mi codigo me pinta todo menos la fila interior que lo que hace es pintar todo desde esa fila hacia abajo.

function letra_a(N,C){
var i;
var op1 = ((N*N)/2)+2, op2 = ((N*N)/2)+N-1;
var s=1;

window.document.write("<table border=5px bordercolor=silver cellspacing=5px><tr>");
for (i=1; i<=N*N; i++) {
	
if (i<=N || (i>=op1&&i<=op2) ) {
window.document.write("<td style='color:black;background-color:"+C+"'>O</td>");
}
else{
	if (i==(N*s)+1) {
	window.document.write("<td style='color:black;background-color:"+C+"'>O</td>");
	s=s+1;
	}
	else{
		if (i==(N*s)) {
		window.document.write("<td style='color:black;background-color:"+C+"'>O</td>");
		}
		else{
		window.document.write("<td style='color:black;background-color:white'>O</td>");
		}
	}
}



if(i%N===0) {
window.document.write("<tr/><tr>");
}
}	
window.document.write('<tr/></table>');
}

i<=N Me pinta la primera fila
i==(Ns)+1 Me pinta la primera columna
i==(N
s) Me pinta la ultima columna

Ahora necesito algo que me pinte la fila de en medio y habia pensado algo asi:

i>=(NN)/2)+2 && i<=(NN)/2)+N-1

Pero no funciona, nunca he usado un and en javascript quiza algo pongo mal. Poniendo un ejemplo seria que 10*10/2+2=52 y el otro seria 59 por lo que me deberia pintar todas esas celdas pero me pinta esas y las posteriores.

1 respuesta
Shendraf

#4 He modificado mi código:

function letra_a(N,C){
   var i, j;
   window.document.write("<table border=5px bordercolor=silver cellspacing=5px>");
   for (i=0; i<N; i++) {
   	window.document.write("<tr>");
		for (j=0; j<N; j++) {
			if(i==0 || j==0 || j==N-1 || i==Math.floor(N/2)) {
        window.document.write("<td style='color:black;background-color:"+C+"'>O</td>");
      }
      else{
        window.document.write("<td style='color:black;background-color:white'>O</td>");
      }
    }
    window.document.write("</tr>");
           
}
window.document.write('</table>'); }

Espero que te sirva.

1 respuesta
xPipOx

#5 Muchas gracias ahora a ver si lo logro entender. Por cierto sabrias que fallo tiene el mio? uso mal el and? no se puede usar asi? es que me quedo con la duda pero bueno si no ya lo intentare preguntar por otra parte.

De nuevo gracias.

PD: Ya entendi mas o menos tu codigo la verdad mucho mejor y menos extenso que el mio pero estoy empezando y tampoco tengo mucha idea xD.

1 respuesta
Shendraf

#6 Si te soy sincero, iba a tardar más en entender tu código que hacer el mío xD
Para tratar arrays bidimensionales es preferible usar dos bucles.

Mi código funciona en plan:
Fila i
Columna j
Condición: if(i==0 || j==0 || j==N-1 || i==Math.floor(N/2)) {
Para la posición (i,j), si la celda es:
· i = 0 -> primera fila, rellenar
· j = 0 -> primera celda de la fila, rellenar
· j=N-1 -> última celda de la fila, rellenar
· i =Math.floor(N/2) -> fila del medio (hago un redondeo hacia abajo con Math.floor), rellenar
· Cualquier otro caso, no rellenar

Usuarios habituales

  • Shendraf
  • xPipOx
  • pdj