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

#421

Creo que presuponer que si cin no es uno tiene que ser menos uno, no sé yo.

De todas formas tal como te apuntaba rir3760 el método tiene entre otros el inconveniente que si se introduce una cadena como 12as el cin toma el 12 como número.

Creo más seguro declarar otra variable buscado_char como char y comprobar en una función, más que nada para que sea más modular el código, que todos sus caracteres son numéricos. Esto se puede hacer con la función isdigit o a pelo:


Código (cpp) [Seleccionar]

/**********    FUNCION COMPRUEBA ENTERO   *************/
int comprobar_cadena_como_numero (char cadena[100]){
    for (int i=0;cadena[i];i++){
      if (cadena[i]<'0' || cadena[i]>'9'){
            return 1;
        }
    }
    return 2;
}
/********************************************************/
  ....................
  cout<<"Select song:"<<endl;
  char buscado_char[100];
  cin>>buscado_char;
  if (comprobar_cadena_como_numero(buscado_char)==2){
    buscado=atoi(buscado_char);//si es un numero entero tiene que hacer todo esto
    encontrado=findIdSong(collection, buscado);
    }
  else
    cout<<"Error: Unknown song "<<buscado<<endl;
  ........................................


¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:
#422

Antes que nada cuando postees código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Tienes varias respuesta a tu problema en este tema.

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:

#423
Cita de: casidus en 14 Febrero 2014, 11:32 AM

tengo que hacer un programa que me lee de un fichero txt una matrices de longitud variable, por ejemplo:

1 2 1
1 1  
1   1

...................................................................
yo hasta ahora lo que hacia era lo siguiente;

fscanf(files [a], "%[^\n]s", temp)

temp como su nombre dice en una variable temporal del tipo char [] lo suficientemente grande para que coja una linea.

la primera linea me la lee perfectamente, pero ahi se queda solo me lee la primera.
..........................................

Antes que nada cuando postees código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Creo que resulta más natural usar ;)

Código (cpp) [Seleccionar]
fgets(temp, 80, files[i])

¡¡¡¡ Saluditos! ..... !!!!



#424
Programación C/C++ / Re: modificacion codigo ???
13 Febrero 2014, 20:57 PM
Es decir, amigo Luis, además de las diferencias, digamos en horizontal de una línea, quieres las diferencias de una línea con la siguiente. Esto si sale nos forramos y no olvides que voy a un porcentaje en los beneficios de tu Empresa. ;)

Por si no lo he tenido claro te pongo lo que creo que pides.

En un texto están las líneas de números:


Código (cpp) [Seleccionar]
17 21 23 32 39 40
13 16 21 22 25 34
19 20 25 27 39 49
15 24 33 37 45 46
13 21 22 30 32 49
11 17 21 24 25 26
10 14 18 20 27 43
13 14 25 36 43 49
10 12 20 21 28 32
13 19 20 27 28 32


y lo que tú quieres es ...¡¡¡tachán, tachán!!!:

Citar
* 17 21 23 32 39 40 * [1]
   1  1  1  1  1"  ==>dif_horizontal

* 13 16 21 22 25 34* [2]
   3  5  1  3  9  ==>dif_horizontal
-4 -5 -2-10-14 -6  ==>dif_vertical

* 19 20 25 27 39 49* [3]
   1  5  2 12 10  ==>dif_horizontal
 6  4  4  5 14 15  ==>dif_vertical

* 15 24 33 37 45 46* [4]
   9  9  4  8  1  ==>dif_horizontal
-4  4  8 10  6 -3  ==>dif_vertical

* 13 21 22 30 32 49* [5]
   8  1  8  2 17  ==>dif_horizontal
-2 -3-11 -7-13  3  ==>dif_vertical

* 11 17 21 24 25 26* [6]
   6  4  3  1  1  ==>dif_horizontal
-2 -4 -1 -6 -7-23  ==>dif_vertical

* 10 14 18 20 27 43* [7]
   4  4  2  7 16  ==>dif_horizontal
-1 -3 -3 -4  2 17  ==>dif_vertical

* 13 14 25 36 43 49* [8]
   1 11 11  7  6  ==>dif_horizontal
 3  0  7 16 16  6  ==>dif_vertical

* 10 12 20 21 28 32* [9]
   2  8  1  7  4  ==>dif_horizontal
-3 -2 -5-15-15-17  ==>dif_vertical

* 13 19 20 27 28 32* [10]
   6  1  7  1  4  ==>dif_horizontal
 3  7  0  6  0  0  ==>dif_vertical

Está visto que el destino no deja que nos separemos. :rolleyes: :rolleyes: :rolleyes:

Te recuerdo que el tema de ficheros no es mi fuerte así que espero que algún erudito en el tema lo mejore.

Lo que si te he dejado en el código son tanto los printf, para ver el resultado en pantalla, como los fprintf, para grabar el fichero. Por cierto, fíjate que los he renombrado con un cero al final de los mismos, así no perdía los anteriores.


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

int main()
{
 int i=0,j=0,k=0,y[2][6];
 FILE* fichero,*fich;
 fichero = fopen("combiLuis0.txt", "r");
 if ((fichero = fopen("combiLuis0.txt", "r")) == NULL){
   perror("combiLuis0.txt");
   return EXIT_FAILURE;
 }
 fich = fopen("CombiDiferanciasLuis0.txt", "w");
 if ((fich = fopen("CombiDiferanciasLuis0.txt", "w")) == NULL){
   perror("CombiDiferanciasLuis0.txt");
   return EXIT_FAILURE;
 }
 while (fscanf(fichero,"%d %d %d %d %d %d ", &y[i][0], &y[i][1], &y[i][2], &y[i][3], &y[i][4], &y[i][5] )==6){
   i++;k++;
   if (i==1){
     printf("\n*");
     fprintf(fich,"\n*");
     for (j=0;j<6;j++){
       printf ("%3d",y[0][j]) ;
       fprintf (fich,"%3d",y[0][j]) ;
     }
     printf(" * [%d]\n  ",k);
     fprintf(fich," * [%d]\n  ",k);
     for (j=0;j<5;j++){
       printf ("%3i",y[0][j+1]-y[0][j]);
       fprintf (fich,"%3i",y[0][j]+1-y[0][j]);
     }
     printf("  ==>dif_horizontal\n");
     fprintf(fich,"\"  ==>dif_horizontal\n");
   }
   else {
     printf("\n*");
     fprintf(fich,"\n*");
     for (j=0;j<6;j++){
       printf ("%3d",y[1][j]);
       fprintf (fich,"%3d",y[1][j]);
     }
     printf("* [%d]\n  ",k);
     fprintf(fich,"* [%d]\n  ",k);
     for (j=0;j<5;j++){
       printf ("%3i",y[1][j+1]-y[1][j]) ;
       fprintf (fich,"%3i",y[1][j+1]-y[1][j]) ;
     }
     printf("  ==>dif_horizontal\n");
     fprintf(fich,"  ==>dif_horizontal\n");
     for (j=0;j<6;j++){
       printf ("%3i",y[1][j]-y[0][j]);
       fprintf (fich,"%3i",y[1][j]-y[0][j]);
     }
     printf("  ==>dif_vertical\n");
     fprintf(fich,"  ==>dif_vertical\n");
     for (j=0;j<6;j++){
       y[0][j]=y[1][j];
     }
     i=1;
   }
 }
 fclose(fichero);
 fclose(fich);
 return EXIT_SUCCESS;
}


Espero que esto te de "vidilla" y sigas profundizando en el tema.

No obstante, te recuerdo que todos estos resultados parciales que vas obteniendo los tendrías que pasar por un programa estadístico que te de las medias, varianzas, desviaciones, intervalos de confianza, etc. Yo en particular te aconsejo el SPSS, es potente y relativamente claro ..... ¡¡¡pero no me lo pidas a mí!!!....., consulta con tus amigos matemáticos. ;)

Un fuerte abrazo de tu amigo León.



¡¡¡¡ Saluditos! ..... !!!!



EDITO:Corregido. ;)
#425
Cita de: Vaagish en 12 Febrero 2014, 17:28 PM
Bueno,, hoy estoy de buen humor..
................................

Y yo, y yo. :rolleyes: :rolleyes: :rolleyes:

Otra forma, por si necesitas usar el valor de la variable suma, es llamar a CalculaSuma y después a compararResultado. Algo así:

Código (cpp) [Seleccionar]
#include <stdio.h>
int calculaSuma(int a, int b);
int compararResultado(int suma);

int main( void ){
 int num1=15,num2=21,sum=0,comparar=0;
 sum=calculaSuma(num1,num2);
 comparar=compararResultado(sum);
 if (comparar==1)
   printf("La suma es %d, mayor de 50.\n",sum);
 else if (comparar==2)
   printf("La suma es %d, justito 50.\n",sum);
 else if (comparar==3)
   printf("La suma es %d, mayor de 18 e inferior a 50.\n",sum);
 else if (comparar==4)
   printf("La suma es %d, justito 18.\n",sum);
 else if (comparar==5)
   printf("La suma es %d, inferior a 18.\n",sum);
 return 0;
}

int calculaSuma(int a, int b){
  int suma;
  suma = a + b;
  return suma;
}
int compararResultado(int suma){
   if (suma>50)
     return 1;
   if (suma==50)
     return 2;
   else if (suma>18 && suma<50)
     return 3;
   else if (suma==18)
     return 4;
   else
     return 5;

}


NOTITA: Lo que nos parece trivial para algunos, para otros les puede resultar un muro insalvable. Nadie obliga a responder a algunos post, basta con pasar de ellos si así lo consideramos. ;)

¡¡¡¡ Saluditos! ..... !!!!



#426

Es conveniente amigo NOB2014 no apuntarse tantos a costa de otros.

No te cuesta nada comentar que el código que propones es un copy-paste del de xiruko en error_fgets.


¡¡¡¡ Saluditos! ..... !!!!



#427
Cita de: eferion en 12 Febrero 2014, 09:51 AM
...............................................
En base a todo esto, y resumiendo, cuando alguien, como en este caso el autor del hilo, es incapaz de hacer una simple búsqueda en google y se limita a esperar a que alguien le sirva la solución en bandeja no espero que cuente con que yo le de dicha solución. Yo le aporto ideas o posibles caminos... pero no le voy a dar la solución porque ese no es el camino...


Totalmente de acuerdo.

Sólo quise aportar métodos más propios de resolver una ecuación ya que el hilo derivo hacia derroteros, como diría .... extraños, como el Método Babilónico. Mi intervención sólo pretendía reconducir la deriva que tomaba el tema.

Y repito lo ingeniosa que resulta tu proposición.


¡¡¡¡ Saluditos! ..... !!!!



#428
¡¡¡Me ausento unos días y ya están tratado de reinventar la rueda!!!

:rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

Vayamos por partes:

Cita de: yoel_alejandro en 10 Febrero 2014, 21:00 PM
Está muy bien este trabajo, y como comentario quisiera señalar que ese algoritmo:
..............................................................
está basado creo que en el "método de Newton" para solución de ecuaciones no lineales, que en el caso de raíces cuadradas también se conoce como método Babilónico.


Como referencia histórica te lo acepto, peros sólo como eso. ;)

Cita de: Gh057 en 11 Febrero 2014, 01:34 AM
...................................................

En cambio el método babilónico se basa en una solución geométrica, en llevar los lados de un rectańgulo hasta formar un cuadrado, en donde su lado es la raíz del área del mismo. Es una explicación bastante sosa, es cierto, pero igualmente me tomé el atrevimiento de modificar un poco el código para que sea más entendible, y personamente más intuitivo:
............................................
Código (cpp) [Seleccionar]
double raiz(double x){  // algoritmo de calculo de raíz cuadrada, método babilónico.
   
   double radio = x, t = 0;
   
   while (t != radio){
       t = radio;
       radio = (x/radio + radio)/2;
   }
   return radio;
}


Creo que te has apuntado un tanto que no es tuyo. Cito textualmente el método expuesto en la Wikipedia:

Código (cpp) [Seleccionar]
double raiz(double x){
   double r = x, t = 0;
   while (t != r){
       t = r;
       r = (x/r + r)/2;
   }
   return r;
}


Reconoce que el parecido es cuanto menos asombroso. ;)

Lo de eferion no termino de entender lo último:

Cita de: eferion en 10 Febrero 2014, 11:41 AM
Podrías optar por un algoritmo que vaya calculando la raiz cuadrada por aproximación y mediante un mecanismo de prueba y error.

1. Empiezas por un número... por ejemplo el 1
2. Ahora asignas un incremento... por ejemplo una unidad.
................................................
También puedes optar por algoritmos más sofisticados y potentes... pero esos no se si los vas a entender y no creo que sean el objetivo de tu práctica.

Como vaya a calcular la raíz de 10000000 va a tener que iterar 10000000 de veces antes de empezar las aproximaciones propiamente dichas. Y lo del incremento arbitrario que tomas lo admito, como lo anterior, como ejemplo. pero sólo como eso. En cualquier caso alabo tu "ocurrencia" para no hablar de métodos que consideras más sofisticados. ;)

Por cierto, ¿de qué algoritmos sofisticados hablas?. Porque yo puedo mencionar algunos elementales como los métodos de la bisección o bipartición,  Regula Falsi, Secante,  Iteración del punto fijo, Newton y sus tropecientas variantes, por mencionar sólo los elementales y todos ellos aplicables por cualquiera que haya estudiado simplemente el Bachillerato.

En el fondo la sensación que me da es que el hecho de tener que calcular la raíz cuadrada ha ofuscado al personal, cuando en este caso se se trata simplemente de obtener la raíz de una función:

Código (cpp) [Seleccionar]
f(x)=x*x-N=0

Personalmente me habría decantado por el Método de bisección por lo simple y fácil de explicar y/o entender, insisto que con un mínimo conocimiento de las Mates del Bachillerato. Y como ejemplo de la impementación al cáculo de la raíz cuadrada de 7:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include<stdlib.h>
#include <math.h>
#define f(x)    (x*x-7)

int main( void )
{
   double a=2,b=3,c=0,h=.000000001,FA=0,FB=0,FC=0;
   int i=1;

  /* if (f(b)*f(a)<0.){
     printf("Como signo de f(b)*f(a) es negativo, hay solucion\n");
   else {
     printf("Como signo de f(b)*f(a) es positivo, hay que elegir otro intervalo.");
.......................................
   }*/

   c=(a+b)/2;
   while ((b-a)>=h ){
       FA=f(a),FB=f(b),FC=f(c);
       if ((FA* FC )>0 ){
         a=c;
         FA=FC;
       }
       else {
         b=c;
         FB=FC;
       }
       c = (a+b)/2;
       i++;
   }
    printf("\n\nLa raiz de %1.8g es %1.8lf.\n\nY el valor real es %1.8lf: \n\nsiendo el numero de iteraciones %d\n\n",N,c,sqrt(N),i);
   return 0;
}


Citar

La raiz de 7 es 2.64575131.

Y el valor real es 2.64575131:

siendo el numero de iteraciones 31

Lo que sí es importante poner de manifiesto es la trascendencia de elegir adecuadamente los valores del intervalo en que se encuentra la raíz a fin de una pronta aproximación a la solución de la ecuación, toda vez que al tratarse de un simple polinomio de grado dos cumple los requisitos exigidos por el método, este y los otros mencionados anteriormente. Pero al tratarse en este caso de hallar la raíz cuadrada de un número real es la obtención de dicho intervalo es algo obvio.


Espero que nadie se sienta ofendido y/o molesto por mis comentarios. Sólo pretendo aportar otro punto de vista al derrotero en que había caído el tema. ;)


¡¡¡¡ Saluditos! ..... !!!!









#429
Cita de: welchu en 11 Febrero 2014, 10:54 AM
Hola, tengo una duda con el siguiente programa:

Un programa que te pida tu nombre y lo muestre en pantalla separando cada letra de la siguiente con un espacio.
Por ejemplo, si tu nombre es "Juan", debería aparecer en pantalla "J u a n"

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

Strlen te da la longitud de la cadena.

Para lo que quieres basta un bucle, por ejemplo con un for:


Código (cpp) [Seleccionar]
#include <stdio.h>
int main()
{
   char texto[40];
   int i;
   printf("Introduce tu nombre: ");
   scanf("%s", texto);
   for (i=0;texto[i];i++)
     printf("%c ", texto[i]);
   getchar();
   getchar();
   return 0;
}


¡¡¡¡ Saluditos! ..... !!!!




#430
Programación C/C++ / Re: problema con sprintf
9 Febrero 2014, 19:58 PM

El problema lo provoca el caracter \n que introduce fgets en la cadena.

Si pruebas con gets o scanf no tendrás ese problema.

¡¡¡¡ Saluditos! ..... !!!!