Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda con el codigo en C

Estas en el tema de Ayuda con el codigo en C en el foro de C/C++ en Foros del Web. Buenas! estoy aprendiendo a programar con este lenguaje y necesito una pequeña ayuda, estoy empezando un programa y ya me esta dando fallos, seguro que ...
  #1 (permalink)  
Antiguo 03/01/2011, 14:13
 
Fecha de Ingreso: enero-2011
Mensajes: 4
Antigüedad: 13 años, 3 meses
Puntos: 0
Pregunta Ayuda con el codigo en C

Buenas!

estoy aprendiendo a programar con este lenguaje y necesito una pequeña ayuda, estoy empezando un programa y ya me esta dando fallos, seguro que es alguna tonteria... Pero por ahora lo unico que tiene que hacer es sacar 4 numeros aleatorios del 0 al 9 sin que se repita ninguno. Compilo en Dev-C, os paso el codigo, se me queda en bucle infinito antes de que los saque por pantalla:

#include <stdio.h>
#include <time.h>
#include<windows.h>
#include<string.h>

#define CARTAS 4
#define RES 6

int main(){

int principal[CARTAS];
int aux[RES];
int cont,contaux;

srand(time(NULL));
for(cont=0;cont<CARTAS;cont++){
principal[cont]=rand()%10;
for(contaux=0;contaux<CARTAS;contaux++){
if(principal[cont]==principal[contaux]){
cont=0;
}
}
}
for(cont=0;cont<CARTAS;cont++){
printf("%d ", principal[cont]);
}
getch();
}

Gracias de antemano!
  #2 (permalink)  
Antiguo 03/01/2011, 14:44
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Ayuda con el codigo en C

El problema lo tienes en el bucle anidado donde creas las cartas. Tras generar la primera carta, que guardas en principal[0] (cont vale 0), en el bucle interno la comparas con principal[0] (contaux vale 0), con lo que la condición de la igualdad se cumple siempre, pones la variable de control del bucle externo a 0 y vuelves a empezar, el bucle externo nunca llega a la condición de terminación.

Conclusión: No cambies el valor de la variable de control de un bucle dentro de este.
  #3 (permalink)  
Antiguo 03/01/2011, 15:14
 
Fecha de Ingreso: enero-2011
Mensajes: 4
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Ayuda con el codigo en C

Mmm... pero no guardo el valor de "cont" (0) en principal, guardo el numero random en la posicion "cont" (0) de principal. Y luego, en el bucle anidado, comparo la posicion "cont" con todas las posiciones "contaux"(hasta CARTAS) del vector "principal". Y lo de reiniciar la variable, lo hago en el caso de que hubiera algun numero repetido, para que empiece de nuevo
  #4 (permalink)  
Antiguo 03/01/2011, 20:12
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Ayuda con el codigo en C

El primer número lo guardas en la posición 0 (valor de inicio del bucle cont). Al entrar en el bucle interno (el controlado por contaux) también empiezas desde cero. La primera comparación es siempre entre principal[0] (principal[cont] con cont=0) y principal[0] (principal[contaux] con contaux=0). Es decir, estás comprobando si una cantidad es igual a sí misma, lo cual siempre va a ser cierto, con lo que cada vez estás poniendo la variable de control del bucle externo (cont) a cero, y vuelta a empezar.
  #5 (permalink)  
Antiguo 04/01/2011, 14:16
 
Fecha de Ingreso: enero-2011
Mensajes: 4
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Ayuda con el codigo en C

AAhh! vale vale, pillado. Entonces con poner una variable "int" que coja el numero y luego compare con todo el vector tonces ya se solucionaria, no?
  #6 (permalink)  
Antiguo 04/01/2011, 15:15
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Ayuda con el codigo en C

estructura el tus ciclos de la siguiente forma

Código C++:
Ver original
  1. for(cont=0;cont<CARTAS;){
  2.            
  3.             principal[cont] = rand()&#37;10;
  4.             for(contaux=0; contaux<cont; contaux++){
  5.                 if(principal[cont]==principal[contaux])
  6.                     break;
  7.             }
  8.  
  9.             if(contaux==cont)
  10.                 cont++;
  11.         }
  #7 (permalink)  
Antiguo 04/01/2011, 15:43
Avatar de aandy  
Fecha de Ingreso: diciembre-2010
Ubicación: Piura
Mensajes: 18
Antigüedad: 13 años, 4 meses
Puntos: 3
Respuesta: Ayuda con el codigo en C

amigo margarito04 .... tu codigo es igual al que plantea Stark90 ... pues
simplemente andaria en la primera iteracion puesto que
contaux y cont empiezan con 0 ... esa no seria la solucion ... la solucion seria usar una variable auxiliar ;)
  #8 (permalink)  
Antiguo 04/01/2011, 16:00
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Ayuda con el codigo en C

por que dices que andaria siempre en la primera iteración?
vamos a ver un ejemplo

primera interacción
cont=0
principal[cont]=5
no entraría a compara si existen repetidos ya que cont=0 y contaux=0, pero aumenta en 1 ya estos valores son iguales

segunda interación
cont=1
principal[cont]=6
si observas en el segundo ciclo solo va a comparar con el primer elemento cuando, termina este ciclo conaux es igual=1
por lo que incrementaria en 1 cont

tercera iteracion
cont=2
principal[2]=6
por lo que encuentra un valor igual en la posicion 1 de principal, y sale del ciclo,
conaux es igual a 1, por lo que no incrementa en 1 cont

cuarta iteracion
cont=2.
...
...
  #9 (permalink)  
Antiguo 04/01/2011, 16:04
 
Fecha de Ingreso: enero-2011
Mensajes: 4
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Ayuda con el codigo en C

eso creia yo, pero lo he probado y funciona... estoy intentando entenderlo. (o mi compilador se a vuelto loco). Antes de que me explicara margarito04, con la ayuda de Fw190 consegui, llegar a este codigo que me funciona:

while(aux2<CARTAS){
for(cont=0;cont<CARTAS;cont++){
aux1=rand()%10;
for(contaux=0;contaux<CARTAS;contaux++){
if(aux1==principal[contaux]){
cont=0;
}
}
aux2++;
principal[cont]=aux1;
}
}

Pero ahora con lo de margarito04, tambien me funciona...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:29.