Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

About this user

John Edgar Congote Calle http://jcongote.blogspot.com

« Newer Snippets
Older Snippets »
Showing 1-10 of 16 total  RSS 

Integer Sqrt

This code calculate the square root of a integer.

   1  
   2  unsigned int sqrt(unsigned int n){
   3      unsigned int a;
   4      for (a=0;n>=(2*a)+1;n-=(2*a++)+1);
   5      return a;
   6  }

Function Vector

This Code create a vector of functions.

   1  
   2  #include <stdio.h>
   3  #include <stdlib.h>
   4  
   5  
   6  typedef struct _clase{
   7          int a;
   8          void(*func[3])(struct _clase*);
   9  } clase;
  10  
  11  void clase_func1 (struct _clase *p){
  12              printf("Funcion 1: %i\n",p->a);
  13  }
  14  
  15  void clase_func2 (struct _clase *p){
  16              printf("Funcion 2: %i\n",p->a);
  17  }
  18  
  19  void clase_func3 (struct _clase *p){
  20              printf("Funcion 3: %i\n",p->a);
  21  }
  22  
  23  void holaMundo(){
  24       printf("Hola Mundo!\n");
  25  }
  26  
  27  typedef void(*func) (void);
  28  
  29  
  30  int main(int argc, char *argv[])
  31  {
  32    func val;
  33    clase c;
  34    
  35    c.func[1]=&clase_func1;
  36    c.func[2]=&clase_func2;
  37    c.func[0]=&clase_func3;
  38        
  39    val=&holaMundo;
  40    val();
  41    c.a=1;
  42    c.func[0](&c);
  43    c.a=2;
  44    c.func[1](&c);
  45    c.a=3;
  46    c.func[2](&c);
  47    system("PAUSE");	
  48    return 0;
  49  }
  50  

Ejemplo de matrices en C

Se crea un matrix dinamica en c, y luego se muestra, el tamano de muestra siempre es de 10x10

   1  
   2  #include <stdio.h>
   3  #include <stdlib.h>
   4  
   5  void mostrar(int **a){
   6  	 int i,j;
   7  	for (i=0;i<10;i++){
   8  		for (j=0;j<10;j++){
   9  		printf("%i",a[i][j]);
  10  		}
  11  		printf("\n");
  12  	}	
  13  	 
  14  };
  15  
  16  int main(){
  17  	int i,j,**a;
  18  	a=(int**)malloc(10*sizeof(int*));
  19  
  20  	for (i=0;i<10;i++){
  21  		a[i]=(int*)malloc(10*sizeof(int));
  22  		for (j=0;j<10;j++){
  23  			a[i][j]=i;	
  24  		}
  25  	}	
  26  	mostrar(a);
  27  	getchar();
  28  	return 0;
  29  }
  30  

Go game

Algun juego que alguna ves realice... llamado go, pero que ya no recuerdo.

   1  
   2  #include <stdio.h>
   3  #include <stdlib.h>
   4  #include <time.h>
   5  
   6  
   7  int menu(){
   8  
   9      int select=0;
  10      do{
  11          printf("Menu:\n");
  12          printf("1. Score\n");
  13          printf("2. Jugar\n");
  14          printf("3. Salir\n");
  15          printf("Entre la opcion:\n");
  16          scanf("%i",&select);
  17      }while(!(select>0 && select<4));
  18    
  19      return select;    
  20  }
  21  
  22  void mostrar_score(int puntaje){
  23       //Si puntaje <0 entonces no agrega jugador
  24       //Sino puede agregarlo
  25  }
  26  
  27  void jugada_maquina(int **tablero, int f, int c){
  28  	 int i,j;
  29  	 do{
  30  	 	 i=rand()%f;
  31  	 	 j=rand()%c;
  32  	 } while (!tablero[i][j]==0);
  33  	 tablero[i][j]=2;	 
  34  }
  35  
  36  void mostrar_tablero(int **tablero,int f, int c){
  37  	 int i,j;
  38  	 for (i=0;i<f;i++){
  39  	 	 for (j=0;j<c;j++){
  40  
  41  		 	 switch(tablero[i][j]){
  42  		   	 			 case 0: printf("*");break;
  43  			 			 case 1: printf("X");break;
  44  						 case 2: printf("O");break;			 					   
  45  		     }
  46  	     }	
  47  		 printf("\n");
  48       }	 	 
  49  }
  50           
  51  
  52  int evaluar(int **tablero,int f,int c){
  53  	int i,j;
  54  	int cambio=0;
  55  	int tablas=1;
  56     	int gana=0;
  57  	do{
  58  	   cambio=0;
  59  		for (i=0;i<f;i++){
  60  			for (j=0;j<c;j++){
  61  				if(tablero[i][j]==3){
  62  					if (i-1>0)
  63  					   if (tablero[i-1][j]==1)
  64  					   	  tablero[i-1][j]=3,cambio=1;
  65  					if (i+1<f)
  66  					   if (tablero[i+1][j]==1)
  67  					   	  tablero[i+1][j]=3,cambio=1;
  68  					if (j-1>0)
  69  					   if (tablero[i][j-1]==1)
  70  					   	  tablero[i][j-1]=3,cambio=1;
  71  					if (i+1<c)
  72  					   if (tablero[i][j+1]==1)
  73  					   	  tablero[i][j+1]=3,cambio=1;											 
  74  			    } else if (tablero[i][j]==1){
  75  					if (i-1>0)
  76  					   if (tablero[i-1][j]==0)
  77  					   	  tablero[i][j]=3,cambio=1;
  78  					if (i+1<f)
  79  					   if (tablero[i+1][j]==0)
  80  					   	  tablero[i][j]=3,cambio=1;
  81  					if (j-1>0)
  82  					   if (tablero[i][j-1]==0)
  83  					   	  tablero[i][j]=3,cambio=1;
  84  					if (i+1<c)
  85  					   if (tablero[i][j+1]==0)
  86  					   	  tablero[i][j]=3,cambio=1;				  	   
  87  			    }
  88  			}	
  89  		}
  90  	}while(cambio);
  91  
  92  		for (i=0;i<f;i++){
  93  			for (j=0;j<c;j++){
  94  				if (tablero[i][j]==1)
  95  				   gana=1;
  96  			}
  97  		}
  98  	   for (i=0;i<f;i++){
  99  		  for (j=0;j<c;j++){
 100  			if(tablero[i][j]==3)
 101  			  tablero[i][j]=1;
 102  		  }
 103  	   }		   			 
 104  
 105  		if (gana==1){
 106  		   return 2;
 107          }
 108  
 109     	gana=0;	
 110  	do{
 111  	   cambio=0;
 112  		for (i=0;i<f;i++){
 113  			for (j=0;j<c;j++){
 114  				if(tablero[i][j]==4){
 115  					if (i-1>0)
 116  					   if (tablero[i-1][j]==2)
 117  					   	  tablero[i-1][j]=4,cambio=1;
 118  					if (i+1<f)
 119  					   if (tablero[i+1][j]==2)
 120  					   	  tablero[i+1][j]=4,cambio=1;
 121  					if (j-1>0)
 122  					   if (tablero[i][j-1]==2)
 123  					   	  tablero[i][j-1]=4,cambio=1;
 124  					if (i+1<c)
 125  					   if (tablero[i][j+1]==2)
 126  					   	  tablero[i][j+1]=4,cambio=1;											 
 127  			    } else if (tablero[i][j]==2){
 128  					if (i-1>0)
 129  					   if (tablero[i-1][j]==0)
 130  					   	  tablero[i][j]=4,cambio=1;
 131  					if (i+1<f)
 132  					   if (tablero[i+1][j]==0)
 133  					   	  tablero[i][j]=4,cambio=1;
 134  					if (j-1>0)
 135  					   if (tablero[i][j-1]==0)
 136  					   	  tablero[i][j]=4,cambio=1;
 137  					if (i+1<c)
 138  					   if (tablero[i][j+1]==0)
 139  					   	  tablero[i][j]=4,cambio=1;				  	   
 140  			    }
 141  			}	
 142  		}
 143  	}while(cambio);	
 144  
 145  		for (i=0;i<f;i++){
 146  			for (j=0;j<c;j++){
 147  				if (tablero[i][j]==2)
 148  				   gana=1;
 149  			}
 150  		}
 151  	   for (i=0;i<f;i++){
 152  		  for (j=0;j<c;j++){
 153  			if(tablero[i][j]==4)
 154  			  tablero[i][j]=2;
 155  		  }
 156  	   }		   			 
 157  		if (gana==1){
 158  		   return 1;
 159          }
 160  
 161  
 162  	
 163     for (i=0;i<f;i++){
 164  	  for (j=0;j<c;j++){
 165  		if(tablero[i][j]==0)
 166  		  tablas=0;
 167          }
 168  	}		   	
 169  	
 170  	if (tablas==1)
 171  	   return 4;		 
 172  
 173  	return 0;	
 174  }
 175  
 176  
 177  int jugar(){
 178      int i,j,f,c;
 179      int **tablero;
 180      int puntaje=0;
 181      
 182      printf ("Entre el numero de filas y columnas del tablero:\n");
 183      scanf("%i%i",&f,&c);
 184  
 185      tablero = (int**)malloc(f*sizeof(int*));
 186      for (i=0;i<f;i++){
 187          tablero[i]= (int*)malloc(c*sizeof(int)); 
 188          for (j=0;j<c;j++){
 189  			tablero[i][j]=0;	
 190  		 }
 191      }
 192      
 193      
 194      do{
 195          int ni,nj;
 196         
 197          mostrar_tablero(tablero,f,c);
 198          do{
 199             printf("Entre el numero de la coordenada:\n");
 200             scanf("%i%i",&ni,&nj);
 201             if (ni==0 && nj==0){
 202                printf("Desea Salir (s/n)\n");
 203                if(getch()=='s'){
 204  			      for (i=0;i<f;i++){
 205  			          free(tablero[i]);
 206  			      }
 207  				  free(tablero);
 208                    return -1;
 209  			  } else continue;
 210             }    
 211             ni--;nj--;
 212  		   if(!(ni>=0 && ni<f && nj>=0 && nj<c)){
 213  		   		   printf("La coordenana esta fuera de los limites\n");
 214  		   		   continue;
 215  		   }
 216  		   if (tablero[ni][nj]!=0){
 217  		   	  		printf("La coordenada colocada esta ocupada\n");	   
 218  		   	  		continue;
 219  		   }
 220  		   break;
 221          }while (1);
 222          
 223          tablero[ni][nj]=1;
 224          if(evaluar(tablero,f,c)==0){
 225  		        jugada_maquina(tablero,f,c);
 226          }else {
 227  	    //gano el humano
 228  	    }        
 229          puntaje=evaluar(tablero,f,c);
 230          printf("puntaje: %i\n",puntaje);
 231      }while(puntaje==0);
 232      
 233      for (i=0;i<f;i++){
 234          free(tablero[i]);
 235      }
 236      free(tablero);
 237     
 238  }
 239  
 240  int main(){
 241      int salir=0;
 242      do{
 243  
 244          switch (menu()){
 245                 case 1: 
 246                      mostrar_score(-1);
 247                      break;
 248                 case 2:
 249                      mostrar_score(jugar());
 250                      break;
 251                 case 3:
 252                      salir=1;    
 253                      break;
 254          }
 255      }while(!salir);
 256  
 257      printf("Gracias por utilizar el programa");
 258      
 259      return 0;
 260  }
 261  

Llamar una funcion por medio de su direccion de memoria

Este fue el codigo implementado para llamar a una funcion que esta en la posicion 0 de memoria, muy util en sistemas embedidos.

   1  
   2  
   3  typedef void (*funcptr)();
   4  
   5  (*(funcptr) 0)();
   6  
   7  int main(){
   8      
   9  };
  10  

Ejemplo en C de un motor de scripting o maquina virtual

El codigo es una implementacion de un lenguaje de scripting sin lenguaje, por lo tanto queda limitado a la interpretacion de codigos por lo que se parece mas a una maquina virtual

   1  
   2  #include <stdio.h>
   3  
   4  
   5  typedef struct _operation{
   6          unsigned int op;
   7          int arg1;
   8          int arg2;
   9          int arg3;
  10  } operation;
  11  
  12  typedef struct _scriptEngine{
  13          int var[255];
  14          int ip;
  15          int halt;
  16          operation code[255];        
  17  } scriptEngine;
  18  
  19  void operation_run(const operation *p, scriptEngine *s){
  20       switch (p->op){
  21              case 0: //add
  22                   s->var[p->arg1] = s->var[p->arg2]+s->var[p->arg3];
  23                   s->ip++;
  24                   printf("Realizando suma\n");
  25                   break;
  26              case 1: //sup
  27                   s->var[p->arg1] = s->var[p->arg2]-s->var[p->arg3];
  28                   s->ip++;
  29                   printf("Realizando resta\n");
  30                   break;
  31              case 3: //mul
  32                   s->var[p->arg1] = s->var[p->arg2]*s->var[p->arg3];
  33                   s->ip++;
  34                   printf("Realizando multiplicacion\n");                 
  35                   break;
  36              case 4: //div
  37                   s->var[p->arg1] = s->var[p->arg2]/s->var[p->arg3];
  38                   s->ip++;
  39                   printf("Realizando division\n");                 
  40                   break;
  41              case 5: //mod
  42                   s->var[p->arg1] = s->var[p->arg2]%s->var[p->arg3];
  43                   s->ip++;
  44                   printf("Realizando modulo\n");                 
  45                   break;
  46              case 6: //set
  47                   s->var[p->arg1] = p->arg2;
  48                   s->ip++;
  49                   printf("Realizando asignacion\n");                 
  50                   break;
  51              case 7: //halt
  52                   s->halt=1;
  53                   break;
  54              case 8: //jump
  55                   s->ip=s->var[p->arg1];
  56                   break;                 
  57              default:
  58                   break;            
  59       }
  60  
  61  }
  62  
  63  scriptEngine* scriptEngine_new(){
  64                scriptEngine *new_script;
  65                new_script = (scriptEngine*) malloc(sizeof(scriptEngine));
  66                new_script->ip=0;
  67                new_script->halt=0;              
  68                return new_script;
  69  }
  70  
  71  void scriptEngine_delete(scriptEngine *script){
  72       free(script);
  73  }
  74  
  75  
  76  void scriptEngine_run(scriptEngine *script){
  77      
  78       int j;
  79       
  80       while(script->halt==0){
  81           printf("Inicio de operacion\n");
  82           operation_run(&(script->code[script->ip]),script);
  83           printf("Estado de la maquina:\n");
  84           for (j=0;j<5;j++){
  85               printf("Posicion de la memoria %i: %i\n",j,script->var[j]);
  86           }         
  87       }     
  88  };
  89  
  90  void scriptEngine_create_example(scriptEngine *script, int example){
  91       switch (example){
  92              case 0:
  93                       script->code[0].op=6; //set
  94                       script->code[0].arg1=0;
  95                       script->code[0].arg2=10;
  96                       
  97                       script->code[1].op=6; //set
  98                       script->code[1].arg1=1;
  99                       script->code[1].arg2=20;
 100                       
 101                       script->code[2].op=0; //set
 102                       script->code[2].arg1=2;
 103                       script->code[2].arg2=0;     
 104                       script->code[2].arg3=1;    
 105                       
 106                       script->code[3].op=7;
 107                       break;
 108       }
 109  }
 110  
 111  int main(int argc, char **argv){
 112      
 113      scriptEngine* script;
 114      script = scriptEngine_new();
 115      scriptEngine_create_example(script,0);
 116      scriptEngine_run(script);
 117      scriptEngine_delete(script);
 118      
 119      system("PAUSE");
 120      return 0;    
 121  }
 122  
 123  

Argumentos variables en C

Este ejemplo muestra la utilizacion de argumentos variables en una funcion en el lenguaje c

   1  
   2  // vararg.cpp: define el punto de entrada de la aplicación de consola.
   3  //
   4  
   5  #include <stdarg.h>
   6  #include <stdio.h>
   7  
   8  int
   9  add_em_up (int count,...)
  10  {
  11    va_list ap;
  12    int i, sum;
  13  
  14    va_start (ap, count);         /* Initialize the argument list. */
  15  
  16    sum = 0;
  17    for (i = 0; i < count; i++)
  18      sum += va_arg (ap, int);    /* Get the next argument value. */
  19  
  20    va_end (ap);                  /* Clean up. */
  21    return sum;
  22  }
  23  
  24  int
  25  main (void)
  26  {
  27    /* This call prints 16. */
  28    printf ("%d\n", add_em_up (3, 5, 5, 6));
  29  
  30    /* This call prints 55. */
  31    printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  32  
  33    return 0;
  34  }
  35  
  36  

Grafos en 3d

Implementacion con opengl de la visualizacion de grafos, donde los vertices son resortes uniendo los nodos, y los nodos se rechazan entre ellos, y existe una fuerza en el origen que los acerca a todos.

Makefile para compilarlo:


INCLUDE = -I/usr/include/
LIBDIR = -L/usr/X11R6/lib

CC = gcc
CCFLAGS = -g ${INCLUDE}
LIBRARY = -lX11 -lXi -lXmu -lglut -lGL -lGLU -lm

all :ejemplo1.o
${CC} ${CCFLAGS} -o ejemplo1 ejemplo1.o ${LIBDIR} ${LIBRARY}

clean :
rm -rf ejemplo1 ejemplo1.o



   1  
   2  #include <GL/gl.h>
   3  #include <GL/glut.h>
   4  
   5  #include <stdio.h>
   6  #include <math.h>
   7  #include <stdlib.h>
   8  
   9  #define MAXNODOS 100
  10  
  11  typedef struct _point{
  12  	float x,y,z;
  13  } point;
  14  
  15  typedef struct _force{
  16  	float fx,fy,fz;
  17  } force;
  18  
  19  typedef struct _sisi{
  20  	point p;
  21  	force f;
  22  } sisi;
  23  
  24  typedef struct _grafo{
  25  	int nnodos;
  26  	sisi nodos[100];
  27  	int enlaces[100][100];
  28  	point max,min;	
  29  } grafo;
  30  
  31  float angulo=0.0;
  32  grafo grafo_global;
  33  
  34  void calcularfuerzas(grafo *g){
  35  	int i,j;
  36  	float distancia;
  37  	for (i=0;i<g->nnodos;i++){
  38  		g->nodos[i].f.fx = 0.0f;
  39  		g->nodos[i].f.fy = 0.0f;
  40  		g->nodos[i].f.fz = 0.0f;
  41  		
  42  		for (j=0;j<g->nnodos;j++){
  43  			if (i!=j && g->enlaces[i][j]==1){
  44  				distancia = sqrt(powf(g->nodos[i].p.x - g->nodos[j].p.x,2.0f) + powf(g->nodos[i].p.y - g->nodos[j].p.y,2.0f) + powf(g->nodos[i].p.z - g->nodos[j].p.z,2.0f));
  45  				if ( distancia > 0.001f ){
  46  					g->nodos[i].f.fx += (g->nodos[i].p.x - g->nodos[j].p.x) / powf(distancia,3.0f);
  47  					g->nodos[i].f.fy += (g->nodos[i].p.y - g->nodos[j].p.y) / powf(distancia,3.0f);
  48  					g->nodos[i].f.fz += (g->nodos[i].p.z - g->nodos[j].p.z) / powf(distancia,3.0f);
  49  				}
  50  			}
  51  		}
  52  //		Nene
  53  
  54  		distancia = sqrt(powf(g->nodos[i].p.x,2.0f)+powf(g->nodos[i].p.y,2.0f)+powf(g->nodos[i].p.z,2.0f));
  55  
  56  		if (distancia>(float)g->nnodos){
  57  			g->nodos[i].f.fx -= g->nnodos*g->nodos[i].p.x/powf(distancia,3.0f);
  58  			g->nodos[i].f.fy -= g->nnodos*g->nodos[i].p.y/powf(distancia,3.0f);
  59  			g->nodos[i].f.fz -= g->nnodos*g->nodos[i].p.z/powf(distancia,3.0f);				
  60  		}
  61  
  62  	}
  63  	
  64  	grafo_global.max.x=-1000;
  65  	grafo_global.max.y=-1000;
  66  	grafo_global.max.z=-1000;
  67  	grafo_global.min.x=1000;
  68  	grafo_global.min.y=1000;
  69  	grafo_global.min.z=1000;		
  70  
  71  	for (i=0;i<g->nnodos;i++){	
  72  //		Movimiento
  73  		g->nodos[i].p.x+=g->nodos[i].f.fx;
  74  		g->nodos[i].p.y+=g->nodos[i].f.fy;
  75  		g->nodos[i].p.z+=g->nodos[i].f.fz;		
  76  
  77  		if (grafo_global.max.x<grafo_global.nodos[i].p.x)
  78  			grafo_global.max.x=grafo_global.nodos[i].p.x;	
  79  
  80  		if (grafo_global.max.y<grafo_global.nodos[i].p.y)
  81  			grafo_global.max.y=grafo_global.nodos[i].p.y;	
  82  
  83  		if (grafo_global.max.z<grafo_global.nodos[i].p.z)
  84  			grafo_global.max.z=grafo_global.nodos[i].p.z;	
  85  
  86  		if (grafo_global.min.x>grafo_global.nodos[i].p.x)
  87  			grafo_global.min.x=grafo_global.nodos[i].p.x;	
  88  
  89  		if (grafo_global.min.y>grafo_global.nodos[i].p.y)
  90  			grafo_global.min.y=grafo_global.nodos[i].p.y;	
  91  
  92  		if (grafo_global.min.z>grafo_global.nodos[i].p.z)
  93  			grafo_global.min.z=grafo_global.nodos[i].p.z;	
  94  	}
  95  	
  96  }
  97  
  98  void init_grafo(void){
  99  	int i,j;
 100  	grafo_global.nnodos=30;
 101  
 102  	for (i=0;i<grafo_global.nnodos;i++){
 103  		for (j=0;j<grafo_global.nnodos;j++){
 104  			grafo_global.enlaces[i][j]=1;
 105  		}
 106  		grafo_global.nodos[i].p.x=rand()%10;
 107  		grafo_global.nodos[i].p.