Crear parejas de letras en C

Iniciado por w_walter, 2 Diciembre 2016, 22:20 PM

0 Miembros y 1 Visitante están viendo este tema.

w_walter

Buenas soy nuevo en el foro y tenia una duda para un trabajo de clase. El tema es que tengo que crear 10 parejas de letras separadas por un espacio y que éstas letras no se repitan. No consigo hacer que no se repitan algunas.

Mi codigo es el siguiente:

#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include <windows.h>
int main()
{
   int i, m, num;
   int b=0;
   int j=0;
   int aux=0;
   char auxiliar[21];
   char vector[26];
   char LETRA ='A';
   srand((unsigned)time(NULL));


   for(i=0; i<=26; i++)
   {
       vector[i]=LETRA;
       LETRA++;
   }

   for(i=0; i<=26; i++)
   {
       num=65+rand()%26;

       vector[i]=num;

       for(m=0; m<i; m++)
       {
           while(vector[m]==vector[i])
           {
               vector[i]=65+rand()%26;
           }
       }
   }

   for(i=0; i<=26; i++)
   {
       if(vector[i]!=65+i)
       {
           while(j<21 && aux==0)
           {
           if(vector[i]==auxiliar[j])
               {
                   aux=1;
               }
               j++;
           }

           if(aux==0)
           {
               auxiliar[b]=65+i;
               auxiliar[b+1]=vector[i];
               b=b+2;
           }
       }

       j=0;
       aux=0;
   }
   j=0;

   for(i=0; i<10; i++)
   {
       printf("%c%c ",vector[j],vector[j+1]);
       j=j+2;
   }


   return 0;

}

0xFer

Son 20 letras:

char letras[20];

Ahora para generar las letras de forma aleatoria y que ninguna se repita, la parte de tu código donde intentas hacer lo anterior sólo comprueba que la letra en i no sea igual a la letra en i - 1, una solución podría ser:

for(i=0; i<20; i++)
    {
    bool seRepite = true;
   
    while( seRepite ){
   
    letras[i] = 65+rand()%26;
    seRepite = false;
   
    for( m = 0; m < i; m++)
    if( letras[m]==letras[i] ){
    seRepite = true;
    break;
}
}
    }


Bien, ahora tienes un arreglo letras que solo tienes que imprimir de 2 en 2.

Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

w_walter

Muchas gracias por la respuesta!! funciona bien pero al intentar ponerle la condición de que las primeras letras de las 10 parejas tienen que estar en orden alfabético  vuelve a repetirlas. No sé si me he explicado. La idea es que las letras aparezcan "AH BE DK". No pueden aparecer de la manera "EH AB".

lfgmespino

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


int usado(char, char*);

int main()
{
    int i;
    char vector[26]={0};
    char newChar;

   
    srand((unsigned)time(NULL));


    for(i=0; i<26; i++)
    {
        do {
        newChar = 'A'+rand()%26;
        } while(usado(newChar, vector));
        vector[i] = newChar;
}

    for(i=0; i<10; i++)
    {
        if (vector[i*2] < vector[i*2+1]) {
        printf("%c%c ",vector[i*2],vector[i*2+1]);
        } else printf("%c%c ",vector[i*2+1],vector[i*2]);
    }


    return 0;

}

int usado(char ch, char* array)
{
int i;

while (*(array+i) && ch != *(array+i) ) i++;

if (*(array+i)) return 1;
return 0;
}

do-while

#4
Repetir un bucle en el que se generan datos aleatorios sobre una lista mientras haya una repetición es extremadamente ineficiente.

Lo que deberías de hacer es:

alfabeto="A...Z";

para i desde 0 hasta 19
 indice_aleatorio=aleatorio_entre_0_y_longitud_alfabeto

 si i != indice_aleatorio
   intercambiar(alfabeto[i], alfabeto[indice_aleatorio]
 fin si
fin para

ordenar los indices pares(desde 0 hasta 19) en orden ascendente

para i desde cero hasta 9
 mostrar alfabeto[2 * i] y alfabeto[2 * i + 1]
fin para
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!