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

#531
Cita de: ivancea96 en 28 Diciembre 2013, 01:20 AM
Como se hace para int, se puede hacer para long long.
long long int -> 8 bytes
8 bytes -> 64 bits
2^64 = 18.446.744.073.709.551.616
18 trillones.

Aproximadamente la mitad para los positivos y la otra mitad para los negativos.

El problema no es imprimir 10^18, que si lo acepta, sino que a partir de 10^9 malloc no lo acepta, lo que impone esa limitación en el consiguiente cálculo de los primos. Presupongo que ello se debe al uso de la memoria y en 10^9 ya estaríamos hablando de Gigabyte, si no me salen mal las cuentas con la limitación correspondiente de la memoria en uso por el ordenador.

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

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

#532
Cita de: minari02 en 28 Diciembre 2013, 01:31 AM
Hola, que tal? mira he tratado hacer  mi propia versión yo solo, la diferencia es que este muestra si es primo o no, bueno, te dejo el código dime que te parece, tiene un fallo, ya lo veras.
...........................
talves tu puedes corregirlo, yo no he podido, si es posible hazlo con la una estructura al menos similar, mira esta pagina http://nosolomates.es/ayuda/ayuda/primos.htm de ahí he sacado este método.

143 dice que es primo y no lo es ya que es 11x13.

Sólo comprueba con los múltiplos que has puesto y no con todos hasta la raíz de n. De ahí la necesidad de un for que compruebe todos los posibles divisores, como en esta otra versión para comprobar si son o no primos:


Código (cpp) [Seleccionar]

#include <math.h>
#include <stdio.h>
int main ()
{
   int j, num, n,rq,aux,cont=1;
   printf ("Introduzca numero: ");
   scanf ("%d", &num);
    printf ("2  ");
    for (n=3; n<=num;n+=2) {
            rq=(int) sqrt (n);
            aux=0;
            for (j=3;j<=rq;j+=2){
                if (n%j==0){
                    aux++;
                    break;
                }
            }
            if (aux==0) {
               printf ("%d  ",n);
            }
    }
    return 0;
}


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

:rolleyes: ;) ;) ;) :rolleyes:
#533
Cita de: PerviousNebula en 28 Diciembre 2013, 10:07 AM
Oye me podrias explicar detalladamente como funciona el proceso del for con la funcion toupper por favor  :)


int i;
for (i = 0; texto[i]; i++)
   texto[i] = toupper (texto[i]);
texto[i] ='\0`;


Sencillamente va recorriendo la cadena texto desde el primer caracter, texto[0] hasta el final de la cadena y en cada pasada transforma el caracter a su forma en mayúsculas.

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

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



#534
Ya no sé que decir, tal como te lo puse en el post anterior funcionaba O.K.

Es como el no uso que haces de las funciones que te indiqué para saber si los caracteres son alfabéticos o numérico. Son más "elegantes/profesionales" que las de andar viendo si el código ASCII está entre tales y cuales números.
Y por cierto, sizeof(char) en cualquier plataforma vale 1, que es lo que puse en mi código. Míralo bien.


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

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




#535
Cita de: dato000 en 28 Diciembre 2013, 01:26 AM
Que raro, no me funciono con la de leo, incluso inclui dos while para estar seguro, .......................................................

Que podría estar pasando?? el compilador es gcc y uso codeblocks, no creo que sea un problema de eso no??

Como vistes por el pantallazo, a mí si me funciono, tanto el mío como el de amchacon. Tal vez deberías actualizar la versión del Code::Blocks.

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

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



#536
Cita de: amchacon en 28 Diciembre 2013, 00:50 AM
No no, el cin.ignore después de un cin (que preceda a un getline):
.......................

Perfecto, hace el mismo uso que el while pero más de C++.

#537
Cita de: ivancea96 en 28 Diciembre 2013, 00:37 AM
las cifras de long long int, al menos en mi pc, son de 10^18 x)

Hablo de cifras como entero, que es lo que procede en los primos. ¿Qué maquinón estas usando y qué compilador?. El mío es de 64 bits y Core I7 con 8 Gb de memoria y un tera de disco duro. Tiene tres añitos pero creo que aún no está obsoleto.

Mis limites para un int son:



Sería cuestión de probar con long long int.

P.D:Ya probado, el máximo que admite es 10^8.


#538

Mejor ves la salida al problema que planteas, donde he modificado lo del carácter y en calloc he añadido el segundo argumento: size  char =1. También cambié en el fichero original el COPS swi a 1swi para que cante el error:



Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LONG_ETIQUETA 8
#define LONG_CODOPS 5

typedef enum {FALSO,VERDADERO} booleano;
typedef enum {ETIQUETA,CODOP,OPERANDO} linea;

booleano esComentario(FILE *fd);
char *Etiqueta_Codop_Operando(FILE *fd,int linea);
void erroresEtiqueta(char *etiqueta);
void buscarFinLinea(FILE *fd);
void ignorarEspacios(FILE *fd);
booleano esNumero(char caracter);
booleano esLetra(char caracter);
void erroresCodop(char *codop);

int main()
{
    FILE *fd;
    int car;
    char *etiqueta,*codop,*operando;
    if((fd = fopen("P1ASM.txt","r"))!= NULL)
    {
        while((car = fgetc(fd))!= EOF)
        {
            if(car == ';')
            {
                if(esComentario(fd))
                   printf("COMENTARIO\n");
                else
                   buscarFinLinea(fd);
            }
            else if((isalpha(car)))
            {
                etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
                printf("\nETIQUETA = %s\n",etiqueta);
                erroresEtiqueta(etiqueta);
                ignorarEspacios(fd);
                codop = Etiqueta_Codop_Operando(fd,CODOP);
                printf("CODOP = %s\n",codop);
                erroresCodop(codop);
                ignorarEspacios(fd);
                operando = Etiqueta_Codop_Operando(fd,OPERANDO);
                printf("OPERANDO = %s\n\n",operando);
            }
        }
    }
    else
       printf("No se pudo abrir el archivo");
    return 0;
}

booleano esComentario(FILE *fd)
{
    int car;
    while((car = fgetc(fd))!= '\n')
    {
        if(car == ';')
           return 0;
    }
    return 1;
}

void buscarFinLinea(FILE *fd)
{
    int car;
    while((car = fgetc(fd))!= '\n')
        ;
}

void ignorarEspacios(FILE *fd)
{
    int car;
    do
    {
        car = fgetc(fd);
    }while(car == '\t' || car == ' ');
}

booleano esLetra(char caracter)
{
    if (isalpha(caracter))
        return 1;
    else
       return 0;
}

booleano esNumero(char caracter)
{
    if (isdigit(caracter))
        return 1;
    else
       return 0;
}

char *Etiqueta_Codop_Operando(FILE *fd,int linea)
{
    int car,lon = 0,pos;
    char *cadena;
    fseek(fd,-1,SEEK_CUR);
    pos = ftell(fd);
    if(linea == ETIQUETA||linea == CODOP)
    {
        do
        {
            car = fgetc(fd);
            lon++;
        }while(car != '\t' && car != ' ');
    }
    else
    {
        while((car = fgetc(fd)) != '\n')
           lon++;
    }
    cadena = calloc((lon+1),1);
    fseek(fd,pos,SEEK_SET);
    fgets(cadena,lon+1,fd);
    printf ("%s   \n",cadena);
;
    return cadena;
}

void erroresEtiqueta(char *etiqueta)
{
    int tam,i,caracterInvalido = 0;
    tam = strlen(etiqueta);
    if(tam-1 > LONG_ETIQUETA)
       printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n");
    for(i = 0;i<tam-1;i++)
    {
        if(!(esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&& (etiqueta[i] != '_')){

            caracterInvalido = 1;
        }

    }
    if(caracterInvalido==1)
       printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
}
void erroresCodop(char *codop)
{
    int tam,i = 0;
    tam = strlen(codop);
    if(tam-1 > LONG_CODOPS)
       printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n");
    if(!esLetra(codop[0]))
       printf("\tError:los codigos de operacion deben iniciar con letra\n");
}


;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

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



#539
Cita de: dato000 en 27 Diciembre 2013, 23:45 PM

Básicamente no se como hacer para leer correctamente los datos de y limpiar el buffer entrada, como siempre recomiendan NO USAR fflush(stdin), debe ser un problema con cin.getline, pero en definitiva no se que usar para leer cadenas que tengan el espacio, para leer nombres completos.

Les agradeceria su ayuda con esta duda.
.......................................

La verdad que la limpieza del buffer empieza a ser un martirio. He aquí una salida:


Añadir un simple while:

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>

using namespace std;

struct Nadador
{
    char nombre[30];
    int edad;
    char prueba[20];
    double tiempo;
};

typedef struct Nadador datosNadador;

int main()
{

    datosNadador nuevosDatos;
    datosNadador *p_nuevosDatos;

    p_nuevosDatos = &nuevosDatos;

    cout << "************** Problema 11.3 **************" << endl << endl;

    cout << "Digite el nombre del nadador:  "; cin.getline(p_nuevosDatos->nombre, 30, '\n');
    cout << "Nombre del nadador:  " << p_nuevosDatos->nombre << endl << endl;

    cout << "Digite la edad del nadador:  "; cin >> p_nuevosDatos->edad;
    while (getchar ()!='\n');
    cout << "Edad del nadador:  " << p_nuevosDatos->edad << endl << endl;

    cout << "Digite la prueba que hizo el nadador:  "; cin.getline(p_nuevosDatos->prueba, 20, '\n');
    cout << "Nombre de la prueba:  " << p_nuevosDatos->prueba << endl << endl;;

    cout << "Digite el tiempo de la prueba:  ";cin >> p_nuevosDatos->tiempo;
    cout << "Tiempo realizado en la prueba:  " << p_nuevosDatos->tiempo << endl << endl;;

    return 0;
}


;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

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



#540
Cita de: ivancea96 en 27 Diciembre 2013, 23:27 PM
Long long :D

Y, si mis calculos no son erróneos:


10^12 supera las cifras del long long int.

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