Discussion:
No lo entiendo :-( [AYUDA]
(demasiado antiguo para responder)
Kenzo-Xs
2003-09-11 11:11:32 UTC
Permalink
Miara que lo miro por todos lados y nada , no lo pillo (seguro es mi culpa)
Me preguntan que resultado escribe el programa y lo hago en el turbo c y me
da que escribe "30" pero no se porque
-----------------------------------------
#include <stdio.h>

int s,i,j;
int n=3;

void main(){

s=0;
for (i=1;i<n;i++){ se supone que es 1,2,...hasta que i<n
for (j=4;j>0;j--) lo mismo de 4,3,2,1 y para
s=s+i*j; Se supone que da s=0+1*4
n=n-j; Y aqui n=3-4
}
printf("%i",s);
}
-----------------------------------------

Pues eso , que al darme n=-1 se me rompe el programa y no me da 30 como
deberia dar
Que estoy haciendo mal?????
Lo siento , se que debe de ser una tonteria basica de todo pero no lo pillo

Saludos y gracias
Fernando Arbeiza
2003-09-11 12:14:10 UTC
Permalink
Hola:

Veamos...
Post by Kenzo-Xs
#include <stdio.h>
int s,i,j;
int n=3;
¿Globales? No necesitas variables globales, así que lo mejor es
declararlas dentro de main.
Post by Kenzo-Xs
void main(){
No, main no debe devolver void. El valor más portable es int, así que
deberías acostumbrarte a que devuelva int.

Bueno, no sé qué te puede pasar, porque yo lo he compilado y me da el
resultado que me tiene que dar. Te incluyo el programa que yo he
utilizado; lo he reorganizado un poquito porque creo que se ven mejor
las cosas. Creo que si lo compilas y ejecutas puede ayudarte a verlo
mejor.

/******************/
#include <stdio.h>

int main(void) {
int s, i, j;
int n = 3;

s = 0;
for (i = 1; i < n; i++) {
printf("i = %i\n", i);
for (j = 4;j > 0; j--) {
s = s + i * j;
printf(" j = %i\n", j);
printf(" s = %i\n", s);
}
n = n - j;
printf("n = %i\n\n", n);
}

printf("s = %i\n", s);

return 0;
}
/* Fin de Fichero */
/******************/

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Kenzo-Xs
2003-09-11 12:46:31 UTC
Permalink
rspondo abajo en el programa
Post by Fernando Arbeiza
Veamos...
Post by Kenzo-Xs
#include <stdio.h>
int s,i,j;
int n=3;
¿Globales? No necesitas variables globales, así que lo mejor es
declararlas dentro de main.
Post by Kenzo-Xs
void main(){
No, main no debe devolver void. El valor más portable es int, así que
deberías acostumbrarte a que devuelva int.
Bueno, no sé qué te puede pasar, porque yo lo he compilado y me da el
resultado que me tiene que dar. Te incluyo el programa que yo he
utilizado; lo he reorganizado un poquito porque creo que se ven mejor
las cosas. Creo que si lo compilas y ejecutas puede ayudarte a verlo
mejor.
/******************/
#include <stdio.h>
int main(void) {
int s, i, j;
int n = 3;
s = 0;
for (i = 1; i < n; i++) {
printf("i = %i\n", i);
for (j = 4;j > 0; j--) {
s = s + i * j;
printf(" j = %i\n", j);
printf(" s = %i\n", s);
}
n = n - j;
Pero la funcion n = n - j; no esta dentro del {} del for en mi programa?
No afecta?
Porque no cambia el valor de n?
Asi como lo pones tu si lo pillo , ya que esta fuera del for y no le afecta
el cambio de la j pero yo lo que veo es que cambia de la forma n=3-4
Post by Fernando Arbeiza
printf("n = %i\n\n", n);
}
printf("s = %i\n", s);
return 0;
}
/* Fin de Fichero */
/******************/
Un saludo.
Saludos y gracias
Post by Fernando Arbeiza
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fernando Arbeiza
2003-09-11 18:14:48 UTC
Permalink
Una cosa.
Post by Kenzo-Xs
el cambio de la j pero yo lo que veo es que cambia de la forma n=3-4
La cosa es que el bucle es así:

for (j = 4;j > 0; j--) {
s = s + i * j;
}
n = n - j;

luego j en el for toma los valores 4, 3, 2, 1 y 0 (que es cuando sale
del bucle). Es decir, que cuando no se cumple la condición y sale del
bucle j tiene el valor 0; luego n = 3 - 0;

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Kenzo-Xs
2003-09-11 18:41:32 UTC
Permalink
Muchas gracias , entendido
Post by Fernando Arbeiza
Una cosa.
Post by Kenzo-Xs
el cambio de la j pero yo lo que veo es que cambia de la forma n=3-4
for (j = 4;j > 0; j--) {
s = s + i * j;
}
n = n - j;
luego j en el for toma los valores 4, 3, 2, 1 y 0 (que es cuando sale
del bucle). Es decir, que cuando no se cumple la condición y sale del
bucle j tiene el valor 0; luego n = 3 - 0;
Un saludo.
--
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Bartomeu
2003-09-11 12:19:58 UTC
Permalink
Post by Kenzo-Xs
Miara que lo miro por todos lados y nada , no lo pillo (seguro es mi
culpa) Me preguntan que resultado escribe el programa y lo hago en
el turbo c y me da que escribe "30" pero no se porque
-----------------------------------------
#include <stdio.h>
int s,i,j;
int n=3;
void main(){
s=0;
for (i=1;i<n;i++){ se supone que es 1,2,...hasta que i<n
No es HASTA que i<n, es MIENTRAS que i<n
Post by Kenzo-Xs
for (j=4;j>0;j--) lo mismo de 4,3,2,1 y para
s=s+i*j; Se supone que da s=0+1*4
n=n-j; Y aqui n=3-4
Si no te has dejado ninguna llave, aquí j vale cero, y por lo tanto n = 3-0.
'n' no varía.
Post by Kenzo-Xs
}
printf("%i",s);
}
Por lo tanto s = 30 = 1*4 + 1*3 + 1*2 + 1*1 + 2*4 + 2*3 + 2*2 + 2*1
Post by Kenzo-Xs
-----------------------------------------
Pues eso , que al darme n=-1 se me rompe el programa y no me da 30
como deberia dar
Que estoy haciendo mal?????
Lo siento , se que debe de ser una tonteria basica de todo pero no lo pillo
Saludos y gracias
Kenzo-Xs
2003-09-11 12:48:59 UTC
Permalink
Post by Bartomeu
Post by Kenzo-Xs
Miara que lo miro por todos lados y nada , no lo pillo (seguro es mi
culpa) Me preguntan que resultado escribe el programa y lo hago en
el turbo c y me da que escribe "30" pero no se porque
-----------------------------------------
#include <stdio.h>
int s,i,j;
int n=3;
void main(){
s=0;
for (i=1;i<n;i++){ se supone que es 1,2,...hasta que i<n
No es HASTA que i<n, es MIENTRAS que i<n
Si tienes razon , culpa mea
Post by Bartomeu
Post by Kenzo-Xs
for (j=4;j>0;j--) lo mismo de 4,3,2,1 y para
s=s+i*j; Se supone que da s=0+1*4
n=n-j; Y aqui n=3-4
Si no te has dejado ninguna llave, aquí j vale cero, y por lo tanto n = 3-0.
'n' no varía.
Pero no le afecta el cambio de for (j=4;j>0;j--) ?????
Por que ????
Lo siento , seguro es una tonteria pero no lo pillo
Post by Bartomeu
Post by Kenzo-Xs
}
printf("%i",s);
}
Por lo tanto s = 30 = 1*4 + 1*3 + 1*2 + 1*1 + 2*4 + 2*3 + 2*2 + 2*1
Post by Kenzo-Xs
-----------------------------------------
Pues eso , que al darme n=-1 se me rompe el programa y no me da 30
como deberia dar
Que estoy haciendo mal?????
Lo siento , se que debe de ser una tonteria basica de todo pero no lo pillo
Saludos y gracias
Bartomeu
2003-09-11 13:29:12 UTC
Permalink
Post by Kenzo-Xs
Post by Bartomeu
[...]
Post by Kenzo-Xs
for (j=4;j>0;j--) lo mismo de 4,3,2,1 y para
s=s+i*j; Se supone que da s=0+1*4
n=n-j; Y aqui n=3-4
Si no te has dejado ninguna llave, aquí j vale cero, y por lo tanto
n = 3-0. 'n' no varía.
Pero no le afecta el cambio de for (j=4;j>0;j--) ?????
Por que ????
Lo siento , seguro es una tonteria pero no lo pillo
Por definición el for sólo afecta a UNA instrucción, la siguiente. Si
quieres que afecte a varias instrucciones las debes cerrar entre llaves para
que se comporten como UNA multi-instrucción. La terminología no es muy
ortodoxa, pero creo que se entiende ;-)

Mientras no lo tengas muy claro y cojas soltura, te recomiendo que pongas
siempre llaves:
for (j=4; j>0; j--) {
s=s+i*j;
}
n=n-j;

Para ver si lo has entendido, leete el siguiente código, a ver si pillas el
sentido de que el for solo afecta a UNA instrucción ;-)):

#include <stdio.h>

int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--);
s=s+j;
printf("s=%i",s);
}

¿Cuanto vale s? . Si haces un copiar&pegar te debería dar 's=0'.
Kenzo-Xs
2003-09-11 15:39:53 UTC
Permalink
:-((((((( BUAAAAAAAA

No lo pillo , dios , pero mira que debe de ser lerdo , lo siento , seguro
que tu esplicaicon es magnifica pero yo , no se , o me ha ido la vista a
peor o no lo veo
Estoy nervioso , con dolor de cabeza, me duele el estomago (y he comido
normal)

a ver te contesto abajo |
Post by Bartomeu
Post by Kenzo-Xs
Post by Bartomeu
[...]
Post by Kenzo-Xs
for (j=4;j>0;j--) lo mismo de 4,3,2,1 y para
s=s+i*j; Se supone que da s=0+1*4
n=n-j; Y aqui n=3-4
Si no te has dejado ninguna llave, aquí j vale cero, y por lo tanto
n = 3-0. 'n' no varía.
Pero no le afecta el cambio de for (j=4;j>0;j--) ?????
Por que ????
Lo siento , seguro es una tonteria pero no lo pillo
Por definición el for sólo afecta a UNA instrucción, la siguiente. Si
quieres que afecte a varias instrucciones las debes cerrar entre llaves para
que se comporten como UNA multi-instrucción. La terminología no es muy
ortodoxa, pero creo que se entiende ;-)
Mientras no lo tengas muy claro y cojas soltura, te recomiendo que pongas
for (j=4; j>0; j--) {
s=s+i*j;
}
n=n-j;
Para ver si lo has entendido, leete el siguiente código, a ver si pillas el
#include <stdio.h>
int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--);
Vamos a ver , pero aqui la j no pilla ningun valor , es que a mi lo que se
me ocurre es que valga 4 y se sume a la s que vale 0 , aprte me dices que el
for solo afecta a la primera instruccion , osea que para mi es a s=s+j; y j
para mi vale 4
Post by Bartomeu
s=s+j;
printf("s=%i",s);
}
¿Cuanto vale s? . Si haces un copiar&pegar te debería dar 's=0'.
Lo siento , ya lo he comprobado y si es asi como dices, debo de ser un
pesado , pero no lo pillo
Bartomeu
2003-09-11 17:44:03 UTC
Permalink
Post by Kenzo-Xs
:-((((((( BUAAAAAAAA
[...]
Post by Kenzo-Xs
#include <stdio.h>
int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--);
Vamos a ver , pero aqui la j no pilla ningun valor , es que a mi lo
que se me ocurre es que valga 4 y se sume a la s que vale 0 , aprte
me dices que el for solo afecta a la primera instruccion , osea que
para mi es a s=s+j; y j para mi vale 4
Post by Kenzo-Xs
s=s+j;
printf("s=%i",s);
}
¿Cuanto vale s? . Si haces un copiar&pegar te debería dar 's=0'.
Lo siento , ya lo he comprobado y si es asi como dices, debo de ser
un pesado , pero no lo pillo
Perdona la putada. ;-)

Date cuenta del detalle que después de cerrar el parentesis del for hay un
punto y coma..., entonces es un for que ejecuta UNA instrucción NULA.

Normalmente se trata de un error mecanográfico que todos cometemos tarde o
temprano, y que al repasar el código no vemos ya que sólo vemos la
identación de la siguiente instrucción y no vemos el punto y coma del for.

En este ejemplo el for lo único que hace es decrementar el valor de j hasta
cero, pero no suma nada. La suma esta fuera del for. Es un for vacio.

PD.: Te recomiendo que si alguna vez debes utilizar un for vacio pongas la
instrucción nula de manera explícita, por ejemplo:
#include <stdio.h>
int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--) NULL;
s=s+j;
printf("s=%i",s);
}
El compilador ya se encargará de quitar el NULL y generará un programa tan
eficiente como el anterior. Y tú, cuando repases el código, verás más claro
que no es un error mecanográfico, que está hecho expresamente.
Kenzo-Xs
2003-09-11 17:53:01 UTC
Permalink
Ok , entiendo ahora , osea si hay un ; detras del for ya no hace nada , es
como si no estuviera

Saludos y gracias
Post by Bartomeu
Post by Kenzo-Xs
:-((((((( BUAAAAAAAA
[...]
Post by Kenzo-Xs
#include <stdio.h>
int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--);
Vamos a ver , pero aqui la j no pilla ningun valor , es que a mi lo
que se me ocurre es que valga 4 y se sume a la s que vale 0 , aprte
me dices que el for solo afecta a la primera instruccion , osea que
para mi es a s=s+j; y j para mi vale 4
Post by Kenzo-Xs
s=s+j;
printf("s=%i",s);
}
¿Cuanto vale s? . Si haces un copiar&pegar te debería dar 's=0'.
Lo siento , ya lo he comprobado y si es asi como dices, debo de ser
un pesado , pero no lo pillo
Perdona la putada. ;-)
Date cuenta del detalle que después de cerrar el parentesis del for hay un
punto y coma..., entonces es un for que ejecuta UNA instrucción NULA.
Normalmente se trata de un error mecanográfico que todos cometemos tarde o
temprano, y que al repasar el código no vemos ya que sólo vemos la
identación de la siguiente instrucción y no vemos el punto y coma del for.
En este ejemplo el for lo único que hace es decrementar el valor de j hasta
cero, pero no suma nada. La suma esta fuera del for. Es un for vacio.
PD.: Te recomiendo que si alguna vez debes utilizar un for vacio pongas la
#include <stdio.h>
int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--) NULL;
s=s+j;
printf("s=%i",s);
}
El compilador ya se encargará de quitar el NULL y generará un programa tan
eficiente como el anterior. Y tú, cuando repases el código, verás más claro
que no es un error mecanográfico, que está hecho expresamente.
Bartomeu
2003-09-11 17:59:31 UTC
Permalink
Post by Kenzo-Xs
Ok , entiendo ahora , osea si hay un ; detras del for ya no hace
nada , es como si no estuviera
Saludos y gracias
No exactamente. No se hace nada DENTRO del for, pero el for si que hace
cosas, en este caso decrementar la j.
Kenzo-Xs
2003-09-11 18:16:53 UTC
Permalink
Entonces lo que pasa es que la j hace 4,3,2,1,0 y se queda en 0 y ese es el
valor que ejecuta en la s=s+j;
Post by Bartomeu
Post by Kenzo-Xs
Ok , entiendo ahora , osea si hay un ; detras del for ya no hace
nada , es como si no estuviera
Saludos y gracias
No exactamente. No se hace nada DENTRO del for, pero el for si que hace
cosas, en este caso decrementar la j.
Fernando Arbeiza
2003-09-11 18:11:12 UTC
Permalink
Post by Kenzo-Xs
Ok , entiendo ahora , osea si hay un ; detras del for ya no hace nada , es
como si no estuviera
Veamos, la cosa es que la sintaxis de for es así:

for (expresión; expresión; expresión) sentencia

Pero sentencia puede ser:

* La sentencia nula. Es decir:
;

* Una sentencia simple. Ej:
s = s + i * j;

* Una sentencia compuesta (formada por varias sentencias simples
entre {}). Ej:
{
s = s + i * j;
n = n - j;
}

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Kenzo-Xs
2003-09-11 18:41:50 UTC
Permalink
ok gracias
Post by Fernando Arbeiza
Post by Kenzo-Xs
Ok , entiendo ahora , osea si hay un ; detras del for ya no hace nada , es
como si no estuviera
for (expresión; expresión; expresión) sentencia
;
s = s + i * j;
* Una sentencia compuesta (formada por varias sentencias simples
{
s = s + i * j;
n = n - j;
}
Un saludo.
--
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Julián Albo
2003-09-11 18:10:32 UTC
Permalink
Post by Bartomeu
PD.: Te recomiendo que si alguna vez debes utilizar un for vacio pongas la
#include <stdio.h>
int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--) NULL;
s=s+j;
printf("s=%i",s);
}
El compilador ya se encargará de quitar el NULL y generará un programa tan
Pero algunos compiladores dan un feo warning. Una alternativa que no da
warnings es:

for (j= 4; j > 0; j--) continue;

Salu2
Bartomeu
2003-09-11 22:32:16 UTC
Permalink
Post by Julián Albo
Post by Bartomeu
PD.: Te recomiendo que si alguna vez debes utilizar un for vacio
#include <stdio.h>
int main(void) {
int j,s;
s=0;
for (j=4; j>0; j--) NULL;
s=s+j;
printf("s=%i",s);
}
El compilador ya se encargará de quitar el NULL y generará un programa tan
Pero algunos compiladores dan un feo warning. Una alternativa que no
for (j= 4; j > 0; j--) continue;
Salu2
Tomo nota para cuando tenga un warning. Siempre se aprende algo nuevo.
Gracias.

Loading...