Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: oq.JULIO.po en 25 Abril 2018, 06:40 am



Título: Ayuda con sintaxis For
Publicado por: oq.JULIO.po en 25 Abril 2018, 06:40 am
Hola!, tengo que hacer un programa que sume los múltiplos de 3 que haya contenidos en un número dado por el usuario.
Si digito un 9 la suma de sus múltiplos debería dar 3+6+9=18

Lo que pasa es que no sé si estoy ingresando bien la sintaxis del for...

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4.  
  5. {
  6.  
  7. int n,suma;
  8.  
  9. do {
  10.  
  11. printf("Ingrese un numero igual o mayor que 3...");
  12. scanf("%d",&n);
  13.  
  14. } while(n<=3);
  15.  
  16. suma=0;
  17.  
  18.  
  19. for (n==n;n==3;n-=1)
  20. {
  21. if(n%3==0)
  22. {
  23. suma+=n;
  24.  
  25.  
  26.  
  27. }
  28. else (n!=3);{ n-=1;}
  29.  
  30. }
  31.  
  32. printf("La suma de los multiplos de 3 es : %d", suma);
  33. return 0;
  34. }
  35.  


· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Ayuda con sintaxis For
Publicado por: engel lex en 25 Abril 2018, 06:56 am
primero que nada
Código:
n==n

no hace nada... eso es una comparación que retorna verdadero

por otro lado, el for se ejecutará siempre y cuando

Código:
n==3

es decir, si n no es 3 no funciona...

te recomiendo la forma de hacer esto mejor es

Código:
for(;n%3==0;n/=3){
    suma es suma mas n  
}

puede ser una forma extrana XD pero tiene sentido...

primero, no hay primer valor en el for porque no importa..., el for se repetirá siempre que n sea multiplo de 3 (implica que tiene multiplos de 3) y avanzará dividiendo n entre 3 XD

pruebalo bien XD es de madrugada no he dormido bien y lo hice sin probar XD

por cierto... no resto 1 o busco valores porque por teoría de matemática los productos son comutativos... así que no importa el orden de los factores el producto es igual... es decir... 2*3*3*7*11 se podrá dividir entre cualquiera de sus factores sin importar como fue multiplicado


Título: Re: Ayuda con sintaxis For
Publicado por: JPS en 26 Abril 2018, 00:37 am
Yo tb soy nuevo en esto.

Por lo poco que sé el for se utiliza para recorrer intervalos usando ciclos, de 0 a n (ascendente), o de n a 0 (descendente). Estos intervalos se pueden recorrer de ciclo a ciclo con i++ o i-- o la progresión que le quieras poner(x+=2 para ir saltando de dos en dos por ejemplo), sea ascendente o descendente según el propósito que le quieras dar.

Por ejemplo de 0 a n (ascendente) sería así, siendo n=5:
Código:
...
for (int i=0;i<=5;i++) {printf("Ciclo %i\n",i);
...
Imprimiría 5 ciclos empezando desde cero:
...
Ciclo 0
Ciclo 1
Ciclo 2
Ciclo 3
Ciclo 4
...

3 a n (descendente) sería así, siendo n=-5:
Código:
...
for (int i=3;i>=-5;i--) {printf("Ciclo %i\n",i);
...
Imprimiría 8 ciclos empezando desde 3:
...
Ciclo 3
Ciclo 2
Ciclo 1
Ciclo 0
Ciclo -1
Ciclo -2
Ciclo -3
Ciclo -4
...

Para el uso de vectores se usa un for desde 0 (principio del vector) hasta n (final del vector).

Para el uso de matrices se usan dos for anidados. Uno usa i para recorrer el intervalo de las filas (primera dimension (un simple vector)) y el otro usa j para recorrer el intervalo de las columnas (segunda dimensión).


te aconsejo ver este curso en youtube: https://www.youtube.com/watch?v=hZXFl4n6854&list=PLWtYZ2ejMVJmUTNE2QVaCd1y_6GslOeZ6&index=33

Ánimo, no desesperes y si ves que algo se te olvida anótalo en una libreta.


Título: Re: Ayuda con sintaxis For
Publicado por: oq.JULIO.po en 26 Abril 2018, 02:28 am
Okok muchas gracias a ambos, y si quisiera que se inicializara desde el valor de la variable "n" dada por el usuario,y termine hasta que sea igual a 3?


Título: Re: Ayuda con sintaxis For
Publicado por: dijsktra en 27 Abril 2018, 14:57 pm
Hola!

... que haya contenidos en un número dado por el usuario.
Si digito un 9 la suma de sus múltiplos debería dar 3+6+9=18

Yo diría mejor

 contenidos en un rango empezando desde 3 hasta un número (mayor o igual que 3) dado por el usuario.


La sintaxis de la instrucción de control "for", a no dudarlo, una de las señales más características del lenguaje C, sobretodo porque es tan versátil que su expresividad es equivalente a la de la instrucción "while"...
Esto no era así en otros lenguajes de su época, como el mítico Pascal, en el que se usaba como azucar sintáctico de una construcción while particular (donde había una variable  contadora "n", que se comparaba contra una expresión "n=e(...)" y se incrementaba o disminuía  en un valor constante 1,2...)

Tiene 4 partes
Código
  1. for (init; B ; step) body
que vienen a coincidir con lo que en algoritmia clásica se conoce como

  • init : donde se dan valores a las variables al principio
  • B : guarda que determina cuándo termina su ejecución. (Después del init y del step en segundas vueltas)
  • step : incremento de variable, para que el bucle progrese hacia su terminación (después del body)
  • body: aproxima el cómputo parcial a la solución definitivadespues de evaluar la guarda y antes de step

En el cuerpo del bucle pueden aparecer instrucciones como break; o continue, y aunque muy útiles en programación se sistemas y en el mundo real, en algoritmia clásica son el "patito feo" que rompe la llamada "programación estructurada" o "composicional"... Pero esto es otro tema aparte..... C no fue hecho para estudiar algoritmia, sino para la programación de sistemas operativos, y es ahí donde encuentran todo su valor...


Ahi va una solución a tu problema.
Los comentarios tienen más importancia en cursos avanzados de algoritmia. Por el momento fífate en la rutina mult3. Después intenta programarla en sentido descendente (con nn--...)


Código
  1. #include <stdio.h>
  2. #include <assert.h>
  3.  
  4.  
  5. /*
  6.   P : M >= 3
  7.   Q : c = sum i : 3 <= i <= M and (i%3==0) : i
  8.  
  9.   I : Q[M/n] and 3 <= n <= M
  10.   B : n < M
  11.  
  12.   Quota (n) = M - n >= 0
  13.   Step : n = n + 1
  14.   Restore : c = c + (n+1)*\chi((n+1)%3==0)
  15.  
  16. */
  17.  
  18. #define DEBUG
  19.  
  20. unsigned int mult3(const unsigned int N)
  21. {
  22.  assert(N>=3);
  23.  unsigned int n,c;
  24. #ifdef DEBUG
  25.      printf("%d ",3);
  26. #endif
  27.  for(n=c=3;n<N;n++)
  28.    {
  29.      if (((n+1)%3==0)) c+=(n+1);
  30. #ifdef DEBUG
  31.      if ((n+1)%3==0) printf("%d ",n+1);
  32. #endif
  33.    }
  34.  return c;
  35. }
  36.  
  37.  
  38.  
  39. int main()
  40. {
  41.  unsigned int M;
  42.  int e;
  43.  for ( ; (e=scanf("%u",&M))==1;)
  44.    printf(" --> %u\n",mult3(M));
  45.  if (e!=EOF)
  46.    {
  47.      printf("Not a integer");
  48.      return -1;
  49.    }
  50.  return 0;
  51. }
  52.  
  53.  
  54.  


La salida que da el programa es:

Código:
3
3  --> 3
4
3  --> 3
5
3  --> 3
6
3 6  --> 9
7
3 6  --> 9
8
3 6  --> 9
9
3 6 9  --> 18
10
3 6 9  --> 18






Título: Re: Ayuda con sintaxis For
Publicado por: dijsktra en 27 Abril 2018, 22:58 pm
Okok muchas gracias a ambos, y si quisiera que se inicializara desde el valor de la variable "n" dada por el usuario,y termine hasta que sea igual a 3?

Un poco más raro... pero igual de bonito.

La expresión

Código
  1. c=(N%3==0)*N

se evalúa de la siguiente manera: Si N es divisible entre 3, entonces (N%3==0) es 1, y entonces c, vale  1*N . En otro caso, pues 0.

Código
  1. #include <stdio.h>
  2. #include <assert.h>
  3.  
  4.  
  5. /*
  6.   P : M >= 3
  7.   Q : c = sum i : 3 <= i <= M and (i%3==0) : i
  8.      
  9.   I : Q[M/n] and 3 <= n <= M
  10.   B : n > 3
  11.      
  12.   Quota (n) = n - 3 >= 0
  13.   Step : n = n - 1
  14.   Restore : c = c + (n-1)*\chi((n-1)%3==0)
  15.      
  16. */
  17.  
  18. #define DEBUG
  19.  
  20. unsigned int mult3(const unsigned int N)
  21. {
  22.  assert(N>=3);
  23.  unsigned int n,c;
  24.  for(n=N,c=(N%3==0)*N;n>3;n--)
  25.    {
  26. #ifdef DEBUG
  27.      if (n%3==0) printf("%d ",n);
  28. #endif
  29.      if (((n-1)%3==0)) c+=(n-1);
  30.    }
  31. #ifdef DEBUG
  32.      printf("%d ",3);
  33. #endif
  34.  return c;
  35. }
  36.  
  37.  
  38.  
  39. int main()
  40. {
  41.  unsigned int M;
  42.  int e;
  43.  for ( ; (e=scanf("%u",&M))==1;)
  44.    printf(" --> %u\n",mult3(M));
  45.  if (e!=EOF)
  46.    {
  47.      printf("Not a integer");
  48.      return -1;
  49.    }
  50.  return 0;
  51. }

La salida del programa da
Código:
3
3  --> 3
4
3  --> 3
5
3  --> 3
6
6 3  --> 9
7
6 3  --> 9
8
6 3  --> 9
9
9 6 3  --> 18
10
9 6 3  --> 18