Concurso de fotografía AM

Temática: «Una panorámica de tu acuario».
Ya esta abierto el plazo para presentar fotografías.

Más info
image01

¿Aún no conoces AMA?

Hazte socio de Acuariofilia Madrid Asociación.
CERRADO EL PLAZO DE INSCRIPCIÓN

Más info
image01

Atlas de peces de AM

¡Hemos alcanzado las 800 fichas! Visita nuestro atlas de peces actualizado.

Más info
image01

Cardúmenes y sociabilidad

Nueva actualización de la tabla con una extensa relación de peces, donde podrás conocer qué entorno necesita cada especie, su sociabilidad y si convive o no en cardumen. ¡Pasa a descubrirla!

Mas info
image01
Programación C desde Cero.
Respuestas: 135    Visitas: 47981
#16
Ok voy poco a poco guardando datos en la memoria.

Con los datos que me estáis dando, he sacado mis conclusiones posiblemente unas mas acertadas que otras.
Hay muchas maneras de declarar una variable y de darle un valor,otra cosa seria saber en que zona ponerla dependiendo lo que quieras hacer con ella:

Código:
void setup() {
int x=5;
{
x=5*x;//pasaria a valer 25
x/2;//(pasaria a valer 12.5)
abs;//¿me daria un resultado de 12 ? o ¿esta mal utilizada la formula abs?
}
x=x+1; // y aquí x valdra (6)  (13.5) (13)? al poner entre llaves la parte anterior del programa ya no se como actuaria

}

void loop() {
  

}

Y como bien comenta Arturo esto se nos sale un poco del tema quizás que os parece abrir un pos con este tipo de ejercicios e intentar sacarlos adelante entre todos
#17
los int son enteros (números sin decimales) y por tanto truncan el resultado de una división:

int x=25/2;//la x vale 12 ya que 12,5 no es un entero(números sin decimales).

PD: Truncar es "redondear" un número sin tener en cuenta lo q hay detrás de la coma 1,99 truncado sería 1.

PD2:El valor absoluto de un número es su valor "positivo" por decirlo de alguna manera, o sea que si el número es 12 su valor absoluto será 12 si es 34,762511 su valor absoluto es 34,762511 pero si el número es -65 el valor absoluto será 65. La función abs(valor) sólo se puede usar con enteros(números sin decimales), por tanto no se podría usar con abs(12.34) aunque esto depende de las librerías[emoji28] así que los que tengan más a mano las librerías que vamos a usar que me corrijan
#18
No sabía que existiera un simulador de arduino. Lo mismo me motiva a romper el hielo con él.

Me voy a quedar por aquí a ver si me ayuda a desoxidar el C/C++ que se encuentra en el fondo del glaciar.

El punto 4 me ha recordado a cuando tuve que programar un TDA fecha para, entre otras cosas, poder calcular el día de la semana de una fecha determinada. Pero lo que propones es mucho más sencillo. Unas cuantas estructuras de control y, aunque sea a lo bruto, se saca. Sin ponerme en faena se me ocurre que transformar las fechas a días julianos podría facilitar las comprobaciones posteriores.
#19

(31-12-2015, 10:06 PM)RoFran escribió: No sabía que existiera un simulador de arduino. Lo mismo me motiva a romper el hielo con él.

Me voy a quedar por aquí a ver si me ayuda a desoxidar el C/C++ que se encuentra en el fondo del glaciar.

El punto 4 me ha recordado a cuando tuve que programar un TDA fecha para, entre otras cosas, poder calcular el día de la semana de una fecha determinada. Pero lo que propones es mucho más sencillo. Unas cuantas estructuras de control y, aunque sea a lo bruto, se saca. Sin ponerme en faena se me ocurre que transformar las fechas a días julianos podría facilitar las comprobaciones posteriores.

Para los signos del zodiaco basta hacer comparaciones de meses y días de meses. Para un mes dado, la duda estará entre dos signos en función de día del mes.
http://www.euroresidentes.com/horoscopos...odiaco.htm

(31-12-2015, 08:28 PM)pedmar escribió: ok entonces.
int solo considera y da como resultado números enteros y en caso de .poner decimales desestima estos, -good.gif
otro detalleBig Grin

Mmmm..., de momento, te digo que eso es así porque ocurre una conversión automática, pero si entramos en el tema de las conversiones de tipos de datos o de las representaciones de los datos entraríamos en temas muy técnicos demasiado pronto.

Si alguna vez necesitas una conversión con redondeo al valor entero más aproximado, usa la función round() que es para eso. La conversión sin más suprime toda la parte decimal.

int x;

x =2.75; // Esto daría el valor 2.
x= round(2.75); // Esto daría el valor 3.
x= round(2.48); // Esto daría el valor 2.
#20
ya he pasado los mensajes correspondientes...
¿quizás falte alguno? o alguna respuesta parezca un poco fuera de lugar, pero he editado algunos mensajes para que tenga la máxima coherencia el hilo.
A seguir aprendiendo...
#21
Buena entrada de año.

P., te has dejado un par de ellos en el post de Aula arduino



Una pista para el ejercicio 4, yo no soy na de horóscopos, pero el signo cambia entre el 20 y el 24 del mes (sin que observe una razón matemática que lo defina) así que en este "caso" habría que controlar el día que es con un "if" dentro de un switch para cada "case" del mes.

Mirar pues la sistaxis y el uso de los bloque condicionales switch/case e if
#22
estoy pensando que para que x pase a cero quizas podriamos hacer algo así?
y luego para que sea el mismo numero en positivo ¿QUEEEEE?

Código:
void setup() {
  int x;
  x=-8;
}
void loop() {

if(x<0);
{
x=x++;
}

//x=//??????:huh:
}

Creo que voy muy desencaminado ademas a la hora de verificar el codigo da fallo-no2.gif

Código:
oid setup() {
  int x;
  x=-8;
  
if(x<0);
{
int  x=x++;
}


}

void loop() {



}

En cambio si lo pongo así si verifica, aunque no sea correcta la manera ¿por que poniendo todo el código en el setup se verifica?
#23
solo tienes que evaluar si la x es menor que 0(negativa), y si pasa, darle el valor opuesto. Intenta hacerlo dentro del setup olvidandote del bucle.
#24
un par de erratas

if(x<0);
{
x=x++;
}

después del paréntesis del if o pones una sentencia y acabas con ; o si abres llaves no hay ;

x++ es un operador nonario ya incrementa el valor de x, no hace falta poner que x=x++ con esto if(x<0) x++; es mas que suficiente.

No estoy totalmente seguro pero if(x<0); es como no poner nada una verificacion que si se cumple no hace nada y si no se cumple tampoco.


el if puesto en el setup, se verifica 1 vez y de cumplirse se incrementa en 1. Si está en loop, cada bucle del loop verifica el if

Para convertir x en positivo

comprobar si x es negativo y si lo es: multiplicarlo por -1 y se convierte en positivo if (x<0) x=-x;
#25
(01-01-2016, 02:09 PM)Aeros escribió: solo tienes que evaluar si la x es menor que 0(negativa), y si pasa, darle el valor opuesto. Intenta hacerlo dentro del setup olvidandote del bucle.

claro si lo facil es sabiendo que es (-) negativo, sumarle el doble en positivo o poner el mismo numero en positivo y ya tengo el valor absoluto, pero lo que quiero es prender a que lo haga arduino,-pardon.gif
(01-01-2016, 02:16 PM)ArturoS escribió: un par de erratas

if(x<0);
{
x=x++;
}

después del paréntesis del if o pones una sentencia y acabas con ; o si abres llaves no hay ;

x++ es un operador nonario ya incrementa el valor de x, no hace falta poner que x=x++ con esto if(x<0) x++; es mas que suficiente.

No estoy totalmente seguro pero if(x<0); es como no poner nada una verificacion que si se cumple no hace nada y si no se cumple tampoco.


el if puesto en el setup, se verifica 1 vez y de cumplirse se incrementa en 1. Si está en loop, cada bucle del loop verifica el if

Para convertir x en positivo

comprobar si x es negativo y si lo es: multiplicarlo por -1 y se convierte en positivo if (x<0) x=-x;
tengo claro que esta no es la manera de conseguir el valor absoluto, pero no entiendo por que en el loop no me verifica.Huh
y tampoco entiendo por que al multiplicar por -1 dejaria de ser negativo para pasar a positivo????
#26
(01-01-2016, 02:46 PM)pedmar escribió:
(01-01-2016, 02:16 PM)ArturoS escribió: comprobar si x es negativo y si lo es: multiplicarlo por -1 y se convierte en positivo if (x<0) x=-x;
tengo claro que esta no es la manera de conseguir el valor absoluto, pero no entiendo por que en el loop no me verifica.Huh
y tampoco entiendo por que al multiplicar por -1 dejaria de ser negativo para pasar a positivo????

¿Lo del loop no te entiendo, no lo hace o no ves que lo hace?

- Si un número se multiplica por -1 cambia de signo SI o SI (es mates)
- Entonces si x es positivo (x>0) ni lo toco
- Pero si x es menor que 0 (x<0) lo multiplico por -1 y el resultado es positivo
#27
Código:
void setup() {
int x;
  x=-8;
  

}

void loop() {

{
  if=(x<0)x++;
}


}


código de error:

Código:
Arduino:1.6.7 (Windows 7), Placa:"Arduino/Genuino Uno"

C:\Users\Pedmar\AppData\Local\Temp\arduino_372d3d06c813346117097ebda771336f\sketch_jan01a.ino: In function 'void loop()':

sketch_jan01a:18: error: expected '(' before '=' token

   if=(x<0)x++;

     ^

exit status 1
expected '(' before '=' token

  Este informe podría tener más información con
  "Mostrar salida detallada durante la compilación"
  activala desde Archivo > Preferencias
#28
(01-01-2016, 12:07 PM)pedmar escribió: ya he pasado los mensajes correspondientes...
¿quizás falte alguno? o alguna respuesta parezca un poco fuera de lugar, pero he editado algunos mensajes para que tenga la máxima coherencia el hilo.
A seguir aprendiendo...

Gracias, yo creo que con eso vale.

Te contesto a tu pregunta relativa a donde es mejor declarar una variable.

Si necesitas usar una variable que va a ser utilizada desde partes muy diferentes del programa hay que declararla como global. De esa forma si dentro de una función quieres acceder a ella para tomar su valor o para actualizarlo con otro valor diferente podrás hacerlo. El compilador sabrá que estás usando la variable global.

Si por el contrario deseas usar una variable que solo tenga sentido dentro de una función, es mejor no hacerla global, salvo que su valor final deba ser recordado la próxima vez que usemos la función.

Voy a intentar concretar lo que acabo de explicar con funciones que ya conocemos.
Ya hemos comentado que en Arduino es obligado usar un par de funciones: setup() y loop().

Por resumir lo que haría Arduino al empezar a ejecutar un programa cargado en su memoria, sería lo siguiente:

1) Arduino crea las variables globales. (Las que se declaran fuera de las funciones.
Estas variables existirán siempre y se pueden usar desde cualquier parte salvo que una variable local con idéntico nombre la oculte). En nuestro ejemplo Cont.

2) Ejecuta la función setup() que solo se ejecutará una vez. Justo al principio de la función setup() se crean las variables que se han declarado dentro de ella (variables locales de setup() ) En nuestro caso se declaró A.

3) Después de ejecutarse todo el código de la función setup(), termina y destruye sus variables locales (ya no se necesitarán nunca más). A se destruye.

4) Empieza a ejecutar loop() y crea sus variables locales. En nuestro caso B.

5) Después de ejecutarse todo el código de la función loop(), termina y destruye sus variables locales (ya no se necesitarán nunca más).

6) El sistema una vez finalizado loop() lo vueleve a ejecutar una y otra vez.

A cada vez que loop() empieza tiene que crear de nuevo sus variables.
Si una variable dentro de loop() debe de conservar su valor, lo que hay que hacer es declarar esa variable fuera como variable global para que no se destruya nunca.


Si declaras una variable dentro de una de ellas, solo podrás usarla dentro de esa función donde se declaró. Por eso se llaman variables locales. La variables locales se crean durante la ejecución del programa en el momento de entrar en la función, y se destruyen cuando se sale de la función.

Este es el comportamiento normal de las variables locales y globales y antes de pasar a explicar como se puede modificar este comportamiento conviene familiarizarse con las formas habituales de usar las variables.

Usar variables globales cuando no son imprescindible no es aconsejable. Además en Arduino no sobra memoria para variables. Si lo metes todo en variables globales usas toda la memoria de una vez. Las variables locales dentro de una función gastan memoria para esas variables cuando estás dentro de la función pero la memoria se recupera al salir de la función.

Pongamos un ejemplo sencillo:
Código:
int Cont=0;

void setup(){
    int A=10;
    Cont=A;
}

void loop(){
     int B=50;
     Cont=Cont+B;
     Serial.println( Cont);
     B=1000;
     delay(3000);
}

Con esto obtenemos lo siguiente:
160
210
260
310
360
410
...

El programa no hace nada demasiado interesante pero tenemos que intentar descifrar lo que hace y por qué. Se pide explicar algunas cuestiones añadiendo comentarios al programa.

Hay tres variables de tipo entero en el programa.
¿Cuales son variables globales y cuales son variables locales?

¿Parece que B=1000 no hace nada. Por qué?
¿Podríamos haber usado A=1000 en su lugar?
#29
ahora una pregunta que no se si tiene mucho sentido:
Las variables que utilizan los módulos, digamos perifericos que se instalan en arduino como: relog ,lcd etc ¿irían antes del setup como variables globales?Huh

tenia esa duda hace tiempo
#30
if=(x<0)x++;

Que hace ese = ahí



Antes del setup se instancian ciertos objetos

y en el setup se inicializan módulos que lo necesiten (como por ejemplo el Serial.begin), pero cada caso tiene sus cosas, no vayas tan deprisa, ya veremos ejemplos en su momento

Usuarios navegando en este tema: 3 invitado(s)


Salto de foro: