//ejercicio 6 #include<stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> struct TipoPunto{ double abcisa; double ordenada; }; struct TipoCiudad{ struct TipoPunto situacion; char nombre[50]; }; void Reordenar (struct TipoCiudad ciudades[], int num_ciudades, const char nombre_ciudad_referencia[]) { int i,j,k; struct TipoCiudad temp; double distancia,dist; for(i=0;i<num_ciudades;i++) if(strcmp(nombre_ciudad_referencia,ciudades[i].nombre)==0)//tiene en // cuenta mayusculas y minusculas { temp=ciudades[0]; ciudades[0]=ciudades[i]; ciudades[i]=temp; break; } for(i=1;i<num_ciudades-1;i++){ distancia=sqrt(pow((ciudades[0].situacion.abcisaciudades[i].situacion.abcisa),2)+ pow((ciudades[0].situacion.ordenadaciudades[i].situacion.ordenada),2)); k=i; for(j=i+1;j<num_ciudades;j++){ dist=sqrt(pow((ciudades[0].situacion.abcisaciudades[j].situacion.abcisa),2)+ pow((ciudades[0].situacion.ordenadaciudades[j].situacion.ordenada),2)); if(dist<distancia){ distancia=dist; k=j; }//fin if }//fin for j temp=ciudades[i]; ciudades[i]=ciudades[k]; ciudades[k]=temp; }//fin for i } void main() { int canti,i; struct TipoCiudad *tipo; char nombre[50]; printf("Cuantas ciudades quiere ordenar?\n"); scanf("%d",&canti); fflush(stdin); tipo=(struct TipoCiudad*)malloc(canti*sizeof(struct TipoCiudad)); for(i=0;i<canti;i++){ printf("Ingrese nombre ciudad: "); gets(tipo[i].nombre); fflush(stdin); printf("Ingrese abcisa ciudad: "); scanf("%lf",&tipo[i].situacion.abcisa); fflush(stdin); printf("Ingrese ordenada ciudad: "); scanf("%lf",&tipo[i].situacion.ordenada); fflush(stdin); } printf("Ingrese nombre ciudad de referencia para ordenar: "); gets(nombre); Reordenar(tipo, canti,nombre); printf("Las ciudades ordenadas segun la ciudad de referencia %s:\n",nombre); for(i=1;i<canti;i++) printf("%s\n",tipo[i].nombre); free(tipo); } //ver ejercicio 7 en transparencias punteros //ejercicio 14, resuelto con punteros #include <stdio.h> void main() { unsigned int myInt=355; unsigned char *p=(unsigned char*)&myInt; printf("INT: %d\n",myInt); printf("CHAR[0] %d\n",*p);//p[0]=99 printf("CHAR[1] %d\n",*(p+1));//p[1]=1 printf("CHAR[2] %d\n",*(p+2));//p[2]=0 printf("CHAR[3] %d\n",*(p+3));//p[3]=0 } //ejercicio 15, resolver con uniones #include <stdio.h> #include <stdlib.h> union { unsigned int myInt; unsigned char myByteArray[4]; } TheUnion; void main() { char buffer[33]; TheUnion.myInt=355; printf("%s\n",itoa(355,buffer,2)); printf("INT: %d\n",TheUnion.myInt); printf("CHAR[0] %d\n",TheUnion.myByteArray[0]);//99 printf("CHAR[1] %d\n",TheUnion.myByteArray[1]);//1 printf("CHAR[2] %d\n",TheUnion.myByteArray[2]);//0 printf("CHAR[3] %d\n",TheUnion.myByteArray[3]);//0 } //con desplazamientos de bits void main() { unsigned int colour = 355; unsigned char a = colour >> 24 & 0xFF; unsigned char r = colour >> 16 & 0xFF; unsigned char g = colour >> 8 & 0xFF; unsigned char b = colour & 0xFF; printf("INT: %d\n",colour); printf("nuevo\n"); printf("CHAR[0] %d\n",b); printf("CHAR[1] %d\n",g); printf("CHAR[2] %d\n",r); printf("CHAR[3] %d\n",a); } //ejercicio 10 paridad par #include <stdio.h> int parity(unsigned int x) { int parity=0; while (x > 0) { parity = (parity + (x & 1)) % 2; x >>= 1; } return parity; } void main() { unsigned int i; for (i = 0; i < 256; i++) { printf("%d\t%s", i, parity(i)?"impar":"par"); if(parity(i)) printf("\t%d",i|0x80); printf("\n"); } } //el 11 está resuelto en la guia de la práctica //ejercicio 12 #include <stdio.h> /* SETBITS: SET THE n BITS THAT BEGIN IN POSITION p OF x TO THE /* RIGHTMOST BITS n BITS OF y. */ unsigned setbits(unsigned x, int p, int n, unsigned y) { unsigned msk = ~(~0 << n); /*1º pone a 0 los bits a reemplazar en x 2º pone a 0 los bits mas significativos de y y luego mueve el resto a la posición donde tiene que reemplazar en x*/ return (x & ~(msk<< p+1-n)) | ((y & msk)<< p+1-n); } void main(void) { int off = 4; int len = 3; unsigned x = 0x55;//85:01010101 unsigned y = 0XAA;//170:10101010 printf("x: %u y: %u\n",x,y); printf("%u\n",setbits(x,off,len,y));//73 01001001 } //ejercicio 13 #include <stdio.h> unsigned int getbits(unsigned int x, int p, int n) { /*x >> (p + 1 - n) mueve el campo deseado al borde derecho del nro. ~0, todos unos, los desplazo n lugares a la izquierda y relleno a la derecha con 0s, y complementado hace una mascara de n bits en 1 en los bits mas a la derecha*/ return (x >> (p + 1 - n)) & ~(~0 << n); } int main(void) { int x = 0xF994, p = 4, n = 3; int z = getbits(x, p, n); printf("getbits(%u (%x), %d, %d) = %u (%X)\n", x, x, p, n, z, z); return 0; } */