Ayuda con sintaxis For

Iniciado por oq.JULIO.po, 25 Abril 2018, 06:40 AM

0 Miembros y 1 Visitante están viendo este tema.

oq.JULIO.po

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...

#include <stdio.h>

int main()

{

int n,suma;

do {

printf("Ingrese un numero igual o mayor que 3...");
scanf("%d",&n);

} while(n<=3);

suma=0;


for (n==n;n==3;n-=1)
{
if(n%3==0)
{
suma+=n;



}
else (n!=3);{ n-=1;}

}

printf("La suma de los multiplos de 3 es : %d", suma);
return 0;
}



· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex

engel lex

#1
primero que nada
n==n

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

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

n==3

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

te recomiendo la forma de hacer esto mejor es

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

JPS

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:
...
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:
...
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.

oq.JULIO.po

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?

dijsktra

#4
Hola!

Cita de: oq.JULIO.po en 25 Abril 2018, 06:40 AM
... 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
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--...)



#include <stdio.h>
#include <assert.h>


/*
 P : M >= 3
 Q : c = sum i : 3 <= i <= M and (i%3==0) : i

 I : Q[M/n] and 3 <= n <= M
 B : n < M

 Quota (n) = M - n >= 0
 Step : n = n + 1
 Restore : c = c + (n+1)*\chi((n+1)%3==0)
 
*/

#define DEBUG

unsigned int mult3(const unsigned int N)
{
 assert(N>=3);
 unsigned int n,c;
#ifdef DEBUG
      printf("%d ",3);
#endif
 for(n=c=3;n<N;n++)
   {
     if (((n+1)%3==0)) c+=(n+1);
#ifdef DEBUG
     if ((n+1)%3==0) printf("%d ",n+1);
#endif
   }
 return c;
}



int main()
{
 unsigned int M;
 int e;
 for ( ; (e=scanf("%u",&M))==1;)
   printf(" --> %u\n",mult3(M));
 if (e!=EOF)
   {
     printf("Not a integer");
     return -1;
   }
 return 0;
}





La salida que da el programa es:


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





Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)

dijsktra

#5
Cita de: 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?

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

La expresión


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.

#include <stdio.h>
#include <assert.h>
   
   
/*
 P : M >= 3
 Q : c = sum i : 3 <= i <= M and (i%3==0) : i
   
 I : Q[M/n] and 3 <= n <= M
 B : n > 3
   
 Quota (n) = n - 3 >= 0
 Step : n = n - 1
 Restore : c = c + (n-1)*\chi((n-1)%3==0)
     
*/
   
#define DEBUG
   
unsigned int mult3(const unsigned int N)
{
 assert(N>=3);
 unsigned int n,c;
 for(n=N,c=(N%3==0)*N;n>3;n--)
   {
#ifdef DEBUG
     if (n%3==0) printf("%d ",n);
#endif
     if (((n-1)%3==0)) c+=(n-1);
   }
#ifdef DEBUG
     printf("%d ",3);
#endif
 return c;
}
   
   
   
int main()
{
 unsigned int M;
 int e;
 for ( ; (e=scanf("%u",&M))==1;)
   printf(" --> %u\n",mult3(M));
 if (e!=EOF)
   {
     printf("Not a integer");
     return -1;
   }
 return 0;
}


La salida del programa da

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

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)