[ Foro de C ]

coma flotante programa completo

26-Oct-2015 19:36
Invitado ()
1 Respuestas

#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 $


30-Oct-2015 23:57
Nacho Cabanes (+30)

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.)