You are on page 1of 105

TEMA 1.

1
PRIMEROS PASOS
1.1.1 - Primer programa en QBasic
1.1.2 - Entender lo qe !emos !ec!o
1.1." - Estrctra #$sica
1.1.% - Escri#ir comentarios
1.1.1 PRIMER PRO&RAMA E' QBASI(
Es tradicional en programaci)n qe al empe*ar con n ne+o lenga,e para empe*ar a entenderlo se
escri#a n programa qe #orre la pantalla - escri#a las pala#ras ./ola mndo.0 all$ +amos paso por
paso.
1esde MS-1OS entrar2amos en el directorio donde tenemos QBasic - a continaci)n cargamos el
programa.
(1 1OS3Enter4
QBasic3Enter4
O lo m$s com5n en estos tiempos0 desde 6indo7s #scamos el programa QBasic.e8e o n acceso
directo qe apnte a 9l - !acemos do#le clic so#re s icono. :Mc!as +eces encontraremos los accesos
directos a QBasic con el nom#re de Microso;t Qic< Basic=
En el editor podemos empe*ar a escri#ir todo el c)digo de nestro programa. Esto es como n
procesador de te8tos0 solo qe en +e* de escri#ir lo qe qeramos s)lo se pede escri#ir en lenga,e
Basic. Si escri#imos otra cosa0 cando pasemos a la sigiente l2nea plsando .Enter. el programa se dar$
canta de qe algo no +a #ien - nos sacar$ n mensa,e de error.
>amos a escri#ir nestro programa.
cls
print ./ola Mndo.
?a est$@
A!ora qe -a nos !emos !artado de escri#ir todo el c)digo del programa +amos a pro#ar a +er si
;nciona.
Plsamos la tecla AB
Ca pantalla se pondr$ toda negra - en la esqina sperior i*qierda aparecer$ de color gris el r)tlo
./ola Mndo..
?a est$. 'estro programa !ace lo qe qer2amos. A#a,o aparecen nas letras qe dicen .Presione
calqier tecla - contin5e.. Este r)tlo lo escri#e atom$ticamente QBasic para indicarnos qe nestro
programa !a terminado - qe cando plsemos calqier tecla +ol+eremos al editor de c)digo.
Plsa calqier tecla - -a +es otra +e* la pantalla a*l del editor con las instrcciones del programa.
Para no tener qe !artarnos otro d2a de escri#ir nestro peda*o de programa +amos a gra#arlo en el
sistema de arc!i+os de nestro ordenador.
A#rimos el men5 .Arc!i+o. - seleccionamos .&ardar.. Aparece n cadro de di$logo donde se nos pide
el nom#re del arc!i+o. El mane,o del cadro de di$logo es m- sencillo0 pero !a- qe tener en centa
qe como QBasic ;nciona en MS-1OS los nom#res de los arc!i+os no peden tener m$s de D caracteres
ni peden inclir espacios en #lanco. Tampoco es con+eniente sar caracteres especiales ni letras
acentadas ni E.
Cos programas qe !agamos en QBasic se gardan en n 5nico Fc!ero de te8to AS(II con e8tensi)n
..BAS. qe contiene el c)digo ;ente del programa0 es decir0 las instrcciones en lenga,e Basic qe
!emos escrito para qe el programa ;ncione.
1.1.2 E'TE'1IE'1O CO QGE /EMOS /E(/O
A!ora +amos a +er recordar el ()digo de nestro programa.
(CS
PRI'T ./ola Mndo.
>emos qe !a- dos instrccionesH (CS #orra la pantalla :Igal qe en MS-1OS= - PRI'T ./ola Mndo.
escri#e en la pantalla ./ola Mndo.. Cas dos instrcciones se !an e,ectado na detr$s de otra0 por eso
podemos decir qe n programa es n listado de instrcciones qe se e,ectan de ;orma secencial na
detr$s de otra desde la primera !asta la 5ltima.
Al escri#ir el programa !a#r$s o#ser+ado qe segramente escri#iste cls - al pasar de l2nea se pso en
ma-5sclas como (CS. ? desp9s con print pas) lo mismo0 pero ./ola Mndo. se !a qedado como lo
escri#iste. Esto es porqe (CS - PRI'T son instrcciones del lenga,e Basic qe se ponen en ma-5sclas
atom$ticamente para dar ma-or legi#ilidad al programa. ./ola Mndo. +a entre comillas porqe es n
Citeral o na e8presi)n de cadena - se +a a qedar siempre como t5 lo !as escrito.
1.1." IESTRG(TGRA BJSI(AK
>eamos en n momento como ser2a n programa en lenga,e PAS(AC qe !aga lo mismo qe el nestroH
Program /olaL
ses crtL
#egin
clrscrL
7riteln:./ola Mndo.=L
end.
? lo mismo en lenga,e (H
Minclde N stdio.! O
int main:+oid=
P
clrscr:=L
cprint;:./ola Mndo.=L
retrn:Q=L
R
Podemos +er qe en los dos est$n las instrcciones para #orrar la pantalla :clrscr= - la de escri#ir :7riteln
en PAS(AC - cprint; en (=0 pero IPor qe lle+an pnto - coma al FnalK - IQ9 son esos s2m#olos - esas
otras pala#ras tan rarasK...
En otros lenga,es de programaci)n !ace ;alta escri#ir n .esqeleto #$sico. donde montar las
instrcciones0 en QBasic no. 'os limitamos a escri#ir lo qe qeremos qe !aga el programa - -a est$.
Estas estrctras #$sicas son necesarias en los otros lenga,es m$s a+an*ados0 pero en QBasic como
s)lo +amos a aprender as2 lo tenemos m$s ;$cil sin tener qe escri#ir cosas qe toda+2a no entendemos.
1.1.% ES(RIBIR (OME'TARIOS
Cos programas qe +eamos al principio de este crso +an a ser m- sencillos - se e8plican por si solos0
pero na +e* +a-amos aprendiendo a programar - !agamos programas cada +e* m$s largos nos
encontraremos con el pro#lema de qe pasado n tiempo tengamos qe re+isar el programa - no nos
acordemos de lo qe !acen algnas instrcciones0 o qe nestro programa lo +ea otra persona - no sepa
por d)nde cogerlo.
Para solcionar este pro#lema los lenga,es de programaci)n nos dan la posi#ilidad de escri#ir
comentarios dentro del listado del programa para e8plicar s ;ncionamiento. Co qe pongamos en los
comentarios no altera para nada el ;ncionamiento del programa.
En QBasic para escri#ir n comentario ponemos n ap)stro;o :S=. Ca tecla del ap)stro;o est$ en el #loqe
al;anm9rico del teclado en la Fla de arri#a0 a la derec!a del cero. Todo lo qe escri#amos a continaci)n
del ap)stro;o -a no ser$ tenido en centa a la !ora de e,ectar el programa. >eamos nestro e,emplo
con comentariosH
S PRO&RAMA /OCA MG'1O
S Escri#e en la pantalla ./ola Mndo.
S
S Este e,emplo ;orma parte del crso
S de introdcci)n a la programaci)n
S
(CS SBorra la pantalla
PRI'T ./ola Mndo. SEscri#e ./ola mndo.
Aq2 !emos pesto na ca#ecera descri#iendo el programa - a continaci)n a la derec!a de algnas
instrcciones0 en este caso de todas0 !emos e8plicado para qe sir+en.
En los programas -a terminados es con+eniente poner la ca#ecera siempre - e8plicar las instrcciones
m$s complicadas.
El ;ormato de la ca#ecera +endr$ especiFcado en el pro-ecto0 por e,emplo qe contenga el nom#re del
programa0 na descripci)n corta0 el ator - la ;ec!a. En nestros programas no es necesario ser tan
estrictos.
Otra tilidad qe se da a los comentarios en los entornos de programaci)n es la de consegir qe n
tro*o de programa no se e,ecte. Por e,emplo podemos poner como comentario la parte de n programa
d)nde se nos pide la cla+e de acceso - qe -a !emos compro#ado qe ;nciona0 para qe no nos la pida
cada +e* qe entremos a compro#ar otra cosa. Al Fnal nos tendremos qe acordar de qitar estos
comentarios para qe todo ;ncione #ien.
TEMA 1.2
>ARIABCES
1.2.1 - Introdcci)n a las +aria#les
1.2.2 - Tipos de datos
1.2." - 'om#res de +aria#les
1.2.% - 1eclaraci)n en +aria#les
1.2.B - (idado0 peligro en QBasic@
1.2.1 - I'TRO1G((IT' A CAS >ARIABCES
'estro programa anterior ;nciona m- #ien0 pero siempre qe lo e,ectemos +a a sceder lo mismo0
#orrar$ la pantalla - escri#ir$ n r)tlo qe diga ./ola Mndo.. >amos a escri#ir n programa n poco
m$s complicado qe nos pregnte nestro nom#re - nos salde. El resltado :lo qe se +e en pantalla al
e,ectarlo= podr2a ser el sigienteH
I()mo te llamasK ,anma
/ola ,anma
El programa #orrar$ la pantalla :Esto lo +amos a !acer siempre para no con;ndirlo con lo anterior qe
peda !a#er=0 nos pregntar$ por nestro nom#re0 nos de,ar$ escri#irlo con el teclado - cando lo
!agamos lo gardar$ en .alg5n sitio.0 desp9s escri#ir$ ./ola . segido de nestro nom#re qe lo !a#r$
sacado del .sitio. donde lo gard) antes.
>amos a +er como ser$ el c)digoH
(CS
I'PGT .I()mo te llamasK .0 nom#reU
PRI'T .!ola .L nom#reU
A!ora tenemos na instrcci)n ne+a0 I'PGT0 qe lle+a dos par$metros separados por na coma. Esta
instrcci)n lo qe !ace es de,ar al sario del programa qe escri#a algo con el teclado - cando plse
la tecla Enter lo garda en memoria.
Ca primera parte .I()mo te llamasK. la escri#e en pantalla tal como est$ para qe el sario sepa lo qe
se le pregnta.
Ca segnda parte es na >aria#le0 es decir el nom#re qe le !emos pesta a n .tro*o. de la memoria
del ordenador d)nde +amos a gardar lo qe !a escrito el sario - qe le !emos llamado nom#reU para
desp9s poder locali*arlo.
Ca sigiente instrcci)n0 PRI'T0 es la misma qe en el anterior programa. Co qe !ace es escri#ir lo qe
lle+a detr$s. En esta ocasi)n +a a escri#ir dos cosas0 primero ./ola . con s espacio detr$s tal como
aparece dentro de las comillas0 - a continaci)n todo segido escri#ir$ el +alor qe !a-a gardado en la
+aria#le nom#reU. 'o escri#ir$ /ola nom#reU porqe nom#reU no est$ entre comillas.
Esto de las +aria#les es na de las cosas m$s importantes de los lenga,es de programaci)n. Cos
programas +an a mane,ar datos qe estar$n gra#ados en la memoria del ordenador. Si no e8istieran las
+aria#les tendr2amos qe sa#er en qe posici)n e8acta los gardamos - desp9s para recperarlos
!a#r2a qe escri#ir los n5meros de las direcciones de memoria - sa#er e8actamente canto largo son los
datos. Esto es m- complicado :Esto es lo qe se !ace en los Cenga,es Ensam#ladores=0 para !acerlo
aq2 m$s sencillo saremos los nom#res de +aria#les - QBasic se encargar$ de +er en qe lgar ;2sico de
la memoria mete la in;ormaci)n - desp9s de sa#er recperarla cando se la pidamos.
1.2.2 - TIPOS 1E 1ATOS
'estros programas +an a poder tra#a,ar con +arios tipos de in;ormaci)n0 como son letras0 n5meros con
o sin decimales0 etc. 'estro programa anterior sa#a na +aria#le de te8to o de cadena de caracteres
para almacenar nestro nom#re0 pero en otros casos !a#r$ qe almacenar n5meros m$s o menos
grandes0 por e,emplo.
>eamos a!ora los tipos de datos qe !a- en QBasic.
'OMBRESGAIVO 1ES(RIP(IT' MW'IMO ? MJXIMO
STRI'& U Te8to con calqier car$cter Q a "2YZY caracteres
I'TE&ER[ '5meros enteros -"2YZD a "2YZY
CO'& \ '5meros enteros m$s grandes 2.1%Y.%D".Z%Y a -2.1%Y.%D".Z%D
SI'&CE @ '5meros con decimales 20D81Q%B a -20D81Q%B
1OGBCE M '5meros con m$s decimales %0]81Q"2% a -%0]81Q"2%
>amos a!ora a +er lo qe signiFca esta ta#la.
En QBasic las +aria#les +an a ser de no de estos cinco tipos.
Si qeremos almacenar pala#ras0 nom#res0 ;ec!as0 !oras0 c)digos postales0 n5meros de tel9;ono0 1'Is0
matr2clas0 etc. tendremos qe sar na +aria#le de tipo (adena :STRI'&= c-o nom#re lle+ar$ al Fnal el
car$cter U.
Para gardar n5meros tendremos qe sar algno de los otros catro tipos de +aria#les.
Si nestros n5meros no +an a lle+ar decimales saremos na +aria#le de tipo entero :I'TE&ER= qe
ocpa poca memoria :2 #-tes= - adem$s el ordenador tra#a,a con ellas m- r$pido.
Si los n5meros enteros +an a llegar a ser ma-ores de "2.YZY tendremos qe tili*ar na +aria#le de tipo
Entero largo :CO'&= en la qe .ca#en. !asta n5meros ma-ores qe dos mil millones.
Si +amos a sar n5meros reales :qe peden lle+ar decimales= tendremos qe sar +aria#les de
precisi)n sencilla :SI'&CE=.
Para alg5n c$lclo qe necesite o#tener resltados con mc!os decimales saremos las +aria#les de
do#le precisi)n :1OGBCE= qe son m$s lentas de mane,ar - ocpan m$s memoria qe las anteriores.
Si intentamos gardar en na +aria#le n +alor m$s grande :o m$s peqeEo si es negati+o= de lo qe
permite s tipo de datos0 se prodcir$ n .Error de Tiempo de E,ecci)n. - el programa se parar$.
1.2." - 'OMBRES 1E >ARIABCES
(ada +aria#le lle+ar$ n nom#re qe nosotros decidamos para sarla en nestro programa. Tenemos qe
elegir nom#res qe no sean demasiado largos - qe tengan algo qe +er con lo qe +a a contener la
+aria#le.
Cos nom#res de +aria#les de#en cmplir estas condicionesH
1e#en tener entre 1 - %Q caracteres.
Peden inclir letras - n5meros.
'o peden lle+ar la E ni letras acentadas.
El primer car$cter tiene qe ser na letra.
Estos nom#res de +aria#le son +$lidos.
Edad
;ec!a'acimiento
,gador1
i+a1Zpor(iento
+idasRestantes
Estos otros nom#res no son +$lidos
2,gadores :'o empie*a por na letra=
aEo :(ontiene la E=
elPatio1eMi(asaEsParticlar?(andoCle+eSeMo,a :M- Cargo=
pntaci)n :Cle+a acento=
/a- qe tener en centa qe QBasic no distinge de ma-5sclas - min5sclas0 por lo tanto na +aria#le
qe se llame ni+el ser$ la misma qe 'i+el0 'I>EC o ni>EC. 1e !ec!o cando cam#iemos las ma-5sclas
- min5sclas de na +aria#le se cam#iar$n todas las qe -a !a-a escritas en el resto del programa0 es
decir0 si !emos escrito en n sitio pntos - desp9s escri#imos PntoS en otro sitio0 la anterior tam#i9n
se cam#iar$ a PntoS.
Por con+enio los nom#res de las +aria#les se escri#en todo en min5sclas para di;erenciarlos
+isalmente de las Pala#ras (la+es qe se +an poniendo en ma-5sclas atom$ticamente. Si na
+aria#le lle+a dos pala#ras se sele escri#ir la primera letra de la segnda pala#ra en ma-5sclas para
separar n poco0 por e,emplo nom#reVgador totalActi+o o ne+oRegistro.
En las +aria#les qe de#er2an lle+ar la E !a- +arias ;ormasH Para aEo se sele escri#ir cosas como ano0
anno o an-o. 1e los acentos pasamos. En >isal Basic se peden sar nom#res de +aria#les con E -
acentos0 pero en QBasic no.
1.2.% - 1E(CARA(IT' 1E >ARIABCES
En otros lenga,es de programaci)n :la ma-or2a= !a- qe 1eclarar las +aria#les al principio del
programa. Esto signiFca escri#ir na instrcci)n qe diga algo as2 como .>o- a sar na +aria#le qe se
+a a llamar nom#re - +a a ser de tipo cadena. - as2 con cada na de las +aria#les qe +a-amos a sar en
el programa.
En QBasic 'O !ace ;alta declarar las +aria#les.
Ca primera +e* qe escri#imos el nom#re de na +aria#le QBasic reser+a en memoria el espacio para
tili*arla - -a est$ disponi#le drante el resto del programa0 pero I()mo sa#e QBasic del tipo qe
qeremos qe sea la +aria#leK
En la ta#la de tipos de datos !a#2a na colmna qe pon2a SF,o - qe para cada tipo de datos ten2a n
s2m#olo distinto.
'OMBRESGAIVO
STRI'& U
I'TE&ER[
CO'& \
SI'&CE @
1OGBCE M
Para indicar el tipo escri#iremos no de estos sF,os detr$s del nom#re de la +aria#le0 por e,emplo si
nom#re +a a contener te8to escri#iremos nom#reU :(omo !icimos en el e,emplo=. A esto se llama
declaraci)n impl2cita0 -a qe dentro del nom#re +a incl2do el tipo de datos.
A!ora IQe pasa si escri#imos en distintos sitios el mismo nom#re de +aria#le con distintos sF,osK0 por
e,emploH
+aria#leU ^ .Esto es n te8to.
+aria#le[ ^ 2QQQ
PRI'T +aria#leU
PRI'T +aria#le[
Co qe ocrrir$ es qe QBasic entiende qe son dos +aria#les completamente distintas0 cada na de n
tipo - nos da como resltadoH
Esto es n te8to
2QQQ
Esto pede prodcir n Error de C)gica0 es decir0 el programa ;nciona per;ectamente0 pero a lo me,or no
!ace lo qe esper$#amos. Para e+itar esto !a- qe poner a las +aria#les nom#res m$s descripti+os0 - si
en este caso de +erdad qer2amos dos +aria#les es me,or ponerles nom#res distintos para e+itar
con;siones.
Tam#i9n pede pasar qe se nos ol+ide ponerle a na +aria#le el sF,o de tipo0 entonces QBasic la
tratar$ como de tipo real de precisi)n sencilla0 qe es el tipo predeterminado. Para +er como se cam#ia
el tipo predeterminado mira en la a-da de QBasic la instrcci)n 1EAI'T - similares.
En la pr$ctica a partir de a!ora +amos a poner el sF,o U a las +aria#les de cadena - las dem$s las
de,amos sin sF,o para qe sean reales qe admiten n5meros m- grandes con o sin decimales. Si
;9ramos a !acer programas m- deprados ser2a con+eniente sar los otros tipos de +aria#les cando
;era necesario para qe ;eran m$s eFcientes con el consmo de memoria.
Cas +aria#les al ser sadas la primera +e* antes de asignarles :gardar en ellas= ning5n +alor contienen
n te8to de longitd cero si son de cadena o el n5mero Q si son de otro tipo. En otros lenga,es de
programaci)n esto no es as2 - contienen calqier +alor qe !#iera en esa posici)n de memoria de
otros programas qe la !#ieran sado antes0 por lo qe se peden prodcir errores. Aq2 no.
Co 5ltimo qe qeda es sa#er qe el Tiempo de >ida de na +aria#le es desde qe se sa por primera
+e* :desde qe se declara o se e,ecta la l2nea donde s nom#re aparece por primera +e*= !asta qe el
programa termina0 desp9s s +alor se pierde. 'o podemos contar con qe tengamos +alores en
memoria gardados de la +e* anterior qe e,ectamos el programa.
1.2.B - (GI1A1O@ PECI&RO E' QBASI(@
'o tener qe declarar las +aria#les pede parecer na +enta,a0 pero por el contrario ES G' &RA>E
I'(O'>E'IE'TE de QBasic.
El pro#lema menos importante es qe saremos ne+as +aria#les cada +e* qe qeramos sin acordarnos
de las anteriores qe a lo me,or -a no +ol+emos a sar0 - por lo tanto nestros programas +an a sar
m$s memoria de la necesaria.
El pro#lema m$s gra+e es qe si en n sitio escri#imos mal el nom#re de na +aria#le :o con;ndimos el
sF,o de tipo= QBasic se creer$ qe estamos sando na ne+a +aria#le - nestro programa segir$
;ncionando como si nada0 pero los c$lclos no saldr$n #ien.
>eamos el sigiente e,emplo0 otra +e* el programa saldador con n error de este tipoH
cls
inpt .I()mo te llamasK .0 nom#reU
print .!ola .L nom#erU
Gna +e* qe lo e,ectemos podr2a pasar estoH
I()mo te llamasK Vanma
/ola
'o !a prodcido ning5n error de Tiempo de E,ecci)n :'o se !a parado - !a terminado correctamente=0
pero no nos !a saldado con nestro nom#re@@@
'estro nom#re lo gard) en la +aria#le nom#reU cando lo escri#imos0 pero al respondernos !a escrito
./ola . - a continaci)n el +alor de la +aria#le nom#erU qe es otra +aria#le ne+a distinta - qe est$
+ac2a. Aq2 es m- sencillo de +er lo qe pasa0 pero en n programa de mil l2neas con carenta +aria#les
pede ser m- complicado inclso sa#er cal +aria#le es la qe !emos escrito mal.
Por esto !a- qe tener ESPE(IAC (GI1A1O en QBasic al escri#ir los nom#res de las +aria#les. En otros
lenga,es las +aria#les est$n declaradas al principio - si escri#imos algna mal nos da n error de
compilaci)n de tipo .IdentiFcador desconocido. - en mc!os casos !asta nos seEala la l2nea donde est$
la +aria#le mal escrita para qe la corri,amos.
En QBasic la ma-or2a de las +eces qe el programa ;nciona #ien pero no !ace lo qe qeremos es qe
!emos escrito mal el nom#re de algna +aria#le. (ando tenemos nom#res de +aria#les largos n trco
para +er si est$n #ien escritos todos es #scar na +aria#le qe est9 #ien escrita segro - poner la
5ltima letra en ma-5sclas0 por e,emplo si tenemos
identiFcador
lo cam#iar2amos por
identiFcadoR
qe para QBasic sige siendo lo mismo0 pero al !acerlo se cam#iar$n todas las +aria#les con nom#re
identiFcador por identiFcadoR en todo el programa - si al dar n repaso r$pido +emos qe algna aca#a
con r min5scla es qe algna letra est$ mal escrita - !a#r$ qe repasarla - corregir el error.
TEMA 1."
(O'STA'TES
1.".1 - Introdcci)n a las constantes
1.".2 - 1eFnici)n de constantes
1."." - Recomendaci)n de sar constantes
1.".1 - I'TRO1G((IT' A CAS (O'STA'TES
(ando !agamos programas qe sen +aria#les nos daremos centa de qe !a- +aria#les c-o +alor
realmente no cam#ia a lo largo de todo el programa. Podemos tratar estas +aria#les de na ;orma
especial para qe el ordenador las mane,e de ;orma m$s eFciente.
Estas +aria#les las deFniremos como constantes al principio del programa d$ndoles n +alor0 - desp9s
podremos sar este +alor dentro del programa cando nos !aga ;alta0 pero no modiFcarlo.
1.".2 - 1EAI'I(IT' 1E (O'STA'TES
Gsaremos la pala#ra cla+e (O'ST segida del nom#re de la constante0 el signo igal - el +alor qe le
+amos a dar.
E,emplosH
(O'ST pi ^ ".1%
(O'ST i+a ^ 1Z
(O'ST rta ^ .cH_#asic_prg_.
Para los nom#res +alen las mismas reglas qe para los nom#res de +aria#les0 es decir0 !asta %Q
caracteres sin E ni acentos0 etc...
Tam#i9n se selen poner todo en min5sclas.
El tipo de datos lo adi+ina QBasic a partir del +alor qe le asignamos0 por eso no es necesario poner los
sF,os de identiFcaci)n de tipo :[0 @0 \0 M0 U=0 pero si samos mc!as constantes ser2a recomendadle
!acerlo para dar m$s legi#ilidad al programa.
Al deFnir constantes nm9ricas podemos !acer re;erencias a otras constantes deFnidas anteriormente0
por e,emploH
(O'ST precio ^ "DQ
(O'ST do#leprecio ^ precio ` 2
(O'ST mitadprecio ^ precio a 2
Esto no se tili*a mc!o0 pero pede e+itar errores. En el e,emplo si el +alor de precio es correcto0 segro
qe tam#i9n lo son los +alores de las otras dos constantes.
1."." - RE(OME'1A(IT' 1E GSAR (O'STA'TES
En los programas e8tensos pede ser recomenda#les sar constantes para determinados +alores qe
algna +e* en el ;tro pede qe nos interese cam#iar.
Imaginemos n programa de conta#ilidad en el qe se calclan precios con I>A del 1Z por ciento.
Co m$s ;$cil ser2a escri#ir el n5mero 1Z en cada operaci)n donde sea necesario - -a est$0 pero
imaginemos qe cam#ian las le-es - el I>A pasa a ser del 1D por ciento. Para segir sando el programa
!a#r2a qe re+isar todas las l2neas del listado0 con el enorme tra#a,o qe esto pede sponer0 - en todos
los sitios relacionados con I>A d)nde !#iera n 1Z poner n 1D0 pero podr2an pasar dos cosasH
Qe cam#i$ramos n 1Z por n 1D en algo qe no t+iera nada qe +er con el I>A.
Qe en alg5n sitio de,emos el 1Z para calclar el I>A.
En calqiera de los dos casos nestro programa de,ar2a de ;ncionar correctamente -a qe !ar2a los
c$lclos mal.
Para e+itar este pro#lema #asta con deFnir al principio del programa na constante...
(O'ST i+a ^ 1Z
... - dentro del programa sar el nom#re de la constante en +e* de escri#ir el n5mero 1Z.
Si cam#ian las le-es del I>A #astar$ con cam#iar el +alor de la constante...
(O'ST i+a ^ 1D
... - -a est$0 el programa segir$ ;ncionado per;ectamente todo con el 1D por ciento. En los programas
grandes #ien estrctrados se tili*an constantes para todos los +alores qe peden cam#iar algna +e*.
Por e,emplo en n ,ego pede qe en ;tras +ersiones qeramos cam#iar la pntaci)n m$8ima o el
n5mero de +idas disponi#les.
TEMA 1.%
E'TRA1A ? SACI1A BJSI(A
1.%.1 - Introdcci)n a EaS
1.%.2 - Entrada. Ceer desde teclado
1.%." - (ontrol de sa#ota,es
1.%.% - Salida. Escri#ir en pantalla
1.%.1 - I'TRO1G((IT' A EaS
En el tema anterior !emos +isto na ;orma de qe nestro programa se comniqe con la memoria del
ordenadorH sando las +aria#les.
Aq2 +amos a +er la ;orma de qe nestro programa se comniqe con el sario. Ca ;orma m$s sencilla
de !acerlo es a tra+9s de la .(onsola en Modo Te8to.0 es decir le-endo lo qe el sario escri#a con el
teclado - dando los resltados a tra+9s de la pantalla en ;orma de te8to :(omo en MS-1OS=.
En otros temas m$s adelante +eremos c)mo di#,ar en la pantalla0 c)mo sar la impresora - c)mo leer -
escri#ir in;ormaci)n en el sistema de arc!i+os.
Antes de segir !a- qe aclarar qe .Ceer. signiFca qe el programa lea los datos de entrada qe el
sario !a escrito0 - .Escri#ir. signiFca poner en la pantalla los resltados de el programa para qe el
sario los +ea. 'o al re+9s0 las instrcciones son para el ordenador.
1.%.2 - E'TRA1A 1E 1ATOS. CEER 1ES1E EC TE(CA1O
Ca orden qe saremos en QBasic para leer lo qe el sario escri#e en el teclado es I'PGT. ?a la !emos
sado0 pero +amos a +erla con m$s tranqilidad.
S sinta8is m$s com5n ser2aH
I'PGT .Pregnta al sario.0 +aria#le
.Pregnta al sario. es na cadena de te8to entre comillas qe aparecer$ en pantalla para qe el
sario la +ea - sepa lo qe se le est$ pregntando. 'o pede ser na +aria#le ni na e8presi)n0
solamente na cadena entre comillas. En otros lenga,es de programaci)n no se da esta posi#ilidad -
!a- qe escri#ir n r)tlo ,sto antes sando otra instrcci)n.
+aria#le es el nom#re de la +aria#le d)nde se almacenar$ la in;ormaci)n qe escri#a el sario.
Al e,ectar esta instrcci)n se escri#e en la pantalla el te8to qe !a- entre comillas - a la derec!a
aparece el crsor intermitente para qe el sario escri#a. El programa estar$ parado !asta qe el
sario escri#a lo qe qiera - plse la tecla .Enter.. Entonces se almacena en la +aria#le lo qe !a
escrito el sario :El +alor anterior qe pdiera tener la +aria#le se pierde= - el programa sige con la
sigiente instrcci)n qe !a-a.
El sario podr$ despla*arse con las bec!as del teclado por el te8to qe est$ escri#iendo para corregir
alg5n error antes de plsar .Enter.
Para qe lo qe escri#a el sario no salga ,sto pegado al te8to de la pregnta lo qe se sele !acer es
escri#ir n espacio en #lanco al Fnal dentro de las comillas.
Si escri#imos...
I'PGT .I()mo te llamasK.0+aria#leU
El resltado desp9s de qe el sario termine de escri#ir ser2a
I()mo te llamasKVanma
Pero si lo ponemos con el espacio al Fnal...
I'PGT .I()mo te llamasK .0+aria#leU
El resltado es parecido pero se +e me,or
I()mo te llamasK Vanma
Ca +aria#le tiene qe ser del tipo correcto0 si le pedimos al sario qe escri#a na pala#ra0 la +aria#le
de#e de ser de tipo cadena - si no tendr$ qe ser de tipo nm9rico con o sin decimales.
Si solo ponemos la +aria#le0 sin pregnta al sario0 aparecer$ n interrogante. Es decir0 si ponemos...
I'PGT nom#rec+aria#le
Aparecer$ en la pantalla
Kc
Para qe no apare*ca indicaci)n algna0 solo el crsor0 !a- qe poner las comillas +ac2as0 por e,emplo...
I'PGT ..0 nom#rec+aria#le
Esto pede ser 5til cando la pregnta qe !acemos al sario incl-e alg5n c$lclo o e8presi)n de
cadena. (omo IMPGT no permite e+alar e8presiones en la pregnta al sario0 esta pregnta !a#r$ qe
mostrarla antes en na instrcci)n PRI'T normal de las qe +eremos m$s adelante con s pnto - coma
al Fnal0 - a continaci)n poner el impt de esta ;orma para leer la in;ormaci)n del sario.
1.%." - (O'TROC 1E SABOTAVES
(on estas instrcciones pede pasar qe el sario escri#a cosas no +$lidas0 -a sea por descido o para
intentar pro+ocar n ;allo en el programa. M$s adelante +eremos como asegrarnos0 por e,emplo de qe
si le pedimos el d2a del mes no peda escri#ir %BQ0 en este apartado solo +amos a +er lo qe !ace QBasic
en sitaciones qe en otros lenga,es podr2an dar n error.
IQ9 ocrre si el sario plsa la tecla Enter sin !a#er escrito nadaK
Si la +aria#le es de te8to se almacenar$ en ella na cadena de longitd cero0 es decir ...
Si la +aria#le era de calqier tipo nm9rico se almacenar$ en ella el n5mero cero.
IQ9 ocrre si el sario escri#e letras cando le pedimos n n5meroK
I'PGT .Escri#e n n5meroH .0+aria#le
PRI'T +aria#le
En otros lenga,es se prodcir2a n error. QBasic saca n r)tlo qe pone .Empe*ar ne+amente. - nos
+el+e a repetir la pregnta0 !asta qe no escri#amos n n5mero no segimos.
Escri#e n n5meroH 'o qiero
Empe*ar ne+amente
Escri#e n n5meroH Qe no@
Empe*ar ne+amente
Escri#e n n5meroH 2
2
Si el sario escri#e n n5mero cando le pedimos letras se garda el n5mero como te8to en la +aria#le
de tipo cadena0 no podr$ ser sado directamente para !acer operaciones matem$ticas.
IQe ocrre si el sario escri#e n n5mero m- grandeK
I'PGT .Escri#e n n5meroH .0+aria#le[
PRI'T +aria#le[
Si el +alor escrito no ca#e en la +aria#le aparece n r)tlo de .1es#ordamiento. - se repite la pregnta
!asta qe el n5mero qepa. Recordemos como e,emplo qe en las +aria#les de tipo entero el +alor
m$8imo es "2YZYH
Escri#e n n5meroH ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
1es#ordamiento
Empe*ar ne+amente
Escri#e n n5meroH "2YZ]
1es#ordamiento
Empe*ar ne+amente
Escri#e n n5meroH "2QQQ
"2QQQ
I? si el sario escri#e algo qe llega al e8tremo derec!o de la pantallaK
Se sige escri#iendo en la sigiente l2nea por la i*qierda. QBasic no le de,ar$ de escri#ir m$s de 2BZ
caracteres.
IQe ocrre si el sario escri#e decimales cando se le pide n n5mero enteroK
I'PGT .Escri#e n n5mero enteroH .0+aria#le[
PRI'T +aria#le[
QBasic redondear$ el +alor al gardarlo en la +aria#le entera0 si la parte decimal es menor qe Q0B se
qitan los decimales0 si es igal o ma-or qe Q0B se amenta na nidad0 igal qe !ac2amos para
con+ertir de Pesetas a Eros.
Escri#e n n5mero enteroH %.%
%
Escri#e n n5mero enteroH %.%]]
%
Escri#e n n5mero enteroH %.B
B
Escri#e n n5mero enteroH %.B]
B
Recordemos qe en MS-1OS 'ormalmente se tili*a el pnto como separador decimal. Si escri#imos na
coma QBasic se creer$ qe estamos escri#iendo letras - nos repetir$ la pregnta.
Escri#e n n5meroH Z02
Empe*ar ne+amente
Escri#e n n5meroH Z.2
Z
1.%.% - SACI1A. ES(RIBIR E' PA'TACCA
(omo -a !emos dic!o0 la ;orma m$s #$sica de dar al sario los resltados de nestro programa es a
tra+9s de la pantalla.
En temas posteriores se e8plica como consegir crear las pantallas de los programas para qe cada cosa
apare*ca en n sitio determinado - con distintos colores0 recadros0 etc0 pero por a!ora para aprender a
programar nos limitaremos a escri#ir cosas na de#a,o de otra como en MS-1OS.
Gsaremos la pantalla de te8to de ;orma qe cando llegemos a escri#ir en la l2nea m$s #a,a de la
pantalla todo s#ir$ !acia arri#a - desaparecer$ lo qe !#iera en la primera l2nea.
Para aclarar la pantalla - no liarnos con lo anterior !emos pesto en todos los e,emplos (CS como
primera instrcci)n para qe se #orre de la pantalla lo qe !#iera de e,ecciones anteriores del
programa actal o de otro0 - se empiece a escri#ir en la parte sperior.
A!ora +amos a +er con m$s detalle la instrcci)n PRI'T qe es la qe samos parara escri#ir en la
pantalla.
Gna aclaraci)n. Si a algien le parece qe PRI'T signiFca imprimir tiene ra*)n0 en in;orm$tica a escri#ir
en la pantalla del ordenador tam#i9n se le pede llamar imprimir en pantalla. Adem$s esta orden PRI'T
tam#i9n se tili*a para imprimir como se +er$ m$s adelante.
Ca sinta8is de la instrcci)n esH
PRI'T te8to
1onde te8to pede ser na cadena de caracteres entre comillas0 qe se escri#ir$ tal cal.
PRI'T .Esto es n te8to.
O el nom#re de na +aria#le.
mensa,eU ^ .Pre#a sperada.
PRI'T mensa,eU
En este caso se escri#ir$ el +alor de qe tenga la +aria#le0 en nestro e,emplo se escri#ir2a Pre#a
Sperada.
Ca +aria#le tam#i9n pede ser de tipo nm9rico...
PRI'T total[
Tam#i9n podemos escri#ir el resltado de operaciones matem$ticas...
PRI'T 2d2
En este caso se escri#ir$ %. Cas operaciones matem$ticas :E8presiones= las +eremos con detalle en el
tema sigiente.
1esp9s de escri#ir algo el crsor :in+isi#le= pasa a la l2nea de a#a,o0 por e,emplo
PRI'T .Gno.
PRI'T .1os.
PRI'T .Tres.
Escri#ir2a...
Gno
1os
Tres
Pero en alg5n caso nos pede interesar qe no sea as2 - qe se escri#a lo sigiente a continaci)n en la
misma l2nea. Para !acerlo no tenemos m$s qe escri#ir n pnto - coma al Fnal de la instrcci)n so#re
la qe qeremos segir0 por e,emploH
PRI'T .Gno.L
PRI'T .1os.L
PRI'T .Tres.
PRI'T .(atro.
Escri#ir2a...
Gno1osTres
(atro
'ormalmente en na instrcci)n PRI'T se selen escri#ir +arias cosas0 como +imos en el programa
saldador qe primero escri#2a la pala#ra /ola - desp9s nestro nom#re qe esta#a almacenado en la
+aria#le nom#reU. Para !acer esto no !a- m$s qe separar con pnto - coma :L= las distintas .cosas. qe
qeremos escri#ir0 por e,emploH
nom#rePrograma ^ .Sper Vego.
nom#reGsario ^ .VM.
PRI'T ./ola .L nom#reGsarioL .0 #ien+enido a .L nom#rePrograma
Escri#ir2a...
/ola VM0 #ien+enido a Sper Vego
O#ser+a qe los espacios entre pala#ras !a- qe ponerlos en alg5n sitio dentro de las comillas0 de lo
contrario saldr2a todo ,nto0 inclso algna +e* es necesario !acer...
PRI'T na>aria#leU L . .L otra>aria#leU
...para qe no salga todo ,nto.
A!ora +amos a pro#ar con estoH
PRI'T 2L "L %
>isto la anterior0 el resltado tendr2a qe ser...
2"%
pero no0 es
2 " %
QBasic escri#e siempre los n5meros con n espacio delante - otro detr$s. Co qe !a escrito e8actamente
esH Espacio 2 Espacio Espacio " Espacio Espacio % Espacio0 el 5ltimo espacio no lo +emos pero tam#i9n lo
!a escrito.
Gna consecencia de esto ser$ qe los n5meros por a!ora nnca +an a salir ,sto en la parte i*qierda
de la pantalla0 sino na posici)n m$s adelante0 por e,emplo...
PRI'T .Pre#a.
PRI'T 2B
PRI'T Y%
PRI'T .Ain pre#a.
Escri#ir2a...
Pre#a
2B
Y%
Ain Pre#a
Pero de esto no nos tenemos qe preocpar. Si intentamos arreglarlo +amos a complicar nestros
programas innecesariamente. ?a !a#r$ tiempo de di#,ar pantallas en los temas de ampliaci)n.
Gna cosa qe s2 podemos !acer -a es sar lo qe se llama .Posiciones de ta#laci)n.. Esto es qe QBasic
di+ide cada l2nea de la pantalla en posiciones qe comien*an cada 1% caracteres0 la primera en la
posici)n 10 la segnda en la 1%0 la tercera en la 2D0 etc. ? si nosotros separamos las e8presiones de la
orden PRI'T con comas en +e* de pntos - comas los te8tos se escri#ir$n en estas posiciones en +e* de
,sto pegado a la anterior. >amos con n e,emploH
PRI'T .Gno.0 .1os.0 .Tres.
PRI'T .(atro.0 .(inco.0 .Seis.
PRI'T .Siete.0 .Oc!o.0 .'e+e.
Qe escri#ir2a en pantalla...
Gno 1os Tres
(atro (inco Seis
siete Oc!o 'e+e
Esto ser$ m- 5til en los listados qe +eremos m$s adelante. Por spesto en na misma instrcci)n
podemos separar nas cosas con comas - otras con pntos - comas0 seg5n !aga ;alta.
TEMA 1.B
OPERA1ORES ? EXPRESIO'ES
1.B.1 - Introdcci)n a los operadores
1.B.2 - Operador de asignaci)n
1.B." - (ontadores - acmladores
1.B.% - Operadores aritm9ticos
1.B.B - Operadores relacionales o de comparaci)n
1.B.Z - Operadores l)gicos
1.B.1 - Introdcci)n a los operadores
En este tema +amos a +er como constrir las e8presiones matem$ticas - l)gicas necesarias para qe
nestros programas sea capaces de !acer c$lclos.
Gna e8presi)n ser2a lo eqi+alente a las ;)rmlas qe escri#imos en na !o,a de c$lclo :E8cel=0 es decir
na scesi)n de n5meros0 operadores :signos m$s0 menos0 etc.= - nom#res de +aria#les0 entre otras
cosas0 colocados en el orden correcto.
1.B.2 - Operador de asignaci)n
Co primero qe +amos a +er en este tema es n operador qe nos permita gardar .algo. en na
+aria#le.
En el programa Saldador para gardar nestro nom#re en la +aria#le nom#reU s$#amos directamente
la instrcci)n I'PGT qe se encarga#a de leer los datos del teclado - gardarlos directamente en la
+aria#le. Aq2 no emple$#amos el operador de asignaci)n0 pero desp9s !emos !ec!o cosas comoH
mensa,eU ^ .Pre#a sperada.
o al declarar las constantes !ac2amosH
(O'ST i+a ^ 1Z
En estos e,emplos se pede +er qe !emos sado el signo Igal para .Asignar. a la +aria#le qe !a- a s
i*qierda el +alor de la .E8presi)n. qe !a- a s derec!a0 por lo tanto -a podemos decir qe el signo
igal es el operador de asignaci)n en el lenga,e Basic.
En el caso m$s sencilloH
total ^ BQQ
!acemos qe en la +aria#le total se almacene el n5mero BQQ0 perdi9ndose el +alor qe t+iera
anteriormente.
Tam#i9n podemos !acerH
total ^ total d 1QQ
En este caso estamos sando la +aria#le total como n .acmlador. -a qe +amos a almacenar en ella
el +alor qe tenga antes de la asignaci)n m$s cien. 1ic!o de otra ;orma0 si la +aria#le +al2a BQQ a!ora le
+amos a almacenar s +alor de BQQ m$s 1QQ0 con lo qe al Fnal de la asignaci)n pasar$ a +aler ZQQ. En
el sigiente apartado se e8plican algnas cosas so#re estas asignaciones.
Es importante tener claro qe a na +aria#le solo le podemos asignar los datos adecados a s tipo0 por
e,emplo si a na +aria#le de cadena le asignamos na e8presi)n nm9rica o a na +aria#le nm9rica le
asignamos na cadena se prodcir$ n Error de Tiempo de E,ecci)n - el programa se parar$.
Tam#i9n !a- qe tener en centa qe si a na +aria#le de tipo entero le asignamos na e8presi)n c-o
+alor es con decimales0 el n5mero almacenado se redondear$0 por e,emplo...
nm[ ^ 1Q a "
!ar$ qe nm[ +alga " en +e* de ".""""0 igal qe
nm[ ^ 2Q a "
!ar$ qe nm[ +alga Y en +e* de Z.ZZZZ. Esta +e* se !a redondeado !acia arri#a.
Tiene qe qedar claro qe la +aria#le .destino. siempre +a a la i*qierda del signo igal0 - la e8presi)n
a la derec!a.
Cas e8presiones nnca +an a ir solas. Siempre +an en na asignaci)n o en na estrctra condicional qe
-a +eremos m$s adelante.
1.B." - (ontadores - acmladores
Estas dos pala#ras se san mc!o en programaci)n para re;erirse a +aria#les qe +an incrementando s
+alor a lo largo de la e,ecci)n del programa.
'ormalmente ser$n de tipo nm9rico - no se tratan de ningna ;orma en especial0 solo qe al asignarles
n +alor se !ace de ;orma qe el anterior no se pierda0 por e,emploH
ni+el ^ ni+el d 1
total ^ total d s#totalCinea
+idas ^ +idas - 1
tamaEo ^ tamaEo ` 2
Es m- importante iniciali*arlas de ;orma correcta sigiendo estas normasH
Si +amos a smar o restar la iniciali*aremos a cero al principio del programa para qe no empiecen con
+alores residales.
Si +amos a mltiplicar las iniciali*amos a 10 porqe si +alen cero todo lo qe mltipliqemos por ella
segir$ +aliendo cero.
Ca di;erencia entre acmladores - contadores es qe los acmladores se incrementan con calqier
n5mero0 como por e,emplo el total de na ;actra0 mientras qe los contadores se incrementan siempre
con el mismo n5mero0 normalmente 1.
1.B.% - Operadores aritm9ticos
Clamamos operadores aritm9ticos a los signos qe saremos para !acer operaciones aritm9ticas como
smas0 restas0 etc.
OPERA1OR 'OMBRE
d Sma
- Resta
` Mltiplicaci)n
a 1i+isi)n
MO1 Resto de di+isi)n :M)dlo=
e Potencias
El operador sma lo qe !ace es smar +alores. Se peden encadenar tantas smas como qeramos0
por e,emplo
total ^ 2 d Y% d Y d 2B d D2
El operador resta resta n +alor a otro0 por e,emploH
neto ^ peso - tara
El operador asterisco !ace mltiplicaciones0 por e,emploH
el1o#le ^ n ` 2
El operador di+isi)n di+ide n +alor entre otro0 por e,emploH
<ilos ^ gramos a 1QQQ
El operador MO1 nos de+el+e el resto de na di+is2)n. Es especialmente 5til para dedcir si n n5mero
es par0 -a qe al di+idir n par entre 2 el resto siempre es Q. Se sa entre los dos operandos igal qe los
s2m#olos anteriores0 +eremos s ;ncionamiento - s tili*aci)n en los temas sigientes.
El operador .acento circnbe,o. sir+e para calclar potencias0 por e,emplo Be2 es cinco al cadrado o
tam#i9n B`B. Tam#i9n podr2amos calclar potencias decimales como %e2.B. Para escri#ir este s2m#olo
plsa ma-5sclas - la tecla correspondiente dos +eces0 oir$s n pitido - solo entonces aparecer$ escrito
en la pantalla. Si aparece dos +eces #orra no.
1.B.B - Operadores relacionales o de comparaci)n
Estos operadores !acen qe na e8presi)n de+el+a n +alor l)gico0 es decir0 en +e* de n n5mero
de+ol+er$ >ER1A1ERO o AACSO. Esto nos ser$ m- 5til en las estrctras condicionales qe +eremos en
los sigientes temas0 d)nde +eremos mc!os e,emplos de s tili*aci)n.
OPERA1OR 'OMBRE
^ Igal
O Ma-or qe
N Menor qe
O^ Ma-or o igal qe
N^ Menor o igal qe
NO 1istinto de
En QBasic el signo igal sir+e tanto para asignaciones como para comparaciones0 pero nnca se
con;nden -a qe QBasic los e+al5a de na otra ;orma seg5n d)nde est9n escritos.
1.B.Z - Operadores l)gicos
Estos operadores tam#i9n de+el+en n +alor >ER1A1ERO o AACSO a partir de los +alores de las dos
e8presiones l)gicas qe nen. Igal qe los anteriores se e8plicar$n en los temas sigientes dedicados a
estrctras condicionales.
OPERA1OR 'OMBRE
A'1 Operador ?
OR Operador O
'OT Operador monario de negaci)n
XOR Operador O e8clsi+o
EQ> Operador de eqi+alencia
IMP Operador de implicaci)n
Cos tres primeros son las pertas l)gicas elementales del $lge#ra de Boole0 los otros se peden constrir
a partir de las anteriores - por eso no selen estar en otros lenga,es de programaci)n - no !a#laremos
de ellos aq2.
A'1 de+el+e +erdadero si las dos e8presiones qe ne son +erdaderas0 en caso contrario de+el+e
;also. Por e,emploH
es'a+idad ^ ::mes ^ 12= A'1 :dia ^ 2B==
Podemos asegrar qe es 'a+idad si el mes es 12 - el d2a es 2B. Si el mes no es diciem#re no ser$
na+idad anqe estemos a 2B0 tampoco si es n d2a de diciem#re distinto de 2B - mc!o menos si ni es
diciem#re ni es 2B. Gsamos por primera +e* los par9ntesis para dar m$s claridad0 m$s adelante se
e8plica c)mo !acerlo.
OR de+el+e +erdadero si algna de las dos e8presiones qe ne es +erdadera0 o las dos lo son. Si las
dos son ;alsas de+el+e ;also0 por e,emploH
pedes(omprar ^ ::t1inero O Q= OR :precio ^ Q==
En este caso la +aria#le pedes(omprar ser2a +erdadero si t dinero es ma-or qe cero :apro+ec!amos
para dar n e,emplo del operador O= o si el precio es gratis0 o las dos cosas. Solo ser2a ;also si no tienes
dinero - el prodcto a comprar +ale dinero0 con lo qe las dos partes de la e8presi)n ser2an ;alsas - el
resltado tam#i9n.
'OT es n operador .monario.. Esto signiFca qe s)lo tiene n operando0 a di;erencia de los otros qe
siempre est$n entre dos operandos. Co qe !ace 'OT es in+ertir el resltado de na e8presi)n0 es decir0
si es +erdadera de+el+e ;also - si es ;alsa de+el+e +erdadero.
Para detallar los posi#les +alores qe de+el+en los operadores l)gicos se constr-en las llamadas
.Ta#las de la +erdad. qe representan todas las com#inaciones posi#les - los +alores de+eltos por cada
operador.
TABCA 1E CA >ER1A1 PARA A'1
>ER1A1ERO A'1 >ER1A1ERO ^ >ER1A1ERO
>ER1A1ERO A'1 AACSO ^ AACSO
AACSO A'1 >ER1A1ERO ^ AACSO
AACSO A'1 AACSO ^ AACSO
TABCA 1E CA >ER1A1 PARA OR
>ER1A1ERO OR >ER1A1ERO ^ >ER1A1ERO
>ER1A1ERO OR AACSO ^ >ER1A1ERO
AACSO OR >ER1A1ERO ^ >ER1A1ERO
AACSO OR AACSO ^ AACSO
TABCA 1E CA >ER1A1 PARA 'OT
'OT >ER1A1ERO ^ AACSO
'OT AACSO ^ >ER1A1ERO
O#ser+a qe la +aria#le pedes(omprar - la es'a+idad del e,emplo anterior peden ser de calqier tipo
nm9rico para poder ser +erdaderas o ;alsas. QBasic entiende qe na +aria#le :o el resltado de na
e8presi)n= es ;alsa si +ale Q - +erdadera en calqier otro caso. Otros lenga,es tienen n tipo de datos
espec2Fco para estas sitaciones0 pero aq2 pede +aler calqier tipo de datos nm9rico.
Es normal declarar constantes al principio de los programas para poder sar las pala#ras >ER1A1ERO -
AACSO en las e8presiones - darle m$s claridad. Se !ar2aH
(O'ST AACSO ^ Q
pero para +erdadero podemos !acer...
(O'ST >ER1A1ERO ^ 'OT AACSO
con lo qe !acemos qe >ER1A1ERO sea ,sto lo contrario de AACSO. M- l)gico.
TEMA 1.Z
AG'(IO'ES I'(CGI1AS E' EC CE'&GAVE
El lenga,e BASI( incl-e n mont)n de ;nciones qe nos !ar$n algnos c$lclos sin necesidad de tener
qe programar nosotros todo lo necesario.
Gna ;nci)n es na pala#ra qe0 insertada dentro de na e8presi)n0 llama a n peqeEo .programita.
qe !ace los c$lclos - nos de+el+e n resltado. >eamos este e,emploH
(CS
I'PGT .Escri#e n n5meroH .0 nm
rai* ^ SQR:nm=
PRI'T .S ra2* cadrada es .Lrai*
Este programa nos pide qe escri#amos n n5mero - lo garda en la +aria#le nm. A continaci)n
calcla la ra2* cadrada del n5mero sando la ;nci)n SQR - galda el resltado en la +aria#le rai* para
al Fnal escri#irlo en pantalla. 'o !emos tenido qe programar ni conocer las operaciones m$tem$ticas
necesarias para calclar la ra2* cadrada de n n5mero0 lo !a !ec!o atom$ticamente la ;nci)n.
O#ser+a la ;orma de decirle a la ;nci)n cal es el n5mero qe qeremos qe tilice para calclar la ra2*
cadradaH Co metemos entre par9ntesis desp9s del nom#re de la ;nci)n. Este n5mero se dice qe es
n Par$metro qe pasamos a la ;nci)n. Si algna ;nci)n no necesita par$metros no ponemos nada0 en
otros lenga,es !a- qe poner los par9ntesis +ac2os detr$s del nom#re de la ;nci)n0 pero en QBasic no.
El par$metro no tiene por qe ser n n5mero constante0 pede ser a s +e* otra e8presi)n.
En la instrcci)n PRI'T podemos inclir calqier e8presi)n0 por lo tanto en el e,emplo anterior nos
pod2amos !a#er a!orrado la +aria#le rai* escri#iendo directamenteH
(CS
I'PGT .Escri#e n n5meroH .0 nm
PRI'T .S ra2* cadrada es .L SQR:nm=
Cas ;nciones tienen tipo de datos como las +aria#les0 es decir0 nos de+el+en n resltado qe pede
ser cadena0 entero0 etc. - por lo tanto peden lle+ar n sF,o de identiFcaci)n de tipo a continaci)n del
nom#re0 por e,emplo la ;nci)n TIMER nos de+el+e el n5mero de segndos qe !an pasado desde las
doce de la noc!e en ;ormato nm9ricoH
segndos ^ TIMER
mientras qe la ;nci)n TIMEU nos de+el+e la !ora actal en ;ormato de cadena de te8to con la !ora0
los mintos - los segndos separados por dos pntosH
!oraActalU ^ TIMEU
PRI'T .Son las .L !oraActalU
En este caso para gardar el +alor de+elto por TIMEU !emos tenido qe sar na +aria#le de cadena.
Am#as ;nciones no lle+an par$metros porqe si lo qe !acemos es pregntar la !ora no tenemos qe
decir nada m$s0 -a la propia ;nci)n +er$ como saca la !ora del relo, interno del ordenador.
Si na ;nci)n lle+a +arios par$metros se pondr$n separados por comas dentro de los par9ntesis0 por
e,emploH
PRI'T STRI'&U :2Q0.f.=
Ca ;nci)n STRI'&U de+ol+er$ na cadena con +einte *etas0 es decir .ffffffffffffffffffff.. Para
!acerlo necesita sa#er dos cosasH cantas - cal letra tiene qe repetir0 por eso le damos dos
par$metros separados por na coma.
O#ser+a tam#i9n en el e,emplo qe el primer par$metro de#e de ser n n5mero :o na e8presi)n
nm9rica= - el segndo tiene qe ser na cadena :o na e8presi)n de cadenas=. Para sa#er de qe tipo
es cada par$metro - el tipo del resltado qe de+el+e la ;nci)n es m- importante consltar la a-da
de QBasic todas las +eces qe !aga ;alta. Si intentamos pasar par$metros de otro tipo se prodcir$ n
error de tipos - el programa se parar$.
Tam#i9n se prodcir$ n error de .Clamada a ;nci)n no +$lida. si la ;nci)n no es capa* de !acer los
c$lclos con los par$metros qe le !emos pasado0 anqe sean del tipo correcto. Por e,emplo0 sa#emos
qe no e8iste ra2* cadrada para los n5meros menores qe cero0 por lo qe se prodcir$ n error de este
tipo si !acemos
PRI'T SQR :-1%=
En caso de qe pasemos como par$metro na e8presi)n0 por e,emplo
PRI'T SQR:mi>aria#le=
!a- qe tener mc!o cidado de qe esta e8presi)n no peda llegar a +aler menos qe cero.
Estas son algnas de las ;nciones m$s sadas. En temas posteriores ir$n apareciendo m$s. Para +erlas
todas - todos los tipos de datos qe necesitan - de+el+en mira la a-da del QBasic.
AG'(IT' 1ES(RIP(IT' EVEMPCO
SQR:nm= Ra2* cadrada SQR:1Z= de+el+e %
I'T:decimal= Pasa a entero qitando decimales I'T:1.Z= de+el+e 1
(I'T:decimal= Redondea a entero :Ma8 ^ "2YZY= (I'T:10Z= de+el+e 2
(C'&:decimal= Redondea a entero largo (C'&:1QQQQQ.2= de+el+e 1QQQQQ
SI':nm= (alcla el seno SI':%Q= de+el+e Q.Z%2YD
(OS:nm= (alcla el coseno(OS:%Q= de+el+e Q.YZZQ%
TA':nm= (alcla la tangente TA':%Q= de+el+e Q.D"]QQ]
CE':(adena= 1e+el+e la longitd de la cadena CE':.RO'1A.= de+el+e B
RTRIM:(adena= 1e+el+e na cadena sin espacios al Fnal RTRIM:.Ain. .= de+el+e .Ain..
G(ASEU:(adena= 1e+el+e la cadena pasada a ma-5sclas :'o ;nciona col la E ni con los acentos=
G(ASEU:.Toma (astaEa.= de+el+e .TOMA (ASTAEA.
MI1U:(adena0 inicio0 largo= 1e+el+e na s#cadena del tamaEo indicado a parir de la posici)n
indicada. MI1U:.Programaci)n.0B0%= de+el+e .rama.
STRI'&U:largo0 car$cter= 1e+el+e na cadena ;ormada por n n5mero de caracteres repetidos
STRI'&U:1Q0.M.= de+el+e .MMMMMMMMMM.
TIMEU 1e+el+e la !ora actal como cadena 1e+el+e por e,emplo .1ZH%BHQD.
1ATEU 1e+el+e la ;ec!a actal como cadena en ;ormato mes-dia-aEo 1e+el+e por e,emplo
.Q1-2Q-2QQD.
I'gE?U 1e+el+e la letra de la 5ltima tecla plsada antes de llegar a e,ectar la ;nci)n.
1e+ol+er2a .A. si la 5ltima tecla plsada ;e la .A ma-5scla.
En na de las ampliaciones de este crso se !a#la de n con,nto de ;nciones m- 5tiles para el
mane,o de cadenas - en otro se e8plica en detalle la ;nci)n I'gE?U qe es especialmente 5til para
detectar teclas plsadas en men5s0 ,egos0 pregntas qe se responden con s2 o no0 etc.
TEMA 1.Y
ESTRG(TGRAS (O'1I(IO'ACES IA
1.Y.1 - Introdcci)n a los #loqes de control
1.Y.2 - Alternati+a simple. Instrcci)n IA
1.Y." - Sangr2a
1.Y.% - Anidaci)n
1.Y.B - Instrcci)n IA simpliFcada
1.Y.Z - Alternati+a do#le. Instrcci)n IA-T/E'-ECSE
1.Y.Y - Alternati+a m5ltiple. Instrcci)n ECSEIA
1.Y.1 - I'TRO1G((IT' A COS BCOQGES 1E (O'TROC
/asta a!ora al e,ectar nestros programas se !an e,ectado todas las instrcciones qe aparecen en el
listado del c)digo ;ente del programa0 desde la primera !asta la 5ltima.
A partir de a!ora +amos a poder consegir qe na o +arias instrcciones solo se llegen a e,ectar si se
cmple na condici)n0 qe si no se cmple se e,ecten otras0 o inclso qe algnas instrcciones se
e,ecten m$s de na +e* :Esto lo +eremos en los sigientes temas=.
1.Y.2- ACTER'ATI>A SIMPCE. I'STRG((IT' IA
Empecemos con n e,emplo. Gn programa qe nos pida la nota de n e8amen - nos ;elicite si est$
apro#ado.
(CS
I'PGT .Escri#e la nota del e8amenH .0 nota
IA nota O^ B T/E'
PRI'T .En!ora#ena0 !as apro#ado..
E'1 IA
PRI'T .&racias por sar el programa..
A!ora e,ectemos el programa. /emos sacado n YH
Escri#e la nota del e8amenH Y
En!ora#ena0 !as apro#ado.
&racias por sar el programa.
>ol+amos a lan*ar el programa0 esta +e* !emos sacado n %H
Escri#e la nota del e8amenH %
&racias por sar el programa.
Esta 5ltima +e* se !a saltado na de las instrcciones del listado IPor q9K
Porqe !emos sado la instrcci)n IA :si en ingl9s=0 na de las m$s importantes de todo lenga,e de
programaci)n estrctrado0 - le !emos pesto como condici)n qe el +alor almacenado en la +aria#le
nota sea ma-or o igal qe cinco con lo qe !acemos qe todas las instrcciones qe !a-a entre IA -
E'1 IA solo se e,ecten si esta e8presi)n es >ER1A1ERA.
>amos a +er con m$s tranqilidad la sinta8is de la instrcci)n IA
IA condici)n T/E'
instrcciones
E'1 IA
SI la condici)n es >ER1A1ERA0 E'TO'(ES :T/E'= se e,ectar$n las instrcciones !asta llegar a E'1 IA
:AI' SI=. 1esp9s se segir$ con el resto del programa
Si la condici)n es ;alsa se saltar$ todo el #loqe IA - se e,ectar$n las sigientes instrcciones del
programa qe !a-a desp9s del E'1 IA.
1.Y." - SA'&RWA
En el e,emplo anterior pedes +er qe las instrcciones qe !a- dentro del #loqe IA est$n escritas n
poco m$s a la derec!a qe las dem$s0 no ,sto en el margen i*qierdo.
Esto se !ace por comodidad0 para poder sa#er de n +ista*o cales son las instrcciones qe !a- dentro
del #loqe. En la ma-or2a de lenga,es no es o#ligatorio :En (OBOC s2=0 pero siempre es m-
recomenda#le !acerlo as2 para dar ma-or claridad al c)digo ;ente del programa.
Para !acer esto #asta con plsar la tecla TABGCA1OR antes de escri#ir la instrcci)n0 me,or qe escri#ir
espacios. En las opciones de QBasic se pede especiFcar el tamaEo de la ta#laci)n :(antos espacios
se escri#en=. Por de;ecto tiene D0 pero es me,or n n5mero m$s #a,o entre " - B como -a +eremos m$s
adenante.
Esta t9cnica tam#i9n se conoce como encolmnado o indentaci)n :En ingl9s se llama indent=.
1.Y.% - A'I1A(IT'
(omo !emos +isto en la sinta8is de la instrcci)n IA0 dentro del #loqe de instrcciones a e,ectar se
pede sar calqier instrcci)n0 por lo tanto tam#i9n se peden sar otras instrcciones IA. A esto es a
lo qe se llama anidaci)n de instrcciones. >eamos n e,emplo qe nos diga si n n5mero es par
:sando el operador MO1= - en este caso nos diga tam#i9n si el n5mero es ma-or qe 1QH
(CS
I'PGT .Escri#e n n5meroH .0 nm
IA nm MO1 2 ^ Q T/E'
PRI'T .Es n n5mero par.
IA nm O 1Q T/E'
PRI'T .Es ma-or qe 1Q.
E'1 IA
E'1 IA
E,emplos de la e,ecci)n de este programa peden ser...
Escri#e n n5meroH Y
Escri#e n n5meroH D
Es n n5mero par
Escri#e n n5meroH 12
Es n n5mero par
Es ma-or qe 1Q
Aq2 si la primera condici)n se cmple se escri#e .Es par. - adem$s se !ace otra compro#aci)n qe se
podr$ cmplir o no. 'nca se +a a llegar a la segnda compro#aci)n si la primera no se !a cmplido.
Es m- importante o#ser+ar qe cada IA lle+a s E'1 IA correspondiente - qe el #loqe de
instrcciones del segndo IA est$ encolmnado toda+2a m$s a la derec!a qe el anterior.
(ando escri#imos n programa en papel es com5n nir con na l2nea cada IA con s E'1 IA para aclarar
el listado.
1.Y.B - I'STRG((IT' IA SIMPCIAI(A1A
Si el #loqe de instrcciones de na instrcci)n IA s)lo +a a lle+ar na instrcci)n podemos escri#irla en
la misma l2nea detr$s del T/E' - a!orrarnos el E'1 IA.
Para el e,emplo del e8amen pod2amos !a#er !ec!oH
(CS
I'PGT .Escri#e la nota del e8amenH .0 nota
IA nota O^ B T/E' PRI'T .En!ora#ena0 !as apro#ado..
PRI'T .&racias por sar el programa..
Esto es 5til en algnos casos0 pero si +emos qe nos +amos a liar es me,or poner el E'1 IA como !emos
+isto antes0 anqe si nos acostm#ramos a poner siempre los encolmnados no !a- por q9
eqi+ocarse.
1.Y.Z - ACTER'ATI>A 1OBCE.
I'STRG((IT' IA-T/E'-ECSE
En el e,emplo del e8amen estar2a #ien qe .si no. apre#a0 decirle qe !a sspendido. Co podemos !acer
de esta ;ormaH
(CS
I'PGT .Escri#e la nota del e8amenH .0 nota
IA nota O^ B T/E'
PRI'T .En!ora#ena0 !as apro#ado..
ECSE
PRI'T .Co siento0 !as sspendido..
E'1 IA
PRI'T .&racias por sar el programa..
En este caso se compre#a la condici)n del IA. Si es +erdadera se e,ecta s #loqe de instrcciones -
desp9s se sige con lo qe +enga detr$s del E'1 IA0 igal qe antes. A!ora +iene lo ne+o0 si la
condici)n no se cmple se e,ecta el #loqe de instrcciones del ECSE !asta el E'1 IA0 - desp9s se
sige con lo qe !a-a detr$s.
1e esta ;orma nos asegramos de qe siempre se e,ecta no - solo no de los dos #loqes de
instrcciones seg5n la condici)n sea +erdadera o ;alsa.
1entro del #loqe del ECSE tam#i9n pede ir calqier tipo de instrcci)n0 inclido otro #loqe IA o del
tipo qe sea.
>eamos n e,emplo .especialmente malo. de n programa qe nos diga el nom#re de n mes a partir de
s n5mero. En temas posteriores simpliFcaremos #astante este pro#lema.
(CS
I'PGT .Escri#e el n5mero del mesH .0 mes
IA mes ^ 1 T/E'
PRI'T .Enero.
ECSE
IA mes ^ 2 T/E'
PRI'T .Ae#rero.
ECSE
IA mes ^ " T/E'
PRI'T .Mar*o.
ECSE
IA mes ^ % T/E'
PRI'T .A#ril.
ECSE
IA mes ^ B T/E'
PRI'T .Ma-o.
ECSE
IA mes ^ Z T/E'
PRI'T .Vnio.
ECSE
IA mes ^ Y T/E'
PRI'T .Vlio.
ECSE
IA mes ^ D T/E'
PRI'T .Agosto.
ECSE
IA mes ^ ] T/E'
PRI'T .Septiem#re.
ECSE
IA mes ^ 1Q T/E'
PRI'T .Oct#re.
ECSE
IA mes ^ 11
T/E'
PRI'T
.'o+iem#re.
ECSE
IA mes ^ 12
T/E'
PRI'T
.1iciem#re.
ECSE
PRI'T .Mes no +$lido.
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
E'1 IA
PRI'T .SSA(ABT.
M- sencilloH Si es enero lo escri#imos0 si no miramos si es ;e#rero0 si no a +er si es mar*o0 etc. as2 !asta
diciem#re. Si no es diciem#re sacamos n mensa,e de mes no +$lido. O#ser+a qe cada IA tiene s ECSE
- s E'1 IA correspondiente a#a,o.
'ormalmente nnca llegaremos a estas estrctras tan anidadas0 pero aq2 se pede +er la importancia
de qe el tamaEo de ta#laci)n no sea m- grande.
O#ser+a qe si !aces qe la +entana del na+egador sea m$s estrec!a podr2a pasar :seg5n los
programas= qe algnas l2neas de las m$s largas pasan a#a,o - se nos estropea toda nestra ,erarq2a.
En QBasic - en los otros editores de programaci)n esto no ocrre porqe no tienen salto de l2nea
atom$tico para qe no pase eso0 pero de todas ;ormas es m- inc)modo tener qe ir mo+iendo la #arra
de despla*amiento !ori*ontal a i*qierda - derec!a para +er nestro listado.
1.Y.Y - ACTER'ATI>A MhCTIPCE.
I'STRG((IT' ECSEIA
>amos a arreglar n poco el e,emplo anterior para no tener tantos E'1 IA.
(CS
I'PGT .Escri#e el n5mero del mesH .0 mes
IA mes ^ 1 T/E'
PRI'T .Enero.
ECSEIA mes ^ 2 T/E'
PRI'T .Ae#rero.
ECSEIA mes ^ " T/E'
PRI'T .Mar*o.
ECSEIA mes ^ % T/E'
PRI'T .A#ril.
ECSEIA mes ^ B T/E'
PRI'T .Ma-o.
ECSEIA mes ^ Z T/E'
PRI'T .Vnio.
ECSEIA mes ^ Y T/E'
PRI'T .Vlio.
ECSEIA mes ^ D T/E'
PRI'T .Agosto.
ECSEIA mes ^ ] T/E'
PRI'T .Septiem#re.
ECSEIA mes ^ 1Q T/E'
PRI'T .Oct#re.
ECSEIA mes ^ 11 T/E'
PRI'T .'o+iem#re.
ECSEIA mes ^ 12 T/E'
PRI'T .1iciem#re.
ECSE
PRI'T .Mes no +$lido.
E'1 IA
PRI'T .SSA(ABT.
A la Pala#ra (la+e ECSE le !emos colocado directamente la otra condici)n para simpliFcar n poco el
Algoritmo0 pero +iene a ser pr$cticamente lo mismo. >eamos la sinta8is de ;orma n poco m$s claraH
IA condici)n T/E'
#loqeInstrcciones
ECSEIA otra condici)n T/E'
#loqeInstrcciones
ECSE
#loqeInstrcciones
E'1 IA
Si la condici)n del IA se cmple se e,ectan ss instrcciones - -a est$.
Si no0 se compre#a la condici)n del primer ECSEIA - si es +erdadera se e,ectan ss instrcciones - -a
est$.
Si no0 se compre#a la condici)n del sigiente ECSEIA - si es +erdadera se e,ectan ss instrcciones -
-a est$.
Si la condici)n del 5ltimo ECSEIA no se cmple se e,ecta el #loqe ECSE si e8iste.
Pede !a#er tantos #loqes ECSEIA con s condici)n como sea necesario0 pero solo n #loqe ECSE :o
ningno= al Fnal. Si no !a- #loqe ECSE pede sceder qe no se e,ecte nada porqe no se cmpla
ningna de las condiciones.
Cas condiciones no tienen qe estar relacionadas de ningna ;orma0 aq2 siempre !emos pregntado por
el mes0 pero pod2amos !a#er compro#ado calqier otra cosa0 o poner los meses desordenados.
Esta estrctra ECSEIA no se sa mc!o - no e8iste en algnos otros lenga,es de programaci)n0 en s
lgar se san los IA anidados como +imos en el e,emplo larg2simo anterior o la estrctra SECE(T qe
+eremos en el tema sigiente.
Gna 5ltima cosa antes de aca#ar con los IA. Si escri#imos E'1IA todo ,nto0 QBasic - >isal Basic nos lo
corrigen atom$ticamente. Esto es porqe en algna +ersi)n m- antiga del lenga,e BASI( se escri#2a
as2.
TEMA 1.D
ESTRG(TGRA 1E SECE((IT' SECE(T
En el e,emplo de instrcciones IA anidadas nos sal2a n peda*o de listado para decir el nom#re del mes.
1esp9s lo arreglamos n poco con las instrcciones ECSEIA. A!ora +amos a !acerlo toda+2a n poco
me,or.
(CS
I'PGT .Escri#e el n5mero del mesH .0 mes
SECE(T (ASE mes
(ASE 1
PRI'T .Enero.
(ASE 2
PRI'T .Ae#rero.
(ASE "
PRI'T .Mar*o.
(ASE %
PRI'T .A#ril.
(ASE B
PRI'T .Ma-o.
(ASE Z
PRI'T .Vnio.
(ASE Y
PRI'T .Vlio.
(ASE D
PRI'T .Agosto.
(ASE ]
PRI'T .Septiem#re.
(ASE 1Q
PRI'T .Oct#re.
(ASE 11
PRI'T .'o+iem#re.
(ASE 12
PRI'T .1iciem#re.
(ASE ECSE
PRI'T .Mes no +$lido.
E'1 SECE(T
PRI'T .SSA(ABT.
/emos sado na estrctra ne+aH Ca instrcci)n SECE(T.
Esta estrctra es eqi+alente a las anteriores de IA anidados0 pero es m$s ;$cil de mane,ar - el
programa qeda m$s estrctrado.
Si !as entendido la estrctra IA no te ser$ m- di;2cil entender esta.
Co primero es escri#ir las Pala#ras (la+e SECE(T (ASE segidas de na e8presi)n. Esta e8presi)n es
normalmente simplemente na +aria#le qe pede ser de cadena o nm9rica. En este caso no tiene qe
de+ol+er >ER1A1ERO o AACSO como en los IA -a qe no se san operadores relacionales ni l)gicos0 solo
los aritm9ticos cando !ace ;alta.
A continaci)n para cada resltado posi#le se pone la Pala#ra (la+e (ASE - la e8presi)n a comparar con
la del principio. Si la comparaci)n es +erdadera se e,ecta el #loqe de instrcciones entre este (ASE -
el sigiente - se sale de la estrctra. Si la condici)n es ;alsa se e,ecta el #loqe del (ASE ECSE si
e8iste - si no nada.
Cas e8presiones de los cases se peden poner de na de las sigientes ;ormasH
(ASE 1
Gna e8presi)n :En este caso n n5mero=0 igal qe en el e,emplo.
(ASE 10 20 "
>arias e8presiones separadas por comas.
(ASE 1 TO "
Gn inter+alo de +alores0 am#os inclsi+e0 separados por la pala#ra cla+e TO. En este caso si la e8presi)n
inicial era de tipo entero ser$n +$lidos los resltados 10 2 - "0 pero si era de tipo real ser$n +$lidos todos
los n5meros posi#les entre el 1 - el " como por e,emplo el 1.B1YB12 - el 2.1YB21.
(ASE IS O 2
(ASE IS ^ B
(ASE IS NO D
(ASE IS N^ Z
Gsando operadores relacionales. En el primer e,emplo ser$n +$lidos todos los +alores ma-ores qe 20 en
el segndo s)lo el B0 en el tercero calqiera menos el D - en el 5ltimo los qe sean menor o igal qe Z.
Si se nos ol+ida la pala#ra cla+e IS0 QBasic la escri#ir$ por nosotros.
'ormalmente escri#iremos las e8presiones de los (ASE de la ;orma m$s sencilla posi#le e+itando
inter+alos m- e8traEos - teniendo cidado con los operadores relacionales para no de,arnos .;era.
ning5n +alor posi#le0 pero podemos llegar a escri#ir na estrctra SECE(T tan mal !ec!a como esta sin
qe el programa de ning5n error de e,ecci)n.
SECE(T (ASE n
(ASE 1
(ASE 1
(ASE "
(ASE 2 TO %
(ASE IS N B
(ASE IS N^ B
(ASE NO 1QQ
(ASE 1Z TO "%
E'1 SECE(T
/a- e8presiones repetidas0 +alores qe entran en +arias e8presiones como el "0 n desastre. IQe
ocrrir2a aq2K
Co primero es qe nnca ocrrir2a nada porqe no !emos pesto #loqes de instrcciones en los (ASE0
pero si las !#i9ramos pesto pasar2a lo sigiente. QBasic empie*a a compro#ar por los (ASE !asta qe
encentre no qe le +enga #ien. (ando lo encentra e,ecta s #loqe de instrcciones - sale del
SECE(T (ASE anqe otros #loqes posteriores tam#i9n !#ieran ser+ido. En este caso si el +alor de n es
1 se e,ecta el primer (ASE 10 el segndo no se llega a e,ectar nnca. Si el +alor de n es " se e,ecta el
(ASE " - se sale0 anqe los catro sigientes tam#i9n !#ieran ser+ido. Si el +alor de n es 1QQ no se
e,ecta nada porqe ning5n (ASE sir+e - tampoco !a- n (ASE ECSE.
Cas e8presiones de los cases normalmente ser$n simplemente n5meros :o cadenas= - alg5n inter+alo
algna +e* para poder estar segro de qe se +a a e,ectar siempre el #loqe correcto - nestro
programa +a a ;ncionar #ien.
Entre el SECE(T (ASE - el primer (ASE no pede !a#er nada.
Si los #loqes de instrcciones +an a lle+ar s)lo na instrcci)n sencilla podemos ponerla a continaci)n
de la e8presi)n del (ASE separ$ndola con dos pntos0 por e,emplo nestro e,emplo de los meses
qedar2a as2H
SECE(T (ASE mes
(ASE 1H PRI'T .Enero.
(ASE 2H PRI'T .Ae#rero.
(ASE "H PRI'T .Mar*o.
(ASE %H PRI'T .A#ril.
(ASE BH PRI'T .Ma-o.
(ASE ZH PRI'T .Vnio.
(ASE YH PRI'T .Vlio.
(ASE DH PRI'T .Agosto.
(ASE ]H PRI'T .Septiem#re.
(ASE 1QH PRI'T .Oct#re.
(ASE 11H PRI'T .'o+iem#re.
(ASE 12H PRI'T .1iciem#re.
(ASE ECSEH PRI'T .Mes no +$lido.
E'1 SECE(T
con lo qe consegimos n listado casi la mitad m$s corto.
Por spesto las e8presiones tam#i9n peden ser de cadenasH
I'PGT .Escri#e el nom#re de n peri;9rico del ordenadorH .0 peri;U
SECE(T (ASE peri;U
(ASE .Teclado.0 .Rat)n.
PRI'T .Es n peri;9rico de entrada.
(ASE .Monitor.0 .Impresora.
PRI'T .Es n peri;9rico de salida.
(ASE .M)dem.
PRI'T .Es n peri;9rico de entradaasalida.
(ASE ECSE
PRI'T .Este peri;9rico no lo cono*co.
E'1 SECE(T
? por spesto los #loqes de instrcciones de los (ASE peden contener calqier tipo tipo de
instrcciones anidadas en s interior como #loqes IA0 otro SECE(T0 etc.
Si estos #loqes se !acen m- largos no te asstes0 solcionaremos el pro#lema cando llegemos a
Programaci)n Modlar donde el SECE(T ser+ir$ como men5 para dar entrada a distintos procedimientos
o s#programas.
(asi todos los lenga,es tienen na estrctra eqi+alente a SECE(T0 pero en el caso del lenga,e ( es
#astante mala. /a- qe tener en centa de qe en los lenga,es de los sistemas de #ases de datos :SQC=
e8iste na instrcci)n SECE(T qe no tiene nada qe +er con esto0 sir+e para sacar in;ormaci)n de las
#ases de datos.
TEMA 1.]
ESTRG(TGRA 1E REPETI(IT' AOR...'EXT
1.].1 - Introdcci)n a las estrctras de control repetiti+as
1.].2 - ()mo detener la e,ecci)n de n programa
1.]." - Instrcci)n AOR...'EXT
1.].1 - Introdcci)n a estrctras de control repetiti+as
En los sigientes temas +amos a +er las instrcciones qe e8isten en la Programaci)n Estrctrada para
consegir qe n #loqe de instrcciones se pedan e,ectar m$s de na +e* sin necesidad de
escri#irlas repetidas en el listado del c)digo ;ente del programa.
En lenga,e ensam#lador - en las +ersiones antigas da BASI( se san instrcciones de tipo &OTO qe
contin5an la e,ecci)n del programa en otra parte0 pero esto da lgar a programas m- reliados :()digo
.espageti.= qe son m- di;2ciles de deprar - peden contener errores. Para solcionar el pro#lema en
la Programaci)n Estrctradas e8isten estrctras de control qe encierran n con,nto de instrcciones
:con na instrcci)n al principio - otra al Fnal= - lo qe !acen es e,ectar el #loqe de instrcciones
entero n n5mero determinado de +eces0 mientras se cmpla na condici)n o !asta qe se cmpla na
condici)n0 seg5n sea la estrctra. A estas estrctras tam#i9n se las conoce como .Bcles. o .Ca*os..
1.].2 - ()mo detener n programa
Al sar estas estrctras nos podemos encontrar con el pro#lema de qe si el programa no est$ escrito
correctamente nnca se salga de la estrctra de control prodci9ndose el e;ecto llamado .Bcle
inFnito. qe pede llegar a #loqear el ordenador.
En n programa normal -a compilado - terminado qe se e,ecte #a,o 6indo7s pede pasar qe el
ordenador se #loqee - apare*ca na pantalla a*l recerdo de Bill &ates de tipo .El sistema est$
ocpado o no responde....0 con lo qe casi segro qe +amos a tener qe reiniciar el ordenador.
En los entornos de programaci)n esto normalmente no llegar$ a ocrrir. En caso de qe nestro
programa se #loqee pede qe se agoten los recrsos del sistema - el programa se detenga dando n
error de tiempo de e,ecci)n - +ol+iendo al editor de c)digo.
Si el programa se qeda #loqeado se pede plsar la sigiente com#inaci)n de teclasH
(ontrol d Pasa
para detener la e,ecci)n del programa - +ol+er al editor de c)digo donde !a#r$ qe repasar el c)digo
para qe esto no ocrra - el programa ;ncione siempre #ien. En algnos casos tras plsar esta
com#inaci)n de teclas !a#r$ qe plsar na +e* la tecla E'TER para des#loqear el programa.
1.]." - Instrcci)n AOR...'EXT
Empecemos con n e,emplo como siempre. >amos a escri#ir n programa qe escri#a los n5meros del 1
al B sando las instrcciones qe -a conocemos.
(CS
PRI'T 1
PRI'T 2
PRI'T "
PRI'T %
PRI'T B
(omo se pede +er es n programa #astante tonto. /a- cinco instrcciones casi igales. Solo cam#ia el
+alor de la e8presi)n qe cada +e* +ale lo qe en la instrcci)n anterior m$s no0 por lo tanto tam#i9n
pod2amos !a#er !ec!o estoH
(CS
n ^ Q
n ^ n d 1
PRI'T n
n ^ n d 1
PRI'T n
n ^ n d 1
PRI'T n
n ^ n d 1
PRI'T n
n ^ n d 1
PRI'T n
Se pede compro#ar qe el resltado es el mismo qe en el programa anterior - a!ora s2 qe tenemos
cinco pares de instrcciones completamente id9nticos. >amos a !acer el mismo programa con la ne+a
instrcci)n AOR :.Para. en castellano=H
(CS
AOR n ^ 1 TO B
PRI'T n
'EXT
?a est$. Mira qe sencillo0 pero a!ora +iene la e8plicaci)n.
Esto lo qe !ace es qe se e,ecte lo qe !a- entre el AOR - el 'EXT cinco +eces sigiendo estos pasosH
Ca primera +e* n +ale 10 como pone en la instrcci)n.
Se e,ecta el #loqe de instrcciones con n +aliendo 1
AGTOMJTI(AME'TE n se incrementa en 10 pasando a +aler 2
Se compre#a qe n es menor o igal qe B0 - como lo es se sige.
Se e,ecta el #loqe de instrcciones con n +aliendo 2
AGTOMJTI(AME'TE n se incrementa en 10 pasando a +aler "
Se compre#a qe n es menor o igal qe B0 - como lo es se sige.
Se e,ecta el #loqe de instrcciones con n +aliendo "
AGTOMJTI(AME'TE n se incrementa en 10 pasando a +aler %
Se compre#a qe n es menor o igal qe B0 - como lo es se sige.
Se e,ecta el #loqe de instrcciones con n +aliendo %
AGTOMJTI(AME'TE n se incrementa en 10 pasando a +aler B
Se compre#a qe n es menor o igal qe B0 - como lo es se sige.
Se e,ecta el #loqe de instrcciones con n +aliendo B
AGTOMJTI(AME'TE n se incrementa en 10 pasando a +aler Z
Se compre#a qe n es menor o igal qe B0 - como -a no lo es se sale del #cle - se e,ecta la
sigiente instrcci)n qe +enga detr$s del 'EXT.
Todo esto pede parecer m- complicado0 pero con la pr$ctica consegiremos qe esta sea na de las
instrcciones m$s ;$ciles de entender de la programaci)n0 s)lo !a#r$ qe detenerse a pensar en estos
pasos cando alg5n programa no !aga lo qe qeremos - no demos con el error.
>eamos la sinta8is de la instrcci)n AORH
AOR contador ^ inicio TO Fnal
#loqeInstrcciones
'EXT
contador es la +aria#le qe saremos como contador :el AOR la modiFca atom$ticamente= - tendr$ qe
ser de tipo nm9rico0 normalmente entero anqe tam#i9n pede ser real. ?a !emos !a#lado de los
contadores en el tema de los operadores de asignaci)n.
inicio es na e8presi)n nm9rica c-o +alor tomar$ el contador la primera +e*.
Fnal es na e8presi)n nm9rica c-o +alor lo sar$ el AOR de ;orma qe solo entrar$ si el contador no
spera al +alor de esta e8presi)n. En nestro e,emplo el Fnal era B - cando el contador :n= llega#a a
+aler Z -a no entr$#amos.
A!ora +amos a +er dos normas m- importantes qe !a- qe segir siempre con los contadores de los
AOR
'o de#emos modiFcar el +alor de esta +aria#le dentro del #cle0 -a lo !ace atom$ticamente la
instrcci)n AOR. 1ic!o de otra ;ormaH 'o de#emos asignar ning5n +alor a esta +aria#le !asta desp9s de
terminar el AOR.
Gna +e* terminado el AOR no de#emos leer el +alor de la +aria#le contador porqe s +alor qeda
indeterminado. Podremos sar esta +aria#le m$s adelante si pre+iamente le asignamos n +alor antes de
intentar leerla.
Estas normas nos las podr2amos saltar sin dar n error de e,ecci)n0 pero pede qe el mismo algoritmo
de distintos resltados en distintas +ersiones de BASI(0 -a qe el contador es mane,ado internamente
por el int9rprete del lenga,e de programaci)n - pede qe no siempre se !aga de la misma ;orma.
Cos +alores inicio - Fn no tienen por qe ser e8presiones constantes. En este e,emplo escri#iremos los
n5meros desde no !asta donde qiera el sarioH
(CS
I'PGT .Escri#e !asta d)nde qieres llegarH .0 ma8
AOR n ^ 1 TO ma8
PRI'T n
'EXT
'o es necesario qe tengamos qe sar siempre el +alor del contador para calclar algo. Este AOR
escri#e ./ec!o en Ronda. siete +ecesH
AOR n ^ 1 TO Y
PRI'T ./ec!o en Ronda.
'EXT
- este !ace e8$ctamente lo mismoH
AOR n ^ D2 TO DD
PRI'T ./ec!o en Ronda.
'EXT
El sigiente escri#e los pares del 2 al 1Q0 es decir0 20 %0 Z0 D0 1Q.
AOR n ^ 1 TO B
PRI'T n ` 2
'EXT
En QBasic !a- na ;orma de !acer esto m$s ;$cilmenteH
AOR n ^ 2 TO 1Q STEP 2
PRI'T n
'EXT
Antes +e2amos qe el AOR incrementa atom$ticamente al contador en 1 en cada pasada. Gsando la
pala#ra cla+e STEP segida de na e8presi)n nm9rica consegimos modiFcar este incremento.
Otro e,emplo con STEP qe se e8plica solo.
(CS
I'PGT .Escri#e n n5meroH .0 s
PRI'T .Estos son los n5meros del Q al 1QQ de .L sL . en .L s
AOR n ^ Q TO 1QQ STEP s
PRI'T n
'EXT
Todo esto ;nciona m- #ien0 espero qe se entienda. Pero pede srgir na dda0 spongamos qe
escri#imos el n5mero Y - el programa escri#e de siete en siete0 dando este resltadoH
Escri#e n n5meroH Y
Estos son los n5meros del Q al 1QQ de Y en Y
Q
Y
1%
21
2D
"B
%2
%]
BZ
Z"
YQ
YY
D%
]1
]D
(omo se pede +er0 no se !a alcan*ado el 1QQ es porqe el sigiente +alor qe ser2a el 1QB -a spera al
1QQ qe es +alor Fnal del AOR - no se e,ecta.
Tam#i9n pede ocrrir qe la e8presi)n del STEP +alga Q. En este caso el AOR incrementar$ en cero el
contador con lo qe nnca se llegar$ al +alor Fnal - se prodcir$ n #cle inFnito. /a#r$ qe plsar
(trldPasa para detener el programa - corregir el c)digo.
A!ora -a podemos !acer qe n AOR ;ncione !acia atr$s0 escri#iendo la e8presi)n Fnal menor qe la
inicial - na e8presi)n negati+a en el STEP. (omo e,emplo n AOR qe escri#a los n5meros del 1Q al 1.
AOR n ^ 1Q TO 1 STEP -1
PRI'T n
'EXT
Si no samos el STEP negati+o - escri#imos el +alor Fnal menor qe el inicial0 nnca se e,ectar$ el
#loqe AOR. Si n programa no ;nciona #ien porqe n AOR no se e,ecta nnca ser$ con+eniente
re+isar esto.
(omo siempre0 dentro del #loqe AOR pede ir calqier tipo de instrcciones0 inclido otro AOR. >eamos
n e,emploH
AOR i ^ 1 TO D
AOR , ^ 1 TO B
PRI'T ./ola.
'EXT
'EXT
I(antas +eces escri#ir$ ./ola. este programaK Si el AOR interior se e,ecta entero D +eces - cada +e*
escri#e ./ola. B +eces0 en total lo !ar$ D por B igal a %Q +eces0 es decir0 el prodcto.
Este tipo de instrcciones son especialmente 5tiles en algoritmos qe -a +eremos m$s adelante como el
recorrido de matrices.
/a- qe tener cidado de no sar la misma +aria#le contador para los dos AOR0 -a qe romper2amos la
regla de no modiFcar el +alor del contador del primer AOR - el programa no ;ncionar2a #ien.
QBasic permite escri#ir a continaci)n del 'EXT el nom#re del contador del AOR0 por e,emploH
AOR i ^ 1 TO D
AOR , ^ 1 TO B
PRI'T ./ola.
'EXT ,
'EXT i
Esto pede ser 5til para sa#er en n listado m- complicado a qe AOR corresponde cada 'EXT0 pero si
encolmnamos correctamente nestro programa esto no ser$ necesario.
El AOR en Basic es #astante be8i#le. En otros lenga,es ;nciona de otra ;orma o inclso pede qe ni
siqiera e8ista0 -a qe como +eremos a continaci)n no es imprescindi#le para constrir n algoritmo.
TEMA 1.1Q
ESTRG(TGRA 1E REPETI(IT' 6/ICE...6E'1
En este tema +amos a +er na estrctra repetiti+a m$s primiti+a qe el PARA -a qe no mane,a
atom$ticamente el contador - por lo tanto es m$s di;2cil de tili*ar0 pero sada corr9ctamente pede
ser #astante m$s be8i#le.
Recordemos el e,emplo de escri#ir los n5meros del 1 al B con la instrcci)n AOR.
AOR n ^ 1 TO B
PRI'T n
'EXT
A!ora +eremos como se !ace lo mismo en QBasic sando la instrcci)n 6/ICE :Mientras=.
n ^ 1
6/ICE n N^ B
PRI'T n
n ^ n d 1
6E'1
Esto lo qe !ace es e,ectar el #loqe de instrcciones :Co qe !a- entre el 6/ICE - el 6E'1= na - otra
+e* mientras se cmpla la condici)n del 6/ICE. Gn poco m$s di;2cil qe con el AOR. >amos a +erlo paso a
pasoH
Gsaremos como contador la +aria#le n - por tanto la tenemos qe iniciali*ar nosotros al +alor qe
qeramos qe tenga la primera +e*0 en este caso 1.
Se compre#a la condici)n del 6/ICEH como n +ale 1 qe es menor o igal qe B0 entramos.
Se e,ectan las instrcciones del #loqe con n +aliendo 1. Ca 5ltima instrcci)n incrementa n en 10 con lo
qe pasa a +aler 2.
>ol+emos al 6/ICE - se compre#a s condici)nH como n +ale 2 qe es menor o igal qe B0 entramos.
Se e,ectan las instrcciones del #loqe con n +aliendo 2. Ca 5ltima instrcci)n incrementa n en 10 con lo
qe pasa a +aler ".
>ol+emos al 6/ICE - se compre#a s condici)nH como n +ale " qe es menor o igal qe B0 entramos.
Se e,ectan las instrcciones del #loqe con n +aliendo ". Ca 5ltima instrcci)n incrementa n en 10 con lo
qe pasa a +aler %.
>ol+emos al 6/ICE - se compre#a s condici)nH como n +ale % qe es menor o igal qe B0 entramos.
Se e,ectan las instrcciones del #loqe con n +aliendo %. Ca 5ltima instrcci)n incrementa n en 10 con lo
qe pasa a +aler B.
>ol+emos al 6/ICE - se compre#a s condici)nH como n +ale B qe es menor o igal qe B0 entramos.
Se e,ectan las instrcciones del #loqe con n +aliendo B. Ca 5ltima instrcci)n incrementa n en 10 con lo
qe pasa a +aler Z.
>ol+emos al 6/ICE - se compre#a s condici)nH como n +ale Z qe -a no es menor o igal qe B0 no
entramos - pasamos a la sigiente instrcci)n qe !a-a detr$s del 6E'1.
Se pede +er qe el ;ncionamiento es parecido al del AOR0 solo qe aq2 lo tenemos qe controlar todo
nosotros. Cas dos reglas qe di,imos so#re los contadores del AOR -a aq2 no tienen sentido porqe de
!ec!o nosotros +amos a tener qe incrementar el contador !aciendo na asignaci)n - na +e*
terminado podemos estar segro del +alor qe tiene la +aria#le.
Gna norma qe s2 con+iene respetar :Anqe no siempre es necesario= es qe la instrcci)n qe
incrementa el contador sea la 5ltima del #loqe0 -a qe si est$ en otro sitio e,ectaremos nas
instrcciones con n +alor - las dem$s con el otro0 con lo qe nos podemos liar. Gn error m- t2pico es
qe se nos ol+ide de poner la instrcci)n de incrementar el contador0 prodciendo n #cle inFnito qe
!ar$ qe nestro programa no termine nnca. Si n programa se #loqea es con+eniente re+isar esto.
Tam#i9n pede pasar qe no llegemos a entrar al MIE'TRAS porqe la condici)n -a sea ;alsa la primera
+e*0 por e,emploH
contador ^ 12Q
6/ICE contador N 1QQ
PRI'T .Esto no se +a a llegar a escri#ir nnca.i
contador ^ contador d 1
6E'1
/asta a!ora !emos !a#lado de contador0 pero como +eremos en los e,emplos podemos sar n
acmlador0 o ningno de los dos0 -a qe la condici)n del 6/ICE pede ser calqiera - no !a- porq9
contar ni acmlar algo siempre.
>eamos algnos e,emplos de MIE'TRASH
Rtina qe escri#e del Q al 1QQ de 2 en 2H
c ^ Q
6/CE c N^ 1QQ
PRI'T c
c ^ c d 2
6E'1
Escri#ir de BQ !asta 1 !acia atr$sH
c ^ BQ
6/ICE c O^ 1
PRI'T c
c ^ c - 1
6E'1
(alclar el ;actorial de n n5mero qe pedimos al sario :Este e,emplo se me,orar$ en otro tema m$s
adelante=H
I'PGT .Escri#e n n5mero para calclar s ;actorialH .0 nm
c ^ 1
;actorial ^ 1
6/ICE c N^ nm
;actorial ^ ;actorial ` c
c ^ c d 1
6E'1
PRI'T .El ;actorial deiL nmL .esiL ;actorial
Ceer n5meros por teclado !asta qe se escri#a el QH
I'PGT .Escri#e n5meros :Q para salir=Hi0 nm
6/ICE nm NO Q
I'PGT .Escri#e n5meros :Q para salir=Hi0 nm
6E'1
Este 5ltimo e,emplo presenta lo qe se conoce como lectra anticipada. Antes de llegar al 6/ICE !emos
tenido qe consegir el +alor de la +aria#le nm porqe si no lo !acemos pede pasar qe nm +alga
cero - por lo tanto no llegemos a entrar al #cle. Esto es 5til en casos como la lectra de Fc!eros
secenciales0 pero otras +eces con+iene e+itarlo para no repetir instrcciones. >eremos como !acerlo en
el sigiente tema.
Gna 5ltima cosa es qe !a- na teor2a en in;orm$tica qe dice qe calqier algoritmo pede ser
programado sando solamente instrcciones MIE'TRAS. Es decir0 ni #loqes IA0 ni ECSE0 ni (ASE0 ni AOR0
ni otras estrctras qe +eremos m$s adelante. ?o no lo !e compro#ado0 pero si a algien le !a gstado
mc!o este tema -a pede empe*ar a !acerlo.
Tema 1.11
ESTRG(TGRA 1E REPETI(IT' 1O...COOP
1.11.1 - Estrctra 1O...COOP
1.11.2 - 1epraci)n de datos de entrada
1.11.1 - ESTRG(TGRA 1O...COOP
Esta estrctra es similar a la 6/ICE0 solo qe la condici)n se especiFca al Fnal del #loqe0 con lo qe
pede ser m$s ;$cil de entender - nnca tendremos qe !acer .lectras anticipadas. -a qe siempre se
entra por lo menos na +e*.
Ca principal no+edad de este #loqe es qe podemos repetir las instrcciones MIE'TRAS se cmpla la
condici)n o /ASTA qe se cmpla.
El sigiente e,emplo escri#e los n5meros del 1 al B sando na instrcci)n 1O...COOP 6/ICE qe !ace
qe el #cle se e,ecte MIE'TRAS nestro contador sea menor qe B.
n ^ Q
1O
n ^ n d 1
PRI'T n
COOP 6/ICE n N B
O#ser+a qe el contador se incrementa al principio del #cle0 - por lo tanto la primera +e* qe
escri#amos n0 -a tendr$ el +alor de 1. Ca 5ltima +e* escri#ir$ B - al llegar a la condici)n se compro#ar$
qe 'O es menor qe B - -a salimos.
A!ora !aremos lo mismo con la instrcci)n 1O... COOP G'TIC qe e,ectar$ el #loqe /ASTA QGE el
contador llege a +aler B.
n ^ Q
1O
n ^ n d 1
PRI'T n
COOP G'TIC n ^ B
Esto es parecido. O#ser+a qe la condici)n es ,sto la contraria. Ca 5ltima +e* n +ale B - desp9s de
escri#irla se compre#a qe la condici)n es +erdadera - se sale del #cle.
Cas instrcciones 1O...COOP G'TIC son normalmente las m$s ;$ciles de comprender. En la a-da de
QBasic recomiendan qe se de,en de sar las instrcciones 6/ICE...6E'1 para sar me,or las
1O...COOP0 pero algnas +eces ser$ me,or sar las 6/ICE...6E'1 como en el caso de los Fc!eros
secenciales qe -a +eremos m$s adelante.
1.11.2 - 1EPGRA(IT' 1E 1ATOS 1E E'TRA1A
A!ora -a estamos en condiciones de +er na ;orma de consegir qe n programa qe reqiere la
inter+enci)n del sario para introdcir datos de entrada no a+ance /ASTA QGE el sario no escri#a los
datos correctos.
En el tema de EntradaaSalida +imos qe QBasic es capa* de controlar qe no se metan +alores ;era de
rango0 por e,emplo qe si el programa pide n entero no se peda escri#ir n nmero ma-or de "2YZY.
Aq2 lo qe +amos a +er es como consegir qe se pedimos n mes el programa no a+ance !asta qe el
sario escri#a n n5mero entre 1 - 12. Esto lo de#er2amos !acer en calqier programa siempre qe
pidamos al sario qe escri#a algo.
Para !acer este control lo qe !acemos es meter la instrcci)n I'PGT dentro de n #loqe REPETIR0 del
qe no salimos /ASTA qe la respesta sea correcta o MIE'TRAS sea incorrecta.
>amos a +er nos e,emplos qe aclarar$n todas las posi#les sitaciones.
Ceer n n5mero menor qe 1QQ
(CS
1O
I'PGT .Escri#e n n5mero menor qe 1QQH .0nm
COOP G'TIC nm N 1QQ
Aq2 no segimos !asta qe el n5mero sea menor qe 1QQ. En el sigiente e,emplo segiremos
repitiendo la pregnta mientras el n5mero sea ma-or o igal qe 1QQ
(CS
1O
I'PGT .Escri#e n n5mero menor qe 1QQH .0nm
COOP 6/ICE nm O^ 1QQ
Pedes +ol+er a compro#as aq2 qe para el mismo pro#lema la condici)n del COOP 6/ICE es ,sto la
in+ersa a la del COOP G'TIC.
A!ora pedimos n mes0 qe tiene qe ser entre 1 - 12
(CS
1O
I'PGT .Escri#e n mes :Q a 12=H .0mes
COOP G'TIC :mes O^ 1= A'1 :mes N^ 12=
En este caso tenemos n inter+alo - por lo tanto !a- qe controlar dos condiciones qe niremos con el
operador A'10 con lo qe no segimos /ASTA qe la primera se cmpla ? la segnda tam#i9n.
Tam#i9n lo pod2amos !a#er !ec!o con n #loqe 1O...COOP 6/ICE
(CS
1O
I'PGT .Escri#e n mes :Q a 12=H .0mes
COOP 6/ICE :mes N 1= OR :mes O 12=
A!ora no salimos MIE'TRAS algna de las dos condiciones se cmpla0 son ,sto las contrarias a la del
e,emplo anterior0 -a qe samos el operador OR qe tam#i9n se pede decir qe es el contrario al A'1.
Por 5ltimo +amos a +er n pro#lema m- t2picoH Gn programa qe nos pide na cla+e de acceso para
poder segir. Este es el caso m$s sencillo en el qe no pasamos !asta qe no demos con la cla+e0 otros
pro#lemas m$s complicados ser2an qe el programa terminara tras +arios intentos ;allidos o qe
admitiera +arias cla+es ll9+$ndonos seg5n la qe sea a na parte del programa.
(O'ST (la+e(orrectaU^.J#rete S9samo.
(CS
1O
I'PGT .Escri#e la cla+eH .0cla+ePre#aU
COOP G'TIC cla+ePre#as ^ cla+e(orrectaU
PRI'T .?a !as entrado.
Recordar tam#i9n qe en n programa terminado para e8plotaci)n la cla+e nnca +a a estar en el listado
del programa0 sino qe ser$ o#tenida de alg5n tipo de Fc!ero o #ase de datos para qe el sario tenga
la posi#ilidad de cam#iarla.
/ASTA AQGW 1EBE' SABER
TEMA 1.12
ARRA?S
1.12.1 - Introdcci)n a los arra-s
1.12.2 - >ectores
1.12." - Matrices
1.12.% - Poliedros
1.12.B - A!orrar espacios en arra-s de cadenas
1.12.Z - Matrices orladas
1.12.Y - Aormaciones din$micas
1.12.1 - I'TRO1G((IT' A COS ARRA?S
/asta a!ora !emos sado +aria#les para gardar la in;ormaci)n qe mane,a el programa. Gna +aria#le
con s nom#re - s tipo para cada dato :nom#re0 cantidad0 ni+el0 precio0 edad...= qe nos !ac2a ;alta.
Pero IQe ocrre si nestro programa tiene qe mane,ar na colecci)n de datos m- grande como los
nom#res de na agenda o los precios de n cat$logoK Se podr2a !acer sando 1QQ +aria#les distintas
pero el algoritmo llegar2a a ser terri#lemente complicado - m- poco ;ncional. En este apartado +amos
a +er c)mo podemos asignar n mismo nom#re de +aria#le para mc!os datos - re;erirnos a cada no
de ellos de ;orma indi+idal sando n n5mero al qe llamaremos 2ndice.
Gsaremos nas estrctras de datos llamadas arra-s0 de las qe se dice qe son .Estrctras est$ticas
de almacenamiento interno..
Son est$ticas porqe s tamaEo se declara al principio del programa - -a no se pede modiFcar. Si
!acemos n programa qe tra#a,e con 1QQ nom#res siempre lo !ar$ con 1QQ anqe solo llegemos a
sar 2Q0 - nnca podr$ tra#a,ar con m$s de 1QQ.
Son de almacenamiento interno porqe est$n en la memoria RAM del ordenador0 como +aria#les qe
son0 - s tiempo de +ida s)lo dra mientras se e,ecta el programa. Al terminar se pierde s contenido.
En programaci)n normalmente se conocen como .Arra-s. anqe s nom#re m$s correcto en castellano
ser2a .;ormaciones..
(omo +eremos en los apartados sigientes0 los arra-s de 1 dimensi)n se llaman +ectores0 los de 2
dimensiones se llaman matrices - los de " o m$s se llaman poliedros o arra-s mltidimensionales.
En in;orm$tica mc!as +eces se llama +ector a calqier arra-. En la a-da de QBasic :- de >isal Basic=
siempre llaman Matri* a calqier arra-0 por lo qe !a- qe tener cidado de no liarse.
1.12.2 - >E(TORES
Imaginemos este #loqe de pisos de catro plantas.
>amos a escri#ir n programa de la ;orma qe sa#emos !asta a!ora qe nos pregnte el nom#re de la
persona +i+e en cada piso - na +e* qe !a recopilado toda esa in;ormaci)n0 nos de,e pregntarle qien
+i+e en el piso qe nosotros qeramos.
(CS
I'PGT .'om#re de qien +i+e en el 1jH .0 nom#re1U
I'PGT .'om#re de qien +i+e en el 2jH .0 nom#re2U
I'PGT .'om#re de qien +i+e en el "jH .0 nom#re"U
I'PGT .'om#re de qien +i+e en el %jH .0 nom#re%U
1O
I'PGT .Escri#e n piso para +er qien +i+e en 9lH .0n
COOP 6/ICE :n N 1= OR :n O %=
SECE(T (ASE n
(ASE 1H PRI'T .En el 1j +i+e .L nom#re1U
(ASE 2H PRI'T .En el 2j +i+e .L nom#re2U
(ASE "H PRI'T .En el "j +i+e .L nom#re"U
(ASE %H PRI'T .En el %j +i+e .L nom#re%U
E'1 SECE(T
El resltado podr2a ser esteH
'om#re de qien +i+e en el 1jH Paca
'om#re de qien +i+e en el 2jH Manolo
'om#re de qien +i+e en el "jH Cola
'om#re de qien +i+e en el %jH Pepe
Escri#e n piso para +er qien +i+e en 9lH "
En el "j +i+e Cola
Gn listado n poco largo para !acer algo tan sencillo. Si en +e* de catro pisos ;eran %Q tendr2amos n
programa casi die* +eces m$s largo con mc!as partes casi igales0 pero qe no podemos meter en
#cles repetiti+os porqe cada +aria#le es distinta. O#ser+a qe compro#amos qe el piso sea entre 1 -
%0 a partir de a!ora +a a ser m- importante deprar los datos de entrada0 -a +eremos por q9.
A!ora +amos a escri#ir n programa qe !aga lo mismo qe el anterior0 pero sando n >E(TOR.
1IM nom#reU :1 TO %=
AOR n ^ 1 TO %
PRI'T .'om#re de qien +i+e en el.L nL .jH .L
I'PGT ..0 nom#reU:n=
'EXT
1O
I'PGT .Escri#e n piso para +er qien +i+eH .0n
COOP 6/ICE :n N 1= OR :n O %=
PRI'T .En el.LnL.j +i+e .Lnom#reU:n=
El resltado ser2a similar0 pero el listado es mc!o m$s corto0 especialmente todo el SECE(T (ASE
anterior qe se !a trans;ormado en na sola instrcci)n.
>amos a +er este programa l2nea a l2nea.
Ca primera instrcci)n es ne+a. En ella lo qe !acemos es 1E(CARAR na +aria#le qe se +a a llamar
nom#reU :como lle+a el U +a a ser de tipo te8to= - +a a poder gardar catro +alores a los qe
accederemos con s#2ndices qe +an desde el 1 !asta el %. Para determinar este inter+alo de +alores !a-
qe sar n5meros enteros constantes0 no +alen e8presiones matem$ticas.
En el sigiente #loqe AOR0 qe se e,ectar$ % +eces lo qe !acemos es ir pidiendo al sario qe
escri#a los nom#res. Ca primera +e* gardamos lo qe escri#a en la posici)n 1 del +ector porqe
!acemos re;erencia al 2ndice 1 entre par9ntesis a continaci)n del nom#re del +ector. Ca sigiente +e* al
2ndice 20 la sigiente +e* al " - la 5ltima +e* qe se e,ecte el #cle !acemos re;erencia al 2ndice %. A
esto es a lo qe se llama .Recorrer el +ector. -a qe !emos !ec!o algo con cada no de ss elementos.
'ormalmente esto lo !aremos siempre con n #cle AOR0 qe es lo m$s c)modo.
Ca prengnta de .nom#re de qien +i+e en.... no est$ en el I'PGT porqe esta instrcci)n no e+al5a
e8presiones0 por eso est$ antes en n PRI'T normal con n pnto - coma al Fnal para qe el crsor no
pase a la sigiente l2nea.
A!ora -a tenemos dentro del +ector los catro nom#res para sarlos como qeramos !aciendo
re;erencia al nom#re del +ector - al s#2ndice entre par9ntesis. Para !acer re;erencia a los s#2ndices de
n arra- se pede sar calqier e8presi)n0 no tiene porq9 ser n n5mero constante0 pero !a- qe
tener cidado de no !acer nnca re;erencia a 2ndices qe no e8istan
En el sigiente #loqe pedimos al sario qe escri#a el n5mero de n piso - lo gardamos en la
+aria#le '. O#ligamos a qe sea n n5mero entre 1 - %.
Al Fnal +iene lo espectaclar. Para acceder a calqiera de los 2ndices del +ector se pede !acer
directamente tomando el +alor de la +aria#le ' como s#2ndice sin necesidad de controlar cada +alor por
separado como antes.
>amos con otro e,emplo para qe todo esto +a-a qedando cada +e* m$s claro.
En temas anteriores ten2amos n programa para escri#ir el nom#re de n mes a partir de s n5mero. Co
!icimos con mc!os IA anidados0 desp9s con ECSEIA - por 5ltimo con SECE(T (ASE qe -a qeda#a
mc!o m$s corto0 pero de ningna ;orma nos li#ramos de escri#ir todo el SECE(T (ASE - todos los
meses en calqier parte del programa d)nde qeramos qe se escri#a el nom#re de alg5n m9s.
A!ora +amos a plantear el pro#lema de otra ;ormaH
1IM meseU :1 TO 12=
meseU:1=^.Enero.
meseU:2=^.Ae#rero.
meseU:"=^.Mar*o.
meseU:%=^.A#ril.
meseU:B=^.Ma-o.
meseU:Z=^.Vnio.
meseU:Y=^.Vlio.
meseU:D=^.Agosto.
meseU:]=^.Septiem#re.
meseU:1Q=^.Oct#re.
meseU:11=^.'o+iem#re.
meseU:12=^.1iciem#re.
S:...=
PRI'T meseU:2= SEscri#e Ae#rero
S:...=
n^Z
PRI'T meseU:n= SEscri#e Vnio
/emos declarado n +ector de cadenas de 12 posiciones llamado meseU.
Al principio del programa llenamos el +ector con los nom#res de los meses0 cada no en s lgar
correcto.
1onde nos !aga ;alta el nom#re de n mes s)lo tendremos qe sar el +ector - re;erirnos al mes qe
qeramos. 1e esta ;orma meses:"= nos de+ol+er$ .Mar*o. - si n +ale 11 entonces meses:n= nos
de+ol+er$ .'o+iem#re..
En los dos e,emplos qe !emos pesto los 2ndices de los +ectores !an empe*ado en el 10 pero esto no
tiene qe ser siempre as2. En QBasic peden empe*ar por calqier n5mero inclso negati+o0 anqe lo
m$s normal es qe siempre empiecen por 1 o por Q. El +alor m$s #a,o posi#le para los 2ndices es -"2YZD
- el m$s alto es "2YZY. Por spesto el Fnal del inter+alo no pede ser menor qe el principio. >eamos
algnos e,emplos m$s de declaraci)n de +ectores.
1IM almnoU:1 TO "Q= S"Q cadenas
1IM nota :1 TO "Q= S"Q n5meros reales
1IM +entasc+erano[:Z TO ]= S% enteros
Tam#i9n podemos declarar +ectores de n solo elemento0 anqe esto pede qe no tenga mc!o
sentido.
1IM n5mero :1 TO 1=
Para determinar el tamaEo de calqier +ector samos la sigiente ;)rmlaH
hCTIMO I'1I(E - PRIMER W'1I(E d 1
As2 en el e,emplo de los meses reslta 12 - 1 d 1 ^ 12 elementos0 m- sencillo InoK pero a +eces
terminaremos contando con los dedos.
Para iniciali*ar n +ector :Borrarlo entero= no !ace ;alta recorrerlo0 podemos !acerH
ERASE :nom#rec+ector=
? el +ector se qedar$ lleno de ceros si es nm9rico o de cadenas +ac2as :..= si es de cadenas.
Recordemos qe en QBasic todas las +aria#les est$n a cero al principio0 pero en otros lenga,es no.
A!ora +amos a +er el pro#lema m$s t2pico de los +ectores :- en general de todos los arra-s=.
'o podemos intentar acceder a s#2ndices qe no e8isten. En caso de qe llege a ocrrir en QBasic se
prodcir$ n error de tipo .S#2ndice ;era del inter+alo. - el programa se detendr$ sin ma-ores
consecencias.
En mc!os otros lenga,es no ocrrir$ nada0 pero si estamos le-endo sacaremos datos de otras
posiciones de memoria qe no son nestras de m$s all$ del Fnal del +ector - si estamos escri#iendo lo
!aremos so#reescri#iendo otros datos importantes para el programa o inclso para el sistema operati+o
:1OS o 6I'1O6S= con lo qe casi segro consegiremos qe el ordenador se qede #loqeado.
Imagina qe en n programa :'o de QBasic= ocrre esto - +a a parar a n registro estrat9gico del
sistema operati+o n n5mero qe eqi+ale de algna ;orma a la llamada al programa de ;ormatear el
disco dro0 no +eas el estropicio.
1e a!2 la importancia de deprar los datos de entrada0 especialmente los qe +an a ser+ir como 2ndices
para arra-s. Si en nestro primer e,emplo no depramos el dato del piso qe pedimos al sario - este
escri#e no qe no est$ entre cero - catro0 al acceder al +ector se prodcir2a este error.
1.12." - MATRI(ES
A!ora imaginemos este otro #loqe de pisos0 para el qe tenemos qe !acer n programa similar al
anterior.
>amos a escri#ir el programa. Ser$ igal qe el anterior0 !a#r$ qe controlar las catro plantas pero
adem$s dentro de cada na !a#r$ qe controlar las tres pertas qe !a- en cada rellano :1k0 2k - "k=.
1IM nom#reU :1 TO %0 1 TO "=
AOR piso ^ 1 TO %
AOR perta ^ 1 TO "
PRI'T .'om#re de qien +i+e en el.L pisoL .j.L pertaL .kH .L
I'PGT ..0 nom#reU:piso0 perta=
ne8t
'EXT
PRI'T .Para sa#er qien +i+e en n piso....
1O
I'PGT . Escri#e el pisoH .0piso
COOP 6/ICE :piso N 1= OR :piso O %=
1O
I'PGT . Escri#e la pertaH .0perta
COOP 6/ICE :perta N 1= OR :perta O "=
PRI'T .En el.LpisoL.j.LpertaL.k +i+e .Lnom#reU:piso0 perta=
Se pede +er qe es m- parecido0 pero !emos tili*ado na MATRIf0 qe es n arra- de dos
dimensiones0 mientras qe n +ector es n arra- de na sola dimensi)n. Por si !a- algna dda de lo
qe !ace este programa +amos a +er n posi#le resltado.
'om#re de qien +i+e en el 1j 1kH Paca
'om#re de qien +i+e en el 1j 2kH &loria
'om#re de qien +i+e en el 1j "kH Aernando
'om#re de qien +i+e en el 2j 1kH Mari
'om#re de qien +i+e en el 2j 2kH Van
'om#re de qien +i+e en el 2j "kH Manolo
'om#re de qien +i+e en el "j 1kH Cola
'om#re de qien +i+e en el "j 2kH Rosa
'om#re de qien +i+e en el "j "kH Mario
'om#re de qien +i+e en el %j 1kH Pepe
'om#re de qien +i+e en el %j 2kH 'ac!o
'om#re de qien +i+e en el %j "kH Cisa
Para +er qien +i+e en n piso...
Escri#e la plantaH "
Escri#e la pertaH 2
En el "j 2k +i+e Rosa
Co m$s no+edoso es la ;orma de declarar la matri*0 igal qe el +ector pero esta +e* !a#r$ qe sar dos
inter+alos separados por na coma. ? por lo tanto siempre qe nos reFramos a la matri* !a#r$ qe sar
dos s#2ndices.
Para recorrer la matri* !a- qe sar dos AOR anidados. Esta +e* la !emos recorrido por Flas :pisos en
nestro e,emplo= -a qe el .AOR piso. est$ ;era - !asta qe no se e,ecte entero el .AOR perta. en
cada piso no pasamos al sigiente. Para recorrerla por colmnas :pertas= #astar2a con intercam#iar los
AORH
AOR perta ^ 1 TO "
AOR piso ^ 1 TO %
S:...=
ne8t
'EXT
Para el ordenador es completamente intrascendente qe lo !agamos de na ;orma otra0 9l no entiende
de Flas !ori*ontales ni colmnas +erticales0 de !ec!o almacena todos los elementos segidos no detr$s
de otro - !ace operaciones matem$ticas con los dos s#2ndices para determinar la 5nica posici)n del
elemento.
Esto se pede +er ;$cilmente pensando en la posici)n de los #*ones de correos en el portal del #loqe
de pisos.
(ada piso tiene s #*)n0 el del 2j 2k es el qinto porqe tiene delante los tres de la primera planta - es
el segndo de la segnda. Para calclar las posiciones se !ace algo as2 como ::PCA'TA-
1=`'jctotalcdecPGERTAS=dPGERTA0 qe sale ::2-1=`"=d2 ^ B.
A nosotros esto no nos interesa porqe lo !ace QBasic atom$ticamente. Si programamos en otros
lenga,es m$s primiti+os s2 qe !a#r2a qe preocparse de esto porqe s)lo e8isten +ectores de na
dimensi)n.
1.12.% - POCIE1ROS
Co m$s normal es sar +ectores :1 dimensi)n= o matrices :2 dimensiones=0 pero QBasic pede llegar a
mane,ar arra-s con !asta ZQ dimensiones@@@
>eamos n caso re#scado de n arra- de tres dimensiones ampliando los e,emplos anteriores de los
#loqes de pisos.
En este caso nestro #loqe tiene tres portales :1 a "= - cada no de ellos tiene catro plantas - tres
pertas igal qe antes.
Para declarar el poliedro !a#r2a qe !acerH
1IM nom#reU :1 TO "0 1 TO %0 1 TO "=
Ca primera dimensi)n +a a ser para los portales0 la segnda para los pisos - la tercera para las pertas.
Para recorrer el arra- !ar2amosH
AOR portal ^ 1 TO "
AOR piso ^ 1 TO %
AOR perta ^ 1 TO "
S:...=
'EXT
'EXT
'EXT
Esta +e* tenemos tres #cles AOR anidados - las instrcciones qe pongamos dentro de todo se
e,ectar$n "Z +eces qe es el prodcto de todas las dimensiones.
?a empe*amos a liarnos pensando en recorrer el arra- primero por portales o no0 etc... Toda+2a podemos
tener na representaci)n +isal del pro#lema0 pero si samos arra-s de catro0 cinco o m$s dimensiones
-a esto no ser$ as2 - la !a#remos liado del todo. En estos casos lo me,or ser$ plantear el pro#lema de
otra ;orma o sar estrctras de datos m$s be8i#les qe -a +eremos m$s adelante.
1.12.B - A/ORRAR ESPA(IO
E' COS ARRA?S 1E (A1E'AS
/asta a!ora no !emos sido demasiado estrictos en el a!orro de memoria -a qe ni siqiera estamos
declarando las +aria#les. 'estros programas de QBasic son m- sencillos - san m- pocas +aria#les0
pero al tra#a,ar con arra-s !a- qe darse centa qe #asta con declarar na matri* de 2Q por 2Q
elementos para qe se gasten %QQ posiciones de memoria.
En las cadenas QBasic no nos limita el n5mero de caracteres qe +amos a poder meter en ellas - para
qe esto ;ncione se gasta cierta cantidad de memoria :nos 1Q #-tes=0 qe si mltiplicamos por %QQ
posiciones de memoria son casi % gB0 na cantidad respeta#le para programas tan peqeEos.
Pede ocrrir qe en nestra matri* de cadenas no llegemos a almacenar pala#ras m$s largas de por
e,emplo 1B letras con los qe nos con+endr2a limitar el tamaEo de las cadenas - a!orrarnos esos 1Q
#-tes en cada posici)n.
Para declarar n arra- de cadenas de tamaEo limitado !ar2amosH
1IM matri*:1 TO 2Q0 1 TO 2Q= AS STRI'& ` 1B
Cas pala#ras cla+e AS STRI'& declaran e8pl2citamente la +aria#le como de tipo cadena :Esta ser$ la
;orma normal de !acerlo en >isal Basic=0 por eso -a no es necesario poner el U al Fnal del nom#re. Si a
continaci)n ponemos n asterisco - n n5mero estamos limitando el tamaEo de las cadenas con lo qe
QBasic -a no tendr$ qe determinarlo atom$ticamente constantemente0 con lo qe a!orraremos
memoria - el programa ;ncionar$ algo m$s r$pido.
Si asignamos a estas +aria#les na cadena de m$s de 1B caracteres no ocrre nada0 simplemente la
cadena se corta - s)lo se almacenan los primeros 1B caracteres0 los dem$s se pierden.
En los tipos nm9ricos no podemos a!orrar nada0 pero en los arra-s de cadenas de#er2amos !acer
siempre esto0 especialmente si +an a contener mc!os elementos.
1.12.Z - MATRI(ES ORCA1AS
Imaginemos el ,ego del #scaminas en el qe tenemos na matri* de D por D elementos :(asillas= qe
+an a contener n 1 si contienen na mina o n cero si est$n +ac2as.
(ando el sario destape na casilla0 si no contiene na mina0 !a#r$ qe escri#ir el n5mero de minas
qe la rodean. Para !acer esto !a#r$ qe smar los +alores de las casillas qe !a- arri#a a la i*qierda0
arri#a0 arri#a a la derec!a0 a la derec!a0 a#a,o a la derec!a0 a#a,o0 a#a,o a la i*qierda - a la i*qierda.
Si estamos en na casilla del interior del ta#lero esto ;nciona per;ectamente0 pero si estamos en el
#orde nos encontramos con el pro#lema de qe !ar2amos re;erencia a posiciones de ;era de la matri*
con lo qe se prodcir2a n error de .S#2ndice ;era del inter+alo..
Para e+itar esto !a#r2a qe compro#ar qe si estamos en el #orde sperior no se centen las casillas
speriores0 si estamos en el in;erior no se centen las de a#a,o0 si estamos en na esqina solo se
centen las tres de dentro0 etc. con lo qe tendr2amos en total ne+e rtinas di;erentes0 as2 como qe
controlar cal de ellas sar seg5n por donde est9 la casilla qe estamos destapando.
Para solcionar este pro#lema lo qe se sele !acer es dotar a la matri* de m$s Flas - colmnas de
;orma qe todos los elementos qe realmente nos interesan est9n rodeados por n .#orde. de elementos
+ac2os qe estar$n a!2 s)lo para poder !acer re;erencia a ellos sin salirnos de la matri*.
Gna representaci)n gr$Fca de la matri* orlada podr2a ser esta0 donde !a- n #orde de .casillas. qe no
+amos a sar nnca para poner minas0 pero a las qe podemos re;erirnos siempre qe sea necesario sin
salirnos de la matri*. En el e,emplo qe nos ocpa0 estas posiciones contendr2an el +alor Q -a qe est$n
+ac2as.
Esta t9cnica se aplica mc!o en ,egos de este tipo0 en programas de im$genes - en calqier lgar
donde se tenga qe acceder a posiciones de na matri* - pedan prodcirse pro#lemas en los #ordes.
En el caso de +ectores !a#r2a qe aEadir n elemento m$s al principio - otro al Fnal0 para los poliedros
ser2a como en+ol+erlo completamente - en el caso de arra-s de m$s de catro dimensiones -a es di;2cil
imaginarse como se !ar2a.
/a- qe recordar qe en QBasic se peden sar s#2ndices negati+os0 pero en la ma-or2a de otros
lenga,es de programaci)n esto no es as2.
El 5nico incon+eniente de las matrices orladas es qe ocpan m$s memoria0 e8$ctamente
:2`:altodanc!o==d% posiciones m$s. Este gasto de recrsos est$ ,stiFcado en la ma-or2a de los casos -a
qe se consige simpliFcar mc!o los programas.
1.12.Y - AORMA(IO'ES 1I'JMI(AS
En otros lenga,es de programaci)n m$s a+an*ados como ( o Pascal e8isten lo qe se llaman
.Estrctras de almacenamiento din$micas. qe son t9cnicas de programaci)n qe mediante la
tili*aci)n de pnteros :>aria#les especiales qe contienen direcciones de memoria= permiten acceder
directamente a la memoria del ordenador - colocar los datos en estrctras como listas enla*adas0
$r#oles0 pilas0 colas0 ta#las !as!0 etc c-o tamaEo cam#ia constantemente drante la e,ecci)n del
programa sin estar deFnido de ningna ;orma en el c)digo del programa. Por eso se dice qe son
estrctras de almacenamiento din$micas.
(omo QBasic :ni >isal Basic= no tra#a,a directamente con pnteros no podemos llegar a tili*ar estas
estrctras. En alg5n caso pede sceder qe necesitemos almacenar elementos en n arra- :>ector0
matri*0 etc...=0 pero no podamos sa#er de antemano canto grande +a a tener qe ser - tampoco nos
mere*ca la pena poner n l2mite ar#itrario qe se alcan*ar$ en segida o #ien no llegar$ a ser sado
nnca desperdiciando mc!a memoria.
Para solcionar en parte este pro#lema QBasic nos da la posi#ilidad de declarar los arra-s sando la
instrcci)n RE1IM en lgar de 1IM - desp9s en calqier parte del programa poder redimensionarlos
tantas +eces como qeramos sando +alores qe peden ser +aria#les.
>eamos n e,emploH
RE1IM mat:1 TO 1=
I'PGT .I(antos n5meros +amos a almacenarK.0 ma8i
RE1IM mat:1 TO ma8i=
AOR n ^ 1 TO ma8i
I'PGT mat:n=
'EXT
I'PGT .I(antos n5meros +amos a almacenar a!oraK.0 ma8i2
RE1IM mat:1 TO ma8i2=
AOR n ^ 1 TO ma8i2
I'PGT mat:n=
'EXT
Se pede +er qe declaramos n +ector de enteros de s)lo n elemento sando RE1IM0 a continaci)n
pedimos al sario qe escri#a n n5mero - desp9s +ol+emos a redimensionar el +ector con este
n5mero de elementos para -a recorrerla como !emos !ec!o siempre. A continaci)n repetimos el
proceso +ol+iendo a redimensionar el +ector0 perd2endose la primera serie de n5meros qe almacen) en
ella el sario.
Aq2 !a- qe aclarar algnas cosasH
Ca primera orden RE1IM mat:1 to 1= nos la pod2amos !a#er a!orrado0 pero siempre es costm#re
declarar las +aria#les al principio del programa para tener na +isi)n glo#al de las +aria#les qe !a- sin
tener qe recorrer el listado completo.
Si al declarar n arra- con la orden 1IM samos +aria#les en +e* de +alores constantes lo declaramos
como din$mico - desp9s podr$ ser redimensionado.
Para redimensionar n arra- din$mico -a e8istente !a#r$ qe !acerlo siempre con la orden RE1IM - en
QBasic tendremos qe sar las dimensiones qe -a tiene0 es decir0 si antes era na matri* con dos
dimensiones al redimensionarlo tenemos qe especiFcar dos inter+alos0 ni m$s ni menos0 - por spesto
el mismo tipo de datos.
Al redimensionar n arra- se #orran todos los +alores qe t+iera0 qedando entero iniciali*ado a +alores
cero o cadenas +ac2as.
>isto esto s)lo qeda por decir qe siempre qe sea posi#le se e+ite el so de arra-s din$micos -a qe el
mane,o interno de la memoria es mc!o menos eFciente - podr2a dar lgar a errores como los t2picos de
.Memoria agotada.. Para e+itar qe los arra-s sean din$micos sar siempre +alores constantes
:n5meros= para deFnir ss dimensiones al declararlos con la orden 1IM al principio del programa.
1.1".1 - I'TRO1G((IT' A CA
PRO&RAMA(IT' MO1GCAR
/asta a!ora !emos +isto programas m- sencillos qe simplemente eran na serie de instrcciones
colocadas na detr$s de otra en n listado. Esto +a m- #ien para nestros programas e8tremadamente
simples0 pero con;orme los pro-ectos se !acen algo m$s grandes +an apareciendo na serie de
pro#lemas.
Si !a- partes qe se repiten en distintos sitios la 5nica solci)n es repetir el tro*o de c)digo
correspondiente d)nde !aga ;alta.
Si damos con n error en na de estas partes repetidas !a#r$ qe corregirlo en todas0 sin ol+idar
ningna.
Si el programa es desarrollado por +arias personas ser$ m- di;2cil qe pedan tra#a,ar a la +e*.
El programa qeda m- mal estrctrado -a qe est$ .todo segido. - no se di;erencian nas partes de
otras.
Etc.
Para ir solcionando estos pro#lemas se !a desarrollado lo qe se conoce como programaci)n modlar -
qe consiste en di+idir n programa en m)dlos o s#programas m$s peqeEos qe reali*an na acci)n
determinada - son llamados por los otros m)dlos cada +e* qe !aga ;alta.
Esta ;orma de tra#a,ar nos proporciona las sigientes +enta,as0 qe solcionan los pro#lemas anteriores.
'o !a#r$ partes repetidas en los programas.
Al solcionar n posi#le error en el m)dlo correspondiente este qeda solcionado de ;orma deFniti+a
en todos los otros m)dlos qe saran este m)dlo.
Gn programa pede ser desarrollado por +arias personas o en tiempos di;erentes -a qe cada no pede
desarrollar s m)dlo - al Fnal solo !a#r$ qe ponerlos en com5n para qe todo ;ncione.
Cos programas qedan m- #ien estrctrados - el c)digo ;ente se !ace m$s legi#le -a qe est$
;ormado por partes peqeEas nidas.
Imaginemos por e,emplo en 6indo7s los cadros de di$logo qe aparecen para a#rir - gardar los
arc!i+os en los programas. I/as o#ser+ado qe casi siempre son igalesK. Esto es porqe son m)dlos
-a programado qe se encentran en na #i#lioteca de enlace din$mico :1CC= - son llamados por los
programas. 1e esta ;orma el programador no se tiene qe preocpar de programar las listas0 los iconos0
los #otones0 etc... sino qe estos -a !an sido programados anteriormente por otras personas - s)lo !a-
qe llamarlos desde nestro programa de 6indo7s. Adem$s si se encentra alg5n error #asta con
corregirlo - sstitir la 1CC correspondiente :Esto es lo qe !ace constantemente Microso;t con ss
.Ser+ice Pac<s. - ss .Segndas ediciones.= para qe todos los programas qe la tilicen qeden
inmediatamente arreglados.
1.1".2 - CA PRO&RAMA(IT' MO1GCAR E' QBASI(
Ca programaci)n en 6indo7s se #asa en las 1CC - por lo tanto en la programaci)n modlar. En los
lenga,es m$s a+an*ados como (dd o Pascal se peden sar #i#liotecas de ;nciones qe son llamadas
desde nestro programa - son enla*adas en el momento de compilar nestro e,ecta#le EXE.
En QBasic0 al ser n lenga,e interpretado nos tenemos qe limitar a sar m)dlos o m$s concretamente
procedimientos qe est9n dentro del 5nico Fc!ero BAS qe compone nestro programa. Cas
posi#ilidades son m- limitadas pero nos +an a ser+ir para aprender los conceptos m$s importantes de
esta t9cnica.
/asta a!ora !emos escrito las instrcciones en el editor de c)digo de Q#asic. Esta parte del programa es
el .M)dlo Principal. qe de#e e8istir siempre - desde donde se llamar$ a los distintos m)dlos del
programa0 si e8isten.
En QBasic e8isten dos tipos de m)dlosH procedimientos SGB - ;nciones.
Cos procedimientos SGB son partes del programa qe simplemente .!acen algo..
Cas ;nciones son partes del programa qe al llamarlas !acen n c$lclo - nos de+el+en n +alor.
1.1"." - CCAMA1A A
PRO(E1IMIE'TOS ? AG'(IO'ES
?a !emos sado sin sa#erlo procedimientos - ;nciones -a inclidas en el lenga,e de QBasic. Por
e,emplo al sar la instrcci)n PRI'T lo qe !acemos es llamar a n procedimiento -a programado dentro
de QBasic qe se encargar$ de di#,ar caracteres en la pantalla0 o al sar la ;nci)n SQR dentro de na
e8presi)n consegimos calclar la ra2* cadrada de n n5mero sin tener qe programar en ning5n sitio
las operaciones necesarias para !acer esto.
Ca di;erencia importante entre la llamada a los procedimientos - a las ;nciones es qe para llamar a n
procedimiento se escri#e s nom#re al principio de la l2nea0 mientras qe las llamadas a ;nciones +an
dentro de e8presiones o #ien ;ormando parte de condiciones. Si est$n en na asignaci)n0 las llamadas a
;nciones siempre +an a la derec!a del signo .igal..
Tam#i9n es m- importante darse centa de qe los par$metros0 si los !a-0 qe se pasan a las ;nciones
+an entre par9ntesis0 mientras qe los de los procedimientos no es o#ligatorio qe +a-an entre
par9ntesis0 -a +eremos por q9.
>eamos algnos e,emplos0 donde PRI'T es n procedimiento - SQR es na ;nci)n.
PRI'T ./ola.
Clamamos a PRI'T - le pasamos como par$metro ./ola.. PRI'T escri#ir$ ./ola. en la pantalla0 pero no
de+el+e ning5n +alor.
rai* ^ SQR:n=
Clamamos a la ;nci)n SQR - le pasamos como par$metro la +aria#le n. El resltado de+elto lo
asignamos a la +aria#le rai*. O#ser+a qe SQR est$ a la derec!a del signo igal - qe el par$metro n +a
entre par9ntesis.
PRI'T SQR:%=
Aq2 llamamos a SQR para qe nos calcle la ra2* de %0 - el +alor de+elto por la ;nci)n se lo pasamos a
PRI'T para qe lo escri#a en la pantalla.
1O
...
COOP 6/ICE SQR:n=O1Q
...
IA SQR:n=OBQ T/E'
...
E'1 IA
En estos dos e,emplos samos los resltados de la ;nci)n como parte de la e8presi)n qe se sar$
como condici)n en instrcciones repetiti+as - condicionales.
A ^ PRI'T:#=
Esto se +e m- raro a primera +ista I()mo le asignamos a na +aria#le lo qe escri#a PRI'T en la
pantallaK. Esto no se pede !acer0 est$ mal escrito. Cas llamadas a procedimiento siempre +an al
principio de la l2nea.
SQR:%=
Aq2 se prodce n error al pasar de l2nea porqe llamamos a la ;nci)n0 pero cando nos de+el+e el
resltado no !acemos nada con 9l porqe la ;nci)n ni est$ en na asignaci)n ni en na condici)n.
1.1".% - 1EAI'I(IT' 1E PRO(E1IMIE'TOS
/asta a!ora !emos llamado a procedimientos qe -a est$n inl2dos en el lenga,e de QBasic0 pero para
poder tili*ar los nestros propios adem$s de llamarlos !a- qe programarlos.
Todo el c)digo qe !emos escrito !asta a!ora en nestros programas !a estado en el .M)dlo Principal.
del programa. Para deFnir n procedimiento #asta con seleccionar .'e+a s#. en el men5 .Edici)n. de
QBasic. Entonces aparecer$ n peqeEo cadro de di$logo donde tendremos qe escri#ir el nom#re del
procedimiento - plsar Enter. 1esp9s de !acer esto desaparecer$ de la pantalla nestro m)dlo
principal - en s lgar aparecer$ algo as2 como esto.
SGB Pre#a
E'1 SGB
Esto es el principio - el Fnal del procedimiento. Entre estas dos l2neas ser$ donde tendremos qe escri#ir
todo el c)digo.
Aera lo 5nico qe est$ permitido son comentarios. Siempre es m- recomenda#le escri#ir na peqeEa
descripci)n de lo qe !ace el procedimiento. Tam#i9n es normal escri#ir los nom#res de los
procedimientos con la primera letra en ma-5sclas. Para elegir los nom#res de#eremos elegir n nom#re
descripti+o - tendremos las mismas restricciones qe con los nom#res de +aria#les :Sin acentos ni E0
m$8imo %Q caracteres0 etc...=.
Para +ol+er al m)dlo principal o para pasar de n procedimiento a otro tendremos qe plsar la tecla A2
- en la lista qe aparece elegir el procedimiento al qe qeremos ir. Podemos entrar - salir de los
procedimiento todas las +eces qe sea necesario mientras estamos escri#iendo el c)digo ;ente del
programa.
>emos con n e,emplo paso a paso. >amos a !acer n programa qe contenga n peqeEo
procedimiento para escri#ir n r)tlo en la pantalla. Al sar programaci)n modlar podemos llamar al
procedimiento cada +e* qe qeramos escri#ir el r)tlo en lgar de tener qe repetir todo el c)digo. All$
+amos.
A#rimos n ne+o programa - empe*ar2amos a escri#ir lo qe +a en s m)dlo principal. En este caso no
+amos a escri#ir toda+2a nada.
A!ora +amos a deFnir el procedimiento qe se +a a llamar Escri#eRotlo. Para !acerlo seleccionamos
.'e+a s#. en el men5 .Edici)n.. Tras escri#ir el nom#re - plsar Enter aparecer$ en la pantalla esto.
SGB Escri#eRotlo
E'1 SGB
A!ora +amos a escri#ir las instrcciones qe necsitamos para escri#ir el r)tlo dentro de las dos l2neas
qe !a escrito QBasic.
SGB Escri#eRotlo
PRI'T .``````````````````.
PRI'T .` /E(/O E' RO'1A `.
PRI'T .``````````````````.
E'1 SGB
Tam#i9n podemos aEadir en el enca#e*ado na descripci)n como comentario.
SEste procedimiento escri#e ./ec!o en Ronda. en
Sla pantalla rodeado de asteriscos.
S
SGB Escri#eRotlo
PRI'T .``````````````````.
PRI'T .` /E(/O E' RO'1A `.
PRI'T .``````````````````.
E'1 SGB
A!ora0 para +ol+er al m)dlo principal plsamos A2 - seleccionamos el primer nom#re de la lista qe
ser$ .Sincnom#re. si toda+2a no !emos gardado el programa0 o el nom#re del Fc!ero si -a lo !emos
gardado. En el m)dlo principal #astar$ con escri#ir
Escri#eRotlo
qe es la llamada al procedimiento para qe este se e,ecte. En n programa con m$s instrcciones
podemos llamar a los procedimientos todas las +eces qe !aga ;alta escri#iendo s nom#re0 - por s
pesto podemos llamar a n m)dlo desde dentro de otro.
Si a#res el Fc!ero del programa :`.BAS= con el editor de MS-1OS o con el Bloc de notas de 6indo7s
+er$s qe los m)dlos est$n realmente a continaci)n del m)dlo principal. Al a#rir los programas en
QBasic se +an separando para no tener listados tan largos - poder pasar ;$cilmente de no a otro
plsando A2.
1.1".B - >ARIABCES CO(ACES
En nestro peqeEo procedimiento no !emos tili*ado ningna +aria#le0 simplemente nos limitamos a
escri#ir n r)tlo en la pantalla. A!ora +amos a +er n peqeEo programa con n m)dlo en el qe se
smar$n los +alores de dos +aria#les. Recerda qe anqe aq2 aparece todo segido en QBasic s)lo
+er$s el programa principal - tendr$s qe plsar A2 para acceder al procedimiento.
(CS
a ^ 2
# ^ %
PRI'T a d #
MiProcedimiento SAq2 llamamos al procedimiento
PRI'T a d #
S
SEste procedimiento asigna +alores a las +aria#les a - #
S- mestra en pantalla la sma.
SGB MiProcedimiento
a ^ D
# ^ "
PRI'T a d #
E'1 SGB
>eamos a!ora el resltado qe se prodcir2a en la pantalla al e,ectar el programaH
Z
11
Z
E8traEo I'oK. Al principio la sma +ale Z0 desp9s dentro del procedimiento +ale 11 con los ne+os
+alores - desp9s ;era por arte de magia +el+e a +aler Z@@@
>eamos lo qe !ace el programa paso a pasoH
Borra la pantalla0 como siempre.
Asigna a la +aria#le a el +alor de %
Asigna a la +aria#le # el +alor de 2
Mestra en la pantalla la sma de a m$s # qe es Z
Entra en el procedimiento0 dondeH
Asigna a la +aria#le a del procedimiento el +alor de D
Asigna a la +aria#le # del procedimiento el +alor de "
Mestra en la pantalla la sma estas dos +aria#les qe es 11
Sale del procedimiento - sige con el programa principal
Mestra en pantalla la sma de las +aria#les a - # del programa principal qe sige siendo Z porqe ss
+alores no !an podido ser modiFcados desde el procedimiento
Aq2 se pede +er ;$cilmente qe las +aria#les son .locales. al m)dlo donde son declaradas :Recerda
qe QBasic las declara atom$ticamente al sarlas la primera +e*=0 -a sea este el m)dlo principal0 n
procedimiento SGB o na ;nci)n0 por lo tanto son +aria#les totalmente distintas anqe tengan el
mismo nom#re. Para e+itar con;siones se recomienda no repetir los nom#res de las +aria#les en los
distintos m)dlos.
En los temas anteriores dec2amos qe el tiempo de +ida de na +aria#le comien*a cando es declarada
:En Q#asic0 cando se sa por primera +e*=0 - termina cando el programa termina0 li#er$ndose la
posici)n de memoria qe tili*a#a - perdi9ndose s +alor0 por lo qe no se conser+a para la pr)8ima +e*
qe e,ectemos el programa. (on las +aria#les locales de los procedimientos ocrre lo mismo0
desaparecen al terminar la e,ecci)n del procedimiento - por lo tanto normalmente no se pede esperar
qe conser+en s +alor la pr)8ima +e* qe llamemos al procedimiento0 anqe sea drante la actal
e,ecci)n del programa.
En QBasic para e+itar esto - qe las +aria#les conser+en s +alor entre las distintas +eces qe llamemos
a los procedimientos se dispone de la instrcci)n STATI( qe nos permite declarar +aria#les dentro de
m)dlos de ;orma qe conser+en s +alor en scesi+as llamadas. Para m$s detalles so#re esta
instrcci)n conslta la a-da de QBasic. Si planiFcamos #ien la estrctra de nestro programa
normalmente no ser$ necesario tili*ar esta instrcci)n.
1.1".Z - >ARIABCES &COBACES
En algnas sitaciones nos pede interesar qe na +aria#le .peda ser +ista. por todos los
procedimiento qe integran nestro programa. Esta +aria#le la declararemos de na ;orma especial al
propicio del m)dlo principal del programa - -a podr$ ser sada :le2da o modiFcada= por el propio
m)dlo principal o por calqier otro procedimiento. >eamos el mismo programa del tema anterior0 pero
esta +e* sando +aria#les glo#alesH
1IM S/ARE1 a0#
(CS
a ^ 2
# ^ %
PRI'T a d #
MiProcedimiento SAq2 llamamos al procedimiento
PRI'T a d #
S
SEste procedimiento asigna +alores a las +aria#les a - #
S- mestra en pantalla la sma.
SGB MiProcedimiento
a ^ D
# ^ "
PRI'T a d #
E'1 SGB
Aa!ora el resltado ser2aH
Z
11
11
Se pede +er qe el c)digo es m- parecido0 sal+o la :gran= di;erencia de qe declaramos al principio del
m)dlo principal las +aria#les a - # sando la instrcci)n 1IM S/ARE1. 1IM es para declarar +aria#les -
S/ARE1 para qe sean glo#ales :compartidas=.
En la primera parte del programa asignamos los +alores a las +aria#les - mostramos la sma. 1esp9s
llamamos al procedimiento qe modiFca los +alores de las +aria#les a - #0 qe en este caso son las
mismas qe las del m)dlo principal0 - mestra la sma0 qe es 11. Al salir del procedimiento0 -a en el
m)dlo principal se mestra la sma qe sige siendo 11 porqe el procedimiento !a modiFcado las
+aria#les glo#ales.
Cas constantes deFnidas en el m)dlo principal siempre ser$n glo#ales0 mientras qe las qe deFnimos
dentro de n procedimiento SGB o ;nci)n ser$n locales0 solo +isi#les dentro del mismo igal qe las
+aria#les locales.
1.1".Y - PASO 1E PARJMETROS
En los procedimientos qe !emos programado !asta a!ora no e8ist2an par$metros. Co m$s normal es
qe el procedimiento tome algna in;ormaci)n como entrada0 igal qe !acen procedimientos -a
deFnidos como PRI'T qe sa como par$metro la cadena de te8to o e8presi)n qe qeremos qe se
escri#a en la pantalla.
Al con,nto de par$metros de n m)dlo se le conoce como I'TERAAf porqe es la principal ;orma qe
tiene de compartir e intercam#iar in;ormaci)n con el resto del programa.
>eamos como e,emplo n procedimiento qe acepta como par$metros dos enteros - escri#e en la
pantalla el ma-or de ellos. Ce +amos a llamar Escri#eElMa-or. Tam#i9n est$ aq2 la llamada qe se !ace
desde el m)dlo principal.
SPrincipal
(CS
Escri#eElMa-or %0 Y
SEscri#e en pantalla s)lo el n5mero ma-or de los dos par$metros
S1atos de entradaH '10 '2H Reales
SGB Escri#e el Ma-or:'10 '2=
IA '1 O '2 T/E'
PRI'T '1
ECSE
PRI'T '2
E'1 IA
E'1 SGB
>amos a +er con detalle la primera l2nea de la deFnici)n del procedimiento. Gsamos la pala#ra SGB
segida del nom#re del procedimiento - a continaci)n +iene lo ne+o. (omo antes no s$#amos
par$metros no pon2amos nada m$s0 pero como a!ora tenemos dos par$metros0 los 1E(CARAMOS entre
par9ntesis. Cos par$metros son +aria#les qe ser$n mane,adas desde dentro del m)dlo0 - por lo tanto
igal qe las otras +aria#les normales tienen s tipo de datos - n nom#re qe de#e de segir las
mismas normas de constrcci)n. En este caso como no !emos sado sF,os se entiende qe son reales
de precisi)n sencilla0 si !#i9ramos pesto al Fnal del nom#re n [ ser2an enteros0 o de cadenas si
!#i9ramos pesto n U.
Gn m)dlo :sea n procedimiento o na ;nci)n qe -a +eremos m$s adelante= pede lle+ar tantos
par$metros como !aga ;alta0 o ningno0 - estos no tienen por qe ser del mismo tipo. Co importante es
qe a la !ora de llamar al m)dlo tenemos qe escri#ir a continaci)n del nom#re constantes o
e8presiones qe enca,en en n5mero - tipo con los par$metros qe acepta el m)dlo. En este e,emplo se
esperan dos n5meros0 por lo tanto !a#r$ qe poner e8actamente dos e8presiones nm9ricas0 ni m$s ni
menos0 - tampoco podemos sar cadenas en este caso.
En el e,emplo pasamos como par$metros en la llamada al procedimiento dos e8presiones constantes -
por lo tanto no de#e de !a#er ningna dda0 pero cando pasamos como e8presi)n na +aria#le peden
pasar algnas cosas algo inesperadas. >eamos otro e,emplo.
SPrincipal
(CS
n ^ %
PRI'T n
MltiplicaPor1os n
PRI'T n
SM)dlo Mltiplica por dos
SMltiplica por dos el argmento
S1atos de entradaH nmeroH Real qe se mltiplicar$ por dos
SGB MltiplicaPor1os :nmero=
nmero ^ nmero ` 2
E'1 SGB
El resltado ser2aH
%
D
Es ;$cil de entenderH En el programa principal se asigna a n n +alor0 a continaci)n se llama a n
procedimiento qe toma n como entrada0 anqe dentro se llame nmero0 - al terminar se o#ser+a qe
el +alor de n !a sido cam#iado por el procedimiento.
Esto !a ocrrido porqe en Q#asic0 si no se especiFca lo contrario0 se pasan los par$metros de los
m)dlos POR REAERE'(IA0 es decir0 si n par$metro es na +aria#le esta podr$ ser modiFcada por el
m)dlo. Para e+itar esto0 - qe los m)dlos no pedan modiFcar los +alores de las +aria#les qe se les
pasan como par$metros lo qe !a- qe !acer es escri#ir en la llamada al m)dlo la +aria#le entre
par9ntesis. A esto se llama PASO 1E PARJMETROS POR >ACOR - en este caso lo qe se pasa es s)lo n
n5mero0 - no la direcci)n de la +aria#le original qe qeda .a sal+o. del m)dlo. >eamos n e,emploH
SPrincipal
a ^ D
# ^ B
c ^ Y
PonA(ero :a=0 :#=0 :c=
PRI'T a0 #0 c
PonA(ero :a=0 #0 :c=
PRI'T a0 #0 c
PonA(ero a0 #0 c
PRI'T a0 #0 c
SEste procedimiento asigna Q a los tres par$metros
SEntreadaH na0 otra0 -OtraH Reales
SGB PonA(ero:na0 otra0 -Otra=
na^Q
otra^Q
-Otra^Q
E'1 SGB
El resltado ser2aH
D B Y
D Q Y
Q Q Q
(omo se pede +er0 la primera +e* qe llamamos al procedimiento pasamos los tres par$metros por
+alor - no se prodce cam#io algno en las +aria#les del programa principal.
En la segnda llamada pasamos la +aria#le # por re;erencia :'o lle+a los par9ntesis= - s +alor es
moiFcado.
Ca 5ltima +e* pasamos todo por re;erencia - las tres +aria#les son modiFcadas - aca#an con +alor Q.
En los e,emplos qe !emos pesto los par$metros tienen nom#res distintos de las +aria#les del
programa principal. Es lo qe se sele !acer0 -a qe de#en lle+ar nom#res representati+os. Si !#iera
coincidido alg5n nom#re no pasa a#soltamente nada porqe se trata de +aria#les distintas. Co qe no
podemos !acer es sar nom#res de +aria#les glo#ales ni de otros m)dlos.
En n apartado posterior se !ace na comparaci)n con los procedimientos - se dan sgerencias de
cando sar paso de par$metros por re;erencia - cando por +alor.
1.1".D - 1EAI'I(T' 1E AG'(IO'ES
Este apartado se !a qedado para casi el Fnal del tema de m)dlos porqe la 5nica di;erencia qe !a-
entre n procedimiento - na ;nci)n es qe n procedimiento no de+el+e directamente ning5n +alor
:Anqe pede modiFcar +aria#les del inter;a*=0 mientras qe na ;nci)n de+el+e n +alor qe es
sado por la e8presi)n en la qe est$ insertada la llamada a la ;nci)n.
Para deFnir ;nciones saremos la orden .'e+a Anci)n. del men5 .Edici)n. - escri#iremos nestro
c)digo entre las l2neas
AG'(TIO' nom#reAncion
E'1 AG'(TIO'
(omo +imos en el apartado de llamadas a procedimientos - ;nciones para llamar a n procedimiento
escri#imos s nom#re - ss par$metros al principio de na l2nea - este !ace .lo qe sea.0 mientras qe
para llamar a na ;nci)n !a#r$ qe poner s nom#re en na e8presi)n segida de los argmentos entre
par9ntesis0 si e8isten.
Para determinar el tipo de dato qe de+el+e na !a#r$ qe +er s nom#re. Si no lle+a sF,o se entiende
qe de+el+e n +alor real de precisi)n sencilla0 si lle+a n [ de+el+e n entero0 si lle+a n U de+el+e
na cadena0 etc.
? dentro de la ;nci)n para indicar el +alor a de+ol+er saremos el nom#re de la ;nci)n segido del
signo Igal - la e8presi)n c-o +alor se de+ol+er$. >eamos nos cantos e,emplos de ;nciones con n
programa principal qe las llama a todasH
SPrincipal
(CS
PRI'T .Ca sma de dos - dos es . L Sma:20 2=
media ^ Media":%0 Y0 12=
PRI'T .Ca media de %0 Y - 12 es .0 media
PRI'T .El ma-or de 1B o D es .L ElMa-or:1B0 D=
IA CaMasCarga:.Ronda.0.Otorrinolaring)logo.= ^ .Ronda. T/E'
PRI'T .SRondaS es m$s larga qe la otra pala#ra.
ECSE
PRI'T .SRondaS es m$s corta qe la otra pala#ra.
E'1IA
PR'T 'o/ace'ada :20 .Pala#ra.=
SAnci)n SmaH Sma dos +alores
SEntradaH n1 - n2H Reales0 +alores a smar
SSalidaH de+el+e la sma como real
AG'(TIO' Sma:n10 n2=
Sma ^ n1 d n2
E'1 AG'(TIO'
SAnci)n Media"H (alcla la media de " +alores enteros
SEntradaH n10 n2 - n"H Enteros
SSalidaH de+el+e la media como real
AG'(TIO' Media":n10 n20 n"=
Media" ^ :n1 d n2 d n"= a "
E'1 AG'(TIO'
SAnci)n Ma-orH 1e+el+e el ma-or de dos n5meros
SEntradaH n1 - n2H Reales0 +alores a comparar
SSalidaH de+el+e el ma-or de los dos como real
AG'(TIO' Ma-or:n10 n2=
IA n1 O n2 T/E'
Ma-or ^ n1
ECSE
Ma-or ^ '2
E'1 IA
E'1 AG'(TIO'
SAnci)n CaMasCargaUH 1e+el+e la cadena m$s larga de las dos
SEntradaH cad1U - cad2UH (adenas de longitd +aria#le
SSalidaH de+el+e la cadena m$s larga
AG'(TIO' CaMasCargaU:cad1U0 cad2U=
IA CE':cad1U= O CE':cad2U= T/E'
CaMasCargaU ^ cad1U
ECSE
CaMasCargaU ^ cad2U
E'1 IA
E'1 AG'(TIO'
SAnci)n 'o/ace'adaUH 1e+el+e Q siempre porqe no le asignamos nada.
S :Cos c$lclos qe !ace no tienen ningn e;ecto=
SEntradaH n[ - cadUH Gn entero - na cadena de longitd +aria#le
SSalidaH Siempre Q
AG'(TIO' 'o/ace'ada:n[0 cadU=
8 ^ 12"%BZ d YD
cadenaU ^ cadU d ./ec!o en Ronda.
8 ^ 8 a n[
E'1 AG'(TIO'
Por si !a- algna dda el resltado ser2a esteH
Ca sma de dos - dos es %
Ca media de %0 Y - 12 es Y.ZZZZZY
El ma-or de 1B o D es 1B
SRondaS es m$s corta qe la otra pala#ra
Q
A!ora +eamos algnas cosas importantes qe !a- en los e,emplos.
Ca llamada a las ;nciones se pede !acer desde la intrcci)n PRI'T o calqier otra instrcci)n0 en na
e8presi)n qe se asignar$ a na +aria#le0 siempre a la derec!a del signo igal0 o en na e8presi)n qe
se sa como condici)n de n IA0 6/ICE0 etc...
Para de+ol+er el resltado se asigna na e8presi)n al nom#re de la ;nci)n0 en s interior0 normalmente
al Fnal. Si esto no se llega a !acer nnca0 como pasa en la ;nci)n 'o/ace'ada0 se de+el+e cero o na
cadena de longitd cero si era na ;nci)n de tipo cadena. Si se llegan a e,ectar m$s de na de estas
asignaciones el +alor qe se de+el+e es el 5ltimo. Por spesto el +alor qe se asigna tiene qe ser
nm9rico o de cadena dependiendo del tipo de datos de la ;nci)n.
En el mismo programa no pede !a#er dos m)dlos con el mismo nom#re.
1.1".] - RE(GSI>I1A1
(omo !emos +isto la programaci)n modlar consiste en qe nos m)dlos se llamen a otros para
estrctrar - di+idir el programa0 e+itar partes repetidas0 retili*ar c)digo0 etc. El programa principal
llama a nos m)dlos :?a sean procedimientos o ;nciones= - estos a s +e* peden llamar a otros
m)dlos. (on;orme los m)dlos terminan de ser e,ectados de+el+en el control al qe lo llam) qe
sige e,ect$ndose - cando termina0 si era el m)dlo principal0 el programa termina.
Clamamos recrsi+idad a la posi#ilidad de qe n m)dlo se peda llamar a si mismo. Esto normalmente
se !ace con ;nciones qe de+el+en +alores qe +amos acmlando0 comparando0 etc.
El principal pro#lema de esta ;orma de programar es qe si na ;nci)n se llama indeFnidamente a si
misma las direcciones de retorno de las instrcciones se +an acmlando en la memoria del ordenador
!asta qe no !a- espacio sFciente - se prodce n error de tipo .Espacio en pila agotado.. Gna .Pila. es
na ;orma de almacenar datos en la memoria qe sa internamente QBasic :? calqier otro lenga,e=
de ;orma qe se +a amontonando in;ormaci)n igal qe si se tratara de na pila de li#ros o de platos
para poder sacarla en el orden in+erso :cogiendo siempre el de arri#a=0 - si esta se !ace m- grande
ocpar$ todo el espacio qe tiene disponi#le - pro+ocar$ este error qe no tiene nada qe +er con
ningna #ater2a de electricidad ni nada de eso.
Para e+itar el error lo qe se !ace siempre es poner algna condici)n qe si -a no se cmple no
segimos llamando a la ;nci)n - -a lo qe se !ace es ir +ol+iendo !acia atr$s - terminando todas las
copias de la ;nci)n qe tenemos .empe*adas. !asta qe aca#a la 5ltima - se +el+e al m)dlo principal
- el programa termina.
>eamos n e,emplo m- t2pico de n programa qe calcla el ;actorial de n n5mero sando
recrsi+idad.
SPrincipal
I'PGT .Escri#e el n5meroH .L nM
PRI'T .El ;actorial de .L nML . es .L AactorialM:nM=
SAA(TORIACH (alcla el ;actorial de ;orma recrsi+a
SEntradaH Real de do#le precisi)nH '5mero a calclar
SSalidaH El ;actorial como real de do#le precisi)n
AG'(TIO' AactorialM:nM=
IA nM ^ 1 T/E'
AactorialM ^ 1
ECSE
AactorialM ^ nM ` AactorialM:nM - 1=
E'1 AG'(TIO'
A!ora +eamos el planteamiento del pro#lema. El ;actorial de n n5mero es el prodcto de todos los
n5meros desde 1 !asta el n5mero0 por e,emplo el ;actorial de % es % ` " ` 2 ` 10 es decir0 2%. Para
calclarlo de ;orma recrsi+a !emos deFnido el ;actorial de n n5mero como el prodcto de dic!o
n5mero por el ;actorial del .n5mero anterior.. Para salir de la recrsi+idad ponemos como condici)n qe
si el n5mero es 1 el ;actorial -a es 1 - no tenemos qe segir llamando a la ;nci)n.
/emos deFnido tanto la ;nci)n como las +aria#les de tipo real de do#le precisi)n :poni9ndole el \ como
sF,o= porqe es el tipo de datos de QBasic qe admite +alores m$s altos -a qe el ;actorial pede
alcan*ar +alores m- ele+ados.
>eamos lo qe ocrrir2a paso a paso sponiendo qe el sario qiere calclar el ;actorial de %.
El programa principal llama a ;actorial - le pasa %.
1entro de ;actorial0 % es distinto de 1 - se calcla como % por ;actorial de ".
1entro de la segnda copia de ;actorial0 " es distinto de 1 - se calcla como " por ;actorial de 2.
1entro de la tercera copia de ;actorial0 2 es distinto de 1 - se calcla como 2 por ;actorial de 1.
1entro de la carta copia de ;actorial0 1 es igal a 1 - se calcla ;actorial como 1 directamente. Esta
copia de la ;nci)n termina s e,ecci)n - de+el+e 1.
Ca tercera copia de ;actorial toma el +alor 1 de+elto por la carta0 calcla el ;actorial 2 ` 1 ^ 2 - termina
de+ol+iendo este +alor.
Ca segnda copia de ;actorial toma el +alor 2 de+elto por la tercera0 calcla el ;actorial " ` 2 ^ Z -
termina de+ol+iendo este +alor.
Ca primera copia de ;actorial toma el +alor Z de+elto por la segnda0 calcla el ;actorial % ` Z ^ 2% -
termina de+ol+iendo este +alor.
El programa principal toma este +alor 2% qe -a es el deFniti+o0 lo escri#e en pantalla - termina.
(omo se !a podido +er con;orme +amos entrando en las ;nciones se +an llamando a si mismas
scesi+amente !asta el pnto en qe na de ellas -a no lo !ace m$s - termina de+ol+iendo n +alor a la
anterior qe lo +a acmlando - termina. As2 todas se +an cerrando !asta qe llegamos al programa
principal qe se qeda con el 5ltimo +alor - termina el programa.
Si !#iera !a#ido algna +aria#le local es m- importante comprender qe anqe !a-a mc!as copias
de la ;nci)n - todas tienen el mismo nom#re se trata de +aria#les totalmente distintas0 cada na de s
copia de la ;nci)n0 qe no compartir$n ss +alores en ning5n caso - en todo caso estar2an ocpando
memoria por separado.
Podemos compro#ar qe si intentamos calclar con este programa el ;actorial de n n5mero sperior a
apro8imadamente "Q se prodce el error de .Espacio en pila agotado. -a qe tenemos en memoria a la
+e* "Q copias de la ;nci)n con ss +aria#les de entorno - ss pnteros a las ;nciones qe los !an
llamado. En n programa no recrsi+o casi nnca llegaremos a tener ;nciones .anidadas tan
pro;ndamente. - no se prodcir$ este error.
(omo se !a podido +er la programaci)n recrsi+a es algo di;2cil de entender - qe pede llegar a
prodcir errores :En otros lenga,es se #loqear2a el ordenador al des#ordarse la pila=. Este pro#lema se
pod2a !a#er reselto con n #loqe AOR de na ;orma tan sencilla como estaH
;actorial\ ^ 1
AOR i ^ 1 TO n
;actorial\ ^ ;actorial\ ` n
'EXT
Todos los pro#lemas se peden resol+er siempre de la ;orma normal con condiciones - #cles :Esqema
iterati+o= o sando m)dlos qe se llaman a si mismo :Esqema recrsi+o=. Solo de#eremos tili*ar la
recrsi+idad cando demostremos en la ;ase de an$lisis del programa qe el algoritmo recrsi+o es m$s
r$pido o m$s corto qe el iterati+o. En la ma-or2a de pro#lemas sencillos normales - con las distintas
posi#ilidades de sar #cles REPETIR - MIE'TRAS qe o;rece QBasic - los otros lenga,es estrctrados
es aconse,a#le e+itar la recrsi+idad siempre qe se peda -a qe pede ser di;2cil demostrar
matem$ticamente qe n procedimiento complicado sado de ;orma recrsi+a no +a a llegar a
e,ectarse demasiadas +eces des#ordando la pila - llegando a detener la e,ecci)n del programa.
1.1".1Q - 1IAERE'(IA E'TRE
PRO(E1IMIE'TOS ? AG'(IO'ES
En la programaci)n modlar !emos di;erenciado dos tipo de m)dlosH Cas ;nciones0 qe de+el+en n
+alor tras s e,ecci)n - los procedimientos qe no de+el+en ning5n +alor.
En el lenga,e de QBasic la ;orma de llamar a no - a otro es distinta pero en otros lenga,es como (
todos los m)dlos son igales - es el sario el qe tiene qe determinar si sa al +alor de+elto por los
m)dlos insertando s llamada en na e8presi)n0 o no.
Qeda claro qe tendremos qe sar na ;nci)n cando qeramos o#tener n +alor - tendremos qe
sar n procedimiento cando solo qeramos qe se !aga algo o #ien qeramos estrctrar el programa
di+idi9ndolo en +arias partes qe ser$n llamadas cando !aga ;alta por n men5 sitado en el m)dlo
principal.
'os pede ocrrir qe necesitemos qe n m)dlo nos de+el+a dos o m$s +alores del mismo o de
distinto tipo. En este caso no podemos sar na ;nci)n porqe esta s)lo de+el+e n +alor. /a#r$ qe
sar n procedimiento al qe le pasaremos par$metros por re;erencia - nos los de+ol+er$ modiFcados
cando termine. >eamos n e,emplo m- sencillo de n procedimiento qe intercam#ia el +alor de dos
+aria#lesH
SPrincipal
a ^ ]2
# ^ Y
PRI'T .a +ale .L aL . - # +ale .L #
Intercam#ia a0 #
PRI'T .a +ale .L aL . - # +ale .L #
SProcedimiento Intercam#ia
SIntercam#ia los +alores de dos +aria#les nm9ricas
SEntradaH a - #H Reales c-os +alores ser$n intercam#iados
SGB Intercam#ia:a0 #=
a8 ^ a
a ^ #
# ^ a8
E'1 SGB
1onde el resltado ser2aH
a +ale ]2 - # +ale Y
a +ale Y - # +ale ]2
El programa es m- ;$cil de entender. El procedimiento modiFca las dos +aria#les qe se le !an pasado
por re;erencia. En este caso las dos +aria#les son del mismo tipo0 pero en otro pro#lema pod2an !a#er
sido de calqiera - se modiFcar2an igal.
Por ltimo aclarar dos conceptos importantes en la teor2a de la programaci)n modlarH
Clamamos .Anciones Pras. a las qe tienen estas caracter2sticasH
Solo comparte datos con el resto del programa a tra+9s de ss +aria#les de inter;a*0 es decir0 ss
par$metros.
Todos los par$metros se pasan por +alor.
'o pide o mestra in;ormaci)n al sario ni a otros dispositi+os del sistema :1iscos0 impresoras0 etc...=.
'o sa tipos de datos deFnidos por el sario en el programa principal. :Esto +eremos lo qe es en
pr)8imos temas=
'o llama a ;nciones ni procedimientos qe no sean .pros..
1e esta ;orma consegimos qe al llamar a na ;nci)n con nos determinados par$metros siempre nos
de+el+a el mismo +alor0 - tam#i9n consegimos poderla sar en otro programa de QBasic solo con
copiarla - pegarla sin tener qe modiFcar ni aEadir nada estando completamente segros de qe s
;ncionamiento +a a ser siempre id9ntico.
Clamamos .procedimientos pros. a los qe tienen estas caracter2sticasH
Solo comparte datos con el resto del programa a tra+9s de ss +aria#les de inter;a*0 es decir0 ss
par$metros.
Todos los par$metros se pasan por re;erencia.
Pede compartir in;ormaci)n con el sario - con dispositi+os e8ternos.
En algnos casos0 especialmente en las ;nciones tendremos qe intentar qe sean pras0 - en todos los
programas ser$ con+eniente no a#sar de las +aria#les glo#ales -a qe peden !acer qe los errores
l)gicos sean di;2ciles de encontrar0 adem$s de qe si samos n m)dlo en otro programa ser$ necesario
qe e8istan las mismas +aria#les glo#ales para qe todo ;ncione #ien0 cosa qe pede ser n pro#lema.
1.1".11 - PROTOTIPOS
Si !as gardado alg5n programa de los qe incl-en procedimientos o ;nciones !a#r$s o#ser+ado qe
al !acerlo aparecen atom$ticamente al principio del listado0 en el m)dlo principal0 nas l2neas qe
empie*an con 1E(CARE SGB o 1E(CARE AG'(TIO' segida de los nom#res - los par$metros de los
m)dlos.
Estas l2neas son lo qe se conoce en programaci)n como prototipos de procedimientos - ;nciones. 'o
tienen nada qe +er con los prototipos de n ne+o in+ento qe est$ en desarrollo ni nada de eso0 sir+en
para indicarle a QBasic de qe tipo son los par$metros - los datos qe de+el+en los m)dlos para qe
los .cono*ca. antes de ser llamados - no tenga qe ir a #scarlos por todo el c)digo ;ente del programa
cada +e* qe !agan ;alta.
Estas l2neas las escri#e atom$ticamente QBasic al gardar los programas - nosotros no tenemos qe
molestarnos en escri#irlas ni conocer s sinta8is correcta.
Si nestro programa no tiene los prototipos0 -a sea porqe los !emos #orrado o porqe toda+2a no
!emos gardado el programa - no se !an creado0 todo ;nciona per;ectamente pero se spone qe las
llamadas a m)dlos +an algo m$s lento :no lo !e cronometrado=. Si #orramos los prototipos +ol+er$n a
aparecer la pr)8ima +e* qe gardemos el programa.
Cos prototipos0 si e8isten0 siempre +an a ser la primera l2nea del programa0 antes no pede !a#er
ningna instrcci)n e,ecta#le. Si mo+emos los prototipos !acia a#a,o o escri#imos algna instrcci)n
antes se generar$ n error - tendremos qe +ol+er a de,arlos al principio. Co qe s2 podemos escri#ir
antes de los prototipos al principio del programa son l2neas de comentario :Qe empie*an con n
ap)stro;o=. Es com5n en QBasic0 cando tenemos n programa terminado m$s o menos largo0 escri#ir al
principio +eintitantas l2neas de comentario qe incl-en n t2tlo #onito - algna descripci)n para qe
ocpen la primera pantalla del listado - sea lo primero qe se +e en el editor al a#rir el programa.
Si -a tenemos nestros m)dlos0 !emos gardado el programa - se !an generado los prototipos0 -
desp9s !acemos alg5n cam#io en los par$metros de algno de ellos es posi#le qe la ca#ecera del
m)dlo no se corresponda con s prototipo - al e,ectar el programa se prod*ca alg5n error. En este
caso la ;orma m$s c)moda - m$s r$pida de solcionar el pro#lema es #orrando todos los prototipos -
gardando el programa para qe se generen de ne+o correctamente0 me,or qe intentar arreglarlos
nosotros mismos.
Tam#i9n pede ser importante sa#er qe n prototipo no se generar$ si toda+2a no llamamos al m)dlo
desde ningna otra parte del programa0 anqe el c)digo -a est9 escrito.
TEMA 1.1%
TIPOS 1E 1ATOS 1EAI'I1OS POR EC GSGARIO
1.1%.1 - 1eFnici)n de ne+os tipos de datos
1.1%.2 - Gna apro8imaci)n a la programaci)n orientada a o#,etos
1.1%.1 - 1EAI'I(IT' 1E
'GE>OS TIPOS 1E 1ATOS
/asta a!ora en na +aria#le pod2amos almacenar solo n dato :Gn n5mero entero o real0 na cadena0
etc...= o pod2amos sar arra-s para mane,ar gran cantidad de datos0 pero siempre se tratar2a de na
colecci)n de datos del mismo tipo. En este tema +amos a +er como deFnir tipos de datos qe contengan
m$s de n +alor qe pede ser de tipos distintos a la +e*.
Imaginemos na agenda donde necesitamos mane,ar nom#re direcci)n0 tel9;ono0 - edad de las
personas. >emos qe los tres primeros datos son cadenas0 anqe el tel9;ono ser$ siempre m$s corto
qe los otros dos0 - la edad es n entero. (on lo qe !emos +isto !asta a!ora tendr2amos qe sar para
cada indi+ido catro +aria#les distintas qe mane,aremos por separado0 -a sean +aria#les simples o
+ectores con s#2ndices para mc!as personas a la +e*.
>eamos n programa m- sencillo qe pide los datos de dos personas0 los almacena en estas ne+as
+aria#les qe +amos a +er - Fnalmente presenta en el nom#re de la qe sea m$s ,o+en. Qe nadie se
asste0 desp9s e8plicaremos lo qe es cada cosa.
T?PE TIPOPERSO'A
nom#re AS STRI'& ` "Q
direccion AS STRI'& ` %Q
tele;ono AS STRI'& ` ]
edad AS I'TE&ER
E'1 T?PE
1IM persona1 AS TIPOPERSO'A
1IM persona2 AS TIPOPERSO'A
(CS
I'PGT .'om#re de la primera personaH .0 persona1.nom#re
I'PGT .1irecci)n de la primera personaH .0 persona1.direccion
I'PGT .Tel9;ono de la primera personaH .0 persona1.tele;ono
I'PGT .Edad de la primera personaH .0 persona1.edad
PRI'T
I'PGT .'om#re de la segnda personaH .0 persona2.nom#re
I'PGT .1irecci)n de la segnda personaH .0 persona2.direccion
I'PGT .Tel9;ono de la segnda personaH .0 persona2.tele;ono
I'PGT .Edad de la segnda personaH .0 persona2.edad
PRI'T
IA persona1.edad N persona2.edad T/E'
PRI'T .El m$s ,o+en es .L persona1.nom#re=
ECSE
PRI'T .El m$s ,o+en es .L persona2.nom#re=
E'1 IA
El resltado ser2aH
'om#re de la primera personaH (arlos Rodr2ge*
1irecci)n de la primera personaH (arrera Espinel nj 1Y2 - ZjA
Tel9;ono de la primera personaH ]B2DYQQQQ
Edad de la primera personaH 2"
'om#re de la segnda personaH Aernando &arcia
1irecci)n de la segnda personaH Pla*a del A!orro nj 21 - %j(
Tel9;ono de la segnda personaH ]B2DY]]]]
Edad de la segnda personaH 1]
El m$s ,o+en es Aernando &arc2a
Si !#i9ramos sado +aria#les simples no tendr2a qe !a#er ning5n pro#lema I'oK0 pero como !emos
sado n tipo deFnido por el sario +amos a +erlo todo paso a paso.
Co primero qe !acemos de todo es declarar qe +amos a sar n ne+o tipo de datos qe se +a a
llamar TIPOPERSO'A - +a a estar ;ormado por catro miem#ros qe a!ora declaramos de ;orma
e8pl2citaH
'om#re +a a ser de tipo cadena con n m$8imo de "Q caracteres.
1irecci)n +a a ser de tipo cadena con n m$8imo de "Q caracteres.
Tel9;ono +a a ser de tipo cadena con n m$8imo de ] caracteres.
Edad +a a ser n entero.
? -a !emos terminado de declarar TIPOPERSO'A
A continaci)n declaramos dos +aria#les0 persona1 - persona2 como de tipo TIPOPERSO'A en +e* de
real o entero o algo as2.
1esp9s pedimos al sario los datos de la primera persona - los +amos gardando cada no en el lgar
correspondiente de la +aria#le persona1 sando el nom#re de la +aria#le segido de n pnto - del
nom#re del miem#ro al qe nos estamos reFriendo en cada caso. El tipo de datos qe podemos gardar
en cada sitio depende del tipo de dato del miem#ro0 por e,emplo en .edad no podemos gardar na
pala#ra.
Repetimos lo mismo0 pero esta +e* almacenando la in;ormaci)n en persona2.
Ainalmente !acemos na comparaci)n entre las dos edades - escri#imos el nom#re de la persona m$s
,o+en.
(omo se pede +er no es tan di;2cil. Co qe !emos !ec!o es agrpar catro +aria#les independientes
#a,o n nom#re com5n0 pero de todas ;ormas tendremos qe mane,ar cada na por separado sando el
nom#re de la +aria#le qe !a-amos declarado de este tipo segido del pnto - del nom#re del miem#ro.
Es m- importante entender qe TIPOPERSO'A no es na +aria#le0 sino n tipo de datos qe !emos
deFnido en nestro programa - se ne a los tipos STRI'&0 I'TE&ER0 CO'&0 SI'&CE - 1OGBCE de qe -a
dispone QBasic - qe para poderlo tili*ar !a- qe declarar e8pl2citamente qe na +aria#le sea de este
tipo sando la instrcci)n 1IM - qe ese nom#re qe le demos a la +aria#le ser$ el qe !a- qe tili*ar
en el c)digo del programa.
Si samos el nom#re de la +aria#le sin el pnto ni el nom#re de no de ss componentes miem#ro se
prodcir$ n error de .Tipos no coinciden. porqe QBasic no sa#e a cal de los miem#ros nos estamos
reFriendo. Si escri#imos mal el nom#re del componente se prodcir$ el error .Elemento no deFnido.. Si
escri#imos mal el nom#re de la +aria#le ocrrir$ qe QBasic se creer$ qe estamos sando na ne+a
+aria#le - aparentemente no ocrrir$ nada0 pero se peden prodcir errores de l)gica m- di;2ciles de
detectar0 pro#lema com5n en QBasic por no e8igir la declaraci)n de +aria#les.
Cos componentes miem#ro peden ser de calqiera de los cinco tipos de qe dispone QBasic0 solo qe
en el caso de qe se declaren como cadenas tendr$n qe ser de longitd F,a. /a#r$ qe poner la pala#ra
STRI'& segida de n asterisco :`= - del n5mero de caracteres qe +a a tener la cadena. (omo +imos en
el tema de tipos de datos si intentamos asignar na cadena de tamaEo sperior al m$8imo no ocrre
ning5n error0 pero todo lo qe so#re se pierde.
Tam#i9n podemos declarar alg5n miem#ro como de n tipo de datos -a deFnido por el sario
anteriormente en el mismo programa. >eamos n e,emploH
T?PE TIPO'OMBRE
nom#re AS STRI'& ` 1B
apellido1 AS STRI'& ` 1B
apellido2 AS STRI'& ` 1B
E'1 T?PE
T?PE TIPO1IRE((IO'
calle AS STRI'& ` "Q
nmero AS I'TE&ER
piso AS I'TE&ER
perta AS STRI'& ` 1
cp AS STRI'& ` B
cidad AS STRI'& ` 2Q
pro+incia AS STRI'& ` 2
E'1 T?PE
T?PE TIPOPERSO'A
nom#re AS TIPO'OMBRE
direccion AS TIPO1IRE((IO'
tele;ono AS STRI'& ` ]
edad AS I'TE&ER
E'1 T?PE
Si declaramos na +aria#le de TIPOPERSO'A !aciendoH
1IM persona AS TIPOPERSO'A
Para acceder a todos ss componentes escri#ir2amos cosas comoH
persona.nom#re.nom#re
persona.nom#re.apellido1
persona.direccion.calle
persona.direccion.cidad
persona.edad
1e esta ;orma podemos estrctrar m- #ien datos qe tengan na estrctra comple,a tili*ando na
,erarq2a de +aria#les qe pede resltar m- descripti+a0 pero tampoco con+iene pasarse.
'ormalmente no ser$ necesario sar m$s de dos o tres ni+eles de datos deFnidos por el sario porqe
si lo !acemos los identiFcadores de las +aria#les peden llegar a ser m- largos.
(omo se pede +er los miem#ros de distintos tipos de datos peden lle+ar nom#res igales. (omo
siempre +amos a sar estos nom#res ,nto con el nom#re de la +aria#le declarada qe s2 +a a ser
distinto en cada caso no !a#r$ ningna con;si)n.
Tam#i9n es m- 5til poder declarar arra-s de n tipo deFnido por el sario. Por e,emplo si samos el
TIPOPERSO'A del primer e,emplo podemos declarar n +ector de BQ personas !aciendoH
1IM personas :1 TO BQ= AS TIPOPERSO'A
? para acceder a los elementos del +ector !ar2amos cosas como...
personas:"=.nom#re
personas:1Y=.edad
personas:%Q=.tele;ono
...igal qe si se tratara de +ectores de n tipo normal0 solo qe !a#r$ qe especiFcar cal miem#ro
qeremos sar.
Es posi#le declarar +aria#les - m)dlos con el mismo nom#re qe n tipo de datos deFnido por el
sario0 pero para e+itar con;siones es recomenda#le e+itar esto a toda costa.
Podemos deFnir tipos de datos dentro de procedimientos o ;nciones0 pero si lo !acemos s)lo estar$n
disponi#les para las +aria#les qe declaremos dentro del mismo m)dlo. /a#r$ qe deFnirlos desp9s
de la l2nea SGB nom#re o AG'(TIO' nom#re. Cos tipos deFnidos en el m)dlo principal estar$n
disponi#les para todos los m)dlos del programa0 pero si desp9s qeremos e8portar m)dlos qe los
sen a otros programas tam#i9n !a#r$ qe copiar la deFnici)n del tipo de dato para qe todo ;ncione
correctamente.
Para la constrcci)n de los nom#res de los tipos de datos se sigen las mismas normas qe para los
nom#res de +aria#les - m)dlos. 'ormalmente se escri#e todo en ma-5sclas para qe resalte m$s - se
empie*a siempre por TIPO para darse centa ;$cilmente de qe no se trata de na +aria#le o n m)dlo.
El so intensi+o de tipos de datos deFnidos por el sario ,nto con las constantes a-dan a qe el
c)digo del programa qede m- detallado - sea m$s ;$cil de leer.
1.1%.2 - G'A APROXIMA(IT' A CA
PRO&RAMA(IT' ORIE'TA1A A OBVETOS
Antes de nada aclarar qe QBasic no es n lenga,e de programaci)n orientado a o#,etos.
En el apartado anterior !emos +isto como e,emplo na estrctra a la qe llam$#amos TIPOPERSO'A
qe ten2a nos datos miem#ros como son nom#re0 edad0 etc... - qe nos ser+2a como .molde. para crear
na o mc!as +aria#les qe tienen todas estas caracter2sticas.
Es ;$cil pensar en los tipos de datos como la deFnici)n de na (CASE de o#,etos qe agrpa a na serie
de 1ATOS MIEMBROS qe +an a tener todas las I'STA'(IAS de las +aria#les qe se declaren de esa
clase.
Esto pede ser la #ase de la Programaci)n Orientada a o#,etos. Gna ne+a metodolog2a de programaci)n
qe crea lo qe se llama .Tipos de datos a#stractos. qe adem$s de datos miem#ros incl-en
procedimientos miem#ros :M9todos= - se tili*a de ;orma qe pede retili*ar datos de otras clases -a
e8istentes creando lo qe se conoce como .Verarq2a de clases.. Estas clases ser$n sadas en los
programas para deFnir O#,etos de esa clase qe tendr$n todas estas caracter2sticas - podr$n ser
tili*ados por los programas llamando a ss m9todos.
Estas t9cnicas se tili*an ampliamente en lenga,es de programaci)n mc!o m$s a+an*ados como (dd0
O#,ect Pascal o Va+a donde los programadores peden sar o#,etos -a e8istentes o adem$s crear los
s-os propios deFniendo estas clases. Si !a qedado claro el tema de tipos de datos deFnidos por el
sario en QBasic - los mane,amos con soltra pede ser qe nos reslte n poco m$s sencillo :o menos
di;2cil= aprender a programar o#,etos en otros lenga,es m$s modernos de los qe se tili*an en la
actalidad0 anqe de todas ;ormas !a#r$ qe aprender toda na mltitd de conceptos ne+os -
t9cnicas de programaci)n qe no e8isten en QBasic.
TEMA 1.1B
AI(/EROS SE(GE'(IACES
1.1B.1 - Introdcci)n al so de Fc!eros
1.1B.2 - Introdccion a los Fc!eros secenciales
1.1B." - Escri#ir in;ormaci)n en Fc!eros secenciales
1.1B.% - Ceer in;ormaci)n de Fc!eros secenciales
1.1B.B - Ane8ar in;ormaci)n a Fc!eros secenciales
1.1B.1 - I'TRO1G((IT' AC GSO 1E AI(/EROS
/asta a!ora en nestros programas para almacenar in;ormaci)n !emos tili*ado +aria#les qe son la
;orma qe tienen los lenga,es de programaci)n de almacenar datos en la memoria RAM del ordenador.
Es na ;orma m- c)moda - e8tremadamente r$pida de mane,ar datos0 pero tiene el gra+e
incon+eniente de qe toda la in;ormaci)n se pierde al Fnali*ar la e,ecci)n del programa.
En el tema de los arra-s +imos +arios e,emplos de programas donde se ped2an los nom#res de las
personas qe +i+en en n #loqe de pisos. Todo ;nciona#a m- #ien pero !a#2a qe !artarse de escri#ir
todos estos nom#res cada +e* qe entr$#amos al programa porqe al terminar se pierden. Gna solci)n
para e+itar esto podr2a ser inclir los nom#res de las personas en el c)digo ;ente del programa0 pero
estos nom#res peden cam#iar algna +e* - el sario del programa no tiene por q9 sa#er como
modiFcar esto. Ca solci)n deFniti+a a este pro#lema consiste en gardar la in;ormaci)n en el sistema de
arc!i+os de las nidades de disco del ordenador donde permanecer$ por tiempo indeFnido - podremos
recperarla o modiFcarla todas las +eces qe qeramos.
Ca in;ormaci)n se almacena en los discos del ordenador en nas estrctras l)gicas llamadas Fc!eros o
arc!i+os. Mientras qe en na cinta de +2deo si gra#amos na pel2cla nosotros nos tenemos qe
preocpar de +er donde est$ el Fnal para gra#ar lo sigiente a continaci)n - no #orrar n tro*o de lo
qe -a tenemos0 en el ordenador es el sistema operati+o :MS-1OS0 Cin80 Etc.= el qe se encarga de
controlar en qe parte del disco se gra#an los datos - de ponerle n nom#re - sitarlo en el sistema de
arc!i+os :Ca AAT - los directorios= para qe nosotros podamos acceder a esa in;ormaci)n solo con dar el
nom#re del arc!i+o sin tener qe preocparnos de en qe parte del disco est$ o de si nos +amos a cargar
otra in;ormaci)n al gra#ar ne+os datos.
Principalmente !a- dos tipos de Fc!erosH Secenciales - de acceso aleatorio. Anqe est$n gra#ados en
los discos de id9ntica ;orma se di;erencian de c)mo los mane,amos nosotros desde nestro programa. En
los sigientes apartados +eremos las di;erencias - la ;orma de sar cada no de ellos.
Aic!eros secenciales son aqellos en qe los datos se gra#an o se leen l2nea a l2nea siempre empe*ando
por el principio. 'ormalmente al a#rirlo se copiar$ s contenido en algna estrctra de +aria#les de
nestro programa para s tili*aci)n - posi#le modiFcaci)n. 1esp9s si !a- qe gardarlo se !ar$
completamente sstit-endo a toda la in;ormaci)n qe !#iera anteriormente en el Fc!ero0 anqe
algna parte de la in;ormaci)n +el+a a ser la misma. El concepto es similar a lo qe !acemos con los
Fc!eros de las aplicaciones normales como procesadores de te8to o los propios Fc!eros `.BAS de los
programas de QBasic.
Aic!eros de acceso directo o acceso aleatorio :'o tiene nada qe +er con los iconos de acceso directo de
6indo7s= son los qe nos permiten leer o modiFcar n determinado dato sa#iendo s posici)n sin tener
qe recorrer todos los datos anteriores. El e,emplo m$s t2pico de estos Fc!eros son las ta#las de las
#ases de datos donde podemos aEadir0 modiFcar0 consltar o #orrar la in;ormaci)n de na persona :n
registro= sin preocparnos de los dem$s.
Ca e8tensi)n qe eli,amos para nestros Fc!eros pede ser calqiera0 pero de#eremos e+itar sar
e8tensiones -a sadas por otros programas qe podr2an pro+ocar conbictos en 6indo7s. Co m$s normal
es sar e8tensiones como .TXT para los Fc!eros secenciales qe solo contienen te8to - .1AT en general
para los qe peden contener te8to o calqier otro tipo de caracteres.
1.1B.2 - I'TRO1G((IT' A COSAI(/EROS SE(GE'(IACES
Ca ;orma m$s elemental de tra#a,ar con Fc!eros es leerlos l2nea por l2nea0 na tras otra0 para irlos
anali*ando o irlos gardando en na estrctra de datos de nestro programa. Si qeremos gardarlo se
!ar$ de la misma ;orma0 escri#iendo l2neas na tras otra desde la primera !asta la 5ltima. Cos Fc!eros
secenciales normalmente se leen siempre enteros - para gardarlos se pede elegir entre reempla*ar
completamente s contenido o #ien gardar las ne+as l2neas a continaci)n de la s e8istentes0 a lo qe
llamaremos .Ane8ar..
Entendemos por .C2nea. a na secencia de caracteres al;anm9ricos :Cetras0 n5meros - signos de
pntaci)n= terminados por el car$cter especial de retorno de carro qe es el qe se genera cando
plsamos la tecla Enter. Este car$cter no lo +emos en la pantalla pero se genera atom$ticamente al
Fnal de lo qe escri#imos con la orden PRI'T0 si no ponemos n pnto - coma al Fnal0 como +imos en el
tema de Entrada - Salida.
Para tra#a,ar con Fc!eros !a- qe .A#rirlos. especiFcando s nom#re - si qeremos leer o escri#ir en 9l.
A continaci)n leeremos o escri#iremos los datos0 seg5n corresponda por el modo en qe est$ a#ierto0 -
Fnalmente lo cerraremos.
1.1B." - ES(RIBIR I'AORMA(IT'
E' AI(/EROS SE(GE'(IACES
>amos con n e,emplo de n programa qe a#re n Fc!ero para escritra :lo crea=0 escri#e en 9l los
nom#res de los d2as de la semana - Fnalmente lo cierra.
OPE' .diasem.t8t. AOR OGTPGT AS M1
PRI'T M10 .Cnes.
PRI'T M10 .Martes.
PRI'T M10 .Mi9rcoles.
PRI'T M10 .Ve+es.
PRI'T M10 .>iernes.
PRI'T M10 .S$#ado.
PRI'T M10 .1omingo.
(COSE M1
Este programa no prodce ning5n resltado en la pantalla0 s)lo el r)tlo .Presione calqier tecla -
contin5e. para indicar qe !a terminado.
Si #scamos el Fc!ero diasem.t8t - lo a#rimos con el #loc de notas de 6indo7s compro#aremos qe
contiene lo sigienteH
Cnes
Martes
Miercoles
Ve+es
>iernes
Sa#ado
1omingo
Sal+o los t2picos pro#lemas con los acentos0 es lo qe esper$#amos. Si lo a#rimos con el E1IT de MS-1OS
+eremos los acentos correctamente.
A!ora +amos a comentar detalladamente como ;nciona el programa.
Ca primera l2nea es la m$s importante cando tra#a,amos con Fc!eros. Si la tradcimos al castellano
dice algo as2 comoH
A#re .diasem.t8t. para salida de datos - ll$male M1
>isto esto -a est$ claro s signiFcado pero de todas ;ormas !a- qe decir n mont)n de cosasH
Al a#rir n Fc!ero para escritra si no e8iste se crea - si e8iste se #orra s contenido para empe*ar
desde cero.
Si no especiFcamos na rta de directorios0 como !emos !ec!o en este caso0 el Fc!ero se crea en el
.directorio acti+o.. El directorio acti+o es en el qe nos encontr$#amos al entrar a QBasic desde MS 1OS.
En el case de qe !a-amos entrado desde 6indo7s ser$ el qe aparece en la casilla .Iniciar enH. de las
propiedades del acceso directo a QBasic. Para cam#iar el directorio acti+o desde QBasic podemos sar la
orden (/1IR segida de la ne+a rta de directorios. Esta orden la +eremos con m$s detalle en el tema
dedicado a comnicaci)n con aplicaciones e8ternas.
Si especiFcamos na rta tendr$ qe e8istir o se prodcir$ n error. Al crear n ne+o arc!i+o no se
crean directorios qe no e8istan.
El nom#re - rta del arc!i+o a a#rir se peden especiFcar de ;orma literal0 como !emos !ec!o aq20 o
#ien sar na e8presi)n de cadenas c-o +alor sea la rta - el nom#re del arc!i+o con la sinta8is
correcta :Barras in+ersas0 pntos - dem$s=.
Ca 5nica cosa qe nos pede resltar e8traEa de la instrcci)n OPE' es ese M1 qe aparece al Fnal. A
este nmero le llamamos .descriptor de arc!i+o. - nos +a a ser+ir para identiFcar n2+ocamente al
arc!i+o qe aca#amos de a#rir en las ordenes de entrada - salida de nestro programa !asta qe
cerremos el arc!i+o. Por lo tanto si a#rimos otro arc!i+o antes de cerrar este tendremos qe sar el
descriptor M2 - as2 scesi+amente. QBasic nos permite tener a#iertos a la +e* !asta 2BB arc!i+os0 pero
la memoria disponi#le - la cl$sla AICES del arc!i+o (O'AI&.S?S nos limitar$n el n5mero. 'ormalmente
no necesitaremos m$s de no o dos arc!i+os a#iertos a la +e* en nestros programas sencillos.
Sigiendo con el c)digo de nestro programa a continaci)n tenemos na serie de instrcciones PRI'T
qe como lle+an el descriptor de n arc!i+o escri#en en el arc!i+o en lgar de en la pantalla. Podemos
sarlas e8actamente de la misma ;orma qe cando las samos normalmente para escri#ir en pantalla.
'o tienen por q9 estar todas ,ntas.
Ainalmente lo qe !acemos es cerrar el arc!i+o con la orden (COSE. (on;orme +amos escri#iendo en el
arc!i+o con la orden PRI'T la in;ormaci)n no se gra#a en el disco inmediatamente0 sino qe se +a
almacenando de ;orma transparente para el sario en n $rea especial de la memoria :El .Bler. de
escritra en disco= o #ien en registros de memoria especial dentro de la placa de circtos del propio disco
dro - cando !a- in;ormaci)n sFciente es cando el ca#e*al del disco se me+e - la in;ormaci)n se
gra#a ;2sicamente en el disco. Al cerrar el arc!i+o nos asegramos de qe la in;ormaci)n qe qedara
por escri#ir se gra#e realmente en el disco0 - qe adem$s todos los recrsos tili*ados0 as2 como el
n5mero del descriptor se li#eren - qeden disponi#les para ser sados por otro arc!i+o. Si programamos
para n sistema mltitarea :6indo7s ]8 lo es0 m$s o menos= es m- importante ocpar los recrsos del
sistema el menor tiempo posi#le - por lo tanto de#eremos cerrar los arc!i+os qe -a no nos !agan ;alta
a#iertos anqe toda+2a +a-amos a segir tili*ando otras partes del programa drante m$s tiempo.
(ando a#rimos n Fc!ero este qeda disponi#le para todos los m)dlos :Programa principal0
procedimientos - ;nciones= de nestro programa0 con lo qe podemos a#rirlo desde n m)dlo0 leer o
escri#ir desde otro0 - cerrarlo desde otro0 pero siempre teniendo en centa qe solo lo podemos sar
desp9s de !a#erlo a#ierto - antes de cerrarlo.
1.1B.% - CEER I'AORMA(IT' 1E AI(/EROS SE(GE'(IACES
En el apartado anterior !emos a#ierto n arc!i+o para escritra. A!ora +amos a a#rir no e8istente para
leer s contenido. >eamos n e,emplo de n programa qe a#re el Fc!ero -a e8istente .diasem.t8t. qe
!emos creado con el programa anterior para mostrarlo en pantalla.
(CS
OPE' .diasem.t8t. AOR I'PGT AS M1
6/ICE 'OT EOA:1=
CI'E I'PGT M10 lineaU
PRI'T lineaU
6E'1
(COSE M1
Este programa no prodce ning5n cam#io en el arc!i+o - s resltado por pantalla esH
Cnes
Martes
Mi9rcoles
Ve+es
>iernes
S$#ado
1omingo
A!ora +eamos c)mo ;nciona.
Borramos la pantalla.
A#rimos el arc!i+o .diasem.t8t. para lectora :I'PGT= - le llamamos M1.
Mientras no se aca#e el arc!i+o 10 leemos l2nea por l2nea - las +amos escri#iendo en pantalla sando la
+aria#le lineaU.
(erramos el arc!i+o.
(omo se pede +er0 la instrcci)n OPE' es igal a la anterior0 s)lo +ar2a el modo de apertra qe en este
caso es I'PGT0 es decir0 entrada de datos0 lectra. Si el Fc!ero especiFcado no e8iste se prodcir$ n
error de tiempo de e,ecci)n. En el apartado de control de errores +eremos como detectar si n Fc!ero
e8iste antes de in+entar a#rirlo.
A continaci)n +amos le-endo las l2neas del arc!i+o. (omo no tenemos por q9 sa#er cantas l2neas
tiene el arc!i+o0 saremos n #cle MIE'TRAS qe sa como condici)n la ;nci)n EOA :End O; Aile= qe
de+el+e >erdadero si se !a alcan*ado el Fnal del arc!i+o - ;also en caso contrario. O#ser+a qe a EOA le
pasamos como par$metro el descriptor del arc!i+o0 pero sin el car$cter M. Esto es para poder sar
algna e8presi)n matem$tica qe de+el+a el nmero del arc!i+o si es qe tenemos +arios a#iertos - no
qeremos sar el n5mero de ;orma literal. 1entro del #cle lo qe !acemos es leer na l2nea sando la
instrcci)n CI'E I'PGT segida del descriptor del arc!i+o - del nom#re de la +aria#le donde la qeremos
gardar. Esta instrcci)n permite leer l2neas de !asta 2BB caracteres qe aca#en con n car$cter
especial de retorno de carro :Cas qe en el e,emplo anterior escri#imos con la orden PRI'T=.
Segidamente escri#imos en la pantalla el +alor de la +aria#le lineU sando la orden PRI'T como !emos
!ec!o siempre.
Ainalmente0 terminado el #cle0 cerramos el arc!i+o para de,ar el recrso disponi#le. (omo esta#a
a#ierto para lectra no se prodcir$ ning5n cam#io.
Es m- importante entender qe para leer dados de n Fc!ero secencial de#emos sar siempre n
#cle MIE'TRAS0 - no n REPETIR0 -a qe en este caso intentar2amos leer al menos na l2nea del Fc!ero
antes de compro#ar si se !a llegado al Fnal0 - se pede dar el caso de qe n Fc!ero e8ista0 pero est9
completamente +ac2o con lo qe intentar2amos leer m$s all$ del Fnal del Fnal del arc!i+o - generar2amos
n error de tiempo de e,ecci)n. En la a-da de QBasic +iene n e,emplo !ec!o con n #loqe 1O...COOP
- se pede compro#ar qe pede qe no ;ncione correctamente en el caso de qe el Fc!ero est9 +ac2o.
Tam#i9n podemos decir aq2 qe si somos nosotros qienes escri#imos el arc!i+o a leer sando n editor
de te8to es con+eniente plsar al Fnal la tecla E'TER na +e* para qe el crsor pase a la l2nea de a#a,o
- se genere el car$cter de retorno de carro. Si no lo !acemos pede ocrrir qe cando leamos el arc!i+o
con nestro programa de QBasic en algnos casos no se llege a leer la 5ltima l2nea. Esta indicaci)n
tam#i9n la !ace MS-1OS para los Fc!eros (O'AI&.S?S0 AGTOEXE(.BAT - los Fc!eros de proceso pro lotes
qe nosotros podamos escri#ir.
Para terminar con la teor2a de los Fc!eros secenciales +amos a +er n e,emplo de n programa qe
copia n Fc!ero de te8to en otro poni9ndole todo el te8to en ma-5sclas con a-da de la ;nci)n
G(ASEU. El sario tendr$ qe escri#ir los nom#res de los dos Fc!eros0 el e8istente - el ne+o0 - el
programa los a#rir$ los dos a la +e*0 no para lectra - el otro para escritra.
(CS
I'PGT .'om#re del Fc!ero de origen -a e8istenteH .0 Fc!1U
I'PGT .'om#re del ne+o Fc!eroH .0 Fc!2U
OPE' Fc!1U AOR I'PGT AS M1
OPE' Fc!2U AOR OGTPGT AS M2
PRI'T .Ce-endo - gra#ando0 por ;a+or espera....
6/ICE 'OT EOA :1=
CI'E I'PGT M10 lineaU
PRI'T M20 G(ASEU:lineaU=
6E'1
(COSE
PRI'T .Proceso terminado.
El resltado por pantalla podr2a serH
'om#re del Fc!ero de origen -a e8istenteH diasem.t8t
'om#re del ne+o Fc!eroH diasem2.t8t
Ce-endo - gra#ando0 por ;a+or espera...
Proceso terminado
? en los Fc!eros el qe psi9ramos primero no se modiFcar$0 mientras qe el segndo si no e8iste se
crea - si e8iste se so#rescri#e con el contenido del primero en ma-5sclas.
A!ora +eamos algnas cosas del programaH
(omo se pede +er0 tenemos dos Fc!eros a#iertos a la +e* - los identiFcamos con n descriptor
di;erente.
Ceemos datos mientras no se aca#e el Fc!ero 1 - los +amos escri#iendo al Fc!ero 2 con+ertidos a
ma-5sclas sando la ;nci)n G(ASEU.
Sacamos n mensa,e por pantalla antes de empe*ar - desp9s de terminar para qe el sario +ea .qe
!a pasado algo.. Si pre+emos qe el proceso +a a ser m- largo tendr2amos qe sacar alg5n mensa,e de
progreso cada +e* qe se !aga n n5mero de pasadas del #cle. Para !acer esto sar2amos alg5n
contador.
Ainalmente cerramos todos los Fc!eros a#iertos sando la orden (COSE sin pasarle ning5n descriptor.
Si escri#es el programa en QBasic - lo e,ectas podr$s compro#ar qe pede ser di;2cil acertar a la
primera con el nom#re del arc!i+o0 - m$s si ponemos na rta de directorios0 nidades de disco0 etc...
con lo qe se prodcir$ n error de e,ecci)n. Tam#i9n si se te ocrre poner el mismo nom#re las dos
+eces nos dar$ n error de tiempo de e,ecci)n diciendo qe el Fc!ero -a est$ a#ierto. En el tema de
mane,o de errores +eremos como se peden solcionar estos pro#lemas.
1.1B.B - A'EXAR I'AORMA(IT' A AI(/EROS SE(GE'(IACES
(ando a#r2amos n Fc!ero para escritra sando el modo OGTPGT dec2amos qe si no e8iste se crea -
si e8iste se #orra s contenido0 pero en algnos caso nos pede interesar qe el contenido del Fc!ero no
se #orre - las ne+as l2neas de in;ormaci)n se aEadan al Fnal del Fc!ero -a e8istente0 incrementando s
tamaEo. Es el caso de los Fc!eros .CO& qe tili*an mc!os programas para lle+ar n registro de
acciones o de pro#lemas qe pedan srgir - en los qe los distintos procesos o programas +an
aEadiendo in;ormaci)n con;orme +a !aciendo ;alta.
Ca ;orma de a#rirlo es sando el modo APPE'1 en la instrcci)n OPE'0 por e,emploH
OPE' .e+entos.t8t. AOR APPE'1 as M1
En este caso si no e8iste el Fc!ero e+entos.t8t se crea0 - si e8iste se conser+a0 aEad2endose la ne+a
in;ormaci)n al Fnal.
Ca ;orma de tra#a,ar con n Fc!ero a#ierto en modo APPE'1 es e8$ctamente la misma qe en no
a#ierto en modo OGTPGT. /a- qe recordar qe no podemos asegrar qe la in;ormaci)n se gra#a
;2sicamente en el Fc!ero !asta qe no lo cerremos con la orden (COSE.
El tamaEo de los Fc!eros sados s)lo de esta ;orma siempre +a a crecer - seremos nosotros los
encargados de o#ser+ar qe no se !ace demasiado grande - de #orrarlo cando -a no nos !aga ;alta la
in;ormaci)n qe contiene.
TEMA 1.1Z
AI(/EROS 1E A((ESO 1IRE(TO O ACEATORIO
1.1Z.1 - Introdcci)n a los Fc!eros directos
1.1Z.2 - Cectra - escritra en Fc!eros directos
1.1Z." - Mantenimiento de Fc!eros directos
1.1Z.".1 - Introdcci)n al mantenimiento de Fc!eros
1.1Z.".2 - Altas. AEadir registros
1.1Z."." - (onsltas. B5sqeda secencial de registros
1.1Z.".% - ModiFcaciones de registros
1.1Z.".B - Ba,as. Borrar registros
1.1Z.".Z - (ompactaci)n de Fc!eros directos
1.1Z.".Y - Ela#oraci)n de listados de datos
1.1Z.% - Bre+e idea so#re #ases de datos
1.1Z.B - Otras instrcciones relacionadas con Fc!eros
1.1Z.1 - I'TRO1G((IT' A COS AI(/EROS 1IRE(TOS
Cos Fc!eros secenciales los s$#amos de ;orma qe era necesario leerlos l2nea por l2nea siempre desde
el principio - sin saltar ningna0 - para gardarlos ocrr2a lo mismo. A!ora +amos a tra#a,ar con Fc!eros
de acceso directo o aleatorio0 qe estar$n ;ormados por .tro*os. de igal tamaEo0 - por lo tanto el
ordenador ser$ capa* de saltar al registro qe nosotros qeramos para leerlo o escri#irlo. Cos registros se
corresponden con la estrctra de n tipo de datos deFnido por el sario - para acceder a ellos
5nicamente se calcla s posici)n inicial a partir del n5mero de registro - de s tamaEo0 qe nos calcla
la ;nci)n CE'. 'o est$n separados de ningna ;orma0 -a no !a#lamos de l2neas ni de caracteres de
retorno de carro.
Otro concepto importante qe se introdce con los Fc!eros directos es el de .(ampo cla+e.. El campo
cla+e pede ser la posici)n dentro del arc!i+o donde se garda ese registro en concreto. Esto implica qe
el campo cla+e es 5nico -a qe no pede !a#er dos registros en la misma posici)n. Gn e,emplo de
campo cla+e podr2a ser el 1'I en na lista de personas o el n5mero de !a#itaci)n en la lista de
!a#itaciones de n !otel. Este dato no est$ escrito en la estrctra de datos del arc!i+o0 sino qe es
determinado por la posici)n del registro dentro del arc!i+o. Si samos como campo cla+e n n5mero
m- grande como el 1'I nos encontraremos con el incon+eniente de qe el arc!i+o llegar$ a tener n
tamaEo m- grande -a qe como +eremos m$s adelante los registros intermedios anqe est9n +ac2os
tam#i9n e8istir$n en el arc!i+o. 1e la misma ;orma el campo cla+e es o#ligatorio de especiFcar - no lo
podemos de,ar en #lanco0 -a qe no se sa#r2a en qe posici)n se garda el registro.
Co m$s inmediato es sar como campo cla+e n +alor nm9rico #a,o correlati+o :10 20 "...= qe el sario
+a-a escri#iendo0 o #ien qe el programa lo calcle atom$ticamente imitando a los tipos de datos
atonm9ricos de las #ases de datos.
1.1Z.2 - CE(TGRA ? ES(RITGRA
E' AI(/EROS 1IRE(TOS
>amos con n e,emplo qe deFne n tipo de datos compesto de nom#re - edad0 - a#re n Fc!ero en
modo RA'1OM para almacenar en 9l los datos de personas qe +a escri#iendo el sario0 al estilo de
como lo !ar2a na agenda.
T?PE TIPOPERSO'A
nom#re AS STRI'& ` 2Q
edad AS I'TE&ER
E'1 T?PE
1IM persona AS TIPOPERSO'A
(CS
OPE' .agenda.dat. AOR RA'1OM AS M1 CE' ^ CE':persona=
n^Q
1O
n^nd1
I'PGT .'om#reH .0 persona.nom#re
I'PGT .EdadH .0 persona.edad
PGT M10 n0 persona
I'PGT .IMeter m$s datos :Sa'=K .0 respestaU
COOP G'TIC respestaU^.'.
(COSE M1
PRI'T nL .registros gra#ados en la agenda..
El resltado por pantalla podr2a ser esteH
'om#reH Pepe
EdadH 22
IMeter m$s datos :Sa'=K S
'om#reH Paco
EdadH 2B
IMeter m$s datos :Sa'=K S
'om#reH Ana
EdadH 2D
IMeter m$s datos :Sa'=K '
" registros gra#ados en la agenda.
? el resltado en el sistema de arc!i+os ser$ qe se !a creado n ne+o arc!i+o llamado agenda.dat0 si
no e8ist2a de antes0 qe contiene los datos de tres personas. 1e la ;orma qe est$ !ec!o el programa
nestros tres registros ir2an a parar siempre al principio del arc!i+o. En el sigiente e,emplo +eremos
como leer los datos del arc!i+o0 a!ora +amos a +er como ;nciona este programa.
Co primero qe !acemos es deFnir n tipo de datos personali*ado qe tiene dos miem#ros0 nom#re de
2Q caracteres - edad qe es n entero.
A continaci)n declaramos na +aria#le como del tipo de datos qe aca#amos de deFnir - qe nos +a a
ser+ir como .Plantilla. para tra#a,ar con nestro arc!i+o de acceso aleatorio.
1esp9s #orramos la pantalla como siempre.
A!ora a#rimos el arc!i+o .agenda.dat. en modo de acceso aleatorio :RA'1OM=0 le asignamos el
descriptor M1 - con la cl$sla CE' le decimos canto largo +an a ser los registros. Pod2amos !a#erlo
calclado nosotros +iendo cando ocpan todos los miem#ros de nestro tipo de datos - poner
simplemente el n5mero de #-tes0 pero es m$s c)modo - m$s segro qe lo !aga la ;nci)n CE' :Se
llama igal qe la cl$sla0 pero cada cosa es di;erente=.
Segidamente ponemos n contador :n= a cero. En este caso en QBasic no !#iera sido necesario0 pero
es me,or acostm#rarse a !acerlo siempre.
A continaci)n entramos en n #loqe REPETIR0 incrementamos en 1 el contador - le pedimos al sario
qe escri#a el nom#re de la persona - desp9s la edad - lo gardamos cada cosa en s sitio en la
+aria#le persona.
A!ora +amos a escri#ir en el Fc!ero de acceso aleatorio el registro completo0 donde -a tenemos
almacenado el nom#re - la edad qe aca#a de escri#ir el sario. Para !acer esto samos la instrcci)n
PGT a la qe le tenemos qe pasar como par$metro el descriptor del arc!i+o :el car$cter M es opcional=0
el n5mero de registro al qe nos estamos reFriendo0 para lo qe saremos el contador n0 - los datos
propiamente dic!os qe est$n almacenados en la +aria#le persona.
Pregntamos al sario si qiere meter m$s datos - si plsa la ' ma-5scla salimos del #cle0 en caso
contrario +ol+emos al principio donde incrementamos el contador0 +ol+emos a llenar los miem#ros de la
+aria#le persona - Fnalmente los gra#amos en la sigiente posici)n del arc!i+o.
(ando salimos del #cle cerramos el arc!i+o :!a- qe !acerlo siempre= - escri#imos n mensa,e en
pantalla con el n5mero de registros gra#ados apro+ec!ando el +alor de la +aria#le n qe samos como
contador.
(ando a#rimos n arc!i+o en modo RA'1OM si no e8iste se crea0 - si e8iste no ocrre nada0 -a qe
como +eremos a continaci)n en 9l +amos a poder tanto leer como escri#ir registros.
Si al gra#ar n registro nos re;erimos a no qe -a e8iste0 este se so#reescri#ir$ entero0 - si no e8iste el
Fc!ero amentar$ de tamaEo !asta permitir sar ese n5mero de registro0 aEadiendo si es necesario m$s
registros entre medio. Ca in;ormaci)n qe se almacenar$ en estos registros intermedios es
indeterminada. Por e,emplo si tenemos n Fc!ero con tres registros :10 2 - "= - escri#imos en el registro
1Q se almacenar$ nestra in;ormaci)n en el registro 1Q - a la +e* se crear$n Z registros m$s :%0 B0 Z0 Y0 D
- ]= llenos de in;ormaci)n indeterminada.
El primer registro es siempre el 1 - el 5ltimo posi#le depender$ del espacio disponi#le en disco.
Cos Fc!eros qe creemos de esta ;orma -a no los podremos editar con n editor de te8to como el E1IT o
el #loc de notas0 -a qe contienen na me*cla de letras - de +alores nm9ricos qe se peden
representar por caracteres especiales no imprimi#les. Tam#i9n es necesario a#rirlos siempre sando el
mismo tipo de datos como .molde.0 -a qe de no !acerlo as2 todos los registros se me*clar2an - no nos
ser+ir2a de nada.
A!ora +amos a +er otro e,emplo de programa qe lea el Fc!ero qe aca#amos de crear con el programa
anterior.
T?PE TIPOPERSO'A
nom#re AS STRI'& ` 2Q
edad AS I'TE&ER
E'1 T?PE
1IM registro AS TIPOPERSO'A
(CS
OPE' .agenda.dat. AOR RA'1OM AS M1 CE' ^ CE':registro=
nmeroRegistros ^ COA:M1= a CE':registro=
AOR n ^ 1 TO nmeroRegistros
&ET M10 n0 registro
PRI'T persona.nom#re0 persona.edad
'EXT
(COSE M1
El resltado por pantalla podr2a ser esteH
Pepe 22
Paco 2B
Ana 2D
? en el Fc!ero no se prodcir2a ning5n cam#io porqe no !a- ningna instrcci)n de escritra.
(omo se pede +er el programa es parecido al anterior. /emos deFnido n tipo de datos qe en esta
ocasi)n se llama registro en +e* de persona pero tiene e8actamente la misma estrctra - a
continaci)n a#rimos el Fc!ero de la misma ;orma.
Podemos calclar el n5mero de registros qe tiene n Fc!ero sando la ;nci)n CE' qe0 como -a
sa#emos0 nos da el tamaEo del registro0 - la ;nci)n COA :Cengt! O; Aile= qe nos de+el+e el tamaEo en
#-tes del Fc!ero a#ierto c-o descriptor le pasemos como par$metro :con o sin M= sando la ;)rmla
.TamaEo del Fc!ero di+idido por tamaEo del registro.. 1e esta ;orma si el Fc!ero tiene por e,emplo 2QQ
#-tes - cada registro mide %Q #-tes o#tenemos como resltado qe !a- B registros. (omo no !a-
caracteres retornos de carro ni nada de eso las centas siempre salen e8actas.
Gna +e* qe sa#emos cantos registros !a- podemos escri#irlos en pantalla sencillamente sando n
#cle AOR. Para leer in;ormaci)n del Fc!ero samos la instrcci)n &ET c-a ;orma de so es similar a la
de la instrcci)n PGT qe -a !emos +isto. Tras e,ectar la instrcci)n &ET el contenido del registro qeda
almacenado en la estrctra de la +aria#le.
Si leemos m$s all$ del Fnal del Fc!ero no ocrre nada0 a di;erencia de lo qe pasa#a con los Fc!eros
secenciales0 pero la in;ormaci)n qe se nos da es indeterminada0 en el me,or de los casos ceros -
espacios en #lanco. 1e todas ;ormas lo correcto es calclar cal es el ltimo registro como !emos !ec!o
antes - no leer nada m$s all$ para e+itar errores l)gicos - posi#les con;siones. Tam#i9n nos !ar$ ;alta
conocer siempre el n5mero de registros para insertar los ne+os a continaci)n - no so#reescri#iendo los
-a e8istentes como !ace nestro primer e,emplo qe no es nada pr$ctico. Esto lo +eremos en los
sigientes apartados dedicados a lo qe se conoce como .Mantenimiento de Fc!eros.
1.1Z." - MA'TE'IMIE'TO
1E AI(/EROS 1IRE(TOS
1.1Z.".1 - I'TRO1G((IT'
AC MA'TE'IMIE'TO 1E AI(/EROS
En el apartado anterior ten2amos n programa para meter datos en n Fc!ero0 - otro para listar todos los
datos qe aca#$#amos de meter0 - para complicarlo todo si e,ect$#amos otra +e* el primer programa
como siempre empe*$#amos por el registro 1 segro qe so#reescri#2amos datos. Tam#i9n para #orrar
in;ormaci)n s)lo pod2amos #orrar todos los datos a la +e* #orrando el Fc!ero desde el sistema operati+o
- empe*ando con no ne+o +ac2o.
Esta ser2a na ;orma m- mala de tra#a,ar con na #ase de datos de na agenda. Para mane,ar datos se
!an deFnido catro operaciones #$sicasH Altas0 #a,as0 modiFcaciones - consltas0 adem$s de la
ela#oraci)n de listados - la compactaci)n del Fc!ero. En estos apartados +eremos nas #re+es :m-
#re+es= indicaciones de como consegir qe nestros programas de QBasic pedan !acer esto con n
Fc!ero de acceso directo.
1.1Z.".2 - ACTAS. AmA1IR RE&ISTROS
En nestro e,emplo de la secci)n anterior +e2amos como aEadir registros a n arc!i+o directo con la
instrcci)n PGT. Co !ac2amos m- #ien0 solo qe siempre empe*$#amos por la primera posici)n - de
esta ;orma cada +e* qe e,ectamos el programa so#reescri#2amos datos - perd2amos in;ormaci)n.
Ca idea de todo esto es consegir poder aEadir in;ormaci)n al Fc!ero cada +e* qe e,ectemos el
programa0 en este caso pediremos al sario qe escri#a la posici)n :campo cla+e principal= donde
qiere gardar el ne+o registro.
>eamos como e,emplo n procedimiento SGB qe pide al sario el n5mero de registro0 el nom#re - la
edad de la persona - los aEade al Fnal del Fc!ero. Sponemos qe la estrctra de TIPOPERSO'A est$
deFnida en el programa principal - qe el Fc!ero tam#i9n est$ -a a#ierto - tiene el descriptor M1.
SProcedimiento ACTA
SAEade n ne+o registro a agenda.dat
SGB Alta:=
1IM ne+aPersona AS TIPOPERSO'A
1IM registro AS I'TE&ER
I'PGT .'5mero de registroH .0 registro
I'PGT .'om#reH .0 ne+aPersona.nom#re
I'PGT .EdadH .0 ne+aPersona.edad
PGT M10 registro0 ne+aPersona
E'1 SGB
Si es la primera +e* qe samos el programa - el Fc!ero no e8iste0 se crear$ no ne+o. Cos datos qe
!emos introdcido se gra#ar$n en la posici)n qe indiqemos como n5mero de registro o campo cla+e.
Si esta posici)n de registro -a esta#a ocpada por otros datos0 la in;ormaci)n se so#reescri#ir$ - se
perder$ la anterior. Si es na posici)n +ac2a m$s all$ del Fnal del arc!i+o0 el tamaEo crecer$ creandose
registros !asta alcan*ar la posici)n especiFcada donde se gra#ar$ nestra in;ormaci)n. El contenido de
estos registros intermedios es indeterminado0 normalmente restos de datos pre+iamente descartados
e8istentes en esa posici)n del disco o en memoria0 - no lo podemos sar para nada. Este
comportamiento de qe el Fc!ero +a-a creciendo !ace qe si samos como campo cla+e n n5mero
m- grande como n 1'I0 el Fc!ero amente de tamaEo considera#lemente.
Otros algoritmos m$s ela#orados nos a+isar$n si el campo cla+e -a est$ ocpado con in;ormaci)n0 nos
mostrar$n la in;ormaci)n qe contiene para darnos la posi#ilidad de so#reescri#irla o de elegir otro
campo cla+e0 etc...
1.1Z."." - (O'SGCTAS.
BhSQGE1A SE(GE'(IAC 1E RE&ISTROS
Gna +e* qe tenemos in;ormaci)n en el registro nos pede interesar #scar n nom#re0 por e,emplo0 -
qe nos salga en la pantalla los otros datos de la persona0 en nestro e,emplo s)lo la edad.
Para !acer esto !a- complicados mecanismos de #5sqeda m- r$pida sponiendo qe nestro Fc!ero
est9 ordenado. (omo no es el caso0 la 5nica ;orma de encontrar algo es ir mirando registro por registro
!asta qe encontremos lo qe #scamos o se aca#e el Fc!ero.
>amos con n e,emplo qe pregnta al sario el nom#re de la persona qe qiere #scar - recorre el
Fc!ero !asta encontrarla o !asta qe se aca#a. Sponemos qe -a est$ a#ierto el arc!i+o - deFnido el
tipo de datos registro0 igal qe en los e,emplos anteriores.
nmregs ^ :COA:1= a CE':persona==
I'PGT .'om#re a #scarH .0 nom#reBscadoU
n ^ 1
1O
&ET M10 n0 persona
n ^ n d 1
COOP G'TIC RTRIMU:persona.nom#re=^nom#reBscadoU OR nOnmregs
IA n N^ nmregS T/E'
PRI'T .Registro...H.L n-1
PRI'T .'om#re.....H .L persona.nom#re
PRI'T .Edad.......H.L persona.edad
ECSE
PRI'T .'o se !a encontrado.
E'1 IA
Co primero qe !acemos es calclar cantos registros tiene el Fc!ero para +er asta donde podemos
llegar. 1esp9s pedimos al sario qe escri#a el nom#re qe qiere encontrar - lo gardamos en na
+aria#le del tipo adecado0 en este caso cadena.
En el sigiente #loqe +amos recorriendo el Fc!ero desde el primer registro sando n contador !asta
qe encontremos el nom#re #scado o #ien el contador llege a sperar el n5mero de registros del
Fc!ero. Para !acer la comparaci)n samos la ;nci)n RTRIMU qe lo qe !ace es qitar los espacios en
#lanco qe !a- a la derec!a del nom#re gra#ado en el registro porqe como al deFnir el registro
tenemos qe sar cadenas de longitd F,a los +alores de+eltos siempre contienen espacios al Fnal para
rellenar la cadena.
(ando salimos del #cle lo qe !acemos es compro#ar el contador con n IA. Si se !a sperado el l2mite
es qe no se !a encontrado0 - en caso contrario es qe se !a encontrado - podemos mostrar en pantalla
todos los datos de la persona qe sigen estando almacenados en la +aria#le de registro0 -a qe
desp9s no se !a le2do nada m$s. Tam#i9n inclimos el n5mero del registro sando el contador menos
no0 -a qe antes de salir del #cle se sm) no.
Si !a- dos personas con el mismo nom#re este c)digo s)lo encontrar$ la primera. Podemos !acer
consltas por otros campos0 o #ien com#inar +arios campos con solo modiFcar la condici)n del #loqe
repetiti+o qe samos para recorrer el arc!i+o. Si qeremos poder mostrar m$s de n registro
encontrado !a#r2a qe ir gardando los datos encontrados en n arra- del mismo tipo para desp9s
mostrarlos en na lista. /a#r2a qe limitar el n5mero de registros mostrados al tamaEo del arra-0 igal
qe !ace 6indo7s ]8 con las #5sqedas de arc!i+os - carpetas.
1.1Z.".% - MO1IAI(A(IO'ES 1E RE&ISTROS
Al tra#a,ar con Fc!eros no nos podemos limitar a permitirle al sario aEadir datos0 tam#i9n !a- qe
de,arle !acer modiFcaciones0 -a qe la in;ormaci)n pede cam#iar o el sario se pede eqi+ocar al
escri#ir los datos - tendr$ qe corregirlos. Ca ;orma de !acer na modiFcaci)n consiste en so#reescri#ir
n registro completo del Fc!ero con la ne+a in;ormaci)n.
Gna ;orma m- ;$cil de !acer esto es pregntar al sario q9 registro qiere modiFcar0 mostrarle los
datos a +er si de +erdad son estos - a continaci)n pedirle la ne+a in;ormaci)n - gra#arla en esa
posici)n del Fc!ero so#reescri#iendo a la anterior.
>amos a +er como ser2a :Arc!i+os -a a#iertos - tipos -a deFnidos=H
nmregS ^ :COA:1= a CE':persona==
I'PGT .'5mero de registro a modiFcarH .0 nmmodi;[
IA nmmodi;[ N 1 OR nmmodi;[ O nmregS T/E'
PRI'T .'5mero de registro incorrecto.
ECSE
&ET M10 nmmodi;[0 persona
PRI'T .'om#re.....H .L persona.nom#re
PRI'T .Edad.......H.L persona.edad
PRI'T .IEs este el registro qe qieres modiFcarK :Sa'=.
6/ICE I'gE?U NO ..H 6E'1 SPara limpiar I'gE?U
1O
teclaU ^ G(ASEU:I'gE?U=
COOP G'TIC teclaU ^ .S. OR teclaU ^ .'.
IA teclaU ^ .S. T/E'
PRI'T .Escri#e los ne+os datos....
I'PGT .'om#reH .0 persona.nom#re
I'PGT .EdadH .0 persona.edad
PGT M10 nmmodi;[0 persona
PRI'T .Cos ne+os datos !an sstitido a los anteriores.
E'1 IA
E'1 IA
Co primero es pedir al sario qe escri#a el n5mero del registro0 este n5mero lo !a#r$ a+erigado en
na conslta qe !a-a !ec!o antes0 por e,emplo. El n5mero qe escri#a lo gardamos en na +aria#le de
tipo entero0 -a qe los registros nnca +an a opder lle+ar decimales. A continaci)n compro#amos qe el
registro e8iste en el Fc!ero0 s n5mero es ma-or qe Q - no ma-or qe el n5mero m$8imo de registros
qe !emos calclado al principio. S)lo si es as2 segimos0 si no damos n mensa,e de error -
terminamos.
Si el registro e8iste lo mostramos en la pantalla - le pregntamos si es este el qe qiere modiFcar. Si
plsa la S ma-5scla le pedimos los ne+os datos - los gra#amos en el Fc!ero en la misma posici)n
soreescri#iendo los datos antigos.
Al !acer modiFcaciones el tamaEo del Fc!ero no cam#ia.
El so de la ;nci)n I'gE?U para !acer pregntas tipo S2 o 'o al sario lo +eremos detalladamente en
no de los temas de ampliaci)n del crso.
1.1Z.".B - BAVAS. BORRAR RE&ISTROS
En este modelo de programaci)n de Fc!eros de acceso aleatorio no e8iste na ;orma espec2Fca de #orrar
in;ormaci)n de n Fc!ero0 por esto lo qe !acemos es simplemente so#reescri#ir el registro rellen$ndolo
con espacios en #lanco o +alores cero0 seg5n corresponda0 para qe la in;ormaci)n no apare*ca en las
consltas ni en los listados.
>amos con n e,emplo de como !acerlo0 casi igal al de las modiFcaciones.
nmregS ^ :COA:1= a CE':persona==
I'PGT .'5mero de registro a #orrarH .0 nm#orra[
IA nm#orra[ N 1 OR nm#orra[ O nmregS T/E'
PRI'T .'5mero de registro incorrecto.
ECSE
&ET M10 nm#orra[0 persona
PRI'T .'om#re.....H .L persona.nom#re
PRI'T .Edad.......H.L persona.edad
PRI'T .IEs este el registro qe qieres #orrarK :Sa'=.
6/ICE I'gE?U NO ..H 6E'1 SPara limpiar I'gE?U
1O
teclaU ^ G(ASEU:I'gE?U=
COOP G'TIC teclaU ^ .S. OR teclaU ^ .'.
IA teclaU ^ .S. T/E'
persona.nom#re ^ SPA(EU:CE':persona.nom#re==
persona.edad ^ Q
PGT M10 nm#orra[0 persona
PRI'T .Registro #orrado.
E'1 IA
E'1 IA
(omo se pede +er0 lo 5nico qe cam#ia es qe en los mensa,es en +e* de decir .modiFcar. dice .#orrar.
- qe so#reescri#imos el registro con #lancos - ceros en +e* de con la in;ormaci)n qe escri#e el
sario.
Co 5nico m$s e8traEo es qe para asignar espacios en #lanco al nom#re en +e* de !acer
persona.nom#re ^ . .
qe ser2a lo m$s ;$cil0 samos la ;nci)n SPA(EU qe nos de+el+e na cadena de espacios en #lanco0 -
para calclar cantos espacios samos la ;nci)n CE' qe nos de+el+e el tamaEo del dato miem#ro. 1e
esta ;orma no nos tenemos qe acordar de canto largo era ese dato - si modiFcamos este tamaEo
drante el desarrollo del programa no tenemos qe modiFcar esta instrcci)n0 e+itando posi#les errores.
>isto esto se pede comprender qe el tamaEo de los Fc!eros directos nnca se +a a redcir0 ni anqe
#orremos registros. Para solcionar este pro#lema lo qe podr2amos !acer en algnos casos ser$
compactar el Fc!ero0 en el apartado sigiente.
1.1Z.".Z - (OMPA(TA(IT' 1E AI(/EROS 1IRE(TOS
(omo !emos +isto0 al #orrar registros el tamaEo del Fc!ero nnca se redce0 con lo qe nestro Fc!ero
+a a crecer - crecer siempre pdiendo contener mc!os registros +ac2os qe lo 5nico qe !acen es
ocpar sitio - !acer qe todo +a-a n poco m$s lento.
Para solcionar este pro#lema en las #ases de datos se !a deFnido na tarea de mantenimiento qe
consiste en .compactar. los Fc!eros. 'o tiene nada qe +er con lo qe !acen programas como 6infip0
esto es .comprimir. Fc!eros - la ;orma de programar estas operaciones es terri#lemente m$s
complicada.
Este proceso de compactaci)n lo qe +a a !acer es agrpar los registros todos ,ntos al principios del
arc!i+o. Esto implica qe se +an a modiFcar los campos cal+e -a qe cam#iar$ la posici)n donde est$
almacenado cada registro. Si el campo cla+e es algo signiFcati+o como por e,emplo el n5mero de socio
de n cl#0 n5mero de !a#itaci)n de n !otel0 etc... no de#eremos !acer este proceso de compactaci)n
-a qe cam#iar$n los campos cla+es - destriremos la in;ormaci)n. Solo lo de#eremos !acer en casos
donde el campo cla+e no sea signiFcati+o para nosotros - no importe qe cam#ie.
Imaginemos qe en la +ida real tenemos na agenda de papel llena de datos de personas de los cales
nos sir+en - otros est$n tac!ados porqe son incorrectos o se !an qedado o#soletos. Adem$s de lle+ar
siempre n toc!o de !o,as m- gordo0 a la !ora de #scar algo tendremos qe pasar siempre mc!as
!o,as0 perdiendo m$s tiempo del necesario. Gna ;orma m- c)moda de solcionar este pro#lema ser2a
consegir na agenda ne+a para qedarnos s)lo con los datos qe qeremos conser+ar. Para !acer esto
recorrer2amos la agenda +ie,a - solo ir2amos copiando en la ne+a los datos qe no est$n tac!ados. Al
Fnal tiramos la +ie,a - nos qedamos con la ne+a para segir s$ndola a partir de a!ora.
Este tro*o de c)digo !ace ,stamente eso mismo con nestro Fc!ero in;orm$tico de la #ase de datos.
Sponemos qe el Fc!ero de nestra agenda -a esta a#ierto - los tipos de datos deFnidos.
nmregs ^ :COA:1= a CE':registro==
OPE' .Agenda.tmp. AOR RA'1OM AS M2 CE' ^ CE':registro=
n1 ^ 1
n2 ^ 1
6/ICE n1 N^ nmregS
&ET M10 n10 registro
IA registro.nom#re NO SPA(EU:CE':registro.nom#re== OR registro.edad NO Q T/E'
PGT M20 n20 registro
n2 ^ n2 d 1
E'1 IA
n1 ^ n1 d 1
6E'1
(COSE
gICC .Agenda.dat.
'AME .Agenda.tmp. AS .Agenda.dat.

OPE' .Agenda.dat. AOR RA'1OM AS M1 CE' ^ CE':registro=
SSegimos con el programa...
>amos a +er como ;nciona estoH
Co primero qe !acemos0 como siempre0 es calclar el n5mero de registros qe tiene el Fc!ero para
sa#er !asta donde podemos llegar.
A continaci)n a#rimos n Fc!ero llamado .Agenda.tmp. :Ca e8tensi)n .tmp signiFca .temporal.= - le
asignamos el descriptor M2. Este Fc!ero de#e ser a#ierto con la misma estrctra qe el otro -
sponemos qe no e8iste - se crea no ne+o - +ac2o al a#rirlo.
Antes de entrar en el #cle iniciali*amos dos contadores al +alor 10 no nos +a a ser+ir para recorrer el
Fc!ero +ie,o - otro para recorrer el ne+o. Empe*amos por 1 qe es el primer registro.
A!ora samos n #cle .Mientras. para recorrer el Fc!ero +ie,o desde el principio !asta el Fnal. 1entro
de este #cle leemos cada registro - si no est$ completamente +ac2o lo copiamos al ne+o Fc!ero e
incrementamos am#os contadores. Si est$ +ac2o no !acemos nada - solo incrementamos el primer
contador para poder segir recorriendo el Fc!ero +ie,o.
Para compro#ar si el registro est$ completamente +ac2o !a#r$ qe sar na e8presi)n condicional qe
pede llegar a ser m- larga porqe !a- qe compro#ar cada dato miem#ro. En nestro e,emplo esta
e8presi)n aparece ocpando dos l2neas0 pero si la escri#es en QBasic tendr$ qe ser toda segida en la
misma linea0 anqe sea m- larga. QBasic soporta l2neas de !asta 2BZ caracteres de larga0 si sige sin
ca#er tendr$s qe cam#iar los nom#res de las +aria#les por otros m$s cortos0 anqe en esta ocasi)n
sean menos descripti+os.
Gna +e* qe salimos del #cle tendremos el Fc!ero .Agenda.dat. tal como esta#a - el ne+o
.Agenda.tmp. compactado solo con los datos qe nos interesan.
Para proceder al intercam#io de los nom#res de los Fc!eros - qedrnos solo con el ne+o podemos
segir estos pasos
(errar los dos Fc!eros0 sando la orden (COSE sin descriptor.
Borrar .Agenda.dat. sando la orden gICC0 qe +eremos con detalle m$s adelante.
(am#iarle el nom#re a .Agenda.tmp. por .Agenda.dat. sando la orden 'AME0 qe tam#i9n +eremos en
pr)8imos temas.
>ol+er a a#rir .Agenda.dat. con el descriptor M1 para segir tra#a,ando con 9l normalmente desde el
resto del programa.
Esta operaci)n de mantenimiento la tendr$ qe e,ectar el sario de +e* en cando0 especialmente
desp9s de !a#er #orrado mc!os registros. En programas mc!o m$s soFsticados se podr2a !acer qe
se e,ecte cada 8 d2as o tras !a#er #orrado n determinado n5mero de registros.
1.1Z.".Y - ECABORA(IT' 1E CISTA1OS 1E 1ATOS
Cos listados son na parte m- 5til de todo programa qe tra#a,e con datos0 para qe el sario peda
+er toda la in;ormaci)n a la +e* - no registro por registro. En los programas modernos se sele !a#lar de
.in;ormes. para re;erirse a listados con n determinado ;ormato qe presentan los registros qe cmplen
cierta condici)n.
Aq2 nos limitaremos a escri#ir en la pantalla n listado encolmnado de todos los registros qe !a-a en
nestro Fc!ero. Ca ;orma de di#,ar n listado en la pantalla es #astante sencilla en principio. Bastar2a
con recorrer el Fc!ero - escri#ir cada registro en na l2nea de la pantalla0 pero srgen algnos pro#lemas
qe +amos a ir solcionando m$s adelante.
>amos con n e,emplo0 de lo m$s ctre0 qe recorre el Fc!ero - escri#e s contenido l2nea por l2nea todo
segido. Sponemos qe -a tenemos a#ierto nestro Fc!ero - deFnido el tipo registro0 igal qe en los
e,emplos anteriores.
(CS
nmregs^COA:1= - CE':persona=
c^1
6/ICE c N^ nmregs
&ET M10 c0 persona
PRI'T cL persona.nom#reL persona.edad
c^cd1
6E'1
El resltado por pantalla podr2a serH
1Pepe 2B
2 Q
" Q
%Manolo &arc2a &arc2a"2
BPaco 1]
Z Q
Y Q
D Q
]Ana %Q
1QVan (arlos 2D
11Aernando 21
Co primero0 como siempre0 calclar cantos registros tiene el Fc!ero - desp9s irlos le-endo - sacando
por pantalla desde dentro de n #loqe MIE'TRAS. Se pod2a !a#er !ec!o con n PARA0 pero como
desp9s +amos a tener qe !acerlo con n MIE'TRAS de todas ;ormas0 me,or empe*ar as2.
El listado aparece m$s o menos encolmnado porqe las +aria#les de cadena :nom#re= se de+el+en con
espacios en #lanco detr$s !asta completar s longitd total0 pero los enteros no ocpar2an siempre lo
mismo - nos estropear2an el encolmnado0 cosa qe pasar2a a partir del registro 1Q donde el nom#re
ser2a emp,ado n lgar !acia la derec!a. M$s adelante iremos solcionando esto.
(omo se pede +er en el resltado del e,emplo anterior0 !an aparecido tam#i9n los registros #orrados
:Sin nom#re - con edad^Q=. Para e+itar esto lo qe !acemos compro#ar con na condici)n ,sto antes de
escri#ir cada l2nea qe el registro no !a sido #orrado. Ser2a as2H
(CS
nmregs^COA:1= - CE':persona=
c^1
6/ICE c N^ nmregs
&ET M10 c0 persona
IA persona.nom#reNOSPA(EU:CE':persona.nom#re== OR persona.edadOQ T/E'
PRI'T cL persona.nom#reL persona.edad
E'1 IA
c^cd1
6E'1
? el resltado podr2a serH
1Pepe 2B
%Manolo &arc2a &arc2a"2
BPaco 1]
]Ana %Q
1QVan (arlos 2D
11Aernando 21
>emos qe -a no aparecen los registros qe ;eron #orrados. Ca condici)n qe !acemos es qe el
nom#re :te8to= no sea todo espacios o qe la edad sea ma-or qe cero. A!ora s)lo aparecen los registros
qe nos interesan0 pero toda+2a se +e m- ;eo +amos a di#,arle n enca#e*ado a la lista - de,ar n poco
de espacio entre las colmnas para qe no qede tan ,nto.
(CS
nmregs^COA:1= - CE':persona=
c^1
PRI'T .Registro 'om#re Edad.
PRI'T .^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^.
6/ICE c N^ nmregs
&ET M10 c0 persona
IA persona.nom#reNOSPA(EU:CE':persona.nom#re== OR persona.edadOQ T/E'
PRI'T c0 persona.nom#reL . .L persona.edad
E'1 IA
c^cd1
6E'1
? el resltado0 m$s #onito ser2aH
Registro 'om#re Edad
^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^
1 Pepe 2B
% Manolo &arc2a &arc2a "2
B Paco 1]
] Ana %Q
1Q Van (arlos 2D
11 Aernando 21
1i#,amos el enca#e*ado na +e* al principio. Ca l2nea con giones o signos igal nos pede ser+ir para
orientarnos con los tamaEos de los campos. 1entro del #cle en la instrcci)n PRI'T si separamos las
+aria#les por comas se pasa a la sigiente posici)n de ta#laci)n - nos e+itamos el pro#lema del
di;erente n5mero de ci;ras0 anqe se desperdicia mc!o espacio porqe las posiciones de ta#laci)n an
QBasic miden 1" caracteres. Podemos meter espacios entre comillas para separar los campos. En este
caso como !a- m- pocos campos - !emos podido de,ar los n5meros enteros para el Fnal !a salido
medio #ien0 pero en casos m$s complicados ser2a necesario sar la instrcci)n TAB para deFnir las
colmnas. >eamos como se !ar2a.
(CS
nmregs^COA:1= - CE':persona=
c^1
PRI'T .Reg.L TAB:B=L .'om#re.L TAB:2Z=L .Edad.
PRI'T .^^^.L TAB:B=L .^^^^^^^^^^^^^^^^^^^^.L TAB:2Z=L .^^^^.
6/ICE c N^ nmregs
&ET M10 c0 persona
IA persona.nom#reNOSPA(EU:CE':persona.nom#re== OR persona.edadOQ T/E'
PRI'T cL TAB:B=L persona.nom#reL TAB:2Z=L persona.edad
E'1 IA
c^cd1
6E'1
? el resltado0 toda+2a me,or.
Reg 'om#re Edad
^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^
1 Pepe 2B
% Manolo &arc2a &arc2a "2
B Paco 1]
] Ana %Q
1Q Van (arlos 2D
11 Aernando 21
El par$metro qe le pasamos a la orden TAB de#e ser n entero qe indica la posici)n a la qe saltar$ el
crsor dentro de la l2nea actal. Recordemos qe cada l2nea tiene DQ caracteres de anc!o - qe la
primera posici)n por la i*qierda es la 1. Ca orden TAB se tili*a como argmento de la orden PRI'T0
igal qe si ;era na ;nci)n0 solo qe en +e* de de+ol+er n +alor lo qe !ace es lle+ar al crsor !asta
la posici)n especiFcada. En el enca#e*ado nos pod2amos a!orrar las ordenes TAB - poner directamente
los espacios0 porqe como todo es constante no +a a +ariar nada. Para sa#er las posiciones lo m$s
c)modo es ir pro#ando !asta qe cada cosa caiga en s sitio0 de#a,o de s t2tlo.
?a se empie*a a parecer a n listado. Siempre !a#r$ qe a,star las colmnas seg5n nestras
necesidades - si no ca#en de anc!o la 5nica solci)n posi#le con lo qe sa#emos !asta a!ora es no
escri#ir todos los campos.
Co 5ltimo qe +amos a solcionar es el terri#le pro#lema de qe si tenemos mc!os registros el listado
a+an*ar$ r$pidamente - solo +eremos los 5ltimos +eintitantos registros qe ca#en en la pantalla. Pasa lo
mismo qe con la orden 1IR de MS-1OS si no ponemos el modiFcador aP. Para consegir esto lo qe
!acemos es sar n segndo contador qe +amos incrementando en cada l2nea - canto +eamos qe
llega a 2Q lo ponemos a cero0 - !acemos na pasa0 cando el sario plse na tecla #orramos la
pantalla0 di#,amos el enca#e*ado de ne+o - segimos. >amos con el e,emploH
(CS
nmregs^COA:1= - CE':persona=
c^1
c2^1
PRI'T .Reg 'om#re Edad.
PRI'T .^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^.
6/ICE c N^ nmregs
&ET M10 c0 persona
IA persona.nom#reNOSPA(EU:CE':persona.nom#re== OR persona.edadOQ T/E'
PRI'T cL TAB:B=L persona.nom#reL TAB:2Z=L persona.edad
E'1 IA
c^cd1
c2^c2d1
IA c2O2Q T/E'
c2^1
PRI'T .Plsa calqier tecla para segir....
6/ICE I'gE?UNO..H6E'1
1OHCOOP 6/ICE I'gE?U^..
(CS
PRI'T .Reg 'om#re Edad.
PRI'T .^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^.
E'1 IA
6E'1
El resltado0 si !a- menos de 2Q registros ser2a igal qe antes0 - si !a- m$s ser2a qe se +an +iendo de
2Q en 2Q.
Este e,emplo se pede me,orar para qe las instrcciones donde se di#,a el enca#e*ado s)lo apare*can
na +e*0 pero aq2 no nos +amos a complicar tanto. 1e todas ;ormas en el tema de mane,o de la pantalla
de te8to qe !a- en la secci)n de temas de ampliaci)n de este crso aparen las instrcciones a sar
para !acer listados despla*a#les parecidos a los de 6indo7s qe son mc!o m$s .#onitos. - no tienen
estos pro#lemas.
1.1Z.% - BRE>E I1EA SOBRE BASES 1E 1ATOS
En in;orm$tica se conoce como #ase de datos a n mecanismo capa* de almacenar in;ormaci)n para
desp9s poder recperarla - mane,arla con ;acilidad - precisi)n.
>isto as20 los arc!i+os de e,emplo de agendas qe !emos creado en los apartados anteriores son #ases
de datos0 pero cando !a#lamos de #ases de datos pensamos en programas qe mane,an gran cantidad
de in;ormaci)n de ;orma m- estrctrada - qe permiten reali*ar consltas - operaciones de
mantenimiento m- comple,as - Fa#les.
Al !a#lar de #ases de datos !a- qe distingir dos cosas m- importantes. Por n lado tenemos la #ase
de datos en s20 qe es la in;ormaci)n gra#ada en los discos0 - por otro lado tenemos el Sistema de
&esti)n de Bases de 1atos :S&B1 o 1BMS en ingl9s= qe es el programa encargado de mane,ar toda la
in;ormaci)n. Es lo qe ser2a n programa como MS Access o M-SQC.
Cas #ases de datos qe mane,an estos programas casi nnca contienen na sola ta#la0 es decir0 n solo
arc!i+o de datos0 sino qe contienen mc!as ta#las relacionadas entre si. Por eso se !a#la de #ases de
datos relacionales. El !ec!o de qe las ta#las est9n relacionadas nas con otras implica qe al !acer n
cam#io en na de ellas0 posi#lemente se +ean a;ectadas otras para qe la in;ormaci)n siga teniendo
consistencia. Tam#i9n estos sistemas de #ases de datos san mc!os mecanismos como 2ndices o
algoritmos de ordenaci)n para consegir qe el acceso a la in;ormaci)n drante las consltas sea n
proceso mc!o m$s r$pido - completamente Fa#le.
'osotros0 en nestros programas estamos integrando na peqeE2sima parte de los mecanismos qe
san los S&B1 para poder mane,ar la in;ormaci)n de nestros arc!i+os0 pero con;orme nestras
necesidades amenten - -a semos otros lenga,es de programaci)n0 ser$ mc!o m$s sencillo sar los
ser+icios de n at9ntico S&B1 para mane,ar nestra in;ormaci)n0 en +e* de programarlo nosotros. Esto
qiere decir qe el so de lo qe !emos +isto en este tema de arc!i+os de acceso directo se limitar$ a el
mantenimiento de peqeEos - sencillos con,ntos de datos cando sea m$s comodo mane,arlos de
;orma directa qe de ;orma secencial0 pero desde el momento en qe inter+ienen +arios arc!i+os de
datos necesitaremos sar las ;nciones de no de estos soFsticados S&B1s integrados en los modernos
lenga,es de programaci)n.
1.1Z.B - OTRAS I'STRG((IO'ES
RECA(IO'A1AS (O' AI(/EROS
?a !emos +isto como crear Fc!eros - leer o modiFcar la in;ormaci)n almacenada en los mismos sando
di;erentes m9todos de programaci)n. Para terminar el tema de Fc!eros es necesario conocer algnas
instrcciones qe tiene QBasic para tra#a,ar con Fc!eros enteros qe !a-a en el sistema de arc!i+os.
Estas instrcciones nos a-dar$n a tra#a,ar con los Fc!eros sin tener qe recrrir a e,ectar ordenes del
sistema operati+o.
>amos con ellas.
(/1IR rtaU
(am#ia el directorio acti+o. El directorio acti+o es el qe sar$ QBasic para #scar los arc!i+os qe tiene
qe a#rir o para crearlos si no se especiFca na rta en la instrcci)n OPE'. Pede ser di;2cil determinar
el directorio acti+o0 por lo qe con+iene especiFcar no con esta orden antes de a#rir o crear Fc!eros.
Si e,ectamos QBasic desde n icono de acceso directo de 6indo7s el directorio acti+o ser$ el qe
aparece en el cadro .(arpeta de tra#a,o. de la secci)n .Programa. de las propiedades del acceso
directo.
Si e,ectamos QBasic desde MS-1OS el directorio acti+o ser$ donde nos encontr$#amos cando
entramos en QBasic.
Ca rta qe !a- qe especiFcar en esta instrcci)n pede ser n literal entre comillas o na +aria#le de
cadena qe contenga la rta adecada. Si el directorio no e8iste se prodcir$ n error de tiempo de
e,ecci)n.
/a- qe recordar qe estamos en MS-1OS - por lo tanto solo podemos tra#a,ar con nom#res de
directorios - arc!i+os de no m$s de D caracteres - sin espacios0 por lo tanto los directorios .Arc!i+os de
Programas. - .Mis docmentos. tendr$n nom#res parecidos a .AR(/I>n1. - .MIS1O(n1.. Para
asegrarse de cales son estos nom#res !a- qe mirar la casilla .'om#re MS-1OS. de la +entana de
propiedades del directorio correspondiente en 6indo7s.
Para escri#ir el car$cter .&rrEo. :n= !a- qe plsar la tecla .Alternati+a. - simlt$neamente escri#ir
con el teclado nm9rico la ci;ra 12Z0 correspondiente a s c)digo AS(II.
Ca sigiente orden nos permite crear n directorioH
Mg1IR rtaU
El directorio qe creemos -a estar$ disponi#le en el sistema de arc!i+os para sarlo desde nestro
programa o desde calqier otro. Si la rta qe especiFcamos -a e8iste se prodcir$ n error de tiempo
de e,ecci)n.
Es importante comprender qe al crear n directorio este no pasa a ser el directorio acti+o. Para !acerlo
!a#r$ qe sar na instrcci)n (/1IR.
A!ora +amos a +er como #orrar n directorio e8istenteH
RM1IR rtaU
Esta instrcci)n #orra el directorio qe le pasemos como par$metro. Si no e8iste se prodcir$ n error.
Tam#i9n se prodcir$ el mismo error si el directorio no est$ +ac2o0 es decir0 contiene alg5n arc!i+o o m$s
s#directorios. /a#r$ qe #orrarlos antes como +eremos m$s adelante. 'ormalmente de#emos tener
mc!o cidado con lo qe #orramos desde nestros programas para no !acer ning5n estropicio con la
in;ormaci)n qe tenemos gardada en los discos.
Podemos +er los Fc!eros - s#directorios de n directorio con la sigiente instrcci)nH
AICES
Esta instrcci)n tra#a,a de ;orma parecida a la orden .1IR a6. de MS-1OS. 'os di#,ar$ n listado a
catro colmnas con el contenido de n directorio0 enca#e*ada por el nom#re del propio directorio -
terminada por el espacio en #-tes disponi#le en el disco. Cos s#directorios se identiFcan porqe lle+an a
la derec!a el r)tlo .N 1IR O..
Esta instrcci)n nos pede resltar algo 5til en los programas qe !emos !ec!o !asta a!ora -a qe la
in;ormaci)n se escri#e en pantalla na l2nea de#a,o de otra0 pero cando !agamos diseEos de pantallas
m$s ela#orados -a no ser$ recomenda#le sar esta instrcci)n porqe el listado de directorio se saltar$
todas nestras especiFcaciones de pantalla0 inclso a!ora si el listado es m- largo s)lo se +en las
5ltimas l2neas.
Si samos la orden AICES sin par$metros se mostrar$n todos los Fc!eros - s#directorios del directorio
acti+o0 pero podemos especiFcar rtas0 nom#res de arc!i+os - caracterescomod2n :K - `= para adecar el
listado a nestras necesidades. >eamos nos cantos e,emplosH
AICES .`.t8t.
Cista todos los Fc!eros con e8tensi)n TXT qe !a-a en el directorio acti+o.
AICES .VGE&O.`.
Cista todos los Fc!eros qe se llamen VGE&O0 sea cal sea s e8tensi)n0 del directorio acti+o.
AICES .(H_BASI(_PRO&S_`.`.
Cista todos lo qe !a-a en el directorio BASI(_PRO&S de la nidad (H.
AICES .ImagenK.BMP.
Cista todos los arc!i+os c-o nom#re empiece por .Imagen. - +a-a segido por e8actamente n
car$cter0 s e8tensi)n sea BMP - st9n en el directorio acti+o. Aparecer2an por e,emplo los arc!i+os
Imagen2.BMP o ImagenY.BMP0 pero nnca el arc!i+o Imagen1%.BMP -a qe contiene dos n5meros.
Si la orden AICES no encentra nada qe listar se prodce n error de tiempo de e,ecci)n. Si listamos n
directorio +ac2o no se prodcir$ ning5n error.
?a !emos +isto como #orrar directorios0 a!ora +amos a +er como #orrar arc!i+osH
gICC Arc!i+oU
Esta instrcci)n #orra arc!i+os0 podemos sar na rta -ao los comodines ` - K0 cosa qe pede ser
peligrosa porqe se #orrar2an +arios Fc!eros a la +e*0 na +e* m$s recomendar prdencia al sar esta
orden para e+itar estropicios irrepara#les0 -a qe en MS-1OS normalmente no tenemos papelera de
recicla,e.
Si no especiFcamos na rta se entender$ qe estamos tra#a,ando so#re el directorio acti+o. Si el
arc!i+o qe qeremos #orrar no e8iste se prodcir$ n error de tiempo de e,ecci)n.
'o con;ndir esta instrcci)n con la orden gICC de Cin8 qe detiene procesos0 es decir0 o#liga a terminar
la e,ecci)n de n programa pero no #orra nada del disco.
Por 5ltimo +amos a +er como cam#iar el nom#re n Fc!eroH
'AME +ie,oU AS ne+oU
+ie,oU es el nom#re actal del arc!i+o qe qeremos renom#rar0 qe de#e e8istir para qe no se
prod*can errores.
ne+oU tiene qe ser el ne+o nom#re qe le +amos a dar al arc!i+o0 - qe no de#e e8istir toda+2a.
Por e,emplo0 para cam#iar el nom#re al arc!i+o #ase.dat del directorio actal por #ase.#a< tendr2amos
qe sar la instrcci)n
'AME #ase.dat AS #ase.#a<
En el nom#re del arc!i+o -a e8istente :la primera parte antes de AS= podemos especiFcar na rta de
directorios.
Para copiar o mo+er arc!i+os no tenemos na instrcci)n espec2Fca en QBasic. Tendremos qe crearnos
n modlo qe lo a#ra en modo #inario - lo copie car$cter por car$cter en n arc!i+o ne+o en la otra
#icaci)n0 si lo qe qer2amos era mo+erlo desp9s !a#r$ qe #orrar el original. Para !acer esto - otras
cosas m$s complicadas pede ser m$s c)modo llamar a la orden correspondiente de MS-1OS como se
+er$ en temas posteriores.
TEMA 1.1Y
(O'TROC 1E ERRORES
1.1Y.1 - Instrcci)n &OTO. Ca m$s conocida - odiada de BASI(
1.1Y.2 - Introdcci)n a los errores
1.1Y." - (ontrol de errores
1.1Y.1 - I'STRG((IT' &OTO.
CA MJS (O'O(I1A ? O1IA1A 1E BASI(
Empecemos con n e,emplo .m- malo.H
(CS
PricipioH
PRI'T .Esto es el principio.
&OTO Ainal
EnmedioH
PRI'T .Esto es lo de en medio0 pero no lo +er$s.
AinalH
PRI'T .Esto es el Ainal.
Qe dar2a como resltado en pantallaH
Esto es el principio
Esto es el Fnal
A!ora +eamos como ;ncionaH
Borra la pantalla.
Pasa por na etiqeta deFnida como Principio.
Escri#e .Esto es el principio.
Bsca na etiqeta qe se llame .Ainal. - cando la encentra salta - sige a partir de all2.
Escri#e .Esto es el Fnal..
(omo no !a- nada m$s0 el programa termina.
En este programa !emos deFnido tres etiqetas. Para deFnir etiqetas samos las mismas normas qe
para los nom#res de +aria#les - al Fnal le colocamos el car$cter dos pntos :H=. Cas etiqetas siempre
+an al principio de la l2nea - si samos etiqetas es 5til encolmnar todas las dem$s instrcciones m$s a
la derec!a0 para +erlas al +elo.
Podemos deFnir etiqetas en calqier m)dlo de nestro programa0 pero QBasic solo las .encontrar$. si
est$n deFnidas en el m)dlo principal. Por esto no tiene sentido deFnir etiqetas dentro de
procedimientos - ;nciones.
Cas etiqetas no !acen nada0 simplemente est$n a!2. hnicamente nos sir+en para poder .Saltar. a ellas
sando instrcciones especiales como la ;amosa &OTO :&o to...0 ir a...= qe salta incondicional e
inmediatamente a la etiqeta qe le indiqemos para segir desde all2 con la e,ecci)n del programa.
Sencillo I'oK. En +erdad es m- sencillo pero pede dar lgar a toda na +ariedad de pro#lemas l)gicos
qe peden ser casi imposi#les de detectar0 aislar - solcionar. Imagina n programa donde en +e* de
tres etiqetas !a-a trescientas - entre ellas !a-a centenares de instrcciones &OTO qe dirigen la
e,ecci)n del programa a n sitio le,ano de nestro listado. Gna mala planiFcaci)n del programa
segramente !ar$ qe #loqes enteros no se llegen a e,ectar nnca o qe se prod*can #cles
inFnitos qe llegen a #loqear el programa. Por eso a los programas qe san estas instrcciones se les
conoce como .()digo Espageti..
En los lenga,es de #a,o ni+el como es el caso de los ensam#ladores - en lenga,es de giones m-
sencillos como el qe se tili*a para constrir los Fc!eros .BAT de MS-1OS se san intensi+amente las
etiqetas - las instrcciones de #i;rcaci)n o salto incondicional0 pero los modernos lenga,es de
programaci)n estrctrada :QBasic lo es= nos dan la posi#ilidad de sar estrctras de control iterati+as
:Bcles PARA0 MIE'TRAS - REPETIR=0 as2 como los procedimientos - las ;nciones qe nos permiten en
todo caso sa#er como ;nciona nestro programa para poder solcionar posi#les errores. Por esto es
m- recomenda#le E>ITAR A TO1A (OSTA EC GSO 1E ESTA METO1OCO&WA 1E PRO&RAMA(IT' (O'
I'STRG((IO'ES &OTO ? SIMICARES en los lenga,es de alto ni+el0 sal+o en el caso de las instrcciones
de mane,o de errores qe +amos a +er en los sigientes apartados - qe son el moti+o de esta
e8plicaci)n.
1.1Y.2 - I'TRO1G((IT' A COS ERRORES
/emos ido +iendo a lo largo de los temas anteriores qe !a- tres tipos de erroresH
Errores de compilaci)n
Errores de tiempo de e,ecci)n
Errores l)gicos
Cos primeros selen ser cosas mal escritas o qe no cmplen con las normas de sinta8is del lenga,e de
programaci)n. Ca ma-or2a de ellos en QBasic ser$n mostrados con;orme +amos escri#iendo nestro
c)digo al pasar de l2nea0 o en todo caso al intentar e,ectar el programa. Tendremos qe corregirlos
modiFcando lo qe este mal para poder iniciar el programa.
Cos errores de tiempo de e,ecci)n se prodcen drante la e,ecci)n del programa - son pro+ocados por
intentar !acer algo qe no est$ permitido0 como di+idir entre cero0 o #ien porqe algno de los
dispositi+os del ordenador ;alle :Memoria agotada0 no se encentra n Fc!ero0 la impresora no tiene
papel0 etc...=. Estos errores !acen qe el programa se detenga. En QBasic se +ol+er$ al editor - se
mostrar$ n recadro con el mensa,e apropiado. En otros lenga,es o en programas -a compilados
pede salir desde n simple mensa,e !asta na pantalla a*l t2pica de 6indo7s o lo m$s normal es qe
el ordenador de,e de responder - !a-a qe reiniciarlo.
Cos errores l)gicos se de#en a na mala planiFcaci)n de los algoritmos0 lo qe da lgar0 en el me,or de
los casos0 a qe el programa ;ncione correctamente pero no !aga lo qe qeremos - no resel+a el
pro#lema para el qe !a sido diseEado0 o lo m$s normal es qe llege a pro+ocar n error de tiempo de
e,ecci)n porqe se llene el espacio disponi#le en memoria o se entre en n #cle inFnito.
En este tema +amos a +er c)mo consegir qe cando se prod*ca n error de tiempo de e,ecci)n el
programa no qede detenido inmediatamente0 sino qe se salga de 9l de na ;orma n poco m$s
.elegante. o inclso se peda solcionar el pro#lema - segir normalmente con la e,ecci)n del
programa.
Gsando las t9cnicas de programaci)n estrctrada qe !emos +isto en este crso !asta antes del tema
de Fc!eros si !acemos los programas #ien 'O TIE'E' PORQGo PRO1G(IRSE ERRORES 1E TIEMPO 1E
EVE(G(IT'. 'osotros somos los responsa#les de e+itar qe los #cles sean inFnitos0 de no !acer
re;erencias a 2ndices de arra-s qe no e8isten0 de qe nada se llege a di+idir entre cero0 etc... Ca 5nica
;ente potencial de errores son los datos qe pedimos al sario0 pero si depramos los datos de entrada
de ;orma qe no se acepten +alores no permitidos como +imos en el tema de #cles podemos asegrar
en la amplia ma-or2a de los casos qe nestro programa +a a ;ncionar #ien siempre0 -a qe solo acepta
datos +$lidos.
El pro#lema llega cando empe*amos a tra#a,ar con dispositi+os e8ternos como son las nidades de
disco donde se gardan los Fc!eros. Por m- #ien !ec!o qe est9 nestro programa no podemos e+itar
qe el sario qiera a#rir n Fc!ero qe no e8iste0 o de n disqete qe toda+2a no !a introdcido en la
nidad correspondiente0 o qe se !a estropeado0 qe qiera escri#ir en n (1-ROM0 en n disco qe no
tiene espacio sFciente o qe est$ protegido contra escritea. S)lo en este caso de los Fc!eros - en
otros tam#i9n especiales como cando +eamos c)mo sar las impresoras ser$ necesario - recomenda#le
programar rtinas de mane,o de errores de las qe +amos a +er en el sigiente apartado. En otros casos
no nos merece la pena sar esto -a qe las instrcciones &OTO o;recen na ;orma especialmente mala
de estrctrar los programas - podemos despreciar la posi#ilidad de qe se prod*ca alg5n error raro
como qe se agote la memoria por clpa de otro programa - el nestro no peda segir ;ncionando.
1.1Y." - (O'TROC 1E ERRORES
Para acti+ar el control de errores en QBasic saremos la sigiente instrcci)nH
O' ERROR &OTO linea
1)nde linea es el nom#re de na etiqeta qe se !a-a deFnido en el programa principal.
Esto qiere decir .(ando se prod*ca n error +e inmediatamente a la etiqeta qe se llama linea -
sige desde all2..
1e esta ;orma consegimos qe el programa no se detenga inmediatamente al prodcirse n error.
(omo !emos dic!o antes0 solo de#emos controlar los errores en instrcciones peligrosas como es el caso
de las qe a#ren los Fc!eros :OPE'=. Gna +er pasadas estas instrcciones de#emos desacti+ar el mane,o
de errores sando la instrcci)nH
O' ERROR &OTO Q
Co 5ltimo de esta instrcci)n es n cero. A partir de a!ora cando se prod*ca n error -a no !a#r$
mane,o de errores - el programa se detendr$0 pero si lo !emos !ec!o #ien no tienen porq9 prodcirse
errores.
Co normal es acti+ar el mane,o de errores al principio de n procedimiento qe0 por e,emplo0 a#ra n
Fc!ero - desacti+arlo al Fnal0 antes de salir. 1e esta ;orma tenemos claramente delimitado donde
samos el mane,o de errores0 qe estar$ acti+o solo mientras se e,ecte ese m)dlo0 - no en el resto del
programa qe no sa instrcciones .conbicti+as..
>amos con n e,emplo completoH
SPrograma principal
(CS
I'PGT .'om#re del Fc!eroH .0 Fc!U
MestraTamanno Fc!U
E'1
mane,aerroresH
SECE(T (ASE ERR
(ASE B"
PRI'T .'o se !a encontrado el arc!i+o.
(ASE ZD
PRI'T .'o se !a encontrado la nidad de disco.
(ASE Y1
PRI'T .'o se !a encontrado el disco en la nidad.
(ASE YZ
PRI'T .'o se !a encontrado el directorio.
(ASE ECSE
PRI'T .Se !a prodcido el error.L ERR
E'1 SECE(T
E'1
SEste procedimiento a#re el arc!i+o0 mestra el tamaEo - cierra
SEntradaH ;UH El nom#re del arc!i+o
SGB MestraTamanno :;U=
O' ERROR &OTO mane,aerrores
OPE' ;U AOR I'PGT AS M1
PRI'T .El Fc!ero ocpa.L COA:1=L .#-tes..
(COSE
O' ERROR &OTO Q
E'1 SGB
Este programa pide al sario qe escri#a el nom#re de n Fc!ero para a#rirlo - mostrar s tamaEo
sando la ;nci)n COA qe -a conocemos.
Si escri#imos n nom#re de arc!i+o +$lido no se acti+a para nada el mane,o de errores - el programa
;nciona normalmente0 nos calcla el tamaEo en #-tes del arc!i+o - termina al llegar a la instrcci)n
E'1 qe !a- ,sto desp9s de la llamada al procedimiento. El resltado podr2a serH
'om#re del Fc!eroH cH_atoe8ec.#at
El Fc!ero ocpa 21] #-tes.
>eamos como ;nciona el programa paso a paso en caso de qe el Fc!ero e8ista - no se prod*ca el
errorH
Entramos al m)dlo principal.
Borramos la pantalla con (CS.
Pedimos al sario qe escri#a el nom#re de n Fc!ero - lo gardamos en la +aria#le Fc!UH
Entramos al procedimiento Mestratamanno - le pasamos la +aria#le Fc!U qe contiene el nom#re qe
!a escrito el sario.
?a dentro del procedimiento0 acti+amos el control de errores.
A#rimos el Fc!ero0 qe e8iste0 para lectra - le asignamos el descriptor M1
(alclamos el tamaEo del Fc!ero a#ierto M1 con la ;nci)n COA - lo escri#imos en pantalla ,nto con n
mensa,e.
(erramos todos los Fc!eros a#iertos :El 5nico qe !a-=.
1esacti+amos el control de errores - salimos del m)dlo porqe no !a- m$s instrcciones.
1e +elta al programa principal la sigiente instrcci)n qe encontramos es E'1 qe !ace qe el
programa termine0 la samos para qe no se e,ecten las sigientes instrcciones qe son las del control
de errores.
Aq2 encontramos como no+edad la instrcci)n E'1 qe !ace qe el programa termine de ;orma normal
anqe no !a-amos llegado al Fnal del listado. Ca tendremos qe poner siempre en el m)dlo principal
antes de la etiqeta del mane,ador de errores para e+itar qe estas instrcciones se e,ecten en caso
normal de qe no !a-a n error. En otros casos no es recomenda#le sar esta instrcci)n0 los programas
- m)dlos de#en empe*ar por el principio - terminar por el Fnal del listado.
A!ora +amos a +er como ;ncionar2a el programa paso a paso en el caso de qe qisi9ramos a#rir n
Fc!ero qe no e8iste - se prod,era el error.
Entramos al m)dlo principal.
Borramos la pantalla con (CS.
Pedimos al sario qe escri#a el nom#re de n Fc!ero - lo gardamos en la +aria#le Fc!UH
Entramos al procedimiento Mestratamanno - le pasamos la +aria#le Fc!U qe contiene el nom#re qe
!a escrito el sario.
?a dentro del procedimiento0 acti+amos el control de errores.
Intentamos a#rir el Fc!ero como no e8iste se prodcir2a n error de tiempo de e,ecci)n qe es
detectado por el control de errores qe contin5a inmediatamente con la e,ecci)n del programa a partir
de la l2nea deFnida como mane,aerrores en el programa principal.
1esp9s de esta l2nea encontramos n SECE(T (ASE qe sa la ;nci)n ERR. Esta ;nci)n de+el+e el
n5mero del error qe se !a prodcido. (ada error tiene n n5mero 5nico qe nos sir+e para identiFcarlo
- !acer na cosa otra seg5n lo qe !a-a ocrrido. En este caso lo saremos para sacar n mensa,e
adecado diciendo al sario lo qe !a pasado.
1esp9s del SECE(T (ASE0 el programa termina0 pero lo !ace normalmente porqe se !a aca#ado el
listado0 - no porqe se !a prodcido n error0 cosa qe !a- qe e+itar a toda costa.
/a- qe tener claro qe al prodcirse el error el Fc!ero no se !a a#ierto0 - por lo tanto el descriptor M1
no contiene re;erencia a ning5n Fc!ero0 por lo qe no podemos intentar !acer nada con 9l0 ni siqiera
cerrar el Fc!ero.
/a- n gran n5mero de c)digos de error0 pedes +er na lista completa de ellos en la a-da en pantalla
de Q#asic. 'nca es necesario controlarlos todos0 por e,emplo si estamos tra#a,ando con Fc!eros solo
pondremos algnos de los relacionados con Fc!eros. Siempre es con+eniente sar algo como (ASE ECSE
para qe qede controlado algno qe se nos !a-a podido escapar0 en este caso #astar$ con mostrar el
n5mero por pantalla para poder identiFcar el error de algna ;orma0 pero siempre !aciendo qe el
programa termine #ien.
Se peden !acer mane,os de errores mc!o m$s ela#orados qe llegen a solcionar el pro#lema - el
programa peda segir ;ncionando como si nada. Imagina qe qeremos a#rir n Fc!ero .I'I d)nde
est$ la conFgraci)n del programa0 - este se !a #orrado. En este caso de ;orma totalmente transparente
al sario podr2amos crear no ne+o +ac2o o con +alores por de;ecto - de,arlo a#ierto para qe el
programa siga tra#a,ando con 9l normalmente. En este caso sar2amos la instrcci)n RESGME para
continar con el programa por la l2nea sigiente a la qe prod,o el error0 na +e* qe -a !a-amos
a#ierto el ne+o Fc!ero para escritra0 !a-amos escrito en 9l lo qe sea0 lo !a-amos cerrado - lo
!a-amos +elto a a#rir para lectra0 todo esto en el mane,ador de errores.
TEMA 1.1D
CCAMA1A A PRO&RAMAS EXTER'OS
Co 5ltimo qe nos qeda por +er en la secci)n de temas #$sicos del crso de introdcci)n a la
programaci)n es c)mo consegir qe nestro programa sea capa* de iniciar otros programas e8ternos0
-a sean e,ecta#les .EXE ordenes de MS-1OS internas o e8ternas o #ien otros programas de QBasic.
Para consegir lo primero saremos la instrcci)n S/ECC segida de la orden de MS-1OS o del programa
e,ecta#le o programa BAT qe qeremos e,ectar. >amos con nos cantos e,emplosH
S/ECC .dir.
/ace qe en la pantalla de nestro programa apare*ca el listado del contenido del directorio acti+o.
S/ECC .dir cH_#asic_,egos.
/ace qe en la pantalla de nestro programa apare*ca el listado del contenido del directorio
cH_#asic_,egos. Si este directorio no e8iste no se prodcir$ ning5n error en nestro programa0
simplemente la orden 1IR nos sacar$ n mensa,e diciendo qe no se !a encontrado el ac!i+o.
S/ECC .lote.#at.
E,ecta el arc!i+o de proceso por lotes llamado lote.#at. Co #scar$ en el directorio acti+o - si no lo
encentra lo #scar$ en los directorios qe aparecen en la +aria#le de entorno PAT/ del MS-1OS. Si no lo
encentra sacar$ el t2pico mensa,e .(omando o nom#re de arc!i+o incorrecto.0 pero en nestro
programa no ocrrir$ ning5n error.
S/ECC .7inmine.
En la ma-or2a de los casos0 iniciar$ el #scaminas de 6indo7s0 n programa e,ecta#le. Si no lo
encentra pasar$ lo mismo qe en el e,emplo anterior0 pero tampoco generar$ ning5n error.
S/ECC
Si no escri#imos ning5n argmento0 se a#rir$ na instancia de MS-1OS dentro de nestro programa de
QBasic. Aq2 el sario podr$ e,ectar )rdenes como se !ace normalmente. Para +ol+er al programa
tendr$ qe escri#ir EXIT - plsar Enter. /a#r$ qe ad+ertir esto al sario antes de entrar para qe no se
qede .encerrado. si no sa#e como salir. Tam#i9n es peligroso e,ectar determinados programas -a qe
en estos entornos los recrsos de memoria son m- limitados.
Esta instrcci)n S/ECC nos pede ser+ir para e,ectar ordenes de MS-1OS o peqeEos programas qe
nos peden !acer ;alta sar.
Si e,ectamos algo de MS-1OS0 qe no es n sistema mltitarea0 nestro programa qedar$ detenido
!asta qe este programa termine. En el caso qe llamemos a alg5n programa 6indo7s0 como el caso del
#scaminas0 nestro programa lo iniciar$ - segir$ ;ncionando.
'ormalmente no ser$ necesario llamar a programas e8ternos0 sal+o en sitaciones m- espec2Fcas0 -
siempre de#er$n ser programas sencillos qe consman m- pocos recrsos0 si llamamos a alg5n
programa m- grande como 6indo7s desde QBasic - ;allan los sistemas de segridad pede qe el
ordenador se #loqee.
Tam#i9n nos pede interesar qe nestro programa termine - pase el control a otro programa de QBasic0
por e,emplo en el caso de qe sea n men5. Para !acerlo !ar2amos esto.
RG' .Programa.#as.
Al e,ectar esta orden nestro programa termina inmediatamente - QBasic carga e inicia el otro
programa #asic. Esta orden eqi+ale a qe nosotros detengamos nestro programa inmediatamente0 en
el editor a#ramos el otro programa - lo e,ectemos plsando AB.
Si al sar la orden RG' toda+2a no !a#2amos gardado los cam#ios en el c)digo ;ente aparecer$ n
mensa,e del editor pidi9ndonos qe lo !agamos0 esto no es n error0 cando lo !agamos se continar$
con el otro programa.
Si el programa no e8iste se prodcir$ n error de tiempo de e,ecci)n.
Si el programa no es n programa #asic se prodcir$ n error de compilaci)n al intentar iniciarlo0 nestro
programa anterior para entonces -a !a#r$ terminado.
Al pasar de n programa a otro se cierran los Fc!eros qe !#iera a#iertos - desaparecen todas las
+aria#les. En algnos casos0 toda+2a m$s re#scados0 nos pede interesar segir tra#a,ando con los
Fc!eros a#iertos - con las +aria#les glo#ales qe ;eron declaradas con la instrcci)n (OMMO'. Para
consegir esto en +e* de sar la instrcci)n RG' saremos la instrcci)n (/AI'0 qe tra#a,a de ;orma
id9ntica0 e8cepto en qe conser+a los Fc!eros a#iertos - reconoce las +aria#les declaradas con (OMMO'
en programas anteriores.
'ormalmente na #ena ,erarq2a de procedimientos SGB ser$ m$s recomenda#le - m$s estrctrada
qe sar la orden RG' o (/AI'. Estas ordenes solo las de#eremos sar en casos m- sencillos como n
peqeEo men5 qe nos a#ra +arios programas. Ca orden (/AI' no la de#eremos sar casi nnca - so#re
todo no encadenar +arios programas -a qe perderemos completamente la pista de d)nde declaramos
las +aria#les - a#rimos los arc!i+os0 cosa qe pede dar lgar a errores m- di;2ciles de solcionar0 como
ocrre siempre qe no estrctramos #ien los programas.
TEMA 2.1
1ETE((IT' 1E TE(CAS PGCSA1AS
(O' CA AG'(IT' I'gE?U
2.1.1 - Gso de la ;nci)n I'gE?U
2.1.2 - Reconocimiento de teclas especiales
2.1." - /acer pasas en los programas
2.1.1 - GSO 1E CA AG'(IT' I'gE?U
Ca ;nci)n I'gE?U nos de+el+e el contenido del #ler del teclado0 es decir0 cal es la 5ltima tecla o
com#inaci)n de teclas qe se !a plsado. Esta ;nci)n es m$s primiti+a qe I'PGT0 pero no la pdimos
+er en el tema de entrada - salida #$sica porqe toda+2a no sa#2amos c)mo sar los #cles0 algo
imprescindi#le para sar esta ;nci)n -a qe el programa no se detiene como ocrre con la instrcci)n
I'PGT. Tam#i9n !a- qe tener en centa qe no es algo #$sico de la teor2a de programaci)n0 -a qe en
otros lenga,es pede qe ;ncione de ;ormas m- distintas.
Para sar la ;nci)n lo qe !aremos es almacenar s +alor en na +aria#le0 -a qe al leer el +alor de
I'gE?U el car$cter qe contenga se #orra del #ler de teclado - -a no lo +eremos m$s.
>amos con el primer e,emploH
(CS
teclaU ^ I'gE?U
PRI'T teclaU
Este e,emplo ;nciona0 anqe al e,ectarlo no lo pare*ca. Co qe !ace es #orrar la pantalla0 almacenar
la 5ltima tecla plsada :drante el tiempo de +ida del programa= en la +aria#le teclaU - a continaci)n
escri#irla en pantalla. Co qe pasa es qe como el programa no se detiene no nos da tiempo a plsar
ningna tecla - no aparece nada en pantalla0 sal+o el conocido r)tlo .Presione calqier tecla -
contin5e..
Para solcionar esto tenemos qe recrrir a los #cles - programar lo qe se conoce como .mecanismo
de espera acti+a.. All$ +amos0 el sigiente ;ragmento de c)digo ser$ de los m$s sados en ,egos -
programas interacti+os !ec!os con QBasicH
1O
teclaU^I'gE?U
COOP 6/ICE teclaU^..
Al !acer esto se entra en n #cle qe lee continamente la entrada de teclado - la almacena en la
+aria#le teclaU. 'o salimos del #cle mientras no plsemos nada - la +aria#le teclaU siga estando +ac2a.
Gna +e* qe plsemos na tecla esta qedar$ almacenada en la +aria#le para sarla m$s adenante
donde !aga ;alta.
Esto -a ;nciona #ien0 pero toda+2a no es in;ali#le. Pede ocrrir qe en el #ler del teclado qede
algna plsaci)n de tecla residal de algna instrcci)n de entrada anterior - qe al llegar aq2 se salte
la espera. Para qe esto no ocrra tendremos qe .limpiar el #ler del teclado. antes de entrar al #cle.
Para !acerlo saremos otro #cle qe lee las posi#les teclas :- las +a #orrando= del #ler !asta qe se
qede +ac2o. >amos a +er n e,emplo completo qe espera a qe plsemos na tecla - la saca por
pantalla. El primer #cle0 de tipo 6/ICE0 corresponde a la limpie*a del #ler - el segndo0 de tipo
1O..COOP0 a la espera acti+a.
(CS
6/ICE I'gE?UNO..
6E'1
1O
teclaU^I'gE?U
COOP 6/ICE I'gE?U^..
PRI'T teclaU
(omo se pede +er0 este #cle de limpie*a es n #cle 6/ICE0 es decir0 n #cle rec!a*a#le. Si el #ler
-a est$ +ac2o ni siqiera entramos0 en caso contrario entramos - leemos - #orramos la tecla qe pdiera
tener antes de ir al otro #cle de reconocimiento de teclas.
2.1.2 - RE(O'O(IMIE'TO 1E TE(CAS ESPE(IACES
(omo !emos dado por spesto en los e,emplos anteriores las teclas se almacenan en el #ler del
teclado sando el c)digo AS(II o la representaci)n del car$cter qe lle+an. Por e,emplo la .a min5scla.
se almacena como .a. o s c)digo AS(II qe es el ]Y0 la .a ma-5scla. lo !ace como .A. o ZB0 el n5mero
cinco como .B. o B"0 el pnto como ... o %Z 0 el espacio en #lanco como . . o "2 - as2 con todos los
caracteres qe tenemos en la secci)n al;anm9rica del teclado.
Para tra#a,ar con los c)digos AS(II saremos la conocida ;nci)n (/RU:=0 de esta ;orma es lo mismo
decir...
IA teclaU ^ .A. T/E'
...qe...
IA teclaU ^ (/RU:ZB= T/E'
1e esta ;orma tam#i9n podemos identiFcar otras teclas solo con conocer s c)digo AS(II. Estos son
algnos de los m$s sadosH
Escape.....H 2Y
Enter......H 1"
Ta#lador..H ]
Retroceso..H D
Tam#i9n es posi#le identiFcar las teclas especiales de bec!as :Imprescindi#le para los ,egos=0 las teclas
de ;nci)n - las otras como Inicio0 Ain0 Insertar0 etc.
Al plsar estas teclas se almacenan en el #ler del teclado dos caracteres0 siendo el primero el (/RU:Q=.
Para identiFcar estas teclas no !a- m$s qe sar en las compro#aciones (/RU:Q=dEl car$cter qe
tengan asignado0 aq2 +a na lista de los m$s sadosH
Alec!a arri#a......H (/RU:Q=d./.
Alec!a a#a,o.......H (/RU:Q=d.P.
Alec!a i*qierda...H (/RU:Q=d.g.
Alec!a derec!a.....H (/RU:Q=d.M.
A1.................H (/RU:Q=d.L.
A2.................H (/RU:Q=d.N.
A".................H (/RU:Q=d.^.
A%.................H (/RU:Q=d.O.
AB.................H (/RU:Q=d.K.
AZ.................H (/RU:Q=d.p.
AY.................H (/RU:Q=d.A.
AD.................H (/RU:Q=d.B.
A].................H (/RU:Q=d.(.
A1Q................H (/RU:Q=d.1.
A11................H (/RU:Q=d(/RU:1""=
A12................H (/RU:Q=d(/RU:1"%=
Insertar...........H (/RU:Q=d.R.
sprimir...........H (/RU:Q=d.S.
Inicio.............H (/RU:Q=d.&.
Ain................H (/RU:Q=d.O. :Cetra o ma-5scla=
Retroceder p$gina..H (/RU:Q=d.I. :Cetra i ma-5scla=
A+an*ar p$gina.....H (/RU:Q=d.Q.
Podemos +er na lista completa en la a-da en pantalla de QBasic en el apartado llamado .()digos de
e8ploraci)n del teclado.. Aq2 tam#i9n aparecen los c)digos de teclas com#inadas como por e,emplo
(O'TROCdf.
>amos a +er n e,emplo Fnal de n programa qe recono*ca todas las teclas al;anm9ricas normales
adem$s de Enter0 Escape - las bec!as qe son especiales. En temas sigientes cando !agamos
programas m$s .#onitos. saremos ampliamente el reconocimiento de teclas.
(CS
PRI'T .Plsa las teclas qe qieras0 escape para salir.
PRI'T
1O
6/ICE I'gE?U NO ..H 6E'1 SCimpia #ler de entrada
1O
teclaU ^ I'gE?U
COOP 6/ICE teclaU ^ ..
SECE(T (ASE teclaU
(ASE (/RU:Q= d ./.H PRI'T ./as plsado la bec!a arri#a.
(ASE (/RU:Q= d .P.H PRI'T ./as plsado la bec!a a#a,o.
(ASE (/RU:Q= d .g.H PRI'T ./as plsado la bec!a i*qierda.
(ASE (/RU:Q= d .M.H PRI'T ./as plsado la bec!a derec!a.
(ASE (/RU:1"=H PRI'T ./as plsado Enter.
(ASE (/RU:2Y=H PRI'T ./as plsado Escape0 adios.
(ASE . .H PRI'T ./as plsado la #arra de espacio.
(ASE ECSEH PRI'T ./as plsado la tecla . d teclaU
E'1 SECE(T
COOP G'TIC teclaU ^ (/RU:2Y=
O#ser+a qe este programa no reconoce las teclas de ;nci)n0 entre otras0 para !acerlo no !a- m$s qe
aEadir las instrcciones (ASE con los c)digos correspondientes.
2.1." - /A(ER PAGSAS E' COS PRO&RAMAS
Gna ;orma m- sencilla de detener la e,ecci)n de n programa0 por e,emplo para qe el sario peda
leer algo es sar la instrcci)n SCEEP. Al sar esta instrcci)n el programa se detiene !asta qe el
sario plse na tecla. Si aEadimos n n5mero a continaci)n0 por e,emploH
SCEEP 1Q
Ocrrir$ qe el programa se detendr$ por n m$8imo de 1Q segndos0 continando pasado este tiempo
atom$ticamente anqe el sario no plse ningna tecla.
Esta instrcci)n ;ncionar$ en la ma-or2a de los casos0 pero pede ocrrir qe algna +e* no llege a
detener el programa porqe !a- datos residales en el #ler de entrada0 en estos casos podremos sar
lo qe !emos +isto en el apartado anteriorH Cimpie*a del #lerdEspera acti+a0 es decir estoH
6/ICE I'gE?UNO..H6E'1
1OHCOOP 6/ICE I'gE?U^..
Esta estrctra la podemos ampliar para !acer na pregnta al sario - de,arle responder S2 o 'o
plsando S o '0 por e,emplo.
6/ICE I'gE?UNO..H6E'1
1O
teclaU^I'gE?U
COOP G'TIC teclaU^.S. OR teclaU^.'.
Aq2 entramos en el #cle de espera acti+a - no salimos !asta qe el sario plse la S o la '0 - desp9s
m$s adelante en el programa +iendo el +alor de teclaU -a decidir2amos entre !acer algo o no. Pero
toda+2a !a- n pro#lema0 este e,emplo tal como est$ s)lo reconoce la S - la ' ma-5sclas0 por lo qe si
el sario tiene el .Bloqeo de ma-5sclas. desacti+ado pede qe no se le ocrra como segir. Para
arreglar el pro#lema saremos la ;nci)n G(ASEU qe con+ierte todas las letras :Menos la m - las +ocales
acentadas= a ma-5sclas. >amos con el e,emplo completoH
(CS
PRI'T .IQieres !acer no se q9K Sa'H .
6/ICE I'gE?UNO..H6E'1
1O
teclaU^G(ASEU:I'gE?U=
COOP G'TIC teclaU^.S. OR teclaU^.'.
IA teclaU^.S. T/E'
PRI'T ./as dic!o qe s2.
ECSE
PRI'T ./as dic!o qe no.
E'1 IA
Ampliando m$s este e,emplo podr2amos constrir n men5 .ctre.. Si de,amos al sario la posi#ilidad
de plsar m$s teclas0 normalmente n5meros0 - desp9s los compro#amos con n SECE(T (ASE
podr2amos decidir entre !acer +arias cosas. Es na estrctra similar a la sada en el e,emplo de
reconocer teclas del apartado anterior.
TEMA 2.2
'hMEROS ACEATORIOS ? (O'TROC 1E TIEMPO
2.2.1 - '5meros aleatorios. Anci)n R'1
2.2.2 - (ontrol de tiempo
2.2.1 - MhMEROS ACEATORIOS. AG'(IT' R'1
(ando diseEamos n programa in;orm$tico lo qe intentamos es resol+er n pro#lema o#teniendo n
resltado lo m$s e8acto - Fa#le posi#le0 sando la gran precisi)n de los c$lclos qe !acen los
ordenadores. 1e !ec!o0 na de las normas #$sicas para asegrar qe n algoritmo ;nciona
correctamente es poder asegrar - demostrar qe para nos mismos datos de entrada los resltados o
datos de salida +an a ser siempre los mismos.
En algnos casos como son los +ideo,egos nos pede interesar qe sceda ,stamente lo contrario de lo
qe se !a dic!o en el p$rra;o anterior0 es decir0 qe cada +e* qe e,ectemos el programa scedan
cosas distintas - aparentemente impredeci#les. Otras aplicaciones donde tendr2a qe sceder esto
ser2an programas simladores de c$lclos - ;en)menos cient2Fcos - algnas aplicaciones matem$ticas o
estad2sticas especiales.
Para poder llegar a estas sitaciones nos encontramos con el terri#le pro#lema de consegir qe el
ordenador :tan per;ecto0 e8acto0 preciso0 etc...= sea capa* de generar n5meros de calqier manera sin
responder a ning5n orden aparente. Esto t9cnicamente es imposi#le - por lo tanto en +e* de !a#lar de
n5meros aleatorios ser2a m$s correcto llamarlos n5meros psedo-aleatorios porqe no son
completamente impredeci#les0 pero lo son casi0 lo sFciente como para resol+er nestras necesidades.
Para generar estos n5meros :psedo-= aleatorios el ordenador pede sar mecanismos tales como medir
el tiempo entre dos plsaciones de teclas0 o el necesario para en+iar o reci#ir n dato a tra+9s de na
red. (omo esto pede ser di;2cil de consegir en algnos casos0 es mc!o m$s c)modo sar lo qe se
conoce como .generador de n5meros aleatorios. qe es na ;ormla matem$tica qe al aplicarla
repetidas +eces pas$ndole los +alores anteriores nos +a de+ol+iendo na serie de n5meros sin orden
aparente. Gna de estas ;)rmlas se llama .&enerador de Marsaglia. - +iene a ser algo as2 comoH
*' ^ :2111111111 ` *'-% d 1%]2 ` *n-" d 1YYZ ` *n-2 d B11B ` *n-1 d (= MO1 2"2
( ^ ACOOR::2111111111 ` *'-% d 1%]2 ` *n-" d 1YYZ ` *n-2 d B11B ` *n-1 d (= a 2"2=
Esta ;)rmla nos de+ol+er2a na serie de n5meros qe no empe*ar2a a repetirse !asta qe lo !a-amos
calclado " ` 1Q ele+ado a %Y +eces0 n " con %Y ceros detr$s0 m$s qe sFciente. Pero qe nadie se
asste0 de !ec!o no se ni si est$n #ien copiados los n5meros. En QBasic :- en otros lenga,es de
programaci)n= no nos !ace ;alta programar tantos rel2os0 #asta con sar el +alor qe nos de+el+a la
;nci)n R'1 cada +e* qe qeramos o#tener n n5mero aleatorio. >amos con n e,emplo de los m$s
sencillo del crso de programaci)nH
(CS
PRI'T R'1
Al e,ectarlo se escri#ir2a en pantalla el n5mero aleatorio qe de+el+a la ;nci)n R'10 n +alor decimal
:casi= impredeci#le0 por e,emploH
.YQBB%YB
?a lo tenemos a!20 n n5mero generado por el ordenador sin responder a ning5n criterio aparente :Cle+a
n cero delante0 pero QBasic se lo qita al escri#irlo en la pantalla - solo se +e el pnto decimal=0 pero
toda+2a !a- n pro#lema0 e,ecta el programa +arias +eces - mira el resltado.
Pedes compro#ar qe siempre sale el mismo n5mero0 -a no es tan impredeci#le. Esto se de#e a qe no
!emos iniciali*ado el generador de n5meros aleatorios de QBasic.
Si tratas de desci;rar algo de la ;)rmla de Marsaglia qe !a- m$s arri#a o#ser+ar$s qe para calclar n
n5mero psedo-aleatorio se necesitan algnos de los calclados anteriormente. Esto +a m- #ien si -a
los !emos calclado0 pero si es la primera +e* no los tenemos. En este caso tendremos qe sar lo qe
se conoce como .Semilla.0 qe es n n5mero ar#itrario sado para qe empiece a ;ncionar el
generador. Si este n5mero es el mismo siempre los n5meros aleatorios de+eltos ser$n siempre na
misma serie0 por lo tanto !a- qe sar como semilla n n5mero lo m$s .aleatorio. posi#le como por
e,emplo el n5mero de segndos qe !an pasado a partir de las doce de la noc!e0 cosa qe nos de+el+e
la ;nci)n TIMER. Para iniciali*ar el generador de n5meros aleatorios saremos la instrcci)n RA'1OMIfE
segida de la semilla0 normalmente TIMER. >amos con el e,emplo completoH
RA'1OMIfE TIMER
(CS
PRI'T R'1
A!ora s2 qe cada +e* qe e,ectemos el programa tendremos n n5mero distinto. El +alor solo se
repetir2a si e,ectamos el programa otro d2a a la misma !ora0 mismo minto0 mismo segndo. Algo di;2cil
de consegir - n riesgo acepta#le en programas qe no necesiten ele+adas medidas de segridad como
los nestros0 pero no en otras aplicaciones como pdieran ser m$qinas recreati+as. 1e !ec!o0 en
sistemas m$s serios como Cn8 se pede o#ser+ar como al apagar el ordenador se garda en alg5n
sitio la semilla aleatoria para poderla segir sando la pr)8ima +e*.
Ca instrcci)n RA'1OMIfE TIMER es algo as2 como remo+er las #olas en n sorteo de loter2a0 de#emos
sarla na +e* al principio de los programas qe sen la ;nci)n R'10 pero no es necesario sarla m$s0
de !ec!o repetirla en sitios como dentro de n #cle podr2a resltar contraprodcente.
El +alor de+elto por R'1 +a a ser n n5mero decimal de precisi)n sencilla ma-or o igal qe cero -
menor qe no0 es decir0 algna +e* podr2a salir el cero0 pero nnca saldr$ el no. Este +alor lo podemos
mltiplicar o redondear para adaptarlo a nestras necesidades.
>amos con n programa qe contiene dos e,emplosH
(CS
RA'1OMIfE TIMER
+alor1ado ^ I'T:R'1`Z=d1
PRI'T ./emos lan*ado n dado - !a salido.L +alor1ado
IA R'1 O Q.B T/E'
PRI'T ./emos lan*ado na moneda - !a salido ScaraS.
ECSE
PRI'T ./emos lan*ado na moneda - !a salido Scr*S.
E'1 IA
Qe dar2a este resltado :(on estos otros +alores=H
/emos lan*ado n dado - !a salido %
/emos lan*ado na moneda - !a salido Scr*S
En el primer caso mltiplicamos el +alor de R'1 por seis0 -a tenemos n n5mero decimal qe pede ir
desde Q a B.]]] :'nca Z=. A continaci)n lo redondeamos !acia a#a,o sando la ;nci)n I'T0 -a
tenemos n entero entre Q - B. (omo qeremos n +alor posi#le entre 1 - Z0 qe son las caras qe
tienen los dados0 no !a- m$s qe smarle 1.
En el segndo caso lo qe !acemos es compro#ar el +alor de R'1 para !acer na cosa otra. (omo en
este caso qeremos qe las dos partes del IA tengan las mismas posi#ilidades ponemos el pnto de
compro#aci)n en la mitad0 en Q.B. Si qisi9ramos +ariar las posi#ilidades no tendr2amos m$s qe
cam#iar ese n5mero. Si qeremos m$s de dos posi#ilidades podemos sar n SECE(T (ASE con +arios
inter+alos.
Por 5ltimo +amos a +er como consegir qe R'1 nos repita el 5ltimo n5mero qe gener) sin tener qe
gra#arlo en ningna +aria#le. Para consegirlo #astar2a con escri#ir R'1:Q= en +e* de R'1. >amos con
n e,emploH
(CS
RA'1OMIfE TIMER
PRI'T .Gn n5mero aleatorio.............H.L R'1
PRI'T .Repitamos el mismo n5mero.......H.L R'1:Q=
PRI'T .Otra +e* m$s....................H.L R'1:Q=
PRI'T .A!ora n n5mero aleatorio ne+o.H.L R'1
PRI'T .>amos a sacarlo otra +e*........H.L R'1:Q=
El resltado podr2a ser :con otros n5meros=H
Gn n5mero aleatorio.............H .2QB1]Y2
Repitamos el mismo n5mero.......H .2QB1]Y2
Otra +e* m$s....................H .2QB1]Y2
A!ora n n5mero aleatorio ne+o.H .1]Z]1BZ
>amos a sacarlo otra +e*........H .1]Z]1BZ
(omo se pede +er0 si llamamos a R'1 sin argmentos0 como !emos !ec!o !asta a!ora0 nos da n
n5mero aleatorio0 pero si lo !acemos pas$ndole como argmento el cero entre par9ntesis :Tiene qe ser
o#ligatoriamente el cero= lo qe !aces es repetir el mismo n5mero en +e* de calclar no ne+o0 qe
ser2a el sigiente de la serie.
Si samos R'1:Q= por primera +e* en el programa0 sin !a#er sado antes R'10 no pasa nada0 tendremos
n n5mero aleatorio.
Esto no se tili*a demasiado0 pero en alg5n caso podemos a!orrarnos na +aria#le - na instrcci)n de
asignaci)n si qeremos sar el mismo n5mero en +arios sitios.
2.2.2 - (O'TROC 1E TIEMPO
El ordenador lle+a instalado n relo, digital qe sa para mc!as cosas0 como por e,emplo para
almacenar en los directorios la ;ec!a - !ora en qe se gard) cada arc!i+o. Por spesto nosotros
tam#i9n podemos tili*ar este +alor en nestros programas.
Ca ;orma m$s sencilla de o#tener la !ora -a la !emos +isto en el apartado anterior. Es sar el +alor
de+elto por la ;nci)n TIMER0 n entero largo con los segndos qe !an pasado desde las doce de la
noc!e. (on esta ;nci)n -a podemos !acer n programa qe nos salde de distinta ;orma dependiendo
del momento del d2a qe sea. All$ +amos...
(CS
SECE(T (ASE TIMER
(ASE IS N 2DDQQH PRI'T .Benas madrgadas.
(ASE 2DDQ1 TO %"2QQH PRI'T .Benos d2as.
(ASE %"2Q1 TO Y2QQQH PRI'T .Benas Tardes.
(ASE ECSEH PRI'T .Benas noc!es.
E'1 SECE(T
El resltado0 si e,ectamos el programa a las die* de la maEana ser2aH
Benos d2as
Es na ;orma de qe nestro programa sea algo .inteligente.0 anqe toda+2a se podr2a me,orar
:mc!o=. Co qe !emos !ec!o es +er cantos segndos !an pasado a las oc!o de la maEana0 a mediod2a
- a las oc!o de la tarde para deFnir los inter+alos0 nada m$s.
Tam#i9n podemos sar la ;nci)n TIMER para cronometrar el tiempo qe tarda en pasar algo. Bastar2a
con almacenar la !ora en na +aria#le antes de empe*ar0 !acer lo qe sea0 - al terminar almacenar la
!ora en otra +aria#le - restarlas. O#tendr2amos el n5mero de segndos. >amos a cronometrar lo qe
tarda el ordenador en escri#ir en pantalla los n5meros del 1 al 1Q.QQQ. All$ +amos...
(CS
inicio^TIMER
AOR n ^ 1 TO 1QQQQ
PRI'T n
'EXT
Fnal ^ TIMER
tiempo ^ Fnal - inicio
PRI'T ./a tardado.L tiempoL .segndos.
Este programa0 al Fnal de la tira de 1Q.QQQ n5meros nos dar2a n mensa,e con el n5mero de segndos
qe !a tardado.
Todo ;ncionar2a #ien e8cepto si drante la e,ecci)n del programa !an dado las doce de la noc!e0
o#teni9ndose en este caso n n5mero negati+o. Para solcionar el pro#lema !a#r2a qe colocar la
sigiente l2nea ,sto antes de sacar el mensa,e. Co qe !acemos es smarle todos los segndos de n d2a
si !a dado negati+o.
IA tiempo N Q T/E' tiempo ^ tiempo d DZ%QQ
A!ora +amos a recordar dos ;nciones qe nos de+el+en la ;ec!a - la !ora en modo te8to0 son 1ATEU -
TIMEU.
(CS
PRI'T ./o- es .L 1ATEU
PRI'T .Son las .L TIMEU
Esta dar2a como resltado algo comoH
/o- es Q1-2Q-2QQD
Son las 1QH%2H"B
(on la !ora no !a- nada qe aclarar0 pero la ;ec!a est$ en ;ormato americano0 primero el mes0 desp9s
el d2a - al Fnal el aEo. El mes - el d2a siempre con dos ci;ras - el aEo con catro. Estas ;nciones peden
ser m$s intiti+as pero para mane,ar las ci;ras las tenemos qe separar sando la ;nci)n MI1U. >amos
con el e,emploH
(CS
PRI'T .El d2a es .L MI1U:1ATEU0 %0 2=
PRI'T .El mes es .L MI1U:1ATEU0 10 2=
PRI'T .El aEo es .L MI1U:1ATEU0 Y0 %=
PRI'T
PRI'T .Ca !ora es .L MI1U:TIMEU0 10 2=
PRI'T .Cos mintos son .L MI1U:TIMEU0 %0 2=
PRI'T .Cos mintos son .L MI1U:TIMEU0 Y0 2=
? el resltado podr2a serH
El d2a es 2Q
El mes es Q1
El aEo es 2QQD
Ca !ora es 1Q
Cos mintos son %2
Cos mintos son "B
M- sencillo. Co 5nico qe !emos !ec!o es .recortar. con la ;nci)n MI1U el tro*o de cadena donde est$
cada cosa0 qe siempre +a a estar en el mismo sitio0 - separarlo para !acer con 9l lo qe qeramos. ? si
nos !iciera ;alta smarlos o compararlos podr2amos con+ertirlos a enteros sando la ;nci)n >AC.
Aplicando esto mismo0 +amos con n e,emplo de na ;nci)n a la qe +amos a llamar AE(/AU - nos +a a
de+ol+er la ;ec!a actal como la samos normalmente en castellanoH 12a0 mes - aEo separados por
#arras.
AG'(TIO' AE(/AU
a8U ^ MI1U:1ATEU0 %0 2=
a8U ^ a8U d .a. d MI1U:1ATEU0 10 2=
a8U ^ a8U d .a. dMI1U:1ATEU0 Y0 %=
AE(/AU ^ a8U
E'1 AG'(TIO'
Al llamarla desde calqier parte de nestro programa nos de+ol+er2a0 en ;ormato cadena algo como
2QaQ1a1QD0 qe qeda m$s #onito qe Q1-2Q-1QD.
Para terminar +amos a +er como cam#iar la ;ec!a - !ora del sistema desde nestro programa. Algo qe
no es !a#ital ni recomenda#le0 pero qe en alg5n caso nos pede !acer ;alta.
Ser2a sando las instrcciones0 no ;nciones sino instrcciones0 1ATEU - TIMEU - asign$ndoles cadenas
qe contengan la ;ec!a o la !ora en el ;ormato adecado. >amos con nos e,emplosH
1ATEU ^ .Q%-2Q-1QD.
1ATEU ^ .Q%-2Q-]2.
1ATEU ^ .Q%-QZ-1]]%.
TIMEU ^ .1QH2%H"B.
TIMEU ^ .1QH2%.
TIMEU ^ .1Q.
Ca ;ec!a podemos esta#lecerla poniendo siempre el mes primero - desp9s el d2a - el aEo0 este 5ltimo
dato pede tener dos o catro ci;ras. En el 5ltimo e,emplo podr2amos ddar entre si la ;ec!a es el % de
,nio o el Z de a#ril0 se almacenar2a este 5ltimo0 Z de a#ril. (idado con esto0 siempre mes0 d2a0 aEo.
En el caso de la !ora si no ponemos los mintos o los segndos se entender$n qe son QQ.
Si intentamos asignar na ;ec!a o na !ora no +$lida se prodcir$ n error de tiempo de e,ecci)n.
'ormalmente no es recomenda#le modiFcar estas cosas desde los programas0 si lo !acemos mal - no
nos damos centa estaremos n tiempo sando el ordenador con el relo, mal0 pro+ocando pro#lemas en
los directorios0 los anti+irs0 el planiFcador de tareas programadas0 etc.
EMA 2."
MJS SOBRE CAS (A1E'AS 1E (ARA(TERES
2.".1 - Acerca de las cadenas de caracteres
2.".2 - Ca ;nci)n e instrcci)n MI1U
2."." - Otras ;nciones de mane,o de cadenas
2.".1 - A(ER(A 1E CAS (A1E'AS 1E (ARA(TERES
En QBasic el mane,o de cadenas de caracteres es e8tremadamente sencillo. En otros lenga,es de
programaci)n como es el caso de ( las cadenas se tratan como n arra- de datos de tipo car$cter :n
tipo qe no tenemos en QBasic= de longitd apro8imadamente igal al n5mero de caracteres de la
cadena0 - por lo tanto s longitd m$8ima est$ siempre limitada. Tam#i9n esta ;orma de tra#a,ar implica
qe para !acer algo tan simple como na asignaci)n de cadenas en esos lenga,es !a-a qe recrrir a
;nciones especiales del lenga,e - no podamos sar directamente el operador de asignaci)n0 el signo
igal0 como si se tratara de n5meros.
En este tema +amos a +er con detalle algnas ;nciones de QBasic relacionadas con cadenas qe nos
+an a ser+ir para mane,ar los datos de este tipo qe nos !agan ;alta en nestro programa.
>amos a recordar n poco lo qe -a sa#emos de las cadenasH
Al igal qe ocrre con las otras +aria#les0 no es necesario declararlas. Basta con sar n nom#re de
+aria#le terminado por el car$cter d)lar :U=. En este caso tendremos na cadena de te8to de longitd
+aria#le.
En algnos casos nos pede interesar qe las cadenas sean de longitd F,a para a!orrar memoria :Gnos
1Q #-tes por cadena=. En este caso #astar2a con declararlas sandoH
1IM nom#re>aria#le AS STRI'& ` 2B
1)nde el n5mero qe +a a continaci)n del asterisco es la longitd m$8ima de la cadena. Es
especialmente recomenda#le declarar las cadenas como de longitd F,a en el caso de los arra-s. Por
e,emplo si !acemosH
1IM ta#la :1 TO %Q0 1 TO "= AS STRI'& ` B
'os estamos a!orrando nos 12Q #-tes en todo el arra-0 adem$s de qe el mane,o de cadenas de
tamaEo F,o por parte del ordenador es algo m$s r$pido por tratarse de estrctras est$ticas.
En el caso de las estrctras de datos deFnidas por el sario :tipos registro= qe incl-an cadenas0
estas siempre tendr$n qe declararse con na longitd determinada.
2.".2 - CA AG'(IT' E I'STRG((IT' MI1U
Gna de las ;nciones m$s 5tiles qe incl-e QBasic para el mane,o de cadenas de caracteres es MI1U. ?a
la !emos +isto anteriormente en +arios e,emplos0 pero +amos a !acerlo a!ora con m$s detalle. Esta es
s sinta8is.
MI1U:.cadena.0 inicio0 longitd=
Esta ;nci)n lo qe !ace es e8traer na porci)n de na cadena. Ce de#emos pasar tres argmentosH
.cadena. es na cadena de caracteres entre comillas o #ien el nom#re de na +aria#le de cadena c-o
+alor +a a ser tili*ado por la ;nci)n0 o na e8presi)n qe de+el+a como resltado na cadena.
inicio es la posici)n del primer car$cter qe qeremos sacar de la cadena0 el car$cter de m$s a la
i*qierda es el 1. Si este +alor es sperior al tamaEo de la cadena0 la ;nci)n MI1U de+ol+er$ como
resltado na cadena +ac2a.
longitd es el tamaEo del tro*o de cadena qe qeremos e8traer. Si se so#repasa el Fnal de la cadena no
ocrre nada0 s)lo se de+ol+er$ lo qe se peda de antes del Fnal.
>amos con nos e,emplosH
(CS
mi(adena ^ ./ec!o en Ronda0 (idad SoEada.
PRI'T MI1U:mi(adena0 10 B=
PRI'T MI1U:mi(adena0 B0 "=
PRI'T MI1U:mi(adena0 1B0 1=
PRI'T MI1U:mi(adena0 2Z0 2=
PRI'T MI1U:mi(adena0 "QQ0 1=
PRI'T MI1U:mi(adena0 1Q0 "QQQ=
El resltado ser2aH
/ec!o
o e
0
Ea
Ronda0 (idad SoEada
Esta ;nci)n nos pede ser+ir para e8traer n determinado car$cter de na cadena. Algo qe pede
parecer tri+ial0 pero qe nos +a a simpliFcar mc!o determinados pro#lemas.
>amos con n e,emplo tontoH
(CS
mi(adena ^ .CMXV>S1.
I'PGT .Escri#e n n5mero del 1 al YH .0 nm
PRI'T .El.L nmL .j car$cter de .L mi(adenaL . es .L MI1U:mi(adena0 nm0 1=
Gn resltado posi#le ser2aH
Escri#e n n5mero del 1 al YH %
El % j car$cter de CMXV>S1 es V
M- sencillo. S)lo decir qe no !emos deprado el dato de entrada - qe si escri#imos n cero o
negati+o !a#r$ n error.
>amos con otro e,emplo m$s 5til qe tili*a esta misma t9cnica para determinar la letra del 1'I. Para
!acer esto lo qe !a- qe !acer es comparar el resto del n5mero di+idido entre 2" con na serie de
letras ordenadas de na ;orma caracter2stica - dar la qe corresponda.
(CS
I'PGT .Escri#e el n5mero del 1'IH .0 dni\
PRI'T .Ca letra esH .H MI1U:.TR6A&M?AP1XB'VfSQ>/C(gE.0 :dni\ MO1 2"= d 10 1=
El resltado podr2a serH
Escri#e el n5mero del 1'IH Y%]2Z2QD
Ca letra esH M
Podemos +er qe el c$lclo se !ace en na sola linea de c)digo sando la instrcci)n MI1U.
El primer argmento qe le pasamos a MI1U0 la cadena de caracteres0 es la tira de letras ordenadas de
;orma caracter2stica.
Ca posici)n de inicio es el c$lclo propiamente dic!o. Ce smamos no porqe la primera letra es la 1 -
no la Q.
El tamaEo es 1 porqe siempre qeremos na - s)lo na letra.
Es importante +er qe la +aria#le d)nde gardaremos el n5mero de#e ser de tipo entero largo. Si la
samos como de tipo real :sin poner el \= se redondear$ - no saldr$ #ien el c$lclo.
(on esta t9cnica el algoritmo !a resltado smamente corto. A lo me,or ser2a m$s sencillo o intiti+o
!a#erlo reselto sando n +ector de caracteres para poder acceder a ss posiciones indi+idales0 o #ien
n SECE(T (ASE. (on calqiera de estas solciones el listado del programa !#iera sido mc!o m$s
largo. Tendr2amos 2" posi#ilidades en el SECE(T (ASE o #ien 2" asignaciones al +ector.
Este pro#lema del 1'I es m- ;recente. Ce ;alta deprar los datos de entrada - con+ertirlo en ;orma de
;nci)n0 para qe sea mc!o m$s porta#le.
Para terminar con MI1U !a- qe decir qe adem$s de ser na ;nci)n0 se pede sar tam#i9n como
instrcci)n para modiFcar la propia cadena.
Ca sinta8is ser2a
MI1U: >aria#le(adenaU0 inicio0 longitd= ^ (adenaU
El ;ncionamiento es parecido0 sal+o nas cantas di;erenciasH
El primer argmento tiene qe ser na +aria#le de cadena - no n literal entre comillas ni na e8presi)n.
El +alor de inicio no pede ser ma-or qe la longitd de la cadena0 en este caso se prodcir2a n error de
tiempo de e,ecci)n.
>amos con n e,emploH
mi(adenaU ^ ./ec!o en Ronda.
PRI'T mi(adenaU
MI1U:mi(adenaU0 1Q0 B= ^ .Soria.
PRI'T mi(adenaU
MI1U:mi(adenaU0 1Q0 B= ^ .Se+illa.
PRI'T mi(adenaU
MI1U:mi(adenaU0 Y0 D= ^ .aq2.
PRI'T mi(adenaU
El resltado ser2a...
/ec!o en Ronda
/ec!o en Soria
/ec!o en Se+il
/ec!o aq2e+il
/a- qe tener en centa qe la longitd del tramo de cadena a reempla*ar qeda deFnido por el +alor
del tercer par$metro0 - no por el tamaEo de la e8presi)n de cadena qe asignamos. Si este es ma-or se
cortar$0 - si no llega s)lo se sar$ lo qe !a-a0 qedando lo dem$s como esta#a. 1e esta misma ;orma
la cadena nnca amentar$ o disminir$ s longitd total sando esta ;nci)n. (omo mc!o podremos
disminir s longitd aparente sando espacios en #lanco0 pero realmente segir$n estando a!2
;ormando parte de la cadena.
MI1U se sa mc!o m$s como ;nci)n qe como instrcci)n. /a- qe tener claro para qe sir+e cada
cosa - cando se est$ sando na otra. (omo ;nci)n +a siempre a la derec!a del operador de
asignaci)n o dentro de na e8presi)n0 - como instrcci)n +a siempre al principio de la l2nea de c)digo.
2."." - OTRAS AG'(IO'ES
1E MA'EVO 1E (A1E'AS
QBasic nos o;rece +arias ;nciones 5tiles para !acer operaciones con cadenas de caracteres. Gna de las
m$s 5tiles es MI1U a la qe !emos dedicado el apartado anterior completo. Aq2 +an otrasH
Empecemos con dos ;nciones algo parecidas a MI1U0 pero menos a+an*adas.
CEATU:.cadena.0 nm(aracteres=
RI&T/U:.cadena.0 nm(aracteres=
Ca primera de ellas de+el+e n determinado n5mero de caracteres del principio de la cadena0 de la
i*qierda0 - la otra los de+el+e del Fnal0 de la derec!a. Siempre en el mismo orden en qe est$n en la
cadena. Se pede !acer re;erencia tanto a na cadena literal entre comillas o a na +aria#le o e8presi)n
de tipo cadena. Si el n5mero de caracteres especiFcado es ma-or qe la longitd total de la cadena se
de+ol+er$ la cadena entera. Si es cero se de+ol+er$ na cadena +ac2a0 - si es negati+o !a#r$ n error.
cadenaU ^ ./ec!o en Ronda.
PRI'T CEATU:cadenaU0 B=
PRI'T RI&/TU:cadenaU0 B=
1ar2a como resltadoH
/ec!o
Ronda
A!ora +amos con otras qe con+ierten a ma-5sclas - min5sclas...
G(ASEU:.(adena.=
C(ASEU:.(adena.=
G(ASEU con+ierte todas las letras qe !a-a en la cadena0 +aria#le de cadena o e8presi)n0 a ma-5sclas
:Gpper (ase=0 - C(ASEU a min5sclas :Co7er (ase=. Es importante tener en centa qe no se reconocen
como letras ni los acentos ni la eEe ni la con di9resis :q= - por lo tanto no se con+ierten correctamente.
>amos con n e,emplo.
cadenaU ^ .Gna cigqeEa en n #alc)n de J;rica.
PRI'T G(ASEU:cadenaU=
PRI'T C(ASEU:cadenaU=
1ar2aH
G'A (I&qEEA E' G' BAC()' 1E JARI(A
na cigqeEa en n #alc)n de J;rica
A!ora +amos con otras dos ;nciones qe eliminar$n los espacios en #lanco qe peda !a#er en los
e8tremos de na cadena.
CTRIMU:.(adena.=
RTRIMU:.(adena.=
CTRIMU elimina los espacios qe pede !a#er delante :A la i*qierda0 le;t= - RTRIMU los qe peda !a#er
por el Fnal :A la derec!a0 rig!t=.
Esta 5ltima ;nci)n es m- 5til para tra#a,ar con datos almacenados en cadenas de longitd F,a :(omo
las qe se san en los tipos de datos deFnidos por el sario para los registros=. Estas cadenas siempre
+an rellenas con espacios !asta ocpar s longitd total0 - si las mane,amos con todos estos espacios
peden pasar cosas como qe ;allen las comparaciones o qe pasen cosas impre+istas en los diseEos de
pantallas.
Am#as ;nciones peden ser 5tiles para deprar datos introdcidos por teclado en los qe el sario
!a-a podido escri#ir espacios in5tiles antes o desp9s. >amos con n e,emploH
cadenaU ^ . /ola@ .
PRI'T .`.L CTRIMU:cadenaU=L .`.
PRI'T .`.L RTRIMU:cadenaU=L .`.
? el resltadoH
`/ola@ `
` /ola@`
En >isal Basic se dispone de na ;nci)n TRIMU qe elimina los espacios tanto delante como detr$s de
la cadena. Aq2 no la tenemos0 pero s programaci)n ser2a m- sencilla constr-endo na ne+a ;nci)n
a partir de estas dos.
A!ora +amos con na ;nci)n qe nos de+el+e na cadena llena con el n5mero de espacios qe le
digamos
SPA(EU:nm=
Pede parecer in5til0 pero nos a-dar$ #astante en el diseEo de pantallas. Por e,emploH
PRI'T ./ola.L SPA(EU:%Q=L .Qe !a-.
1ar2aH
/ola Qe !a-
O el sigiente e,emplo m$s ela#oradoH
(CS
AOR n ^ Q TO B
PRI'T SPA(EU:B - n=L .a.L SPA(EU:n d n=L ._.
'EXT
1i#,ar2a esta FgraH
a_
a _
a _
a _
a _
a _
>amos con otra ;nci)n parecida0 pero qe en +e* de de+ol+er na cadena de espacios la de+el+e del
car$cter qe nosotros le digamosH
STRI'&:Congitd0 .car$cter.=
o #ien
STRI'&:Congitd0 ()digo-AS(II=
(omo se pede +er podemos especiFcar el car$cter qe qeremos sando na cadena o #ien sando el
n5mero de s c)digo AS(II. Esto es especialmente 5til cando qeremos di#,ar n car$cter qe no
aparece en el teclado.
>amos con nos e,emplosH
(CS
PRI'T STRI'&U:1Q0 .`.=
PRI'T STRI'&U:B0 ZQ=
PRI'T STRI'&U:1B0 .RO'1A.=
PRI'T STRI'&U:D0 12Z=
Qe dar2a
``````````
NNNNN
RRRRRRRRRRRRRRR
nnnnnnnn
Al igal qe la anterior0 esta ;nci)n nos ser$ m- 5til para constrir diseEos de pantallas0 pero !a- qe
tener cidado de no con;ndir s nom#re STRI'&U con el de tipo de datos cadena qe es STRI'& sin el
d)lar detr$s.
>amos a!ora con otra ;nci)n qe en +e* de de+ol+ernos la cadena con cierta modiFcaci)n nos +a a
de+ol+er n n5mero qe corresponde a la longitd :'5mero de caracteres= de la cadena.
CE':.cadena.=
>amos con n e,emplo qe en com#inaci)n con la ;nci)n STRI'&U qe aca#amos de +er nos s#ra-e
na pala#ra sando giones.
(CS
I'PGT .Escri#e algoH .L cadU
PRI'T . .L STRI'&U:CE':cadU=0 .-.=
1ar2a algo comoH
Escri#e algoH ?A ES(RIBO AC&O
---------------
Esta ;nci)n CE' tam#i9n nos de+el+e el espacio en #-tes qe ocpa en memoria calqier +aria#le.
Basta con pasarle como par$metro el nom#re de na +aria#le qe no sea de cadenas.
A esta categor2a de ;nciones de mane,o de cadenas !a#r2a qe aEadir otras qe -a !emos +isto como
son 1ATEU - TIMEU0 as2 como algnas menos tili*adas como /EXU - O(TU qe con+ierten n n5mero a
sistemas de nmeraci)n en #ase 1Z - en #ase D respecti+amente0 pero -a qe el resltado es en ;orma
de cadena no nos ser+ir$ para !acer ning5n c$lclo.
(om#inando estas ;nciones podemos constrir otras m$s potentes qe nos !agan cosas como por
e,emplo di#,ar recadros o centrar te8tos. Esto es lo qe se +er$ en el tema sigiente de mane,o de
pantalla del te8to.
EMA 2.%
MA'EVO 1E CA PA'TACCA E' MO1O TEXTO
2.%.1 - Introdcci)n a los inter;aces de te8to
2.%.2 - Posicionar el crsor en la pantalla
2.%." - Te8to en colores
2.%.% - RedeFnir colores
2.%.B - (aracteres semigr$Fcos
2.%.Z - (aracteres especiales de relleno
2.%.Y - (aracteres no imprimi#les
2.%.D - Esm$ilis - AS(II-ART
2.%.1 - I'TRO1G((IT' A COS I'TERAA(ES 1E TEXTO
A estas altras del siglo XXI casi todos los ordenadores personales tili*an modernos entornos gr$Fcos
como son 6indo7s o los tam#i9n conocidos g1E - &'OME en Cin8. Estos sistemas peden representar
calqier imagen a partir de peqeEos pntos qe peden ser de no de los millones de colores
soportados. Para aplicaciones m$s sencillas0 como es el caso del entorno de QBasic0 se tili*a lo qe se
denomina Inter;a* de te8to0 qe es mc!o m$s ;$cil de controlar por el ordenador - m$s qe sFciente
para determinadas aplicaciones.
En todos los e,emplos qe !emos !ec!o !asta a!ora !emos podido compro#ar como los resltados se
i#an presentando en la pantalla de ;orma secencial0 es decir0 nos de#a,o de otro con;orme se i#an
generando. (ando se alcan*a#a la parte #a,a de la pantalla todo el contenido s#2a atom$ticamente
para de,ar na ne+a l2nea +ac2a a#a,o. Algnas operaciones m$s .soFsticadas. qe !emos llegado a
!acer !an sido #orrar todo sando la instrcci)n (CS o encolmnar la presentaci)n de algnos listados
a,stando los argmentos qe le pasamos a la instrcci)n PRI'T. 1e todas ;ormas los resltados siempre
se !an +isto de color gris so#re ;ondo negro. M- triste.
En este tema +amos a +er c)mo se pede consegir escri#ir e8actamente en la posici)n de la pantalla
qe qeramos0 as2 como en distintos colores de letra - de ;ondo. Tam#i9n saremos nos caracteres
especiales conocidos como .Semigr$Fcos. para di#,ar l2neas - recadros qe den m$s consistencia a
nestras presentaciones.
2.%.2 - POSI(IO'AR EC (GRSOR E' CA PA'TACCA
El crsor es n o#,eto qe se pede mo+er por la pantalla - s posici)n indica el sitio e8acto d)nde se
escri#ir$ lo sigiente. En los procesadores de te8tos o en el propio editor de QBasic0 es la .#arrita.
intermitente por donde +an apareciendo las letras qe +amos escri#iendo en el teclado. En calqier
programa en modo te8to el crsor siempre +a a e8istir - +a a indicar el lgar d)nde se +a a escri#ir lo
sigiente qe !a-a qe escri#ir0 -a sea porqe lo !aga el sario con el teclado o #ien el propio
programa atendiendo a ss instrcciones de salida.
En los programas de QBasic s)lo es +isi#le cando se pide al sario qe escri#a algo sando la
instrcci)n I'PGT. El resto del tiempo est$ a!2 en s sitio0 pero no lo +emos.
(ando samos calqier instrcci)n PRI'T sin pnto - coma al Fnal se escri#e lo qe sea - el crsor
in+isi#le pasa al principio de la sigiente l2nea a la espera de la sigiente instrcci)n de escritra. 1e
esta ;orma todos los resltados se +an mostrando no de#a,o de otro l2nea por l2nea.
Ca pantalla normal en modo te8to qe samos aq2 est$ compesta por 2B l2neas de DQ caracteres de
anc!o.
Ca primera l2nea0 la de m$s arri#a es la n5mero 1 - la de a#a,o es la 2B. Ca colmna de m$s a la
i*qierda es la 1 - la de m$s a la derec!a0 la 5ltima0 es la DQ. Para lle+ar el crsor a calqiera de estas
posiciones - escri#ir en la parte de la pantalla qe qeramos no !a- m$s qe sar la sigiente
instrcci)nH
CO(ATE linea0 colmna
1e esta ;orma tan sencilla0 sando na instrcci)n CO(ATE delante de cada PRI'T o I'PGT -a podemos
controlar e8actamente donde +a a salir cada cosa. >amos con n e,emploH
(CS
CO(ATE 220 "Q
PRI'T .Esto +a a salir a#a,o.
CO(ATE "0 "B
PRI'T .? esto arri#a.
CO(ATE 120 1
PRI'T .A la i*qierda.
CO(ATE 1%0 ZY
PRI'T .A la derec!a.
CO(ATE 1"0 "Y
PRI'T .(entro.
SCEEP
? este ser2a el resltado. El recadro representa al #orde de la pantalla.
()mo se pede +er0 las ;rases -a no aparecen escritas de arri#a a a#a,o en el mismo orden en qe est$n
escritas en el listado del programa. (ada na aparece en el sitio donde la anterior instrcci)n CO(ATE !a
lle+ado el crsor de te8to. Para a,star estas posiciones no !a- m$s qe +ariar los n5meros de Fla -
colmna de las instrcciones CO(ATE. Ca instrcci)n SCEEP qe aparece al Fnal es para qe el r)tlo
.Presione calqier tecla - contin5e.. no apare*ca !asta qe no plsemos na tecla. Esto ser$ m-
com5n para qe no se nos estropeen los diseEos de pantalla.
Otra cosa qe nos +a a estropear los diseEos de pantalla +a a ser el despla*amiento +ertical qe !ace
atom$ticamente el inter;a* en modo te8to para qe con;orme +amos escri#iendo lo anterior se despla*a
!acia arri#a0 como !a +enido pasando en los programas qe !emos !ec!o !asta a!ora.
Esto !ace qe si escri#imos algo en la l2nea 2%0 las l2neas 1 a 2% s#an na posici)n0 desapareciendo lo
qe !a-a en la primera l2nea. ? si escri#imos algo en la l2nea 2B0 las l2neas 1 a 2% s#ir$n 2 posiciones0
desapareciendo lo qe !#iera escrito en las dos primeras l2neas.
Ca solci)n m$s ctre para sal+ar este pro#lema ser2a no escri#ir nnca en las l2neas 2% - 2B0 pero !a-
otra me,or. Poner n pnto - coma al Fnal de todas las instrcciones PRI'T o a continaci)n de la
pala#ra I'PGT en las instrcciones de entrada0 siempre qe est9n sitadas en na de estas dos 5ltimas
l2neas. 1e esta ;orma e+itaremos qe al terminar la instrcci)n el crsor #a,e - se prod*ca el
despla*amiento +ertical atom$tico.
A!ora -a podemos realmente escri#ir en calqier parte de la pantalla sando la instrcci)n CO(ATE.
>amos con n e,emplo qe aclare esto del despla*amiento atom$tico.
(CS
CO(ATE 10 2QH PRI'T .Principio.
CO(ATE 2B0 2QH PRI'T .Ainal.
SCEEP
Si e,ectas este ;ragmento de c)digo o#ser+ar$s qe la pala#ra PRI'(IPIO no aparece en la pantalla0 -a
qe tras escri#ir en la l2nea 2B se prodce este despla*amiento atom$tico. Para solcionar el pro#lema
aEadimos n pnto - coma al Fnal de la instrcci)n PRI'T conbicti+aH
(CS
CO(ATE 10 2QH PRI'T .Principio.
CO(ATE 2B0 2QH PRI'T .Ainal.L
SCEEP
? podr$s o#ser+ar como aparecen am#as pala#ras escritas en la pantalla0 na arri#a - otra a#a,o0
,stamente en las posiciones qe !emos especiFcado. Pro#lema solcionado.
Gn 5ltimo comentario. En los dos ;ragmentos anteriores !as podido o#ser+ar qe las instrcciones
CO(ATE - PRI'T +an en la misma l2nea separadas por el car$cter .1os pntos. :H=. Esto es com5n !acerlo
para acortar el listado0 -a qe estas dos instrcciones casi siempre +an a ir por pare,as.
2.%." - TEXTO E' (OCORES
/asta a!ora todos nestros programas !an dado los resltados en la pantalla sando letras de color gris
claro so#re ;ondo negro. Para llorar0 pero esto +a a cam#iar a!ora mismo. El inter;a* en modo te8to nos
o;rece la posi#ilidad de sar diecis9is colores de letra - oc!o de ;ondo. 'o es qe sea na mara+illa
tecnol)gica comparada con los millones de colores qe san los entornos gr$Fcos actales0 pero para
cmplir nestros o#,eti+os son m$s qe sFcientes.
>amos a +er la paleta de colores predeterminada del modo de pantalla >&AH
(omo se pede +er0 cada color lle+a n asociado n n5merito. Este n5mero se conoce como .Atri#to de
color. - nos +a a ser+ir para especiFcar los colores mediante la sigiente instrcci)nH
(OCOR primerPlano0 ;ondo
Por e,emplo0 si qeremos escri#ir con letras amarillas so#re ;ondo a*l :m- t2pico=0 no tenemos m$s qe
sar na instrcci)n
(OCOR 1%0 1
antes de las correspondientes instrcciones PRI'T o I'PGT.
Al sar na instrcci)n (OCOR0 se cam#ian los colores de la pantalla para scesi+as instrcciones de
escritra en pantalla !asta qe se +el+a a cam#iar sando otra instrcci)n (OCOR. 'o !ace ;alta poner
na instrcci)n (OCOR delante de cada PRI'T o I'PGT si no +amos a cam#iar el color.
(omo color de primer plano podemos sar calqiera de los 1Z atri#tos de color disponi#les. (omo
color de ;ondo solo los D primeros. Si no especiFcamos color de ;ondo0 se conser+ar$ el qe !#iera.
El color de ;ondo en principio s)lo a;ecta al tro*o de pantalla qe !a- por detr$s de los caracteres qe
escri#imos. Si qeremos colorear toda la pantalla de n determinado color0 na ;orma m- r$pida de
!acerlo es especiFcar na instrcci)n (OCOR ,sto antes de na (CS0 por e,emploH
(OCOR 1B0 %
(CS
/ar$ qe toda la pantalla se coloree de ro,o oscro. En scesi+as instrcciones PRI'T se escri#ir$ lo qe
sea en color #lanco ;erte so#re este ro,o mientras no semos otra instrcci)n (OCOR. /a- qe tener
cidado de no sar el mismo color para primer plano - para ;ondo. Si lo !acemos no pasa nada0 nestro
programa +a a segir ;ncionando per;ectamente0 pero ser2a como escri#ir con l$pi* #lanco en n papel0
no se +er2a nada de nada.
Tam#i9n podemos consegir qe los caracteres apare*can en la pantalla parpadeando. Para !acerlo no
!a- m$s qe smar 1Z al color de primer plano qe qeramos0 por e,emploH
(OCOR "Q0 2
/ar$ qe el te8to escrito posteriormente apare*ca de amarillo parpadeando so#re ;ondo +erde. :1% del
amarillo m$s 1Z son "Q=. 'o se pede !acer qe el ;ondo parpadee.
Gna cosa importante a tener en centa con el parpadeo es qe 'O >A A AG'(IO'AR si estamos
e,ectando QBasic desde 6indo7s en na +entana. Para qe ;ncione !a#r$ qe pasar a pantalla
completa plsando ACTdE'TER o el #ot)n correspondiente de la #arra de #otones de la +entana0 - a5n
as2 a la primera tampoco ;nciona algnas +eces0 lo qe se !ace es a;ectar al color de ;ondo.
'o es con+eniente a#sar del parpadeo0 pede resltar molesto para la +ista. Se de#e de tili*ar s)lo
para resaltar peqeEos mensa,es o s2m#olitos en la pantalla.
(omo e,emplo +eamos como podr2a qedar na portada sencilla en colores para n programa de agenda
qe integre todo lo qe +imos en el tema de Fc!eros.
Para consegir esto no !a#r2a mas qe insertar las instrcciones (OCOR correspondientes en los lgares
adecados0 como se +e aq2H
(CS
PRI'T
(OCOR %
PRI'T 0 0 .` ` ` ` ` ` ` ` ` ` ` `.
PRI'T 0 0 .` .L
(OCOR 1QH PRI'T .A&E'1A SGPER BARATA .L
(OCOR %H PRI'T .`.
PRI'T 0 0 .` `.
PRI'T 0 0 .`.L
(OCOR 2H PRI'T . V.M.&.B. Ronda 2QQ" .L
(OCOR %H PRI'T .`.
PRI'T 0 0 .` ` ` ` ` ` ` ` ` ` ` `.
PRI'T
PRI'T
(OCOR 1"
PRI'T 0 .A ... AEadir ne+a persona.
PRI'T 0 .B ... Borrar persona.
PRI'T 0 .M ... ModiFcar persona.
PRI'T
(OCOR B
PRI'T 0 .' ... Bscar persona por nom#re.
PRI'T 0 .1 ... Bscar persona por direcci)n.
PRI'T 0 .T ... Bscar persona por tel9;ono.
PRI'T 0 .E ... Bscar persona por edad.
PRI'T
(OCOR 1
PRI'T 0 .C ... >er listado de personas.
PRI'T
(OCOR ]
PRI'T 0 .( ... (ompactar #ase de datos.
PRI'T
(OCOR 11
PRI'T 0 .S ... Salir.
Estas son las instrcciones s)lo para di#,ar la pantalla. El resto para qe ;ncione el men5 !a#r2a qe
progrmarlo por e,emplo con la ;nci)n I'gE?U - n SECE(T (ASE qe seg5n la tecla plsada llame a cada
no de los m)dlos del programa.
2.%.% - RE1EAI'IR (OCORES
En el apartado anterior !emos +isto c)mo consegir qe nestros programas escri#an en la pantalla
sando distintos colores. Esto0 ,nto con los semigr$Fcos qe +eremos en el apartado sigiente0 es m$s
qe sFciente para !acer qe nestros programas tengan na inter;a* en modo te8to #astante
consegida.
O#ser+ando la paleta >&A de 1Z colores se pede compro#ar qe los colores est$n n poco
.descoloridos.. 'o es qe al monitor le pase nada cando entramos a MS-1OS0 es qe son los qe !a- -
est$n deFnidos as2. Tam#i9n nos pede pasar qe qeramos sar determinados colores0 por e,emplo
para constrir n logotipo0 - no nos +enga #ien ningno de los qe tenemos.
Esto se pede arreglar n poco. El modo de pantalla de te8to nos permite sar 1Z colores
SIMGCTJ'EAME'TE0 pero estos no tienen porq9 ser siempre los mismos. Cos podemos cam#iar
;$cilmente por calqier otro de esta paleta m$s amplia de Z% colores.
Podemos intercam#iar calqiera de los 1Z atri#tos de color qe tenemos disponi#les por no de estos
Z% colores sando la sigiente instrcci)nH
PACETTE original0 ne+o
>amos a +er lo qe signiFca esto. Pede dar lgar a con;sionesH
Original es el ATRIBGTO de color qe qeremos cam#iar :Gn n5mero entre Q - 1B=
'e+o es el color de esta paleta qe qeremos sar :Gn n5mero entre Q - Z"=
Spongamos qe qeremos cam#iar el atri#to " :Qe originalmente es n a*l grisaceo m- ;eo= por
n celeste m$s #onito qe aparece en nestra paleta con el 2ndice %". 'o !a#r2a m$s qe !acerH
PACETTE "0 %"
? a partir de a!ora cada +e* qe semos la instrcci)n
(OCOR "
se escri#ir$ con nestro celeste. El " -a no es el a*l grisaceo ;eo.
Podemos intercam#iar los colores todas las +eces qe qeramos e inclso asignar +alores repetidos a
distintos atri#tos. Co qe !a- qe tener en centa es qe s)lo +amos a +er en la pantalla 1Z colores a la
+e*0 pero estos podr$n ser calqiera de los Z%.
Otra cosa qe !a- qe tener en centa es qe los cam#ios !ec!os con la instrcci)n PACETTE tam#i9n
a;ectan a todo lo qe -a !a-a escrito en la pantalla del color qe !emos cam#iado. Imagina qe !a-
escrito algo en color 1Q original :>erde ;erte=0 - a!ora asignamos al atri#to 1Q el color de paleta B1
para segir escri#iendo en +erde m$s sa+e. Atom$ticamente todo lo escrito en +erde ;erte pasa a ser
+erde sa+e. Para poder +er los dos +erdes a la +e* !a#r2a qe sar otro atri#to - de,ar el 1Q como
esta#a. (on n poco de pr$ctica !aciendo esto se pede consegir qe determinados te8tos se
enciendan o se apagen poco a poco :(am#iando los colores por otros cada +e* m$s oscros o m$s
claros dentro de n #cle=0 algnos e;ectos interesantes como ocltar el r)tlo .Presione calqier tecla
- contin5e..
Ca instrcci)n PACETTE no tiene ning5n inter9s para aprender a programar0 pero nos pede ser+ir para
dar a nestros programas n toqe personal o e8traEo al tili*ar com#inaciones de colores qe se salen
de los 1Z tan t2picos de la amplia ma-or2a de programas de MS-1OS. /a- qe recordar qe como ;ondo
s)lo podemos sar los oc!o atri#tos primeros :Q a Y=0 pero -a podemos consegir cosas como escri#ir
so#re ;ondo amarillo o #lanco. Pero con cidado@0 qe no !a-a qe sar ga;as de sol delante del
ordenador.
2.%.B - (ARA(TERES SEMI&RJAI(OS
?a sa#emos escri#ir en colores. (on n poco de idea -a podemos di#,ar recadros aplicando distintos
colores de ;ondo a distintas *onas de la pantalla0 pero toda+2a podemos llegar n poco m$s all$.
Podemos di#,ar recadros con #ordes - l2neas !ori*ontales0 +erticales - esqinas sando nos
caracteres especiales qe nos permiten .ensam#lar. las l2neas en la pantalla como si se tratara de n
p**leH Cos caracteres SEMI&RJAI(OS0 casi gr$Fcos.
Estos caracteres no los tenemos en el teclado0 - por lo tanto para consegirlos !a#r$ qe recrrir a ss
c)digos AS(II0 qe son los sigientesH
Recordemos qe para introdcir n c)digo AS(II !a- qe plsar simlt$neamente la tecla alternati+a
:ACT= - el c)digo correspondiente en el #loqe nm9rico sitado a la derec!a del teclado.
Para demostrar la tilidad de los caracteres semigr$Fcos +amos a crear na ne+a portada para nestro
programa de agenda. >a a ser esta0 qe sa tam#i9n colores personali*ados.
(omo se pede +er0 #astante consegida. ?a no tiene casi nada qe en+idiarle a la inter;a* de n
programa comercial de MS-1OS. Co qe !ace ;alta es qe todo lo dem$s tam#i9n ;ncione
per;ectamente - sea 5til.
A!ora +amos con el listado del programa necesario para di#,ar estoH
PACETTE Q0 "2
PACETTE "0 11
PACETTE %0 D
PACETTE B0 1Y
PACETTE Y0 Z"
PACETTE 1Q0 %
PACETTE 110 B2
PACETTE 120 "Z
PACETTE 1"0 "D
PACETTE 1%0 B%
(OCOR 1B0 "
(CS
(OCOR 1B0 %
CO(ATE 20 11H PRI'T ..L STRI'&U:BY0 2QB=L ..
CO(ATE "0 11H PRI'T .r.L SPA(EU:BY=L .r.
CO(ATE %0 11H PRI'T ..L STRI'&U:BY0 2QB=L ..
(OCOR 1%0 %H CO(ATE "0 1%
PRI'T .A & E ' 1 A S G P E R B A R A T A.
(OCOR 10 Y
CO(ATE Y0 2QH PRI'T .---------------------------------------.
CO(ATE D0 2QH PRI'T .r A ... r.
CO(ATE ]0 2QH PRI'T .r B ... r.
CO(ATE 1Q0 2QH PRI'T .r M ... r.
CO(ATE 110 2QH PRI'T .---------------------------------------.
CO(ATE 120 2QH PRI'T .r ' ... r.
CO(ATE 1"0 2QH PRI'T .r 1 ... r.
CO(ATE 1%0 2QH PRI'T .r T ... r.
CO(ATE 1B0 2QH PRI'T .r E ... r.
CO(ATE 1Z0 2QH PRI'T .---------------------------------------.
CO(ATE 1Y0 2QH PRI'T .r C ... r.
CO(ATE 1D0 2QH PRI'T .---------------------------------------.
CO(ATE 1]0 2QH PRI'T .r ( ... r.
CO(ATE 2Q0 2QH PRI'T .---------------------------------------.
CO(ATE 210 2QH PRI'T .r S ... r.
CO(ATE 220 2QH PRI'T .---------------------------------------.
(OCOR Q0 Y
CO(ATE D0 2]H PRI'T .AEadir ne+a persona.
CO(ATE ]0 2]H PRI'T .Borrar persona.
CO(ATE 1Q0 2]H PRI'T .ModiFcar persona.
(OCOR 1Q
CO(ATE 120 2]H PRI'T .Bscar persona por nom#re.
CO(ATE 1"0 2]H PRI'T .Bscar persona por direcci)n.
CO(ATE 1%0 2]H PRI'T .Bscar persona por tel9;ono.
CO(ATE 1B0 2]H PRI'T .Bscar persona por edad.
(OCOR 12H CO(ATE 1Y0 2]H PRI'T .>er listado de personas.
(OCOR 11H CO(ATE 1]0 2]H PRI'T .(ompactar #ase de datos.
(OCOR 1"H CO(ATE 210 2]H PRI'T .Salir.
(OCOR 1%0 BH CO(ATE 2B0 1H PRI'T SPA(EU:DQ=L
CO(ATE 2B0 1QH PRI'T .(rso de Programacisn.L
(OCOR 1"H CO(ATE 2B0 %ZH PRI'T .V.M.&.B. /E(/O E' RO'1A.L
SCEEP
IA qe asstaK (omo se pede +er0 -a es n listado #astante largo.
Antes de segir !a- qe aclarar n peqeEo pro#lema qe tieneH En 6indo7s no podemos representar
los caracteres semigr$Fcos - los !e sstitido por giones0 t#er2as - escadras para tener na idea de
d)nde +a cada cosa. Al copiar este listado a QBasic tendr$s qe sstitirlos por los correspondientes
semigr$Fcos sando la ta#la de c)digos AS(II. Cos del recadro sperior son de l2nea do#le - los de a#a,o
sencillos.
Para empe*ar a desliar este listado de c)digo tan largo !a- qe tener en centa qe es n esqema
secencial. 'o !a- #cles ni operaciones comple,as. As2 -a se +e #astante m$s sencillo. Si te l2as con los
colores redeFnidos qita las instrcciones PACETTE - sa solo los colores normales. As2 de paso te +as
aprendiendo ss 1Z c)digos0 tam#i9n te ser+ir$n para algnos otros lenga,es de programaci)n. (ando
est9 terminado redeFne los colores qe qieras.
Adem$s de los caracteres semigr$Fcos sencillos - do#les qe !emos +isto aq20 e8isten otros conocidos
como .mi8tos. qe se peden sar en las esqinas - en las niones de l2neas !ori*ontales - +erticales
para ensam#lar l2neas sencillas - do#les0 es lo qe se +e en las esqinas - niones de las l2neas qe
;orman este di#,o.
Esto podr2a resltar interesante0 lo qe ocrre es qe estos caracteres semigr$Fcos mi8tos no son m-
comnes - no aparecen en todas las ta#las de caracteres AS(II. En el caso de qe el sario de nestro
programa est9 tili*ando na de estas ta#las de caracteres e8traEa0 no podr$ +er los caracteres estos -
nestro diseEo de pantalla qedar$ roto. 'ormalmente las esqinas de los recadros se cam#iar$n por
+ocales acentadas - otros s2m#olos e8traEos0 algo as2 como estoH
(omo no nos merece la pena correr el riesgo de qe nestros diseEos de pantalla qeden as2 de
estropeados0 lo me,or es e+itar el so de los semigr$Fcos mi8tos. Anqe los +eamos en nestra ta#la de
caracteres AS(II0 pede qe el sario del programa no los tenga - no peda +erlo correctamente. Co
mismo ocrre al imprimir si la impresora tili*a na ta#la de caracteres AS(II distinta. Recordar qe
estamos en MS-1OS - no !a- ;entes Tre T-pe ni nada parecido. (on n poco de imaginaci)n se peden
constrir diseEos de pantallas m$s qe acepta#les sando s)lo los semigr$Fcos simples - do#les qe -a
!emos +isto ,nto con los caracteres de relleno qe +eremos en el apartado sigiente.
Para terminar con los semigr$Fcos +amos a +er n peqeEo algoritmo qe sado como n procedimiento
nos sir+a para di#,ar n recadro en las posiciones de pantalla qe nos interesen0 algo m- 5til.
Co qe !ace es sencillo. 1i#,a n cadro con el #orde de l2nea do#le con la esqina sperior derec!a en
la posici)n +0! - la anc!ra - la altra la o#tiene de las +aria#les largo - alto. Ca primera l2nea di#,a la
parte sperior0 el #cle AOR di#,a la *ona intermedia rellenando lo de dentro con espacios0 - la 5ltima
l2nea di#,a el #orde in;erior. Ponemos n pnto - coma al Fnal de cada l2nea para qe si di#,amos el
recadro en la parte #a,a de la pantalla no se prod*ca el despla*amiento atom$tico - se nos estropee
todo el diseEo de pantalla.
Este e,emplo se podr2a ampliar especiFcando los colores en la llamada a la ;nci)n o escri#iendo alg5n
tipo de #arra de t2tlo como si ;era na +entana de las del editor de QBasic.
2.%.Z - (ARA(TERES ESPE(IACES 1E RECCE'O
Adem$s de los semigr$Fcos tam#i9n e8isten otros caracteres qe nos +an a ser m- 5tiles para de
diseEar las pantallas de nestros programas en modo te8to. Son los caracteres de relleno0 aq2 est$n ss
c)digos AS(II0 porqe tampoco los tenemos en el tecladoH
Estos caracteres nos +an a permitir rellenar *onas enteras de la pantalla para e+itar qe se +ean todo del
mismo color. Cos m$s tili*ados son los tres primeros qe nos o;recen distinta densidad de pntos. El
carto rellena todo con el color de primer plano0 - los dos 5ltimos se san s)lo para cosas como dar
e;ectos de som#ras a recadros - poco m$s.
Para sar estos caracteres se sele recrrir a n #cle AOR qe recorre la pantalla por Flas - dentro
di#,a series del car$cter correspondiente sando la ;nci)n STRI'&U.
>amos con n e,emplo qe +a a rellenar con el car$cter 1YY la mitad i*qierda de la pantalla.
AOR + ^ 1 TO 2B
CO(ATE +01H PRI'T STRI'&:%Q01YY=L
'EXT
Gna cosa qe aparece al sar grandes cantidades de estos caracteres es el llamado .e;ecto Moir9.
:Mar9=0 consistente en na serie de lineas cr+as qe aparecen di#,adas en la pantalla. Se prodce por
na inter;erencia entre los pntos qe ;orman estos caracteres de relleno - los p28eles ;2sicos del
monitor. Si nestro monitor nos da ese pro#lema0 no se pede e+itar0 pero s2 atenar sando colores de
primer plano - de ;ondo qe no sean demasiado distintos.
A!ora +amos con otro diseEo m$s ela#orado qe nos o;rece n diseEo de ;ondo de este tipoH
AOR + ^ 1 TO 2B
AOR ! ^ 1 TO Y] STEP 2
CO(ATE +0 !H PRI'T STRI'&U:20 I'T:R'1 ` "= d 1YZ=L
'EXT
'EXT
Aq2 se elige aleatoriamente no de los tres caracteres disponi#les en el momento de di#,arlo. Se !an
agrpado los caracteres de dos en dos para qe salgan cadros m$s o menos cadrados. El sigiente
e,emplo es parecido0 pero esta +e* los cadros aparecer$n ordenados -a qe se sa n contador en +e*
de los n5meros aleatorios.
c ^ Q
AOR + ^ 1 TO 2B
AOR ! ^ 1 TO Y] STEP 2
c ^ c d 1
IA c ^ " T/E' c ^ Q
CO(ATE +0 !H PRI'T STRI'&U:20 1YZ d c=L
'EXT
'EXT
El so de estos caracteres de relleno ,nto con los recadros de colores !ec!os a #ase de semigr$Fcos es
na #ena ;orma de dar a nestros programas en modo te8to na apariencia #astante acepta#le.
2.%.Y - (ARA(TERES 'O IMPRIMIBCES
Si se o#ser+a la ta#la de c)digos AS(II se pede +er qe los caracteres qe +an desde el Q !asta el "1:El
"2 es el espacio en #lanco= son s2m#olos e8traEos - adem$s no se peden escri#ir sando la tecla ACT.
Estos caracteres est$n asociados a teclas del teclado como Enter0 escape0 ta#lador o retroceso entre
otras - a ordenes especiales para el ordenador - la impresora como son saltos de p$gina - de l2nea0 Fn
de Fc!ero0 toqe de tim#re0 etc.
Estos caracteres no est$n pensados para ser di#,ados en la pantalla ni para ser impresos. Tienen
asociados esos s2m#olos porqe algno ten2an qe tener0 pero -a qe los tenemos a!2 pede ser qe en
algnos casos qeramos escri#irlos en la pantalla. >amos con ss c)digos AS(II...
? a!ora +amos a +er como escri#irlos. :Solo en QBasic - en los programas de MS-1OS. En 6indo7s no se
pede=
/a- dos ;ormas. Ca primera ser2a sar la ;nci)n (/RU0 por e,emplo para di#,ar n cora*)n #astar2a con
poner PRI'T (/RU:%=. Ca segnda0 m$s c)moda es plsar la com#inaci)n de teclas (O'TROC d P -
desp9s0 a continaci)n ACTER'ATI>A d el c)digo en el teclado nm9rico0 por e,emplo para di#,ar el
cora*)n !a#r2a qe plsar (TRCdP - ACTd% con lo qe este s2m#olo qedar2a directamente di#,ado en
la pantalla.
Esto de (TRCdP nos +ale para di#,ar estos caracteres especiales en la ma-or2a de programas de MS-
1OS as2 como en el propio int9rprete de comandos :S2m#olo (H_O=.
/asta aq2 m- #ien. ?a podemos di#,ar caras0 bec!as - otros s2m#olos en nestras pantallas0 pero no
podemos ol+idar qe estos caracteres son especiales - !a- qe tener nas ciertas precaciones. Ca
primera es qe si n s2m#olo nos da algn pro#lema como qe se nos descoloqen los dem$s0 pes
directamente e+itar sarlo - nada m$s. Otras precacione son no sar los s2m#olos qe no lle+an
asociado ning5n car$cter como son el de c)digo AS(II Q - tener en centa qe cada +e* qe nestro
programa di#,e n AS(II Y se oir$ n pitido en el alta+o* interno o #ien sonar$ el sonido predeterminado
de 6indo7s.
Estos caracteres los saremos e8clsi+amente en instrcciones PRI'T - no de#eremos almacenarlos en
Fc!eros0 especialmente en Fc!eros secenciales . Si los intentaremos imprimir +an a pro+ocar ;allos en
la impresora. 1e !ec!o si intentas imprimir tal cal est$ la ta#la de caracteres AS(II qe +iene en la
a-da de QBasic - qe incl-es estos s2m#olos o#ser+ar$s cosas como algna l2nea se rompe o inclso
qe se !ace n salto de p$gina - n tro*o de la ta#la se imprime en la sigiente !o,a. Esto se de#e a qe
se !an encontrado caracteres de saltos de l2nea - de p$gina qe la impresora !a interpretado como lo
qe son.
Tam#i9n !a- qe tener precaci)n si estos caracteres aparecen de ;orma literal en las instrcciones del
c)digo ;ente del programa. Si imprimes dic!o c)digo pedes encontrarte con pro#lemas similares cada
+e* qe salga no de estos caracteres. Por lo tanto si piensas imprimir el c)digo ;ente del programa
tili*a ;nciones (/RU en lgar de los caracteres literales. Tam#i9n !a- qe sa#er qe estos caracteres
no se peden +er en 6indo7s0 por lo qe si a#res el Fc!ero BAS del c)digo de t programa en n editor
de 6indo7s como por e,emplo el #loc de notas0 directamente no los +er$s o los +er$s marcados como n
cadro negro.
2.%.D - ESMJICIS - AS(II-ART
Para enriqecer n poco m$s las pantallas de nestros programas en modo te8to podemos sar la ;orma
qe tienen los propios caracteres para !acer peqeEos di#,os.
Co m$s sencillo de esto es lo qe se conoce como esm$ilis :(orrectamente se escri#e smile-= - qe
estamos acostm#rados a tili*ar en los ;oros - c!ats de Internet. Algnos de los m$s comnes - de
signiFcado conocido son los sigientesH
H-= H-: H-1 H-o X-1
Se peden encontrar listados m- e8tensos llenos de estos s2m#olitos ,nto con s signiFcado0 pero de
todas ;ormas pede qe estos esm$ilis sean m- poca cosa para decorar nestros programas. Por eso
podemos recrrir a diseEos m$s complicados conocidos como AS(II-ART. >amos con nos e,emplos...
cc
a a_
a a _
a a a_ _
a a a_ _ _
a acacc_ _ _
acccccccc_ _ _
_ccccccccccc_a
1111111111111111111111111111
111QQQQQQ1111111111QQQQQQ111
11QQQQQQQQQ111111QQQQQQQQQ11
11QQQQQQQQQQ1111QQQQQQQQQQ11
11QQQQQQQQQQQ11QQQQQQQQQQQ11
11QQQQQQQQQQQQQQQQQQQQQQQQ11
111QQQQQQQQQQQQQQQQQQQQQQ111
1111QQQQQQQQQQQQQQQQQQQQ1111
11111QQQQQQQQQQQQQQQQQQ11111
1111111QQQQQQQQQQQQQQ1111111
111111111QQQQQQQQQQ111111111
1111111111QQQQQQQQ1111111111
11111111111QQQQQQ11111111111
111111111111QQQQ111111111111
1111111111111QQ1111111111111
1111111111111111111111111111
.a r ccccccccccccccccc
a a a cccccccccc aa_c
aS a r :cccccccccc= rr.S t-.cccccccccccccccccccccccc
a a r cccccccccc rrt.c.-Snnnnnnnnnnnnnnnnnnnnnnnnt
a _ _cc:cccccccccc=cc__a
r t_
r r ccccccccccccccccccc
r rccccccccccccccccccc...-------SSS- - - ^- - ^ - ^ t.
ar r _- ^ ^ - -^ - ^ - ^- ^ - ^r
: r r r^ -^ - ^ - ^ - ^ - ^--^ ^ - ^ ^r
_r rccccccccccccccccccca- ^ - -^ ^c- ^c-^c- -^c^-^c^c^ -r
r r ttt-------...ccccccccccccccccccc.S
rccccccccr
_ a c
r r 0000000 a^_
0-S t-0 a_ccccccccccc :_______rr^r
r r _annnnnnnnnnnt eeeeeee _^a
t--------S t
Podemos encontrar montones de ellos o atre+ernos nosotros mismos a di#,ar los nestros :Por e,emplo
n logotipo=.
1esde el pnto de +ista de la programaci)n lo 5nico qe !a- qe tener en centa es qe !a- qe
di#,arlos l2nea por l2nea sando na instrcci)n PRI'T para cada na0 - qe en mc!os casos no
podemos ol+idar inclir espacios a la i*qierda de determinadas l2neas para qe el di#,o no se estropee.
Por e,emplo0 para di#,ar la primera de las anteriores Fgras !a#r2a qe !acer...
PRI'T . cc.
PRI'T . a a_.
PRI'T . a a _.
PRI'T . a a a_ _.
PRI'T . a a a_ _ _.
PRI'T . a acacc_ _ _.
PRI'T .acccccccc_ _ _.
PRI'T ._ccccccccccc_a.
Estos di#,os ;eron conce#idos inicialmente para ser impresos en impresoras antigas qe no
soporta#an la impresi)n de gr$Fcos0 por lo qe en principio es sFciente con qe sean en #lanco -
negro0 pero tam#i9n nos podemos molestar en ponerlos de +arios colores di#,$ndolos con distintas
instrcciones PRI'T.
Tam#i9n podemos constrir grandes letras para di#,ar los t2tlos - r)tlos de nestros programas0 por
e,emplo...
c ccc ccc ccc ccc ccc ccc c c ccc c c ccc cc cc c c a_ar ccc
ac_ r c =a ccr _r ccr cca ccr rr rc cr r r ra a r r _a r _r rra_a a c _
a c _r c _ :ccr r= r crr cr :c r cc rr r rr r S Nr rccr r_ar r .t r _r r :c= r
aca _c_ccca_cccrcccarcccrcr _cccrcrrcrccc_ccarcr_c_ccccrcr rcrcr_crcr_cr_ccca
ccc ccc ccc ccc ccccc c ccc cccc cccc cccc cccccc
r c _a c _r c _a ccrc cr r r _ _ a a_ _ a a_ _a a_ _ a ac a
r ca :c= r a_cc _ r r r rcr r_ > a _ _a_a a O N _ > a a a
rcr _cc_c_crc_rccca rcr _ccca _ca _ca_ca aca_c_ rcr acccr
Estas letras est$n constridas sando principalmente #arras - s2m#olos de s#ra-ado. Tam#i9n es com5n
constrirlas sando los caracteres semigr$Fcos o el s2m#olo M repetido :Esto 5ltimo es lo qe !ace la
instrcci)n #anner de Cin8=.
Para di#,ar n r)tlo con las letras anteriores podemos !acerlo de ;orma literal con catro instrcciones
PRI'T :Gna por cada l2nea= - los tro*os de letras entre comillas...
PRI'T . c c ccc ccc c c ccc ccc c c ccc ccc c c ccc c.
PRI'T .r rr rr ccra ccrr rr ra c _ r ccrr _r r r c _a c _r _r rr _ ac_.
PRI'T .r cc rr crr :ccrr cc r :c= r r crrr .t r r a :c= r .t rr r= ra c _.
PRI'T .rcrrcrrcccr_cccrrcrrcr_ccca rcccrrcr_cr _crc__cccarcr_crrcccaaca _c_.
Pero -a qe estamos programando0 lo m$s c)modo ser2a tener n procedimiento qe nos di#,ara el
r)tlo qe qeramos en la posici)n qe le digamos solo con !acer na llamada del tipo...
1i#,aRotlo ./ec!o en Ronda.0 B0 1Q
/a#r2a qe constrir n programa con mc!as instrcciones MidU qe +a-a constr-endo las letras l2nea
por l2nea. Se pede encontrar en la secci)n de programas terminados de esta 7e#.
TEMA 2.B
&RJAI(OS
2.B.1 - Introdcci)n a los inter;aces gr$Fcos
2.B.2 - Cos modos de pantalla en QBasic
2.B." - Rendimiento en modo gr$Fco
2.B.1 - I'TRO1G((IT' A COS I'TERAA(ES &RJAI(OS
Todos los resltados de los programas qe !emos !ec!o !asta a!ora en este ttorial de programaci)n los
!emos podido +er en la pantalla a tra+9s de lo qe denominamos .Inter;a* de te8to.0 primero s)lo en
#lanco - negro0 - m$s adelante en colores. A partir de aq2 +amos a tener la posi#ilidad de sar la
pantalla como na matri* de pntos de colores :P28eles= donde tendremos la podremos di#,ar lo qe
qeramos sando las instrcciones adecadas.
1os conceptos m- importantes qe !a- qe tener en centa a la !ora de tra#a,ar con inter;aces
gr$Fcos son la pro;ndidad de color - la resolci)n. Ca pro;ndidad de color se reFere al n5mero m$8imo
de colores qe +amos a poder presentar en la pantalla simlt$neamente. Ca resolci)n es el n5mero de
p28eles qe ;orman la pantalla0 a ma-or resolci)n ma-or calidad de imagen.
En los apartados sigientes +eremos primero la ;orma de iniciar el modo de pantalla gr$Fca de QBasic0
algo m- sencillo0 - desp9s c)mo di#,ar Fgras en la pantalla para qe !agan nestros programas -
,egos m$s +istosos.
2.B.2 - COS MO1OS 1E PA'TACCA E' QBASI(
Ol+id9monos n momento del ttorial de programaci)n. Imaginemos qe estamos tra#a,ando con
6indo7s0 n inter;a* gr$Fco m- moderno. 'estra pantalla estar$ tra#a,ando segramente con na
resolci)n de DQQ por ZQQ pi8eles - na pro;ndidad de color de 1Z.Y millones de colores. 1e esta ;orma0
adem$s de las letras qe aparecen por e,emplo en las #arras de t2tlo de las +entanas0 podemos +er
di#,ados en la pantalla los #ordes de las propias +entanas0 los iconos0 los #otones0 - !asta na imagen
de ;ondo en el escritorio qe posi#lemente sea na ;otogra;2a digitali*ada con mc!os colores.
En medio de todo este despliege de color plsamos so#re n icono qe nos +a a lan*ar n ,ego qe
tenemos instalado en nestro ordenador. Este ,ego al empe*ar a ;ncionar nos cam#ia la resolci)n a
"2Q por 2QQ pntos - la pro;ndidad de color a 2BZ colores. Podremos +er qe como la resolci)n !a
descendido0 los #ordes de ciertas Fgras redondeadas aparecen .pi8elados.0 es decir0 ;ormando
escalones. Podemos +er me,or los pi8eles porqe a!ora son m$s grandes. Tam#i9n al redcir el n5mero
de colores las im$genes -a tienen n aspecto .como de di#,os animados.. Esto es sFciente para n
,ego sencillo en la ma-or2a de los casos0 pero para +er na ;otogra;2a digital como la qe ten2amos en el
;ondo del escritorio -a nos +endr2an cortos.
En medio de nestra interesante partida con el ,ego0 el ordenador se #loqea :algo m- com5n en
6indo7s= - nos +emos o#ligados a reiniciarlo. Tras el arranqe aparece n mensa,e qe nos indica qe
6indo7s +a a ;ncionar en .modo a pre#a de ;allos.. Gna de las cosas qe !a#r$n cam#iado ser$ la
resolci)n0 qe se !a redcido a Z%Q por %DQ pi8els - el n5mero de colores qe se !a qedado en 1Z.
Podremos +er como la imagen del ;ondo del escritorio se +e m- ;ea - los iconos se +en algo m$s gordos
qe antes - con nos colores n poco e8traEos. Al a#rir algna +entana +eremos qe todo aparece n
poco m$s grande porqe !a- menos resolci)n.
?a +ol+iendo al crso de programaci)n0 +amos a +er a!ora c)mo consegir qe nestros programas de
QBasic tra#a,en con m$s o menos resolci)n - m$s o menos pro;ndidad de color seg5n nos con+enga
en cada caso.
Am#os +alores no los podemos cam#iar de ;orma independiente0 sino qe +an relacionados en lo qe se
conoce como .Modos de pantalla.. Estos son los m$s sadosH
MO1O PRESE'TA(IT' TEXTO RESOCG(IT' PROAG'1I1A1
1E (OCOR
S(REE' Q Inter;a* de te8to DQ 8 2B caracteres - 1Z colores
S(REE' 12 Inter;a* gr$Fco DQ 8 "Q caracteres Z%Q 8 %DQ pi8els 1Z colores
S(REE' 1" Inter;a* gr$Fco %Q 8 2B caracteres "2Q 8 2QQ pi8els 2BZ colores
Adem$s de estos tres0 !a- otros m$s0 pero !an qedado en desso -a qe son monocrom$ticos :Blanco
- negro= o #ien de catro colores. Se sa#an en los ordenadores m$s antigos - en los actales es
posi#le qe -a no llegen ni a ;ncionar :Prodcir$n n error de tiempo de e,ecci)n al intentar
iniciarlos=.
Tam#i9n e8isten otros modos con m$s resolci)n - con m$s colores0 pero QBasic no los soporta. Para
aprender a programar0 qe es lo qe estamos !aciendo aq20 estos tres son sFcientes.
En cada caso seremos nosotros los responsa#les de seleccionar cal es el me,or para nestro programa0
conociendo ss +enta,as e incon+enientes.
El modo Q es el inter;a* de te8to qe !emos +enido sando !asta a!ora0 es el qe QBasic sa por
de;ecto si no le decimos qe se otro. Si no tenemos necesidad de di#,ar Fgras gr$Fcas0 es el m$s
indicado en la ma-or2a de los casos -a qe es m- r$pido.
El modo 12 es el de m$s alta resolci)n qe tenemos en QBasic0 nos ser+ir$ para los casos en qe
tengamos qe di#,ar diagramas o Fgras m$s comple,as con mc!as l2neas. S principal incon+eniente
es qe es #astante m$s lento qe los otros porqe el ordenador tiene qe mane,ar mc!os pntitos para
di#,ar la pantalla. Cos colores para el modo 12 son los mismos qe la paleta #$sica normal del inter;a*
de te8to0 es decir0 estos.
/a- qe tener en centa qe en el modo 12 no disponemos de los colores intermitentes como ten2amos
en la pantalla de te8to0 - qe para escri#ir letras tenemos ciertas limitaciones qe +eremos en apartados
posteriores.
El modo 1" es de m- #a,a resolci)n0 por lo tanto las im$genes se +er$n m- .pi8eladas. - s tamaEo
en pntos no podr$ ser m- grande -a qe .no ca#r$n en la pantalla.. (omo +enta,a principal tiene la
posi#ilidad de sar na paleta de 2BZ colores0 algo m- +alioso para los ,egos0 - adem$s es #astante
r$pido0 -a qe al !a#er 2BZ colores cada pi8el de la pantalla se corresponde e8actamente con n #-te en
la memoria gr$Fca0 - las operaciones qe tiene qe !acer el ordenador para di#,arla son m$s sencillas.
Este modo de pantalla se !a sado drante aEos para la programaci)n de montones de ,egos para MS-
1OS qe toda+2a !o- nos o;recen na calidad gr$Fca m$s qe acepta#le. Para el modo 1" los colores son
los de la sigiente paletaH
(omo se pede +er0 los primeros 1Z son igales a los >&A0 a continaci)n na escala de grises0 - los
sigientes +an agrpados de 2% en 2%0 cosa qe se pede tili*ar para !acer e;ectos como degradados o
som#ras. Igalmente en el modo 1" tampoco !a- colores intermitentes.
El cam#io de modo de pantalla en QBasic es e8tremadamente sencillo0 #asta con sar la sigiente
instrcci)nH
S(REE' modo
1)nde modo es no de los nmeritos qe !emos +isto antesH Q0 12 o 1". El e;ecto qe tiene esta
instrcci)n es el #orrado completo de la pantalla - qe a partir de a!ora podremos escri#ir - di#,ar
adapt$ndonos a la ne+a resolci)n - a los colores qe tenemos. 'ormalmente esto lo !acemos na +e*
nada m$s al principio del programa :si es para modo te8to no !ace ;alta= - -a no lo cam#iamos m$s0
anqe si !ace ;alta se pede !acer todas las +eces qe sea necesario.
En los sigientes apartados +amos a +er c)mo se peden di#,ar Fgras en la pantalla gr$Fca na +e*
qe la !a-amos acti+ado sando la instrcci)n S(REE'.
Gn e;ecto qe notaremos si tenemos n monitor moderno digital ser$ qe se apage - no +ol+amos a
+er imagen algna !asta pasado n instante. Co mismo ocrrir$ cando termine n programa en modo
gr$Fco - +ol+amos al editor de QBasic qe es en modo te8to. Si estamos tra#a,ando con QBAsic en na
+entana de 6indo7s0 para entrar a modos gr$Fcos se pasa o#ligatoriamente a modo de pantalla
completa0 - candotermine el programa - +ol+amos al editor de QBasic posi#lemente lo encontremos
tam#i9n a pantalla completa. Para solcionar este pro#lema conslta el ane8o "." de este totorial.
2.B." - RE'1IMIE'TO E' MO1O &RJAI(O
(omo podremos compro#ar a lo largo de estos temas dedicados a los gr$Fcos0 el rendimiento de estas
operaciones es #astante #a,o independientemente de qe tengamos n ordenador s5per moderno o la
me,or tar,eta gr$Fca del mercado con na gran cantidad de memoria.
Este #a,o rendimiento se de#e principalmente a qe QBasic es n lenga,e interpretado - a qe las
instrcciones no est$n optimi*adas para alcan*ar gran +elocidad. Todas las instrcciones se redcen a
di#,ar pntos en la pantalla - QBasic no es capa* de di#,arlos lo sFcientemente r$pido.
Cos modernos +ideo,egos en tres dimensiones - con alta resolci)n0 millones de colores0 e;ectos de
ilminaci)n transparencias0 rebe,os0 som#ras... se redcen a eso0 a di#,ar en la pantalla pntos de
colores. Cos programas calclan cal es el color qe tiene qe tener cada pnto - estos se colocan a gran
+elocidad como +alores nm9ricos en la memoria gr$Fca del ordenador. El adaptador gr$Fco +a le-endo
esa in;ormaci)n para di#,ar la pantalla entera mc!as +eces por segndo0 mientras m$s me,or.
Cos programas - las #i#liotecas gr$Fcas qe permiten !acer eso :open&C0 directX...= est$n escritas
directamente en lenga,e ensam#lador - depradas para qe todo se !aga de la ;orma m$s r$pida
posi#le. Tam#i9n los controladores de nestro sistema gr$Fco est$n escritos de ;orma qe tra#a,an de
;orma sincroni*ada con estos programas para o#tener el ma-or rendimiento0 mientras qe QBasic tili*a
el modo de pantalla >&A qe se sa desde !ace aEos - no apro+ec!a para nada estas tecnolog2as. 'o
sa#e ni qe e8isten.
Podemos deprar n poco nestros programas - controlar cosas como qe dentro de los #cles qe se
repiten mc!o se e,ecten el menor n5mero de instrcciones - c$lclos matem$ticos posi#les0 pero por
mc!as +eltas qe le demos a nestro c)digo0 en QBasic no podemos esperar o#tener #enos
resltados a na +elocidad acepta#le. 'os tendremos qe con;ormar con sencillos di#,os qe nos +an a
ser+ir para aprender a programar - poder dar el salto a n lenga,e m$s a+an*ado qe nos permita sar
todas estas ne+as tecnolog2as.
TEMA 2.Z
TRAfA1O 1E AI&GRAS &RJAI(AS
2.Z.1 - El crsor gr$Fco
2.Z.2 - Pntos. Instrcci)n PSET
2.Z." - C2neas - rect$nglos. Instrcci)n CI'E
2.Z.% - (2rclos - )+alos. Instrcci)n (IR(CE
2.Z.B - Rellenar $reas. Instrcci)n PAI'T
2.Z.Z - 1i#,ar Fgras comple,as. Instrcci)n 1RA6
2.Z.1 - EC (GRSOR &RJAI(O
/a- +arias instrcciones espec2Fcas qe nos permiten di#,ar en la pantalla en modo gr$Fco. Antes de
empe*ar a estdiar s tili*aci)n es importante darse centa de qe en la pantalla en modo gr$Fco
e8iste0 adem$s del crsor de te8to0 n crsor gr$Fco. Este ser2a compara#le a .la pnta de n l$pi* qe
+a di#,ando cosas..
Al iniciar no de los modos gr$Fcos con la instrcci)n S(REE' el crsor gr$Fco0 siempre in+isi#le0 se
sit5a en el centro de la pantalla0 - posteriormente0 con;orme +a-amos di#,ando cosas con las
instrcciones qe +amos a +er a continaci)n0 se ir$ mo+iendo para sitarse siempre al Fnal de la 5ltima
Fgra qe !a-amos di#,ado. Algo parecido a lo qe ocrr2a con el te8to0 pero qe es con+eniente
aclarar.
2.Z.2 - PG'TOS. I'STRG((IT' PSET
Ca primera instrcci)n qe +amos a +er en modo gr$Fco nos +a a permitir di#,ar n pnto en la pantalla
en la posici)n qe nosotros indiqemos0 - del color qe nosotros qeramos. S sinta8is esH
PSET :!0+=0color
Cos +alores de ! - +0 siempre entre par9ntesis - separados por na coma son las coordenadas
!ori*ontales - +erticales del lgar en en el qe +amos a di#,ar el pnto. Recordemos qe la esqina
sperior i*qierda de la pantalla tiene las coordenadas Q0Q - las de la esqina in;erior derec!a dependen
del modo de pantalla elegido0 en el modo 12 ser$n :Z"]0%Y]= - en el modo 1" ser$n :"1]01]]=.
O#ser+a qe no son :Z%Q0%DQ= o :"2Q02QQ= porqe0 a di;erencia de las coordenadas de te8to0 empe*amos
por cero - no por no.
Si nos salimos de la pantalla especiFcando coordenadas ma-ores o menores de los l2mites permitidos0 no
ocrre nada0 simplemente qe el pnto se di#,ar$ ;era de la pantalla - no lo +eremos.
El +alor qe eli,amos para el color depende de la paleta asociada al modo de pantalla qe tengamos
acti+oH Si es el modo 12 podremos sar n +alor entre Q - 1B o si es el modo 1" tendremos disponi#les
los +alores desde Q a 2BB. E+identemente0 si di#,amos n pnto negro so#re ;ondo negro no se +er$. Si
no especiFcamos n color se sar$ el de la anterior orden de di#,o0 si era la primera orden se sar$ el
color #lanco.
En la anterior sinta8is pon2amos nas coordenadas a#soltas0 es decir0 el crsor gr$Fco se mo+2a !asta
la posici)n indicada - se di#,a#a el pnto. Tam#i9n es posi#le indicar na posici)n relati+a a la posici)n
actal del crsor gr$Fco sando la pala#ra STEP antes del par9ntesis de las coordenadasH
PSET STEP:Q0Q=0 1%
Esta instrcci)n di#,ar$ n pnto amarillo en la posici)n actal del crsor gr$Fco0 es decir0 al Fnal de la
5ltima Fgra di#,ada o en el centro de la pantalla si es la primera instrcci)n de di#,o. >amos con nos
cantos e,emplos m$s de esto de las posiciones relati+asH
S(REE' 1"
PSET :2QQ01QQ=0 1Q
PSET STEP:Q0%Q=0 1%
PSET STEP:ZQ0Q=0 12
PSET STEP:-2Q0-2Q=0 ]
Este tro*o de c)digo acti+ar$ el modo 1" - di#,ar$ n pnto +erde e8actamente en la posici)n
:2QQ01QQ=0 es decir0 2QQ pi8els a la derec!a - 1QQ pi8els m$s a#a,o de la esqina sperior i*qierda de la
pantalla. Segidamente se di#,ar$ n pnto amarillo %Q pi8els m$s a#a,o del anterior0 no ro,o ZQ pi8els
a la derec!a del amarillo0 - Fnalmente no a*l 2Q pi8els m$s arri#a - 2Q pi8els a la i*qierda del ro,o.
(omo se pede +er0 al sar coordenadas relati+as0 -a es 5til sar +alores negati+os.
Por spesto0 los +alores de las coordenadas - de los colores no tienen porq9 ser e8presiones
constantes0 peden ser el resltado de na e8presi)n matem$tica con o sin +aria#les0 por e,emplo...
PSET :iniciodlargo0 iniciodalto=0 colorActal
O algo m- 5til - m- normal es qe las instrcciones de di#,o est$n dentro de #cles qe las repitan.
'ormalmente no nos sir+e de nada di#,ar n pnto solo0 siempre di#,aremos mc!os desde dentro de
#cles0 por e,emploH
S(REE' 12
AOR n^1QQ to BQQ STEP B
PSET :n0BQ=01%
'EXT
Esta instrcci)n di#,a en la pantalla na scesi)n de pntos amarillos alineados. Si nos salimos no pasa
nada0 simplemente qe se di#,ar$n ;era - no los +eremos0 pero si indicamos n color de ;era de la
paleta del modo de pantalla actal se prodcir$ n error de tiempo de e,ecci)n - el programa se parar$.
2.Z." - CW'EAS ? RE(TJ'&GCOS.
I'STRG((IT' CI'E
Ca sigiente instrcci)n qe +amos a +er nos +a a permitir di#,ar na l2nea recta en la pantalla. S
sinta8is es...
CI'E :!10+1=-:!20+2=0color
Aq2 de#emos especiFcar dos coordenadasH la del principio de la l2nea recta - la de s Fnal. Tras di#,ar
la l2nea el crsor gr$Fco permanecer$ en el Fnal0 es decir0 en la posici)n de pantalla :!20+2=.
Igal qe en el caso anterior0 podemos especiFcar coordenadas relati+as sando la pala#ra STEP antes
del par9ntesis para na o las dos posiciones. Esto es 5til para di#,ar l2neas poligonales0 en este caso
cada segmento se di#,ar2a con na instrcci)n CI'E - todas menos la primera empe*ar2an con CI'E
STEP:Q0Q= para qe empiecen ,nto al Fnal de la anterior0 por e,emplo este c)digo di#,a n tri$ngloH
CI'E :1BQ01QQ=-:1QQ02QQ=01Q
CI'E STEP:Q0Q=-:2QQ02QQ=
CI'E STEP:Q0Q=-:1BQ01QQ=
Si la 5ltima coordenada de la 5ltima instrcci)n es igal a la primera coordenada de la primera
instrcci)n0 tendremos na l2nea poligonal cerrada0 en caso contrario qedar$ a#ierta.
Si la l2nea qe estamos di#,ando es completamente !ori*ontal o completamente +ertical ser$ di#,ada
toda contina0 si es diagonal aparecer$ ;ormando como .Escalones.. Este e;ecto es lo qe se conoce
como .pi8elado. - ser$ m$s +isi#le en el modo 1" -a qe al ser de menos resolci)n0 los pi8els son .m$s
gordos..
Esta instrcci)n CI'E tam#i9n nos permite di#,ar n rect$nglo :o n cadrado= de ;orma m- sencilla0
simplemente aEadiendo na coma - na letra B a continaci)n del color0 por e,emplo...
CI'E :2Q0 2Q=-:YQ0 "Q=0 12
1i#,ar2a na l2nea recta diagonal qe +a desde :2Q02Q= !asta :YQ0YQ=. ?...
CI'E :2Q02Q=-:YQ0"Q=0 120 B
di#,ar2a n rect$nglo con na de ss esqinas en la posici)n :2Q02Q= - la opesta en la posici)n
:YQ0YQ=. El #orde del rect$nglo tendr$ na anc!ra de n pi8el - en este caso ser$ de color amarillo.
Si qeremos qe el rect$nglo se di#,e relleno #asta con poner las letras BA :Borde - ;ondo= en +e* de
la B sola0 por e,emplo...
CI'E :2Q02Q=-:YQ0"Q=0 120 BA
Si no qeremos especiFcar el color0 para qe se co,a el sado en la instrcci)n anterior0 #asta con no
ponerlo0 qedar$n dos comas ,ntas.
CI'E :2Q02Q=-:YQ0"Q=0 0 BA
Gn poco e8traEo0 pero cidado con eqi+ocarse0 porqe si ponemos...
CI'E :2Q02Q=-:YQ0"Q=0 BA
Se di#,ar$ na l2nea recta entre las dos posiciones0 - ser$ del color qe se almacene en na ne+a
+aria#le llamada BA qe segramente ser$ el cero qe es negro - pede qe no +eamos. (omo norma
general es me,or poner el color siempre.
Al sar la segnda coordenada relati+a en los recadros0 sean rellenos o no0 podemos calclar ;$cilmente
s tamaEo e8acto sin tener qe !acer c$lclos0 por e,emploH
CI'E :2Q02Q=-STEP:]]0]]=0 1%0 BA
'os di#,ar2a n cadrado amarillo relleno de 1QQ por 1QQ p28eles :]] d 1= con la esqina sperior
i*qierda en la posici)n qe indicamos en la primera coordenada sin tener qe calclar nosotros donde
ir2a la otra esqina.
/a- qe tener en centa qe en el modo de pantalla 1" los cadrados siempre los +amos a +er n poco
m$s altos qe anc!os anqe !a-amos pesto las longitdes de ss lados igales0 -a qe la resolci)n
de este modo de pantalla :"2Q82QQ p28els= no es proporcional a las dimensiones ;2sicas del monitor qe
siempre gardan na proporci)n de "H%. Para di#,ar n cadrado qe se +ea cadrado de +erdad !a#r2a
qe di#,arlo con na altra n poco menor qe s anc!ra para qe se disimle el error0 pero tampoco
no merece mc!o la pena complicarse tanto en la ma-or2a de los casos.
Por 5ltimo0 podemos consegir qe las l2neas - los cadros sin relleno :B= se di#,en de ;orma
discontina0 es decir0 nos pntos s2 - otros no. Para !acer esto se pone al Fnal del todo n nmerito qe
nos indica el patr)n de pntos a tili*ar. Este +alor es n n5mero de 1Z #its :entre Q - ZB.B"B= qe lo
podemos poner en !e8adecimal para no liarnos comen*$ndolo con los caracteres \/. :entre \/QQQQ -
\/AAAA= >amos con nos e,emplosH
CI'E :2Q02Q=-:YQ0"Q=0 1%0B 0\/BBBB
Se di#,ar2a n rect$nglo amarillo con el #orde pnteado0 si no qeremos poner el color !ar2amosH
CI'E :2Q02Q=-:YQ0"Q=0 0B 0\/BBBB
? si qeremos qe sea na l2nea - no n rect$nglo no tendr2amos qe poner la letra B0 pero s2 s
correspondiente coma0 ser2a as2H
CI'E :2Q02Q=-:YQ0"Q=0 0 0\/BBBB
Esto no se tili*a mc!o. Si qeremos otro patr)n de pntos distinto #asta con ir pro#ando n5meros. Cos
m$s 5tiles peden ser \/BBBB qe nos +an di#,ando .no s2 - otro no. - \/AAQQ qe nos !ar2an n
e;ecto parecido a la l2nea discontina de na carretera. Si qeremos na l2nea a dos colores se pede
!acer di#,ando na normal de n color - ,sto encima na discontina del otro color0 por e,emplo...
CI'E :1QQ01QQ=-:"QQ02QQ=0 1B
CI'E :1QQ01QQ=-:"QQ02QQ=0 120 0\/AAQQ
esto nos di#,ar2a na l2nea a tro*os #lancos - ro,os.
2.Z.% - (WR(GCOS ? T>ACOS.
I'STRG((IT' (IR(CE
Ca sigiente instrcci)n nos +a a ser+ir para di#,ar na circn;erencia :s)lo la l2nea del contorno= en
nestra pantalla gr$Fca.
(IR(CE :!0 +=0 radio0 color
En este caso se di#,ar$ na circn;erencia con el centro sitado en la posici)n :!0+= - con el radio
:medido en p28els= qe indiqemos. Tras el tra*ado de la misma el crsor de gr$Fcos permanecer$ en el
centro. Por e,emploH
(IR(CE :1QQ0 2QQ=0 BQ0 12
1i#,ar$ na circn;erencia de color ro,o con el centro en la posici)n :1QQ02QQ= - con n radio de BQ
pi8els. Si no especiFcamos el color se tomar$ el de la anterior instrcci)n de di#,o0 como en los casos
anteriores. Tam#i9n tenemos la posi#ilidad de sar na coordenada relati+a anteponiendo la pala#ra
STEP al par9ntesis0 por e,emplo...
CI'E :%Q0 1Q=-:1QQ02QQ=01%
(IR(CE STEP:Q0Q=01Q
...di#,ar2a na l2nea recta inclinada de color amarillo - en s e8tremo Fnal na circn;erencia del mismo
color con n radio de 1Q p28els.
Ca instrcci)n (IR(CE tam#i9n nos permite di#,ar arcos de circn;erencia0 anqe esto no se sa
mc!o0 no !a- porq9 di#,arla siempre entera. Para !acerlo !a- qe poner a continaci)n del color el
$nglo inicial - Fnal del arco qe qeremos di#,ar. Cos $nglos +an en radianes0 la circn;erencia
completa tiene nos Z.2D radianes :2 +eces pi= - el $nglo Q est$ la la derec!a0 el pia2 radianes :]Qj=
est$ arri#a0 el pi radianes :1DQj= est$ a la i*qierda - el "a2 pi radianes :2YQj= est$ a#a,o. 1e esta ;orma0
por e,emplo0 para di#,ar la mitad sperior de na circn;erencia :desde Q !asta pi radianes= !a#r2a qe
ponerH
(IR(CE :1QQ0 1QQ=0 %Q0 1%0 Q0 ".1%
? si nos qeremos a!orrar el color - qe lo co,a de la instrcci)n anterior0 pes no lo ponemos.
(IR(CE :1QQ0 1QQ=0 %Q0 0 Q0 ".1%
Por 5ltimo0 tam#i9n podemos di#,ar )+alos en +e* de circn;erencias. Para !acerlo aEadimos otro
par$metro m$s a continaci)n. Este par$metro ser$ la proporci)n entre el radio !ori*ontal - el +ertical.
Por e,emplo0 si es dos0 el radio +ertical ser$ del do#le qe el !ori*ontal0 - si es Q.B el radio +ertical ser$ la
mitad del !ori*ontal - la circn;erencia aparecer$ aplastada. El radio qe nosotros !a-amos pesto en la
instrcci)n ser$ el ma-or de los dos0 es decir0 el !ori*ontal si este +alor es menor qe 1 o el +ertical si
nestro +alor de aspecto es ma-or qe no.
En este e,emplo di#,amos s)lo la mitad i*qierda de na circn;erencia +erde aplastada qe ser2a
catro +eces m$s anc!a qe alta si est+iera enteraH
(O'ST PI ^ ".1%L
(IR(CE :2QQ0 2QQ=0 1ZQ0 ]0 PIa20 "`:PIa2=0Q.2B
Si qeremos di#,ar el mismo )+alo entero :Algo menos re#scado=0 no ponemos los +alores de principio
- Fn del arco0 pero s2 tenemos qe respetar ss posiciones poniendo las comasH
(IR(CE :2QQ0 2QQ=0 1ZQ0 ]0 0 0Q.2B
El di#,o de circn;erencias no nos permite rellenarlas :Eso lo !aremos en el apartado sigients=0 as2
como tampoco el tra*ado de na l2nea pnteada. Cas 5ltimas cosas qe !emos +isto de los arcos - de los
)+alos -a no ser$n aplica#les en >isal Basic. En todo caso las circn;erencias se di#,an m- pi8eladas0
especialmente si son de peqeEo tamaEo./a- qe tener en centa qe en el modo de pantalla 1" las
circn;erencias no saldr$n redondas0 siempre n poco m$s altas qe anc!as0 -a qe s resolci)n
:"2Q82QQ p28els= no es proporcional a las dimensiones ;2sicas del monitor qe siempre gardan na
proporci)n de "H%.
2.Z.B - RECCE'AR JREAS.
I'STRG((IT' PAI'T
Tam#i9n es posi#le consegir qe na parte de nestra pantalla se rellene de n color o de n patr)n.
Ser2a algo parecido a la !erramienta .(#o de pintra. qe tenemos en la ma-or2a de programas de
di#,o como es el caso del Paint de 6indo7s0 pero con algna di;erencia.
El ;ncionamiento de la !erramienta .(#o de pintra. del Paint consiste en qe al plsar so#re na
parte de la pantalla con esta !erramienta0 todos los p28els ad-acentes del mismo color cam#iar$n al
ne+o color. Se prodce n e;ecto como qe la .pintra. se +a e8tendiendo0 s)lo qe es m- r$pido - no
lo notamos.
En QBasic la instrcci)n qe tenemos para !acer esto es la sigienteH
PAI'T :!0 +=0 colorrelleno0 colorl2mite
Al e,ectar esta instrcci)n se prodcir2a n e;ecto parecido a .Ec!ar pintra del color colorrelleno en la
posici)n :!0 += - esta se ir2a e8tendiendo por todos los sitios !asta encontrar p28eles del color
colorl2mite..
Gna gran di;erencia con los programas de di#,o es qe el color se +a e8tendiendo !asta qedar
encerrado por p28eles del colorl2mite0 independientemente de los otros colores qe se encentre por el
camino0 a los qe c#rir$.
Para especiFcar na posici)n relati+a tam#i9n podemos sar coordenadas relati+as anteponiendo la
pala#ra STEP como en casos anteriores.
>amos con n e,emplo qe rellenar2a n c2rclo0 algo m- com5nH
S(REE' 12
(IR(CE :1QQ0 1QQ=0 %Q0 12
PAI'T :1QQ01QQ=0 1%0 12
Co primero qe !acemos es di#,ar n c2rclo de color ro,o :12= so#re el ;ondo de la pantalla qe es
negro porqe no !a- nada m$s di#,ado. A continaci)n ec!amos pintra amarilla :1%= dentro del c2rclo
- le decimos qe pare cando encentre p28eles ro,os :12=0 con lo qe la pintra no llegar$ a salirse del
c2rclo.
El color pede ser el mismo qe el color l2mite0 pero el color l2mite no pede ser el mismo qe el color de
;ondo qe tiene el sitio donde empe*amos a pintar0 -a qe entonces solamente se di#,ar2a n pnto.
Esta instrcci)n pede dar lgar a qe la .pintra. se salga - llene toda la pantalla0 +amos con n
e,emploH
S(REE' 12
(IR(CE :1QQ0 1QQ=0 %Q0 12
CI'E :12Q0 12Q=-STEP:BQ0 BQ=0 ]0 B
PAI'T :1QQ0 1QQ=0 1Q0 12
Primero di#,amos na circn;erencia ro,a0 desp9s n cadrado a*l encima de la circn;erencia0 - al
rellenar desde dentro de la circn;erencia o#ser+aremos como el color +erde .se sale. de la
circn;erencia - llena toda la pantalla0 #orrando tam#i9n el recadro a*l. Algo as2 ser2aH
Pedes o#ser+ar ;$cilmente qe el color +erde se !a salido del c2rclo por los dos ag,eros qe qedan a
la derec!a - a#a,o. Estos se prod,eron al di#,ar el cadrado a*l0 #orrando alg5nos p28eles ro,os.
Para e+itar este pro#lema no !a- m$s qe planiFcar cidadosamente el orden en qe se +an di#,ando
los distintos o#,etos gr$Fcos - las posiciones e8actas donde samos la instrcci)n PAI'T.
Por 5ltimo decir qe en +e* de n color s)lido podemos rellenar sando n patr)n de relleno0 en este
caso !a#r2a qe sstitir el color por na cadena de oc!o caracteres qe codiFcar2a el estilo del patr)n.
Para +er m$s detalles consltar la a-da en pantalla de QBasic. 'o pro;ndi*aremos m$s en el tema
porqe de todas ;ormas la instrcci)n PAI'T -a no podr$ ser tili*ada en >isal Basic.
2.Z.Z - 1IBGVAR AI&GRAS (OMPCEVAS.
I'STRG((IT' 1RA6
En los apartados anteriores !emos +isto como podemos di#,ar Fgras elementales como pntos0 l2neas0
recadros - circn;erencias. Para di#,ar Fgras m$s comple,as podemos optar entre sar na serie de
instrcciones de estas o #ien sar na sola de la qe +amos a +er a continaci)n.
1RA6 (adena(omandoU
Esta instrcci)n es completamente distinta a las anteriores. En principio no aparecen coordenadas -
IQ9 es eso de (adena(omandoU...K A!ora lo +amos a +er.
Ca instrcci)n 1RA6 lo qe !ace es mo+er el crsor de gr$Fcos a partir de la posici)n actal donde se
encentre para ir di#,ando lo qe nosotros qeramos. ? para sa#er lo qe nosotros qeremos qe
di#,e se tili*a esta (adena(omandoU qe no es m$s qe na e8presi)n de cadena o na cadena de
caracteres entre comillas qe contiene algnos de los sigientes caracteres para qe QBasic los
interprete - sepa lo qe tiene qe di#,ar.
Estos son los caracteres qe !a- qe poner para qe el crsor gr$Fco se me+a en las distintas
direcciones - +a-a di#,ando como si ;era la pnta de n l$pi* :Gp0 1o7n0 Ce;t0 Rig!t0 E0A0&0/=H
(on n e,emplo se +e m$s claro. Cas letras peden ser tanto ma-5sclas como min5sclas. Pero se
preFeren en min5sclas para dar m$s legi#ilidad.
Imaginemos qe qeremos di#,ar na escalera con cinco escalones qe s#e !acia la derec!a. Basta
con poner...
1RA6 .rrrrr.
?a est$0 mira qe sencillo. Si !#i9ramos !ec!o esto con instrcciones CI'E !a#r2a qe !a#er pesto 1Q
instrcciones@ ? !a#erse !artado de calclar coordenadas.
A!ora +amos a ir aEadiendo cosas...
Si e,ectamos esto +eremos qe e;ecti+amente se di#,a la escalera0 pero m- peqeEita0 -a qe cada
escal)n solo mide de alto o de anc!o n pi8el. Para consegir qe los tra*os sean m$s largos en la
direcci)n qe indiqemos no !a- m$s qe poner el n5mero de p28eles a continaci)n de la letra.
/aciendo lo sigiente consegiremos qe cada escal)n mida tres p28eles de alto - cinco de anc!oH
1RA6 ."rB"rB"rB"rB"rB.
>amos con otro e,emplo m$s ela#orado qe di#,a na bec!a apntando !acia la i*qierda :Empe*ando
por la pnta=H
1RA6 .eZd"rZdZlZd"!Z.
Adem$s de esto podemos consegir cosas como qe el crsor gr$Fco +el+a atr$s tras !a#er !ec!o n
tra*o0 por e,emplo para di#,ar esta especie de estrella !ar2amosH
1RA6 .nZndZnlZnrZneZn;ZngZn!Z.
/emos pesto na ' delante de cada letra0 de esta ;orma tras di#,ar cada pnta de la estrella el crsor
+el+e al centro antes de di#,ar la sigiente.
Tam#i9n podemos !acer qe el crsor se me+a sin di#,ar0 ser2a algo parecido a le+antar el l$pi* del
papel - mo+erlo0 por eso para di#,ar na l2nea discontina !ar2amosH
1RA6 .rZ#rZrZ#rZrZ#rZrZ#rZrZ.
/emos pesto na letra B delante de los tra*os qe no qeremos qe se di#,en.
(on esta ;orma de di#,ar consegmos mo+el el crsor a saltitos a partir de la posici)n de la pantalla
donde termin) el tra*o anterior. Tam#i9n podemos !acer qe salte directamente a na posici)n de la
pantalla sando la letra M segida de las coordenadas !ori*ontal - +ertical separadas por na coma. Por
e,emplo para di#,ar n tri$nglo sando esta t9cnica !ar2amos...
1RA6 .#m1QQ01QQm1%Q01QQm12Q0YQm1QQ01QQ.
Al principio lle+amos el crsor !asta la posici)n :1QQ01QQ= sin di#,ar :Poniendo la B delante= para qe no
se di#,e na l2nea desde la posici)n actal del crsor !asta el tri$nglo0 cosa qe no qeremos.
1esp9s +amos saltando a los otros dos +9rtices del tri$nglo - Fnalmente +ol+emos !asta la posici)n
inicial para qe la Fgra qede cerrada.
O#ser+a qe sando esta t9cnica -a podemos di#,ar l2neas diagonales qe no est9n necesariamente a
%B grados.
Al sar la instrcci)n 1RA6 se tili*a el color de la anterior instrcci)n de di#,o0 o el #lanco si era la
primera. Tam#i9n podemos especiFcarlo nosotros sando la letra ( segida del n5mero del color qe
qeramos igal qe en las dem$s instrcciones qe -a !emos +isto. Tam#i9n como no+edad podemos
cam#iar de color todas las +eces qe qeramos dentro de la misma secencia de comandos0 de esta
;orma podremos di#,ar n tro*o de la Fgra de n color - otro de otro distinto. (omo e,emplo de esto
+amos a di#,ar n recadro con las l2neas i*qierda e in;erior de +erde :(olor 1Q= - las l2neas derec!a -
sperior de a*l :(olor ]=.
1RA6 .c1Qd%Qr%Q c]%Ql%Q.
Tam#i9n pedes o#ser+ar en este e,emplo qe se !a tili*ado n espacio para separar n poco las .dos
partes. del recadro. Pedes tili*ar todos los espacios qe qieras para separar las distintas partes de
n di#,o0 especialmente si !a- na tira de letras m- larga.
Por 5ltimo +amos a +er como !acer qe las Fgras di#,adas con la orden 1RA6 pedan estar rellenas
de color. Ser2a algo parecido a la instrcci)n PAI'T0 pero integrada en la orden 1RA6.
Basta con lle+ar el crsor gr$Fco a na posici)n dentro de la Fgra :(on la letra B para qe no se di#,e=
- all2 dentro sar la letra P segida del color qe qeremos sar de relleno - del color de #ordes0 qe
tendr$ qe ser el qe !emos tili*ado para di#,ar el contorno para qe .la pintra no se salga..
(omo e,emplo +amos a di#,ar n tri$nglo con el #orde ro,o - lo de dentro #lanco...
1RA6 .c12 #m1QQ01QQm1%Q01QQm12Q0YQm1QQ01QQ #m11Q0]B p1B012.
Empe*amos por el +9rtice in;erior i*qierdo en la posici)n :1QQ01QQ= - cando +ol+emos a 9l para cerrar
la Fgra !acemos saltar el crsor !asta dentro sin di#,ar - rellenamos. Es importante lle+ar el crsor
!asta el sitio interior sin di#,ar -a qe si lo !acemos di#,ando se intentar$ rellenar a partir de n pnto
-a di#,ado segramente con el color de #orde - no ;ncionar$.
Ca instrcci)n 1RA6 tiene toda+2a m$s posi#ilidades0 pero como el so de estas otras opciones es m-
raro0 toda+2a m$s qe el de la propia 1RA60 no las +amos a +er aq2. Para sa#er cales son mira la
a-da en pantalla de QBasic.
Esta instrcci)n es 5til para di#,ar Fgras comple,as0 pero lo qe aprendas de ella s)lo te +a a ser+ir
para QBasic. En >isal Basic -a desaparece - en otros lenga,es si e8iste algo parecido ;nciona de
;orma totalmente distinta.
TEMA 2.Y
OTRAS OPERA(IO'ES (O' &RJAI(OS
2.Y.1 - 1eFnir marcos de +isali*aci)n. Instrcci)n >IE6
2.Y.2 - 1eFnir n sistema de coordenadas personali*ado
2.Y.2 - (opiar - pegar. Instrcciones &ET - PGT
2.Y.2 - A+erigar el color de n pi8el. Anci)n POI'T
2.Y.2 - Escro#ir te8to en modos gr$Fcos
2.Y.1 - 1EAI'IR MAR(OS 1E >ISGACIfA(IT'.
I'STRG((IT' >IE6
Gn marco de +isali*aci)n es n mecanismo qe tiene QBasic para poder di#,ar solamente en na parte
de la pantalla sin miedo a meternos en otras partes -a di#,adas - estropear el tra#a,o -a !ec!o con
instrcciones anteriores. Al deFnir n marco de +isali*aci)n se deFne n rect$nglo de manera qe
QBasic solo podr$ di#,ar dentro de 9l. El resto de la pantalla se qeda como est$ - no podr$ ser
alterado !asta qe se deFna otro marco de +isali*aci)n. Esta t9cnica no es m- tili*ada - solo nos +a a
ser 5til en casos m- determinados0 pero -a qe en la a-da de QBasic se !ace re;erencia
constantemente a esto0 +amos a +erlo.
Para deFnir el marco de +isali*aci)n tili*aremos la sigiente instrcci)n0 similar a CI'E.
>IE6 :!10 +1=-:!20+2=
As2 deFnimos n recadro dentro del cal podremos di#,ar sin miedo a salirnos e in+adir otras partes de
la pantalla.
>amos con n e,emploH
S(REE' 12
>IE6 :1QQ0 1QQ=-:%QQ0 "QQ=
CI'E:Q0 Q=-:BQQ0 %QQ=0 1%
/aciendo esto deFnimos n recadro imaginario qe a#arca parte del centro de la pantalla. 1esp9s
di#,amos na l2nea qe +a desde la esqina sperior i*qierda de nestro recadro :Cas coordenadas
a!ora empie*an desde a!2= !asta donde llege seg5n las dimensiones qe les !emos dado0 pero en todo
caso s)lo se di#,ar$ el tro*o de l2nea qe cae dentro de nestro marco de +isali*aci)n. El resto de la
pantalla qeda tal cal est$.
Si nos liamos con el ne+o origen de coordenadas - qeremos segir sando el normal con el origen en
la esqina sperior i*qierda de la pantalla no !a- m$s qe poner la pala#ra cla+e S(REE' delante de
las coordenadas del marco de +isali*aci)n0 por e,emploH
>IE6 S(REE':1QQ0 1QQ=-:%QQ0 "QQ=
As2 de,amos como esta#a el origen de coordenadas0 pero siempre se di#,ar$n solamente los tro*os de
Fgras qe entren en el marco de +isali*aci)n.
Al deFnir n marco de +isali*aci)n0 las Fgras qe !#iera -a di#,adas en esa *ona se respetan0 es
como si el marco de +isali*aci)n ;era transparente. En algnos casos nos pede interesar rellenarlo
directamente de n color. Para !acerlo solo !a- qe poner el +alor de color a continaci)n de las
coordenadas0 por e,emplo para qe se rellene de a*l ser2aH
>IE6 :1QQ0 1QQ=-:%QQ0 "QQ=0 1
Tam#i9n podemos apro+ec!ar para di#,ar n #orde alrededor del marco de +isali*aci)n. /a#r2a qe
poner a continaci)n el color qe qeremos para el #orde0 por e,emploH
>IE6 :1QQ0 1QQ=-:%QQ0 "QQ=0 10 1%
As2 di#,ar2amos el interior a*l oscro - n #orde amarillo alrededor. Es importante entender qe este
#orde +a ;era del marco de +isali*aci)n0 - por lo tanto tampoco podr$ ser alterado con las
instrcciones de di#,o.
Si no qeremos relleno0 para conser+ar lo qe -a !a-a di#,ado0 pero s2 qeremos el #orde0 tam#i9n se
pede !acer. /a#r$ qe respetar la posici)n del color de relleno0 pero sin poner ning5n n5mero0 anqe
pare*ca e8traEo se peden poner dos comas ,ntasH
>IE6 :1QQ0 1QQ=-:%QQ0 "QQ=0 0 1%
Para sar la pantalla completa como marco de +isali*aci)n es m- sencillo0 simplementeH
>IE6
En esta instrcci)n no podemos sar la pala#ra cla+e STEP para indicar coordenadas relati+as.
2.Y.2 - 1EAI'IR G' SISTEMA 1E (OOR1E'A1AS PERSO'ACIfA1O
/asta a!ora0 para deFnir las posiciones donde si di#,a#an las Fgras sando las instrcciones de di#,o
!emos sado n sistema de coordenadas en el qe la coordenada sperior derec!a de la pantalla :o del
marco de +isali*aci)n actal= era la :Q0 Q= - la de la esqina in;erior i*qierda depend2a del modo de
pantalla :pod2a ser :Z"]0 %Y]= para S(REE' 12 o :"1]0 1]]= para S(REE' 1"=.
Este sistema es e8tremadamente c)modo porqe cada nidad representa a n pi8el de la pantalla0 pero
en algnos casos nos pede interesar deFnirnos otro sistema de coordenadas donde cada nidad
represente a m$s o manos de n pi8el.
Spongamos qe qeremos qe cada nidad represente a Z% pi8eles en !ori*ontal - a %D en +ertical.
Ser2a algo como di+idir la pantalla en na cadr2cla de 1Q por 1Q cadros. Si estamos en S(REE' 12
!a#r2a qe !acer...
6I'1O6 :Q0 Q=-:1Q0 1Q=
1e esta ;orma la coordenada I'AERIOR IfQGIER1A de nestra pantalla pasa a llamarse :Q0Q= - la
SGPERIOR 1ERE(/A pasa a ser la :1Q01Q= Es importarse darse centa qe se !a cam#iado sperior por
in;erior0 pero no i*qierda por derec!a.
/ec!o esto0 si e,ectamos la instrcci)n...
PSET :B0 B=
...se di#,ar$ n pnto nada m$s - nada menos qe en el centro de la pantalla0 qe tiene las
coordenadas :B0B= con nestro ne+o sistema de coordenadas.
Si nos liamos con el cam#io de arri#a por a#a,o es me,or sar la pala#ra cla+e S(REE' a continaci)n de
6I'1O6. 1e esta ;orma la primera coordenada corresponde a la esqina sperior derec!a - la segnda
a la in;erior i*qierda0 como !emos !ec!o !asta a!ora. Ser2a0 por e,emplo...
6I'1O6 S(REE' :Q0 Q=-:1Q0 1Q=
Para +ol+er a de,ar el sistema de coordenadas original de nestro modo de pantalla #astar2a con sar la
instrcci)n 6I'1O6 sin nada m$s.
6I'1O6
Esto de los sistemas de coordenadas personali*ados casi nnca nos ser$ de tilidad0 -a qe es m$s
c)modo tra#a,ar directamente con el original de cada modo de pantalla qe +a relacionado directamente
con el n5mero de p28eles. 1e todas ;ormas nos +a a ser+ir para entender me,or el concepto de T6IP qe
es la nidad qe tili*a >isal Basic por de;ecto para tra#a,ar con las coordenadas de los gr$Fcos. 1e
todas ;ormas all2 tam#i9n es sencillo pasar a tra#a,ar con p28eles directamente - ol+idarse tam#i9n de los
T6IPS qe no son m$s qe n sistema de coordenadas personali*ado deFnido por el propio >isal Basic.
2.Y." - (OPIAR ? PE&AR.
I'STRG((IO'ES &ET ? PGT
En todos los programas de di#,o !a- procedimientos para copiar n ;ragmento de imagen - pegarlo por
la pantalla todas las +eces qe qeramos. 'estro lenga,e de programaci)n no +a a ser menos - nos
permite0 con algnas limitaciones0 captrar con na instrcci)n n $rea rectanglar de nestra pantalla
gr$Fca - desp9s pegarla na o m$s +eces por la pantalla sando otra instrcci)n.
En 6indo7s0 por e,emplo0 para todas las operaciones de copiar - pegar se tili*a na *ona especial de la
memoria llamada portapapeles qe es controlada por el sistema operati+o - nosotros 5nicamente nos
tenemos qe limitar a meter - sacar de all2 todo lo qe qeramos. En nestros programas de QBasic no
!a- portapapeles ni nada qe se le pare*ca0 - por lo tanto somos nosotros los encargados de .constrir
no.. Para !acerlo tendremos qe declarar n +ector de tipo entero de tamaEo sFciente para almacenar
temporalmente los ;ragmentos de im$genes qe qeremos copiar - pegar.
Ca instrcci)n qe saremos para .copiar. n tro*o de pantalla es esta...
&ET :!10 +1=-:!20 +2=0 nom#re>ector
Esta instrcci)n tiene el mismo nom#re qe la tili*ada para sacar in;ormaci)n de los Fc!eros de
registros de acceso directo o aleatorio0 pero al sarla con esta sinta8is0 -a QBasic se da centa qe es
para tra#a,ar con gr$Fcos.
(omo se pede +er0 tiene na sinta8is m- parecida a la instrcci)n CI'E. Co qe !ace es coger el tro*o
de pantalla delimitado por el recadro qe +a desde la coordenada :!10 +1= a :!20 +2= - almacenarlo en
el +ector qe le pasemos0 qe de#eremos !a#er declarado pre+iamente - disponer de tamaEo sFciente.
El contenido de la pantalla no s;rir$ ning5n cam#io.
Esto parece m- sencillo0 pero !a- +arias cosas qe !a- qe tener en centa. Co m$s importante es qe
el tamaEo del +ector de#e ser sFciente. Para calclarlo e8actamente se pede sar la ;)rmla qe
+iene en la a-da en pantalla de QBasic en el tema .Matrices para im$genes de pantalla -
compati#ilidad.. Recordemos qe en la a-da de QBasic llaman matrices a todos los arra-s0 -a sean de
na0 dos o m$s dimensiones. En nestro caso lo qe nos interesa es n +ector de enteros con na sola
dimensi)n.
(omo esta ;)rmla est$ m- liada podemos !acernos na idea apro8imada del tamaEo del +ector
sa#iendo qe si en el modo de pantalla 1" !a- 2BZ colores0 cada pi8el ocpa n #-te. Bastar$ con
calclar el $rea del cadro qe +amos a copiar :altra por anc!ra= - aEadirle siempre nos 2BZ #-tes
m$s. En el modo 120 como s)lo !a- 1Z colores0 cada pi8el ocpa en memoria % #its0 qe es n ni##le o
medio #-te - por lo tanto el tamaEo reqerido para el +ector ser$ la mitad qe en el caso anterior0
siempre aEadiremos algo m$s. (on n e,emplo qe !aremos m$s adelante esto qedar$ m$s claro.
?a !emos +isto como .copiar. la imagen a .nestro portapapeles.. A!ora +amos a +er como .pegar. en la
pantalla lo qe aca#amos de copiar. /a#r$ qe tili*ar otra instrcci)n distinta0 qe es esta...
PGT :!0 +=0 nom#re>ector0 operacionPegado
Esta instrcci)n 0 qe tam#i9n se llama como la de escri#ir en Fc!eros pero qe nnca se +a a con;ndir0
lo qe !ace es di#,ar en la pantalla0 a partir de la posici)n :!0 += !acia la derec!a - !acia a#a,o0 el
;ragmento de imagen qe !a-amos almacenado pre+iamente en el +ector con na instrcci)n &ET.
Co de operaci)nPegado se reFere a na pala#ra cla+e qe !a#r$ qe poner al Fnal para decirle a QBasic
como tiene qe di#,ar los pntos qe componen nestra imagen. Si esta pala#ra es A'10 OR o XOR0 los
pntos de la imagen qe estamos pegandose com#inar$n con lo qe -a !#iera di#,ado en esa parte de
la pantalla seg5n estas operaciones l)gicas. Si la operaci)nPegado es PSET los pntos se di#,ar$n de
;orma normal #orrando en todo caso lo qe !#iera detr$s. Si samos PRESET los pntos se di#,ar$n
#orrando lo qe !#iera detr$s0 pero en este caso en +2deo in+erso. Co normal es tili*ar siempre PSET. Si
no lo ponemos0 QBasic creer$ qe estamos qeriendo tili*ar XOR0 cosa qe nos pede con;ndir.
>amos con n e,emplo de como consegir qe n tro*o de imagen qe di#,emos en la pantalla en modo
gr$Fco0 sando por e,emplo la orden 1RA60 se peda copiar por toda la pantalla sin tener qe repetir la
correspondiente orden 1RA6 en cada caso.
Sdeclaramos n +ector
1IM portapapeles:1 TO %QQ= AS I'TE&ER
S acti+amos la pantalla gr$Fca - di#,amos algo
S(REE' 12
(IR(CE :1Q0 1Q=0 D0 1%
1RA6 .c]#m%01QeZd"rZdZlZd"!Z.
Scaptramos lo qe !a-a dentro de n recadro de 2Q82Q pi8els
&ET :Q0 Q=-STEP:1]0 1]=0 portapapeles
Spegamos lo captrado tantas +eces como qeramos con PGT
AOR ! ^ Q TO Z2Q STEP 2Q
AOR + ^ Q TO %ZQ STEP 2Q
PGT :!0 +=0 portapapeles0 PSET
'EXT
'EXT
S- -a est$
(omo se pede +er0 el e,emplo se e8plica por s2 solo0 pero de todas ;ormas +amos a +erlo con n poco
m$s de detalle - +amos a comentar algnas cosillas.
El resltado de e,ectar este programa ser2a qe di#,amos en la esqina sperior i*qierda de la
pantalla na circn;erencia amarilla - dentro na bec!a a*l. Esto lo copiamos con la orden &ET - lo
almacenamos en n +ector llamado portapapeles qe !emos declarado pre+iamente con n tamaEo de
%QQ0 sFciente0 -a qe la imagen qe +amos a almacenar tiene n tamaEo de 2Q82Qpntos - cada pnto
ocpa en este modo de pantalla % #its. 1esp9s con PGT pegamos la imagen desde dentro de n #cle
para qe rellene toda la pantalla. Gsamos la operaci)n PSET para qe no se com#ine con el di#,o
original qe sige estando en la esqina sperior i*qierda.
En este caso ,sto desp9s de &ET !emos sado PGT. Pero esto no tiene porq9 ser as2. Entre medio
podemos #orrar la pantalla0 di#,ar otras cosas o !acer lo qe qeramos0 siempre qe no modiFqemos
los +alores almacenados en nestro +ector. Inclso se podr2a cam#iar de modo de pantalla - desp9s
+ol+er al original. /a- qe tener en centa qe no podemos copiar algo en n modo de pantalla -
desp9s pegarlo en otro distinto qe tenga na resolci)n !ori*ontal distinta.
Tam#i9n es importante darse centa qe al di#,ar con las instrcciones de di#,o qe !emos +isto
anteriormente nos pod2amos .salir. de la pantalla sin ma-ores consecencias0 pero al sar las
instrcciones &ET - PGT nnca nos podemos salir ;era0 -a qe se prodcir2a n error de tiempo de
e,ecci)n - el programa se detendr2a.
Para Fnali*ar con estas dos instrcciones0 decir qe s principal limitaci)n es qe el m$8imo tamaEo de
los +ectores qe podemos declarar es de Z% gB :sando s#2ndices desde -"2YZD !asta "2YZY= - por lo
tanto qeda limitado el tamaEo m$8imo de las im$genes qe qeremos copiar. 1e todas ;ormas este
tamaEo m$8imo segramente no lo podamos tampoco alcan*ar porqe las dem$s +aria#les - el propio
QBasic +an gastando m$s memoria - nos dar$ n error de memoria agotada si intentamos declarar
+ectores m- grandes.
Estas instrcciones -a de,an de e8istir en >isal Basic. All20 en n entorno totalmente gr$Fco !a- na
instrcci)n qe nos permitir$ !acer eso con mc!a ma-or be8i#ilidad e inclso le-endo la in;ormaci)n
directamente desde arc!i+os de im$genes normales. En QBasic estas instrcciones tienen tilidad en
casos m- sencillos de repetir patrones parecidos al qe !emos +isto en el e,emplo.
2.Y.% - A>ERI&GAR EC (OCOR 1E G' PIXEC.
I'STRG((IT' POI'T
Para terminar con los gr$Fcos +amos a +er na cosa m- sencilla0 pero e8tremadamente 5til. Se trata de
na ;nci)n qe nos +a a de+ol+er el color qe tiene n pnto de la pantalla gr$Fca.
Esto pede parecer algo qe no sir+e para mc!o0 pero como a!ora +eremos nos +a a ser de mc!a
tilidad para resol+er na gran cantidad de pro#lemas relacionados con los gr$Fcos de na ;orma
#astante sencilla0 anqe poco eFciente.
>amos a lo qe +amos0 - +amos a +er la sinta8is de esta ;nci)nH
POI'T :!0+=
As2 de sencillo. Gsamos la ;nci)n dentro de na e8presi)n o a la derec!a del operador de asignaci)n - le
pasamos como par$metros las coordenadas del pnto - nos de+el+e el +alor de color correspondiente.
Gna cosa importante es qe no podemos sar la pala#ra cla+e STEP para indicar coordenadas relati+as0
por lo tanto algo como...
pnto ^ POI'T STEP :1Q0 1Q=
...estar2a mal - dar2a n error detectado inclso por el editor al intentar dar n salto de l2nea.
Si especiFcamos na coordenada qe est9 ;era de la pantalla0 no pasa nada0 simplemente se de+el+e
el +alor -1.
Ca instrcci)n POI'T nos de+el+e el +alor del atri#to de color del pnto qe especiFqemos0
independientemente de qe el color qe se representa en la pantalla !a-a sido alterado por algna
instrcci)n PACETTE. Esto nos permite por e,emplo con+ertir en negro +arios colores para qe coincidan
con el ;ondo0 di#,ar Fgras con estos colores .in+isi#les. - desp9s detectar s presencia con la
instrcci)n POI'T en algno de los m9todos qe se descri#en a continaci)n0 especialmente el de mapas
de dre*as tili*ado ampliamente para la programaci)n de +ideo,egos.
Esta ;nci)n es #astante 5til en la pantalla de gr$Fcos. Gna aplicaci)n interesante pede ser la
implementaci)n de na especie de .pant)gra;o +irtal. con el qe iremos copiando pnto por pnto n
$rea de la pantalla a otra posici)n con la posi#ilidad de cam#iar el tamaEo o los colores de la mestras
o#tenidas. Esto se !ace metiendo dentro de dos #cles AOR anidados la instrcci)n POI'T - na
instrcci)n PSET para di#,ar los pntos del mismo color en otra parte de la pantalla. (on este e,emplo
+amos a copiar n tro*o de la pantalla a otra posici)n 2QQ pi8eles m$s a la derec!a - con el do#le de
tamaEo.
AOR ! ^ Q TO %]
AOR + ^ Q TO %]
c^POI'T:!0 +=
PSET:! ` 2= d 2QQ0 + ` 2=0 c
'EXT
'EXT
Este m9todo es m- lento0 pero para $reas peqeEas nos da grandes posi#ilidades cam#iando todos o
algno de los los colores0 no di#,ando algno o !aciendo otras operaciones matem$ticas. Tam#i9n en
este e,emplo aparecer2an pntos separados en la ne+a #icaci)n. Podemos arreglar esto sando
instrcciones CI'E0 circn;erencias0 rectas qe +engan de n pnto0 #otones di#,ados con +arias CI'E0
etc. Cos resltados peden ser #astante +istosos. Estos son algnos e,emplos de los resltados qe se
peden o#tener sando esta t9cnica.
Otra aplicaci)n ampliamente tili*ada de la instrcci)n POI'T en los +ideo,egos es lo qe se conoce
como detecci)n anticipada de color o mapas de dre*as. Esto sir+e para qe por e,emplo en n ,ego de
la#erintos no podamos meter a nestro persona,e a tra+9s de las paredes. Si no lo !ici9ramos as2
tendr2amos qe desarrollar na soFsticada estrctra de datos con matrices o alg5n otro algoritmo qe
pede qe en pro-ectos peqeEos no mere*ca la pena. 1e esta ;orma s)lo !a- qe sa#er qe si el ;ondo
por el qe se +a a mo+er nestro persona,e es siempre negro0 por e,emplo0 a todas las partes de la
pantalla qe sean de otro color no +a a poder entrar. Esto se e+ita compro#ando el color de la ne+a
posici)n antes de despla*arnos a ella.
Cos mapas de dre*as son na representaci)n de la pantalla a menor resolci)n qe el original - de n
color qe !a sido con+ertido por la instrcci)n PACETTE en in+isi#le al coincidir con el ;ondo. Se san
normalmente en +ideo,egos sencillos de plata;ormas para sa#er e8actamente por qe parte de los
escenarios se pede mo+er el persona,e0 donde est$n las plata;ormas0 etc... trasladando las coordenadas
reales de la pantalla a las del mapa de dre*a para compro#ar los colores sin inter;erir con los detalles
del escenario original.
Se peden +er e,emplos de tili*aci)n de estas t9cnicas de programaci)n - de algnas otras parecidas
en la secci)n de +ideo,egos terminados de esta p$gina 7e#.
Otra aplicaci)n menos 5til de la ;nci)n POI'T es qe nos de+el+a la posici)n actal del crsor de
gr$Fcos. (omo na ;nci)n s)lo nos pede de+ol+er n +alor0 le tenemos qe decir lo qe qeremos qe
nos de+el+a0 con estos n5meros.
POI'T:Q= 1e+el+e el +alor X :!ori*ontal= de la coordenada actal en la pantalla o marco de +isali*aci)n
acti+o :Medida en p28eles=.
POI'T:1= 1e+el+e el +alor ? :+ertical= de la coordenada actal en la pantalla o marco de +isali*aci)n
acti+o :Medida en p28eles=.
POI'T:2= 1e+el+e el +alor X :!ori*ontal= de la coordenada l)gica actal de nestro sistema de
coordenadas personali*ado si lo tenemos deFnido.
POI'T:"= 1e+el+e el +alor ? :+ertical= de la coordenada l)gica actal de nestro sistema de
coordenadas personali*ado si lo tenemos deFnido.
Si no tenemos deFnido n sistema de coordenadas personali*ado :lo m$s normal=0 POI'T:Q= de+ol+er$ lo
mismo qe POI'T:2= - POI'T:1= lo mismo qe POI'T:"= -a qe siempre estamos contando en pi8eles.
2.Y.B - ES(RIBIR TEXTO E' MO1O &RJAI(O
En la pantalla gr$Fca tam#i9n tenemos la posi#ilidad de escri#ir te8tos sando la instrcci)n PRI'T de la
misma ;orma qe !ac2amos en la pantalla normal en modo te8to0 pero nos +amos a encontrar con na
serie de incon+enientes qe segramente nos +an a !acer de desistir en la ma-or2a de los casos. >amos
a +er cales son estos incon+enientes - la ;orma de e+itarlos en la medida de lo posi#le.
Cas pantalla de te8to a la qe estamos acostm#rada es e8tremadamente r$pida0 pero en la pantalla de
gr$Fcos todo es m$s lento. Pede ocrrir inclso qe +eamos aparecer nestro te8to l2nea por l2nea como
en las pel2clas si nestro ordenador tiene en este momento na carga de tra#a,o m$s alta de lo normal
por clpa de otros programas qe est9 e,ectando 6indo7s en ese momento.
En las instrcciones de di#,o -a nos !emos acostm#rado a di#,ar nestras Fgras e8actamente en la
posici)n de pi8el qe qeramos0 pero con la instrcci)n PRI'T nos tenemos qe acomodar a la l2nea -
colmna m$s pr)8ima al sitio qe qeramos sando instrcciones CO(ATE - pede qe esto no siempre
nos +enga #ien para enca,ar las letras en el sitio ,sto. Tendremos qe adecar nestros gr$Fcos al te8to
- no al contrario.
En la pantalla en modo S(REE' 12 tenemos DQ colmnas - "Q l2neas para escri#ir. Cos caracteres se
di#,an con n tamaEo algo m$s peqeEo al del modo te8to - con na deFnici)n acepta#le.
Een modo S(REE' 1" tenemos %Q colmnas - 2B l2neas. Cos te8tos escritos aq2 tendr$n n aspecto
parecido al del telete8to0 con nos caracteres de do#le anc!o. (omo este modo de pantalla es de #a,a
resolci)n los caracteres aparecer$n m- pi8elados.
Si llegamos a escri#ir en las l2neas m$s #a,as de la pantalla sin sar n pnto - coma al Fnal de las
instrcciones PRI'T0 se prodcir$ el despla*amiento atom$tico arrastrando !acia arri#a el te8to -
tam#i9n nestros gr$Fcos.
(omo color para las letras podemos sar calqiera de los qe nos permite nestro modo de pantalla :1Z
o 2BZ=0 pero el ;ondo +a a ser siempre - o#ligatoriamente del color Q :negro=. 'o se permite el so de
colores intermitentes.
A di;erencia de lo qe pdi9ramos pensar0 las letras no se di#,an transparentes so#re lo qe -a !a-a
di#,ado en la pantalla0 sino qe siempre +an a ir so#re n recadro negro. Este negro lo podemos
cam#iar redeFniendo el color Q con na instrcci)n PACETTE0 pero de todas ;ormas esto es n gra+e
incon+eniente si qeremos escri#ir so#re n ;ondo -a di#,ado.
Estos incon+enientes !acen qe normalmente los r)tlos qe aparecen en nestras pantallas en modo
gr$Fco no se escri#an tili*ando instrcciones PRI'T. Cos lenga,es de programaci)n m$s a+an*ados
incl-en #i#liotecas de ;entes - las correspondientes instrcciones de di#,o para escri#ir tili*$ndolas0
as2 como ;nciones qe nos permiten a+erigar el anc!o de los te8tos - otras cosas. Por norma general
estas tipogra;2as no incl-en las letras acentadas ni la eEe ni el s2m#olo del Ero.
En QBasic +amos a tener qe ser nosotros mismos los qe nos constr-amos nestras instrcciones
personali*adas para escri#ir en modo gr$Fco. En todo caso nos tendremos qe molestar en di#,ar todos
- cada no de los s2m#olos qe +amos a qerer escri#ir :Cetras ma-5sclas - min5sclas0 n5meros0
signos de pntaci)n - matem$ticos0 caracteres especiales0 etc...= /a- dos posi#ilidadesH
(aracteres de mapa de #its. (onsiste en ir di#,ando cada car$cter pnto por pnto sando instrcciones
PSET. Esto nos da la posi#ilidad de di#,ar los caracteres sando +arios colores para ;ormar por e,emplo
n degradado. El incon+eniente es qe los caracteres podr$n cam#iar a tamaEo solamente si el ne+o es
n m5ltiplo del anterior. Esto se consige en +e* de di#,ar pntos0 di#,ando cadraditos de dos por dos
p28eles o tres por tres... A medida qe amentemos de tamaEo los caracteres perder$n resolci)n.
Tam#i9n !a- qe tener en centa qe di#,ar las letras pnto por pnto pede ser n proceso #astante
lento.
(aracteres +ectoriales escala#les. (ada car$cter es di#,ado por na instrcci)n 1RA60 lo qe permite
cam#iar ;$cilmente s tamaEo sando el par$metro .s. dentro de la orden 1RA6. Cos caracteres as2
di#,ado siempre mantendr$n s resolci)n anqe normalmente presentar$n n aspecto de l2neas m-
Fnas porqe no es recomenda#le intentar rellenar $reas si las Fgras se +an a escalar.
Ca deFnici)n de los pntos o tra*os qe componen cada car$cter qedar$ almacenada en n +ector para
ser le2da cada +e* qe sea necesario. Para llenar el +ector se !ar$n asignaciones directas de literales o
#ien se o#tendr$ la in;ormaci)n de n Fc!ero secencial qe leeremos al principio del programa. En la
secci)n de esta 7e# dedicada a programas gr$Fcos - +ideo,egos se peden +er e,emplos de tili*aci)n
de tipogra;2as de am#os tipos.
TEMA 2.D
IMPRESIT'
Todo programa de gesti)n qe se precie de#e ser capa* de generar listados o in;ormes - poderlos sacar
por la impresora. Esta operaci)n en QBasic es sencilla. Basta con en+iar lo qe qeremos imprimir l2nea
por l2nea a la impresora con la instrcci)n CPRI'T de la misma ;orma qe !emos +enido sando la
instrcci)n PRI'T. >amos con n e,emplo.
CPRI'T .PRGEBA 1E IMPRESIT' 1ES1E QBASI(.
CPRI'T .^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.
CPRI'T ./o- es .L 1ATEUL . - son las .L TIMEU
CPRI'T .Ca ra2* de 2BZ es.L SQR:2BZ=
El resltado ser2a qe o#tendr2amos por impresora n papel con algo parecido a lo sigienteH
PRGEBA 1E IMPRESIT' 1ES1E QBASI(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/o- es QDaQ2a2QQD - son las 1ZH%2HQB
Ca ra2* de 2BZ es 1Z
Si qeremos imprimir en posiciones espec2Fcas0 como por e,emplo para rellenar los casilleros de n
reci#o0 tendremos qe a,star las posiciones imprimiendo l2neas en #lanco :Gsando CPRI'T sin
argmentos= - metiendo espacios entre las pala#ras. Co importante es recordar qe siempre se empie*a
en la parte sperior i*qierda del papel - se a+an*a l2nea por l2nea !acia a#a,o. 'o podemos saltar !acia
atr$s -a qe el papel nnca corre para atr$s dentro de la impresora.
/asta aq2 todo m- #onito0 pero a!ora +ienen los pro#lemas.
El primer pro#lema es qe en este proceso se peden dar na gran +ariedad de errores qe !agan qe
nestro programa qede detenido0 por lo qe !a#r$ qe !acer n control de errores similar al qe
!acemos en los procesos de mane,o de Fc!eros.
Cos errores qe peden ocrrir peden ir desde qe ni siqiera el sario tenga impresora0 qe esta est9
apagada o desconectada del ordenador0 qe no tenga papel o qe !a-a alg5n ;allo drante la
transmisi)n de los datos. Estos errores +ienen identiFcados cada no con s c)digo - se mane,an con
na estrctra similar a la qe +imos para el caso de los Fc!eros. Algnos de los c)digos de error m$s
comnes relacionados con la impresi)n son los sigientesH
(T1I&O 1E ERROR 1ES(RIP(IT'
2% C2mite de tiempo en dispositi+o
2B Aallo en dispositi+o
BY Error en dispositi+o de entradaasalida
ZD 1ispositi+o no disponi#le
Z] 1es#ordamiento del #5;er de comnicaciones
YQ Permiso denegado
El tra#a,o con las impresoras es e8tremadamente complicado de#ido a qe e8isten gran cantidad de
controladores de impresi)n distintos0 por lo qe pede qe anqe nestro programa ;ncione #ien - no
se prod*ca ning5n error0 el tra#a,o no se llege a imprimir por clpa de conbictos con el controlador o
con el sistema operati+o.
QBasic en particlar - los programas para MS-1OS en general tienen mc!as limitaciones para imprimir.
En nestro caso solo imprimiremos a tra+9s de la impresora qe est9 conectada al primer perto paralelo
de nestro ordenador :CPT1=0 por lo tanto si tenemos na impresora GSB o #ien na conectada a otro
eqipo de la red local0 en principio -a no podemos imprimir desde QBasic. Se podr2a consegir instalando
na serie de controladores - programas especiales qe !agan operaciones como redireccionar los
pertos0 cosa qe pede qe no mere*ca la pena si solo samos QBasic para aprender a programar.
Otro pro#lema es la tipogra;2a - el tamaEo de letra a tili*ar. En todo caso se sar$ la qe tenga por
de;ecto la impresora qe ser$ normalmente alg5n tipo (orier de anc!o F,o - con n tamaEo como para
qe qepan DQ caracteres por l2nea.
En las impresoras antigas se pede cam#iar este tipo de letra tocando determinados #otones o
mo+iendo algnos conmtadores internos.
'estro programa podr2a llegar a cam#iar esto0 as2 como sar negritas0 crsi+as - pocos e;ectos mas
insertando determinados c)digos de caracteres especiales entre las pala#ras de nestras instrcciones
CPRI'T0 pero esto ser2a espec2Fco para cada modelo de impresora. Estos c)digos de control o secencias
de escape +endr$n detallados en el manal de la impresora :o no=0 pero no con+iene sarlos a no ser qe
estemos !aciendo n programa espec2Fco para ella0 -a qe con toda segridad no +an a ;ncionar en
otra impresora de otro tipo.
Si la impresi)n de te8tos es complicada0 la impresi)n de gr$Fcos -a es poco menos qe imposi#le.
Sigiendo detalladamente las instrcciones qe +engan en el manal de la impresora0 si es qe +ienen0
el proceso consistir2a #$sicamente en tratar a la impresora como si ;era n Fc!ero de acceso directo0
a#ri9ndola con na orden de tipo...
OPE' CPT1 AOR OGTPGT AS M1
? escri#iendo en dic!o Fc!ero los c)digos de control adecados ,nto con la in;ormaci)n de los pi8els
qe ;orman la imagen en ;ormato #inario0 +amos0 n l2o m- grande. ? encima todo en #lanco - negro.
>isto esto se pede compro#ar qe imprimir desde QBasic es #astante entretenido0 - todo para
consegir nos resltados m- po#res - poco inno+adores a la !ora de aprender a programar :Es igal
qe sar instrcciones PRI'T=. Tam#i9n !a- qe tener en centa qe cada pre#a qe !agamos conlle+a
el gasto de na !o,a de papel - de tinta0 mientras qe en la pantalla podemos escri#ir todas las +eces
qe qeramos de ;orma totalmente gratita.
Si a esto aEadimos qe al sar QBasic en 6indo7s con las actales impresoras GSB se !a perdido
completamente la compati#ilidad - qe en >isal Basic - otros lenga,es modernos el proceso de
impresi)n es #astante distinto comprendemos ;$cilmente qe no nos merece la pena preocparnos
demasiado de aprender a imprimir desde los programas de QBasic.
TEMA 2.]
EAE(TOS 1E SO'I1O ? MhSI(A
En la 9poca qe apareci) QBasic no era m- com5n qe los ordenadores t+ieran n sistema de sonido
como los qe !o- conocemos0 pero s2 podemos emitir algnos sonidos a tra+9s del alta+o* interno qe
tienen todos los P(s.
Ca instrcci)n m$s sencilla qe tenemos para emitir sonidos es esta...
BEEP
omo s propio nom#re nos sgiere0 lo qe !ace es !acer sonar por el alta+o* interno n pitido similar al
qe se o-e cando encendemos el ordenador.
Si estamos e,ectando QBasic desde 6indo7s - tenemos na tar,eta de sonido0 entonces la instrcci)n
BEEP lo qe !ace es generar el sonido predeterminado de 6indo7s a tra+9s de los alta+oces mltimedia
de nestro eqipo.
Es importante entender qe drante el tiempo qe dra el sonido0 sea el pitido o el 7a+ de 6indo7s0 la
e,ecci)n del programa qeda detenida.
Otra instrcci)n n poco m$s a+an*ada para reprodcir sonidos es la sigiente...
SOG'1 ;recencia0 draci)n
Ca ;recencia la tenemos qe e8presar en !ert*ios. Se admiten +alores entre "Y - "2YZY. Gn +alor #a,o
indica n sonido gra+e0 - no alto n sonido agdo. >alores acepta#les est$n entre "QQ - "QQQ !ert*ios.
Por de#a,o se o-en mal0 - por encima peden resltar molestos.
Ca draci)n +iene indicada en 1a1D segndos. Esto qiere decir qe si ponemos como draci)n 1D el
sonido drar$ n segndo0 si ponemos "Z drar$ 2 segndos0 si ponemos ] drar$ medio segndo - as2
con todos los +alores. Es importante no poner +alores m- altos :'o mas de dos o tres segndos= -a qe
el sonido no parar$ !asta qe no aca#e el tiempo indicado0 inclso anqe el programa termine o lo
detengamos plsando (O'TROCdPAGSA.
Ca instrcci)n SOG'1 nos +a a ser+ir para dar pitidos. En algnos casos nos pede interesar dar pitidos
de mas de n tono con +arias instrcciones SOG'1 o inclso sar #cles para consegir cosas como
esta...
SVM&B - /ec!o en Ronda - 1]]Z
AOR + ^ 1 TO B
AOR ! ^ 1 TO B
SOG'1 :! ` 1QQ= d :+ ` 2QQ= d 1QQ0 2
SOG'1 :+ ` 2QQ= d ZQQ0 2
SOG'1 :! ` 2QQ= d %QQ0 2
'EXT
'EXT
Si nos atre+emos con la m5sica0 por e,emplo para los +ideo,egos0 QBasic nos pro+ee de n mecanismo
para componer melod2as0 parecido al de los tim#res de los tel9;onos m)+iles...
PCA? .cadenacomandos.
S ;ncionamiento es similar al de la orden 1RA6 qe +imos en el tema de gr$Fcos. Se le pasa na
cadena de comandos entre comillas ;ormada por na serie de letras - n5meros qe indican a QBasic la
m5sica qe tiene qe tocar.
En la a-da de QBasic se detallan los comandos qe !a- disponi#les para esta instrcci)n. Si tienes nos
conocimientos m2nimos de m5sica ser$s capa* de componer alg5n tipo de sinton2as para qe senen en
ts programas.
Estos son instrcciones PCA? :(ada na ocpa na l2nea entera segida0 anqe aq2 peda aparecer
cortada=.
PCA? .MBT1DQo2P2PDCD&&&C2E-P2%PDCDAAAC21.
PCA? .MBo"CDE1dE1dEo2Bo"1(C2o2A.
PCA? .M'T2BQCDO21C%AdCDAdAdEAdC%&.AdCDAdC%ECDEE1EC%Ad. 1CD1C%AdCDAdAdEAdC%&.
BCDBC%ACDAC%&CDEC21mn.
En nestros programas no con+iene a#sar de la m5sica - de los sonidos. /a- qe tener en centa qe
en los sistemas de sonido modernos el sario tiene la posi#ilidad de a,star el +olmen de los alta+oces
o inclso de apagarlos0 pero al sar el alta+o* interno del P( el sario no tiene m$s remedio qe
escc!ar todos los sonidos qe prod*ca nestro programa.
'ormalmente se san pitidos cortos para reaccionar ante ciertas acciones. Si nestro programa !ace n
so mas intensi+o de pitidos - m5sica ser2a con+eniente dotarlo de n mecanismo de ;orma qe el
sario peda desacti+arlos0 por e,emplo sando +aria#les glo#ales - condiciones antes de intentar
!acer alg5n sonido...
I'PGT .IQieres o2r los sonidosK - :Sa'=H.L sonidoU
S
S...resto del programa...
S
IA sonidoU ^ .S. T/E' SOG'1 1QQ0B
En todo caso el so de los sonidos tendr2a qe ser solo en momentos pntales. Al pasar a otros
entornos de programaci)n m$s a+an*ados -a tendremos la posi#ilidad de apro+ec!ar todas las
posi#ilidades de la tar,eta de sonido.

You might also like