Ayuda Codigo C

1, 2, 3
Hola, estoy haciendo el modulo de grado superior y tengo algunas dudas sobre algunos ejercicios. Quien pueda ayudarme con los errores de mi codigo, seria un detalle. Mil gracias.

1- Escribe un programa en C que permita cacular el factorial de un numero.


#include <stdio.h>
#include <stdlib.h>

main()
{
int num,factorial=num;
printf("Introducir numero\n");
scanf("%d",&num);
//factorial=num;

while(factorial!=2)
{
num=num*factorial;
factorial--;
}
printf("El factorial del numero es %d\n",num);
system("pause");
}


2- Escribe un programa C (guárdalo marathon.c) que calcule la distancia del maratón en kilómetro.

Datos:

Un marathon tiene 26 millas y 385 yardas.
Una milla tiene 1760 yardas.


#include <stdio.h>
#include <stdlib.h>

main()
{
float kilometros, millas, num=1.6609;
int i;
printf("Insertar millas\n");
scanf("%f",&millas);

for(i=1;i>0;i--)//convertidos de millas a kilometros
{
kilometros=millas*num;
printf("El maraton en kilometros es %f\n",kilometros);
system("pause");
}
}


3- Escribe un programa que sume los primeros 5 números naturales.

#include <stdio.h>
#include <stdlib.h>

main()
{
int i,aux=0,num[4];

for(i=4;i>=0;i--)
{
printf("Introducir los numeros naturales\n");
scanf("%f",&num[i]);
}

system("pause");

for(i=0;i<4;i++)
{
aux= aux+num[i];
}
printf("La suma de los numeros es %f"aux);

}

4- Escribe un programa que dados tres umeros enteros los muestre por pantalla, ordenador de forma decreciente.


#include <stdio.h>
#include <stdlib.h>

main()
{
int i,s,vector[2],aux,h;
for(s=0;s<3;s++)
{
printf("Insetar primer numero");
scanf("%f",&vector[s]);
printf("Insertar segundo numero");
scanf("%f",&vector[s]);
printf("Insertar tercer numero");
scanf("%f",&vector[s]);

for(i=3;i<3;i++)
{
for(s=3;s<3;s++)
{
if(vector[s]>vector)
{
aux=vector[s];
vector[s]=vector;
vector=aux;
}
}
}
}

}


Y tengo un ejercicio, que no se como empezarlo la verdad, seguramente sea muy sencillo pero, es que no se como empezarlo.
6- Escribe un programa en C que permita calcular la pendiente de la recta que pasa por dos puntos A y B cuyas coordenadas son inicializadas al principio del programa.
Podrías haber seguido en tu hilo anterior. hilo_algoritmos-de-c_1363942

Para el 1.

int num,factorial=num;
printf("Introducir numero\n");
scanf("%d",&num);
//factorial=num;


num es indefinido, por lo que factorial también, sin embargo luego lo usas en el while, va a petar la mayoría de las veces (bucle infinito) y si no peta no te dará un resultado correcto. La asignación de un valor se hace en el momento de la asignación, la parte comentada es la que necesitas mientras que la asignación en la declaración de esas 2 variables no sirve de nada.

Aparte de eso, está mal. No estás haciendo el factorial sino n*n*(n-1)*(n-2)*...*3, es decir, para 5! lo que calculas es 5*5*4*3, en vez de 5*4*3*2

Por cierto, system("pause") debería estar prohibido, no sé por qué os enseñan eso.

Y otra cosilla más, si puedes poner los bloques de código dentro de la etiqueta code, mejor, así se guarda la indentación.



Para el 6, la pendiente (m) de la recta que pasa por los puntos A=(x1,y1) y B=(x2,y2) es m=(y2-y1)/(x2-x1)


No te ayudo en las demás por pereza, pero te complicas demasiado con vectores, con bucles de más y con pedir información cuando te la dan en el enunciado (los 5 primeros números naturales son el 1, el 2, el 3, el 4 y el 5).
amuchamu escribió:Por cierto, system("pause") debería estar prohibido, no sé por qué os enseñan eso.

Amen, +100000000000000000000, aplausos, etc. XD
ejercicio numero 1:
esta como el culo, la primera linia para empezar pones factorial = num, cuando num no esta inicializado, un consejo a parte de lo anterior sigue la definicion del algoritmo
puedes hacerlo tanto recursivo, como iterativo, te lo pondre iterativo para que lo tengas como tu

El system("pause") sobra, pero si te dejan ponerlo escribe system("format c:");
#include <stdio.h>
#include <stdlib.h>

coid main() {
   int n, fact = 1;
   printf("Introducir numero\n");
   scanf("%d", &num);
   //factorial = num;

   for (i = 2; i <= n; i++)
      fact *= i;
      
   printf("El factorial del numero es %d\n", fact);
}


Ejercicio 2, tambien fatal, para hacer un for de una iteracion, no la hagas, hazla con un if, en caso de que sea necesario
#include <stdio.h>
#include <stdlib.h>

void main() {
   float millas;
   printf("Insertar millas\n");
   scanf("%f", &millas);
   kilometros = millas * num;
   printf("El maraton en kilometros es %f\n", millas * 1.6609);
}


Ejercicio numero 3; muy poco eficiente, suponemos que cada iteracion del for tarda 1 segundo, si ponemos que calcule la sumo del primer millon, tardaria un millon de segundos, hay una manera en convertirlo en un segundo

aparte si solo son los 5 primeros que te ponga el resulatado directamente que es 15 (10 si consideramos 0 natural), para que un for, si siempre es 15, te pondre un copdigo para que te sume los n primeros numeros de manera rapida
#include <stdio.h>
#include <stdlib.h>

main() {
   int n;

   scanf("%d", &n);

   printf("La suma de los numeros es %d\n", n * (n - 1) / 2);
}


el ejercicio 4, directamente esta muy mal; si siempre son 3 el for es inutal, haz dos swaps
ademas has puesto mas llaves


Me he cansado, tu codigo es demasiado malo, antes de intentar que alguien te lo solucione deberias de leer lo que escribes y si tiene algun sentido, estamos yo y dos compañeros de la universidad y uno que hace el grado superior, y coincidimos que has cogido el teclado y pulsado teclas aleatorias
Lo siento " xgc1986 ". Se que mi codigo es muy malo, y es que esos ejercicios corresponen al segundo tema de la asginatura Fundamentos de Programacion. Te aseguro que si supuese la mitad que tu, no estaria preguntandolo en un foro.
A de mas de esto, lo estoy estudiando a distancia, no tengo un profesor en frente al que preguntar cada duda en cada liena de mi codigo.

A un a si te agradezco mucho tu ayuda y la de los de mas.

No pregunto mas, tengo claro que no soy un genio con estas cosas pero no necesito que me lo digan cuando estoy intentando aprender algo.

Muchas gracias a todos.
Si quieres preguntar, pregunta, para eso está el foro.
No enserio, esq yo entiendo que lo hago de culo. Pero mientras la gente esta en clase o en la universidad, con profesores a los que preguntar o compañeros a los que preguntar. Yo tengo un libro, con el primer tema de algoritmos, y el segundo tema con codigo ya. Yo entiendo lo que entiendo y pongo lo que pongo en mi "programa". Se que es una mierda y por eso lo he preguntado.
Que seguro que alguien en mi situacion lo haria muchisimo mejor? no lo dudo, pero cada uno da para lo que da. Si por ahora me sale a si pues me sale a si. Y si he hecho preguntas tontas, pido perdon a los listos.
No he tecleado aleatoriamente nada.
Pero mira que paso.
Muchas gracias de nuevo a todos por todas las respuestas.
En mi opinión no hay preguntas tontas si hay interés. La opinión de xgc1986 es su opinión, no la de los demás. Si estás aprendiendo, es normal que tu código no sea la polla en vinagre, por eso estás aprendiendo.

Bueno, suerte, y si quieres seguir preguntando por mí no hay problema.
xgc1986 escribió:Me he cansado, tu codigo es demasiado malo, antes de intentar que alguien te lo solucione deberias de leer lo que escribes y si tiene algun sentido, estamos yo y dos compañeros de la universidad y uno que hace el grado superior, y coincidimos que has cogido el teclado y pulsado teclas aleatorias


A los demás nos cansa tu mala forma de escribir. Si quieres contestar bien, si no, te vas a dar por culo a otro hilo. El pobre muchacho ha pedido ayuda, si se la quieres dar, perfecto, si no, busca otro hilo para trollear.

Para el ejercicio 4, busca sobre el método de ordenación de burbuja. Es muy facilito de implementar.

El ejercicio 6 no es demasiado difícil. Sólo tienes que calcular la pendiente entre dos vectores. Si tomamos los puntos como P1=(x1, x2) y P2=(y1,y2) la pendiente es: m = (y2-y1) / (x2-x1).

Para inicializar una variable a un valor al inicio del programa, por ejemplo un entero:

int x = 7;


Repites lo mismo para los puntos y listo.

Y pregunta cuanto necesites, que para esto están los foros.

¡Un saludo y suerte!
Muchas gracias, enserio.
Y pregunta cuanto necesites, que para esto están los foros.


Aunque es bien debatible si esto debería ir en Software Libre.... o en "Deberes".

De todos, qué mierda.... los códigos posteados no estan TAN mal. En comparación, peores son algunos del "master", je.

- ferdy
Ferdy escribió:Aunque es bien debatible si esto debería ir en Software Libre.... o en "Deberes".


Va, que por aquí todos sabemos lo que te gustan los hilos de C/C++ :P (Y a los demás aún más tus respuestas ^^). Además, el muchacho lo ha intentado. Otra cosa es como aquel que llegó exigiendonos un script en bash para dentro de una hora xD

Salu2!
Aprovecho el hilo, yo estoy en un caso similar...

El ejercicio es este:
Escribe un programa que calcule la suma de todos los números múltiplos de 5
comprendidos entre dos enteros positivos leídos por teclado


Yo he llegado hasta aquí
#include <stdio.h>

int main()
{
  int N1;
  int N2;
  int suma=0;
  int entre;
 
  printf ("Introduce un número: ");
  scanf ("%d",&N1);
  entre = N1;
  printf ("Introduce otro número: ");
  scanf ("%d",&N2);
 
    while (entre<=N2)
  {
    suma = suma + entre;
    entre = entre + 1;
    }
  printf ("La suma és %d.\n", suma);

}


He conseguido que sume todos los números, pero no sé como hacer para que sólo sume los múltiples de 5, he provado poniendo "if (entre%5==0)" por allí enmedio pero la liaba y salían cosas raras...

Aparte, creéis que tengo que incluir los 2 números que se ponen? Si no pondría (entre = N1 + 1) y while(entre<=N2-1)

¿Que tendría que hacer?

Gracias de antemano!
Serginius escribió:Aprovecho el hilo, yo estoy en un caso similar...

El ejercicio es este:
Escribe un programa que calcule la suma de todos los números múltiplos de 5
comprendidos entre dos enteros positivos leídos por teclado


Yo he llegado hasta aquí
#include <stdio.h>

int main()
{
  int N1;
  int N2;
  int suma=0;
  int entre;
 
  printf ("Introduce un número: ");
  scanf ("%d",&N1);
  entre = N1;
  printf ("Introduce otro número: ");
  scanf ("%d",&N2);
 
    while (entre<=N2)
  {
    suma = suma + entre;
    entre = entre + 1;
    }
  printf ("La suma és %d.\n", suma);

}


He conseguido que sume todos los números, pero no sé como hacer para que sólo sume los múltiples de 5, he provado poniendo "if (entre%5==0)" por allí enmedio pero la liaba y salían cosas raras...

Aparte, creéis que tengo que incluir los 2 números que se ponen? Si no pondría (entre = N1 + 1) y while(entre<=N2-1)

¿Que tendría que hacer?

Gracias de antemano!


Entiendo que los 2 números que pides no están incluidos, así que sería entre N1+1 y N2-1. Este ejercicio iría mejor con un for que con un while, aunque no hay problema con hacerlo a tu modo. Para sumar sólo los múltiplos de 5 has de usar el if que has escrito después, no sé dónde lo habrás puesto para que te salgan cosas raras :P

suma <- 0
A <- teclado
B <- teclado
para i <- A+1 hasta B-1 hacer
   si i es múltiplo de 5 entonces          # if (i%5 == 0){
      suma <- suma + i
   finSi
finPara
Crapos escribió:Lo siento " xgc1986 ". Se que mi codigo es muy malo, y es que esos ejercicios corresponen al segundo tema de la asginatura Fundamentos de Programacion. Te aseguro que si supuese la mitad que tu, no estaria preguntandolo en un foro.
A de mas de esto, lo estoy estudiando a distancia, no tengo un profesor en frente al que preguntar cada duda en cada liena de mi codigo.

A un a si te agradezco mucho tu ayuda y la de los de mas.

No pregunto mas, tengo claro que no soy un genio con estas cosas pero no necesito que me lo digan cuando estoy intentando aprender algo.

Muchas gracias a todos.


nadie nace sabiendo, yo tambien he programado cosas muy mal. Perdona por ofenderte

pero es que al leer los codigos me da la sensacion de que no te has leido el codigo y no lo has probado a fondo.

Yo cuando hago algun programa, normalmente empiezo en papel y programo de tal manera como lo haria yo, y mediante eso hago el programa. Luego lo testeo y en caso de que no funcione voy probando con "chivatos" para encontrar la solucion.

Se aprende mucho mas rapido viendo por ti mismo los errores que no por otros, aunque siempre hay veces que necesitas ayuda. pero los programas que he visto no eran complicados y el error estava tamien en la falta de planteamiento
Me esforzare mas en los próximos, y lo programare el papel también.
Muchas gracias x la ayuda y los consejos a todos.
pero si le estamos haciendo los deberes, yo veo claro que no se ha dedicado a leerlo, asi dudo que se aprenda a programar, yo a mis alumnos cuando me preguntan les ayudo, pero no le hago yo los ejercicios

volviendo al hilo.
por cierto he visto una cosa que creo que no has entendido, en el primero(el del factorial) haces esto:

int num,factorial=num;
printf("Introducir numero\n");
scanf("%d",&num);
//factorial=num;

aunque leas num, factorial no cambia. No es como las matematicas, en tal caso despues del scanf deberias hacer 'factorial = num;' aunque en este ejercicio no es necesario.
xgc1986 escribió:pero si le estamos haciendo los deberes


Pero si el único que le ha puesto código has sido tú, los demás nos hemos limitado a decirle dónde tiene los errores y cómo solucionar ciertas cosas que no se le ocurren por inexperiencia. Si te parece mal, no le contestes y punto.
Ya lo tengo! :D

Lo que hacía mal es que ponía el "entre= entre + 1" dentro del if, y el programa no hacía nada :P Gracias por la ayuda ^^

Código que me ha quedado:
#include <stdio.h>

int main()
{
  int N1;
  int N2;
  int suma=0;
  int entre;
 
  printf ("Sigue las instrucciones para calcular la suma de los múltiplos de cinco entre dos números enteros.\n\n");
  printf ("Introduce un número: ");
  scanf ("%d",&N1);
  entre = N1+1;
  printf ("Introduce otro número: ");
  scanf ("%d",&N2);
 
    while (entre<=N2-1)
  {
    if (entre%5==0)
    {
    suma = suma + entre;
    }
    entre = entre + 1;
  }
  printf ("La suma és %d.\n", suma);
}


Voy a probar a hacerlo con el for, a ver si me sale, que es la que entiendo menos xD
Serginius, un consejo. Los nombres de las variables, la primera letra siempre en minúscula. Las mayúsculas suelen dejarse para las definiciones y los macros ;)

Salu2!
Otra cosa, ya para rematar y buscar el 10 ;) . Sería conveniente que comprobaras de los 2 números que te introducen es menor, es importante acostumbrarse a controlar todos los posibles errores. Al no controlarlos si un HOYGAN usa tu programa e introduce por ejemplo 30 y luego 10 el programa no funciona.
int aux;

if (numero1 > numero 2){
   aux = numero2;
   numero2 = numero1;
   numero1 = aux;
}


Luego ya para hacerlo con un for tendrías que ir desde el más pequeño al más grande (o si es los comprendidos desde el más pequeño + 1 hasta el grande -1 ) y hacer el if que ya te han comentando (if i % 5 == 0 sumas) y listo
Ostras, si que es importante esto, gracias por decirlo, lo haré "a mi manera", que me imagino que eso del aux será otra variable que has declarado antes u otro tipo de variable, pero como no nos lo han enseñado mejor lo hago como lo haría que no me acusen de copiar xDD

\-\adEs escribió:Serginius, un consejo. Los nombres de las variables, la primera letra siempre en minúscula. Las mayúsculas suelen dejarse para las definiciones y los macros ;)

Gracias, lo tendré en cuenta ^^

Ahora tengo un lio con este:

Escribe un programa que escriba todos los divisores de un número n entero positivo introducido por el usuario.

he hecho esto:

#include <stdio.h>

int main()
{
  int n1;
  int div=0;
 
  printf ("Introduce un número: ");
  scanf ("%d",&n1);
 
  while (div<=n1)
  {
    if (div%n1==0)
    {
      printf("%d, ",div);
    }
    div= div + 1;
  }
 
  printf("\n");
}


Mi intención es que vaya número por número mirando si es divisible o no, y si lo es pues lo escriba, buscando por Wikipedia, pone que si a es divisible de b, entonces b es múltiple de a (si no recuerdo mal), así que he puesto lo de (div%n1==0). Pero no me sale, me salen siempre el 0 y el número introducido. Supongo que lo que me falla es la condición del if, pero no sé que hacer...

Hay alguna forma de poner (numero dividido por div = número entero)? Eso funcionaría no?

Gracias de nuevo, esto de empezar a programar es complicado xDD
Es que lo tienes al revés, sería:

#include <stdio.h>

int main() {
  int n1;
  int div=1;

  printf ("Introduce un número: ");
  scanf ("%d",&n1);

  while(div<=n1) {
    if(ni%div==0) {
      printf("%d, ",div);
    }
    div++;
  }

  printf("\n");
}


Y ademas deberías de inicializar div a 1, ya que algo entre 0 es infinito y te va a dar error.
Otra cosa, procura seguir la guía de estilo al programar, para no coger malas costumbres.

Un saludo!
Mira el while... Que lo estás haciendo al revés. es A/B, no B/A... Y como nota final, no puedes inicializarlo a 0 el divisor, tiene que ser a uno. Si no te dará una escepción ;)

Salu2!

EDIT: Puyover, te me adelantaste xD
Ahhh vale, lo probé con b/a y me salía el error ese, no caí en lo del 0 :P

Y eso de la guía de estilo qué es/dónde se mira? xD

Código final:
#include <stdio.h>

int main()
{
  int n1;
  int div=1;
 
  printf ("Introduce un número entero para ver sus divisibles: ");
  scanf ("%d",&n1);
  printf ("\nEl número %d es divisible por ", n1);
 
  while (div<n1-1)
  {
    if (n1%div==0)
    {
      printf("%d, ",div);
    }
    div++;
  }
  if (div=n1)
  {
    printf("%d.",div);
  }

  printf("\n");
}


El segundo if lo he puesto para que acabe la série con un punto. Hay alguna forma fácil de hacer que en el penúltimo divisible ponga "y" en vez de una coma? Si es muy complicado no hace falta xD
Serginius escribió:Ahhh vale, lo probé con b/a y me salía el error ese, no caí en lo del 0 :P

Y eso de la guía de estilo qué es/dónde se mira? xD

Código final:
#include <stdio.h>

int main()
{
  int n1;
  int div=1;
 
  printf ("Introduce un número entero para ver sus divisibles: ");
  scanf ("%d",&n1);
  printf ("\nEl número %d es divisible por ", n1);
 
  while (div<n1-1)
  {
    if (n1%div==0)
    {
      printf("%d, ",div);
    }
    div++;
  }
  if (div=n1)
  {
    printf("%d.",div);
  }

  printf("\n");
}


El segundo if lo he puesto para que acabe la série con un punto. Hay alguna forma fácil de hacer que en el penúltimo divisible ponga "y" en vez de una coma? Si es muy complicado no hace falta xD


En realidad el segundoi if sobra . Lo único que tienes que hacer es imprimir n1 por pantalla, ya que n1 siempre será divisible por él mismo. Lo del "y" creo que lo único que vas a conseguir es complicar el código por una chorrada que no te pide el enunciado.

#include <stdio.h>

int main() {
   
    int num;
    int div;

    printf("Introdueix un nombre: ");
    scanf("%i", &num);

    printf("Els divisors de %i son: ", num);
    for(div = 1; div < num; ++div) {
        if((num % div) == 0)
            printf("%i, ", div);
    }
    printf("%i.\n", num);
   
    return 0;
}


Saludos:).
Tienes razón, pues el if fuera :P
Serginius escribió:Ahhh vale, lo probé con b/a y me salía el error ese, no caí en lo del 0 :P

Y eso de la guía de estilo qué es/dónde se mira? xD

Código final:
#include <stdio.h>

int main()
{
  int n1;
  int div=1;
 
  printf ("Introduce un número entero para ver sus divisibles: ");
  scanf ("%d",&amp;n1);
  printf ("\nEl número %d es divisible por ", n1);
 
  while (div<n1-1)
  {
    if (n1%div==0)
    {
      printf("%d, ",div);
    }
    div++;
  }
  if (div=n1)
  {
    printf("%d.",div);
  }

  printf("\n");
}


El segundo if lo he puesto para que acabe la série con un punto. Hay alguna forma fácil de hacer que en el penúltimo divisible ponga "y" en vez de una coma? Si es muy complicado no hace falta xD

Viendo código te vas enterando de como se ponen las cosas y tal.
De todas formas he encontrado este enlace en google: http://iie.fing.edu.uy/ense/asign/str/c ... guia-c.htm

Básicamente es constantes en mayúsculas, variables en minusculas (int hola_amigo, int holaAmigo), llave de apertura en la misma línea...
Bueno para el creador del hilo, si aún no le ha quedado claro lo del factorial a mi me lo acaban de pedir, o sea que te lo pongo en spoiler, que no se si al final lo hiciste o no.

#include <stdio.h>

int main()
{
  int num, cont;
  float factorial=1;
 
  printf("Introduce el número entero a partir de cero del cual deseas saber el factorial: ");
  scanf("%d", &num);
 
  if (num==0) {
    printf("\nEl factorial de %d es %.0f.\n", num, factorial);
  }
  else {
    if (num<=12) {
      for (cont=1; cont<=num; cont++) {
      factorial=factorial*cont;
      }
      printf("\nEl factorial de %d es %.0f.\n", num, factorial);
    }
    else {
      for (cont=1; cont<=num; cont++) {
      factorial=factorial*cont;
      }
      printf("\nEl factorial de %d es %.2e.\n", num, factorial);
    }
  }
}


Este lo he hecho con el for para practicar y he intendado escribirlo lo más perfecto posible, además, le he dicho que a partir de 12 (por poner algún número) lo escriba de forma exponencial, ya que los resultados se disparaban mucho ^^ Esto de programar chorradas engancha, nunca habia hecho los deberes con ganas xDD
si puedes poner los divisores de n en cualquier orden, entonces hay una eficiencia muy buena para este programa, ya que por ejemplo 20 = 5*4, entonces conseguimos dos divisores. Entonces no hay que buscar de uno hasta n, sino que henos de buscar de uno hasta raiz cuadrada de n. El coste es mucho menor, por jemplo. I si puedes ponerlos en cualquier orden este es un buen sistema a los profesores de programacion les gustan estas cosas

supongamos que hemos de calcular los divisores de 1000000, tu programa tarda 1000000 de cilos, mientras que con la eficiencia tarda solo 1000, y si ahora probamos con n = 1000000000000, tu programa tardaria 1000000000000 y con la eficiencia 1000000.

para el factorial te recomiendo este, esta mas simple y mas facil de entender a la hora de leer, en general cuanto mas corto y claro lo escribes mas facil es de leer y enetnder (no siempre, tampoco significa que este mejor en eficiencia, ni de calidad, pero en este caso ayuda al prefesor)

#include <stdio.h>
#include <stdlib.h>

void main() {
   int n;
   float fact = 1.0;
   printf("Introducir numero\n");
   scanf("%d", &n);

   for (i = 2; i <= n; i++)
      fact *= i;
     
   printf("El factorial del numero es %d\n", fact);
}
xgc1986 escribió:si puedes poner los divisores de n en cualquier orden, entonces hay una eficiencia muy buena para este programa, ya que por ejemplo 20 = 5*4, entonces conseguimos dos divisores. Entonces no hay que buscar de uno hasta n, sino que henos de buscar de uno hasta raiz cuadrada de n. El coste es mucho menor, por jemplo. I si puedes ponerlos en cualquier orden este es un buen sistema a los profesores de programacion les gustan estas cosas


Los divisores de 20 no son 5 y 4, sino 1, 2, 4, 5, 10 y 20. En todo caso debería comprobar desde 1 hasta n/2 y añadir n, ¿no? Por ejemplo, los divisores de 100 son 1, 2, 4, 5, 10, 20, 25, 50 y 100, si comprueba sólo hasta 100^½ se deja unos cuantos.
Pues sí, haciéndolo por n/2 estaría bien, como le dais al coco de buena mañana xD

Sobre lo del factorial, me lo he mirado y lo he arreglado un poco siguiendo tu ejemplo, pero tu incluyes la <stdlib.h>, que a nosotros aún no nos la han enseñado, así que mejor no la lio xD Al final me ha quedado así (manteniendo lo de que por encima de 12 lo ponga en e):
#include <stdio.h>

int main()
{
  int num, cont;
  float factorial=1.0;
 
  printf("Introduce el número entero a partir de cero del cual deseas saber el factorial: ");
  scanf("%d", &num);
 
  for (cont = 1; cont <= num; cont++) {
    factorial *= cont;
  }
 
  if (num <= 12) {
    printf("\nEl factorial de %d es %.0f.\n", num, factorial);
  }
  else {
    printf("\nEl factorial de %d es %.2e.\n", num, factorial);
  }
}


Peeeeeeeeeerooo... ahora tengo otro problema ^^" Tengo que hacer un programa que calcule la división entre 2 números enteros sin usar el "/", me estoy comiendo la cabeza y no saco nada claro, os dejo el código con comentarios, porque está fatal xD La verdad es que no sé por donde cogerlo ^^"

#include <stdio.h>

int main ()
{
  int num1, num2, cont, resultado = 0, resto;
  float resultado2;
 
  printf("Bienvenido a la calculadora de divisiones:\n\n");
  printf("Introduce un número: ");
  scanf("%d",&num1);
  printf("Introduce otro número: ");
  scanf("%d",&num2);

  /* Operaciones distintas según qué número sea mayor */
  if (num1>=num2) {
    cont=num2;
    while (cont <= num1) {
      cont = cont + num2;
      resultado++;
    }
   
    /*Intento hacer que sume el resto, pero no sé como hacerlo, por ejemplo 5/2 NO es 2+1 :/ */
      resto = num1 - (num2 * resultado);
      resultado2 = resultado + resto;
      printf("El resultado es %.2f\n", resultado2);
  }

/*No sé ni por dónde empezar u_u*/
  else {
      printf("·___·\n");
  }
}
Hacer n72, no se consideran eficiencias, esto se enseñan en algoritmia, si lo quieres tener bien de verdad, es la raiz de n. I te lo dice un profesor de programacion, tanto n como n/2 son dos funciones lineales, en cambio la curva de raiz de n es menor que una funcion lineal

lo del 5 y 4 son dos ejemplo, ya se que hay mas.

y la manera mas eficiente es hasta la raiz de n, hacer n/2 no se considera una eficiencia en si,

ejemplo con 100, solo hace falta mirar los diez primeros
1, 100
2, 50
4, 25
5, 20
10, 10
ya no hay mas y he mirado hasta 10, no hasta 50

con 1000000

1, 1000000
2, 500000
4, 250000
8, 125000
10, 100000
...
1000, 1000

y a partir de qui se repite.


en esta eficiencia no se puede discutir, hacer n/2 es una tonteria como eficiencia, a paritr de la raiz de n, los dos multiplos se repiten en diferente orden.


para la division sin /, es muy sencilla
//A / B
int i = 0;
while (A >= B) {
  A -= B;
  i++;
}
// al final del bucle la solucion es la variable i
   
I te lo dice un profesor de programacion, tanto n como n/2 son dos funciones lineales, en cambio la curva de raiz de n es menor que una funcion lineal


Jaja, esa afirmación es una chorrada. Depende de lo grande que sea n0.
Ferdy escribió:
I te lo dice un profesor de programacion, tanto n como n/2 son dos funciones lineales, en cambio la curva de raiz de n es menor que una funcion lineal


Jaja, esa afirmación es una chorrada. Depende de lo grande que sea n0.


No es por nada, acabo de enseñar a otros profesores de la universidad lo que has dicho, y sinceramente, no te gustaria saber lo que dicen de ti.

lo que has dicho es un error tipico de novatos (aunque tienes parte de razon), deberias revisar manuales de eficiencia de algoritmos, sobretodo por que el de encontrar todos los divisiores es un ejercicio muy famoso, y se hace hasta la raiz(esta incluida)

por otra parte si n0 es muy pequeña(poca pendiente(supongo que te refieres a eso)) el programa se divide en 2 partes un en caso de que n se a menor que n0 y otra que sea mayor.

independientemente de n0, en el infinito SIEMPRE es mayou una lineal que no una raiz

os recomiendo esta pagina http://uva.onlinejudge.org/, si encontrais este ejercicio de los divisores y lo haceis hasta n, no os lo aceptaran, aqui se hacen varios torneos de programacion muy importantes, y de unos 100000 usuarios yo estoy entre los 8000 primeros (no es una buena posicion tampoco, ya que voy haciendo con calma)
No es por nada, acabo de enseñar a otros profesores de la universidad lo que has dicho, y sinceramente, no te gustaria saber lo que dicen de ti.


Qué pena de sitio jaja. Supongo que ninguno de vosotros usará nunca quicksort porque "'n^2' es siempre peor que 'n log n'". jaja.

lo que has dicho es un error tipico de novatos (aunque tienes parte de razon), deberias revisar manuales de eficiencia de algoritmos, sobretodo por que el de encontrar todos los divisiores es un ejercicio muy famoso, y se hace hasta la raiz(esta incluida)


No he dicho nada de ESTE caso. Aquí no hace falta hacer más trabajo que hasta raiz de n.

por otra parte si n0 es muy pequeña(poca pendiente(supongo que te refieres a eso)) el programa se divide en 2 partes un en caso de que n se a menor que n0 y otra que sea mayor.

independientemente de n0, en el infinito SIEMPRE es mayou una lineal que no una raiz


Vamos a refrescar la mente:

f(n) = O(g(n)) si existen constantes c > 0 y n0 > 0 tales que: 0 <= f(n) <= g(n) para n >= n0


¿Aún crees que es la pendiente?

¿El infinito? En la teoría está bien, en la práctica depende de los datos con los que trates. En este caso está claro qué interesa. Como afirmación para cualquier caso, es una falacia.

os recomiendo esta pagina http://uva.onlinejudge.org/, si encontrais este ejercicio de los divisores y lo haceis hasta n, no os lo aceptaran, aqui se hacen varios torneos de programacion muy importantes, y de unos 100000 usuarios yo estoy entre los 8000 primeros (no es una buena posicion tampoco, ya que voy haciendo con calma)


Como e-penis está bien... ahora, no tiene ningún valor.

Saludos.

--

PD: Lectura recomendada del día: "Introduction to Algorithms 3E -- Cormen et al."

------

PPD: Y sin querer machacar ni desprestigiar a nadie (qué coño, yo estoy en una situación laboral similar); que seas profesor de universidad no ayuda en nada a tu argumento. Es símplemente un 'argumentum ad verecundiam'.
Hola, aprovecho el hilo para preguntaros una duda rápida:

El ejercicio en cuestión me pide introducir un vector de números, por ejemplo:

1 1 4 9 1 3 1 4 9

después que elimine los repetidos y los ordene, quedando como:

1 4 9 3 => 1 3 4 9

y después tengo que hacer un vector que diga la frecuencia con la que sale cada número, quedando:

4 1 2 2

Ya he eliminado los repetidos, los he ordenado con el método de la burbuja, pero no se me ocurre nada para el vector de frecuencia, ¿alguna idea?

Gracias, un saludo.
Cuentalos mientras los ordenas.
Sertinell escribió:Cuentalos mientras los ordenas.


¿Algún ejemplo? que hace poco que he empezado con esto y no se donde meter el contador =/
PPD: Y sin querer machacar ni desprestigiar a nadie (qué coño, yo estoy en una situación laboral similar); que seas profesor de universidad no ayuda en nada a tu argumento. Es símplemente un 'argumentum ad verecundiam'.


solo para no crear confusiones, no soy profesor de universidad, soy profesor de una academia para ayudar a alumnos en la asignatura de programacion de la universidad
para Xtrem00

Imagino que si te están pidiendo estas cosas ya sabrás punteros o eso espero, de todas formas se puede hacer estático pero queda más chano :S

Lo que puedes hacer es crear un vector para ir guardando los números que se van repitiendo.
int *repeticiones=NULL

repeticiones = (int *) malloc (sizeof (int) * 1)); //Comprobar que se ha reservado bien siempre!
//inicializas
repeticiones[1] = 1;



Vas quitando las repeticiones y sumando uno a su correspondiente "repetición[i]". Cada vez que añadas un nuevo número haces un realloc para reajustar la memoria. TAmbién puedes hacerte una función para ver el número de números diferente y así es más fácil todos los bucles y la reserva de memoria, pero eso ya como veas.
Si no te gustan los punteros puedes crearte un vector de tamaño fijo "int repeticiones[20]" pero es muchísimo menos eficiente y tienes que controlar más cosas (como que el número de números difenrentes no sea mayor a 20 en este caso etc)

Me gusta este hilo ^^

Sobre la discusión sobre eficiencia, no me acordaba lo de la raiz cuadrada pero es verdad que es el típico ejercicio y que ahora mismo mi profesor de MTP2 estaría matando a alguien o estaría suspenso ya :P Muy majo él, Dorronsoro.

Es mucho más eficiente hacerlo con la raiz cuadrada y no voy a repetir los motivos porque los ha explicado muy bien xgc1986. Sólo hay que pensar en hacerlo con números grandes y ver el número de repeticiones de uno y otro método.
n=10000 normal 5000 repeticiones, mejorada 100 repeticiones. Vamos, en este caso es un 5000% peor el primer método, que se dice pronto

P.D: Por una vez veo más fácil solucionar el problema de xtrem00 en puto y asqueroso LISP que en C jajajaja
Aracem escribió:para Xtrem00

Imagino que si te están pidiendo estas cosas ya sabrás punteros o eso espero, de todas formas se puede hacer estático pero queda más chano :S

Lo que puedes hacer es crear un vector para ir guardando los números que se van repitiendo.
int *repeticiones=NULL

repeticiones = (int *) malloc (sizeof (int) * 1)); //Comprobar que se ha reservado bien siempre!
//inicializas
repeticiones[1] = 1;



Vas quitando las repeticiones y sumando uno a su correspondiente "repetición[i]". Cada vez que añadas un nuevo número haces un realloc para reajustar la memoria. TAmbién puedes hacerte una función para ver el número de números diferente y así es más fácil todos los bucles y la reserva de memoria, pero eso ya como veas.
Si no te gustan los punteros puedes crearte un vector de tamaño fijo "int repeticiones[20]" pero es muchísimo menos eficiente y tienes que controlar más cosas (como que el número de números difenrentes no sea mayor a 20 en este caso etc)


Hoy hemos empezado el tema de punteros, pero en el exámen práctico no podemos usar estos conocimientos, porque no entran xD, gracias igualmente, me servirá en un futuro cercano.

Intentaré usar el vector que explicas, gracias.
xgc1986 escribió:para la division sin /, es muy sencilla
//A / B
int i = 0;
while (A >= B) {
  A -= B;
  i++;
}
// al final del bucle la solucion es la variable i
   


Pero esto solo sirve para divisiones exactas y para A>B no?, eso me salió fácil, pero cuando B>A o la división no es exacta no se qué hacer...
si, es para divisiones exactas, por ejemplo 5/2 = 2. si quieres poner decimales entonces
//A / B
int i = 0;
while (A >= B) {
  A -= B;
  i++;
}
printf("%d,", i);
int ndecimales = 0;
int maximodecimales = 10; //cuantos decimales queremos
while (A!= 0 && ndecimales <= maximodecimales) {
  A *= 10;
  while (A >= B) {
    A -= B;
  }
  printf("%d", A);
  ndecimales++;
}
printf("\n");

aun no he probado este codigo, pero diria que la division la hace bien, hace redondeo hacia cero, por ejemplo con 3 decimales el numero 2,9999 lo redondea a 2,999 y no a 3


para el problema a la hora de ordenarlos por frecuencia, puedes utlizar un vector auxiliar y ahi dices cuantas veces aparece cada uno, con la posicion relativa al otro vector/array que usas, la primera vez ordenas los dos con el metodo que quieras en funcion de tener los numeros de menor a mayor, y luego los dos segun la frequencia que esta en el otro vector. es muy lioso escribirlo, espero que sirva

PD: sobre lo de los divisiores, soy muy cabezon y se que cuando tengo razon odio que me digan que no, ademas tengo mucho trabajo ultimamente y ando algo estresadillo, mi intencion no es ofender a nadie ni creerme superior a nade, pero enfatizando que soy profesor lo hacia para que no me lo discutieseis el ejercicio.
xgc1986 escribió:para el problema a la hora de ordenarlos por frecuencia, puedes utlizar un vector auxiliar y ahi dices cuantas veces aparece cada uno, con la posicion relativa al otro vector/array que usas, la primera vez ordenas los dos con el metodo que quieras en funcion de tener los numeros de menor a mayor, y luego los dos segun la frequencia que esta en el otro vector. es muy lioso escribirlo, espero que sirva


Si si, esta tarde por insipiración divina xD, se me vino la idea de copiar el vector original a otro auxiliar y compararlo con el vector que ya ha eliminado los repetidos y los ha ordenado, tendre que declarar muchas variables, pero espero que sirva.

Gracias.
Bueno, aprovecho el hilo de nuevo, para pediar ayuda con un programa que sinceramente, no termino de hacer ni medio mal. Os dejo el enunciado y mi codigo vale.

"Escribe un programa en C que, dado un número entero mayor que cero, indique en pantalla que dígitos presentaba el número y cuantas veces aparecieron."

Lo que he hecho es un proyecto de programa que coja el numero introducido por el usuario, lo divida entre 10, y se quede con el cociente anterior de 10. Y lo guarde el un array de enteros. La movida esq solo lo divide una vez y se queda hay. La idea serie que lo hiciera siempre que el numero dividido no fuera 0 y lo guardase en las distintas posiciones del array, par aluego de alguna forma ver cuantas veces se repitio un numero.
El array lo muestra infintas veces, no se porq.
#include <stdio.h>
#include <stdlib.h>

main()
{
int division=0, lista[10]= {0,0,0,0,0,0,0,0,0,0,}, numero, j=0;

printf("Introducir numero\n");
scanf("%d",&numero);
   
   division = numero/10;
    while((numero/10 != 0) || (j != 10))
   {
   division = division/10;
   lista[j]= division;
   j++;
   
   for(j=0;j<10;j++)
  {
printf("El contenido del array es %d\n", lista[j]);
  }
  system("PAUSE"); // no me acuerdo que tenia que usar en vez de system("pause")
  }
  }



Agradecer desde aqui a "xgc1986 " que despues del mal empiece que tuvimos con el hilo, me ha ayudado mucho.

Y nada, pedir a los que quieras y puedan una ayuda sobre el codigo (se que estara de culo) pero una ayuda solidaria... Para ver como puedo continuarlo.

Gracias de ante mano.
Mira bien esas llaves.
Crapos escribió:(...)


Estas cosas solo se solucionan con práctica, pero cuando te funcionan casi te corres de gusto. Una cosa, te sobra la última coma en la inicialización del array de lista.

Ahora, no sé si lo has hecho, pero yo de ti cogería un boli y un papel, y haría el proceso paso a paso que habría que seguir. Por ejemplo:
- Tomo un número de entrada, el 3451234.

(0)Grosso modo, hay dos formas de contar los dígitos de ese número: o empiezas contando por el dígito más significativo (3) y vas descendiendo de nivel, o bien empiezas por las unidades (4) y subes de nivel. Te voy a poner el procedimiento para empezar a contar por las unidades, en contra de tu código que parece querer contar por el nivel más significativo e ir bajando hacia las unidades. Creo que es un pelín más difícil de comprender (me va lo chungo, sorry :)), pero espero que aun así te ayude.

(1) Miro si el número de entrada es divisible entre 10. 3451234 no lo es.
(2) Como el número no es divisible entre 10, le resto una unidad y vuelvo a hacer la comprobación. 3451233 tampoco lo es...así hasta 3451230. Tienes que saber de alguna forma cuántas veces has ido restando una unidad, para luego usar ese valor para sumar "1" al array de lista de esa posición.
Como ahora 3451230 sí es divisible entre 10, lo divido y vuelvo a hacer (1) y (2) con 345123, luego con 34512, 3451, 345, 34 y 3.

EDITO: otra forma (creo, más eficiente) de hacer (2) sería:

(2') Asegurándome de haber definido el número 3451234 como entero, lo divido entre 10 y lo vuelvo a multiplicar por 10. El resultado es 3451230. Resto 3451234 menos 3451230, y sumo "1" al índice de la lista del resultado de la resta.
(3') Hago lo mismo con 345123, 34512, 3451, 345, 34 y 3.

Aun así, ¿Por qué no pones trazas en los puntos que tú quieras, y luego cuando el programa funciona como quieres las borras o las comentas? Es decir, colocas trazas para que se te muestre por pantalla las variables cuyos valores sabes de antemano y comprobar su buen funcionamiento.
division = numero/10;
printf("División vale %d", division); //Traza 1
while((numero/10 != 0) || (j != 10))
{
division = division/10;
printf("División vale %d", division); //Traza 2
lista[j]= division;
printf("Lista[%d] vale %d", j, lista[j]); //Traza 3
j++;
 
for(j=0;j<10;j++)
{
printf("El contenido del array es %d\n", lista[j]);
}
system("PAUSE"); // no me acuerdo que tenia que usar en vez de system("pause")
}


Y por dios, elimina el system ese!!! Si quieres que el programa se quede esperando después de mostrarte por pantalla la lista, una opción muy chusquera, pero más segura, es poner otro scanf en lugar de la línea del system:
scanf("%d",&numero);


La movida esq solo lo divide una vez y se queda hay. La idea serie que lo hiciera siempre que el numero dividido no fuera 0 y lo guardase en las distintas posiciones del array, par aluego de alguna forma ver cuantas veces se repitio un numero.

La primera división, fuera del bucle, creo que no ha lugar. Además, las condiciones del while no son correctas. Podrías poner
while (division > 0) // suponiendo que el número de entrada es positivo

El uso de "j" que haces no es correcto: en cada iteración del bucle sumas "1" a "j" cuando lo que deberías sumar "1" es a lista[j], siendo "j" el dígito que has de obtener dentro del while. La clave es obtener "j" por los métodos que te puse en (0) (o por cualquier otro que tú veas mejor).

El array lo muestra infintas veces, no se porq.

Has de cerrar el while antes del for.

PD: joer, se me ha ido la indentación en el código.
Si seguis haciendo los deberes de la gente no aprenderán nunca. Es mejor (pero más dificil) dar pistas.
No no, enserio, no me habies hecho los deveres, me habies ayudado deverdad. Llamarme bobo pero lo habia intentado he intentado y no sabia que mas hacer.

Muchisimas gracias.
140 respuestas
1, 2, 3