[ Foro de C ]

¿Cómo borrar pantalla?

23-Aug-2012 16:22
Pablo Rampa
9 Respuestas

Ej. 1 del Capítulo 7. Necesito ayuda.

Sería sencillo si tan sólo pudiera llevar el cursor al inicio de la pantalla. Luego simplemente llamar a printf para que escriba 25
líneas vacías.
la dificultad está en manejar el cursor a voluntad hacia atrás o
hacia el origen. Investigué algo sobre gotoxy(); pero no es una
función estandar de ANSI-C. Uso como IDE a Dev-C++ versión 4.9.9.2. Hay maneras de emular conio.h, pero no está al alcance de mis capacidades intelectuales realizarlo, al menos por el momento. Además me parece muy rebuscado.
Usando archivos: Si lo abro para escribir y leer, no he podido
ubicarme en el origen con fseek para poder escribir las 25 líneas vacías.
Necesito una idea para poder ubicarme en el problema.
De tanto luchar por limpiar la pantalla, lo único que he podido borrar son mis malos pensamientos, y mi cerebro parece que va a
implosionar.

     ...Gracias de antemano.
   
                       V-.  :-(   8-[


23-Aug-2012 16:52
teresa yaneth campos perez

pues yo e leido algo de poner System("clrs"); creo dtodosmodos cheka  por ejemplo si es repetitvo el programa  lo pones al inicio al volver a repetirlo este te borra de la pantalla lo q tenias  espero y t sirva voi de prisa n.n


23-Aug-2012 20:51
Pablo Rampa

Gracias por tu respuesta Teresa Yaneth. Pero el ejercicio se tiene
que realizar escribiendo 25 líneas vacías. No se puede usar la
orden que me recomiendas.
Nuevamente, gracias por tu atención.


23-Aug-2012 22:12
Antonio Rodriguez

O tú te complicas demasiado o yo simplifico demasiado xD

Crear una función que borre la pantalla dibujando 25 líneas en blanco. No debe devolver ningún valor.

Yo he interpretado que hay que hacer una función que dibuje 25 líneas en blanco, con lo que la pantalla corre hacia arriba y se "borra"


24-Aug-2012 04:18
Pablo Rampa

Gracias Antonio por acudir con tu respuesta.  

Obviamente por ser el primer ejercicio del tema debe ser
sencilla la solución, pero no creo que sea como dices.
Es que no me ubico, no entiendo qué es lo que Nacho pretende
con este ejercicio.  Cuando se ignora o no se entiende
algo puede suceder una de dos situaciones:
 Lo que es tan sencillo para los demás te parece difícil, casi
imposible de resolver; o
 Te parecen triviales los problemas que un experto declararía  
como barreras de la ciencia.

Ojalá que sea más sencillo de lo que me parece. Aunque sería
interesante realizar una función en forma sencilla al estilo
de C que borre efectivamente la pantalla (quizás mi ignorancia
me permite pensar que se puede realizar).

Yo lo entiendo así:

1.- Tenemos escrito algo en la pantalla (o está llena).
2.- Movemos el cursor al inicio de la pantalla (como con una
   tecla de desplazamiento del cursor; emulando esa función.
   O como con "fseek").
3.- Con "printf" escribimos 25 líneas vacías, sobreescribiendo
   lo que había en la pantalla.
4.- Definitivamente no se puede usar "clrscr", system("cls"),...
   porque en el enunciado dice claramente que se dibujen 25
   líneas en blanco; haciéndolo "a pie".
Si tienes otra idea te agradecería mucho que me la comunicaras,
ya que me preocupa más no poder realizar un ejercicio sencillo
que uno más complejo.
  Un saludo cordial, Antonio.


24-Aug-2012 05:43
Antonio Rodriguez

Lo de volver atrás en la pantalla para sobrescribir lo que haya escrito en ella no creo que sea posible. La solución o bien es una orden como la que ha dicho Teresa (cosa que no creo, ya que no hemos visto ninguna orden similar) o bien algo más sencillo, como lo que yo propongo.
Por si te sirve de algo, adjunto el fuente según he entendido yo el ejercicio:

/*Ejercicio 7.1
Crear una función que borre la pantalla dibujando 25 lineas en blanco. No debe
devolver ningún valor*/

#include <stdio.h>
int i;

lineas() {
for (i=0; i<25; i++) printf("\n");
}

main(){
printf("Ahi van 25 lineas en blanco\n");
lineas();
}

/*devuelve 25, veremos como se hace para que no devuelva ningún valor en el
ejercicio 7.7, que es el mismo*/


Comento al final del fuente que devuelve el valor 25, y que el enunciado del ejercicio 7 es exactamente igual a éste, pero en ese momento ya sabemos cómo evitar que la función devuelva valor alguno:

/*Ejercicio 7.7
Crear una función que borre la pantalla dibujando 25 lineas en blanco. No debe
devolver ningún valor*/

#include <stdio.h>
int i;

lineas() {
for (i=0; i<25; i++) printf("\n");
}

main(){
printf("Ahi van 25 lineas en blanco\n");
lineas();
return 0;
}



Esta es mi interpretación del ejercicio, a ver si Nacho puede aclararnos este punto.

Un saludo!


24-Aug-2012 14:35
Nacho Cabanes (+32)

Efectivamente, es como dice Antonio, con algunos pequeños matices:

1.- Ya que no devuelve nada, debería empezar por "void".

2.- Precisamente por eso, este ejercicio no debería estar en el apartado 7.4, sino (sólo) en el 7.5. Lo corrijo para la revisión del curso que estoy a punto de lanzar.

3.- El nombre de la función debe ser más claro. Típicamente, las funciones "void" serán acciones, así que lo habituales es que comiencen con un verbo: "escribirLineas" o mejor "borrarPantalla"

4.- Como verás en el siguiente apartado (7.6), la variable "i" es mejor que sea local, ya que no es necesario compartir nada con ella.

5.- Antonio: como es posible que añada más ejercicios, te recomendaría que lo tomes como ejercicio "7.5a", no como "el séptimo ejercicio del tema 7", porque quizá pronto haya más ejercicios intermedios.  ;-)

Mi versión se parecería bastante a lo que ha propuesto Antonio:

#include <stdio.h>

void borrarPantalla() {
 int i;
 for (i=0; i<25; i++) printf("\n");
}

int main(){
 borrarPantalla();
 printf("Acabo de borrar la pantalla...");
 return 0;
}


24-Aug-2012 15:04
Pablo Rampa

Gracias a Antonio y al Profesor Nacho por tan esclarecedora
respuesta. Tan sencilla y tan detallada que hasta yo la entendí.
Me faltó razonamiento para deducir que siendo el primer ejercicio
del capítulo no podía pedirse que se emulara una función (me
imagino tan compleja) como "clearscreen" o como se le llame de
acuerdo al sistema usado. Pero es que a veces parece así:
que con lo estudiado no basta para realizar ciertos ejercicios.
Por otro lado, me pareció que no tenía chiste saltarse 25 líneas
para que pareciera que se había borrado la pantalla y, para colmo
de males, quedarnos al final de la misma, sin poder mover el cursor al inicio para poder usar la pantalla que recién habíamos
limpiado.

Gracias a ambos de nuevo. Con personas como ustedes el mundo
podría mejorar.


24-Aug-2012 17:09
Nacho Cabanes (+32)

Tienes razón, Pablo, pero ANSI C es así. Si orientas tu programa a un compilador (y sistema operativo) concreto, podrás borrar la pantalla, escribir en ciertas coordeandas, usar colores...

Mira el apartado 10.3 para Turbo C / Turbo C++ / Borland C++ y el apartado 10.4 para GCC (que es el habitual en Linux y el que incluye DevC++)

Pero claro, lo que hagas con estas "mejoras" ya no compilará en otros sistemas.


28-Aug-2012 16:59
Nacho Cabanes (+32)

Por cierto, en este hilo no había comentado la respuesta de Teresa Yaneth:

Efectivamente, en C existe la posibilidad de invocar a órdenes del sistema usando "system".

Por tanto, en Windows y Dos se podría borrar la pantalla haciendo

system("cls");

y en Unix (Linux, BSD, Solaris, Aix, etc) usando

system("clear");

pero tiene varios inconvenientes. El primero y más evidente es que no es estándar: el programa funcionará correctamente en unos entornos pero no en otros. Un programa para Linux no funcionará en Windows y viceversa. El segundo es que en algunos casos puede ni siquiera funcionar: quizá no podamos lanzar órdenes del sistema, ya sea por permisos, o por tener poca memoria libre disponible; también podemos haber tecleado la orden incorrectamente -el compilador no avisará en un error como ese-, etc.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)