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

#761
Cita de: amchacon en 24 Mayo 2013, 10:45 AM
.........................................................
Por otro lado, sé más concreto con tus errores (¿Con no mostrar nada significa que muestra valores incorrectos?)

EDITO:

Acabo de ver tu código, vuelvete a repasar los principios básicos porque tienes muchos errores garrafales. Demasiados como para poder señalarlos (la mayoría con variables sin inicializar).



                                                                               
Está desesperado porque el código le funciona  :silbar: , en el sentido que introduce un país y capital  y los imprime bien, pero no así la temperatura.

Otra cosa es que está muy verde, le falta implementar un bucle para ir introduciendo distintos países, capitales  y ni te cuento lo de las temperaturas, más aún calcular la media. ¿Pero la media de qué temperaturas, la de los días de la semana -sí, ya sé que puso eso porque copió al pie de la letra lo que le habían sugerido- ?. No se ha dado cuenta  que por lógica debería calcular la media de las temperaturas de los países introducidos, a menos que construya  un  array para guardar los valores de temperaturas de cada país, pero  diario,semanal, mensual anual o vaya usted a saber y ..............
Me cansa un poco este tema. Abandono ...... por ahora  ;)

Saluditos!. .... ..


#762
Cita de: mr.blood en 24 Mayo 2013, 10:37 AM

Leí:Pero no ví:...................................................
Esta tarde intentaré arreglarlo para que funcione con más cifras ;).

Quedo a la espera de noticias, reconozco que para lo que querías, generar aleatorios entre 0 y 100 la idea es buena  ;-) ;-), pero al tener que elegir entre 0 y mil la cosa cambia. ¿Probastes el código como el tuyo pero con el do-while?. porque si comparastes con el post dode tomo los números de 0 a 1000 es lógico que el tiempo sea superior, ha de realizar comparaciones no siendo así en el que usa la clase vector. .....Esto de estar sin compilador un par de días me tiene hablado solo  :P

Saluditos!. .... ..


#763
Cita de: mr.blood en 24 Mayo 2013, 08:35 AM
Dejo una alternativa que me parece que es más eficaz. (No recorre toda la matriz para comprobar si existe o no el valor).

Como necesitas tener todos los números del 0-99 es mejor aleatorizar la posición que el valor (Creo). ;)

...................................

Sa1uDoS

El problema es que los 100 números que necesita son entre 0 y 1000.

Lástima porque la idea era buena.
 
Lamentablemente no tengo compilador en este momento y no puedo comparar, pero creo que siguiendo lo que planteaste de obtener aleatorios de 0 a 100, aunque recuerda que en realidad era "entre" 0 y 10000, el siguiente código podría ser de eficiencia/velocidad semejante.:

Código (cpp) [Seleccionar]

#include <iostream>    
#include <algorithm>    
#include <vector>      
#include <ctime>        
#include <cstdlib>
using namespace std;

int main()
{
   int i,j,k=0;
   int m[10][10],numeros[100];
   srand ( unsigned ( std::time(0) ) );
   vector<int> n;
   for ( i=0; i<100; ++i)n.push_back(i+1);
   random_shuffle ( n.begin(), n.end() );
   for(i=0;i<10;i++,k++) {
       for(j=0;j<10;j++,k++){
           m[i][j]=n[k];
       cout<<m[i][j]<<"\t";
       }
       k--;
       cout<<endl;
   }  
   system("pause") ;
   return 0;
}



Aunque para realizar comparaciones de "potencia de cálculo" habría que suprimir la impresión de la matriz al completo y poner un sólo puts, o printf o cout que indique el final del proceso ya que si no el resultado de tiempos estará "muy" influenciado por la tarjeta gráfica, me refiero a la hora de comparar resultados entre distintas máquinas con procesador parecido.

Por aportar algo diferente pongo este código con un do-while  que, a diferencia del for, no tiene que restar (i--) por lo que se presupone algo mas eficiente.Es un decir porque cambia el i++ por una comparación.  Pero al hablar de eficiencia tendríamos que comparar con matrices muy superiores en dimensión para que fueran perceptibles esas diferencias. Pero bueno, como ejercicio no rstá mal lo que est´s dsliendo de este tema.


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
srand(time(NULL));
int matriz[10][10]={0}, i=0, j,x,y;
do{
x=rand()%10;
y=rand()%10;
if (matriz[x][y]==0){
            matriz[x][y]=i;
            i++;

}

}while (i<100);

for(i=0;i<10;i++)
{
putchar('\n');
for(j=0;j<10;j++)
printf("%i\t", matriz[i][j]);
}
    return 0;
}


Por otro lado sería interesante  comparar realizando el cálculo con varios hilos a ver la influencia del multiproceso/multiCPU, suponiendo que el compilador está preparado para hacer uso de los multinúcleos.

Y en el segundo código hay que empezar por el valor menor de los generados aleatoriamente, que habrá que saber cuál es, así como su posición inicial, para a partir de la misma empezar el movimiento. Eso daría como resultado sólo cuatro comparaciones en cada posición a realizar por comodidad con una función, ya que en cada movimiento hay que volver a comparar.

En definitiva, has  animado este post, aunque, repito, te salieras del guión.

Saluditos!. ... ..[/size]



P.D: Esta noche cuelgo el código con los valores tomados de 1 a 1000 "sin hacer comparaciones".
#764
Me gustaría mucho ayudarte porque es de los temas que a mí personalmente me gustan, los numéricos, pero antes tienes que colgar algo del código. Intenta "algo", construye un código con al menos lo básico, las librerías de cabecera,incluyendo la math.h si deseas comparar el valor calculado con el real, si no ni eso te hace falta,  la función main, una declaración de las variables que vas a usar y al menos un intento con un while para calcular el seno.Con esto y lo comentado por amchacon tienes para hacer lo mínimo, insito.

Te dejo una "pista":


Código (cpp) [Seleccionar]
sen (x) = x - x^3/3! + x^5/5!- x^7/7!+.......
Comentario: En este programa cada fracción que se añade a la
serie se calcula  a partir del anterior. Se tiene en
cuenta que los distintos términos "cambian de signo
alternativamente", y que cada uno es el anterior multiplicado por  x
el cuadrado de x, y dividido por  (2*i-1)*(2*i-2)


Aunque aparezcan los factoriales en el desarrollo no hay ni que calcularlos con un mínimo de imaginación.

Y para que ves que funciona, una salida del programa:


Código (cpp) [Seleccionar]

Este programa calcula el valor del seno.
Introduce el valor del angulo en grados: 45

Valor estimado: 0.7071080798594736
Valor exacto: 0.7071080798594736
Numero de terminos utilizados: 10


No hay mayor problema en hacerlo en radianes, es incluso más fácil ya que la función que se encarga de ello "sin(x) viene por defecto para hacer el cálculo en radianes.

Saluditos!. ....

#765
Cita de: carrlos en 24 Mayo 2013, 00:32 AM
ok esta bien pero quiero es una idea d como hacerlo para arrancar y comparar

Conociéndote ya "vuelves a pretendrer que te hagamos el código, Pero por dios, si tienes que entrar diez capitales y otros tantos países y no tienes ni un mísero for para ello..

Anda, piensatelo mejor y postea un código minimamente decente para que te podamos ayudar.

Saluditos!. ... ..



#766
Cita de: rir3760 en 23 Mayo 2013, 16:53 PM
Código (cpp) [Seleccionar]
int i, j;

// ...

vector<int> n;
for (i = 0; i < 1000; ++i)
  n.push_back(i + 1);
random_shuffle(n.begin(), n.end());

for (i = 0; i < 10; i++)
  for (j = 0; j < 10; j++)
     m[i][j] = n[i * 10 + j];
}


Un saludo

Gracias por la observación, me disculpa un poco que estoy haciendo los códigos "a pelo", me crujió  CodeBlocks tras una dichosa actualización del WindowsUpdate.

Y para que esta aportación no se quede en unas meras disculpas, propongo el método alternativo de generar los números por comparación con los previamente introducidos, sería para sustituir por lo que hay "encima" de estas palabras:


Código (cpp) [Seleccionar]

........................
for( i = 0; i < 100; i++){
       numeros[i]=rand() % 1000+1;
       for( j = i-1; j >=0 ; j--){
           if(numeros[i] == numeros[j]){
               i--;
               break;
           }
       }
   }
   cout<<endl;   cout<<endl;
   for(i=0;i<10;i++){
       for(j=0;j<10;j++){
           p[i][j]=numeros[k++];
           cout<<m[i][j]<<"  ";
           }
       cout<<endl;
   }


Aunque seguro que se puede mejorar, la verdad no me termina de convencer el for con el if y el i-- con break, pero funciona, digo simplemente que alguien más curtido en C/C++ seguramente lo podrá mejorar. Y yo estoy deseoso que sea así, ¿coges la indirecta amigo rir?

Saluditos!. .... ..
#767

Creo que te has hecho la p*cha un lío. No me explico como no metes la gamba entre tanto paréntesis y goto, con lo fáciles que son los do-while a la hora de revisar el código. Pero en fin, tú mismo.

Creo que andabas buscando una salida como esta:


Código (cpp) [Seleccionar]

escriba el exponente de la ecuacion = 4
escribir el primer coeficiente (numero)= 2
escribir el segundo coeficiente (numero)= 3
escribir el primer coeficiente (letra en minuscula)= a
escribir el segundo coeficiente (letra en minuscula)= b
+16 a^ 4-96 a^ 3 * b^ 1+216 a^ 2 * b^ 2-216 a^ 1 * b^ 3+81 b^ 4
Presione una tecla para continuar . . .

Mejor escrito:

16 a^4 - 96 a^3 b + 216 a^2 b^2 - 216 a b^3 + 81 b^4



con signos, coeficientes numéricos y coeficientes "letrados"  ;)

Ta´bien, te paso el código:
:)

Código (cpp) [Seleccionar]


#include <iostream>
#include <cmath>    
#include <cstdlib>  
using namespace std;

float comb(int n,int p)
{
   int i;
   if (n < 0 || p < 0 || p > n) return 0;
   float c = 1;
   if (p>n/2)
       p=n-p;
   for ( p; p>=1; p--,n--)
   c*= n/p;
   return c;
}
int main()
{
   long int n,c,d,p, num ,y, y1=0,expon;
   char coef_1,coef_2,signo,a,b;
   cout << "escriba el exponente de la ecuacion = ";
   cin >> expon;
       
   do{
       cout << "escribir el primer coeficiente (numero)= ";
       cin >>coef_1 ;
   }while (coef_1<48 || coef_1>58);
   do{
   cout << "escribir el segundo coeficiente (numero)= ";
   cin >>coef_2 ;
   }while (coef_2<48 || coef_2>58);
   do{
       cout << "escribir el primer coeficiente (letra en minuscula)= ";
       cin >>a ;
   }while (a>64 && a<96);
   do{
   cout << "escribir el segundo coeficiente (letra en minuscula)= ";
   cin >>b ;
   }while (b>64 && b<96);
   n=expon;
   c=coef_1-48;
   d=coef_2-48;
   for (p=0; p<=n; p++,y1++)
   {
       num = comb(n,p);
       y=n-p;
       if ( p%2==0)
           signo='+';
       else
           signo='-';
       if (p==0 )
           cout<<signo<< pow(c,n) <<" " << a <<"^ " << n;
       else if ( p==n)
           cout <<signo<< pow(d,n) <<" "<< b <<"^ " << p ;
      else {

       cout <<signo<< num*pow(c,n-y1)*pow(d,y1) <<" "<<a<< "^ " << y << " * " << b<<"^ " << p  ;
      }
    }
   cout <<endl;
   system("pause") ;
   return 0;
}



Espero te sirva de referencia al menos.

Por cierto lo del número combinatorio es para obtener potencias superiores a 12, que si no salen más es porque C/C++ "no pueden" con números tan grandes como los que originan los factoriales al calcular los números combinatorios y de esta manera pueden ser de 20 y más, dependiendo de los coeficientes .Si son uno no hay problema pero cuando los subes, la combinación entre el tamaño de los combinatorios y las potecias de los mencionados numeros hacen que el exponente no pueda ser muy grande. Son las miserias cel C/C++ con números grrandes como ya te indiqué. Habría que usar una librería de números grandes, como GMP, para poder hacer cálculos sin esas limitaciones del C/C++.Una explicación más amplia en: Teorema Binomial

Saluditos!. .... ..




P.D:A mí personalmente no me acaba se satisfacer el código ya que limitas la entrada de coeficientes a números entre 0 y 9, cuando declarándolos directamente como int en lugar de char no tendrías esa limitación. O bien los declaras como char pero como array para pillar todas las cifras y luego hacer una conversión de cadena a entero, que para eso existen las funciones apropiadas. Pero bueno, tal como lo tenías he procurado no "menartelo" mucho.
:laugh:
#768
:-)

Vamos a ver si me aclaro con lo que has hecho.

* Declaras una función como bool y le pones dos retornos "seguidos". ¿No te das cuenta que al encontrar el primer return la función "devuelve" ese valor y retorna, como su nombre indica, a la función main y por lo tanto nunca pillará el segundo return?. Conclusión, te sobra un return.

* Pero ¿la función llenar realmente tiene que devolver algo?. Lo único que hace es rellenar la matriz y punto y pelota, no devuelve nada, por lo tanto dicha función deberías declararla como void en lugar de bool.

* Ahora viene lo mejor. Llenas la matriz con números aleatorios y para evitar que se repitan haces una cosa muy curiosa. Aplicas lo siguiente:

Código (cpp) [Seleccionar]
m[i][j]=
rand() % 100 + 1;
v[i][j]=m[i][j];
   
if(m[i][j]!=v[i][j])
   m[i][j]=rand() % 100 + 1;


* Veamos, en una línea "igualas" v a m y en la siguiente, en el if, te planteas "si"  v es distinto a m hago tal cosa. ¿Pero como van a ser distintos si inmediatamente antes los has igualados?. Para que compruebes que nunca se entra en la condición del if te propongo que sustituyas el if que tienes por este otro:

Código (cpp) [Seleccionar]
if(m[i][j]!=v[i][j]){
   cout<<" entro";
   m[i][j]=rand() % 100 + 1;
   }


ejecuta el programa y verás que nunca se imprime "entro", ¡porque nunca se va a cumplir la condición de que son distintos!, los habias igualado previamente.

* Consecuencia de ello es que estas rellenado la matriz "m" con números alatorios de 1 a 1000, y claro, existe la posibilidad de que se repitan, no hay ninguna restricción para que los aleatorios que se generen sean distintos, tan solo por la casualidad o azar puede hacer que los 100 números generados entre los 1000 sean distintos, pero tan sólo sería eso, una casualidad.

* Consecuencia de la consecuencia, además de generar los aleatorios has de "idear" un sistema que te permita no repetir en cada número nuevo que generas el que coincida con los generados anteriormente. Para esto hay varias soluciones, la más inmediata y lógica es ir comparando cada nuevo valor generado con los generados anteriormente. Te lo dejo para que lo intentes. A mí personalmente, en este caso, no me parece muy eficiente ya que al menos hay que hacer 540 comparaciones. Otro método más eficiente, ya que hace "0" comparaciones , aunque coma de entrada más memoria, es llenar un vector con los 1000 números,  y tomar los elementos de la matriz  de ese vector de forma aleatoria. Incluyendo en la cabecera del código las librerías "#include <vector> y #include <algorithm>  " todo esto lo haces incluyendo en tu función llenar lo siguiente:


Código (cpp) [Seleccionar]

   int i,j;
   ................
   vector<int> n;
   for ( i=0; i<1000; ++i)n.push_back(i+1);
    random_shuffle ( n.begin(), n.end() );
   for(i=0;i<10;i++)
       for(j=0;j<10;j++)
           m[i][j]=n[(10*i)+(j+1)];
       
   }


* Lo cual nos lleva otra vez a la función llenar y mostrar , ¿para que le pasas como argumentos a i y j, que son variables que no tienen asignados ningunos valores y no "pintan" nada el pasarlos como argumentos?. Sencillamente quitalos y como te puse en el código anterior los declaras como int en la función llenar y mostrar y, de paso, quitalos también de la función main porque ahí, hasta ahora, no hacen nada.

Con lo que te he expuesto ya tienes creada la matriz de 10x10 con números del 1 al 1000 elegidos de forma aleatoria y sin repetir. Ahora te toca "mover pieza" a tí, es decir, intenta implementar la búsqueda del mínimo de la matriz, es muy fácil, una simple comparación con dos for usando tres variable que puedes llamar "minimo",imin,jmin  declaradas como int, al mismo tiempo que declaras a i y j en main si no te quieres complicar la vida, y  a partir de ahí ya te empiezas a plantear realmente el problema de cómo mover la pelotita. También puedes calcular esos valores minimos en la función llenar, pero entonces sí tendrías que pasr a la función llenar esas variables como argumentos y pasarlos por referencia, puesto que sus valores se modificarían de los declarados en la función main, que para no complicarte la vida los inicializas a cero. Pero tal como te veo de "verde", mejor lo haces en la función main. ;)

* Por cierto, no tienes bien aclarado cómo se mueve si la pelotita se encuentra en una casilla donde todas las adyacentes son menores, ¿qué hace en ese caso?. Explícalo mejor, no queda claro en el enunciado que has puesto.

Saluditos!. .....


Reeditado.
#769
Como su nombre indica, de repente el Code::Blocks al intentar compilar los códigos .cpp me suelta el siguiente error:

Citar
c:\conoci\programacion\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\cwctype|91|error: '::iswblank' has not been declared|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|


Ha sido de repente, sin haberle cambiado ninguna opción y me pasa con cualquier .cpp, sin embargo los .c los ejecuta de forma normal.

Ya he probado a desinstalar y volver a instalar y continúa el error y lo más extraño es que ha sido así de repente.

¡Helpme,please!, me veo en estos momentos con el vetusto Dev-Cpp para ejecutar los .cpp y es como volver a la edad de piedra.


Saluditos! ..... ...
#770
Cita de: superkorlas en 22 Mayo 2013, 14:18 PM
Por cierto, me dijisteis para que volviera sin usar el goto, poniendo lo de indice = 0 .....  Pero cómo funciona, es decir, una pequeña explicacion para saber utilizarlo yo en caso de necesidad, es que no se como funciona, simplemente lo he puesto, pero no me gusta poner cosas sin saber de donde vienen ni como usarlas xd, sabran a lo que me refiero xd.

El índice cero es lo que suele llamarse bandera o flag, avisa de que algo ha sucedido, en este caso si es distinto de cero, o no en cuyo caso toma el valor cero.

Tal como está implementado fíjate que al comparar las cadenas si éstas son iguales entras en el "cuerpo" del if y la variable índice se incrementa, tomando el valor 1, de forma que si no se incrementa, se queda en cero y es que no encontró  actuando entonces el cout "no encontrado". Observa que después de una comparación vuelve a actuar el while(1) para realizar la siguiente búsqueda, para lo cual vuelvo a inicializar índice a cero y se repite la historia.

Si te quedan dudas vuelve a preguntar.

Saluditos!. ... . ..