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

#11
Programación C/C++ / Re: NUMEROS PRIMOS
4 Diciembre 2010, 18:46 PM
Es muy sencillo. En un bucle metes el número a comprobar que se divida con exactitud entre el 2 y un número entero menos que él mismo, y si en algún momento se encuentra alguno, ese número no es primo. Es más, incluso te diré que ese mismo bucle lo puedes poner que se repita hasta la mitad del número introducido, ya que si no es divisible entre la primera mitad, tampoco lo será entre la segunda.
#12
Saludos. Traigo un fragmento de programa en el cual he de crear un juego de black jack. Bien, más o menos tengo una idea de cómo montármelo, sin embargo, al ir probando poco a poco obtengo un problema curioso, y es que el código compila bien, sin embargo, el programa se queda colgado. Concretamente, creo que el problema está al barajar el vector en el que están contenidos los valores de las cartas, ya que es a partir de ahí donde se bloquea, aunque el prompt siga parpadeando.
    for(i=0,j=0;i<4;i++){
        for(val=1;val<=13;j++,val++){
            baraja[j]=val;
        }
    }//Creacion de la baraja
.....................
.....................
        for(it=0;it<500;i++){
            i=rand()%52;
            do{
                j=rand()%52;
            }while(i==j);
            temp=baraja[i];
            baraja[i]=baraja[j];
            baraja[j]=temp;
        }//Barajando la baraja


Al principio pensé que eran demasiadas iteraciones al barajar, pero ni con 5 se resolvía. Hay un printf seguido de un getche tras barajar a modo de comprobación, y al no aparecer es lo que me hace sospechar que pueda haber algún error en ese bucle. ¿Alguna idea?
#13
Es un buen apaño para evitar tener que medir "cada dos casillas", sin embargo, me sigue saliendo sucia la cadena al repetir el juego, en la primera iteración no tengo problemas.

No obstante, tras hacer algunas pruebas he observado que la 's' que sale es la que recoge de la última pregunta de volver a jugar, ya que si cambio la peticion por una 'f', por ejemplo, tengo el mismo fallo gráfico, pero con la 'f' en lugar de con la 's'. Deduzco de ahí que se añade ese caracter a la cadena 'pista' y es entonces cuando provoca que se descoloque y la aparición del símbolo extra. He probado con un fflush tanto al principio del bucle como tras recoger la respuesta, pero sigue apareciendo.

EDIT: Problema resuelto. Basta con sustituir el último caracter de la cadena por un '\0' en cada limpieza. Gracias de todas formas.
#14
Muy buenas de nuevo. Aquí vengo con un nuevo programa, esta vez 100% resuelto por mí. Explico de qué va:

Es un juego en el que 4 jugadores deben recorrer un tablero de 30 casillas con tiradas aleatorias de 0 a 6 casillas por turno, con posibilidad de empate. El programa está hecho de modo que el tablero sea una cadena de 60 caracteres, \0 incluido, que alterna puntos y espacios, empezando por punto en la posición 0 y terminando en espacio en la posición 59 (a pesar de que efectivamente sustituya a \0 ).

Bien, el caso es que la primera vez que se ejecuta el programa, el tablero tiene 30 puntos con espacios entre ellos, y el movimiento de las fichas es perfecto, ya que sustituyen a los puntos como se espera. Todo funciona bien. Sin embargo, al repetir la partida, al final del tablero me aparecen simbolos extraños, en este caso, una 's', a la que le sigue un ';' tras la primera actualización hasta el final del bucle.

Alguno me dirá, "no pongas un espacio en la posición del \0". Si no lo pongo, en lugar de la 's', me aparece una '#'.

Otro me contestará, "aumenta el tamaño de la cadena una posición más". Si lo hago así, me aparece de nuevo la '#' pero más a la derecha.

Por tanto, deduzco que de algún modo debo limpiar mejor la cadena del tablero para que reinicie sin fallos. ¿Alguna idea? Aquí dejo el código:

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
//Librerías

/*Carrera de dados, por Rockmore*/

int main(void){
    char pista[60],res;
    int i,a,b,c,d,dado1,dado2,dado3,dado4;
    //Declaración de variables

    srand(time(0));//Reinicio de semilla

    do{
        for(i=0;i<=58;i+=2){
            pista[i]='.';
        }
        for(i=1;i<=59;i+=2){
            pista[i]=' ';
        }
        i=0;
        a=0;
        b=0;
        c=0;
        d=0;//Reinicio del tablero

        do{
            system("cls");
            printf("----------------");
            printf("\nCarrera de dados");
            printf("\n----------------\n\n");
            printf("%s\n",pista);
            printf("\n------------------------------------");
            printf("\nPulsa una tecla para tirar los dados");
            printf("\n------------------------------------");
            getche();//Muestra de tablero a mitad de carrera

            dado1=rand()%7;
            dado2=rand()%7;
            dado3=rand()%7;
            dado4=rand()%7;//Tiradas de dados

            printf("\nJugador 1 (x): %d",dado1);
            printf("\nJugador 2 (o): %d",dado2);
            printf("\nJugador 3 (*): %d",dado3);
            printf("\nJugador 4 (&): %d",dado4);
            printf("\n\n\n------------------------------");
            printf("\nPulsa una tecla para continuar");
            printf("\n------------------------------");//Muestra de tiradas

            a=a+dado1*2;
            b=b+dado2*2;
            c=c+dado3*2;
            d=d+dado4*2;//Reajuste para movimiento

            if(a>58){
                a=58;
            }if(b>58){
                b=58;
            }if(c>58){
                c=58;
            }if(d>58){
                d=58;
            }//Reajuste para meta sobrepasada

            for(i=0;i<=58;i+=2){
                pista[i]='.';
            }
            for(i=1;i<=57;i+=2){
                pista[i]=' ';
            }//Limpieza de tirada anterior

            pista[a]='x';
            pista[b]='o';
            pista[c]='*';
            pista[d]='&';//Actualización de tablero
            getche();
        }while(pista[58]=='.');
        system("cls");
        printf("----------------");
        printf("\nCarrera de dados");
        printf("\n----------------\n\n");
        printf("%s\n\n\n",pista);//Condición final del tablero

        if(a==58){
            printf("El jugador 1 ha llegado a la meta!\n");
        }if(b==58){
            printf("El jugador 2 ha llegado a la meta!\n");
        }if(c==58){
            printf("El jugador 3 ha llegado a la meta!\n");
        }if(d==58){
            printf("El jugador 4 ha llegado a la meta!\n");
        }//Anuncio del ganador

        if(a==b||a==c||a==d||b==c||b==d||c==d){
            printf("EMPATE");
        }//Condición de empate

        printf("\nVolver a jugar (s/n)?");
        scanf("%s",&res);//Pregunta de repetición

    }while(res=='s');//Condición de repetición
}
#15
Casi, casi. Si las cadenas son distintas, ordena de lujo. Si son iguales, se fija en la última letra: "aaa aaa aaa" va antes que "bbb bbb bbb", pero "bbb bbb bba" va antes que "aaa aaa aab"

long1=strlen(nom1);
long2=strlen(nom2);
if(long1<=long2){
    longdef=long2;
}else{
    longdef=long1;
}//Contador de caracteres

for(let=0;let<longdef;let++){
   if(nom1[let]!=nom2[let]){
       comp=1;
   }
}//Comparación de cadenas

if(comp==1){
    for(let=0;let<longdef;let++){
        if(nom1[let]<nom2[let]){
            ord=1;
        }else if(nom2[let]<nom1[let]){
            ord=2;
        }
     }
}//Comparación de letras

if(ord==1){
    printf("\nNombres ordenados:\n%s\n%s",nom1,nom2);
}else{
    printf("\nNombres ordenados:\n%s\n%s",nom2,nom1);
}//Muestra de resultado

getche();
return(0);
}


Este código es cada vez más surrealista. Había pensado en poner algún tipo de contador, o una condición que rompiese el bucle, de modo que la primera condición que cambie alguna variable, se quedase así, como en el primer código que hice:

for(let=0;ord!=1&&ord!=2&&let<longdef;let++)

Edit: Justo eso era lo que necesitaba. Ahora sí que creo que está impecable. Gracias a todos por las indicaciones
#16
Vale, vale. Ya me va saliendo. Pero aún queda algo que depurar, ya que al meter como primer nombre "bb bb bb" y como segundo "bbb bbb bbb", me ordena como primero el largo y luego el corto, cuando tendría que ser al revés.

Esta es la parte del código cambiada:

for(let=0;let<strlen(nom1);let++){
    if(nom1[let]!=nom2[let]){
        comp=1;
    }else
        comp=0;
    }
//Comparación de cadenas

if(comp==1){
     for(let=0;let<strlen(nom1);let++){
         if(nom1[let]<nom2[let]){
             ord=1;
         }else if(nom2[let]<nom1[let]){
             ord=2;
         }
      }
}else{
     printf("\nNombres ordenados:\n%s\n%s",nom1,nom2);
}//Comparación de letras

if(ord==1){
     printf("\nNombres ordenados:\n%s\n%s",nom1,nom2);
}else if(ord==2){
     printf("\nNombres ordenados:\n%s\n%s",nom2,nom1);
}//Muestra de resultado


¿Debería crear un bucle comparador según si el strlen de la primera cadena es más largo que el segundo y viceversa, o hay algún otro modo que consuma menos recursos y ocupe menos líneas?
#17
Buenas. ¿Lo de los bucles me ha parecido entender que ponga un for (por ejemplo) para contar caracteres y otro para somprarar letras?

Para contar caracteres tengo el strlen metido en las variables nombre1 y nombre2, para que si una cadena es más corta, mediante la variable iguales cuente las que son iguales hasta que finalice la cadena más corta, con lo que se saldría del bucle de comparación.

He vuelto a reescribir esa parte, en lugar de con <, >, o ==, restando los caracteres y la diferencia, según sea mayor, menor o igual que cero, un poco al estilo strcmp.

Poniendo caracteres arbitrariamente fuera de cualquier bucle, la resta me la hace perfecta, si la primera es G y la segunda B, el resultado es 5, y si son B y G, me da -5. Eso es lo que yo necesito para resolver el programa.

Pues bien, al aplicarlo poniendo una variable tal que así nom1[let] la resta siempre es 0, por eso no me reordena nada. Y nuevamente, si pongo dos cadenas exactamente iguales, compila sin problemas, pero a la hora de entrar en el bucle, salta un error de ejecución.

Este es el nuevo código, aunque es muy parecido al anterior:

#include<stdio.h>
#include<string.h>
#include<conio.h>
//Librerías

int main(void){
int dif,long1,long2,let,same=0,prim,seg;
char nom1[50],apuno1[50],apdos1[50],nom2[50],apuno2[50],apdos2[50],esp[1];
//Declaración de variables cadena

strcpy(esp," ");
//Cadena espacio

printf("Nombre de la primera persona: ");
gets(nom1);
printf("\nPrimer apellido de la primera persona: ");
gets(apuno1);
printf("\nSegundo apellido de la primera persona: ");
gets(apdos1);
printf("\nNombre de la segunda persona: ");
gets(nom2);
printf("\nPrimer apellido de la segunda persona: ");
gets(apuno2);
printf("\nSegundo apellido de la segunda persona: ");
gets(apdos2);
//Petición de datos

strcat(nom1,esp);
strcat(nom1,apuno1);
strcat(nom1,esp);
strcat(nom1,apdos1);
strcat(nom2,esp);
strcat(nom2,apuno2);
strcat(nom2,esp);
strcat(nom2,apdos2);
//Concatenación de cadenas

long1=strlen(nom1);
long2=strlen(nom2);
//Contador de caracteres

if(long1<=long2){
     for(let=0;prim!=0||seg!=0||same!=long1;let++){
         dif=nom1[let]-nom2[let];
         if(dif>0){
             prim=0;
         }else if(dif<0){
             seg=0;
         }else{
             same++;
         }
     }
}else{
     for(let=0;prim!=0||seg!=0||same!=long2;let++){
         dif=nom1[let]-nom2[let];
         if(dif>0){
             prim=0;
         }else if(dif<0){
             seg=0;
         }else{
             same++;
         }
     }
}//Comparación de caracteres

printf("Iguales: %d",same);
printf("Diferencia: %d",dif);
printf("\nPrimer nombre: %s\nSegundo nombre: %s",nom1,nom2);
getche();
return(0);
}


Los printf del final están sólamente a modo de comprobación de datos, no muestran el resultado que necesito, ya que las restas no se hacen como deberían.
#18
Saludos a todos. Llevo días con sus noches dándole mil vueltas a esto y en todos los lados que encuentro, leo que la alternativa es hacerlo a mano, pero no sé qué es a mano en este caso.

Mi caso es que tengo que escribir dos nombres con sus dos apellidos, unirlos en una cadena con espacios y ordenarlos lexicográficamente sin utilizar strcmp.

Este es el código que tengo hecho:

#include<stdio.h>
#include<string.h>
#include<conio.h>
//Librerías

int main(void){
int nombre1,nombre2,let,primero=1,segundo=1,iguales=0;
char nom1[50],apuno1[50],apdos1[50],nom2[50],apuno2[50],apdos2[50],esp[1];
//Declaración de variables cadena

strcpy(esp," ");
//Cadena espacio

printf("Nombre de la primera persona: ");
gets(nom1);
printf("\nPrimer apellido de la primera persona: ");
gets(apuno1);
printf("\nSegundo apellido de la primera persona: ");
gets(apdos1);
printf("\nNombre de la segunda persona: ");
gets(nom2);
printf("\nPrimer apellido de la segunda persona: ");
gets(apuno2);
printf("\nSegundo apellido de la segunda persona: ");
gets(apdos2);
//Petición de datos

strcat(nom1,esp);
strcat(nom1,apuno1);
strcat(nom1,esp);
strcat(nom1,apdos1);
strcat(nom2,esp);
strcat(nom2,apuno2);
strcat(nom2,esp);
strcat(nom2,apdos2);
//Concatenación de cadenas

nombre1=strlen(nom1);
nombre2=strlen(nom2);
//Contador de caracteres

if(nombre1<=nombre2){
for(let=0;primero!=0||segundo!=0||iguales!=nombre1;let++){
if(nom1[let]<nom2[let]){
primero=0;
}
else if(nom1[let]>nom2[let]){
segundo=0;
}
else if(nom1[let]==nom2[let]){
iguales++;
}
}
}else{
for(let=0;primero!=0||segundo!=0||iguales!=nombre2;let++){
if(nom1[let]<nom2[let]){
primero=0;
}
else if(nom1[let]>nom2[let]){
segundo=0;
}
else if(nom1[let]==nom2[let]){
iguales++;
}
}
}//Comparación de letras

if(primero==0||iguales==nombre1){
printf("\nLos nombres ordenados son:\n%s\n%s",nom1,nom2);
}else if (segundo==0||iguales==nombre2){
printf("\nLos nombres ordenados son:\n%s\n%s",nom2,nom1);
}else{
printf("\nLos nombres ordenados son:\n%s\n%s",nom2,nom1);
}//Resultado

getche();
return(0);
}


Los nombres los coge bien, y al final están bien unidos en la cadena, pero no los ordena, el primer nombre que escribo es el primero que aparece, y si pongo dos nombres exactamente iguales, me salta un error en la ejecución, aunque compila bien. El compilador que utilizo es el Qt Creator de Nokia, que es el que se utiliza en la universidad.

Espero y agradezco sobremanera cualquier tipo de ayuda.