QUICK_SORT (int *a,int i, int j) {
	int x,tempi, tempj,temp;

	tempi = i;
	tempj = j;
	x = a[ (i+j) / 2 ];
	do {
		while (x > a[i]) i++;
		while (x < a[j]) j--;
		if (i < j) {
			cambio (a,i,j);
			i++;
			j--;
		}
	} while ( i < j);
	if (i == j)
		if (x < a[i])
			j--;
		 else i++;
	if (j-1 == tempi) {
		if (a [tempi] > a[j])
			cambio (a, tempi,j);
	}
	else if (j > tempi) QUICK_SORT (a,tempi,j);
	if (i+1 == tempj) {
		if (a[i] > a[tempj])
			cambio (a,i,tempj);
	}
	else if (i < tempj) QUICK_SORT (a,i,tempj);

}
Exemple #2
0
int main (void)
{
	articulo stock [2];
	int op=0;
 do{
	
	printf("\t\t Selecciona una opcion \t\t  ");
	printf("\n1.-Dar de alta articulos\n2.-Dar de baja articulos\n3.-Imprimir el inventario\n4.-Modificar articulos\n5.-Buscar el articulo\n");
	scanf("%d",&op);
	switch(op)
	{
		case 1: 
		alta(stock);
		break;
		case 2: 
		baja(stock);
		break;
		case 3: 
		imprime(&stock[0]);
		break;
		case 4: 
		cambio(&stock[0]);
		break;
		/*case 5: 
		buscapornombre(&stock[0]);
		break;*/
		default: printf("\nOpcion incorrecta introduce solo los valores especificados");
		system("cls");
		scanf("%d",&op);
		break;
	}
  }while(op<=5);
}
void ordena_pila(int fin, int n, int pila[])
{
	int i, k = -1;
	for(i = 0; i < fin; i++)
	{
		if(pila[i] < pila[i+1])
		{
			if(k == -1)
			    k =i+1;
			else if(pila[i+1] > pila[k])
			    k = i+1;
		}
		else
		{
			if(k == -1)
			    k =i;
			else if(pila[i] > pila[k])
			    k = i;
		}
	}
	if(k == -1)
		printf("0\n");
	else if(k == 0)
	{
		printf("%d ", n-fin+k);
		cambio(fin-k, pila);
		ordena_pila(--fin, n, pila);
	}
	else
	{
        if(k == fin)
		    fin--;
		else
		{
			printf("%d ", n-k);
			cambio(k, pila);
		}
		ordena_pila(fin, n, pila);
	}
}
Exemple #4
0
int main() {

    char aux[50];
    libro JDT;
    printf("Introduce un nombre para el libro: ");
    fgets(aux, 50, stdin);
    cambio(aux);

    JDT.nombre = (char*)malloc((my_strlen(aux)+1)*sizeof(char)); //o amb <string.h> -> strlen(aux)+1
    if (JDT.nombre == NULL) {
        printf("No se ha podido reservar memoria.\n");
        exit(1);
    }
    my_strcpy(JDT.nombre, aux);//o amb <string.h> -> strcpy(JDT.nombre)

    printf("Introduce un su autor para el libro: ");
    fflush(stdin);
    fgets(aux, 50, stdin);
    cambio(aux);

    JDT.autor = (char*)malloc((my_strlen(aux) + 1)*sizeof(char)); //o amb <string.h> -> strlen(aux)+1
    if (JDT.autor == NULL) {
        printf("No se ha podido reservar memoria.\n");
        exit(1);
    }
    my_strcpy(JDT.autor, aux);//o amb <string.h> -> strcpy(JDT.nombre)

    printf("%s.\n", JDT.nombre);
    printf("%s.\n", JDT.autor);

    free(JDT.nombre);
    free(JDT.autor);

    system("pause");
    return 0;
}
Exemple #5
0
void avanzar(int *posicion, int *carril, int color)
{
	int valor_devuelto, tpos = 0, tcarril = 0;
	int apos = *posicion;
	int acarril = *carril;
	HANDLE posiciones[3]; //Vamos a añadir los dif. eventos por los que esperaremos

						  //EVENTOS A ESPERAR: EVENTO_ACABAR, MUTEX_POSICION_ADELANTE, MUTEX_POSICION_CAMBIO_DE_CARRIL

						  //Añadimos el evento acabar para detenernos y no avanzar mas*/
	posiciones[0] = IPC.evento_acabar;

	/*Vemos si estamos en alguna de las 4 posiciones especiales para compartir los mutex*/
	if (apos + 1 != traductor(apos + 1, acarril))
		posiciones[1] = IPC.posiciones[traductor(apos + 1, acarril)];
	else if (apos != 136) //Si no estamos en la posicion 136 solicitamos el mutex de la posicion siguiente
		posiciones[1] = IPC.posiciones[apos + acarril * 137 + 1];
	else
		posiciones[1] = IPC.posiciones[acarril * 137]; //Si estamos en la posicion 136 solicitamos el mutex de la primera posicion

													   //Añadimos el evento cambio de carril si procede
	if (cambio(apos, acarril, &tpos, &tcarril))
	{
		posiciones[2] = IPC.posiciones[tpos + tcarril * 137];
		valor_devuelto = WaitForMultipleObjectsEx(3, posiciones, FALSE, INFINITE, TRUE);
	}
	else
		valor_devuelto = WaitForMultipleObjectsEx(2, posiciones, FALSE, INFINITE, TRUE);

	switch (valor_devuelto)
	{
	case WAIT_OBJECT_0 + 0:
		ExitThread(7);
		break;
	case WAIT_OBJECT_0 + 1:
		DLL.avanza_coche(carril, posicion, color);
		break;
	case WAIT_OBJECT_0 + 2:
		DLL.cambio_carril(carril, posicion, color);
		break;
	}

	/*Si estamos en alguna posicion con mutex compartido lo liberamos llamando a traductor*/
	if (traductor(apos, acarril) != apos)
		ReleaseMutex(IPC.posiciones[traductor(apos, acarril)]);
	else
		ReleaseMutex(IPC.posiciones[apos + acarril * 137]);
}
Exemple #6
0
int main(){

	char aux[50];

	FILE *f;
	
	f = fopen("Bloque8.3.txt", "w");
	if (f == NULL){
		printf("Nose ha podido abrir.\n");
		exit(1);
	}

	printf("introduce una frase: ");
	fgets(aux, 50, stdin);
	cambio(aux);

	fprintf(f, "El string intruducido ha sido: %s", aux);

	fclose(f);

	system("pause");
	return 0;
}
void retira_b (pagina **raiz, int x, int *s)
{
	int posicion, i, k;
	pagina *p, *q, *r, *t;
	LIFO1 pila;
	void init1_pila (struct LIFO1 *p);
	int pila1_vacia (struct LIFO1 *p);
	void ins1_pila (struct LIFO1 *p,pagina *s,int i);
	void retira1_pila (struct LIFO1 *p,pagina **s,int *i);
	*s = 1;
	init1_pila (&pila);
	esta (*raiz, x, &posicion, &pila);
	if (posicion == -1)
		*s = 0;  /* La llave no existe en el arbol */
	else {
		retira1_pila (&pila, &p, &i);
		if (!hoja (p)) {
			t = p;
			k = i;
			ins1_pila (&pila, p, i+1);
			p = p->apunt [i+1];
			while ( p != NULL) {
				ins1_pila (&pila, p, 0);
				p = p->apunt [0];
			}
			retira1_pila (&pila, &p, &i);
			t->info [k] = p->info [0];
			x = p->info [0];
			posicion = 0;
		}
		if (p->cont > N)
			retirar (p, posicion);
		else {
			if (!pila1_vacia (&pila)) {
				retira1_pila (&pila, &q, &i);
				if (i < q->cont) {
					r = q->apunt [i+1];
					if (r->cont > N) {
						retirar (p, posicion);
						cambio (p, q, r, i, x);
					}
					else {
						if (i != 0) {
						   r = q->apunt [i-1];
						   if (r->cont > N) {
								retirar (p, posicion);
								cambio(p,q,r,i-1,x);
						   }
						   else unir (raiz,q,r,p,
							i-1,pila,x,posicion);
						}
						else unir (raiz,q,r,p,i,pila,
							x,posicion);
					}
				}
				else {
					r = q->apunt [i-1];
					if (r->cont > N) {
						retirar (p, posicion);
						cambio (p,q,r,i-1,x);
					}
					else unir (raiz,q,r,p,i-1,pila,
							x, posicion);
				}
			}
			else {
				retirar (p, posicion);
				if (p->cont == 0) {
					free (*raiz);
					*raiz = NULL;
				}
			}
		}
	}
}
void unir (pagina **raiz, pagina *q, pagina *r, pagina *p,
					 int i, LIFO1 pila, int x, int posicion)
{
	int terminar = 0,j, k;
	pagina *t;

	retirar (p, posicion);
	if (x < r->info [0]) {
		t = p;
		p = r;
		r = t;
	}
	while (terminar == 0) {
	  if (r->cont < N && p->cont > N) {
		cambio (r, q, p, i, x);
		r->apunt [r->cont] = p->apunt [0];
		cizquierda_apunt (p, 0, p->cont + 1);
		terminar = 1;
	  }
	  else if (p->cont < N && r->cont > N) {
			cambio (p, q, r, i, x);
			cderecha_apunt (p, 0);
			p->apunt [0] = r->apunt [r->cont + 1];
			r->apunt [r->cont + 1] = NULL;
			terminar = 1;
	  }
	  else {
		  j = r->cont;
		  r->info [j++] = q->info [i];
		  k = 0;
		  while (k <= p->cont - 1)
			r->info [j++] = p->info [k++];
		  r->cont = j;
		  retirar (q, i);
		  k = 0;
		  j = M - p->cont;
		  while (p->apunt [k] != NULL)
			r->apunt [j++] = p->apunt [k++];
		  free (p);
		  if (q->cont == 0) {
			q->apunt [i+1] = NULL;
			if (pila1_vacia (&pila) ) {
				free (q);
				q = NULL;
			}
		  }
		  else cizquierda_apunt (q, i+1, q->cont+1);
		  if (q != NULL)
			if (q->cont >= N)
				terminar = 1;
			else {
				t = q;
				if (!pila1_vacia (&pila) ) {
					retira1_pila (&pila, &q, &i);
					if (x >= q->info [0]) {
						p = t;
						r = q->apunt [i-1];
						i--;
					}
					else {
						r = t;
						p = q->apunt [i+1];
					}
				}
				else terminar = 1;
			}
		  else {
				terminar = 1;
				*raiz = r;
		  }
	  }
	}
}