Examen "teórico" mayo 2013. Duración: 1 hora 30 minutos. 1
2
3
4
5
Solución problema 1 (con la función ContarCorrectos): #include<stdio.h> #include<stdlib.h> typedef struct int d1; int d2; int d3; int d4; int decimal; T_MAYA; int ContarCorrectos(); void RellenarVector( T_MAYA vrelleno[], T_MAYA *pequenyo); int main(void) int correctos; T_MAYA *v_maya_correctos; T_MAYA pequenyo; correctos=contarcorrectos(); printf("hay %d cuartetos correctos ",correctos); v_maya_correctos=(t_maya*)calloc(correctos, sizeof(t_maya)); if(v_maya_correctos==null) printf("error al asignar memoria dinamica"); else RellenarVector(v_maya_correctos,&pequenyo); printf("el menor numero maya encontrado es %d y se corresponde con %d %d %d %d ", pequenyo.decimal, pequenyo.d1, pequenyo.d2, pequenyo.d3, pequenyo.d4); free(v_maya_correctos); int ContarCorrectos() FILE *pfichero; T_MAYA auxiliar; int leidos; int contador=0; pfichero=fopen("mayas.txt","r"); if(pfichero==null) printf("error al abrir el archivo"); else leidos=fscanf(pfichero,"%d%d%d%d",&auxiliar.d1,&auxiliar.d2,&auxiliar.d3,&auxiliar.d4); while(leidos==4) if((auxiliar.d1<20&&auxiliar.d1>=0)&&(auxiliar.d2<20&&auxil iar.d2>=0)&&(auxiliar.d3<20&&auxiliar.d3>=0)&&(auxiliar.d4<20&&a uxiliar.d4>=0)) 6
contador+=1; leidos=fscanf(pfichero,"%d%d%d%d",&auxiliar.d1,&auxiliar.d2,&auxiliar.d3,&auxiliar.d4); fclose(pfichero); return contador; void RellenarVector( T_MAYA vrelleno[], T_MAYA *pequenyo) FILE *pfichero; T_MAYA auxiliar; int pequenyo_auxiliar=200000; //valor muy grande int leidos; int contador=0; pfichero=fopen("mayas.txt","r"); if(pfichero==null) printf("error al abrir el archivo"); else leidos=fscanf(pfichero,"%d%d%d%d",&auxiliar.d1,&auxiliar.d2,&auxiliar.d3,&auxiliar.d4); while(leidos==4) if((auxiliar.d1<20&&auxiliar.d1>=0)&&(auxiliar.d2<20&&auxil iar.d2>=0)&&(auxiliar.d3<20&&auxiliar.d3>=0)&&(auxiliar.d4<20&&a uxiliar.d4>=0)) vrelleno[contador].d1=auxiliar.d1; vrelleno[contador].d2=auxiliar.d2; vrelleno[contador].d3=auxiliar.d3; vrelleno[contador].d4=auxiliar.d4; vrelleno[contador].decimal=auxiliar.d1+auxiliar.d2*20+auxil iar.d3*20*20+auxiliar.d4*20*20*20; if(vrelleno[contador].decimal<pequenyo_auxiliar) (*pequenyo).d1=vrelleno[contador].d1; (*pequenyo).d2=vrelleno[contador].d2; (*pequenyo).d3=vrelleno[contador].d3; (*pequenyo).d4=vrelleno[contador].d4; (*pequenyo).decimal=vrelleno[contador].decimal; 7
pequenyo_auxiliar=(*pequenyo).decimal; contador+=1; leidos=fscanf(pfichero,"%d%d%d%d",&auxiliar.d1,&auxiliar.d2,&auxiliar.d3,&auxiliar.d4); fclose(pfichero); 8
Solución problema 2 (el main está vacío): #include<stdio.h> #define PI 3.1415926535 int SuprimirFila(float vt[][2], int n, int fila); int Recalibrar(float vt[][2], int n, float r_nom, float s, float porc, float *pr, int *pnuevo_n); int main(void) int SuprimirFila(float vt[][2], int n, int fila) float vaux[n-1][2]; //para copiar el resto de filas int i,j; for(i=0;i<fila;i++) for(j=0;j<2;j++) vaux[i][j]=vt[i][j];//copiamos las filas anteriores for(i=fila+1;i<n;i++) for(j=0;j<2;j++) vaux[i-1][j]=vt[i][j];//copiamos las filas siguientes for(i=0;i<n-1;i++) for(j=0;j<2;j++) vt[i][j]=vaux[i][j];//reescribimos la matriz original //la ultima fila de la matriz original se queda como //estaba return n-1; int Recalibrar(float vt[][2], int n, float r_nom, float s, float porc, float *pr, int *pnuevo_n) int i,j; int filas_suprimidas=0; int nuevas_filas; float s_med=0; float nv; float r; float porcentaje_error; int error; for(i=n-1;i>=0;i--) 9
//el for va de la ultima fila a la primera //si se hace desde la primera a la ultima el codigo //no funcionaria bien con la funcion SuprimirFila() //que hemos definido antes if(vt[i][1]*vt[i][2]<s) nuevas_filas=suprimirfila(vt,nfilas_suprimidas,i); filas_suprimidas+=1; for(i=0;i<nuevas_filas;i++) s_med+=vt[i][1]*vt[i][2]; s_med=s_med/nuevas_filas; nv=s_med/(2*pi*r_nom); r=s/(nv*2*pi); porcentaje_error=100*(r_nom-r)/r_nom; if(porcentaje_error>porc) error=1; else error=0; *pr=r; *pnuevo_n=nuevas_filas; return error; 10
Solución problema 3 (habría que llamar a las funciones en el main): #include<stdio.h> #include<string.h> typedef struct char nombre_mes[12]; int dias_mes[5][7]; int n_dias; T_MES; void Dia_Semana(int indice_dia, char nombre_dia_semana[]); void Buscar_Dia_Semana(T_MES meses[], char mes[], int dia, char dia_sem[], char dia_mes_sig[]); int main(void) char nombre[30]; int dia; printf("introduzca el nombre del mes "); fgets(nombre,30,stdin); printf("introduzca el dia del mes "); scanf("%d",&dia); fflush(stdin); void Dia_Semana(int indice_dia, char nombre_dia_semana[]) if(indice_dia==0) strcpy(nombre_dia_semana,"lunes"); if(indice_dia==1) strcpy(nombre_dia_semana,"martes"); if(indice_dia==2) strcpy(nombre_dia_semana,"miercoles"); if(indice_dia==3) strcpy(nombre_dia_semana,"jueves"); if(indice_dia==4) strcpy(nombre_dia_semana,"viernes"); if(indice_dia==5) strcpy(nombre_dia_semana,"sabado"); if(indice_dia==6) strcpy(nombre_dia_semana,"domingo"); void Buscar_Dia_Semana(T_MES meses[], char mes[], int dia, char dia_sem[], char dia_mes_sig[]) int i,j; int numero_mes; int posicion_dia_mes; int posicion_dia_mes_siguiente; for(i=0;i<12;i++) if(strcmp(mes,meses[i].nombre_mes)==0) numero_mes=i; 11
for(i=0;i<5;i++) for(j=0;j<7;j++) if(meses[numero_mes].dias_mes[i][j]==dia) posicion_dia_mes=j; //el indice j nos dice que dia es Dia_Semana(posicion_dia_mes, dia_sem); for(i=3;i<5;i++)//bastaria con recorrer la ultima semana for(j=0;j<7;j++) if(meses[numero_mes].dias_mes[i][j]==0) posicion_dia_mes_siguiente=j; i=5; j=8; Dia_Semana(posicion_dia_mes_siguiente, dia_mes_sig); 12