Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - ERIK546

#11
Cita de: do-while en 29 Junio 2012, 04:52 AM
¡Buenas!

El error de tu codigo es que declaras d como un puntero a entero.

Estas intentando utilizarlo como un vector, pero es un puntero que en principio apunta a cualquier parte de la memoria, por lo que estaras intentando escribir en alguna parte del programa en la que no tengas permiso para escribir, o estaras sobreescribiendo otros datos de tu programa.

Una solucion podria ser asignar dinamicamente una dimension para esta variable. No te lo aconsejo, porque en principio no sabes cuantos divisores va a tener tu numero, por lo que podria tener mayor cantidad de divisores que la dimension que le indiques.

Otra solucion seria ir aumentando la memoria cada vez que encuentres un divisor. Un coñazo y hay formas mas sencillas de resolverlo.

Mas alternativas... En lugar de utilizar punteros, declara un vector estatico con una dimension. (Volvemos al problema de dos parrafos mas arriba)

La mejor solucion, olvidate de los vectores y los punteros para este problema. No te hacen falta para nada. Si encuentras un divisor, lo acumulas en una variable y punto. Sencillo y rapido. (Esta era la solucion buena. XD)

¡Saludos!
Muchas gracias do-while no lo había visto de esa forma, ahora ya lo he resuelto y corre a la perfección, dejo el código:

#include <stdio.h>
#include <stdlib.h>
int suma(int n);
int main(int argc, char *argv[])
{
    int n;
   
    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
    printf("Introduce el numero\n");
    scanf("%d",&n);
    printf("El resuldado es: %d\n",suma(n));
   
    system("PAUSE");
    return 0;

   int suma(int n){
       int i;
       int d;
       int c;
       c=0;
       for(i=1;i<n;i++){
                        if(n%i==0){
                                   d=i;
                                   c+=d;
                                   }
                        }
                        return c;
       }
#12
Hola, esta semana he estado haciendo muchos programas y ocupo mucho de la ayuda de esta excelente comunidad; esta vez ocupo hacer una función en un programa(es importante que sea una función) que lo que haga es sumar todos los divisores de un número n, sin incluir al número n en la sumatoria. He desarrollado la función, pero lamentablemente me marca error en la condición de un "if" que se encuentra en la función. Espero que me puedan orientar para arreglar este problema y me dijeran ¿Porqué no se puede hacer lo que intento? ya que considero que no hay errores de sintaxis, y al menos para mí tiene lógica lo que se pretende. Gracias de antemano; les dejo el código:

#include <stdio.h>
#include <stdlib.h>
int suma(int n);
int main(int argc, char *argv[])
{
    int n;
   
    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
    printf("Introduce el numero\n");
    scanf("%d",&n);
    printf("El resuldado es: %d\n",suma(n));
   
    system("PAUSE");
    return 0;

   int suma(int n){
       int i;
       int c;
       int *d;
       for(i=1;i<n;i++){
                        if(n%i=0){
                                   d[i]=i;
                                   }
                        }
       c=0;
       for(i=1;i<n;i++){
                        c+=d[i];
                        }
       return c;
       }
#13
Cita de: maxim_o en 28 Junio 2012, 22:57 PM
Si, yo creo que eso que dices, compara un numero con el caracter nulo... i nunca a valer '/0'.
La condicion deberia ser
Código (cpp) [Seleccionar]

t[i]!='/0'

Hola muchas gracias maxim_o lo he solucionado con lo que me dices, además me di cuenta que solo funcionaba para cadenas de caracteres sin espacios, al usar "scanf" para guardar el texto en el arreglo, así que he utilizado gets(*) para poder trabajar con escritos completos. Gracias por todo me ha sido de mucha ayuda. Les dejo el código terminado:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int i;
    char t[20];
    printf("Programa que cambia las vocales de un texto por la siguiente vocal\n");
    printf("Introduce el texto\n");
    gets(t);
    for(i=0;t[i]!='\0';i++){
                      if(t[i]=='a'){
                                    t[i]='e';
                                    }
                      else if(t[i]=='e'){
                                    t[i]='i';
                                    }
                      else if(t[i]=='i'){
                                    t[i]='o';
                                    }
                      else if(t[i]=='o'){
                                    t[i]='u';
                                    }
                      else if(t[i]=='u'){
                                    t[i]='a';
                                    }
                      }
    printf("%s\n",t);
    system("PAUSE");
    return 0;
}


#14
Ya lo he corregido y corre a la perfección. Sin embargo tengo duda sobre como una cadena de caracteres podría tomar cualquier tamaño; dependiendo del texto que le sea ingresado,  buscaría algo así como un "malloc" para esta cadena de caracteres. Ya que de momento solo podría hacer dichas operaciones para un máximo de 9 caracteres. Gracias por la corrección.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int i;
    char t[10];
    printf("Programa que cambia las vocales de un texto por la siguiente vocal\n");
    printf("Introduce el texto\n");
    scanf("%s",t);
    for(i=0;i<10;i++){
                      if(t[i]=='a'){
                                    t[i]='e';
                                    }
                      else if(t[i]=='e'){
                                    t[i]='i';
                                    }
                      else if(t[i]=='i'){
                                    t[i]='o';
                                    }
                      else if(t[i]=='o'){
                                    t[i]='u';
                                    }
                      else if(t[i]=='u'){
                                    t[i]='a';
                                    }
                      }
    printf("%s\n",t);
    system("PAUSE");
    return 0;
}

También me gustaría saber ¿Porqué no funciona la siguiente condición "if"?, (poniéndola en lugar de la anterior); les dejo escrita la condición, sin embargo poniéndola el programa no hace lo establecido.

for(i=0;i!='\0';i++){....}
#15
Hola a todos, solicito su ayuda para que me digan la razón por la cual el siguiente programa, aunque compila y se ejecuta correctamente, no arroja los resultados esperados. El siguiente programa tiene por objetivo de un texto introducido, cambiar las vocales por la vocal siguiente e imprimir dicho mensaje. Un ejemplo: Al ingresar la palabra: "vestuario", tendría que regresar la palabra "vistaerou".
Les dejo el código:

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

int main(int argc, char *argv[])
{
    int i;
    char t[10];
    printf("Programa que cambia las vocales de un texto por la siguiente vocal\n");
    printf("Introduce el texto\n");
    scanf("%s",t);
    for(i=0;i!='\0';i++){
                      if(t[i]=='a'){
                                    t[i]=='e';
                                    }
                      if(t[i]=='e'){
                                    t[i]=='i';
                                    }
                      if(t[i]=='i'){
                                    t[i]=='o';
                                    }
                      if(t[i]=='o'){
                                    t[i]=='u';
                                    }
                      if(t[i]=='u'){
                                    t[i]=='a';
                                    }
                      }
    printf("%s\n",t);
    system("PAUSE");
    return 0;
}


Gracias a todos de antemano.
#16
Cita de: DickGumshoe en 28 Junio 2012, 00:39 AM
Para hacer la moda, podrías probar algo así:

Creas otro vector del mismo tamaño que a (por ejemplo, el vector se podría llamar moda).

En un bucle for anidado, comparas a[0] con el resto de elementos. Las veces que se haya repetido el número, la almacenas en moda[0]. Así con todos los elementos de a.

Al final, en otro bucle for, buscas qué elemento de moda es el mayor. Así, tendrás la posición del vector donde se sitúa el elemento que más veces se repite.

Saludos.
Gracias ha funcionado la solución que me dices; me parece muy buena la idea que me dices para la moda; Intentaré hacerlo y lo subiré cuando este listo, gracias por todo.
#17
Gracias a todos por sus respuestas ahora he terminado de manera satisfactoria hacer la mediana. Subiré el programa que calcula junto con lo anterior la mediana de n numeros. He modificado un poco las fórmulas para su cálculo debido al arreglo. Les agradecería que me dieran ideas para hacer la moda; que sería la última parte del programa.
Aunque cabe mencionar que en la parte de la media geométrica, sigue de-volviéndome la parte entera. Les dejo el código, agradeceré grandemente sus aportaciones.


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
    int n,i,j,p,w,v;
    float c,d,aux,l,e,ma,mg,mm;
    float *a; 
 
    printf("Programa que calcula la moda, mediana,  media aritmetica y media geometrica de n numeros\n");
    printf("Introduce n\n");
    scanf("%d",&n);
    a=(float*)malloc(sizeof(float)*n);
    printf("Introduce los %d numeros\n",n);
    for(i=0;i<n;i++){
                     scanf("%f",&a[i]);
                     }
    printf("Los %d numeros son:\n",n);
    for(i=0;i<n;i++){
                     printf("%f\n",a[i]);
                     }
    //Media Aritmetica 
    c=0;
    for(i=0;i<n;i++){
                       c+=a[i];
                       }
    ma=c/n;
    printf("La media aritmetica es: %f\n",ma);
   
    //Media Geométrica
    d=1.0;
    for(i=0;i<n;i++){
                     d*=a[i];
                     }
    mg=pow(d,(1/n));
    printf("La media geometrica es: %f\n",mg);
                     
    //Mediana
    for(i=0;i<n;i++){
                     for(j=i+1;j<n;j++){
                                        if(a[i]>a[j]){
                                                      aux=a[i];
                                                      a[i]=a[j];
                                                      a[j]=aux;
                                                      }
                                        }
                     }
    printf("Los numeros ordenados son\n");
    for(i=0;i<n;i++){
                     printf("%f\t\n",a[i]);
                     }                 
    if((n%2)!=0){
               p=((n+1)/2)-1;
               printf("La mediana es %f\n",a[p]);
               }
               else{
                    w=(n/2)-1;
                    v=(n/2);
                    l=a[w];
                    e=a[v];
                    mm=(l+e)/2;
                    printf("La mediana es %f\n",mm);
                    }                                                   
  system("PAUSE");
  return 0;
}
#18
Cita de: DickGumshoe en 27 Junio 2012, 23:41 PM
Eso sucede porque el resto de variables con las que haces operaciones deben ser también de tipo float. De lo contrario, muchas veces al hacer una operación en la que intervengan un float y un int, te dejará solo la parte entera.

Por lo tanto, el código quedaría así:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
    int n,i, j;
    float c, d;
    float ma,mg;
    float *a;

    printf("Programa que calcula la moda, mediana,  media aritmetica y media geometrica de n numeros\n");
    printf("Introduce n\n");
    scanf("%d",&n);
    a=(float*)malloc(sizeof(float)*n);
    printf("Introduce los %d numeros\n",n);
    for(i=0;i<n;i++){
                     scanf("%f",&a[i]);
                     }
    printf("Los %d numeros son:\n",n);
    for(i=0;i<n;i++){
                     printf("%f\n",a[i]);
                     }
    //Media Aritmetica
    c=0;
    for(i=0;i<n;i++){
                       c+=a[i];
                       }
    ma=c/n;
    printf("La media aritmetica es: %f\n",ma);

    //Media Geométrica
    d=1;
    for(i=0;i<n;i++){
                     d*=a[i];
                     }
    mg=pow(d,(1/n));
    printf("La media geometrica es: %f\n",mg);

    system("PAUSE");
  return 0;
}



Muchas gracias aunque me sigue dando problemas lo de la raíz n-ésima; que corresponde a la media geométrica.
#19
Cita de: DickGumshoe en 27 Junio 2012, 22:13 PM

//Media Geométrica
   d=0;
   for(i=0;i<n;i++){
                    d*=a[i];
                    }
   mg=pow(c,(1/n));
   printf("La media geometrica es: %f\n",mg);


Lo que haces es inicializar la variable d a 0, y después con

d*=a[i];

multiplicas d (0) por un valor, que dará 0. Así, el resultado de d al salir del bucle será 0.

Además, en el pow deberías poner

mg = pow(d, (1/n));

(tenías puesto como base a c en vez de a d).

Por lo tanto, podrías hacer algo así:


//Media Geométrica
   d=1;
   for(i=0;i<n;i++){
   d*=a[i];
   }
   mg=pow(d,(1/n));
   printf("La media geometrica es: %f\n",mg);


Saludos.

Muchas gracias DickGumshoe, lo he corregido respecto a lo que me dices. Antes de subir la mediana que ya he completado; he encontrado un error muy importante en todas las funciones que realiza este programa. Al obtener la media aritmética y la media aritmética no me puede regresar valores flotantes. Aunque dichas variables resultantes ma (media aritmética) y mg (media geométrica) han sido declaradas como flotantes. Al realizar las operaciones que corresponden a cada una de ellas solamente me regresan la parte entera del resultado. Si alguien pudiera por favor revisar el código y decirme ¿Porqué sucede esto? se lo agradecería mucho. Gracias por toda la ayuda hasta ahora.
Les dejo el código ya con las correcciones señaladas:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
    int n,i,c,d,j;
    float ma,mg;
    int *a; 
 
    printf("Programa que calcula la moda, mediana,  media aritmetica y media geometrica de n numeros\n");
    printf("Introduce n\n");
    scanf("%d",&n);
    a=(int*)malloc(sizeof(int)*n);
    printf("Introduce los %d numeros\n",n);
    for(i=0;i<n;i++){
                     scanf("%d",&a[i]);
                     }
    printf("Los %d numeros son:\n",n);
    for(i=0;i<n;i++){
                     printf("%d\n",a[i]);
                     }
    //Media Aritmetica 
    c=0;
    for(i=0;i<n;i++){
                       c+=a[i];
                       }
    ma=c/n;
    printf("La media aritmetica es: %f\n",ma);
   
    //Media Geométrica
    d=1;
    for(i=0;i<n;i++){
                     d*=a[i];
                     }
    mg=pow(d,(1/n));
    printf("La media geometrica es: %f\n",mg);
   
    system("PAUSE");
  return 0;
}
#20
Cita de: DickGumshoe en 27 Junio 2012, 21:23 PM
El problema lo tienes aquí:

    mg=pow(c,(1/n));
   
Para usar la función pow debes incluir la librería math.h

Saludos.
He incluido la librería que dices, sin embargo sigue sin dar el resultado correcto.