elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 ... 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [43] 44 45
421  Programación / Programación General / Re: Curso de Delphi en: 12 Octubre 2010, 12:56 pm
Capítulo 6. Bucles.

Los bucles son un conjunto de instrucciones que se repiten una serie determinada de veces hasta que la condición deje de cumplirse. Son extremadamente útiles e imprescindibles en la programación.

En delphi tenemos 3 tipos de bucles:

  • Bucles For. Repiten una acción un número determinado de veces, pueden ser bucles ascendentes o descendentes.
  • Bucles While (mientras). Repiten una serie de instrucciones hasta que la condición se cumpla.
  • Bucles Repeat..Until. Es parecido al bucle while pero la condición se realiza al final de cada instancia del bucle.

Bucles For.
En este tipo de bucles necesitaremos una variable que actuará como contador, generalmente será de tipo integer aunque también podría ser de tipo char.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9. Contador: integer;
  10. begin
  11.  for Contador := 0 to 10 do
  12.    Writeln('El contador vale: ', Contador);
  13.  
  14.  Readln;
  15. end.
  16.  

El bucle for vendría a significar algo como "desde 0 hasta 10 hacemos esto...". En cada instancia del bucle, el valor de Contador se incrementa en 1. Como ocurre con los condicionales, si dentro del bucle no ponemos begin y end;, el bucle sólo ejecuta una línea de código.

Para hacer un bucle for descendente, hay que utilizar downto y cambiar el valor de inicio y el valor final del bucle.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9. Contador: integer;
  10. begin
  11.  for Contador := 10 downto 1 do
  12.    begin
  13.      Writeln('El contador vale: ', Contador);
  14.      Writeln('Restamos 1..');
  15.    end;
  16.  
  17.  Readln;
  18. end.
  19.  

Conseguiríamos algo como esto:



Bucles While

Los bucles while se basan en una condición al principio del bucle que se llama a cada nueva instancia del bucle. Veamos un ejemplo:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. var
  9. i: integer = 1; //Las variables se pueden inicializar de esta forma...
  10. begin
  11.  
  12. while i <= 10 do
  13.  begin
  14.    Writeln('Esta es la instancia numero: ', i);
  15.    Inc(i);
  16.  end;
  17.  
  18. Readln;
  19. end.
  20.  

El significado del bucle while sería "mientras i sea menor o igual que 10 hacemos esto...". En este bucle, si utilizamos un contador de tipo entero, tenemos que incrementar su valor en cada instancia del bucle, si no tendríamos un bucle infinito. El procedimiento Inc incrementa en 1 el valor de la variable que se le pase como parámetro, el procedimiento contrario es Dec.

Bucles Repeat...Until.

Se traduce como repetir..hasta. Funciona de la misma manera que el bucle while, pero la condición se realiza al final del bucle.
Veamos como funciona con un ejemplo:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. var
  9. i: integer = 1; //Las variables se pueden inicializar de esta forma...
  10. begin
  11.  
  12. repeat
  13.    Writeln('Esta es la instancia numero: ', i);
  14.    Inc(i);
  15. until I > 10;
  16.  
  17. Readln;
  18. end.
  19.  

La traducción sería: "repetir hasta que i sea mayor que 10". En el bucle repeat..until no se emplea begin y end; para escribir varias líneas, de hecho, no hace falta.

La utilidad de los bucles while y repeat..until es que se puede utilizar como condición cualquier variable o condición. Por ejemplo:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. var
  9. Salida: string;
  10. begin
  11.  
  12. repeat
  13.    Write('Introduce "salir": ');
  14.    Readln(Salida);
  15. until Salida = 'salir';
  16.  
  17. Readln;
  18. end.
  19.  

En este ejemplo, utilizamos como condición de salida una variable de tipo string. La ejecución del bucle no termina hasta que ingresemos por el teclado la palabra "salir".

Interrumpir un bucle

Para trabajar con bucles tenemos 2 métodos bastante útiles: el método Break y el método Continue. El método break interrumpe un bucle y sale de él.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. var
  9. i: integer;
  10. begin
  11.  
  12. for i := 0 to 10 do
  13.    begin
  14.      Writeln('I vale: ', i);
  15.      if I = 7 then
  16.        break;
  17.    end;
  18.  
  19. Readln;
  20. end.
  21.  

En este ejemplo, se tendría que escribir en la consola 11 veces el mensaje "I vale: x". Pero dentro del bucle puse una condición de que si I vale 7, salga del bucle.

Continue sirve para saltarnos una instancia del bucle, pero no sale de él. Ejemplo:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. var
  9. i: integer;
  10. begin
  11.  
  12. for i := 0 to 10 do
  13.    begin
  14.      if I = 5 then
  15.        Continue; //No ejecuta el Writeln
  16.      Writeln('I vale: ', i);
  17.    end;
  18.  
  19. Readln;
  20. end.
  21.  

Si ejecutamos el programa, podemos observar que no escribe en la consola "I vale: 5" porque esa instancia se la salta.

422  Programación / Programación General / Re: Curso de Delphi en: 12 Octubre 2010, 00:08 am
Capítulo 5. Condicionales y saltos.

Mediante las condiciones podemos prever errores y controlar diferentes formas de hacer una cosa. Ejemplo: Si pi es igual a 3.14... entonces hacemos esto, si es falso, hacemos esto otro.
Básicamente esa es la estructura de las condiciones, sólo que hay que emplear terminología inglesa y adaptarlo a la estructura semántica y sintáctica de Delphi. Para crear una condición hay que emplear If Then, con una condición en medio:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Verdad: boolean;
  10. begin
  11.  Verdad:= True;
  12.  if Verdad = True then
  13.    Writeln('Es verdad');
  14.  Readln;
  15. end.
  16.  

Esta es una condición de una sola línea, si la condición se cumple, se ejecutaría el Writeln y luego seguiría con la ejecución del programa que en este caso sería hacer un Readln. Ahora vamos a ver la estructura para hacer algo en caso contrario:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Verdad: boolean;
  10. begin
  11.  Verdad:= False;
  12.  if Verdad = True then
  13.    Writeln('Es verdad') //En las condiciones de una sola linea con else no se pone ;
  14.    else Writeln('No es verdad');
  15.  Readln;
  16. end.
  17.  

Mediante el else podemos hacer algo en caso de que la condición no se cumpla, pero tan sólo ejecuta una línea de código. Para ejecutar varias líneas de código en un condicional tenemos que crear un begin y un end; dentro de la condición.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Numero: integer;
  10. begin
  11.  Numero:= 14;
  12.  if Numero < 10 then
  13.    begin
  14.      Writeln('El numero es menor de 10');
  15.      Writeln('...');
  16.    end else
  17.      begin
  18.        Writeln('El numero es mayor o igual que 10');
  19.        Writeln('...............');
  20.      end;
  21.  Readln;
  22. end.
  23.  

Aquí se utiliza end; para cerrar el condicional, end. solo se usa para terminar el programa.

Otro método de salto, son las estructuras case. Con ellas podemos hacer muchas comparaciones en pocas líneas.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Numero: integer;
  10. begin
  11.  Write('Introduce un numero: ');
  12.  Readln(Numero);
  13.  
  14.  case Numero of
  15.    1: Writeln('Es el numero 1');
  16.    2: Writeln('.... el 2');
  17.    3: Writeln('.... el 3');
  18.    else Writeln('Otro numero...');
  19.  end;
  20.  Readln;
  21. end.
  22.  

El programa hace lo siguiente: Pide un que se introduzca un número, luego mediante el case of ejecuta una acción u otra. Después de cada opción se ponen 2 puntos y a continuación la línea que vas a ejecutar, si quieres escribir varias líneas por opción introduces un begin y un end; en cada una de ellas. El else es la opción por defecto, en el caso de que no coincida con ninguna de las que tenemos programadas; también puede contener varias líneas.




Otro tipo de salto es usando etiquetas y el goto. Es poco recomendable utilizarlas ya que no entran dentro de la programación estructurada y pueden provocar bucles infinitos, así que no los vamos a ver.


Calculadora versión 1.0

Vamos a hacer una pequeña calculadora en modo consola, con un menú y una serie de opciones para sumar, restar, multiplicar y dividir.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Opcion: integer;
  10. begin
  11.  Writeln('Calculadora version 1.0');
  12.  Writeln('1 - Sumar dos numeros');
  13.  Writeln('2 - Restar dos numeros');
  14.  Writeln('3 - Multiplicar dos numeros');
  15.  Writeln('4 - Dividir dos numeros');
  16.  Writeln(''); //Lo dejamos en blanco para dejar una separación
  17.  Write('Introduce una opcion: ');
  18.  
  19.  Readln;
  20. end.
  21.  

Empezamos haciendo un menú bastante sencillo, el programa según la opción que escojamos va a hacer una operación u otra.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Opcion: integer;
  10. begin
  11.  Writeln('Calculadora version 1.0');
  12.  Writeln('1 - Sumar dos numeros');
  13.  Writeln('2 - Restar dos numeros');
  14.  Writeln('3 - Multiplicar dos numeros');
  15.  Writeln('4 - Dividir dos numeros');
  16.  Writeln(''); //Lo dejamos en blanco para dejar una separación
  17.  
  18.  Write('Introduce una opcion: ');
  19.  Readln(Opcion);
  20.  
  21.  case Opcion of
  22.    1: begin
  23.  
  24.       end;
  25.    2: begin
  26.  
  27.       end;
  28.    3: begin
  29.  
  30.       end;
  31.    4: begin
  32.  
  33.       end;
  34.    else Writeln('Introduce una opción entre 1 y 4');
  35.  end;
  36.  
  37.  Readln;
  38. end.
  39.  

Creamos un case of para el menú y preparamos las posibles opciones para permitir varias líneas. Además ya puse la opción por defecto en caso de que no se introduzca una opción válida. Ahora tenemos que pedir 2 números, hacer las operaciones y mostrar el resultado por pantalla. Tenemos un problema con la última operación, que hay que comprobar: la división entre cero, que solucionaremos con un condicional:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Opcion: integer;
  10.  Numero1, Numero2: integer;
  11. begin
  12.  //Creamos el menu de nuestro programa...
  13.  Writeln('Calculadora version 1.0');
  14.  Writeln('1 - Sumar dos numeros');
  15.  Writeln('2 - Restar dos numeros');
  16.  Writeln('3 - Multiplicar dos numeros');
  17.  Writeln('4 - Dividir dos numeros');
  18.  Writeln(''); //Lo dejamos en blanco para dejar una separación
  19.  
  20.  //Pedimos un numero por teclado
  21.  Write('Introduce una opcion: ');
  22.  Readln(Opcion);
  23.  
  24.  //Dependiendo de la opcion...
  25.  case Opcion of
  26.    1: begin
  27.        //Suma
  28.        Write('Introduce un numero: ');
  29.        Readln(Numero1);
  30.        Write('Introduce otro numero: ');
  31.        Readln(Numero2);
  32.        Writeln('El resultado de ' + IntToStr(Numero1)
  33.          + ' + ' + IntToStr(Numero2) + ' = ' + IntToStr(Numero1 + Numero2));
  34.       end;
  35.    2: begin
  36.        //Resta
  37.        Write('Introduce un numero: ');
  38.        Readln(Numero1);
  39.        Write('Introduce otro numero: ');
  40.        Readln(Numero2);
  41.        Writeln('El resultado de ' + IntToStr(Numero1)
  42.          + ' - ' + IntToStr(Numero2) + ' = ' + IntToStr(Numero1 - Numero2));
  43.       end;
  44.    3: begin
  45.        //Multiplicacion
  46.        Write('Introduce un numero: ');
  47.        Readln(Numero1);
  48.        Write('Introduce otro numero: ');
  49.        Readln(Numero2);
  50.        Writeln('El resultado de ' + IntToStr(Numero1)
  51.          + ' * ' + IntToStr(Numero2) + ' = ' + IntToStr(Numero1 * Numero2));
  52.       end;
  53.    4: begin
  54.        //Division
  55.        Write('Introduce un numero: ');
  56.        Readln(Numero1);
  57.        Write('Introduce otro numero: ');
  58.        Readln(Numero2);
  59.        if Numero2 <> 0 then
  60.          Writeln('El resultado de ' + IntToStr(Numero1)
  61.            + ' / ' + IntToStr(Numero2) + ' = ' + IntToStr(Numero1 div Numero2)) //División entera
  62.        else Writeln('El divisor no puede ser 0 :(');
  63.       end;
  64.    else Writeln('Introduce una opción entre 1 y 4'); //Error
  65.  end;
  66.  
  67.  Readln;
  68. end.
  69.  

Tendríamos algo como esto:




Para mostrar el resultado de una operación utilizamos Writeln y concatenamos la cadena de salida con el operador +. Como puedes observar, en la opción de suma aparece también el operador + para sumar dos números enteros. En la opción 4 comprobamos que el segundo número no es 0, si no es así mostramos un mensaje de error (cuidado con el punto y coma al final de la línea del condicional, este es el único caso en el que no se necesita).

Esta "calculadora" se puede mejorar mucho, planteé el programa de esta forma para repasar los condicionales y saltos.
423  Programación / Programación General / Re: ¿perl o python? en: 11 Octubre 2010, 15:04 pm
C/C++ se van a quedar para siempre, la razón: los Sistemas Operativos. Linux, Windows y Mac están programados en C y ASM; es imposible que alguien los porte a un lenguaje nuevo, por lo tanto C va a seguir existiendo mientras estos Sistemas Operativos sigan presentes.

Yo te recomiendo que empieces por C, los lenguajes interpretados no me acaban de convencer.

Saludos.
424  Programación / Programación General / Re: Duda de novato en Free pascal en: 11 Octubre 2010, 01:16 am
La verdad me extraña que sea un problema de Lazarus, a lo mejor puede ser debido a tu Sistema Operativo, y que no tenga instaladas todas las fuentes del sistema.

No tengo Lazarus instalado para probarlo, pero traduje el código a C y funciona perfectamente.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5. #include <windows.h>
  6.  
  7. void WriteLnOem(char* Line)
  8. {
  9. char* szBuff;
  10.  
  11.    szBuff = (char*) malloc(strlen(Line) + 1);
  12.    if (szBuff != NULL){
  13.        CharToOemBuffA(Line, szBuff, strlen(Line));
  14.        szBuff[strlen(Line)] = 0;
  15.        puts(szBuff);
  16.        free(szBuff);
  17.    }    
  18. }
  19.  
  20.  
  21. int main()
  22. {
  23.    WriteLnOem("Ejemplo de cadena: ñ, á, í, ó, é");
  24.    WriteLnOem("...");
  25.    system("pause>null");
  26. return 1;
  27. }
  28.  


Saludos.
425  Programación / Programación General / Re: [Book] Microsoft Windows Internals, Fifth Edition en: 10 Octubre 2010, 14:35 pm
Muy bueno, gracias.

Saludos.
426  Programación / Programación General / Re: ¿Que tipo de lenguaje me recomendais? en: 9 Octubre 2010, 21:48 pm
La mejor enseñanza es la autodidacta y es gratis! Yo te recomiendo Delphi, es un lenguaje de alto nivel y que está pensado para aprender a programar, pero no por ello deja de tener la potencia de C/C++.

Aquí tienes un curso de Delphi, que estoy escribiendo:
http://foro.elhacker.net/programacion_general/curso_de_delphi-t306981.0.html

Además, en Delphi es mucho más sencillo crear aplicaciones visuales y más divertido, sin pérdida de velocidad de ejecución y sin dependencias externas como FrameWorks, librerías u OCX.

Todo lo bueno tiene algo malo, y es que Delphi no es gratis aunque existe la versión libre: Lazarus, pero que todavía no acaba de conseguir igualar a Delphi, pero de todas formas para aprender también te sirve.

Saludos.
427  Programación / Programación General / Re: ayuda en Programacion de colas en netbeans 6.7 en: 9 Octubre 2010, 00:57 am
¿Por qué nadie se lee las normas? Además, con esa forma de redactar mensajes espantas a cualquiera, yo ni me leí tu post...
428  Programación / Programación General / Re: Curso de Delphi en: 8 Octubre 2010, 23:36 pm
Capítulo 4. Operadores.

Los operadores nos proporcionan la base matemática y lógica en la programación. En el capítulo anterior ya vimos un operador, el operador de asignación :=.

Operadores aritméticos.

+ Suma.
- Resta.
* Multiplicación.
/ División real.
div División entera (sólo entre números enteros).
mod Resto división.

Un ejemplo:

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  numero1, numero2, suma: integer;
  10. begin
  11.  numero1:= 3;
  12.  numero2:= 4;
  13.  
  14.  suma:= numero1 + numero2;
  15. end.
  16.  

Si quieres declarar varias variables del mismo tipo, puedes hacerlo en la misma línea mediante una , como se muestra en el ejemplo.

Operadores relacionales.

Se emplean en las condiciones (las veremos en el próximo capítulo) y son los siguientes:

< Menor que.
> Mayor que.
= Igual que.
<> Distinto.
<= Menor o igual que.
>= Mayor o igual que.

Operadores lógicos.

And Conjunción lógica.
Or Disyunción inclusiva lógica.
Xor Disyunción exclusiva.
Not Negación lógica.
Shr Desplazamiento de bits a la derecha.
Shl Desplazamiento de bits a la izquierda.

Una vez visto esto, vamos a aprender como leer la entrada del teclado en Delphi. El procedimiento ya lo conoces: Readln();

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Cadena: string;
  10. begin
  11.  Write('Introduce algo: ');
  12.  Readln(cadena);
  13.  Writeln('Esta es la cadena que introduciste: ' + cadena);
  14.  Readln;
  15. end.
  16.  

El procedimiento Write es idéntico al WriteLn, sólo que este último hace un salto de línea en la consola. Para leer la entrada de datos mediante el teclado, tenemos que pasarle como parámetro al procedimiento Readln la variable en la que se guardará la información de entrada. A continuación mostramos el contenido de la variable Cadena. El operador + funciona como el operador aritmético de la suma y para concatenar cadenas.

Introducimos la cadena "hola" y pulsamos Enter. Tendríamos algo como esto:



Si queremos leer del teclado un número entero,  a Readln le tenemos que pasar como parámetro una variable de tipo integer. Con unas líneas de código podemos hacer que nos pida 2 números, los sume y nos muestre su resultado.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Numero1, Numero2: integer;
  10. begin
  11.  Write('Introduce un numero: ');
  12.  Readln(Numero1);
  13.  Write('Introduce otro numero: ');
  14.  Readln(Numero2);
  15.  Writeln('La suma de los dos numeros es: ', Numero1 + Numero2);
  16.  Readln;
  17. end.
  18.  



En el último Writeln, NO podemos hacer esto:

Código
  1.  Writeln('La suma de los dos numeros es: ' + (Numero1 + Numero2));
  2.  

Esto provocaría una excepción, porque no se puede concatenar una cadena de texto con un número entero de esta forma. Poniendo la coma y a continuación el número entero, el procedimiento Writeln se encarga él solo de convertir ese número a cadena de caracteres para que se pueda mostrar por pantalla.

Para convertir un número entero a string, disponemos de la función IntToStr (Integer To String) que está declarada en la unidad SysUtils. A esta función sólo se le puede pasar como parámetro un número entero y devuelve el número en forma de cadena de caracteres.

Código
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils;
  7.  
  8. var
  9.  Numero1, Numero2: integer;
  10. begin
  11.  Write('Introduce un numero: ');
  12.  Readln(Numero1);
  13.  Write('Introduce otro numero: ');
  14.  Readln(Numero2);
  15.  Writeln('La suma de los dos numeros es: ' +  IntToStr(Numero1 + Numero2));
  16.  Readln;
  17. end.
  18.  

Este ejemplo realiza lo mismo que el anterior, pero emplea la función IntToStr para convertir la suma de esos dos números enteros en una cadena de caracteres, que se concatena con "La suma de los dos numeros es: ". Hay más funciones de conversión de datos que ya iremos viendo, por ejemplo: StrToInt hace lo contrario; otras funciones podrían ser: FloatToStr, StrToFloat, TryStrToInt, TryStrToFloat, etc...

Consejo: Si alguna vez desconoces donde está declarada una variable, constante, función, etc... pinchas sobre ella y le das al botón derecho y a Find Declaration. Inmediatamente te llevará a la unidad donde está declarda, y en ocasiones hay comentarios explicando lo que hace y porqué.

429  Programación / Programación General / Re: [Delphi] Source Utils GetPCDir en: 8 Octubre 2010, 21:20 pm
Buen aporte VillanoSam, tal vez te interese la función de la API de Windows SHGetFolderPath, con ella puedes obtener muchas más carpetas especiales del sistema.

Saludos.
430  Programación / Programación C/C++ / Re: ayudenme en estos problemas ^^ en: 8 Octubre 2010, 19:31 pm
Citar
he intentado pero no he llegado a resolverlos y bueno tengo práctica la prox semana y me gustaría si pudieran hacerlos.

Hay que echarle morro, con dos cojones...
Páginas: 1 ... 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [43] 44 45
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines