Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: el_lujo en 5 Septiembre 2014, 20:23 pm



Título: Comando personalizado que limpie pantalla
Publicado por: el_lujo en 5 Septiembre 2014, 20:23 pm
Saludos.
Estoy comenzando a estudiar programación.
Tengo la siguiente tarea:
Debo hacer una aplicacion en c++ que limpie la pantalla.
Requisitos:
-Que el comando que limpie la pantalla sea "limpiar".
-Que sin importar que se escriba mayuscula o minúscula haga la función sin reventarse.

Honestamente no se nada y el profesor lo que quiere es que investiguemos; se vale buscar ayuda porque en el curso se discutirá. Lo que no puedo es llegar sin el resultado.

Gracias de antemano.

Nota: Admito que según el reglamento no se hacen tareas. Solo  estoy interesado en la ayuda de cómo debo interpretar usar una palabra como comando.

Gracias de nuevo.


Título: Re: Comando personalizado que limpie pantalla
Publicado por: ivancea96 en 5 Septiembre 2014, 20:42 pm
Supongo que system("cls"); o system("clear"); no vale, no?

Puedes escribir 100 saltos de linea, o invocar a la Api del SO para limpiar la consola.


Título: Re: Comando personalizado que limpie pantalla
Publicado por: el_lujo en 5 Septiembre 2014, 20:51 pm
Gracias por responder.

No vale de esa manera. Así se lo expusieron algunos de los compañeros.

En realidad, lo que tenemos que aprender es a crear una instrucción que haga lo mismo que system("cls") sin importar las mayusculas o minusculas.



 Bueno.
Debo esforzarme.
Reduciré la situación con lo siguiente:
Cómo controlo que lo que yo digite en mayusculas se convierta en minusculas?


Título: Re: Comando personalizado que limpie pantalla
Publicado por: rir3760 en 5 Septiembre 2014, 21:03 pm
Estoy comenzando a estudiar programación.
Tengo la siguiente tarea:
Debo hacer una aplicacion en c++ que limpie la pantalla.
Requisitos:
-Que el comando que limpie la pantalla sea "limpiar".
-Que sin importar que se escriba mayuscula o minúscula haga la función sin reventarse.
Te piden que desarrolles un programa que acepte un argumento mediante la linea de comandos, verifique que sea igual a "limpiar", "LIMPIAR", "Limpiar", etc. (no hay distinción entre mayúsculas y minúsculas) y finalmente realice la operación indicada (limpiar la pantalla).

Para el primer paso utiliza el motor de búsqueda para revisar los temas relacionados con el paso de argumentos mediante la linea de comandos.

Para el segundo de nuevo utiliza el motor de búsqueda pero ahora para encontrar temas relacionados con las funciones tolower y toupper.

El ultimo paso no se debería realizar ya que si apenas empiezas deberías estar enfocado en la base (C++ estándar) y no en como realizar una operación especifica del SO (coméntale eso en buen plan a tu profesor).

Un saludo


Título: Re: Comando personalizado que limpie pantalla
Publicado por: ivancea96 en 5 Septiembre 2014, 21:26 pm
http://support.microsoft.com/kb/99261/es (http://support.microsoft.com/kb/99261/es)

Ahí te da una explicación de como hacerlo (Windows).

Si quieres hacerla más corta, puedes escribir 100 lineas en blanco, y luego colocar el cursor en el 0,0 (en el link, en el último código, abajo, aparece cómo hacerlo).


Acerca de lo de escribir en minúsculas... Modificarlo al tiempo en que lo escribes?


Título: Re: Comando personalizado que limpie pantalla
Publicado por: el_lujo en 10 Septiembre 2014, 04:38 am
Saludos, amigos.

Fuente de lo que el profesor nos puso:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>


void Mayusc_Minusc(char *s) //convertir de Mayuscula a minuscula
{
   for( ; *s != '\0' ; s++)
   {
      if(*s >= 'A' && *s <= 'Z'){
         *s += (char)32;
      }
      
   }
}




int main(){
   char limpiar[20] = "limpiar", cerrar[15] = "salir", limpiarLinux[15] = "clear", limpiarWind[15] = "cls", ayuda[15] = "help",cadena[20],dirwindow[15]="dir",lslinux[15]="ls",dirdominica[15]="directorio";
   printf("\t\t***************************************************\n");
   printf("\t\t\t Programa Limpiar Pantalla \n \t\t\tPara Cerrar Escribir (salir)\n");
   printf("\t\t***************************************************\n\n");
   
   do{
      printf(">> ");
      gets(cadena);
   (   Mayusc_Minusc(cadena);)*/
      if(strcmp(cadena,limpiar) == 0 || strcmp(cadena,limpiarLinux) == 0 || strcmp(cadena,limpiarWind) == 0){
         system("cls");
         printf("\t\t************************************************\n");
         printf("\t\t\t Pantalla(Ms-DOS)(Terminal)(Domincana)\n");
         printf("\t\t************************************************\n\n");      
      }else if(strcmp(cadena,ayuda) == 0){
         system("cls");
         printf("\t\t********************************************\n");
         printf("\t\t Comandos Del Sistema: \n");
         printf("\t\t (limpiar)(clear)(cls) <--> Comando para limpiar\n");
         printf("\t\t (salir) <--> Comando para salir\n");
         printf("\t\t (help) -- Comando para ayuda\n");
         printf("\t\t (dir)(ls)(directorio) <----> Comando para directorio\n");
         printf("\t\t********************************************\n\n");
      }else if(strcmp(cadena,dirwindow) == 0 || strcmp(cadena,lslinux) == 0 || strcmp(cadena,dirdominica)){
         printf("\t\t********************************************\n");
         printf("\t\t\t Lista de Archivos en El Directorio\n");
         printf("\t\t********************************************\n");
         system("dir");
      }else{
         printf("\t!!! ERROR Comando no Validos.. Entrasr a (help) para ayuda\n");
      }
      
      
   }while(strcmp(cadena,cerrar) != 0);
   
   
}

Ahora bien, lo que él pide es controlar los espacios en blanco accidentales que cuando se digite cualquier opción en el programa.

Estuve googleando y no pude encontrar ayuda o simplemente no estoy haciendo la pregunta correcta.

Gracias.


Título: Re: Comando personalizado que limpie pantalla
Publicado por: Caster en 10 Septiembre 2014, 10:24 am
Y digo yo, ¿no se puede hacer que cuando introduzca la orden se ejecute system("cls") o system("clear"), según corresponda?

Un saludo


Título: Re: Comando personalizado que limpie pantalla
Publicado por: el_lujo en 10 Septiembre 2014, 16:20 pm
Gracias, Caster por el interés en ayudarme.
Lo que sucede, Caster, es que estamos en tratar de entender cómo funcionan los sistemas operativos.  Eso es sólo para darnos a entender el por qué no debemos usar el comando interno del lenguaje, sino hacer una aplicación que simule los comando internos del lenguaje.

Adjunté el fuente del programa que fue hecho por el profesor en el aula; el reto es ahora que cuando elijamos una de las opciones dentro de la corrida del programa, ignore los espacios en banco.

Ejemplo: Si elegimos "cls" y por error digitamos: "  cls" o "cls    " en el prompt, haya una función que ignore esos espacios en blanco, siempre y cuando lo digitado corresponda a una de las opciones.

Espero haber sido explícito.

Gracias.


Título: Re: Comando personalizado que limpie pantalla
Publicado por: Caster en 10 Septiembre 2014, 16:44 pm
Pues si no me equivoco, el código que has aportado hace lo que he dicho, ejecuta el comando del SO y no hace nada más.

Un saludo


Título: Re: Comando personalizado que limpie pantalla
Publicado por: eferion en 10 Septiembre 2014, 17:13 pm
Pues si no me equivoco, el código que has aportado hace lo que he dicho, ejecuta el comando del SO y no hace nada más.

Un saludo

doy fe de ello:

Código
  1. if(strcmp(cadena,limpiar) == 0 || strcmp(cadena,limpiarLinux) == 0 || strcmp(cadena,limpiarWind) == 0){
  2.  system("cls");
  3.  // ...
  4. }else if(strcmp(cadena,ayuda) == 0){
  5.  system("cls");
  6.  // ...
  7. }else if(strcmp(cadena,dirwindow) == 0 || strcmp(cadena,lslinux) == 0 || strcmp(cadena,dirdominica)){
  8.  // ...
  9.  system("dir");
  10. }else{
  11.  printf("\t!!! ERROR Comando no Validos.. Entrasr a (help) para ayuda\n");
  12. }


Título: Re: Comando personalizado que limpie pantalla
Publicado por: rir3760 en 10 Septiembre 2014, 17:59 pm
Adjunté el fuente del programa que fue hecho por el profesor en el aula; el reto es ahora que cuando elijamos una de las opciones dentro de la corrida del programa, ignore los espacios en banco.
No es mi intención desanimarte pero ese programa como C++ deja mucho que desear, de los problemas el mas importante es el uso de gets, mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

En cuanto a ignorar espacios antes y después de la palabra la forma mas fácil es sustituyendo la llamada a gets por scanf:
Código
  1. printf(">> ");
  2. scanf("%s", cadena);
Esto porque al utilizar "%s" con scanf se lee una palabra ignorando el espacio blanco (espacio, tabulador, etc.) al principio de la linea.

Sin embargo scanf con "%s" adolece del mismo problema que gets: el programa puede reventar si los caracteres leídos sobrepasan la capacidad del array, una forma mejor es bien utilizar "%Ns" donde N es el numero (menos uno) de caracteres que puede almacenar el array o bien utilizar fgets para leer una linea junto con sscanf para extraer la palabra.

Puedes revisar ejemplos de esas funciones mediante el motor de búsqueda de los foros.

----

Sin embargo lo políticamente correcto si quieres aprender C++ es utilizar su biblioteca estándar empezando con la clase string y los operadores ">>" y "<<".

Un saludo


Título: Re: Comando personalizado que limpie pantalla
Publicado por: el_lujo en 10 Septiembre 2014, 18:28 pm
Gracias, rir3760. Exactamente eso es lo que quería comprender.

Igualmente tomaré tiempo para lee el tema: |Lo que no hay que hacer en C/C++. Nivel basico|.

Mil gracias.