Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NericSain en 9 Diciembre 2017, 07:49 am



Título: LLenado De Matriz QR EN C
Publicado por: NericSain en 9 Diciembre 2017, 07:49 am
Hola para todos  :) :) :), hoy tengo muchas dudas y acepto respuestas,propuestas y sugerencias con mucho animo.
mi problema es el sig.
tengo que llenar ciertas partes de una matriz de 21x21 con la información en binario de los datos que ingrese el usuario por pantalla.
mi problema es que no se como hacer lo que en la sig. foto explico mejor:
http://es.zimagez.com/zimage/img201712090001.php

Ahora, en mi programa en c, ya hice la decodifican de los caracteres a decimal, y a binario; es decir, que ya tengo un array por cada carácter con unos y ceros, pero todavía, no se como pasar esa información, a la matriz, que ademas tengo que llenar en un un sentido, como tipo espiral serpiente, mas o menos de esta manera:
http://es.zimagez.com/zimage/qrcd.php

Estoy muy atorado, atareado, molesto,cansado y estezado, por favor ojala alguien me escuche, es un proyecto muy importante, de verdad les agradecería. saludos y help me!!, help me!!! :-\ :-\ :-(

MOD: No escribir todo en mayúsculas.


Título: Re: LLenado De Matriz QR EN C
Publicado por: Serapis en 10 Diciembre 2017, 16:18 pm
A ver, si el problema se limita a mover un valor a una determinada posición en un array bidimensional... pués es bastante obvio:

Sea z el valor a colocar en la cordenada x,y:
Código:
Array(y,x) = z
Si el array es unidimensional no es mucho más complejo, sabiendo el 'ancho' de la diemsnión...
Código:
Array((y*ancho) + x) = z

La letra P, tiene dos bits a 1, el 64 y el 16, porque 64+16=80, el resto son 0.
Luego quiere decir que necesitas un bucle de 8 ciclos (porque 8 bits tiene  un byte), alojado dentro de otro bucle cuya cantidad de ciclos sean los caracteres.
Así que en pseudocodigo sería algo como:

Código:
entero i, j, k
byte letra

Bucle j por cada letra en Palabra
    i=1
    Bucle para k de 0 a 7
        bit= (letra and i)  //entiendo que si el bit está a 0, se consigna un 0.
        letra /=2      
        llamada a funcion Posicionar(k, bit)
        i +=i // así va tomando valores 1,2,4,8,16...
    Fin bucle
Fin bucle
Tu problema luego se resume en que no hay una única forma d eposicionar en el array... "x" e "y", se modifican de forma diferente a cada caso... luego necesitas una función para cada caso, y posiblemente eso suponga que el bucle externo, no pueda ser un bucle y deba ser código lineal...

Código:
letra= palabra.char(0)
  i=1
  bucle para k de 0 a 7
     bit= (letra and i)  //entiendo que si el bit está a 0, se consigna un 0.
     letra /=2
     llamada a función x001(k,bit)
     i +=i // así va tomando valores 1,2,4,8,16...
  fin bucle

letra= palabra.char(1)
  i=1
  bucle para k de 0 a 7
     bit= (letra and i)  //entiendo que si el bit está a 0, se consigna un 0.
     letra /=2
     llamada a función x002(k,bit)
     i +=i // así va tomando valores 1,2,4,8,16...
  fin bucle

letra= palabra.char(2)
  i=1
  bucle para k de 0 a 7
     bit= (letra and i)  //entiendo que si el bit está a 0, se consigna un 0.
     letra /=2
     llamada a función x003(k,bit)
     i +=i // así va tomando valores 1,2,4,8,16...
  fin bucle
...etc...

Y dichas funciones, como puedes apreciar reciben dos parámetros, el valor del bit y el índice del bit... el índice es necesario para reposicionar el par de cordenadas X e Y, al punto correcto...
Ejemplo para una de ellas:

Código:
entero x, y //declaradas al nivel del módulo, no dentro de una función, pues sus valores deben permanecer inalteradas tras salir de la función.
Funcion PosicionarCuadrante1119(entero indice, entero bit)
    Si (indice=0) luego  //Reset X e Y al inicio del cuadrante
       x= 19
       y= 11
    Sino
       Si (x=20) luego
           x= 19
           y +=1
       Sino
          x +=1   // x= 20
       Fin si
    Fin si

    Array(x,y) = bit
Fin funcion
Como hay diferentes cuadrantes, y cada uno tiene sus propias cordenadas, las diferencias entre cada función se limitan a señalar correctamente los valores X e Y a cada caso...

...resumiendo, nada de otro mundo... nada que con un mínimo de atención pueda conseguir cualquiera...
queda a tu esfuerzo el resto de funciones, la llamada como: "PosicionarCuadrante1119", se aplica al cuadrante que apuntas en la inagen con una llave, más exactamente al cuadrante que comienza en Y=11 y x=19... (de ahí el nombre). Puede haber más cuadrantes que se 'rellenen' del mismo modo, por lo que también queda a tu esfuerzo simplificar el código (esto es, reunir todas las que se rellenan igual en una sola)... y así tendrías solo una función por cada forma distinta de llenar un cuadrante y para todos los cuadrantes que se rellenan igual, se diferenciarían sólo en los valores iniciales de sus cordenadas. Ya está todo dicho...