PDA

Ver la versión completa : [Ayuda] Duda en C



The_Punisher
28/01/2010, 14:24
# include <stdio.h>
# include <math.h>

int Pedirnum ()
{
int x;
printf("Introduce un numero:");
scanf("%d", &x);
}

void Positivo ()
{
if(x>=0)
printf("Es positivo");
}

void Distinto ()
{ if(x!=0)
printf("%f",1.0/x);
}

void Par ()
{
if(x%2=0)
printf("%f",x/2.0);
}

void Menor ()
{
if(x>=0 && x<10)
printf("Solo tiene un digito");
}

int main ()
{
Pedirnum();
Positivo();
Distinto();
Par();
Menor();
}

Cuál es la manera mas facíl de que al pedir un numero, con la función Pedirnum, ¿pueda usarlo en las demas?

Ya se que dentro de las funciones tengo sin declarar x

Gracias famigos!

juanvvc
28/01/2010, 14:28
La más fácil, declarar x fuera de la función y así todos podrán verla :D



# include <stdio.h>
# include <math.h>

int x;

int Pedirnum ()
{
printf("Introduce un numero:");
scanf("%d", &x);
}

/* resto del archivo */

The_Punisher
28/01/2010, 14:35
Y alguna otra manera, para que no sea una variable global?

CoMiKe
28/01/2010, 14:38
# include <stdio.h>
# include <math.h>

int Pedirnum ()
{
int x;
printf("Introduce un numero:");
scanf("%d", &x);
return x;
}

void Positivo (int x)
{
if(x>=0)
printf("Es positivo");
}

void Distinto (int x)
{ if(x!=0)
printf("%f",1.0/x);
}

void Par (int x)
{
if(x%2=0)
printf("%f",x/2.0);
}

void Menor (int x)
{
if(x>=0 && x<10)
printf("Solo tiene un digito");
}


int main ()
{
int x;
x = Pedirnum();
Positivo(x);
Distinto(x);
Par(x);
Menor(x);
}

otto_xd
28/01/2010, 14:57
Y alguna otra manera, para que no sea una variable global?

variable global = a 0? xDDDD

Como te han puesto, devolviendo el valor.

Si son varios parametros, te tocara pasar por referencia(??), pero vamos, que no es muy dificil.

The_Punisher
28/01/2010, 20:53
Gracias a ambos famigos, la segunda solución la habia planteado, pero se me olvido declarar x ¬¬

O sea tenia esto en el main:

int main ()
{
x = Pedirnum();
Positivo(x);
Distinto(x);
Par(x);
Menor(x);
}

Lo demas todo bien :) gracias!

< - >
Voy a seguir preguntando dudas xD

Porque este codigo muestra por pantalla BCD y no ABCD?



#include <stdio.h>

int main()
{

int valor=2;

valor=valor%3;

switch (valor)
{
case 1: printf("A");
case 2: printf("B");
case 3: printf("C");
default: printf("D");
}
}



Y este no se en que momento sale del bucle :(


#include <stdio.h>

int main()
{

int a=11, b=9, c=15;

while(a>b && ! (c<a))
{
a--;
c--;
printf("%d", a);
}
printf("%d", c);
}

Nathrezim
28/01/2010, 21:05
En el primer problema te faltan los break al final de cada bloque case.


#include <stdio.h>

int main()
{

int valor=2;

valor=valor%3;

switch (valor)
{
case 1: printf("A");
break;
case 2: printf("B");
break;
case 3: printf("C");
break;
default: printf("D");
break;
}
}El bucle para cuando c vale 13 y a vale 9

akualung
28/01/2010, 21:56
¿Estás estudiando programación, The_Punisher? ¿Vas por tu cuenta o estás en un ciclo formativo o academia? Yo hice el ciclo formativo DAI.

PD: Perdona por desviar un poco el hilo ;).

The_Punisher
28/01/2010, 23:07
En el primer problema te faltan los break al final de cada bloque case.


#include <stdio.h>

int main()
{

int valor=2;

valor=valor%3;

switch (valor)
{
case 1: printf("A");
break;
case 2: printf("B");
break;
case 3: printf("C");
break;
default: printf("D");
break;
}
}El bucle para cuando c vale 13 y a vale 9


Ya se lo que falta xD precisamente nos ponen errores a drede, y por lo que estudie ejecuta todos los case si no encuentra un break, por eso pregunto porque no muestra A.

Estoy estudiando ing tecnica electronica, y tengo una pequeña asigantura de fundamentos informaticos, y uan anual de informatica industrial, curiosamente aprobe la anual y ahroa tengo que aprobar esta LOL

Nathrezim
28/01/2010, 23:20
Ya se lo que falta xD precisamente nos ponen errores a drede, y por lo que estudie ejecuta todos los case si no encuentra un break, por eso pregunto porque no muestra A.

Estoy estudiando ing tecnica electronica, y tengo una pequeña asigantura de fundamentos informaticos, y uan anual de informatica industrial, curiosamente aprobe la anual y ahroa tengo que aprobar esta LOL

No, no se ejecutan todos los case si no se pone un break, se ejecutan todos los case que van después del case que se cumple.

swapd0
29/01/2010, 00:06
Ademas valor=2, despues haces valor = valor % 3, (modulo, resto de la division entera) asi que valor se queda en 2, por eso no se ejecuta el 1.

miq01
29/01/2010, 00:11
Ya se lo que falta xD precisamente nos ponen errores a drede, y por lo que estudie ejecuta todos los case si no encuentra un break, por eso pregunto porque no muestra A.
No muestra A porque valor vale 2 y por lo tanto el "case 1" no se cumple.

< - >
También es posible que lo que dice swapd0 sea cierto... xD

The_Punisher
29/01/2010, 00:26
No sabia que si a era menor que b no se ejecutaba a%b, gracias!!!!
A ver si me explicáis el otro bucle, la parte de la condición después de !&&

PharaOnyx
29/01/2010, 00:32
No sabia que si a era menor que b no se ejecutaba a%b, gracias!!!!
A ver si me explicáis el otro bucle, la parte de la condición después de !&&
¿Y qué necesitas saber?. ¿Lo que significa !(c<a)?

Saludos, Alex

hardyx
29/01/2010, 00:33
No sabia que si a era menor que b no se ejecutaba a%b, gracias!!!!
No hombre, es lo que dice swap0. No se ejecuta el "A", porque 2 % 3 es 2 (resto de 2 / 3). Y entra directamente al case 2, pero como no tienen "break" pues ejecuta todos los printf que siguen.

El otro bucle es así:
while (a>b && ! (c<a))

En vez de decirte la respuesta, vamos a ver lo qué hace para aprender:
El bucle se ejecuta mientras (a sea > b) y NO (c < a). O sea: mientras (a > b) y (c >= a). Dentro del bucle se resta uno al valor de "a" y de "c" en cada iteración. Ahora con lápiz y un papel y escribes los valores iniciales y a cada vuelta del bucle en una línea. Cuando se cumplan las dos condiciones saldrá.

Nathrezim
29/01/2010, 00:36
No sabia que si a era menor que b no se ejecutaba a%b, gracias!!!!
A ver si me explicáis el otro bucle, la parte de la condición después de !&&

Sí se ejecuta a%b, lo que pasa es que el resultado no cambia, es lo que tiene la aritmética modular.

Y respecto del bucle la condición después del and va a ser siempre verdadera, ya que a siempre va a ser menor que c, con lo cual el bucle deja de ejecutarse cuando la condición anterior al and pasa a ser falsa.

The_Punisher
29/01/2010, 00:39
Esto while(a>b && ! (c<a)) es hazlo mientras a sea mayor que b y distinto de c menor que a ¿no?

Pues a mi entonces no entiendo porque sale 10 9 y 13.

< - >

Sí se ejecuta a%b, lo que pasa es que el resultado no cambia, es lo que tiene la aritmética modular.

Y respecto del bucle la condición después del and va a ser siempre verdadera, ya que a siempre va a ser menor que c, con lo cual el bucle deja de ejecutarse cuando la condición anterior al and pasa a ser falsa.

Gracias me acabo de dar cuenta ahora mismo xD


Gracias a todos, solo tenia esas dudas, muchas gracias de verdad, mañana os cuento como me fue por el examen :)

PharaOnyx
29/01/2010, 00:40
Esto while(a>b && ! (c<a)) es hazlo mientras a sea mayor que b y distinto de c menor que a ¿no?
Si no ha cambiado C desde la última vez que compilé, el ! significa 'no', es decir, !(c<a) es equivalente a (c>=a)

Saludos, Alex

akualung
29/01/2010, 00:42
Esto while(a>b && ! (c<a)) es hazlo mientras a sea mayor que b y distinto de c menor que a ¿no?

Pues a mi entonces no entiendo porque sale 10 9 y 13.

Más que <<distinto de "c menor que a">> yo lo expresaría en plan <<y "c menor que a" sea falso>> (o sea, la condición será considerada como cierta mientras que "c menor que a" sea falsa. Usar lógica negativa es un pvto cacao y lleva mucho a errores).

A mayor que B and not (C menor que A), sería exactamente lo que dice ese condicional.

Jeje, veo que PharaOnyx se me ha adelantado. Pues eso, es exactamente como él lo dice. En mi escuela nos dijeron que siempre que podamos evitemos usar lógica negativa, que sólo marea la perdiz y hace el código más dificil de seguir salvo en casos muy puntuales que ahora mismo no me vienen a la cabeza. yo creo que el NOT solo se inventó para ponerlo en los exámenes de seguimiento de código y hacer la vida imposible a los alumnos, porque si no no me explico para qué lo crearon.

PharaOnyx
29/01/2010, 00:48
Jeje, veo que PharaOnyx se me ha adelantado. Pues eso, es exactamente como él lo dice. En mi escuela nos dijeron que siempre que podamos evitemos usar lógica negativa, que sólo marea la perdiz y hace el código más dificil de seguir salvo en casos muy puntuales que ahora mismo no me vienen a la cabeza.
A mí me enseñaron que la negación sólo se usa o cuando está claro en el código (en plan if !existe() o similares) o para comparar, vamos, el != de toda la vida. Quizás por eso The_Punisher andaba despistadillo y confundió los dos operadores, por eso lo de 'distintos'

Saludos, Alex