[ Foro de C ]
#define IN_BOLAS_C
/* Standard include files */
#include <malloc.h>
#include "bolas.h"
/* variables */
static char BOLAS_C_RCSId[]="\n$Id: bolas.c,v 1.2 2003/09/03 00:14:52 luis Exp $\n";
/* functions */
int *new_array(int t)
{
int i, j;
int *array;
for (i = 1; i < t; i <<= 1)
;
/* i es la potencia de 2 mas baja mayor o igual que t */
/* obtenemos la memoria */
array = calloc(i + t + 1, sizeof(int));
if (!array)
return array;
array[0] = i;
/* inicializamos la parte superior */
for (j = i; j < i + t; j++) array [j] = 1;
/* j == i + t */
for (; j > 1; j--)
array[j>>1] += array[j];
return array;
} /* new_array */
int sacar_bola(int *t, int n)
{
int res;
int i = 1;
if (n > t[1] || n <= 0) return -1;
while (i < t[0]) {
i <<= 1;
if (n > t[i]) {
n -= t[i];
i++;
} /* if */
} /* while */
res = i - t[0] + 1;
while (i) {
t[i]--;
i >>= 1;
} /* while */
return res;
} /* sacar_bola */
/* $Id: bolas.c,v 1.2 2003/09/03 00:14:52 luis Exp $ */
#define IN_MAIN_C
/* Standard include files */
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include "bolas.h"
/* constants */
/* types */
/* prototypes */
/* variables */
static char MAIN_C_RCSId[]="\n$Id: main.c,v 1.2 2003/09/03 00:23:22 luis Exp $\n";
/* functions */
void do_usage(void)
{
printf("Uso: bolas [ -n num_extracciones ] [ -N num_total_bolas ]\n");
printf(" El programa realiza una extracción de num_extracciones bolas\n");
printf(" suponiendo una urna con un total de num_total_bolas.\n");
printf(" Las bolas no se repiten, es decir, una vez sacadas de la urna,\n");
printf(" ya no vuelven a entrar y siempre son diferentes.\n");
printf(" Evidentemente, no se pueden pedir mas bolas de las que hay en\n");
printf(" la urna, así que num_extracciones deberá ser menor que num_total_bolas\n");
printf(" (el programa provoca un error de punto flotante, si se ejecuta de ese\n");
printf(" modo)\n");
printf(" El número de bolas por defecto son 6, mientras que el\n");
printf(" número total de bolas por defecto son 49.\n");
} /* do_usage */
/* main program */
int main (int argc, char **argv)
{
extern int optind;
extern char *optarg;
int opt;
int *tabla, opt_n=6, opt_N=49, i;
while ((opt = getopt(argc, argv, "hn:N:")) != EOF) {
switch(opt) {
case 'h':
default:
do_usage(); exit(0);
case 'n':
opt_n = atoi(optarg); break;
case 'N':
opt_N = atoi(optarg); break;
}
}
tabla = new_array(opt_N);
srand(time(NULL));
for (i = 0; i < opt_n; i++) {
int b = sacar_bola(tabla, rand() % tabla[1] + 1);
printf("%3d\n", b);
} /* for */
exit(0);
/* NOTREACHED */
} /* main */
/* $Id: main.c,v 1.2 2003/09/03 00:23:22 luis Exp $ */
#define IN_BOLAS_C
/* Standard include files */
#include <malloc.h>
#include "bolas.h"
/* variables */
static char BOLAS_C_RCSId[]="\n$Id: bolas.c,v 1.2 2003/09/03 00:14:52 luis Exp $\n";
/* functions */
int *new_array(int t)
{
int i, j;
int *array;
for (i = 1; i < t; i <<= 1)
;
/* i es la potencia de 2 mas baja mayor o igual que t */
/* obtenemos la memoria */
array = calloc(i + t + 1, sizeof(int));
if (!array)
return array;
array[0] = i;
/* inicializamos la parte superior */
for (j = i; j < i + t; j++) array [j] = 1;
/* j == i + t */
for (; j > 1; j--)
array[j>>1] += array[j];
return array;
} /* new_array */
int sacar_bola(int *t, int n)
{
int res;
int i = 1;
if (n > t[1] || n <= 0) return -1;
while (i < t[0]) {
i <<= 1;
if (n > t[i]) {
n -= t[i];
i++;
} /* if */
} /* while */
res = i - t[0] + 1;
while (i) {
t[i]--;
i >>= 1;
} /* while */
return res;
} /* sacar_bola */
/* $Id: bolas.c,v 1.2 2003/09/03 00:14:52 luis Exp $ */
bolas_objs=bolas.o main.o
bolas: $(bolas_objs)
$(CC) -o bolas $(bolas_objs)
$(bolas_objs): bolas.h
clean:
$(RM) $(bolas_objs) bolas
# $Id: Makefile,v 1.1.1.1 2003/09/02 23:59:34 luis Exp $
Y la duda es...?
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)