int main(int argc, char **argv)
{
    struct vertice *poligono, *aux;
    char resp, menu_resp;
    double x=0, y=0;
    double peri=0, lado, angulo;
    int numero=0;
    int regular=1;
    int i, mos=1;
    //int vertices;
    do{
        numero=0;
        do{
            menu_resp=menu();
            }while((menu_resp<'A')||(menu_resp>'Z'));
        while(getchar()!='\n');
        switch(menu_resp){
            case 'A':
            aux=(struct vertice*) malloc(sizeof(struct vertice));
            poligono=aux;
            do{
                system("clear");
                cabecera();
                printf("\n\tPor favor, introduzca las coordenadas de los vértices del "
                       "polí-\n\tgono en sentido horario.\n");
                       regular=1;
                    for(i=0;i<numero;i++){
                        if(i%4==0)printf("\n");
                        printf("\t(%.2f, %.2f) ", poligono->x, poligono->y);
                        poligono=poligono->siguiente;
                        }
                        printf("\n\n");
                        if(resp=='S'){
                            aux->siguiente=(struct vertice*) malloc(sizeof(struct vertice));
                            aux=aux->siguiente;
                            }
                            numero++;
                        printf("\tVértice %d\n", numero);
                        printf("\tx: ");
                        scanf("%lf", &(aux->x));
                    while(getchar()!='\n');
                    printf("\ty: ");
                    scanf("%lf", &(aux->y));
                    while(getchar()!='\n');
                        aux->siguiente=poligono;
                        do{
                            if(numero>=3){
                                printf("\n\t\t¿Desea introducir otro vértice?(S/N)");
                                resp=getchar();
                            while(getchar()!='\n');
                                if(resp>=90)resp=resp-32;
                                }else
                                resp='S';
                            }while(resp!='N'&&resp!='S');
                        }while(resp=='S');
                    regular = lados_angulos(poligono, numero);
                    mos=1; break;
                    case 'B':
                        aux=(struct vertice*) malloc(sizeof(struct vertice));
                        poligono=aux;
                        system("clear");
                        cabecera();
                        printf( "\n\tPor favor, introduzca el número de vértices del "
                               "polígono.\n\n");
                               do{
                                   printf( "\tNúmero: ");
                                   scanf("%d", &numero);
                                   while(getchar()!='\n');
                                   }
                                   while(numero<3);
                                   angulo = 180 -(360/numero);
                                   printf( "\n\tPor favor, introduzca la longitud de los lados del "
                                          "polígono.\n\n");
                                          do{
                                              printf("\tLongitud: ");
                                              scanf("%lf", &lado);
                                              while(getchar()!='\n');
                                              }while(lado<=0);
                                            printf("\n\tPor favor, introduzca las coordenadas del primer vertice"
                                                   " del\n\tpolígono.\n");
                                                   printf("\tx: ");
                                                   scanf("%lf", &(aux->x));
                                                   while(getchar()!='\n');
                                                   printf("\ty: ");
                                                   scanf("%lf", &(aux->y));
                                                   while(getchar()!='\n');
                                                   aux->angulo=angulo;
                                                   aux->arista_poste=lado;
                                                for(i=0;i<numero-1;i++){
                                                    aux->siguiente=(struct vertice*) malloc(sizeof(struct vertice));
                                                    aux->siguiente->x=aux->x+(cos(((i*(PI*2/numero))))*aux->arista_poste);
                                                    aux->siguiente->y=aux->y+(sin(((i*(PI*2/numero))))*aux->arista_poste);
                                                    aux=aux->siguiente;
                                                    aux->angulo=angulo;
                                                    aux->arista_poste=lado;
                                                }
                                                aux->siguiente=poligono;
                                                mos=1; break;
                    case 'C':
                    aux=(struct vertice*) malloc(sizeof(struct vertice));
                    poligono=aux;
                    numero=0;
                    system("clear");
                    cabecera();
                    printf("\n\tPor favor, introduzca las coordenadas del primer vertice"
                           " del\n\tpolígono.\n");
                           printf("\tx: ");
                           scanf("%lf", &x);
                           while(getchar()!='\n');
                           printf("\ty: ");
                           scanf("%lf", &y);
                           while(getchar()!='\n');
                           do{
                               system("cls");
                               cabecera();
                               for(i=0;i<numero;i++){
                                   if(i%4==0)printf("\n");
                                   printf("\t(%.2G, %.2G) ", poligono->x, poligono->y);
                                   poligono=poligono->siguiente;
                                }
                                if(numero>=1){
                                    aux->siguiente=(struct vertice*) malloc(sizeof(struct vertice));
                                    aux=aux->siguiente;
                                    }
                                    printf( "\n\tPor favor, introduzca la amplitud del %dº ángulo del "
                                           "polígono.\n", numero+1);
                                    printf( "\n\tAmplitud (en grados): ");
                                    scanf("%lf", &aux->angulo);
                                    while(getchar()!='\n');
                                    printf( "\n\tPor favor, introduzca la longitud del %dº lado del "
                                           "polígono.\n",numero+1);
                                           printf( "\n\tLongitud: ");
                                           scanf("%lf", &aux->arista_poste);
                                        while(getchar()!='\n');
                                        aux->x=x;
                                        aux->y=y;

                                        x=aux->x+(cos(numero*(PI*2/(360/(180-aux->angulo))))*aux->arista_poste);
                                        y=aux->y+(sin(numero*(PI*2/(360/(180-aux->angulo))))*aux->arista_poste);
                                        aux->siguiente=poligono;
                                        numero++;
                                        }
                                        while(((numero<3))||!(((redondea(x,6))==redondea(poligono->x,6))&&((redondea(y,6))==redondea(poligono->y,6))));
                                        mos=1; break;
                    case 'S': return 0;
                    default: mos=0; break;
                    }
                    if(mos){
                        system("clear");
                        cabecera();
                        printf("\n\t\t\t\tResultados:\n\n");
                        printf("\tVértice A \tÁngulo\t\tVértice B\tÁngulo\t\tDist");
                    for(i=0;i<numero;i++){
                        if(i%1==0)printf("\n");
                        printf("%d\t(%.2f, %.2f) <) %.2fº", i+1, poligono->x, poligono->y, poligono->angulo);
                        printf(" \t(%.2f, %.2f) <) %.2fº", poligono->siguiente->x, poligono->siguiente->y, poligono->siguiente->angulo);
                        printf(" \t|%.2f|", poligono->arista_poste);
                        poligono=poligono->siguiente;
                        }
//Reconocemos de que polígono se trata
//numero=45;
nombre_poligono(numero, regular);

//Hallamos el area
double area=0;
x=y=0;
for(i=0;i<numero;i++){
    x = x + (poligono->x*(poligono->siguiente)->y);
    y = y + (poligono->y*(poligono->siguiente)->x);
    poligono=poligono->siguiente;
}
area=fabsf((x-y))/2;

//Calculamos el perímetro
peri=0;
double x_max, x_min, y_max, y_min;
x_max=x_min=poligono->x;
y_max=y_min=poligono->y;
for(i=0;i<numero;i++){
    x_max=mayorque(poligono->x, x_max);
    x_min=menorque(poligono->x, x_min);
    y_max=mayorque(poligono->y, y_max);
    y_min=menorque(poligono->y, y_min);
    peri=peri+poligono->arista_poste;
    poligono=poligono->siguiente;
    }
//area=fabsf(area);
printf("\tÁrea: %G u²\n", area);
printf("\tPerímetro: %G u\n", peri);
mostrar_poligono(poligono, numero, x_max, y_max, x_min, y_min);
//Liberamos la memoria dinámica
aux=poligono->siguiente;
poligono->siguiente=NULL;
poligono=aux;
for(i=0;i<numero;i++){
    aux=poligono;
    poligono=poligono->siguiente;
    free(aux);
}
}else
    printf("\n\n\t\tOpcion seleccionada incorrecta.");
    printf("\n\n\t\tPresiona intro para continuar...");
    while(getchar()!='\n');
    }
    while(1<2);
return 0;
}
Exemple #2
0
void calcularPorcentaje() {
	int i = 0;
	while (1) {
		i++;
		retardo(60); //duerme cada 60 segundos

		void sacaPorcentaje(t_cpu* cpu) {
			// 60 instrucciones ejecutadas equivale al 100%
//en este if es para una instruccion que empezo antes de los 60s y terminara despues de estos
			if (cpu->estado == NO_TERMINO_RAFAGA
					&& cpu->terminaInstruccion == NO_TERMINO) {
////esta ejecutando aun una instruccion, pero no ha terminado, entonces la sumo, esta en memoria
				incrementaInstPorcentaje(cpu);
				calculaAcumulado(cpu);


////				cpu->retardoTotal = (uint8_t) dameDiferencia(
////						cpu->inicioInstruccion, cpu->finInstruccion);
//				printf("acumuladoSegundos %f\n", cpu->acumuladoSegundos);
//				cpu->porcentajeUso = (uint8_t)(cpu->acumuladoSegundos * 100)
//						/60;

//				resetValPorcentaje(cpu); //lo reseteo porque luego cuando termine la instruccion se contara
			}  //ya termino la rafaga
//				cpu->porcentajeUso = (uint8_t) ((cpu->cantInstEjecutadasPorcentaje * 100)
//						/ instEquivalenteCienPorciento(configuracion->retardo));
			pthread_mutex_lock(&mutexCPUPorcentaje);
			//	cpu->porcentajeUso = (cpu->acumuladoSegundos * 100)
			//							/60;

//			printf("cant Inst ejecutadas %d \n",
//					cpu->cantInstEjecutadasPorcentaje);
//			printf("acumuladoSegundos %f\n", cpu->acumuladoSegundos);
//			cpu->porcentajeUso = (cpu->acumuladoSegundos * 100) / 60;

//			if (cpu->porcentajeUso > 100)
//				cpu->porcentajeUso = 93.331133;
//			tiempo promedio que demora una instruccion
			double result = cpu->acumuladoSegundos
					/ cpu->cantInstEjecutadasPorcentaje;
			//cuantas instrucciones se podrian ejecutar en 60 segundos
			int cienPorcien =  redondea(result);
//			printf("max instrucciones que se pueden ejecutar %d \n",
//					cienPorcien);

			double resultadoPor = ((cpu->cantInstEjecutadasPorcentaje * 100)
					/ cienPorcien);
			double parte_entera;
			modf(resultadoPor, &parte_entera);
			cpu->porcentajeUso =(int)  parte_entera;

//			cpu->porcentajeUso = ((cpu->cantInstEjecutadasPorcentaje * 100)
//					/ instEquivalenteCienPorciento(configuracion->retardo));
			resetValPorcentaje(cpu);
			//calculo el inicio de la otra mitad de esta instruccion
						calculafecha(cpu);
			pthread_mutex_unlock(&mutexCPUPorcentaje);

			//muestra y loguea resultado
			puts(
					string_from_format(
							KRED "++++++++++++++++++++++"RESET "++++++++"KRED "+++++++++++++++++++++++++++\n" RESET));
			puts(string_from_format("%s,\n", queCPUsoy(cpu)));
			puts(string_from_format("Para el minuto %d, \n", i));
			puts(
					string_from_format(
							"el porcentaje de uso es de  %i porciento. \n",
							cpu->porcentajeUso));
			puts(
					string_from_format(
							KBLU "++++++++++++++++++++++"RESET "+++++++++"KBLU "++++++++++++++++++++++++++\n"RESET));

			pthread_mutex_lock(&mutexCPULogs);
			log_info(logger, identificaCPU(queHiloSoy()));
			log_info(logger, "se ejecuta el calculo del porcentaje de la cpu");
			log_info(logger, string_from_format("para el minuto %i \n", i));
			log_info(logger,
					string_from_format("porcentaje de %i \n",
							cpu->porcentajeUso));
			pthread_mutex_unlock(&mutexCPULogs);
		}

		list_iterate(procCPU->listaCPU, (void*) sacaPorcentaje);

	}
}