delphi 1

54
Delphi 7 Fermí Vilà 1 I .- Object Pascal: Principios Básicos Aunque el Delphi es un lenguaje de programación visual, es decir, programar en Delphi significa básicamente: insertar controles en un o más formularios y establecer sus propiedades. Más pronto o más tarde deberemos escribir código. En estos primeros capítulos nos dedicaremos al estudio del lenguaje que deberemos utilizar para escribir el código de nuestras aplicaciones Delphi. Este lenguaje se denomina Object Pascal, y no es más que el “Pascal” más avanzado que existe actualmente. Nuestro primer programa a) Ejecuta el Delphi - Una vez “cargado” el programa haz lo siguiente: Menú File New Other… Activa la “Pestaña: New” Selecciona “Console Application” - Modifica el contenido de la ventana que acaba de aparecer de forma que nos quede: program Project001; {$APPTYPE CONSOLE} uses SysUtils; begin writeln('Hola Mundo'); readln; end. - Graba el programa con el nombre Project001 en TuCarpeta, es decir: Menú File Save Project As … Sitúate en TuCarpeta En “File name” escribe: Project001.dpr [Save] - Ejecuta el programa, es decir: Menú Run Run O pulsa la tecla [F9]. Si todo funciona correctamente aparecerá una ventana “MS/DOS” que contiene el saludo: HOLA MUNDO. Pulsa la tecla [Return], para acabar la ejecución del programa.

Upload: josseph-humberto-mejia-otondo

Post on 13-Apr-2015

101 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Delphi 1

Delphi 7 Fermí Vilà 1

I .- Object Pascal: Principios Básicos

Aunque el Delphi es un lenguaje de programación visual, es decir, programar en Delphi significa básicamente: insertar controles en un o más formularios y establecer sus propiedades. Más pronto o más tarde deberemos escribir código. En estos primeros capítulos nos dedicaremos al estudio del lenguaje que deberemos utilizar para escribir el código de nuestras aplicaciones Delphi. Este lenguaje se denomina Object Pascal, y no es más que el “Pascal” más avanzado que existe actualmente.

Nuestro primer programaa) Ejecuta el Delphi- Una vez “cargado” el programa haz lo siguiente:

Menú FileNew

Other…Activa la “Pestaña: New”Selecciona “Console Application”

- Modifica el contenido de la ventana que acaba de aparecer de forma que nos quede:

program Project001;

{$APPTYPE CONSOLE}

uses SysUtils;

begin writeln('Hola Mundo'); readln;end.

- Graba el programa con el nombre Project001 en TuCarpeta, es decir:Menú File

Save Project As …• Sitúate en TuCarpeta• En “File name” escribe: Project001.dpr[Save]

- Ejecuta el programa, es decir:Menú Run

RunO pulsa la tecla [F9].

Si todo funciona correctamente aparecerá una ventana “MS/DOS” que contiene el saludo: HOLA MUNDO. Pulsa la tecla [Return], para acabar la ejecución del programa.

Page 2: Delphi 1

Delphi 7 Fermí Vilà 2

Acabamos de crear con el Delphi una aplicación tipo “cónsola”, que no es más que un programa MS/DOS, es decir “no Windows”. Procuraremos en los primeros capítulos proceder de esta forma para no perdernos en los elementos gráficos y visuales de las aplicaciones y podernos centrar en el estudio del código Object Pascal.

- Observemos nuestro primer programa:• program Project001;

El nombre del “program” necesariamente ha de ser el nombre del fichero.

• begin……end.Es la estructura básica de un programa: entre begin y end una serie más o menos larga de sentencias.

• writeln(‘HOLA MUNDO);Escribe en la pantalla MS/DOS la frase que tenemos entre comillas.

• readln;La ejecución del programa se inmoviliza hasta que pulsamos [Return].

• Observa el punto y coma al final de las sentencias

Entrada – Salidab) Menú File

NewOther …

Console Application

- Escribe:

program Project002;{$APPTYPE CONSOLE}uses SysUtils;

var tel:string[12]; pob:string[30];begin writeln('Escribe tu teléfono: '); readln(tel); write('Escribe tu población: '); readln(pob); write('Adiós, habitante de ',pob); readln;end.

Page 3: Delphi 1

Delphi 7 Fermí Vilà 3

- Grábalo en TuCarpeta, observa que necesáriamente con el nombre Project002

- Ejecútalo varias veces para observar detenidamente lo que sucede.

- Estudio del Project002• Al ejecutarse el programa en una ventana MS/DOS, algo pasa con los acentos, porque no

aparecen. Solucionaremos el problema próximamente.• var

tel: string[12];pob: string[30];Declaramos dos variables (var) tipo texto (string) de longitudes 12 y 30 caracteres ([12], [30]) de nombre tel y pob.Declarar una variable significa guardar una parte de la memoria (que llamamos tel), donde se situará un texto en nuestro caso (string) de una determinada longitud (12).

• readln(tel);La ejecución del programa se inmovilizará hasta que escribamos un teléfono (en este caso) y pulsemos [Return]Lo que escribamos se “guardará” en la variable tel

• Observa la diferencia entre writeln y write: cuando se acaba de ejecutar el procedimiento writeln, se inserta un salto de línea:

WRITELN = WRITE + LN (salto de línea)

Los acentos y otros caracteres especialesc) Menú File

NewOther …

Console Application

- Escribe (podrías aprovechar el programa anterior, porque es prácticamente el mismo, con muy pocos cambios):

program Project003;{$APPTYPE CONSOLE}uses SysUtils;

var tel:string[12]; pob:string[30];begin writeln('Escribe tu tel'+Chr(130)+'fono: '); readln(tel); write('Escribe tu poblaci'+Chr(162)+'n: '); readln(pob); write('Adi'+Chr(162)+'s, habitante de ',pob); readln;end.

- Grábalo como Project003 en TuCarpeta.

Page 4: Delphi 1

Delphi 7 Fermí Vilà 4

- Ejecútalo varias veces: si todo va bien debería funcionar exactamente igual que el programa anterior, con la única diferencia de que los acentos aparecen correctamente.

- Estudio del Project003El sistema operativo Windows utiliza el juego de caracteres ANSI, en cambio el MS/DOS utiliza el código ASCII.El hecho de utilizar un editor de windows, para escribir nuestros programas, como es en el Delphi, hace que los caracteres especiales: ñ, Ñ o las vocales acentuadas no se visualizan bien en la pantalla MS/DOS.Para solucionar el problema basta “insertar el código ASCII correspondiente”:

• La función Chr() nos da el carácter correspondiente a partir de su código ASCII.• Así:

Chr(160) = á Chr(163) = úChr(130) = é Chr(164) = ñChr(161) = í Chr(165) = ÑChr(162) = ó

Escritura de datos en pantallad) Menú File

NewOther…

Console Application

- Escribe:program Project004;{$APPTYPE CONSOLE}uses SysUtils;

const saludo='HOLA';var num:INTEGER;

begin WRITE(saludo,' ','que tal',' ','tio'); write('3',3,saludo,3*4); writeln(' ',3*10); num:=ROUND(5*PI); WRITELN(num); writeln; write('num=',num); writeln(' ',num DIV 2,' ',num/2); writeln; write(' FIN DEL PROGRAMA'); readln;end.

Page 5: Delphi 1

Delphi 7 Fermí Vilà 5

- Grábalo como Project004 en TuCarpeta y ejecútalo.- Estudio del Project004

• El “Object Pascal” no es “Case Sensitive”, es decir no distingue entre mayúsculas y minúsculas. Dicho de otro modo, es lo mismo WRITE que write, saludo que SALUDO o SaLuDO.

• La sintaxis completa de Write o Writeln es:WRITE (arg 1, arg 2, arg 3, …);

pudiendo ser sus argumentos:variables (como en el ejemplo: saludo)cadenas de texto (encerradas entre comillas simples)números (sin comillas)operaciones (3*4)

• num: integer;Declaramos una variable de nombre num y tipo integer (número entero entre

-2.147.483.648 y 2.147.483.647)• num:= Round(5*PI);

Asignamos (observa el operador de asignación “:=”) a la variable num el número 16.Ya que: Round(5*PI) = Round(5*3.141592…) = Round(15.7079…) = 16

• 16 DIV 2Nos da la división “entera” entre 16 y 2. Es decir, 8

• 16/2Nos da la división “real” entre 16 y 2, por esta razón aparece: 8.000000000000E+0000

• writelnDetermina una línea en blanco en la pantalla.

Formatos de impresión y ancho de campoe) Menú File

NewOther…

Console Application

- Escribe:program Project005;{$APPTYPE CONSOLE}uses SysUtils;

begin writeln(127:20); writeln(15:20); writeln(3573:20); writeln; writeln((127+15+3573):20); readln;end.

- Grábalo como Project005 y ejecútalo.

Page 6: Delphi 1

Delphi 7 Fermí Vilà 6

- Estudio del Project005El ancho de campo se define añadiendo un argumento separado por dos puntos del dato que se desea escribir:

writeln(136:5); aparecerá: __136writeln(‘pepe’:7); aparecerá: ___pepe

En el caso de números reales se usan dos argumentos: el primero determina el ancho total y el segundo es el número de decimales; el último decimal visible se presenta redondeado.Por ejemplo: x = 1234.2765

writeln(x); aparecerá: 1.2342765000E+03writeln(x:10:1); aparecerá: _____1234.3

Entrada de datosf) Menú File

NewOther

Console Application

- Escribe:

program Project006;{$APPTYPE CONSOLE}uses SysUtils;

var b,h,a:real;

begin write('Escribe la base y la altura del tri'+Chr(160)+'ngulo '); readln(b,h); a:=b*h/2; writeln('El '+Chr(160)+'rea del tri'+Chr(160)+'ngulo de base ',b:5:2,' y altura ',h:5:2,' es ',a:5:2); readln;end.

- Grábalo como Project006 y ejecútalo.

- Estudio del Project006:Los procedimientos que permiten la asignación de valores son: READ y READLNLa diferencia entre los dos es que READLN inserta un salto de línea después de su ejecución, mientras que el procedimiento READ no lo hace.Sintaxis: read(valor1, valor2, …);

readln(valor1, valor2, …);Ejemplo: read(x,y,z);

Deberíamos escribir 3 números separados por un espacio en blanco y pulsar [Return] por último.

Page 7: Delphi 1

Delphi 7 Fermí Vilà 7

- Menú File – New – Console Application

- Escribe:

program Project007;{$APPTYPE CONSOLE}uses SysUtils;

var sum1,sum2,tot:integer;begin write('Escribe un n'+Chr(163)+'mero entero: '); readln(sum1); writeln; write('Escribe otro n'+Chr(163)+'mero entero: '); readln(sum2); writeln; tot:=sum1+sum2; writeln('La suma de ',sum1,' y ',sum2,' es ',tot); readln;end.

- Grábalo como Project007 y ejecútalo.

Arrayg) Hemos utilizado hasta ahora diferentes tipos de datos:

string[20] texto con un máximo de 20 caracteresinteger enteroreal decimal

Veamos un nuevo tipo llamado array, llamado también vector, matriz o arreglo: se utiliza para guardar una serie de elementos todos ellos del mismo tipo.Ejemplo: x: array[1..200] of integer;“x” serviría para guardar 200 números enteros. Observa que hemos de indicar el índice superior e inferiorx[57]; sería la forma de referirnos al elemento de índice 57 del array “x”.Podemos trabajar con arrays de varias dimensiones, por ejemplo, para trabajar con una matriz matemática de orden 3x2 deberíamos definir:

A: array[1..3,1..2] of real;A[3,1] seria el elemento (3,1) de la matriz (fila 3, columna 1).

Vamos a hacer un programa que calcule la media aritmética de tres números utilizando un “array”

- Menú File – New – Console Application

- Escribe:

program Project008;

Page 8: Delphi 1

Delphi 7 Fermí Vilà 8

{$APPTYPE CONSOLE}uses SysUtils;

var x:array[1..3] of integer; media:real;begin writeln('MEDIA ARITMETICA DE 3 ENTEROS'); writeln; write('Escribe el primero: '); readln(x[1]); writeln; write('Escribe el segundo: '); readln(x[2]); writeln; write('Escribe el tercero: '); readln(x[3]); writeln; media:=(x[1]+x[2]+x[3])/3; writeln('La media de ',x[1],' , ',x[2],' y ',x[3],' es ',media:10:2); readln;end.

- Grábalo como Project008 y ejecútalo

Recordh) La principal limitación de un array es que todos los datos que contiene deben ser del mismo tipo. Pero a veces nos interesará agrupar datos de distinta naturaleza, como pueden ser el nombre y edad de una persona, que serían del tipo string y byte, respectivamente. En estos casos utilizaremos los records (registros).

El tipo Byte corresponde a números enteros entre 0 y 255.

- Menú File – New – Console Application

- Escribe:

program Project009;{$APPTYPE CONSOLE}uses SysUtils;

var dato:record nom:string[20]; edad:byte; end;begin

Page 9: Delphi 1

Delphi 7 Fermí Vilà 9

dato.nom:='Pepito Luis'; dato.edad:=49; write('El nombre es ',dato.nom); write(' y la edad ',dato.edad,' a'+Chr(164)+'os'); readln;end.

- Grábalo en TuCarpeta con el nombre Project009 y ejecútalo.

With do endi) Puede parecer engorroso el hecho de escribir “datos” antes de cada campo. Una forma de solucionarlo es utilizar la estructura with – do - end

- Menú File – New – Console Application

- Escribe:

program Project010;{$APPTYPE CONSOLE}uses SysUtils;

var dato:record nom:string[20]; edad:byte; end;begin with dato do begin nom:='Pepito Luis'; edad:=49; write('El nombre es ',nom); write(' y la edad ',edad,' a'+Chr(164)+'os'); end; readln;end.

- Grábalo como Project010 y ejecútalo.

- Observa que el begin … end; no representa nada más que un abrir y cerrar paréntesis. Es lo que se denomina un bloque de programación. Observa también que acaba en punto y coma, a diferencia del bloque principal del programa que acaba con un punto.

Código ASCIIj) Ya hemos visto en el apartado c, el problema de los acentos y otros caracteres, y su solución a través de la función Chr() y el código ASCII.

Page 10: Delphi 1

Delphi 7 Fermí Vilà 10

Vamos a hacer un programa para localizar el código ASCII de todos los caracteres:

- Menú File – New – Console Application

- Escribe:program Project011;{$APPTYPE CONSOLE}uses SysUtils;

var i:integer;begin for i:=1 to 255 do begin write(i,' ',chr(i),' - '); end; readln;end.

- Grábalo como Project011 y ejecútalo.

- Estudio del Project011:for i:= to 255 do

beginsentencia 1;sentencia 2;sentencia 3;…end;

Es una estructura de programación repetitiva que funciona: “Desde 1 hasta 255 (es decir 255 veces) repite la ejecución de las sentencias 1, 2, 3, …”

Chr() y #k) En lugar de la función Chr() podemos utilizar el símbolo #.

- Menú File – New – Console Application

- Escribe:

program Project012;{$APPTYPE CONSOLE}uses SysUtils;

begin writeln('writeln('+chr(39)+'Esto es un ejemplo'+chr(39)+')'); writeln('writeln('+#39+'Esto es un ejemplo'+#39+')');

Page 11: Delphi 1

Delphi 7 Fermí Vilà 11

writeln('writeln(''Esto es un ejemplo'')'); writeln; writeln;

writeln('Rect',Chr(160),'ngulo'); writeln('Rect'+Chr(160)+'ngulo'); writeln('Rect',#160,'ngulo'); writeln('Rect'+#160+'ngulo'); readln;end.

- Grábalo como Project012 y ejecútalo.

- Observa que para separar los diferentes elementos del writeln, podemos utilizar el signo “+” en lugar de la coma:

writeln(‘Rect’,#160,’ngulo’);writeln(‘Rect’+#160+’ngulo’);

Esto es así, porque todos son elementos “string”, ya que en caso de tipos distintos, por ejemplo: writeln(‘Pepe’+10), daría error.

Comentarios

l) Un “comentario” es algo que el compilador va a ignorar, como si no hubiéramos escrito nada, y que nosotros incluimos dentro del programa para que nos resulte más legible o para aclarar lo que hace una línea o un conjunto de líneas

Todo lo que escribamos entre (* y *) y también entre { y } serán “comentarios”. También todo lo que escribamos después de //, en una misma línea (comentarios de línea).

- Menú File – New – Console Application

- Escribe:

program Project013;{$APPTYPE CONSOLE}uses SysUtils;

var nom:string[20]; edad:byte;(* Acabamos de declarar dos variables, la primerade texto, string, y la segunda numérica, byte *)

begin write('Escribe tu nombre: '); readln(nom); write('Y ahora tu edad: '); readln(edad); write('Hola, '+nom+' que tal? ');

Page 12: Delphi 1

Delphi 7 Fermí Vilà 12

writeln('Tu edad es ',edad:3); {Observa que en el último write,

utilizo el signo + en lugar de la coma} //************************************ //***** Y observa que en el writeln **** //***** último, vuelvo a utilizar la *** //***** coma, ya que en caso contra- *** //***** rio el formato edad:3 daría **** //***** error. readln;end.

- Grábalo como Project013 en TuCarpeta y pruébalo.

Operadores Aritméticosm)

Suma (+): entre enteros: resultado enteroentre reales: resultado real

Resta (-): entre enteros: resultado enteroentre reales: resultado real

Producto (*): entre enteros: resultado enteroentre reales: resultado real

División (/): entre enteros: resultado realentre reales: resultado real

División Entera (div):entre enteros: resultado entero

Resto de la división entera (mod):entre enteros: resultado entero

En principio con la +, -, * no hay problema. El problema se presenta en 10/3 = 3.333333, en cambio 10 div 3 = 3 y 10 mod 3 = 1

- Menú File – New – Console Application

- Escribe:

program Project014;{$APPTYPE CONSOLE}uses SysUtils;

var e1,e2:integer; (* Enteros *)

Page 13: Delphi 1

Delphi 7 Fermí Vilà 13

r1,r2,r3:real; (* Reales *)begin

e1:=17;e2:=5;r1:=1;r2:=3.2; r3:=r1+r2; writeln('La suma de r1 y r2 es:',r3); writeln('O tambi'+#130+'n: ',r1+r2:5:2); (*Indicando Formato*) writeln('El producto de r1 y r2 es ',r1*r2); writeln('r1 dividido por r2 es ',r1/r2); writeln('La diferencia de e2 y e1 es: ',e2-e1); writeln('La divisi'+#162+'n de e1 entre e2: ',e1/e2); writeln('Su divisi'+#162+'n entera: ',e1 div e2); writeln('Y el resto de la divisi'+#162+'n: ',e1 mod e2); writeln('El opuesto de e2 es ',-e2); readln;end.

- Grábalo como Project014 en TuCarpeta y ejecútalo.

El operador “concatenación” y otros operadores

n) El operador “+” además de sumar números sirve para concatenar (unir) textos. Ya lo habíamos visto con los diferentes argumentos de la función write o writeln.

- Menú File – New – Console Application

- Escribe:

program Project015;{$APPTYPE CONSOLE}uses SysUtils;

var tex1,tex2,tex3:string;begin tex1:='Hola '; tex2:=' pues eso'; tex3:=tex1+tex2; writeln(tex3); readln;end.

- Grábalo como Project015 y ejecútalo.

Otros operadores

Operadores relacionales Operadores lógicos

Page 14: Delphi 1

Delphi 7 Fermí Vilà 14

= igual a and y<> distinto or o< menor not no> mayor xor o exclusivo<= menor o igual>= mayor o igual

La estructura “If – Then”

o) If condición then sentencia;Si se cumple la “condición” (y sólo en este supuesto) se ejecutará la “sentencia”.

- Menú File – New – Console Application

- Escribe:

program Project016;{$APPTYPE CONSOLE}uses SysUtils;

var num:integer;begin writeln('Escribe un número: '); readln(num); if num>0 then writeln('es positivo'); readln;end.

- Grábalo como Project016 y ejecútalo.

Tipo de datos “Boolean”p) var a: boolean;“x” puede tomar dos valores: true (verdad) o false (falso).

- Menú File – New – Console Application

- Escribe:

program Project017;{$APPTYPE CONSOLE}uses SysUtils;

var num:integer;

Page 15: Delphi 1

Delphi 7 Fermí Vilà 15

x:boolean;begin

writeln('Escribe un n'+Chr(163)+'mero: '); readln(num); x:=(num>0); if x then writeln('es positivo'); readln;end.

- Grábalo como Project017 y ejecútalo.

Bloque de sentenciasq) Si en una estructura if – then nos interesa ejecutar más de una sentencia. Éstas deben incluirse en un “bloque”, que no es más que:

begin sentencia 1; sentencia 2; sentencia 3; …end;

- Menú File – New – Console Application

- Escribe:

program Project018;{$APPTYPE CONSOLE}uses SysUtils;

var num:integer;begin writeln('Escribe un n'+Chr(163)+'mero: '); readln(num); if num<0 then begin write('es negativo. Pulsa dos veces '); writeln('[Return] para acabar'); readln; end; readln;end.

- Grábalo como Project018 y ejecútalo.

Page 16: Delphi 1

Delphi 7 Fermí Vilà 16

La estructura “if – then – else”r) if condición then

sentencia 1else

sentencia 2;Si se cumple la “condición” se ejecutará la “sentencia 1”, en caso contrario, es decir, si

no se cumple la “condición” se ejecutará la sentencia 2.

Un detalle importante que conviene tener en cuenta es que antes del “else”, no puede haber un punto y coma, porque eso indicaría el final de la sentencia “if …”, y el compilador nos daría un error.

- Menú File – New – Console Application

- Escribe:

program Project019;{$APPTYPE CONSOLE}uses SysUtils;

var num:integer;begin writeln('Escribe un n'+#163+'mero: '); readln(num); if num<0 then writeln('es negativo.') else writeln('es positivo o cero'); readln;end.

- Grábalo como Project019 y ejecútalo.

- Las sentencias “if – then – else” se pueden encadenar …

- Menú File – New – Console Application

- Escribe:

program Project020;{$APPTYPE CONSOLE}uses SysUtils;

var num:integer;

Page 17: Delphi 1

Delphi 7 Fermí Vilà 17

begin writeln('Escribe un n'+#163+'mero: ');

readln(num); if num<0 then writeln('es negativo.') else if num>0 then writeln('es positivo') else writeln('es cero'); readln;end.

- Grábalo como Project020 y pruébalo.

La estructura “case – of – else”s) case vari of

x1: sentencia 1;x2: sentencia 2;x3: sentencia 3;…

elsesentencia 4;

end;Según el valor de la variable “vari” se ejecutará una sentencia u otra:

Si vari = x1 se ejecutará la sentencia 1Si vari = x2 se ejecutará la sentencia 2Si vari = x3 se ejecutará la sentencia 3Si “vari” no es ningún de los valores anteriores, entonces se ejecutará la sentencia 4.

Observa que con esta estructura de programación, conseguimos lo mismo que varios “if anidados”, pero de una forma más sencilla.

- Menú File – New – Console Application

- Escribe:

program Project021;{$APPTYPE CONSOLE}uses SysUtils;

var letra:char;begin writeln('Escribe un car'+#160+'cter '); readln(letra); case letra of ' ': writeln('un espacio'); 'A'..'Z','a'..'z': writeln('una letra');

Page 18: Delphi 1

Delphi 7 Fermí Vilà 18

'0'..'9': writeln('un digito'); '+','-','*','/': writeln('un operador');

else writeln('no es espacio, ni letra, ni digito, ni operador'); end; readln;end.

- Grábalo como Project021 y ejecútalo

- Observa el nuevo tipo de dato: char, que significa un carácter

- Vamos a conseguir lo mismo que el programa de los “ifs anidados”, pero utilizando la estructura “case – of – else” …

- Menú File – New – Console Application

- Escribe:program Project022;{$APPTYPE CONSOLE}uses SysUtils;

var num:integer;begin writeln('Escribe un n'+#163+'mero: '); readln(num); case num of 0: writeln('es cero'); 1..2147483647: writeln('es positivo'); else writeln('es negativo'); end; readln;end.

- Grábalo como como Project022 y pruébalo.

La estructura “for – to”t) for i:= inicial to final do

sentencia;Repite la “sentencia” desde el valor “inicial” hasta el “final”.

- Menú File – New – Console Application

- Escribe:

Page 19: Delphi 1

Delphi 7 Fermí Vilà 19

program Project023;{$APPTYPE CONSOLE}

(* Programa que saluda 15 veces *)uses SysUtils;

var nom:string[25]; i:integer;

begin write('Escribe tu nombre: '); readln(nom); for i:=1 to 15 do writeln('Hola ',nom); readln;end.

- Grábalo como Project023 y ejecútalo

- Menú File – New – Console Application

- Escribe:program Project024;{$APPTYPE CONSOLE}(* Programa que escribe una tabla de multiplicar *)

uses SysUtils;

var tabla,num:integer;begin write('Escribe la tabla que quieres repasar '); readln(tabla); writeln; for num:=1 to 9 do writeln(tabla,'*',num,' = ',tabla*num); readln;end.

- Grábalo como Project024 y ejecútalo.

- Menú File – New – Console Application

- Escribe:

program Project025;

Page 20: Delphi 1

Delphi 7 Fermí Vilà 20

{$APPTYPE CONSOLE}uses SysUtils;

(* Programa que escribe todas las tablas de multiplicar *)var tabla,numero:integer;begin for tabla:=1 to 9 do begin for numero:=1 to 9 do writeln(tabla,' por ',numero,' es ',tabla*numero); writeln; readln; end; readln;end.

- Grábalo como Project025 y pruébalo.

- Observa que si necesitamos más de una sentencia en la estructura “for”, hemos de escribirlas (como siempre), dentro de un bloque: begin … end;

- Menú File – New – Console Application

- Escribe:program Project026;{$APPTYPE CONSOLE}uses SysUtils;

(* "FOR" que cuenta letras en lugar de números y que es decreciente en lugar de creciente *)var letra:char;begin for letra:='m' downto 'd' do write(letra,' - '); readln;end.

- Grábalo como Project026 y ejecútalo.

- Observa: si el bucle ha de ser decreciente, en lugar de to, deberemos utilizar downto

- Menú File – New – Console Application

- Escribe:

Page 21: Delphi 1

Delphi 7 Fermí Vilà 21

program Project027;{$APPTYPE CONSOLE}uses SysUtils;

(* Programa que escribe los 50 primeros múltiplos de 11 *)var i:integer;begin for i:=1 to 50 do write(i*11,' - '); readln;end.

- Grábalo con el nombre Project027 y ejecútalo.

La estructura “while – do”u) while condición do

sentencia;Mientras se cumpla la “condición” se ejecutará la “sentencia”.

- Menú File – New – Console Application

- Escribe:program Project028;{$APPTYPE CONSOLE}uses SysUtils;

(* Opción de volver a empezar *)var opc:char;begin opc:='S'; while opc='S' do begin writeln('Hola tio'); write('Quieres volver a empezar? (S/N) ? '); readln(opc); //Debes trabajar con letras mayúsculas end; readln;end.

- Grábalo como Project028 y ejecútalo

Page 22: Delphi 1

Delphi 7 Fermí Vilà 22

- Menú File – New – Console Application

- Escribe:program Project029;{$APPTYPE CONSOLE}uses SysUtils;

var frase:string;begin writeln('Escribe una frase y pulsa return'); writeln('Para acabar no escribas nada y pulsa return'); writeln; writeln('Escribe frase: '); readln(frase); while frase<>'' do begin writeln('Su longitud es: ',length(frase)); writeln; writeln('Escribe frase: '); readln(frase); end;end.

- Grábalo como Project029 y ejecútalo.

- Supongo que está claro que la función length(cadena de texto) nos da el número de caracteres de la “cadena de texto”, incluidos los espacios en blanco.

La estructura “Repeat – until”v) Repeat

sentencia 1; sentencia 2; … …until condición;Repite la ejecución del grupo de sentencias hasta que la condición sea cierta, es decir, en

el momento que se cumpla la condición saldremos del bucle. En esta estructura no necesitamos utilizar un bloque para el grupo de sentencias.

La gran diferencia respecto a la estructura anterior, es que “repeat – until” se ejecuta al menos una vez, ya que la comprobación de la condición se realiza al final del ciclo.

- Menú File – New – Console Application

- Escribe:program Project030;{$APPTYPE CONSOLE}

Page 23: Delphi 1

Delphi 7 Fermí Vilà 23

uses SysUtils;

var clave,pal:string[30];begin clave:='ObjectPascal';

repeat writeln('Clave de acceso: '); readln(pal); until pal=clave; readln;end.

- Grábalo como Project030 y ejecútalo.

- Menú File – New – Console Application

- Escribe:program Project031;{$APPTYPE CONSOLE}uses SysUtils;

(* Adivinar un número *)

var bien,prueba,inte,maxi:integer; i:byte;begin write('Escribe el número a adivinar: '); readln(bien); write('Número de intentos permitidos: '); readln(maxi); for i:=1 to 25 do writeln; // Observa de que forma borramos la pantalla. { Observa el comentario anterior. Tenemos tres formas de incluir comentarios en ObjectPascal. De todas formas, la opcion // solo sirve para incluir comentarios de una sola linea } inte:=0; repeat writeln; write('Introduce número: '); readln(prueba); if prueba>bien then writeln('Te has pasado') else if prueba<bien then writeln('Te has quedado corto') else writeln('Acertaste');

Page 24: Delphi 1

Delphi 7 Fermí Vilà 24

inte:=inte+1; writeln('Has gastado ',inte,' intentos de ',maxi,' en total'); until (inte>=maxi) or (prueba=bien); if (inte>=maxi) and (bien<>prueba) then writeln('Lo siento. Has agotado las pruebas'); readln;end.

- Grábalo como Project031 y ejecútalo.

- Menú File – New – Console Application

- Escribe:program Project032;{$APPTYPE CONSOLE}uses SysUtils;

var clave,inten:string[30]; num:integer;begin clave:='ObjectPascal'; num:=0; repeat num:=num+1; writeln('Clave de acceso: '); readln(inten); if inten<>clave then begin writeln('No es la clave'); if num=3 then exit; end; until inten=clave; readln;end.

- Grábalo como Project032 y ejecútalo.

- Observa la utilidad de la sentencia “exit”.

Constantesw) A veces nos encontramos con variables que no “cambian” a lo largo del programa, en este caso hablamos de constantes y las declaramos en una cláusula especial: Const, de la misma forma que para las variables usamos la cláusula Var.

- Menú File – New – Console Application

- Escribe:

Page 25: Delphi 1

Delphi 7 Fermí Vilà 25

program Project033;{$APPTYPE CONSOLE}uses SysUtils;

const bas=5.75;

var alt:real;begin write('altura: '); readln(alt); writeln; writeln('El área del rectángulo es ',bas*alt:6:3); readln;end.

- Grábalo como Project033 y ejecútalo

- El identificador “const” tiene también otro uso menos habitual: definir las llamadas “constantes con tipo”, que son variables normales y corrientes, pero a las que damos un valor inicial antes de que comience a ejecutarse el programa:

const var i: integer= 3; i: integer;begin sería equivalente a: begin … i:= 3; … …

InputBox – ShowMessagex) La entrada/salida de datos en una aplicación tipo cónsola (MS/DOS) como hemos visto, es a través de read (readln)/write(writeln)

En una aplicación windows la entrada/salida de datos es normalmente a través de componentes insertados en los formularios (fichas). Vamos a ver una alternativa, que es utilizando las ventanas: InputBox y ShowMessage. Y de esta forma comenzaremos a introducirnos en la programación “visual”.

- Vamos a crear una aplicación Windows, por lo tanto deberás hacer:Menú File

NewApplication

- Inserta un botón en el formulario, es decir:• Clic en el icono “Button” de la paleta “Standard”:

Page 26: Delphi 1

Delphi 7 Fermí Vilà 26

• Clic en cualquier punto del formulario.

- Clic-clic en el botón que acabamos de insertar.Escribe:

procedure TForm1.Button1Click(Sender: TObject);var bas,alt:real; area:real; b,a:string;begin b:=InputBox('Escribe la base =','',''); bas:=StrToFloat(b); a:=InputBox('Escribe la altura=','',''); alt:=StrToFloat(a); area:=bas*alt; ShowMessage('El área del rectángulo de base: '+ b+' y altura: '+a+' es '+ FloatToStr(area));end;

- Graba lo que acabamos de hacer de la siguiente forma:• Menú File

Save All• Save Unit1 As

Sitúate en TuCarpetaFile name: Unit034

• Save Project1 AsFile name: Project034

- Ejecuta el programa un par o tres de veces para asegurarte que funciona.

- Para salir (acabar) del programa debes hacer clic en la X del extremo superior derecho de la ventana “Form1”.

- Estudio del Project034:• El programa que hemos escrito se le llama procedimiento (procedure). Más

exactamente: procedimiento de evento, observa:procedure Tform1.Button1Click(…);……end;

“Nuestro programa” se ejecutará cuando hagamos clic en el button1 del Form1 (Tform1.ButtonClick)

• Pero, ¿donde está el program?Haz lo siguiente:

Menú ProjectView Source

Page 27: Delphi 1

Delphi 7 Fermí Vilà 27

Como puedes intuir al observar el “program”. Nuestro programa lo único que hace es crear y visualizar el formulario “Form1”. El “program” es lo que hemos grabado con el nombre Project034 y extensión dpr.

• Volvamos al Unit034. Basta que hagas clic en la “Solapa” correspondiente:

El Unit034 es el llamado módulo del formulario, cada formulario tiene un “módulo” (extensión pas), y contiene todos los procedimientos asociados al formulario, en nuestro caso uno solo: TForm1.Button1Click()

Estudiemos el contenido del procedure “TForm1.Button1Click”:• InputBox(‘Escribe la base = ‘,’’,’’)

Aparece una ventana de título: “Escribe la base =”, y queda inmovilizada hasta que escribimos (un número en nuestro caso), y pulsamos [Return] o clic en [Ok].

• b:=InputBox(‘Escribe la base = ‘,’’,’’);La variable “b” tomará el valor que escribamos en el “InputBox”, que necesariamente será texto. Atención: lo que devuelve un “InputBox” es siempre texto.

• bas:=StrToFloat(b);Convertimos el texto “b” en el número real “bas”. StrToFloat() es una función de conversión: convierte “string” en “float(real)”

• ShowMessage(argumento)Aparece una ventana que muestra “el argumento”. El “argumento” necesariamente ha de ser texto: cadenas entre comillas simples y/o variables string, unido todo ello con el operador de concatenación “+”.

• FloatToStr(area)Función que convierte un número real (float) en texto. Esta conversión: FloatToStr(area) es necesaria, porque “area” es una variable real y queremos que se muestre su valor en un “ShowMessage”.

Vamos a hacer otra aplicación windows, es decir:

- Menú FileNew

Application

- Inserta un “Button” y accede a su procedimiento de evento OnClick.

- Escribe:procedure TForm1.Button1Click(Sender: TObject);var nom:string; edad:integer;begin nom:=InputBox('NOMBRE','Escribe tu nombre','Pepito Grillo'); edad:=StrToInt(InputBox('EDAD','Escribe tu edad en años','55'));

Solapa: Unit034

Page 28: Delphi 1

Delphi 7 Fermí Vilà 28

ShowMessage('Hola '+nom+Chr(13)+ 'tienes '+IntToStr(edad)+ ' años de vida');end;

- Graba el módulo del formulario (el “Unit”) como Unit035.pas y el “program” (el proyecto) como Project035.dpr en TuCarpeta y ejecútalo varias veces observando detenidamente su funcionamiento.

- Estudio del Project035• InputBox(‘argumento 1’,’argumento 2’,’argumento 3’)

El “argumento 1” es el texto que aparece como título de la ventana.El “argumento 2” es el texto que aparece en el interior de la ventana.El “argumento 3” es el texto que aparece por defecto en el “campo” de la ventana.

• Chr(13)En código ASCII, el número 13 corresponde al [Return], por lo tanto “Chr(13)” es equivalente a pulsar [Return], de esta forma podemos escribir varias líneas en un “ShowMessage”.

• edad:=StrToInt(…)Convierte el argumento, que es texto (string) en un entero (int = integer).

• IntToStr()Corresponde a la conversión contraria a la anterior: convierte un número entero en texto.

Vamos a hacer un programa “visual”, que nos vaya pidiendo números enteros, si escribimos el 9.999 se acaba; el programa nos da todos los números introducidos, y su número, exceptuando el 9.999

Vamos a ver si lo conseguimos:

- Menú File – New - Application

- Inserta un “button” y accede a su “procedure OnClick”

- Escribe:procedure TForm1.Button1Click(Sender: TObject);var text,res:string; cuenta:integer;begin text:=InputBox('Escribe un número','',''); cuenta:=0; res:=res+text+' , '; while text<>'9999' do begin cuenta:=cuenta+1; text:=InputBox('númer?','',''); if text<>'9999' then res:=res+text+' , '; end; ShowMessage('Número de números= '+IntToStr(cuenta)+ Chr(13)+' que son = '+Chr(13)+res);

Page 29: Delphi 1

Delphi 7 Fermí Vilà 29

end;

- Grábalo como Unit036.pas – Project036.dpr y ejecútalo.

Programa que escribe los múltiplos de 11 inferiores a 350 y por último nos da su suma.

- Menú File – New - Application

- Inserta un “button”, accede a su procedure OnClick y escribe:

procedure TForm1.Button1Click(Sender: TObject);var mult,suma:real; salida:string;begin salida:=''; suma:=0; mult:=0; repeat mult:=mult+11; suma:=suma+mult; salida:=salida+FloatToStr(mult)+ ', Suma Parcial= '+FloatToStr(suma)+Chr(13); until mult>340; salida:=salida+Chr(13)+'Suma Total= '+FloatToStr(suma); ShowMessage(salida);end;

- Grábalo como Unit037.pas – Project037.dpr y ejecútalo.

Programa que suma todos los enteros comprendidos entre otros dos

- Menú File – New - Application

- Inserta un “button”, accede a su procedure OnClick y escribe:

procedure TForm1.Button1Click(Sender: TObject);var primero,ultimo,i:integer; suma:real; s:string;begin primero:=StrToInt(InputBox('Primer Entero','',''));

Page 30: Delphi 1

Delphi 7 Fermí Vilà 30

ultimo:=StrToInt(InputBox('Último entero','','')); s:='';suma:=0; for i:=primero to ultimo do begin s:=s+IntToStr(i)+' , '; suma:=suma+i; end; ShowMessage('Números= '+s+Chr(13)+'Suma= '+ FloatToStr(suma));end;

- Grábalo como Unit038.pas – Project038.dpr y ejecútalo.

- El programa funciona muy bien, pero si consideras casos como: Primer entero = 1 y Último entero = 10000, está claro que se presenta un problema técnico: “La ventana correspondiente al ShowMessage tiene una capacidad limitada”.

El programa anterior pero utilizando un “ListBox”

Bien pronto veremos, que para hacer cualquier programa un poco “serio”, deberemos trabajar con multitud de componentes. Vamos a trabajar con el componente ListBox (igual que en los ejercicios anteriores no nos preocuparemos de sus propiedades, de momento).

- Menú File – New - Application

- Inserta en el “Form” un Button y un ListBox (icono “ListBox”, de la paleta “Standard”), en la siguiente posición y dimensiones aproximadas:

- Accede al “procedure OnClick” del Button1 y escribe el siguiente procedimiento de evento:

procedure TForm1.Button1Click(Sender: TObject);var pri,ult,i:integer; suma:real;begin pri:=StrToInt(InputBox('Uno','','')); ult:=StrToInt(InputBox('Último','','')); suma:=0;

Page 31: Delphi 1

Delphi 7 Fermí Vilà 31

for i:=pri to ult do begin Listbox1.Items.Add(IntToStr(i)); suma:=suma+i; end; ListBox1.Items.Add('Suma= '+FloatToStr(suma));end;

- Grábalo como Unit039.pas – Project039.dpr y ejecútalo para el caso: Uno = 1, Último = 10000- Estudio del Project039:

• ListBox1.Items.Add(cadena)Añade al “ListBox” la “cadena”.

• Si el contenido del “ListBox” es superior a la que podemos visualizar, automáticamente aparecen barras de desplazamiento.

El programa anterior pero más elegante

- Menú File – New - Application

- Inserta en el “Form”, un “Button” y un “ListBox”, con la siguiente posición y dimensiones aproximadas:

- Escribe el siguiente procedimiento de evento:

procedure TForm1.Button1Click(Sender: TObject);var pri,ult,i,columna:integer; suma:real; fila:string;begin fila:='';columna:=0;suma:=0; pri:=StrToInt(InputBox('Uno','','')); ult:=StrToInt(InputBox('Ultimo','','')); for i:=pri to ult do

Page 32: Delphi 1

Delphi 7 Fermí Vilà 32

begin suma:=suma+i; columna:=columna+1; fila:=fila+IntToStr(i)+' , '; if columna=10 then begin ListBox1.Items.Add(fila); columna:=0; fila:='';

end; end; ListBox1.Items.Add('Suma= '+FloatToStr(suma));end;

- Grábalo como Unit040.pas – Project040.dpr y ejecútalo.

Una última mejora

- Menú File – New - Application

- Inserta en el formulario, 5 “ListBox” y un “Button”, con la siguiente posición y dimensiones aproximadas:

- Escribe el siguiente procedimiento de evento:

procedure TForm1.Button1Click(Sender: TObject);var pri,ult,i,j:integer; suma:real;begin suma:=0;j:=1; pri:=StrToInt(InputBox('Inicial','',''));

Page 33: Delphi 1

Delphi 7 Fermí Vilà 33

ult:=StrToInt(InputBox('Final','','')); for i:=pri to ult do begin suma:=suma+i; if j=1 then begin ListBox1.Items.Add(IntToStr(i)); j:=2; Continue;

end; if j=2 then begin ListBox2.Items.Add(IntToStr(i)); j:=3; Continue; end; if j=3 then begin ListBox3.Items.Add(IntToStr(i)); j:=4; Continue; end; if j=4 then begin ListBox4.Items.Add(IntToStr(i)); j:=5; Continue; end; if j=5 then begin ListBox5.Items.Add(IntToStr(i)); j:=1; Continue; end; end; ListBox1.Items.Add('Suma= '+FloatToStr(suma));end;

- Grábalo como Unit041.pas – Project041.dpr y ejecútalo.

Random – Randomize

y) Random da como resultado un número real aleatorio entre 0 y 1.Random(6) devuelve un número entero aleatorio entre 0 y 5, ambos inclusive.Random(12) dará por resultado un número entero aleatorio entre 0 y 11, ambos inclusive.Random(25) + 1 dará por resultado un número entero aleatorio entre 1 y 25, ambos inclusive

Es decir:

Page 34: Delphi 1

Delphi 7 Fermí Vilà 34

Si x es un número, declarado “integer” y x:=Random(10)+1, x será un entero aleatorio entre 1 y 10 ambos inclusive.

Siempre que en un programa se trabaje con números aleatorios, es conveniente utilizar previamente la sentencia Randomize, ya que de esta forma la serie de números aleatorios, cada vez que ejecutemos el programa será distinto, es decir se tratará de números realmente aleatorios.

Vamos a hacer una aplicación tipo cónsola para comprobar lo que acabamos de afirmar.

- Menú File – New – Other – Console Application

- Escribe:

program Project042;{$APPTYPE CONSOLE}uses SysUtils;

var i,x:integer;begin Randomize; writeln('10 números reales aleatorios entre 0 y 1'); for i:=1 to 10 do writeln(Random); writeln; readln; writeln('100 números enteros aleatorios entre 0 y 5, ambos inclusive'); for i:=1 to 100 do write(Random(6),' - '); writeln; readln; writeln('100 números enteros aleatorios entre 0 y 11, ambos inclusive'); for i:=1 to 100 do write(Random(12),' - '); writeln; readln; writeln('100 números enteros aleatorios entre 1 y 25, ambos inclusives'); for i:=1 to 100 do write(Random(25)+1,' - '); writeln; readln; writeln('100 números enteros aleatorios entre 1 y 10, ambos inclusive'); for i:=1 to 100 do begin x:=Random(10)+1; write(x,' - '); end; writeln; readln;

Page 35: Delphi 1

Delphi 7 Fermí Vilà 35

end.

- Grábalo como Project042.dpr y ejecútalo.

Programa que permite al usuario jugar a las adivinanzas con el ordenador.

- Menú File – New - Application

- Inserta en el formulario un “Button” y dos “ListBox”.

- Escribe el siguiente procedimiento de evento:

procedure TForm1.Button1Click(Sender: TObject);var acierto:boolean; pruebas:integer; azar,numero:integer;begin pruebas:=0;acierto:=false; Randomize; azar:=Random(10)+1; while not acierto do begin numero:=StrToInt(InputBox('número: ','','')); pruebas:=pruebas+1; ListBox1.Items.Add(IntToStr(numero)); if numero=azar then begin ListBox2.Items.Add('Acertado en '+ IntToStr(pruebas)+' veces'); acierto:=true; end; if numero<azar then ListBox2.Items.Add('Es más alto'); if numero>azar then ListBox2.Items.Add('Es más bajo'); end;end;

- Grábalo como Unit043.pas – Project043.dpr y ejecútalo unas cuantas veces para comprobar que funciona.

Canvas. TextOut

Page 36: Delphi 1

Delphi 7 Fermí Vilà 36

z) Veamos que hay otra forma de “salida de datos”, que es a través del formulario …

- Crea una nueva aplicación windows, es decir:Menú File

NewApplication

- Coloca en el formulario un “button”, en el extremos inferior derecho del formulario.

- Escribe el siguiente código:

procedure TForm1.Button1Click(Sender: TObject);var radio,super,longi:real;begin radio:=StrToFloat(InputBox('Escribe el radio','','')); super:=PI*radio*radio; longi:=2*PI*radio; Canvas.TextOut(10,10,'Radio= '+FloatToStr(radio)); Canvas.TextOut(10,30,'Superficie= '+FloatToStr(super)); Canvas.TextOut(10,50,'Longitud= '+FloatToStr(longi)); Canvas.TextOut(10,70,'Circunferencia ');end;

- Grábalo como Unit044.pas – Project044.dpr y ejecútalo

- CanvasEs un método común a muchos componentes, y que nos permite “dibujar” en el control.

- Canvas.TextOut (CoordX, CoordY, mensaje);“Dibuja” en las coprdenadas especificadas el “mensaje”.

Page 37: Delphi 1

Delphi 7 Fermí Vilà 37

Ejercicios Resueltos

1) Repite el Project044 pero utilizando la estructura “with – do”, de forma que la palabra Canvas aparezca una sola vez, en lugar de cuatro.

Graba el programa resultante como Ejer01.pas – ProjectEjer01.dpr

Solución:procedure TForm1.Button1Click(Sender: TObject);var radio,super,longi:real;begin radio:=StrToFloat(InputBox('Escribe el radio','','')); super:=PI*radio*radio; longi:=2*PI*radio; with Canvas do begin TextOut(10,10,'Radio= '+FloatToStr(radio)); TextOut(10,30,'Superficie= '+FloatToStr(super)); TextOut(10,50,'Longitud= '+FloatToStr(longi)); TextOut(10,70,'Circunferencia '); end;end;

2) Haz un programa MS/DOS, que sirva para calcular la hipotenusa de un triángulo rectángulo, de la siguiente forma:- El programa nos pregunta la medida de los dos catetos- El programa nos escribe en pantalla los dos catetos y la hipotenusa con 6 decimales.- El programa nos pregunta si queremos calcular una nueva hipotenusa- En caso positivo, el programa vuelve a empezar, en caso negativo se acaba

Graba el programa como ProjectEjer02.dpr. Deberás tener en cuenta que la función Delphi que calcula la raíz cuadrada de un número es SQRT()

Solución:

Page 38: Delphi 1

Delphi 7 Fermí Vilà 38

program ProjectEjer02;{$APPTYPE CONSOLE}uses SysUtils;

var c1,c2,h:real; op:char;beginop:='S';

while (op='S') or (op='s') do begin writeln('======================================'); writeln(' TEOREMA DE PITÁGORAS'); writeln; write('Escribe el valor de un cateto: '); readln(c1); write('Escribe el valor del otro cateto: '); readln(c2); writeln; writeln; h:=sqrt(c1*c1+c2*c2); writeln('La hipotenusa del triángulo de catetos ',c1:10:6,' y ',c2:10:6,' es ',h:10:6); writeln; write('Quieres calcular otra hipotenusa? S/N '); readln(op); end;readln;end.

3) Haz un programa MS/DOS, que sirva para resolver una ecuación de 2º grado.

Graba el programa como ProjectEjer03.dpr

Solución:

program ProjectEjer03;{$APPTYPE CONSOLE}uses SysUtils;

var a,b,c:real; disc,x1,x2:real;begin write('Coeficiente de x cuadrado:'); readln(a);

Page 39: Delphi 1

Delphi 7 Fermí Vilà 39

write('Coeficiente de x: '); readln(b); write('Término independiente: '); readln(c); writeln; disc:=b*b-4*a*c; if disc<0 then writeln('Soluciones Imaginarias') else if disc=0 then begin x1:=-b/(2*a);

writeln('Una solución que es ',x1:6:2); end else begin x1:=(-b+sqrt(disc))/(2*a); x2:=(-b-sqrt(disc))/(2*a); writeln('Soluciones: ',x1:6:2,' y ',x2:6:2); end; readln;end.

4) Haz un programa que sirva para repasar las tablas de multiplicar de la siguiente forma:- El programa ha de ser tipo cónsola.- El programa nos pregunta 10 productos aleatorios de dos números de una cifra.- Al final, el programa nos da la “nota”, es decir el número de aciertos.- Si ante una pregunta determinada contestamos bien, el programa nos dice “MUY BIEN” y en caso de contestar mal, también nos lo dice, junto con el resultado del producto correcto.

Graba el programa como ProjectEjer04.dpr

Solución:

program ProjectEjer04;{$APPTYPE CONSOLE}uses SysUtils;

var i,x,y,res:integer; bien:integer;begin bien:=0; Randomize; for i:=1 to 10 do begin x:=Random(9)+1;

Page 40: Delphi 1

Delphi 7 Fermí Vilà 40

y:=Random(9)+1; write(x,' x ',y,' = ');readln(res); if res=x*y then begin writeln('MUY BIEN'); writeln; bien:=bien+1; end else begin writeln('MUY MAL ',x,' por ',y,' es ',x*y);

end; end; writeln; writeln; writeln('Tu NOTA es ',bien); readln;end.

5) Haz una aplicación windows que sirva para calcular los múltiplos de 7 hasta el número que queramos y al final, el programa nos da la suma y producto de todos ellos, de la siguiente forma:

- Un formulario con dos “ListBox” y un “button”:

- Aparece una ventana que nos pide hasta qué número deseamos los múltiplos de 7.

- El el primer “ListBox” aparece el listado de los múltiplos de 7 correspondientes.

- En el segundo “ListBox” aparece la suma y producto de los múltiplos de 7 correspondientes

Graba el programa con el nombre Ejer05.pas – ProjectEjer05.dpr

Solución:

procedure TForm1.Button1Click(Sender: TObject);var final,mult:integer; suma,prod:real;begin final:=StrToInt(InputBox('MÚLTIPLOS DE 7','Escribe hasta qué número deseas los

Page 41: Delphi 1

Delphi 7 Fermí Vilà 41

múltiplos','')); mult:=0;suma:=0;prod:=1; while mult<=final-7 do begin mult:=mult+7; suma:=suma+mult; prod:=prod*mult; ListBox1.Items.Add(IntToStr(mult)); end; ListBox2.Items.Add('Suma = '+FloatToStr(suma)); ListBox2.Items.Add('Producto = '+FloatToStr(prod));end;

6) Haz un programa que nos sume todos los números que queramos.

Graba el programa como Ejer06.pas – ProjectEjer06.dpr

Solución:

procedure TForm1.Button1Click(Sender: TObject);var num,total:real; s:string;begin num:=StrToFloat(InputBox('SUMA','Escribe un número','')); s:=''; s:=s+'La suma de los números:'+Chr(13)+Chr(13); total:=0; while num<>0 do begin s:=s+FloatToStr(num)+' , '; total:=total+num; num:=StrToFloat(InputBox('SUMAR','Escribe un número o [Return] para terminar','0')); end; s:=s+#13+'es: '+FloatToStr(total); ShowMessage(s);end;

7) Haz un programa que nos convierta la escala de temperatura CENTÍGRADA a FAHRENHEIT desde -10º C hasta 150º C de 2 en 2. Al llegar al punto de congelación y ebullición del agua, el programa nos lo indica. Ten en cuenta que 1ºF = 32 + (1ºC * 9)/ 5

Graba el programa como Ejer07.pas – ProjectEjer07.dpr

Solución:

procedure TForm1.Button1Click(Sender: TObject);var

Page 42: Delphi 1

Delphi 7 Fermí Vilà 42

contador:integer; f,c:integer;

begin c:=1; ListBox1.Items.Add('Temperaturas Celsius y Fahrenheit'); ListBox1.Items.Add('==========================='); for contador:=-5 to 75 do begin c:=2*contador; f:=32+(c*9) div 5;

ListBox1.Items.Add(IntToStr(c)+' celsius - '+ IntToStr(f)+' fahrenheit'); if c=0 then begin ListBox1.Items.Add('Atención: Punto Congelación del agua'); ListBox1.Items.Add(' '); end; if c=100 then begin ListBox1.Items.Add('Atención: Punto Ebullición del agua'); ListBox1.Items.Add(''); end; end;end;

8) Haz un programa que nos haga la tabla de valores de la función: y = x2 – 5x + 10 de la siguiente forma:

- Dos “ListBox”, uno para los valores de X y el otro para los valores de Y- El programa nos pregunta el valor mínimo (inicial) de la “x”.- El programa nos pregunta el valor máximo (final) de la “x”.- El programa nos pregunta el incremento que debemos dar a la “x”

Graba el programa como Ejer08.pas – ProjectEjer08.dpr

Solución:

procedure TForm1.Button1Click(Sender: TObject);var x1,x2,incr,i,y:real;begin ListBox1.Items.Add('--- X ---'); ListBox1.Items.Add('========='); ListBox1.Items.Add(' '); ListBox2.Items.Add('--- Y ---');

Page 43: Delphi 1

Delphi 7 Fermí Vilà 43

ListBox2.Items.Add('========='); ListBox2.Items.Add(' '); x1:=StrToFloat(InputBox('Primer valor','Escribe el menor valor de X de la tabla','')); x2:=StrToFloat(InputBox('Último valor','Escribe el mayor valor de X de la tabla','')); if x1>=x2 then ShowMessage('No tiene sentido lo que pretendes hacer') else begin incr:=StrToFloat(InputBox('Variación','Escribe el incremento de X','')); if incr<=0 then begin ShowMessage('No tiene sentido lo que pretendes hacer');

exit; end; i:=x1; while i<=x2 do begin y:=i*i-5*i+10; ListBox1.Items.Add(FloatToStr(i)); ListBox2.Items.Add(FloatToStr(y)); i:=i+incr; end; end;end;

9) Haz un programa que nos de la “nota” cualitativa a partir de la cuantitativa, de la siguiente forma:

El programa nos pide el número total de preguntas y el número de respuestas acertadas. A partir de aquí y utilizando la estructura “CASE … OF … ELSE”, el programa nos da la nota cualitativa.

Graba el programa como Ejer09.pas – ProjectEjer09.dpr

Solución:

procedure TForm1.Button1Click(Sender: TObject);var num,notanum,bien:integer; notacual,s:string;begin num:=StrToInt(InputBox('Preguntas','Escribe el número total de preguntas','')); bien:=StrToInt(InputBox('Aciertos','Escribe el número total de respuestas acertadas','')); notanum:=(10*bien) div num; case notanum of 0,1: notacual:='Muy Deficiente'; 2,3: notacual:='Deficiente'; 4: notacual:='Insuficiente';

Page 44: Delphi 1

Delphi 7 Fermí Vilà 44

5: notacual:='Suficiente'; 6: notacual:='Bien'; 7,8: notacual:='Notable'; 9,10: notacual:='Excelente'; else notacual:='No tiene sentido'; end; s:=''; s:=s+'Nota Cualitativa'+#13+#13; s:=s+'Número de preguntas = '+IntToStr(num)+#13; s:=s+'Número de aciertos = '+IntToStr(bien)+#13; s:=s+'Nota Cuantitativa = '+IntToStr(notanum)+#13; s:=s+'Nota Cualitativa = '+notacual+#13; ShowMessage(s); end;

10) Observa la siguiente tabla:Lunes Martes Miercoles Jueves Viernes

Inicio 8 10,5 6 9 7Fin 14 17 13,5 13 18

Resulta que cada día de la semana hacemos una jornada laboral distinta, en el ejemplo de la tabla (que representa una semana determinada), el lunes empezamos a trabajar a las 8 y terminamos a las 2 de la tarde, el martes empezamos a trabajar a las 10 y media y terminamos a las 17, etc.

Crea un programa para introducir el horario semanal de la tabla. El programa ha de dar como resultado el número de horas que hemos trabajado en toda la semana (utiliza un array bidimensional).

Graba el programa como Ejer10.pas – ProjectEjer10.dpr

Solución:

procedure TForm1.Button1Click(Sender: TObject);var a:array[1..2,1..5] of real; i,j:byte; suma,diaria:real; salida:string;begin for j:=1 to 5 do for i:=1 to 2 do a[i,j]:=StrToFloat(InputBox('Horario Laboral','Escribe en primer lugar la hora de inicio'+#13+ 'Y a continuación la hora de finalización'+#13+ 'Para cada día de la semana, empezando'+#13+

Page 45: Delphi 1

Delphi 7 Fermí Vilà 45

'por el lunes y terminando por el viernes','')); suma:=0; salida:=''; For j:=1 to 5 do begin diaria:=a[2,j]-a[1,j]; suma:=suma+diaria; salida:=salida+'Una jornada= '+FloatToStr(diaria)+' horas'+#13; end; salida:=salida+#13+'Toda la semana= '+FloatToStr(suma)+' horas.'; ShowMessage(salida);end;

11) Crea un programa que nos permita calcular el promedio de un número cualquiera de elementos, utilizando un array dinámico

Un array es dinámico, si no conocemos el número de sus elementos previamente.

Ejemplo:Var X: array of integer; // declaramos un array sin longitudBegin SetLength(X, 5);

(* En el interior del bloque asignamos su longitud, en nuestro caso 5 *)

X[0]:= 1; X[1]:= 2; X[2]:=3; X[3]:= 4; X[4]:= 5;(* Observa que el primer valor del índice es 0 *)

Graba el programa como Ejer11.pas – ProjectEjer11.dpr

Solución:

procedure TForm1.Button1Click(Sender: TObject);var s:string; num:integer; sum:real; i:byte; x:array of real;begin s:='PROMEDIO DE UN NÚMERO CUALQUIERA DE ELEMENTOS'+#13; sum:=0; num:=StrToInt(InputBox('Longitud del Array','Escribe el número de elementos','')); SetLength(x,num); // Longitud del array for i:=0 to num-1 do begin

Page 46: Delphi 1

Delphi 7 Fermí Vilà 46

x[i]:=StrToFloat(InputBox('Número ?','','')); s:=s+FloatToStr(x[i])+#13; sum:=sum+x[i]; end; s:=s+#13; s:=s+'El promedio de todos estos números es: '+FloatToStr(sum/num); ShowMessage(s);end;

12) Crea un programa que nos permita calcular, dada una serie de 5 números, la media aritmética, las desviaciones respecto a la media, la desviación media, la varianza y la desviación típica.

Graba el programa con el nombre Ejer12.pas – ProjectEjer12.dpr

Compruébalo para el caso:

Solución:

procedure TForm1.Button1Click(Sender: TObject);var sum,med:real; num:array[1..5] of real; desv:array[1..5] of real; sum1,sum2:real; i:byte; desmed,vari,dt:real;begin sum:=0;sum1:=0;sum2:=0; ListBox1.Items.Add('Valores de la serie estadística'); for i:=1 to 5 do begin num[i]:=StrToFloat(InputBox('Número ?','','')); ListBox1.Items.Add(FloatToStr(num[i])); sum:=sum+num[i];

Page 47: Delphi 1

Delphi 7 Fermí Vilà 47

end; med:=sum/5; ListBox1.Items.Add(''); ListBox1.Items.Add('Media Aritmética: '+FloatToStr(med)); ListBox1.Items.Add(''); ListBox1.Items.Add('Desviaciones '); for i:=1 to 5 do begin desv[i]:=Abs(num[i]-med); // La función Abs() devuelve el valor absoluto sum1:=sum1+desv[i]; sum2:=sum2+desv[i]*desv[i]; ListBox1.Items.Add(FloatToStr(desv[i])); end; desmed:=sum1/5; vari:=sum2/5;

dt:=sqrt(vari); ListBox1.Items.Add(''); ListBox1.Items.Add('Desviación Media: '+FloatToStr(desmed)); ListBox1.Items.Add(''); ListBox1.Items.Add('Varianza: '+FloatToStr(vari)); ListBox1.Items.Add('Desviación Típica: '+FloatToStr(dt));end;

13) Crea un programa que simule la tirada aleatoria de un dado de parchís, de la siguiente forma:- El programa nos pregunta el número de tiradas- El programa nos da la frecuencia absoluta, relativa y probabilidad de cada una de las posibilidades.

Graba el programa como Ejer13.pas – ProjectEjer13.dpr

Solución:

Page 48: Delphi 1

Delphi 7 Fermí Vilà 48

procedure TForm1.Button1Click(Sender: TObject);

var tiradas,num,i:integer; uno,dos,tres,cuatro,cinco,seis:integer;

begin Randomize; uno:=0;dos:=0;tres:=0; cuatro:=0;cinco:=0;seis:=0; tiradas:=StrToInt(InputBox('Tiradas de un dado','¿Cuántas veces quieres que tire el dado?','')); for i:=1 to tiradas do begin num:=Random(6)+1; case num of

1: uno:=uno+1; 2: dos:=dos+1; 3: tres:=tres+1; 4: cuatro:=cuatro+1; 5: cinco:=cinco+1; 6: seis:=seis+1; else ShowMessage('Algo Falla'); end; ListBox1.Items.Add(IntToStr(num)); end; ListBox2.Items.Add('Número de 1: '+IntToStr(uno)); ListBox2.Items.Add('Frecuencia: '+FloatToStr(uno/tiradas)); ListBox2.Items.Add('Probabilidad: '+FloatToStr(1/6)); ListBox2.Items.Add(''); ListBox2.Items.Add('Número de 2: '+IntToStr(dos)); ListBox2.Items.Add('Frecuencia: '+FloatToStr(dos/tiradas)); ListBox2.Items.Add('Probabilidad: '+FloatToStr(1/6)); ListBox2.Items.Add(''); ListBox2.Items.Add('Número de 3: '+IntToStr(tres)); ListBox2.Items.Add('Frecuencia: '+FloatToStr(tres/tiradas)); ListBox2.Items.Add('Probabilidad: '+FloatToStr(1/6)); ListBox2.Items.Add(''); ListBox2.Items.Add('Número de 4: '+IntToStr(cuatro)); ListBox2.Items.Add('Frecuencia: '+FloatToStr(cuatro/tiradas)); ListBox2.Items.Add('Probabilidad: '+FloatToStr(1/6)); ListBox2.Items.Add(''); ListBox2.Items.Add('Número de 5: '+IntToStr(cinco)); ListBox2.Items.Add('Frecuencia: '+FloatToStr(cinco/tiradas)); ListBox2.Items.Add('Probabilidad: '+FloatToStr(1/6)); ListBox2.Items.Add(''); ListBox2.Items.Add('Número de 6: '+IntToStr(seis)); ListBox2.Items.Add('Frecuencia: '+FloatToStr(seis/tiradas)); ListBox2.Items.Add('Probabilidad: '+FloatToStr(1/6));

Page 49: Delphi 1

Delphi 7 Fermí Vilà 49

end;

Ejercicios

1) Escribe un programa que nos vaya pidiendo números hasta que escribimos el cero. El programa nos da el número de números introducidos, su suma y su producto.

Graba el programa correspondiente como Ejer14.pas – Project14.dpr

2) Haz un programa que sirva para hacer una tabla de valores de la función y = sen( 7x – 5)- El programa nos pide los dos valores de “x” (valores máximo y mínimo de la tabla).- El programa nos pide el incremento (variación) de la “x”.

La función “seno” en Object Pascal es SIN(x), siendo “x” un “real” en radianes y devuelve un “real”. Recuerda que 1º = 180 /PI rad

Graba el programa como Ejer15.pas – ProjectEjer15.dpr

Page 50: Delphi 1

Delphi 7 Fermí Vilà 50

3) Haz un programa que sirva para calcular un cateto de un triángulo rectángulo a partir del otro cateto y la hipotenusa de la siguiente forma:- El programa nos pide el valor de la hipotenusa- El programa nos pide el valor de un cateto.- Si el cateto es mayor que la hipotenusa, el programa nos da un mensaje de error y se acaba- El programa nos da como resultado el valor del otro cateto y nos pregunta si queremos volver a empezar.

Graba el programa como Ejer16.pas – ProjectEjer16.dpr

4) Haz un programa que sirva para resolver ecuaciones de 2º grado del tipo: ax2 + bx = 0

Page 51: Delphi 1

Delphi 7 Fermí Vilà 51

Graba el programa como Ejer17.pas – ProjectEjer17.dpr

5) Haz un programa que sirva para resolver sistemas de ecuaciones del tipo: ax + by = cdx + ey = f

Ten en cuenta: x = (ce – bf ) / ( ae – bd ) ; y = (af – dc ) / ( ae – bd )

Graba el programa como Ejer18.pas – ProjectEjer18.dpr

6) Haz un programa que escriba los 15 primeros múltiplos de 6, su suma y su producto. El programa ha de tener la posibilidad de volver a empezar.

Graba el programa como Ejer19.pas – ProjectEjer19.dpr

Page 52: Delphi 1

Delphi 7 Fermí Vilà 52

7) Haz un programa que sirva para calcular el área de un triángulo o el área de un rectángulo o el área de un círculo. El programa ha de tener la posibilidad de volver a empezar.

Graba el programa como Ejer20.pas – ProjectEjer20.dpr

8) Haz un programa tal que: dados dos vectores del espacio, calcule su producto escalar, producto vectorial y además nos dé el módulo de los dos vectores y también el módulo del producto vectorial.Recuerda: si v = (a,b,c) y p = (d,e,f) Producto Escalar = ad + de + cf

Producto vectorial = ( bf-ec, dc-af, ae-bd) Módulo de v = 222 cba ++

Graba el programa como Ejer21.pas – ProjectEjer21.dpr

9) Haz un programa que calcule la suma de los primeros múltiplos de 3 de la siguiente forma:- El programa nos pide el número de múltiplos- Utiliza un “array dinámico”

Graba el programa como Ejer22.pas – ProjectEjer22.dpr

Page 53: Delphi 1

Delphi 7 Fermí Vilà 53

10) Haz un programa que calcule un determinante de tercer orden, por el método de Sarrus. Utiliza un array bidimensional.

Recuerda:

dbihfagecbfgdchaeiihgfedcba

−−−++=

Graba el programa como Ejer23.pas – ProjectEjer23.dpr

11) Crea un programa que simule la tirada aleatoria de una moneda, de la siguiente forma:- El programa nos pregunta el número de veces que hemos de tirar la moneda.- El programa nos da la frecuencia absoluta, relativa y probabilidad de los dos sucesos: “salir cara”, “salir cruz”.

Graba el programa como Ejer24.pas – ProjectEjer24.dpr

Page 54: Delphi 1

Delphi 7 Fermí Vilà 54