Discussion:
programa Matrix
(demasiado antiguo para responder)
Principiante
2005-11-18 10:50:08 UTC
Permalink
Bueno el título queda algo raro :-), pero veamos:
Como algunos sabeis yo estudio C por mi cuenta, con algunos libros y la
ayuda de esta lista.

Con mi libro, aunque picoteo temas, realmente estoy estudiando los
bucles, y como estoy con ese tema y lo mejor es practicar, se me ha
ocurrido hacer un programa que se parezca a esa presentación de la
peli Matrix, ya sabeis esa imagen donde bajan las letras por la
pantalla de forma chula.

Yo he hecho este programa:

#include <stdio.h>
main ()
{
int a=1;

while (a!=0){
printf ("%i %x", a++, a++);}
}

No se si será muy elegante programar un bucle así, pero los
resultados no son del todo lo esperado.
Salen numeros y letras (eso si, por eso puse los hexadecimales) pero a
tanta velocidad que realmente no se ve nada bonito, además me salen de
izquierda a derecha.

1.- ¿Hay alguna funcion o forma de controlar la velocidad con la que
salen por pantalla los caracterres sin depender directamente del micro
si no del propio programa?

2.- ¿Hay alguna forma de que salgan de forma vertical (arriba hacia
abajo como en la peli) llenando toda la pantalla?, si uso '\n',
realmente sale de uno en uno y no me sale la pantalla entera llena de
caracteres y numeros, si no dos lineas que van incrementandose en
número pero nada más; se me ocurre que podría aumentar el printf tal
que ("%i %c %x %i.......\n", a++, a++, a++, a++, Nveces).hasta llenar
toda la linea de la pantalla pero no parece muy elegante forma de
hacerlo :-?

En fin, las pistas y comentarios serán, como siempre, bienvenidas.
Gracias.
Zara
2005-11-18 12:21:07 UTC
Permalink
Post by Principiante
Como algunos sabeis yo estudio C por mi cuenta, con algunos libros y la
ayuda de esta lista.
Con mi libro, aunque picoteo temas, realmente estoy estudiando los
bucles, y como estoy con ese tema y lo mejor es practicar, se me ha
ocurrido hacer un programa que se parezca a esa presentación de la
peli Matrix, ya sabeis esa imagen donde bajan las letras por la
pantalla de forma chula.
#include <stdio.h>
main ()
{
int a=1;
while (a!=0){
printf ("%i %x", a++, a++);}
Comportamiento sin definir. No se sabe si se ejecuta el primer a++
primero o después, ni siquiera en qué orden se evalúan las
expresiones.
Post by Principiante
}
No se si será muy elegante programar un bucle así, pero los
resultados no son del todo lo esperado.
Salen numeros y letras (eso si, por eso puse los hexadecimales) pero a
tanta velocidad que realmente no se ve nada bonito, además me salen de
izquierda a derecha.
Bueno, ese es el orden normal en el que se leen los carateres en las
lenguas occidentales, no tiene nada de extraño.
Post by Principiante
1.- ¿Hay alguna funcion o forma de controlar la velocidad con la que
salen por pantalla los caracterres sin depender directamente del micro
si no del propio programa?
Poniendo un bucle de ratardo, y adaptando el FINAL para esa máquina.

for(int espera=0,espera<FINAL;++espera);
Y si no, depende del sistema operativo. (WIN32: Sleep)
Post by Principiante
2.- ¿Hay alguna forma de que salgan de forma vertical (arriba hacia
abajo como en la peli) llenando toda la pantalla?, si uso '\n',
realmente sale de uno en uno y no me sale la pantalla entera llena de
caracteres y numeros, si no dos lineas que van incrementandose en
número pero nada más; se me ocurre que podría aumentar el printf tal
que ("%i %c %x %i.......\n", a++, a++, a++, a++, Nveces).hasta llenar
toda la linea de la pantalla pero no parece muy elegante forma de
hacerlo :-?
Depende del sistema operativo y del compilador. Busca en la ayuda del
compilador los contenidos de conio.h, es porbable que ahí tengs
funciones del tipo "gotoxy" para posicionarse en pantalla.
Post by Principiante
En fin, las pistas y comentarios serán, como siempre, bienvenidas.
Gracias.
Saludos,

-- Zara
McLeod / IdeaFix
2005-11-18 12:47:49 UTC
Permalink
Post by Principiante
#include <stdio.h>
main ()
{
int a=1;
while (a!=0){
printf ("%i %x", a++, a++);}
Comportamiento sin definir. No se sabe si se ejecuta el primer a++
primero o después, ni siquiera en qué orden se evalúan las
expresiones.
La convención de llamada "cdecl" especifica que los argumentos se
evalúan de derecha a izquierda, a medida que se van metiendo en pila.
Otra cosa es al meterle optimizaciones la cosa pueda cambiar algo, pero
en una compilación estándar, el valor que se imprime en lugar del %i
valdrá uno más que el que se imprime con un %x .

Otra cosa es que esto degenere en un bucle infinitio, porque a empieza
siendo impar, y en cada vuelta de bucle se le suma 2, así que nunca
llegaría a valer 0 y el while no terminaría.
Eduardo Villanueva
2005-11-18 14:56:23 UTC
Permalink
Post by Zara
Post by Principiante
Como algunos sabeis yo estudio C por mi cuenta, con algunos libros y la
ayuda de esta lista.
Con mi libro, aunque picoteo temas, realmente estoy estudiando los
bucles, y como estoy con ese tema y lo mejor es practicar, se me ha
ocurrido hacer un programa que se parezca a esa presentación de la
peli Matrix, ya sabeis esa imagen donde bajan las letras por la
pantalla de forma chula.
#include <stdio.h>
main ()
{
int a=1;
while (a!=0){
printf ("%i %x", a++, a++);}
Comportamiento sin definir. No se sabe si se ejecuta el primer a++
primero o después, ni siquiera en qué orden se evalúan las
expresiones.
Post by Principiante
}
No se si será muy elegante programar un bucle así, pero los
resultados no son del todo lo esperado.
Salen numeros y letras (eso si, por eso puse los hexadecimales) pero a
tanta velocidad que realmente no se ve nada bonito, además me salen de
izquierda a derecha.
Bueno, ese es el orden normal en el que se leen los carateres en las
lenguas occidentales, no tiene nada de extraño.
Post by Principiante
1.- ¿Hay alguna funcion o forma de controlar la velocidad con la que
salen por pantalla los caracterres sin depender directamente del micro
si no del propio programa?
Poniendo un bucle de ratardo, y adaptando el FINAL para esa máquina.
for(int espera=0,espera<FINAL;++espera);
Y si no, depende del sistema operativo. (WIN32: Sleep)
El bucle de espera es una opcion sencilla, que depende totalmente de la
velocidad del procesador. Tambien debes tener cuidado si lo usas con el
compilador, ya que si compilas con optimizaciones y lo que hay dentro
del for no hace nada "util", es muy probable que el compilador lo ignore
al generar el codigo. Ademas, con la velocidad de los ordenadores de hoy
en dia, mejor mete alguna operacion con doubles (las divisiones son las
mas costosas) dentro del for.

No se si Windows es POSIX o no, si lo es puedes usar la funcion signal
para registrar un manejador para SIGALRM. No es complicado, pero si
estas empezando probablemente esto te lie un poco, aunque si tienes
curiosidad echale un vistazo ;)
Post by Zara
Post by Principiante
2.- ¿Hay alguna forma de que salgan de forma vertical (arriba hacia
abajo como en la peli) llenando toda la pantalla?, si uso '\n',
realmente sale de uno en uno y no me sale la pantalla entera llena de
caracteres y numeros, si no dos lineas que van incrementandose en
número pero nada más; se me ocurre que podría aumentar el printf tal
que ("%i %c %x %i.......\n", a++, a++, a++, a++, Nveces).hasta llenar
toda la linea de la pantalla pero no parece muy elegante forma de
hacerlo :-?
Depende del sistema operativo y del compilador. Busca en la ayuda del
compilador los contenidos de conio.h, es porbable que ahí tengs
funciones del tipo "gotoxy" para posicionarse en pantalla.
Post by Principiante
En fin, las pistas y comentarios serán, como siempre, bienvenidas.
Gracias.
Saludos,
-- Zara
wastedyears
2005-11-19 17:34:32 UTC
Permalink
Supongo que estás usando windows para hacer el programa... Veo un
problema en el tema que te han sugerido de hacer un bucle con
operaciones costosas para retardar la aparición de caracteres...
aparte de ser un gasto inútil de cpu, en cualquier ordenata moderno no
se retardará mucho. Además, no se puede controlar el retardo, porque
dependerá de la velocidad (puede quedar chulo en tu ordenador y no
verse nada en otro, por ejemplo).
Yo haría un bucle de Sleep (que además bloquea el proceso y lo deja
sin consumir cpu, por tanto). En win32 puedes especificar este retardo
en miliseguntos, así que yo creo que te vendrá muy bien. En linux,
como bien ha dicho Eduardo Villanueva, sería buena idea registrar una
manejadora para una SIGALARM, pero también hay otra función como
"nanosleep" que puede serte útil, consulta el manual.
Respecto al desplazamiento por la pantalla, seguro que hay alguna
función en el conio.h. En linux hay alguna pero corresponden más bien
a los códigos de cada terminal... de eso no controlo tanto, lo mio es
el rendimiento :P

Una sugerencia para generar los códigos (1 y 0 solo)

void main()
{
int i;
randomize();
for(i=0; i<5000; i++)
{
printf("%d", rand() % 2);
}
getch();
}
Principiante
2005-11-20 16:42:37 UTC
Permalink
Bueno, Gracias a todos; y después de vuestras pistas, de mucho mirar
el manual y hacer muchas pruebas, la 'cosa' me quedó así,
(respetando el bucle while infinito de origen):


#include <stdio.h>
#include <time.h>
int main(){
int a;
a=1;
while (a!=0)
{
printf("%8X %4d", rand()%18,rand()%2,sleep(1));
}

}

Es muy simple (eso me gusta), incluso simplón, pero hace su papel,
compilado en Dev-C++ en un windows XP y con un micro AMD 2600 Mhz, el
efecto optico que se consigue es aceptable; podría servir incluso para
un corto casposo de Matrix o... 'Torrente 4 visita el futuro' :-D.

En linux (debian, gcc 4.0.1, IDE-Anjuta) no he logrado que funcione ya
que no encontré nada similiar a sleep (existe, pero lo entiendo muy
bien que hace y jugando con la funcion time no lo logré), si quito el
'sleep' , funciona en linux, pero queda demasiado burdo.

En fin....

Me queda la duda final... ¿seria muy dificil hacer aparecer también
caracteres en japones o chino? (en la peli orginal si salen). He estado
mirando por la red, pero no acabo de entender todo esto del Unicode
:-?, es tan dificil como parece o es que simplemente no tengo nivel
suficiente para entenderlo /*esta ultima opción es la que creo mas
segura :-).*/.

Gracias a todos,
Un saludo
Roberto
2005-11-20 20:32:24 UTC
Permalink
En linux tienes la función usleep a la que le pasas el número de
microsegundos que quieres esperar, por ejemplo, usleep(1000000); espera al
menos un segundo (el "al menos" es porque depende de la carga del equipo,
claro).

No recuerdo que librería tienes que incluir, pero es una de las
siguientes:

#include <stdio.h>
#include <sys/io.h>
#include <sys/time.h>

Espero que te sirva

"Principiante" <***@gmail.com> escribi� en el mensaje news:***@g14g2000cwa.googlegroups.com...
Bueno, Gracias a todos; y después de vuestras pistas, de mucho mirar
el manual y hacer muchas pruebas, la 'cosa' me quedó así,
(respetando el bucle while infinito de origen):


#include <stdio.h>
#include <time.h>
int main(){
int a;
a=1;
while (a!=0)
{
printf("%8X %4d", rand()%18,rand()%2,sleep(1));
}

}

Es muy simple (eso me gusta), incluso simplón, pero hace su papel,
compilado en Dev-C++ en un windows XP y con un micro AMD 2600 Mhz, el
efecto optico que se consigue es aceptable; podría servir incluso para
un corto casposo de Matrix o... 'Torrente 4 visita el futuro' :-D.

En linux (debian, gcc 4.0.1, IDE-Anjuta) no he logrado que funcione ya
que no encontré nada similiar a sleep (existe, pero lo entiendo muy
bien que hace y jugando con la funcion time no lo logré), si quito el
'sleep' , funciona en linux, pero queda demasiado burdo.

En fin....

Me queda la duda final... ¿seria muy dificil hacer aparecer también
caracteres en japones o chino? (en la peli orginal si salen). He estado
mirando por la red, pero no acabo de entender todo esto del Unicode
:-?, es tan dificil como parece o es que simplemente no tengo nivel
suficiente para entenderlo /*esta ultima opción es la que creo mas
segura :-).*/.

Gracias a todos,
Un saludo
Eduardo Villanueva
2005-11-20 22:49:43 UTC
Permalink
Post by Roberto
En linux tienes la función usleep a la que le pasas el número de
microsegundos que quieres esperar, por ejemplo, usleep(1000000); espera al
menos un segundo (el "al menos" es porque depende de la carga del equipo,
claro).
Tambien puede ser interrumpida por una señal y terminar antes del tiempo
especificado, al igual que sleep.
Post by Roberto
No recuerdo que librería tienes que incluir, pero es una de las
#include <stdio.h>
#include <sys/io.h>
#include <sys/time.h>
En Linux tienes tanto sleep como usleep (man 3 sleep; man 3 usleep).
El header que debes incluir para usarlas es unistd.h

De todas formas usleep esta ya obsoleta. Como bien dijo wastedyears
deberias echarle un vistazo a nanosleep (man 2 nanosleep).
Eduardo Villanueva
2005-11-18 14:32:42 UTC
Permalink
Post by Principiante
Como algunos sabeis yo estudio C por mi cuenta, con algunos libros y la
ayuda de esta lista.
Con mi libro, aunque picoteo temas, realmente estoy estudiando los
bucles, y como estoy con ese tema y lo mejor es practicar, se me ha
ocurrido hacer un programa que se parezca a esa presentación de la
peli Matrix, ya sabeis esa imagen donde bajan las letras por la
pantalla de forma chula.
#include <stdio.h>
main ()
{
int a=1;
while (a!=0){
printf ("%i %x", a++, a++);}
}
No se si será muy elegante programar un bucle así, pero los
resultados no son del todo lo esperado.
Salen numeros y letras (eso si, por eso puse los hexadecimales) pero a
tanta velocidad que realmente no se ve nada bonito, además me salen de
izquierda a derecha.
Seria mejor que declarases una cadena con los simbolos que quieres usar,
y generes indices aleatorios (mirate la funcion rand) sobre la longitud
de la cadena:

const char simbolos[] = "0123456789abcde....";

Puedes repetir algunos simbolos para que salgan con mayor frecuencia.
Post by Principiante
1.- ¿Hay alguna funcion o forma de controlar la velocidad con la que
salen por pantalla los caracterres sin depender directamente del micro
si no del propio programa?
2.- ¿Hay alguna forma de que salgan de forma vertical (arriba hacia
abajo como en la peli) llenando toda la pantalla?, si uso '\n',
realmente sale de uno en uno y no me sale la pantalla entera llena de
caracteres y numeros, si no dos lineas que van incrementandose en
número pero nada más; se me ocurre que podría aumentar el printf tal
que ("%i %c %x %i.......\n", a++, a++, a++, a++, Nveces).hasta llenar
toda la linea de la pantalla pero no parece muy elegante forma de
hacerlo :-?
Puedes usar un buffer de una linea:
char linea[80]; // o el tamaño que tenga una linea

Afortunadamente hace demasiado que no programo bajo Windows ;) pero
seguro que hay alguna funcion que diga el tamaño de una linea. Tambien
puedes usar las ncurses, pero no se las recomiendo a un principiante ;)

Rellenas el buffer con simbolos aleatorios, y lo sacas por consola.

Tambien puedes pasar de esto y usar 2 bucles for anidados, el interno
que saque un caracter (o el patron de caracteres que quieras) hasta
llenar una linea, y el externo que saque el numero de lineas que quieras
(o la condicion de parada que quieras poner).
Post by Principiante
En fin, las pistas y comentarios serán, como siempre, bienvenidas.
Gracias.
Animo, y de nada ;)
Optimus_Primitivus
2005-12-02 00:04:02 UTC
Permalink
Bien, si lo que deseas es imprimir de manera vertical, debes indicarle
al programa que imprima un salto de linea; por ejemplo:
printf("%d\n",x); ->el \n en c es un salto de linea; ahora si lo que
quieres es que se impriman los numeros de manera aleatoria en la
pantalla, puedes auxiliarte de la funcion gotoxy(x,y); donde x es la
coordenada que desees del eje de las "x" en tu pantalla, y "y" es la
coordenada del eje de las y de tu pantalla, aparte puedes asignarle un
valor aleatorio a las variables que utilises mediante la funcion "rnd"
o random(esta funcion asigna un valor aleatorio a una variable) y si el
"rnd" lo incluyes dentro de bucle, este te generara un sin fin de
coordenadas al azar.

Por otra parte puedes auxiliarte de algunos otras cualidades dentro de
c, como es el uso de matrices, puedes definir una matriz de n
elementos, donde esta representa cada una de las coordenadas existentes
en tu monitor e ir guardando aleatoriamente en c/u de las posiciones de
la matriz.


Te lo dejo a tu criterio, espero que te sirva

Loading...