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;
}
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.
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".
#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;
}
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