<!--Dear translator: please NEVER translate the id or anything inside the tags as they are needed in english by the application Thanks a lot in advance.--> <chapter id="reference"> <title >Manual de referencia do programador de &turtlelang;</title> <para >Este é o manual de referencia do &turtlelang; de &kturtle;. Neste capítulo primeiro descreberemos brevemente os diferentes <link linkend="different-instructions" >tipos de instruccións</link >, e logo explicaranse os <link linkend="commands" >comandos</link > un por un. Despois explícanse os <link linkend="containers" >contedores</link >, as <link linkend="math" >matemáticas</link >, as <link linkend="questions" >perguntas</link > e os <link linkend="controlling-execution" >controladores da execución</link >. Finalmente explícase como crear os seus proprios comandos mediante <link linkend="learn" >define</link >.</para> <sect1 id="different-instructions"> <title >Os tipos de instrucións</title> <para >Como en calquera linguaxe, &turtlelang; ten tipos diferentes de palabras e símbolos. Aquí explícanse brevemente as diferenzas entre os tipos.</para> <sect2 id="command"> <title >Comandos</title> <para >Empregando comandos dille ao sapoconcho de &kturtle; que faga algo. Algúns comandos precisan dunha entrada, outros xeran unha saída. <screen ># avanza é un comando que precisa dunha entrada, neste caso o número 100: avanza 100 </screen> </para> <para >Para coñecer máis detalles acerca de todos os comandos soportados por &kturtle; vaia <link linkend="commands" >aquí</link >.</para> </sect2> <sect2 id="number"> <title >Números</title> <para >Posibelmente xa saiba bastante acerca dos números. A maneira de utilizar os números en &kturtle; non é moi diferente da oral, nen da matemática. </para> <para >Temos os números naturais: <userinput >0</userinput >, <userinput >1</userinput >, <userinput >2</userinput >, <userinput >3</userinput >, <userinput >4</userinput >, <userinput >5</userinput > etc, os números negativos: <userinput >-1</userinput >, <userinput >-2</userinput >, <userinput >-3</userinput > etc. E tamén temos números con parte decimal, por exemplo: <userinput >0.1</userinput >, <userinput >3.14</userinput >, <userinput >33.3333</userinput >, <userinput >-5.05</userinput >, <userinput >-1.0</userinput >. </para> <para >Os números poden ser utilizados en <link linkend="math" >cálculos matemáticos</link > e <link linkend="questions" >perguntas</link >. Tamén poden porse en <link linkend="containers" >contedores</link >.</para> <para >Os números aparecen <glossterm >realzados</glossterm > en vermello escuro no <link linkend="the-code-editor" >editor do código</link >.</para> </sect2> <!-- constants like pi? --> <sect2 id="string"> <title >Textos</title> <para >Primeiro un exemplo: <screen> escrebe "Olá, son un texto."</screen> Neste exemplo <userinput >escrebe</userinput > é un comando no que <userinput >"Olá, son un texto."</userinput > é un texto. Os textos comezan e rematan con aspas, <userinput >"</userinput >, mediante as cais &kturtle; sabe que é un texto.</para> <para >Os textos poden porse en <link linkend="containers" >contedores</link >. Aínda así non poden ser empregados en <link linkend="math" >cálculos matemáticos</link > ou <link linkend="questions" >perguntas</link >.</para> <para >Os textos son <glossterm >realzados</glossterm > en vermello no <link linkend="the-code-editor" >editor do código</link >.</para> </sect2> <sect2 id="name"> <title >Nomes</title> <para >Cando empregue a linguaxe de programación &turtlelang; pode crear novos textos. Se escrebe un programa a miúdo precisará <link linkend="containers" >contedores</link > e nalgúns casos <link linkend="learn" >define</link > para crear novos comandos. Cando faga un novo comando con <link linkend="learn" >define</link > terá que especificar un nome.</para> <para >Pode escoller calquera nome mentres non teña xa asinado un significado. Por exemplo non pode crear unha función chamada <link linkend="forward" >avanza</link >, porque este nome xa é empregado por un comando interno. <screen> # aquí emprégase avanza como un comando novo, # pero xa ten un significado, polo que # dará un erro: define avanza { escrebe "isto non é válido" } # isto funciona: define adianta { escrebe "isto serve" } </screen > Os nomes só poden conter letras, número e trazos baixos (_), e teñen que comezar por unha letra. Os nomes de contedor teñen que comezar co prefixo de contedor ($). <screen ># aquí emprégase avanza como un contedor, # polo que se prefixa cun $, polo que non # entra en conflito co comando avanza $avanza = 20 escrebe $avanza </screen> </para> <para >Os contedores <glossterm >reálzanse</glossterm > en letra grosa púrpura no <link linkend="the-code-editor" >editor do código</link >.</para> <para >Lea a documentación acerca dos <link linkend="containers" >contedores</link > e do comando <link linkend="learn" >define</link > para ter mellores explicacións e máis exemplos. </para> </sect2> <sect2 id="assignment"> <title >Asinacións</title> <para >As asinacións fanse mediante o símbolo <userinput >=</userinput >. Nas linguaxes de programación é mellor ler o <userinput >=</userinput > non como "é igual a" senón como "faise". A expresión "é igual a" é máis apropriada para o <userinput >==</userinput > que é unha <link linkend="questions" >pergunta</link >.</para> <para >Polo xeral as asinacións empréganse por dous motivos, (1) para engadir contido aos <link linkend="containers" >contedores</link >, e (2) para modificar o contido dun contedor. Por exemplo: <screen >$x = 10 # o contedor x agora contén o número 10 $W = "A miña idade é: " # o contedor W agora contén o texto "A miña idade é: " # isto que segue escrebe o contido dos contedores "W" e "x" escrebe $W + $x </screen> </para> <para >Para máis exemplos consulte a sección que explica os <link linkend="containers" >contedores</link >.</para> </sect2> <sect2 id="math-symbols"> <title >Símbolos matemáticos</title> <para >&kturtle; admite os símbolos matemáticos básicos: suma (<userinput >+</userinput >), resta (<userinput >-</userinput >), multiplicación (<userinput >*</userinput >), división (<userinput >/</userinput >) e os parénteses <userinput >(</userinput > e <userinput >)</userinput >.</para> <para >Para recibir unha explicación completa e máis exemplos consulte a sección de <link linkend="math" >matemáticas</link >.</para> </sect2> <sect2 id="question"> <title >Perguntas</title> <para >Podemos facer perguntas simples nas que a resposta sexa "certo" ou "falso".</para> <para >O uso das perguntas é explicado en detalle na sección de <link linkend="questions" >perguntas</link >.</para> </sect2> <sect2 id="questions-glue"> <title >Encadeamento de perguntas</title> <para >As perguntas poden combinarse mediante as palabras-chave <userinput >e</userinput >, <userinput >ou</userinput > e unha palabra especial: <userinput >non</userinput >.</para> <para >A utilización destas palabras-chave explícase na sección <link linkend="question-glue" >Combinación de perguntas</link >.</para> </sect2> <sect2 id="comment"> <title >Comentarios</title> <para >Os comentarios son liñas que comezan cun <userinput >#</userinput >. Por exemplo: <screen> # isto é un comentario! escrebe "isto non é un comentario" # a liña previa non é un comentario, pero a seguinte si o é: # escrebe "isto non é un comentario" </screen > Podemos engadir comentarios no código para axudarnos a nós mesmos ou a outras persoas a comprender o que fai. Os comentarios son utilizados para: (1) engadir unha pequena descrición do programa, (2) explicar como funciona un pedazo de código se é algo lioso, e (3) para "comentar" liñas de código que deben ser ignoradas temporalmente (por exemplo a última liña do exemplo anterior).</para> <para >As liñas comentadas son <glossterm >realzadas</glossterm > en gris claro no <link linkend="the-code-editor" >editor do código</link >.</para> </sect2> </sect1> <sect1 id="commands"> <title >Comandos</title> <para >Mediante os comandos pode dicirlle ao sapoconcho ou a &kturtle; que faga algo. Algúns comandos precisan de parámetros, outros xeran un resultado. Nesta sección explicamos todos os comandos que poden ser empregados en &kturtle;. Lembre que todos os comandos incorporados que se explican aquí serán <glossterm >realzados</glossterm > en azul no <link linkend="the-code-editor" >editor do código</link >, o que o axudará a distinguilos.</para> <sect2 id="moving-the-turtle"> <title >Mover o sapoconcho</title> <para >Hai varios comandos que moven o sapoconcho pola pantalla.</para> <variablelist> <anchor id="forward"/> <varlistentry > <term >avanza (av)<indexterm ><primary >avanza (av)</primary ></indexterm ></term> <listitem ><para ><screen >avanza X</screen> <userinput >avanza</userinput > move o sapoconcho cara diante X píxeles. Cando o lápis está pousado deixará un rastro. <userinput >avanza</userinput > pode abreviarse como <userinput >av</userinput ></para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="backward"/> <varlistentry > <term >recua (re)<indexterm ><primary >recua (re)</primary ></indexterm ></term> <listitem ><para ><screen >recua X</screen> <userinput >recua</userinput > move o sapoconcho cara atrás X píxeles. Se o lápis está pousado deixará un rastro. <userinput >recua</userinput > pode ser abreviado como <userinput >re</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="turnleft"/> <varlistentry > <term >xiraesquerda (xe)<indexterm ><primary >xiraesquerda (xe)</primary ></indexterm ></term> <listitem ><para ><screen >xiraesquerda X</screen> <userinput >xiraesquerda</userinput > ordénalle ao sapoconcho que xire X graus á esquerda. <userinput >xiraesquerda</userinput > pode abreviarse como <userinput >xe</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="turnright"/> <varlistentry > <term >xiradereita (xd)<indexterm ><primary >xiradereita (xd)</primary ></indexterm ></term> <listitem ><para ><screen >xiradereita X</screen> <userinput >xiradereita</userinput > ordénalle ao sapoconcho que xire X graus á dereita. <userinput >xiradereita</userinput > pode abreviarse como <userinput >xd</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="direction"/> <varlistentry > <term >direccion (dir)<indexterm ><primary >direccion (dir)</primary ></indexterm ></term> <listitem ><para ><screen >direccion X</screen> <userinput >direccion</userinput > fai que o sapoconcho tome unha ruta a X graus do cero, polo que non é relativa á anterior ruta que seguise o sapoconcho. <userinput >direccion</userinput > pode abreviarse como <userinput >dir</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="center"/> <varlistentry > <term >vaiaocentro<indexterm ><primary >vaiaocentro</primary ></indexterm ></term> <listitem ><para ><screen >vaiaocentro</screen> <userinput >vaiaocentro</userinput > leva o sapoconcho ao centro do lenzo.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="go"/> <varlistentry > <term >vai<indexterm ><primary >vai</primary ></indexterm ></term> <listitem ><para ><screen >vai X,Y</screen> <userinput >vai</userinput > fai que o sapoconcho vaia a un lugar concreto do lenzo. Este lugar está a X <glossterm linkend="pixels" >píxeles</glossterm > do borde esquerdo do lenzo e a Y <glossterm linkend="pixels" >píxeles</glossterm > da parte de riba do lenzo. </para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="gox"/> <varlistentry > <term >vaix<indexterm ><primary >vaix</primary ></indexterm ></term> <listitem ><para ><screen >vaix X</screen> <userinput >vaix</userinput > fai que o sapoconcho vaia a unha posición situada a X <glossterm linkend="pixels" >píxeles</glossterm > do borde esquerdo do lenzo sen desprazarse en altura.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="goy"/> <varlistentry > <term >vaiy<indexterm ><primary >vaiy</primary ></indexterm ></term> <listitem ><para ><screen >vaiy Y</screen> <userinput >vaiy</userinput > fai que o sapoconcho vaia a unha posición situada a Y <glossterm linkend="pixels" >píxeles</glossterm > do cume do lenzo sen desprazarse en horizontal.</para ></listitem> </varlistentry> </variablelist> <note ><para >Cando se utilizan os comandos <userinput >vai</userinput >, <userinput >vaix</userinput >, <userinput >vaiy</userinput > e <userinput >vaiaocentro</userinput > o sapoconcho non debuxa a liña, con independencia de que o lápis estexa erguido ou pousado.</para> </note> </sect2> <sect2 id="locate-the-turtle"> <title >Onde está o sapoconcho?</title> <para >Hai dous comandos que din a posición do sapoconcho na pantalla.</para> <variablelist> <anchor id="getx"/> <varlistentry > <term >coordenadaX<indexterm ><primary >coordenadaX</primary ></indexterm ></term> <listitem ><para ><userinput >coordenadaX</userinput > devolve a cantidade de píxeles que hai desde a esquerda do lenzo até a posición do sapoconcho.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="gety"/> <varlistentry > <term >coordenadaY<indexterm ><primary >coordenadaY</primary ></indexterm ></term> <listitem ><para ><userinput >coordenadaY</userinput > devolve a cantidade de píxeles que hai do cume do lenzo até a posición do sapoconcho.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="pen"> <title >O sapoconcho ten un lápis</title> <para >O sapoconcho ten un lápis que debuxa unha liña á medida que se move o animal. Hai uns poucos comandos que controlan este lápis. Nesta sección explicarémolos.</para> <variablelist> <anchor id="penup"/> <varlistentry > <term >subelapis (sl)<indexterm ><primary >subelapis (sl)</primary ></indexterm ></term> <listitem ><para ><screen >subelapis</screen> <userinput >subelapis</userinput > separa o lápis do lenzo. Cando o lápis está <quote >subido</quote > non se debuxan liñas ao moverse o sapoconcho. Consulte tamén <userinput >baixalapis</userinput >. <userinput >subeLapis</userinput > pode abreviarse como <userinput >sl</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="pendown"/> <varlistentry > <term >baixalapis (bl)<indexterm ><primary >baixalapis (bl)</primary ></indexterm ></term> <listitem ><para ><screen >baixalapis</screen> <userinput >baixalapis</userinput > pousa o lápis no lenzo. Cando o lápis está <quote >baixado</quote > debúxanse liñas cando se move o sapoconcho. Consulte tamén <userinput >subelapis</userinput >. <userinput >baixalapis</userinput > pode abreviarse como <userinput >bl</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="setpenwidth"/> <varlistentry > <term >ancholapis (al)<indexterm ><primary >ancholapis (al)</primary ></indexterm ></term> <listitem ><para ><screen >ancholapis X</screen> <userinput >ancholapis</userinput > estabelece o grosor do trazo co valor de X <glossterm linkend="pixels" >píxeles</glossterm >. <userinput >ancholapis</userinput > pode abreviarse como <userinput >al</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="setfgcolor"/> <varlistentry > <term >corlapis (cl)<indexterm ><primary >corlapis (cl)</primary ></indexterm ></term> <listitem ><para ><screen >corlapis R,G,B</screen> <userinput >corlapis</userinput > estabelece a cor do trazo. <userinput >corlapis</userinput > toma como parámetro unha <glossterm linkend="rgb" >combinación RGB</glossterm >. <userinput >corlapis</userinput > code abreviarse como <userinput >cl</userinput >.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="canvas"> <title >Comandos para controlar o lenzo</title> <para >Hai varios comandos que controlan o lenzo.</para> <variablelist> <anchor id="resizecanvas"/> <varlistentry> <term >tamañolenzo (tlz)<indexterm ><primary >tamañolenzo (tlz)</primary ></indexterm ></term> <listitem ><para ><screen >tamañolenzo X,Y</screen> Mediante o comando <userinput >tamañolenzo</userinput > pode axustar o tamaño da área. Toma X e Y como entradas, onde X é o novo ancho do lenzo en <glossterm linkend="pixels" >píxeles</glossterm > e Y é o novo alto en <glossterm linkend="pixels" >píxeles</glossterm >. <userinput >tamañolenzo</userinput > pode abreviarse como <userinput >tlz</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="setbgcolor"/> <varlistentry > <term >corlenzo (clz)<indexterm ><primary >corlenzo (clz)</primary ></indexterm ></term> <listitem ><para ><screen >corlenzo R,G,B</screen> <userinput >corlenzo</userinput > estabelece a cor do lenzo. <userinput >corlenzo</userinput > toma unha <glossterm linkend="rgb" >combinación RGB</glossterm > como entrada. <userinput >corlenzo</userinput > pode abreviarse como <userinput >clz</userinput >.</para ></listitem> </varlistentry> </variablelist> <!-- <sect3 id="wrapon"> <title >wrapon</title> <variablelist> <varlistentry > <term >wrapon</term> <listitem ><para ><screen >wrapon</screen> With the <userinput >wrapon</userinput > command you can set <glossterm linkend="wrapping" >wrapping</glossterm > <quote >on</quote > for the canvas. Please see the glossary if you want to know what <glossterm linkend="wrapping" >wrapping</glossterm > is.</para ></listitem> </varlistentry> </variablelist> </sect3> <sect3 id="wrapoff"> <title >wrapoff</title> <variablelist> <varlistentry > <term >wrapoff</term> <listitem ><para ><screen >wrapoff</screen> With the <userinput >wrapoff</userinput > command you can set <glossterm linkend="wrapping" >wrapping</glossterm > <quote >off</quote > for the canvas: this means the turtle can move off the canvas and can get <quote >lost</quote >. Please see the glossary if you want to know what <glossterm linkend="wrapping" >wrapping</glossterm > is.</para ></listitem> </varlistentry> </variablelist> </sect3 > --> </sect2> <sect2 id="clean"> <title >Comandos para borrar</title> <para >Hai dous comandos para limpar o lenzo cando o emborrona.</para> <variablelist> <anchor id="clear"/> <varlistentry > <term >borra (br)<indexterm ><primary >borra (br)</primary ></indexterm ></term> <listitem ><para ><screen >borra</screen> Con <userinput >borra</userinput > pode borrar do lenzo todos os debuxos. As demais cousas fican: a posición e ángulo do sapoconcho, a cor do lenzo, a visibilidade do sapoconcho e o tamaño do lenzo.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="reset"/> <varlistentry > <term >reinicia<indexterm ><primary >reinicia</primary ></indexterm ></term> <listitem ><para ><screen >reinicia</screen> <userinput >reinicia</userinput > limpa máis a fondo do que o fai o comando <userinput >borra</userinput >. Despois de executar un comando <userinput >reinicia</userinput > todo volta a ser como cando iniciou &kturtle;. O sapoconcho estará posto no centro da pantalla, a cor do lenzo será branco, debuxarase cun trazo negro e o tamaño do lenzo será de 400 x 400 píxeles.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="sprites"> <title >O sapoconcho é un sprite</title> <para >Os sprites son pequenas imaxes que se poden mover pola pantalla, como se ve nos xogos de consola. O noso animaliño tamén é un sprite. Para saber máis acerca disto, consulte a entrada <glossterm linkend="sprites" >sprites</glossterm > no glosario. </para> <para >A seguir ten un resumo completo de todos os comandos que traballan sobre sprites.</para> <para >[A versión actual de &kturtle; aínda non permite utilizar outros sprites que non sexan o sapoconcho. En versións futuras poderá mudar para outro deseño á súa escolla]</para> <variablelist> <anchor id="spriteshow"/> <varlistentry > <term >mostrasapoconcho (msc)<indexterm ><primary >mostrasapoconcho (msc)</primary ></indexterm ></term> <listitem ><para ><screen >mostrasapoconcho</screen> <userinput >mostrasapoconcho</userinput > fai de novo visíbel ao sapoconcho se antes foi agochado. <userinput >mostrasapoconcho</userinput > pode abreviarse como <userinput >msc</userinput >.</para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="spritehide"/> <varlistentry > <term >agochasapoconcho (asc)<indexterm ><primary >agochasapoconcho (asc)</primary ></indexterm ></term> <listitem ><para ><screen >agochasapoconcho</screen> <userinput >agochasapoconcho</userinput > fai invisíbel ao sapoconcho. Isto pode empregarse se o animal non couber no debuxo. <userinput >agochasapoconcho</userinput > pode abreviarse como <userinput >asc</userinput >.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="writing"> <title >Pode escreber o sapoconcho?</title> <para >A resposta é: <quote >pode</quote >. A tartaruga pode escreber, e escreberá calquera cousa que lle mande.</para> <variablelist> <anchor id="print"/> <varlistentry > <term >escrebe<indexterm ><primary >escrebe</primary ></indexterm ></term> <listitem ><para ><screen >escrebe X</screen> O comando <userinput >escrebe</userinput > ordénalle ao sapoconcho que escreba algo no lenzo. <userinput >escrebe</userinput > pode tomar textos e números como parámetros. Pode <userinput >escrebe</userinput >r varios números e cadeas mediante o símbolo <quote >+</quote >. Aquí vai un exemplo: <screen >$ano = 2009 $autor = "Bruno" escrebe $autor + " debuxou unha nora en KTurtle no ano" + $ano + " e gustoulle moito!" </screen> </para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="fontsize"/> <varlistentry > <term >letratamaño<indexterm ><primary >letratamaño</primary ></indexterm ></term> <listitem ><para ><screen >letratamaño X</screen> <userinput >letratamaño</userinput > modifica o tamaño de letra utilizado ao <userinput >escreber</userinput >. <userinput >letratamaño</userinput > toma un argumento numérico. O tamaño indícase en <glossterm linkend="pixels" >píxeles</glossterm >.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="random"> <title >Un comando que escolle ao chou</title> <para >Hai un comando que saca un número ao chou, chámase <userinput >aleatorio</userinput > e é moi útil para ter resultados inesperados.</para> <variablelist> <varlistentry > <term >aleatorio (alea)<indexterm ><primary >aleatorio (alea)</primary ></indexterm ></term> <listitem ><para ><screen >aleatorio X,Y</screen> <userinput >aleatorio</userinput > é un comando que toma unha entrada e saca un resultado. Como entrada precisa de dous números, o primeiro (X) é o resultado mínimo, o segundo (Y) o máximo. A saída é un número escollido ao chou que é como mínimo o menor e como máximo o maior. Aquí vai un exemplo:<screen> repite 500 { $x = aleatorio 1,20 avanza $x xiraesquerda 10 - $x } </screen > Mediante o comando <userinput >aleatorio</userinput > pode introducir algo de caos no programa.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="dialogs"> <title >Introdución de datos e obtención de resultados mediante diálogos</title> <para >Un diálogo é unha pequena fiestra emerxente que lle dá algo de información ou que lle pide algún dato. &kturtle; ten dous comandos para diálogos, que son: <userinput >mostra</userinput > e <userinput >pergunta</userinput ></para> <variablelist> <anchor id="message"/> <varlistentry > <term >mostra<indexterm ><primary >mostra</primary ></indexterm ></term> <listitem ><para ><screen >mostra X</screen> O comando <userinput >mostra</userinput > toma un <link linkend="string" >texto</link > como entrada, e mostra un diálogo que contén o <link linkend="string" >texto</link >. <screen >mostra "Bruno debuxou unha nora en KTurtle no ano 2008 e gustoulle moito!" </screen> </para ></listitem> </varlistentry> </variablelist> <variablelist> <anchor id="ask"/> <varlistentry > <term >pergunta<indexterm ><primary >pergunta</primary ></indexterm ></term> <listitem ><para ><screen >pergunta X</screen> <userinput >pergunta</userinput > toma un <link linkend="string" >texto</link > como entrada. Mostra un diálogo que contén o texto, como fai <link linkend="message" >mostra</link >, pero ademais tamén pon un campo de texto no diálogo. Mediante este campo o usuario pode introducir un <link linkend="number" >número</link > ou un <link linkend="string" >texto</link > que pode gardar nun <link linkend="containers" >contedor</link >. Por exemplo <screen> $idade = pergunta "Cantos anos tes?" $resultado = 2003 - $idade escrebe "En 2003 tiñas " + $resultado + " anos."</screen> Cando un usuario cancela o diálogo de pergunta, ou non insere nada, o <link linkend="containers" >contedor</link > será baleirado.</para ></listitem> </varlistentry> </variablelist> </sect2> </sect1> <sect1 id="containers"> <title >Contedores</title> <para >Os contedores son letras ou palabras que poden ser utilizadas polo programador para gardar un número ou texto. Aos contedores que conteñen un número chámaselles <link linkend="variables" >variábeis</link >, e aos que conteñen letras <link linkend="string" >textos</link >. Os contedores identifícanse facilmente polo caracter <quote >$</quote > que levan diante do nome.</para> <para >Os contedores que non están a ser utilizados non conteñen nada. Exemplo: <screen> escrebe $N </screen > Non escreberá nada e pola contra mostrará unha mensaxe de erro. </para> <sect2 id="variables"> <title >Variábeis: contedores de números</title> <para >Comecemos cun exemplo: <screen> $x = 3 escrebe $x </screen > Na primeira liña a letra <userinput >x</userinput > é convertida nunha variábel (contedor de números). Como pode ver, a variábel <userinput >x</userinput > toma o valor 3. Na segunda liña escrébese no lenzo o valor.</para> <para >Lembre que se quixese escreber un <quote >x</quote > deberíamos ter feito <screen >escrebe "x" </screen> </para> <para >Iso foi sinxelo, agora fagámolo algo máis complicado: <screen> $A = 2004 $B = 25 $C = $A + $B # o seguinte comando escrebe "2029" escrebe $C recua 30 # o seguinte comando escrebe "2004 máis 25" escrebe $A + " máis " + $B recua 30 # o seguinte comando escrebe "1979" escrebe $A - $B </screen > Nas primeiras dúas liñas dáselles os valores 2004 e 25 ás variábeis <userinput >A</userinput > e <userinput >B</userinput >. Na terceira liña a variábel <userinput >C</userinput > toma o valor <userinput >A + B</userinput >, que é 2029. O resto do exemplo consiste en 3 comandos <userinput >escrebe</userinput > con <userinput >recua 30</userinput > polo medio. Estes <userinput >recua</userinput > foron postos ahí para garantir que cada cousa fose escrita nunha liña nova. Neste exemplo tamén vemos como as variábeis poden ser empregadas en <link linkend="math" >cálculos matemáticos</link >.</para> </sect2> <sect2 id="strings"> <title >Contedores que conteñen letras (textos)</title> <para >No código de programación os textos polo xeral comézanse e termínanse con aspas. Como xa vimos: <screen> escrebe "Olá programador!" </screen > Estas pezas de texto ordinario son chamadas <link linkend="strings" >textos</link >.</para> <para >Os textos tamén son gardados en <link linkend="containers" >contedores</link > como os <link linkend="number" >números</link >, e teñen moitos parecidos coas variábeis. A maior diferenza é que conteñen texto no canto de números. Por este motivo non poden ser utilizados en <link linkend="math" >cálculos matemáticos</link > nen <link linkend="questions" >perguntas</link >. Vexamos un exemplo de utilización de textos: <screen> $saudo = "Olá " $nome = pergunta "Dime como te chamas..." escrebe $x + $nome + ", como estás?" </screen > Na primeira liña o texto <userinput >x</userinput > toma o valor de <quote >Olá </quote >. Na segunda o texto <userinput >nome</userinput > toma o valor do resultado de <userinput >perguntar</userinput >. Na terceira liña o programa escrebe no lenzo unha composición de tres textos.</para> <para >Este programa pídelle que introduza o seu nome. Se escrebe, por exemplo, o nome <quote >Paulo</quote >, o programa escrebe <quote >Olá Paulo, como estás?</quote >. Lembre que o signo máis (+) é o único símbolo matemático que pode utilizar cos textos.</para> </sect2> </sect1> <sect1 id="math"> <title >Sabe matemáticas o sapoconcho?</title> <para >Si, &kturtle; sabe matemáticas. Pode sumar (+), restar (-), multiplicar (*), e dividir (/). Aquí vai un exemplo no que se utilizan estas operacións:<screen> $a = 20 - 5 $b = 15 * 2 $c = 30 / 30 $d = 1 + 1 escrebe "a: " + $a + ", b: " + $b + ", c: " + $c + " e d: " + $d </screen > Sabe os valores que teñen a, b e c?. Poña atención a que se emprega o símbolo de <link linkend="assignment" >asinación</link >, <userinput >=</userinput >.</para> <para >Se só quer facer un cálculo simples pode facer algo como isto: <screen >escrebe 2004-12 </screen ></para> <para >Agora un exemplo con parénteses: <screen> escrebe ((20 -5) * 2 / 30 ) + 1 </screen > As expresións entre parénteses serán calculadas primeiro. Neste exemplo, calcularase 20-5, logo multiplicarase por 2, dividirase entre 30, e finalmente engádeselle 1, co que dá o resultado 2.</para> <para >&kturtle; ten capacidades matemáticas avanzadas. Sabe o número <userinput >pi</userinput >, e funcións trigonométricas como <userinput >seno</userinput >, <userinput >coseno</userinput >, <userinput >tanxente</userinput >, <userinput >arcoseno</userinput >, <userinput >arcocoseno</userinput >, <userinput >arcotanxente</userinput > e as funcións <userinput >raiz</userinput > e <userinput >exp</userinput >. <indexterm ><primary >pi</primary ></indexterm> <indexterm ><primary >seno, coseno, tanxente</primary ></indexterm> <indexterm ><primary >arcoseno, arcocoseno, arcotanxente</primary ></indexterm> <indexterm ><primary >raiz, exp</primary ></indexterm> </para> <sect2 id="round"> <title >Deixe que o sapoconcho redondee os números</title> <para >Se precisa de números enteiros nos cálculos, empregue esta función.</para> <variablelist> <varlistentry> <term >redondea<indexterm ><primary >redondea</primary ></indexterm ></term> <listitem ><para ><screen >redondea (x)</screen> <userinput >redondea</userinput > o número indicado ao enteiro máis próximo. <screen> escrebe redondea(10.8) avanza 20 escrebe redondea(10.3) avanza 20 </screen > Con este código o sapoconcho escreberá os números 11 e 10.</para ></listitem> </varlistentry> </variablelist> </sect2> </sect1> <sect1 id="questions"> <title >Facer perguntas, obter respostas...</title> <para ><link linkend="if" ><userinput >se</userinput ></link > e <link linkend="while" ><userinput >mentres</userinput ></link > son <link linkend="controlling-execution" >controladores da execución</link > que explicaremos na seguinte sección. Nesta utilizaremos o comando <link linkend="if" ><userinput >se</userinput ></link > para explicar as perguntas.</para> <sect2 id="q"> <title >Perguntas</title> <para >Un exemplo simples de pergunta: <screen> $x = 6 se $x > 5 { escrebe "olá" } </screen > Neste exemplo a pergunta é <userinput >x > 5</userinput >. Se a resposta e isto é "certo" executarase o código entre as chaves. As perguntas son unha parte importantísima da programación e a miúdo son empregadas xunto con <link linkend="controlling-execution" >controladores de execución</link >, como <link linkend="if" ><userinput >se</userinput ></link >. Todos os número e <link linkend="variables" >variábeis</link > (contedores de números) poden ser comparados uns cos outros en perguntas.</para> <para >Estas son todas as posíbeis perguntas: <table> <title >Tipos de perguntas</title> <tgroup cols="3"> <tbody> <row> <entry ><userinput >a == b</userinput ></entry> <entry >é igual a</entry> <entry >a resposta é <quote >certo</quote > se <userinput >a</userinput > é igual a <userinput >b</userinput ></entry> </row> <row> <entry ><userinput >a != b</userinput ></entry> <entry >é diferente de</entry> <entry >a resposta é <quote >certo</quote > se <userinput >a</userinput > non é igual a <userinput >b</userinput ></entry> </row> <row> <entry ><userinput >a > b</userinput ></entry> <entry >maior que</entry> <entry >a resposta é <quote >certo</quote > se <userinput >a</userinput > é maior que <userinput >b</userinput ></entry> </row> <row> <entry ><userinput >a < b</userinput ></entry> <entry >menor que</entry> <entry >a resposta é <quote >certo</quote > se <userinput >a</userinput > é menor que <userinput >b</userinput ></entry> </row> <row> <entry ><userinput >a >= b</userinput ></entry> <entry >maior ou igual que</entry> <entry >a resposta é <quote >certo</quote > se <userinput >a</userinput > é maior ou igual a <userinput >b</userinput ></entry> </row> <row> <entry ><userinput >a <= b</userinput ></entry> <entry >menor ou igual que</entry> <entry >a resposta é <quote >certo</quote > se <userinput >a</userinput > é menor ou igual a <userinput >b</userinput ></entry> </row> </tbody> </tgroup> </table> </para> </sect2> <sect2 id="question-glue"> <title >Encadeamento de perguntas</title> <para >As palabras de encadeamento de perguntas permítennos xuntar varias perguntas nunha máis elaborada. <screen> $a = 1 $b = 5 se ($a < $b) e ($b == 5) { escrebe "Olá" } </screen > Neste exemplo a palabra combinadora <userinput >e</userinput > é empregada para xuntar 2 perguntas (<userinput >a < 5</userinput >, <userinput >b == 5</userinput >) nunha. Se un lado do <userinput >e</userinput > é <quote >falso</quote > toda a resposta será <quote >falso</quote >, porque con <userinput >e</userinput > ambos os dous lados deben ser <quote >certo</quote > para que a resposta sexa <quote >certo</quote >. Por favor non se esqueza de empregar os parénteses arredor das perguntas!</para> <para >Este é un resumo esquemático, a seguir exponse unha explicación detallada: <table> <title >Palabras de encadeamento de perguntas</title> <tgroup cols="2"> <tbody> <row> <entry ><userinput >e</userinput ></entry> <entry >Ambos os dous lados deben ser "certo" para que a resposta sexa "certo"</entry> </row> <row> <entry ><userinput >ou</userinput ></entry> <entry >Se un dos lados é "certo" a resposta será "certo"</entry> </row> <row> <entry ><userinput >non</userinput ></entry> <entry >Caso especial: só opera sobre unha pergunta! Muda o estado de "certo" para "falso" ou de "falso" para "certo"</entry> </row> </tbody> </tgroup> </table> </para> <sect3 id="and"> <title >e</title> <indexterm ><primary >e</primary ></indexterm> <para >Cando dúas perguntas son xuntadas mediante un <userinput >e</userinput >, ambos os dous lados do <userinput >e</userinput > deben ser "certo" para que o resultado sexa "certo". Por exemplo: <screen> $a = 1 $b = 5 se (($a < 10) e ($b == 5)) e ($a < $b) { escrebe "Olá" } </screen > Neste exemplo vese unha pergunta combinada dentro de outra pergunta combinada.</para> </sect3> <sect3 id="or"> <title >ou</title> <indexterm ><primary >ou</primary ></indexterm> <para >Se unha das dúas perguntas que están a ser combinadas con <userinput >ou </userinput > é "certo" o resultado será "certo". Por exemplo: <screen> $a = 1 $b = 5 se (($a < 10) ou ($b == 10)) ou ($a == 0) { escrebe "Olá" } </screen > Neste exemplo vese unha pergunta combinada dentro de outra pergunta combinada.</para> </sect3> <sect3 id="not"> <title >non</title> <indexterm ><primary >non</primary ></indexterm> <para ><userinput >non</userinput > é unha palabra combinadora especial porque só opera sobre unha pergunta á vez. <userinput >non</userinput > troca o estado de "certo" para "falso" ou viceversa. Por exemplo: <screen> $a = 1 $b = 5 se non (($a < 10) e ($b == 5)) { escrebe "Olá" } noutrocaso { escrebe "Adeus" } </screen > Neste exemplo a pergunta combinada é "certo", pero o <userinput >non</userinput > troca o resultado para "falso". Deste xeito, escrébese <userinput >"Adeus"</userinput > no <link linkend="the-canvas" >lenzo</link >.</para> </sect3> </sect2> </sect1> <sect1 id="controlling-execution"> <title >Control da execución</title> <para >Os controladores da execución permítenlle, como indica o nome, controlar o fluxo de execución.</para> <para >Os comandos de control da execución son <glossterm >realzados</glossterm > en letra verde grosa. As chaves utilízanse caseque sempre xunto cos controladores de execución e son <glossterm >realzados</glossterm > en letra negra grosa.</para> <sect2 id="wait"> <title >Facer que o sapoconcho agarde</title> <para >Se programou algo en &kturtle; xa se terá decatado de que o sapoconcho pode ser moi moi moi rápido cando debuxa. Este comando fai que agarde durante un tempo.</para> <variablelist> <varlistentry> <term >agarda<indexterm ><primary >agarda</primary ></indexterm ></term> <listitem ><para ><screen >agarda X</screen> <userinput >agarda</userinput > fai que o sapoconcho estexa quedo durante X segundos. <screen> repite 36 { avanza 5 xiradereita 10 agarda 0.5 } </screen > Este código debuxa un círculo, pero o animal agardará medio segundo tras cada paso. Isto dá a impresión dun sapoconcho lento.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="if"> <title >Executar "se"</title> <variablelist> <varlistentry> <term >se<indexterm ><primary >se</primary ></indexterm ></term> <listitem ><para ><screen >se <link linkend="questions" >pergunta</link > { ... }</screen> O código que vai entre as chaves só será executado <userinput >se</userinput > a resposta á <link linkend="questions" >pergunta</link > é <quote >certo</quote >. Achará máis información acerca das <link linkend="questions" >perguntas</link > nas <link linkend="questions" >sección de perguntas</link >. <screen> $x = 6 se $x > 5 { escrebe "x é maior que cinco!" } </screen > Na primeira liña <userinput >x</userinput > toma o valor 6. Na segunda liña faise a <link linkend="questions" >pergunta</link > <userinput >x > 5</userinput >. Xa que a resposta é <quote >certo</quote > o controlador de execución <userinput >se</userinput > permitirá que se execute o código entre as chaves</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="else"> <title >Se non, o caso contrario: "noutrocaso"</title> <variablelist> <varlistentry> <term >noutrocaso<indexterm ><primary >noutrocaso</primary ></indexterm ></term> <listitem ><para ><screen >se pergunta { ... } noutrocaso { ... }</screen> <userinput >noutrocaso</userinput > pode empregarse xunto co controlador de execución <link linkend="if" ><userinput >se</userinput ></link >. O código entre as chaves que seguen a <userinput >noutrocaso</userinput > só será executado se a resposta á <link linkend="questions" >pergunta</link > é <quote >falso</quote >. <screen> reinicia $x = 4 se non 5 > $x { escrebe "x é maior que cinco!" } noutrocaso { escrebe "x é menor que seis!" } </screen > A <link linkend="questions" >pergunta</link > é se <userinput >x</userinput > é maior que 5 (pero do revés ao levar a negación diante). Xa que <userinput >x</userinput > vale 4 a resposta é <quote >falso</quote >. Isto significa que se executará o código entre as chaves que seguen a <userinput >noutrocaso</userinput >.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="while"> <title >O ciclo "mentres"</title> <variablelist> <varlistentry> <term >mentres<indexterm ><primary >mentres</primary ></indexterm ></term> <listitem ><para ><screen >mentres <link linkend="questions" >pergunta</link > { ... }</screen> O controlador de execución <userinput >mentres</userinput > seméllase moito a <link linkend="if" ><userinput >se</userinput ></link >. A diferenza é que <userinput >mentres</userinput > repite o código entre as chaves até que a resposta á <link linkend="questions" >pergunta</link > sexa <quote >falso</quote >. <screen> $x = 1 mentres $x < 5 { avanza 10 agarda 1 $x = $x + 1 } </screen > Na primeira liña <userinput >x</userinput > toma o valor de 1. Na segunda liña faise a <link linkend="questions" >pergunta</link > <userinput >x < 5</userinput >. Dado que a resposta é <quote >certo</quote > o controlador de execución <userinput >mentres</userinput > comeza a executar o código entre as chaves até que a resposta á <link linkend="questions" >pergunta</link > sexa <quote >falso</quote >. Neste caso executarase 4 veces, porque cada vez que se executa a quinta liña <userinput >x</userinput > aumenta 1.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="repeat"> <title >O ciclo "repite"</title> <variablelist> <varlistentry> <term >repite<indexterm ><primary >repite</primary ></indexterm ></term> <listitem ><para ><screen >repite número { ... }</screen> O controlador de execucion <userinput >repite</userinput > seméllase moito a <link linkend="while" ><userinput >mentres</userinput ></link >. A diferenza é que <userinput >repite</userinput > executa o código entre as chaves o número dado de veces.</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="for"> <title >O ciclo "desde", un ciclo cun contador</title> <variablelist> <varlistentry> <term >desde<indexterm ><primary >desde</primary ></indexterm ><indexterm ><primary >pasando</primary ></indexterm ></term> <listitem ><para ><screen >desde <userinput >ponto inicial</userinput > ate <userinput >ponto final</userinput > {...}</screen> O bucle <userinput >para</userinput > é un <quote >bucle con contador</quote >, &ie;, mantén por si o reconto. <screen> desde $x = 1 ate 10 { escrebe $x * 7 avanza 15 } </screen > Cada vez que se executa o código entre as chaves o <userinput >x</userinput > aumenta en 1, até que <userinput >x</userinput > acada o valor de 10. O código nas chaves escrebe o valor do <userinput >x</userinput > multiplicado por 7. Cando este programa remate a execución verá a táboa de multiplicar do 7 no lenzo. </para> <para >O paso por omisión no bucle é 1, pero pode utilizar outro valor mediante <screen >desde <userinput >ponto inicial</userinput > ate <userinput >ponto final</userinput > pasando <userinput >tamaño do paso</userinput > { ... }</screen ></para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="break"> <title >Sair dun bucle</title> <variablelist> <varlistentry> <term >sair<indexterm ><primary >sair</primary ></indexterm ></term> <listitem ><para ><screen >sair</screen> Termina de imediato esta volta ao bucle e transfere o control á instrución que vai despois del</para ></listitem> </varlistentry> </variablelist> </sect2> <sect2 id="exit"> <title >Deter o sapoconcho</title> <variablelist> <varlistentry> <term >fin<indexterm ><primary >fin</primary ></indexterm ></term> <listitem ><para ><screen >fin</screen> Remata a execución do código.</para ></listitem> </varlistentry> </variablelist> </sect2> </sect1> <sect1 id="learn"> <title >Cree os seus proprios comandos con <quote >define</quote ></title> <para ><userinput >define</userinput ><indexterm ><primary >aprende_a</primary > </indexterm > é un comando moi especial, porque se utiliza para crear novos comandos. O comando que críe pode tomar <glossterm linkend="input-output" >entradas</glossterm > e devolver <glossterm linkend="input-output" >saídas</glossterm >. Vexamos como se cría un comando novo: <screen> define faiCirculo $x { repite 36 { avanza $x xiraesquerda 10 } } </screen > O novo comando chámase <userinput >faiCirculo</userinput >. <userinput >faiCirculo</userinput > toma unha <glossterm linkend="input-output" >entrada</glossterm >, un número, que indica o tamaño do círculo. <userinput >faiCirculo</userinput > non devolve nengún <glossterm linkend="input-output" >resultado</glossterm >. O comando <userinput >faiCirculo</userinput > pode ser utilizado como un comando normal no resto do código. Vexa este exemplo: <screen >define faiCirculo $X { repite 36 { avanza $X xiraesquerda 10 } } vai 200,200 faiCirculo 20 vai 300,300 faiCirculo 40 </screen> </para> <para >No seguinte exemplo, críase un comando que devolve un valor. <screen> reinicia define multiplicarseUnMesmo $n { $resultado = $n * $n devolve $resultado } $i = pergunta "Indique un número e prema en Aceitar" escrebe $i + " multiplicado por si mesmo é: " + multiplicarseUnMesmo $i </screen > Neste exemplo críase un comando novo chamado <userinput >multiplicarseUnMesmo</userinput >. A entrada deste comando é multiplicada por si mesma e logo devólvese o resultado, mediante o comando <anchor id="return"/><userinput >devolve</userinput >. O comando <userinput >devolve</userinput > é a maneira de obter un valor como resultado das funcións que críe. </para> <para >Os comandos poden ter máis dunha <glossterm linkend="input-output" >entrada</glossterm >. No seguinte exemplo, críase un comando que debuxa un rectángulo. <screen> define debuxaRectangulo $X, $Y { avanza $Y xiradereita 90 avanza $X xiradereita 90 avanza $Y xiradereita 90 avanza $X xiradereita 90 } </screen > Agora pode ordenar <userinput >debuxaRectangulo 50,100</userinput > e o sapoconcho debuxará no lenzo un rectángulo. </para> </sect1> </chapter>