bclose

Funciones y enteros

Definiendo funciones y diferentes tipos de enteros

Objetivos

.

 
    • Operar con enteros.
    • Aprender a definir funciones en Arduino.
    • Trabajar el pensamiento lógico ( y algorítmico)
    • Diferentes tipos de enteros en C++.

 

Material requerido.

 

 Tienda EspañaTienda Mexico
Kit Arduino Uno Kit inicio UNOKit inicio UNO
Kit Arduino MEGAKit Inicio MegaKit Inicio Mega

 

La primera función: Calculando si un número es primo

.

Ya hemos comentado antes, que programar es un poco como andar en bici, se aprende  pedaleando y a programar… programando.  Hay que ir aprendiendo la sintaxis del lenguaje, C++ en nuestro caso, pero también aprendiendo a resolver problemas lógicos y partirlos en instrucciones.

Hacer cursos de programación (o de andar en bici) está bien, pero al final hay que ponerse a programar y tener problemas, porque solo teniéndolos y resolviéndolos, solo o con ayuda, se aprende. No se puede aprender a nadar sólo estudiando.

Con un cierto temblor de manos, vamos a centrarnos en esta sesión en algunos ejemplos clásicos de programación, como son el cálculo de números primos para entrenar esta capacidad de búsqueda de algoritmos prácticos para resolver problemas más o menos abstractos y para presentar algunos conceptos adicionales.

 
  • Es importante destacar que no existe una forma única de resolver un problema concreto y que una no tiene porque ser mejor que otra, aunque con frecuencia se aplican criterios de eficiencia o elegancia para seleccionar una solución.
 

Esta sesion va a requerir un esfuerzo un poco mayor que las anteriores porque vamos a empezar a entrenar un musculo poco usado,el cerebro, en una tarea poco frecuente, pensar. Y esto es algo que exige un poco e esfuerzo, pero es necesario para avanzar.

Supongamos que queremos crear un programa que nos devuelva true o false según que el número que le pasamos sea primo o no y a la que podamos llamar varias veces sin copiar el código una y otra vez. La llamaremos Primo () y queremos utilizarla de la siguiente manera: Si el numero n que le pasamos es primo nos tiene que devolver true y en caso contrario que devuelva false, o sea queremos que nos devuelva un valor bool.

Esto es lo que llamamos una función.

En realidad, ya hemos utilizado varias funciones que Arduino trae predefinidas como el Serial.print() o abs() , o Serial.available() y se las reconoce por esa apertura y cierre de paréntesis.

C++ nos ofrece todas las herramientas para crear nuestras propias funciones y es algo muy útil porque nos ayuda a organizar  un problema general en trozos o funciones más pequeñas y más fáciles de manejar.

Para definir una función así, tenemos que declararla primero y describirle a C++ que hacer:

     bool Primo( int x) // int x representa el parámetro que pasaremos a esta función
         {
                Aquí va lo que tiene que hacer
                …………
                return( bool);
         }

Declaramos la función Primo () como bool, o sea va a devolver un valor bool y por eso en algún punto tendremos que usar la instrucción return( true) o return( false) para devolver un resultado a quien la llame. Si devolviera un entero habría que definirla como int Primo( int x).

 
  • Si una función no va a devolver ningún valor, sino que simplemente realiza su trabajo y finaliza sin mas entonces hay que declararla como void (vacía). Ya cononocemos dos funciones así : setup() y loop()
 

Veamos cómo podría ser el código de la función Primo():

     bool Primo( int n)
         {
            for ( int i = 2 ; i <n ; i++)
                {
                   if ( n % i == 0) // Si el resto es 0 entonces es divisible.
                       { 
                          Serial.println ( String(n) +" es divisible por: " + String(i)) ;
                          return(false) ;
                       }
                 }
           return (true) ;
 }

Para saber si un número es o no primo basta con dividirlo por todos los números positivos  menores que él y mayores que 1. En el ejemplo dividimos el número n empezando en 2 y finalizando en n-1.

Si encontramos un valor de i que devuelve resto 0, entonces es divisible (no es primo), devolvemos false con return y volvemos a la intruccion que llamo a la función. Si no hallamos ningún divisor, al finalizar el for devolvemos true y listo. Este es el método de fuerza bruta y sin duda es mejorable pero de momento nos sirve.

Para usar Primo hay que pasarle un entero. Recordad que al definir la función dijimos  bool Primo (int n) donde n representa el valor que queremos probar. Así pues Descargar:

     void loop() // Prog_8_1
          { 
              int x = 427 ; // El número a probar
              bool p = Primo(x);
             if (p )
                 Serial.print( String(x) + " Es primo.") ;
             else
                 Serial.print( String(x) + " No es primo." ) ;
          }

Veamos cuantos primos hay hasta el, digamos 1024, Descargar:

      bool control = true ; // Prog_8_2
      int maximo = 1024 ;

      void loop()
          { 
              if ( control) // Solo es para que no repita una y otra vez lo mismo
                  { 
                       Serial.println( "Los numeros primos hasta el " + String( maximo)) ;
                       for ( int x = 2 ; x < maximo ; x++)
                             { 
                                bool p = Primo(x);
                                if (p ) Serial.println( x) ; // No hay inconveniente en escribirlo seguido
                             }
                  }
              control = false ;
          }

      bool Primo( int n)
          { 
              for ( int i = 2 ; i <n ; i++)
                   { 
                        if ( n % i == 0) // Si el resto es 0 entonces es divisible.
                        return(false) ;
                   }
              return (true) ; // Si llega aqui es que no ha encontrado ningun divisor
          }

Aunque el programa funciona correctamente la salida no es muy presentable( Recordad que nos gusta ser elegantes). Vamos a formatearla. Para ello usaremos el carácter tabulador que se representa como ‘\t’ y una coma después.  Descargar:

     bool control = true ; //Prog_8.3
     int maximo = 1024 ;
     int contador = 1 ;

     void loop()
          {  
              if ( control)             // Solo es para que no repita una y otra vez lo mismo
                   {
                        Serial.println( "Los numeros primos hasta el " + String( maximo)) ;
                        for ( int x = 2 ; x < maximo ; x++)
                              {
                                 if (Primo(x) )
                                    if ( contador++ % 8 == 0)
                                         Serial.println( String(x)+"," ) ;
                                    else
                                         Serial.print( String(x) +","+ '\t') ; 
                              } 
                   }
              control = false ;
          }

Ahora el programa formatea la salida de una forma un poco  más presentable y cómoda de leer.

Salida de consola

 

Para conseguirlo, hemos añadido una coma y un tabulador a cada número excepto a uno de cada 8 que añadimos intro. También tenemosuna línea que conviene comentar:

if ( contador++ % 8 == 0)

Cuando a una variable se le añaden dos símbolos mas al nombre, significa que primero se use su valor actual en la instrucción en curso, ene este caso en el if, y después se incremente en 1 su valor.

Si hubiéramos escrito:

if ( ++contador % 8 == 0)

Querría decir que queremos incrementar su valor antes de utilizarlo. Esta notación es muy habitual en C++ y conviene reconocerla. También podemos usar contador- – y  – -contador para decrementar.

 

El tipo entero

.

Este sería un buen momento para preguntarnos hasta donde podría crecer máximo en el programa anterior. Le asignamos un valor de 1024, pero ¿Tiene un entero límite de tamaño?

La respuesta es afirmativa. Los enteros int en Arduino C++ utilizan 16 bits por lo que el máximo seria en principio 216 = 65.536,  Pero como el tipo int usa signo, su valor está comprendido entre
-32.768 y +32.767.

De hecho en Arduino C++ hay varios tipos de distintos tamaños para manejar enteros: 

TipoDescripciónValor
intEntero con signo, 16 bitsentre -32,768 y 32,767
unsigned intEntero sin signo, 16 bits216 – 1 ; de 0 hasta 65.535
longEntero con signo, 32 bits232 – 1 ,Desde  -2.147.483,648 hasta 2.147.483.647
unsigned longEntero sin signo, 32 bitsDesde 232 – 1 ; 0 a 4.294.967.295
byteEntero sin signo, 8 bits28 de 0 hasta 255

 

Todos estos tipos representan enteros con y sin signo y se pueden utilizar para trabajar con números realmente grandes pero no sin límite.

De hecho C++ tiene la fea costumbre de esperar que nosotros llevemos el cuidado de no pasarnos metiendo un valor que no cabe en una variable. Cuando esto ocurre se le llama desbordamiento (overflow) y C++ ignora olímpicamente el asunto, dando lugar a problemas difíciles de detectar si uno no anda con tiento.

Prueba este a calcular esto en un programa:

int i = 32767 ;
Serial.println ( i+1);

Enseguida veras que si i=32767 y le incrementamos en 1, para C++ el resultado es negativo. Eso es porque sencillamente no controla el desbordamiento. También es ilustrativo probar  el resultado de

int i = 32767 ;
Serial.println (2*   i + 1);

Que según Arduino es -1.

 
  • Esto no es un error, sino que se decidió así en su día y C++ no controla los desbordamientos, así que mucho cuidado, porque este tipo de errores pueden ser muy complicados de detectar

 

Más sobre las funciones en C++

.

 Cuando se declara una función se debe especificar que parámetro va a devolver. Así:

InstrucciónSignifica
int Funcion1()Indica que va a devolver un entero
String Funcion2()Indica que va a devolver un String.
unsigned long Funcion3()Indica que va a devolver un long sin signo
void Funcion4()No va a devolver valores en absoluto

Una función puede devolver cualquier tipo posible en C++, pero sólo puede devolver un único valor mediante la instrucción return(). Expresamente se impide devolver más de un parámetro. Si se requiere esto, existen otras soluciones que iremos viendo.

 
  • Este problema se puede resolver usando variables globales o pasando valores por referencia, y lo trataremos en futuras sesiones.

 

Lo que sí está permitido es pasar varios argumentos a una función:

int Funcion5 ( int x , String s , long y)

Aquí declaramos que vamos a pasar a Funcion5,  tres argumentos en el orden definido, un entero un String y por ultimo un long.

Resumen de la sesión

.

 
    • Hemos definido una función propia para saber si un número es primo.
    • Vimos que el tipo entero tiene un límite de tamaño.
    • Conocimos tipos con mayor y menor capacidad para manejar números enteros mas o menos grandes, pero que todos siguen teniendo un límite de tamaño.
    • El efecto de desbordamiento de tipos es clave y debe ser tenido muy en cuanta cuando operamos con enteros.
    • Hemos ido jugando con problemas lógicos y hemos visto algunas soluciones que os pueden ayudar a plantear las vuestras propias.

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(47) Comments

  • Buenos días, lo primero felicitar por la web y por la tienda.
    Soy nuevo en esto de Arduino. Aunque tengo algunos conocimientos de programación, no en C, estoy intentado aprender este lenguaje y querría hacerte una pregunta, pues estoy algo liado ¿el lenguaje que utiliza es C o C++?. Tengo entendido que tienen algunas diferencias, y por lo que llevo estudiado parece que el que utilizas es C

      • Admin

      Hola JCS,

      C++ es un superset de C y mantiene plena compatibilidad con este. ESo quiere decir que cualquier programa escrito en C correera con un compilador C++ y de hecho ya practicamente no existe el C sino que todos los compiladores son de C++

      Arduino usa el compilador GCC de linux y por eso es C++, pero los comandos e instrucciones que estamos viendo en el curso de inicio no se adentran en las diferencias entre ambos

  • hola ADMIN xfavor me puedes ayudar con un programa que RELLENE UN ARRAY CON ‘N’ NUMEROS Y LUEGO BUSQUE UN NUMERO CONCRETO.
    en funciones y/o clases
    no me sale:

      • Admin

      Hola alfredo,

      Puedes probar algo asi:
      int data[24];
      int diana = 24 ;

      void setup()
      {
      Serial.begin(9600) ;
      for (int i = 0; i <24 ; i++)
      data[i] = 2 * i ;

      }

      void loop()
      {
      Encuentra(diana);
      }

      int Encuentra( int valor)
      {
      for (int i = 0; i <24 ; i++)
      { if (data[i] == valor )
      Serial.println( i ) ;
      }
      }

  • Buenas, tengo una duda, cual es la forma correcta de escribir la funcion bool, lo intente de la siguente manera, pero me manda un mensaje de error

    void setup()
    {
    Serial.begin(9600);
    }

    void loop ()
    {
    bool primo(int n) // se declara la funcion boleana ‘primo’ y a su vez se declara la variable entera ‘n’
    {
    digitalWrite(
    for( int i = 2; i Preferencias.

      • Admin

      podria ser algo asi
      bool primo (int n)
      {
      if (n % 2 == 0)
      return true ;
      else
      return false ;

      }

    • Alber

    Hola no hacia mas que romperme la cabeza para enteder como x pasa a ser n como te comenta arriba , Pelusac el caso es que me he descargado el programa con el error y funciona, quiza adquiera el valor por defecto.

  • Excelente tutorial! se me ha hecho muy facil aprender la programacion para poder lograr distintos objetivos con el arduino. Muchas gracias por todo el conocimiento que entregan. Saludos!

    • David

    Hola amigo. Tengo una duda referente a un proyecto, como se trata de funciones me gustaría ponerla aquí a ver si pudieras ayudarme. Te explico brevemente: en mi programa hay muchas funciones personales, apartes de as principales setup() y loop(). Las funciones son de tipo void, porque no retornan ningún tipo de dato, y se lincan unas a las otras haciendo tareas hasta que uno de los sensores detecta algo y salta a otra funcion programada para realizar las tareas de ese evento, hasta que se activa otro sensor y así hasta llegar a una función final (de seis posibles), que es la que termina el proceso. El caso es que al terminar esta última función, en vez de volver a la función anterior desde la que fué lincada, me gustaría que volviera al loop para volver a iniciar la secuencia de nuevo desde el principio, en busca de los eventos (respuesta de los sensores) que disparen de nuevo la elección de funciones. Creo que con return valdría, pero tendría que ponerlo después de cada salto a la nueva función, es decir, cuando vuelva a ese punto después de completar una función, y así hasta que llegue al primer salto desde el loop para regresar. Mi pregunta es: ¿hay algún modo más elegante de hacerlo?

    Te pongo un pequeño ejemplo de sketch para que se me entienda:

    setup()

    loop()
    si sensor1 detecta algo ve a f1();
    si sensor2 detecta algo ve a f2();
    si sensor3 detecta algo ve a f3();
    si sensor4 detecta algo ve a f4();

    f1()
    hago instrucciones
    si sensor1 detecta algo ve a f5();
    si senso2 detecta algo ve a f6();

    … si no detecta nada sigo haciendo instrucciones
    Si finalizo sin detectar nada, volver a loop (esto lo haría solo, ya que es el primer salto)

    f2()
    hago instrucciones
    si sensor1 detecta algo ve a f10();
    si senso2 detecta algo ve a f11();

    … si no detecta nada sigo haciendo instrucciones
    Si finalizo sin detectar nada, volver a loop (esto lo haría solo, ya que es el primer salto)

    f3()…
    f4()…
    f5()…

    fn()
    hago instrucciones
    si detecto algo en sensor1 voy a ffinal1();
    si no detecto nada sigo haciendo instrucciones
    si finalizo sin detectar nada vuelvo a loop directamente

    ffinal1()
    hago instrucciones
    termino volviendo directamente a loop sin volver desde donde lo dejé en fn();

    Mi pregunta es, es posible volver directamente desde ffinal1() sin tener que recurrir a return justo después de cada función cada vez que linco una función a otra?

    Muchas gracias

      • Admin

      Hola David, Si que hay salidas para saltar a un sitio concretom pero no son nada recomendables por lo feo y ademas mas importante, si saltases directo ignorando los return irias haciendo crecer el satack con direcciones de vuelta sin usar y al final te cascaria el programa si lo hace suficiente numero de veces.

      Es mas seguro que hagas los return para evitar problemas varios

  • he escrito esto y si bien es cierto que ya no me da errores (he desistalado y vuelto a instalar el programa), lo que no me hace ahora es sacar por el monitor serie.

    void setup() {
    Serial.begin(9600);

    }

    void loop() {
    // put your main code here, to run repeatedly:

    }

    bool Primo(int n) //intx representa el parametro que pasaremos a esta función

    {
    for( int i = 2; i<n; i++)
    {
    Serial.println (String(n) + "Es divisible por:" + String(i));
    return(false);
    }
    return(true);
    }

      • Admin

      Fijate Jose, que tienes en blanco el loop (No llama a primo en absoluto) y por eso el programa sencillamente no hace nada

  • Otra duda, cuando creamos estas funciones
    ¿se ponen dentro del void setup?
    ¿se ponen dentro del void loop?
    fuera de estas?

      • Admin

      Las funciones que definimos deben estar fuera de otras funciones y a su misma altura dentro del programa proncipal que el loop y el setup

  • No logro copiar ninguna de las funciones de este capitulo, si las copio me dice esto.

    Arduino:1.6.6 (Windows 7), Placa:”Arduino/Genuino Uno”

    avr-g++: error: missing filename after ‘-o’

    exit status 1
    Error de compilación

    Este informe podría tener más información con
    “Mostrar salida detallada durante la compilación”
    activala desde Archivo > Preferencias

    y si las descargo me pone esto otro:

    Arduino:1.6.6 (Windows 7), Placa:”Arduino/Genuino Uno”

    Prog_8_3:1: error: unterminated comment

    /* —————————————————————-

    ^

    exit status 1
    unterminated comment

    Este informe podría tener más información con
    “Mostrar salida detallada durante la compilación”
    activala desde Archivo > Preferencias

      • Carlos

      Jose Rodriguez es por que hay que agregar esto al código sino parece que no lo toma y no lo compila a mi me paso igual

      void setup
      {

      }
      agrega esto y prueba de nuevo

  • Hola que tal, de antemano gracias por subir estos tutoriales que son de gran ayuda para los que vamos comenzando en programacion arduino.
    Tengo una duda acerca de esta expresion bool p = Primo(x);
    que funcion cumple?

      • Admin

      Hola Sair,
      Esa expresion indica que definimos una variable llamada p del tipo bool y de la misma la usamos para recibir el resultado que devuelve la funcion Primo(x) que naturalmente ha de devolver un valor del mismo tipo bool

    • Juan

    Mil gracias Admin. Soy bastante cateto por lo que se ve ya que no acabo de entenderlo. Intento ir paso a paso sobre lo que hace el programa y no se en que momento le pasamos ese valor que dices. Voy a postear en el foro porque tampoco quiero crear aquí un hilo eterno sobre algo que seguramente todo el mundo entienda.

    Gracias de nuevo por tu paciencia.

    Un saludo

      • Admin

      Juan,. eres bienvenido cuando quieras y te aseguro que todos hemos tenisdo q aprender asi, dale tiempo y veras como las piezas van encajando

    • Juan

    Gracias por la respuesta, pero creo que no me queda claro del todo la verdad. Igual estoy preguntando algo que no tiene mucho sentido.

    En el “for” implementamos una variable “i” cuyo primer valor es 2 y le indicamos que compruebe si dicha variable “i” (osea 2 ahora mismo) es menor que “n”. Si es así que incremente “i” en un 1. Lo que no entiendo es que valor tiene “n”. Es decir ¿”n” vale 2, 4, 82, 114…? ¿dónde indicamos cual es el valor de “n” para que el for pueda hacer la comparación y determinar si es mayor o menor? En el “for” que hay dentro de la función loop() comparas la variable “x” con la variable “maximo” que has definido al principio del programa como int y a la que le has dado un valor de 1024, ahí lo entiendo perfectamente todo. Pero a “n” no le dices en ningún lado que valor tiene y me pierdo.

    Gracias de nuevo y perdona por ser tan pesado.

    Un saludo

      • Admin

      n es simplemente que le pasamos a la funcion primo. CUando entras en la funcion primo esta coge el valor que le envias digamos un dos y se lo asigna a n, y ahora opera con n=2. EN la proxima llamada del for x=3 y llamas a primo(3). Cuando primo entra ve que le pasan un 3 y se lo asigna a n=3 y donde dice n pone un 3 y asi sucesivamente

    • Juan

    Hola. Quería primero agradecer, como todos, el hecho de que compartáis con nosotros vuestros conocimientos de modo altruista.

    Estoy empezando con el curso y por ahora todo marcha razonablemente bien, pero llegado a esta sesión me ha surgido una duda que espero me podáis resolver.

    A la función Primo() le indicamos que le vamos a pasar un número entero “n”. Pero no me queda claro como sabe la función el valor de dicho entero. No se si me explico bien. En el for incrementamos el valor de “i” siempre y cuando éste sea menor que “n”, pero ¿cómo sabe que valor tiene “n”? ¿dónde lo indicamos?

    Gracias por vuestro tiempo y disculpas si la pregunta resulta demasiado obvia, Soy neófito en estas lides.

    Un saludo

      • Admin

      Hola Juan muchos se hacen esa pregunta al principio. Es mas facil, re3cuerda que el ordenador es tonot y por eso le informamos que le vamos a pasar un numero al que genericamente le llamamos n, y le decimos que cuando llamemos a la funcion le pasamos un numero dado, que lo coja y lo llame n, y a partir de ahi cuando hablemos de n, hablamos del numero que le vamos a pasar ¿Mejor o no mucho?

  • Aclarado muchas gracias. Siempre me quedo admirado de la velocidad y precisión de respuesta que tenéis!!
    Me ha surgido otra duda en la misma línea:
    for ( int i = 2 ; i <n ; i++)
    {
    if ( n % i == 0) // Si el resto es 0 entonces es divisible.
    {
    Serial.println ( String(n) +" es divisible por: " + String(i)) ;
    return(false) ;
    }
    }
    return (true) ; ///¿POR QUÉ ESTE return (true) no machaca el anterior?
    yo siempre ponía este "return (true)" antes del "if".

    Gracias de nuevo;)

    • Carlos

    Hola, muchas gracias por este tutorial, esta de coña!!!.
    A mi me queda la duda de que el “for” de la función queda por encima del “if” con lo cual no entiendo como no va machacando los valores que salen para los distintos “i” hasta que “i=n-1” que seria el que marcaría el valor final.
    ¿El “for” se detiene cuando se cumple la condición “if”?
    Espero haberme explicado…
    Gracias de nuevo.

      • Admin

      Hola Carlos,
      El if y el for son independientes y cad auno ejecuta un bloque de codigo(EL codigo contenido entre apertura y cierre de llaves) y no se permite que s eentrecrucen. Por eso el bloque de un if puede contener un for con su bloque y viceversa, ya me diaras q te aprece visto asi

    • Julian

    como no lo ha mencionado nadie debo suponer que soy yo el que no me entero pero he notado que la llamada a la función en el ejemplo 8.1 esta fuera del void loop() y en la explicacion va dentro, y efectivamente si lo complilo asi me da un error

    esto porque es?

    • Daniel

    Hola, lo primero decirte que tus guías me están encantando, lo segundo es si crees que debería apuntarme todo o si me ira mejor con la experiencia y la practica, ya que estoy viendo que cada vez la complejidad de esto sube como la espumo y ya me estoy empezando a asustar

      • Admin

      Hola Daniel,

      Cuando uno empieza a estudiar algo nuevo, todo parece muy cuesta arriba porque son muchos los conceptos que aparecen y porque empiezan a interrelacionarse de formas que al principio , es normal, no pueden entenerse bien. Pero con el tiempo las cosas se van aposentando en tu cerebro y poco a poco todo va cogiendo sentido. Es como aprender a nadar, hay que hacer tantas cosas y sin olvidarse de respirar.

      Tranquilo. Dale tiempo. No anotes nada y deja que las cosas vayan buscando su sitio que poco a poco lo conseguiras

    • Manuel

    Hola, cómo puede ser que se realice esta declaración:

    Const int pinEntradra = A0

    (Estamos metiendo un carácter en un int…)

    Gracias por tu ayuda!!

      • Admin

      Jajajaj, muy bien Manuel te das cuenta de que no parece posible, sis me gusta.
      En realidad A0 (Y A1,A2..A5) son constantes definidas por el entorno ARduino para que sea mas comodo utilizarlas en nuestros programas. Por eso no estas asignando un caracter a un int sino una variable a un int.
      Si haces esto: Serial.println(A0) ;
      Veras que la respuesta es 14, Es un entero de ese valor porque Arduino lo ve como la puerta 14, la siguiente al pin digital 13, y para A1,A2.. los valores son 15,16…
      Un saludo

  • Muy buenas! Poco a poco voy pillandole el tranquilo a esto de programar gracias a tus tutoriales. Aun no acabo de entender muy bien como puedo llamarle a una funcion de fuera desde el void loop.
    Algun ejercicio mas recomendable para hacer de este tipo?
    Muchas graciass!!

      • Admin

      Hola Aitor, cuando defines una funcion fuera del loop puedes usarla sin mas que llamrla por su nombre. Sigue leyendo los tutoriales e iras encontrando multiples ejemplos de esto. UN saludo

      • Admin

      Hola Christian
      Por favor, pasa esta consulta al foro de usuarios para que entre todos te podamos ayudar y nos se carguen los tutoriales con ejemplos de programas y de paso que el resultado pueda servir a los demas tambien
      Muchas gracias y un saludo

    • Pelusac

    Creo que en el segundo código que propones hay un error en el la variable local de la función, donde la variable “n” debería ser “x”. No sé si estaré equivocado.
    Enhorabuena por tan didáctica página.

      • Admin

      Muchas gracias por indicarmelo.
      Tenías razón y espero que ya esté corregido. UN saludo

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login