Ayuda con metodo de ordenacion

Iniciado por Rilax, 18 Junio 2010, 02:29 AM

0 Miembros y 1 Visitante están viendo este tema.

Rilax

Hola a todos, bueno quieresa ver si me echan la mano para hacer que corra bien un programita que ya me saco CANAS tras CANAS no ya sta la mayoria lo uniko k me falta es el metodo de ordenacion que no me corre en la Universidad el Ingeniero nos dijo que por el metodo de ordenacion que queramos y yo lo ise por el de la burbuja pero no me sale no se si alguien de ustedes me podria ayudar si lo hacen MIL gracias o si ven en donde esta mi error DIGANME por que yo ya no doy mas xD saluditos y espero respuesta aqui les dejo el codigo (lo corri en Turbo C)

#include <stdio.h>         
#include <conio.h>         
#include <string.h>         
#include <graphics.h>       
#include <stdlib.h>
#include <process.h>
#define TAM 20
#include <ctype.h>
#include "graphics.h"
char nombre[20];
/****************************estructura principal************************/
  struct ferreteria
    {
     char articulo[TAM]; /*c articulo*/
     char clave[10];
     char precio[10]; /* precio*/
     char marca[10];    //otro
    }datos;
/***********************************funciones*******************************/
       void ordenar(struct ferreteria);
   //    void crear();
       void insertar(struct ferreteria );
       void visualizar(struct ferreteria );
       void buscar(struct ferreteria );
       void modificar(struct ferreteria );
       void borrar(struct ferreteria );
       void acerca();
       void articulo(struct ferreteria );
       void precio(struct ferreteria );
       void clave(struct ferreteria );
       void marca(struct ferreteria );
       int valido(char *, struct ferreteria );
/***************************iniciamos el menu principal******************/
       void main()
    {
   /*********************************iniciamos los graficos**************/

  int gdriver = DETECT, gmode, errorcode;
  int midx, midy, i;

   initgraph(&gdriver, &gmode, "");
   errorcode = graphresult();
   if (errorcode != grOk)
      {
       printf("Error de Graficos: %s\n", grapherrormsg(errorcode));
       printf("Presiona una tecla para continuar:");
       getch();
       exit(1);
      }

       char opcion;
       int salir=0;
     /**************************terminamos graficas********************/
       do
{

  clrscr();

  setfillstyle(SOLID_FILL,BLUE);
  bar(120,60,550,240);                /*primer bar 3d*/
/*sobre el primer*/

  printf("\n\n\n");
  printf("\n\n\t\tCONTROL DE FERRETERIA\n\n");
// printf("\n\n\t0. CREAR\n"        );
  printf("\t\t\t1. ALTAS\n"        );
  printf("\t\t\t2. MOSTRAR TODO\n" );
  printf("\t\t\t3. CONSULTAR\n"    );
  printf("\t\t\t4. MODIFICAR \n"   );
  printf("\t\t\t5. BAJAS\n"        );
  printf("\t\t\t6. INTEGRANTES\n");
  printf("\t\t\t7. ORDENAR\n\n"    );
   moveto(250,300);outtext("PULSA ESC PARA SALIR");   /*pocision de esc*/
  setfillstyle(SOLID_FILL,7);       /*color de fondo 2*/
  bar(0,0,120,240);
  setbkcolor(BLUE);                    /*color de fondo3*/
  rectangle(120,60,550,240);
  rectangle(116,56,554,244);        /*rectangulo sobre otro*/
  rectangle(240,295,420,310);
  rectangle(236,291,424,314);

  opcion=getch();
  clrscr();
  switch(opcion)
   {
    case '1':  insertar(datos);
    break;

    case '2':  visualizar(datos);
    break;

    case '3':  buscar(datos);
    break;

    case '4':  modificar(datos);
    break;

    case '5':  borrar(datos);
    break;

    case '6':  acerca();
    break;

   case '7':
       ordenar(datos);

    case 27:  salir=1;
    break;
   }
}
    while(!salir);
}

/**************************insertar los datos en la estructura**************/
    void insertar(struct ferreteria datos)
   {
    clrscr();                                            /*limpiamos pantalla*/
    FILE *f;
    FILE *control;
    int result;
    char clave[10];
    printf("\t\t LOS DIRECTORIOS SON \n C: \n D: \n K: \n\n");

    printf("\n INTRODUCE EL NOMBRE DE EL ARCHIVO\n");

     gets(nombre);
    f=fopen(nombre,"at+");
    //control=fopen("contro.doc","w+");
    clrscr();
    if(!f)
{
printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
getch();
exit(1);
}


/*************************************************/
printf("PARA TERMINAR LA INTRODUCCION DE REGISTROS, EN CLAVE ESCRIBE '*'\n");
// fprintf(control,"clave");      /* l clave l producto l precio l marca l */
  // fprintf(control,"\t\t producto");   /* l_______l__________l________l_______l */
    // fprintf(control,"\t\t precio");
      // fprintf(control,"\t\t marca\n");             /*imprimimos con formato*/
printf("CLAVE:");
gets(clave);   fflush(stdin);
fclose(f);
result=valido(clave, datos);
f=fopen(nombre,"at+");
while(!result)
    {
    printf("LA CLAVE YA EXISTE\n");
    printf("CLAVE: ");
    gets(clave);   fflush(stdin);
    fclose(f);
    result=valido(clave, datos);
    f=fopen(nombre,"at+");
    } strcpy(datos.clave,clave);
while(strcmp(datos.clave,"*"))
{




printf("ARTICULO: ");
gets(datos.articulo);   fflush(stdin);
printf("PRECIO ");
gets(datos.precio);   fflush(stdin);

printf("MARCA: ");
gets(datos.marca);   fflush(stdin);

fwrite(&datos,sizeof(datos),1,f);
fprintf(control,"%s",datos.clave);
fprintf(control,"%s\t\t",datos.articulo);
fprintf(control,"%s\t\t",datos.precio);
fprintf(control,"%s\t\t\n",datos.marca);

       // system("cls");

clrscr();
printf("PARA TERMINAR LA INTRODUCCION DE REGISTROS, EN CLAVE ESCRIBE '*'\n");

printf("CLAVE:");
gets(clave);   fflush(stdin);
fclose(f);
result=valido(clave, datos);
f=fopen(nombre,"at+");
while(!result)
    {
    printf("LA CLAVE YA EXISTE\n");
    printf("CLAVE: ");
    gets(clave);   fflush(stdin);
    fclose(f);
    result=valido(clave, datos);
    f=fopen(nombre,"at+");
    } strcpy(datos.clave,clave);

}
    fclose(f);
    fclose(control);
}
/**********************************ver los datos introducidos***************/
void visualizar(struct ferreteria datos)
{
    clrscr();
    FILE *f;

    f=fopen(nombre,"rt+");
    if(!f)
{
printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
getch();
exit(1);
}
    while(fread(&datos,sizeof(datos),1,f))
{
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n", datos.marca);
getch();
clrscr();
}
    fclose(f);
}

void buscar(struct ferreteria datos)
{
    clrscr();
    char opcion;
    int salir=0;
    do
{              /*metemos el do while para seguir buscando*/
  clrscr();
setfillstyle(SOLID_FILL,5);
bar(0,0,640,120);
printf("\t\t\t\tBUSCAR\n");
printf("\t\t\t\t------\n");
printf("\t\t\t1. ARTICULO\n");
printf("\t\t\t2. CLAVE\n");
printf("\t\t\t3. PRECIO\n");
printf("\t\t\t4. MARCA\n\n");
moveto(250,300);outtext("PULSA ESC PARA SALIR");
rectangle(240,295,420,310); //rectan de salir
rectangle(236,291,424,314); //rectan1 de salir
rectangle(0,0,638,120);


opcion=getch();
switch(opcion)
    {
    case '1':  articulo(datos);
    break;
    case '2':  clave(datos);
    break;
    case '3':  precio(datos);
    break;
    case '4':  marca(datos);
    break;
    case 27:  salir=1;
    break;
    }
}
    while(!salir);
}
/**************************FUNCION PARA MODIFICAR FERRETERIA...************/
void modificar(struct ferreteria datos)
{
    clrscr();
    FILE *f;
    FILE *control;
    char opcion, articulo[TAM],clave[10];
    int salir=0,salirf=0, encontrado=0;
    do
{
system("cls");
f=fopen(nombre,"rt+");

printf("INGRESA LA CLAVE A MODIFICAR: ");
gets(clave);   fflush(stdin);
fread(&datos,sizeof(datos),1,f);
while(!feof(f)&&!salir)
    {
    if(!strcmp(datos.clave,clave))
{
printf("ARTICUL0 (antiguo): %s\n", datos.articulo);
printf("ARTICULO (nuevo): ");
gets(datos.articulo);   fflush(stdin);
printf("CLAVE (antiguo): %s\n", datos.clave);
printf("CLAVE (nuevo): ");
gets(datos.clave);   fflush(stdin);
printf("PRECIO (antiguo): %s\n", datos.precio);
printf("PRECIO(nuevo): ");
gets(datos.precio);   fflush(stdin);
printf("MARCA (antiguo): %s\n", datos.marca);
printf("MARCA (nuevo): ");
gets(datos.marca);   fflush(stdin);
fseek(f,-(long)sizeof(datos),SEEK_CUR);
fwrite(&datos,sizeof(datos),1,f);

fwrite(&datos,sizeof(datos),1,control);
encontrado=1;
salir=1;
}
    else
fread(&datos,sizeof(datos),1,f);

    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO QUE BUSCA\n");
fclose(f);

printf("¨DESEA MODIFICAR OTRO REGISTRO? (S/N)?\n");
opcion=toupper(getch());
if(opcion=='N')
    salirf=1;
else
    salir=0;
}
    while(!salirf);
}

void borrar(struct ferreteria datos)
{
    clrscr();
    FILE *f, *f_temp;
    char opcion, clave[10];
    int salir=0;
    do
{
system("cls");
f=fopen(nombre,"rt+");
f_temp=fopen("ferreteria_temp","wt+");
if(!f)
    {
    printf("ERROR EN LA APERTURA DEL ARCHIVO\n");
    getch();
    exit(1);
    }
if(!f_temp)
    {
    printf("ERROR EN LA APERTURA DEL ARCHIVO TEMPORAL\n");
    getch();
    exit(1);
    }
printf("INGRESA LA CLAVE A BORRAR: ");
gets(clave);   fflush(stdin);
fread(&datos,sizeof(datos),1,f);
while(!feof(f))
    {
    if(strcmp(clave,datos.clave))
fwrite(&datos,sizeof(datos),1,f_temp);
    fread(&datos,sizeof(datos),1,f);
    }
fclose(f);
fclose(f_temp);
remove(nombre);
rename("ferreteria_temp",nombre);
     // remove("ferreteria_temp" );
printf("¨DESEA BORRAR OTRO REGISTRO? (S/N)\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
}
    while(!salir);
}

void acerca()
{   clrscr();
setfillstyle(SOLID_FILL,5);
bar(26,76,604,184);
rectangle(26,76,604,184);
gotoxy(5,5);   printf("INTEGRANTES\n\n");
printf("\t\t\t\tARTURO GONZALEZ\n");
printf("\t\t\t\tCARLOS ABRAHAM\n ");
printf("\t\t\t\tMAYRA SANTANA\n");
printf("\t\t\t\tCLAUDIA ACU¥A\n");
rectangle(30,80,600,180);
moveto(250,300);outtext("PULSA ESC PARA SALIR");
rectangle(240,295,420,310);
rectangle(236,291,424,314);

  //para que no tape los
  //printfllllllllllllllll


getch();
}
/***********************************funcion de el articulo a escribir*******/
   void articulo(struct ferreteria datos)
     {
clrscr();
FILE *f;
char articulo[TAM], opcion;
int salir=0, encontrado=0;
      do
{
system("cls");
f=fopen(nombre,"rt+");
if(!f)
    {
    printf("ERROR EN LA APERTURA DEL ARCHIVO\n");
    getch();
    exit(1);
    }
printf("INGRESA EL ARTICULO A BUSCAR: ");
gets(articulo);   fflush(stdin);
while(fread(&datos,sizeof(datos),1,f))
    {
    if(!strcmp(datos.articulo,articulo))
{
printf("ARTICULO %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
}
    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
    printf("¨DESEA BUSCAR OTRO REGISTRO? (S/N)\n");
    opcion=toupper(getch());
    if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}
/***************************funcion de el precio *************************/
      void precio(struct ferreteria datos)
      {
   clrscr();
   FILE *f;
   char opcion, precio[10];
   int salir=0, encontrado=0;
do
  {
   system("cls");
   f=fopen(nombre,"rt+");
   if(!f)
    {
     printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
     getch();
     exit(1);
    }
  printf("INTRODUCE EL PRECIO A BUSCAR: ");
  gets(precio);   fflush(stdin);
  while(fread(&datos,sizeof(datos),1,f))
    {
     if(!strcmp(precio,datos.precio))
{
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
}
    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
printf("¨DESEA BUSCAR OTRO REGISTRO (S/N)\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}
/**************************funcion para el campo clave y todo su desarrollo**/
void clave(struct ferreteria datos)
{
    clrscr();
    FILE *f;
    char opcion, clave[10];
    int salir=0, encontrado=0;
    do
{
system("cls");
f=fopen(nombre,"rt+");
if(!f)
    {
    printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
    getch();
    exit(1);
    }
printf("INGRESA LA CLAVE A BUSCAR: ");
gets(clave);   fflush(stdin);
while(fread(&datos,sizeof(datos),1,f))
    {
    if(!strcmp(clave,datos.clave))
{
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
}
    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
printf("¨DESEA BUSCAR OTRO REGISTRO? (S/N)\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}
/**********************************funcion  para el campo marca*************/
       void marca(struct ferreteria datos)
      {
       FILE *f;
       char opcion, marca[10];
       int salir=0, encontrado=0;
       do
{
  system("cls");
  f=fopen(nombre,"rt+");
  if(!f)
      {
       printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
       getch();
       exit(1);
      }
       printf("INGRESA LA MARCA A BUSCAR: ");
       gets(marca);   fflush(stdin);
       while(fread(&datos,sizeof(datos),1,f))
{
if(!strcmp(marca,datos.marca))
      {
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
      }
}
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
printf("¨DESEA BUSCAR OTRO REGISTRO? (S/N)?\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}

/***********esta funcion es para ver si el archivo esta bien hecho o no****/
int valido(char clave[], struct ferreteria datos)
{
    FILE *f;
    int esvalido=1;
    f=fopen(nombre,"rt+");
    fread(&datos,sizeof(datos),1,f);
    while(!feof(f)&&esvalido)
{
if(!strcmp(clave,datos.clave))
    esvalido=0;
else
    fread(&datos,sizeof(datos),1,f);
}
    fclose(f);
    return esvalido;
}


/***************************ordenar las claves por m. de burbuja*************************************/


void ordenar(struct ferreteria datos)
       {

FILE *f;
int p, aux;
int nclaves=1;
int arreglo1[50];
int arreglo2[50];
int valor[200];
int x,i=1,j=2, temp;
int a;


int valor1[23];





if((f=fopen(nombre,"rt+"))==NULL)
{
  printf("\nEL FICHERO NO EXISTE.");
  getch();
  exit(0);
  }

  while(!feof(f)&&!exit)
{
  fread(&datos, sizeof(datos),1,f);


  valor1[nclaves]=atoi(datos.clave);
  nclaves=nclaves+1;
}

  if(valor1[i]>valor1[j])
    {
     valor[j]=aux;
     valor[i]=valor[j];
     valor[j]=valor[i];
     j++;
     i++;
    }
  else
   {
    i++;
    j++;
   }

   for(i=1;i<=nclaves;i++)
    {
     printf("%d",valor[i]);
    }

fclose(f);
getch();


   }

/***************************************************************************************/

  /* void crear()
   {
    FILE *f;
    printf("\t\t Los directorios son \n C: \n D: \n K: \n\n");
    printf("\n INTRODUCE EL NOMBRE DE EL ARCHIVO\n");

    gets(nombre);
    f=fopen(nombre,"w+");
    if(f!=NULL)
       {
printf("\n Fichero creado.....\n");
       }
else
{
  printf("\n Error en el archivo\n");
}
    getch();
   }
    */


si lo gustan descargar lo subi a varios del k gusten ;)

http://www.sendspace.com/file/srwxqo

http://rapidshare.com/files/399850495/ProyectoFinal.CPP.html

http://www.2shared.com/file/exh0kCVc/ProyectoFinal.html

http://www.filefactory.com/file/b21675f/n/ProyectoFinal.CPP

http://ifile.it/3t9evgj/ProyectoFinal.CPP

CUALQUIER AYUDA sirve si no le tiran mucho a la de burbuja me dijero k puede ser otro metodo es k soy principiante en esto GRACIAS POR RESPONDER!! ;););)

AckeR

Hola!

Podrías ver bien como es la síntaxis para usar el método burbuja!

creo que deberías recorrer los vectores con algún bucle(2 for)
para así te pueda ordenar dependiendo como lo quieras!

algoritmo burbuja( A : array de n elementos indizados de 1 a n)
  para i desde 1 hasta n-1 hacer: //las n-1 pasadas
       para j desde 1 hasta n-i hacer: //el recorrido
         si A[j] > A[j+1] entonces //Si no están en orden
           intercambiar A[j] y  A[j+1] //Se intercambian
       fin para
  fin para
fin algoritmo



No he visto detalladamente tu code pero creo que ahí puede estar el error de que no ordena como corresponde.!
Y otra cosa utiliza GeSHi para poder visualizar mejor el code !

suerte!!

...DaR LaS GraCiaS No CuestA NadA...

Rilax

no no no ordena anda le doy a la opcion de ordenas y me sale un numero asi: -213666 y ya es todo lo k me sale...

lo k tengo en ordenacion es:
Código (cpp) [Seleccionar]
void ordenar(struct ferreteria datos)
       {

FILE *f;
int p, aux;
int nclaves=1;
int arreglo1[50];
int arreglo2[50];
int valor[200];
int x,i=1,j=2, temp;
int a;


int valor1[23];





if((f=fopen(nombre,"rt+"))==NULL)
{
  printf("\nEL FICHERO NO EXISTE.");
  getch();
  exit(0);
  }

  while(!feof(f)&&!exit)
{
  fread(&datos, sizeof(datos),1,f);


  valor1[nclaves]=atoi(datos.clave);
  nclaves=nclaves+1;
}

  if(valor1[i]>valor1[j])
    {
     valor[j]=aux;
     valor[i]=valor[j];
     valor[j]=valor[i];
     j++;
     i++;
    }
  else
   {
    i++;
    j++;
   }

   for(i=1;i<=nclaves;i++)
    {
     printf("%d",valor[i]);
    }

fclose(f);
getch();


   }


Es que el programa crea un archivo .txt y despues desde ese archivo deve de ordenarlos en el programa es lo k no me sale.. Y gracias por responder hermano ;)

Littlehorse


  • Es recomendable utilizar fgets en lugar de gets.
  • Tanto conio como graphics son librerías no estandar no recomendables. Es preferible utilizar funciones especificas del sistema o soluciones multi-plataforma en caso que se necesite

En cuanto al código, es bastante largo y desordenado así que tendrás que depurar, ya sea debuggeando o poniendo printf's en lugares específicos, como te sea mas cómodo.

Lo primero que se nota a simple vista en la función "ordenar" es que declaras variables y arreglos que no utilizas. Intenta ir quitando del código lo que no necesites así se te hace mas fácil seguirlo y modificarlo.
Es importante también que revises la lógica del método de ordenamiento, ya que vos vas leyendo los datos e ingresandolos en un arreglo, pero luego cuando llega el momento de ordenar, no realizas los ciclos necesarios.

En cuanto a la apertura y lectura del archivo, si vas a trabajar con los datos de esa forma, es conveniente que lo hagas en modo binario.

En conclusión, revisa donde los valores no son adecuados y donde el programa no realiza lo que debería, y también lee este link y luego compara con tu función.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Mr.Blue

#4
Código (cpp) [Seleccionar]
valor[j]=aux;
    valor[i]=valor[j];
    valor[j]=valor[i];

puede ser que aca aya algo mal? o estoy confundido yo?


**Modifico
no, me equivoque yo, disculpas.

leogtz

Cita de: eeprom46 link=topic=297053.msg1471640#msg1471640 no me equivoque yo, disculpas.
/quote]

No te equivocaste tú, ¿entonces lo hizo el otro compañero?
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Rilax

MIL gracias x sus respuestas sorry si les di un codigo con "basura" no me di cuenta es k como soy principiante pues cuando veo k no funciona simplente le pongo " / " e intento con otra cosa, aqui el codigo sin "basura"
Código (cpp) [Seleccionar]

#include <stdio.h>
#include <conio.h>         
#include <string.h>         
#include <graphics.h>       
#include <stdlib.h>
#include <process.h>
#define TAM 20
#include <ctype.h>
#include "graphics.h"
char nombre[20];
/****************************estructura principal************************/
  struct ferreteria
    {
     char articulo[TAM];
     char clave[10];
     char precio[10];
     char marca[10];
    }datos;
/***********************************funciones*******************************/
       void ordenar(struct ferreteria);
       void insertar(struct ferreteria );
       void visualizar(struct ferreteria );
       void buscar(struct ferreteria );
       void modificar(struct ferreteria );
       void borrar(struct ferreteria );
       void acerca();
       void articulo(struct ferreteria );
       void precio(struct ferreteria );
       void clave(struct ferreteria );
       void marca(struct ferreteria );
       int valido(char *, struct ferreteria );
/***************************iniciamos el menu principal******************/
       void main()
    {
   /*********************************iniciamos los graficos**************/

  int gdriver = DETECT, gmode, errorcode;
  int midx, midy, i;

   initgraph(&gdriver, &gmode, "");
   errorcode = graphresult();
   if (errorcode != grOk)
      {
       printf("Error de Graficos: %s\n", grapherrormsg(errorcode));
       printf("Presiona una tecla para continuar:");
       getch();
       exit(1);
      }

       char opcion;
       int salir=0;
     /**************************terminamos graficas********************/
       do
{

  clrscr();

  setfillstyle(SOLID_FILL,BLUE);
  bar(120,60,550,240);                /*primer bar 3d*/
/*sobre el primer*/

  printf("\n\n\n");
  printf("\n\n\t\tCONTROL DE FERRETERIA\n\n");
  printf("\t\t\t1. ALTAS\n"        );
  printf("\t\t\t2. MOSTRAR TODO\n" );
  printf("\t\t\t3. CONSULTAR\n"    );
  printf("\t\t\t4. MODIFICAR \n"   );
  printf("\t\t\t5. BAJAS\n"        );
  printf("\t\t\t6. INREGRANTE\n");
  printf("\t\t\t7. ORDENAR\n\n"    );
   moveto(250,300);outtext("PULSA ESC PARA SALIR");   /*pocision de esc*/
  setfillstyle(SOLID_FILL,7);       /*color de fondo 2*/
  bar(0,0,120,240);
  setbkcolor(BLUE);                    /*color de fondo3*/
  rectangle(120,60,550,240);
  rectangle(116,56,554,244);        /*rectangulo sobre otro*/
  rectangle(240,295,420,310);
  rectangle(236,291,424,314);

  opcion=getch();
  clrscr();
  switch(opcion)
   {
    case '1':  insertar(datos);
    break;

    case '2':  visualizar(datos);
    break;

    case '3':  buscar(datos);
    break;

    case '4':  modificar(datos);
    break;

    case '5':  borrar(datos);
    break;

    case '6':  acerca();
    break;

   case '7':
       ordenar(datos);

    case 27:  salir=1;
    break;
   }
}
    while(!salir);
}

/**************************insertar los datos en la estructura**************/
    void insertar(struct ferreteria datos)
   {
    clrscr();                                            /*limpiamos pantalla*/
    FILE *f;
    FILE *control;
    int result;
    char clave[10];
    printf("\t\t LOS DIRECTORIOS SON \n C: \n D: \n K: \n\n");

    printf("\n INTRODUCE EL NOMBRE DE EL ARCHIVO\n");

     gets(nombre);
    f=fopen(nombre,"at+");
    clrscr();
    if(!f)
{
printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
getch();
exit(1);
}


/*************************************************/
printf("PARA TERMINAR LA INTRODUCCION DE REGISTROS, EN CLAVE ESCRIBE '*'\n");
printf("CLAVE:");
gets(clave);   fflush(stdin);
fclose(f);
result=valido(clave, datos);
f=fopen(nombre,"at+");
while(!result)
    {
    printf("LA CLAVE YA EXISTE\n");
    printf("CLAVE: ");
    gets(clave);   fflush(stdin);
    fclose(f);
    result=valido(clave, datos);
    f=fopen(nombre,"at+");
    } strcpy(datos.clave,clave);
while(strcmp(datos.clave,"*"))
{

printf("ARTICULO: ");
gets(datos.articulo);   fflush(stdin);
printf("PRECIO ");
gets(datos.precio);   fflush(stdin);

printf("MARCA: ");
gets(datos.marca);   fflush(stdin);

fwrite(&datos,sizeof(datos),1,f);
fprintf(control,"%s",datos.clave);
fprintf(control,"%s\t\t",datos.articulo);
fprintf(control,"%s\t\t",datos.precio);
fprintf(control,"%s\t\t\n",datos.marca);

clrscr();
printf("PARA TERMINAR LA INTRODUCCION DE REGISTROS, EN CLAVE ESCRIBE '*'\n");

printf("CLAVE:");
gets(clave);   fflush(stdin);
fclose(f);
result=valido(clave, datos);
f=fopen(nombre,"at+");
while(!result)
    {
    printf("LA CLAVE YA EXISTE\n");
    printf("CLAVE: ");
    gets(clave);   fflush(stdin);
    fclose(f);
    result=valido(clave, datos);
    f=fopen(nombre,"at+");
    } strcpy(datos.clave,clave);

}
    fclose(f);
    fclose(control);
}
/**********************************ver los datos introducidos***************/
void visualizar(struct ferreteria datos)
{
    clrscr();
    FILE *f;

    f=fopen(nombre,"rt+");
    if(!f)
{
printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
getch();
exit(1);
}
    while(fread(&datos,sizeof(datos),1,f))
{
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n", datos.marca);
getch();
clrscr();
}
    fclose(f);
}

void buscar(struct ferreteria datos)
{
    clrscr();
    char opcion;
    int salir=0;
    do
{
  clrscr();
setfillstyle(SOLID_FILL,BLUE);
bar(0,0,640,120);
printf("\t\t\t\tBUSCAR\n");
printf("\t\t\t\t------\n");
printf("\t\t\t1. ARTICULO\n");
printf("\t\t\t2. CLAVE\n");
printf("\t\t\t3. PRECIO\n");
printf("\t\t\t4. MARCA\n\n");
moveto(250,300);outtext("PULSA ESC PARA SALIR");
rectangle(240,295,420,310); //rectan de salir
rectangle(236,291,424,314); //rectan1 de salir
rectangle(0,0,638,120);


opcion=getch();
switch(opcion)
    {
    case '1':  articulo(datos);
    break;
    case '2':  clave(datos);
    break;
    case '3':  precio(datos);
    break;
    case '4':  marca(datos);
    break;
    case 27:  salir=1;
    break;
    }
}
    while(!salir);
}
/**************************FUNCION PARA MODIFICAR FERRETERIA...************/
void modificar(struct ferreteria datos)
{
    clrscr();
    FILE *f;
    FILE *control;
    char opcion, articulo[TAM],clave[10];
    int salir=0,salirf=0, encontrado=0;
    do
{
system("cls");
f=fopen(nombre,"rt+");

printf("INGRESA LA CLAVE A MODIFICAR: ");
gets(clave);   fflush(stdin);
fread(&datos,sizeof(datos),1,f);
while(!feof(f)&&!salir)
    {
    if(!strcmp(datos.clave,clave))
{
printf("ARTICUL0 (antiguo): %s\n", datos.articulo);
printf("ARTICULO (nuevo): ");
gets(datos.articulo);   fflush(stdin);
printf("CLAVE (antiguo): %s\n", datos.clave);
printf("CLAVE (nuevo): ");
gets(datos.clave);   fflush(stdin);
printf("PRECIO (antiguo): %s\n", datos.precio);
printf("PRECIO(nuevo): ");
gets(datos.precio);   fflush(stdin);
printf("MARCA (antiguo): %s\n", datos.marca);
printf("MARCA (nuevo): ");
gets(datos.marca);   fflush(stdin);
fseek(f,-(long)sizeof(datos),SEEK_CUR);
fwrite(&datos,sizeof(datos),1,f);

fwrite(&datos,sizeof(datos),1,control);
encontrado=1;
salir=1;
}
    else
fread(&datos,sizeof(datos),1,f);

    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO QUE BUSCA\n");
fclose(f);

printf("¨DESEA MODIFICAR OTRO REGISTRO? (S/N)?\n");
opcion=toupper(getch());
if(opcion=='N')
    salirf=1;
else
    salir=0;
}
    while(!salirf);
}

void borrar(struct ferreteria datos)
{
    clrscr();
    FILE *f, *f_temp;
    char opcion, clave[10];
    int salir=0;
    do
{
system("cls");
f=fopen(nombre,"rt+");
f_temp=fopen("ferreteria_temp","wt+");
if(!f)
    {
    printf("ERROR EN LA APERTURA DEL ARCHIVO\n");
    getch();
    exit(1);
    }
if(!f_temp)
    {
    printf("ERROR EN LA APERTURA DEL ARCHIVO TEMPORAL\n");
    getch();
    exit(1);
    }
printf("INGRESA LA CLAVE A BORRAR: ");
gets(clave);   fflush(stdin);
fread(&datos,sizeof(datos),1,f);
while(!feof(f))
    {
    if(strcmp(clave,datos.clave))
fwrite(&datos,sizeof(datos),1,f_temp);
    fread(&datos,sizeof(datos),1,f);
    }
fclose(f);
fclose(f_temp);
remove(nombre);
rename("ferreteria_temp",nombre);
printf("¨DESEA BORRAR OTRO REGISTRO? (S/N)\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
}
    while(!salir);
}

void acerca()
{   clrscr();
setfillstyle(SOLID_FILL,BLUE);
bar(26,76,604,184);
rectangle(26,76,604,184);
gotoxy(5,5); printf("PROYECTO PARA EXTRAORDENARIO POR:\n\n");
printf("\tLuis Antonio Vallejo Salgado\n");
rectangle(30,80,600,180);
moveto(250,300);outtext("PULSA ESC PARA SALIR");
rectangle(240,295,420,310);
rectangle(236,291,424,314);
getch();
}
/***********************************funcion de el articulo a escribir*******/
   void articulo(struct ferreteria datos)
     {
clrscr();
FILE *f;
char articulo[TAM], opcion;
int salir=0, encontrado=0;
      do
{
system("cls");
f=fopen(nombre,"rt+");
if(!f)
    {
    printf("ERROR EN LA APERTURA DEL ARCHIVO\n");
    getch();
    exit(1);
    }
printf("INGRESA EL ARTICULO A BUSCAR: ");
gets(articulo);   fflush(stdin);
while(fread(&datos,sizeof(datos),1,f))
    {
    if(!strcmp(datos.articulo,articulo))
{
printf("ARTICULO %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
}
    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
    printf("¨DESEA BUSCAR OTRO REGISTRO? (S/N)\n");
    opcion=toupper(getch());
    if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}
/***************************funcion de el precio *************************/
      void precio(struct ferreteria datos)
      {
   clrscr();
   FILE *f;
   char opcion, precio[10];
   int salir=0, encontrado=0;
do
  {
   system("cls");
   f=fopen(nombre,"rt+");
   if(!f)
    {
     printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
     getch();
     exit(1);
    }
  printf("INTRODUCE EL PRECIO A BUSCAR: ");
  gets(precio);   fflush(stdin);
  while(fread(&datos,sizeof(datos),1,f))
    {
     if(!strcmp(precio,datos.precio))
{
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
}
    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
printf("¨DESEA BUSCAR OTRO REGISTRO (S/N)\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}
/**************************funcion para el campo clave y todo su desarrollo**/
void clave(struct ferreteria datos)
{
    clrscr();
    FILE *f;
    char opcion, clave[10];
    int salir=0, encontrado=0;
    do
{
system("cls");
f=fopen(nombre,"rt+");
if(!f)
    {
    printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
    getch();
    exit(1);
    }
printf("INGRESA LA CLAVE A BUSCAR: ");
gets(clave);   fflush(stdin);
while(fread(&datos,sizeof(datos),1,f))
    {
    if(!strcmp(clave,datos.clave))
{
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
}
    }
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
printf("¨DESEA BUSCAR OTRO REGISTRO? (S/N)\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}
/**********************************funcion  para el campo marca*************/
       void marca(struct ferreteria datos)
      {
       FILE *f;
       char opcion, marca[10];
       int salir=0, encontrado=0;
       do
{
  system("cls");
  f=fopen(nombre,"rt+");
  if(!f)
      {
       printf("ERROR EN LA APERTURA DE EL ARCHIVO\n");
       getch();
       exit(1);
      }
       printf("INGRESA LA MARCA A BUSCAR: ");
       gets(marca);   fflush(stdin);
       while(fread(&datos,sizeof(datos),1,f))
{
if(!strcmp(marca,datos.marca))
      {
printf("ARTICULO: %s\n", datos.articulo);
printf("CLAVE: %s\n", datos.clave);
printf("PRECIO: %s\n", datos.precio);
printf("MARCA: %s\n\n", datos.marca);
encontrado=1;
      }
}
if(!encontrado)
    printf("NO SE HA ENCONTRADO EL REGISTRO SOLICITADO\n");
printf("¨DESEA BUSCAR OTRO REGISTRO? (S/N)?\n");
opcion=toupper(getch());
if(opcion=='N')
    salir=1;
else
    encontrado=0;
fclose(f);
}
    while(!salir);
}

/***********esta funcion es para ver si el archivo esta bien hecho o no****/
int valido(char clave[], struct ferreteria datos)
{
    FILE *f;
    int esvalido=1;
    f=fopen(nombre,"rt+");
    fread(&datos,sizeof(datos),1,f);
    while(!feof(f)&&esvalido)
{
if(!strcmp(clave,datos.clave))
    esvalido=0;
else
    fread(&datos,sizeof(datos),1,f);
}
    fclose(f);
    return esvalido;
}


/***************************ordenar las claves por m. de burbuja*************************************/


void ordenar(struct ferreteria datos)
       {

FILE *f;
int p, aux;
int nclaves=1;
int arreglo1[50];
int arreglo2[50];
int valor[200];
int x,i=1,j=2, temp;
int a;


int valor1[23];


if((f=fopen(nombre,"rt+"))==NULL)
{
  printf("\nEL FICHERO NO EXISTE.");
  getch();
  exit(0);
  }

  while(!feof(f)&&!exit)
{
  fread(&datos, sizeof(datos),1,f);


  valor1[nclaves]=atoi(datos.clave);
  nclaves=nclaves+1;
}

  if(valor1[i]>valor1[j])
    {
     valor[j]=aux;
     valor[i]=valor[j];
     valor[j]=valor[i];
     j++;
     i++;
    }
  else
   {
    i++;
    j++;
   }

   for(i=1;i<=nclaves;i++)
    {
     printf("%d",valor[i]);
    }

fclose(f);
getch();


   }


Littlehorse, se ve k sabes mucho, e checar lo que me dijste y pus sigue sin jalar :S

sobre lo de
Código (cpp) [Seleccionar]
valor[j]=aux;
     valor[i]=valor[j];
     valor[j]=valor[i];


Segun yo sta bien...

Nork

Yo no usaría el método de la burbuja. Supongo que lo habrás usado por que es el que más te sonaba ya que se habla mucho de él... pero es de lo peor en cuanto a sistemas de ordenación (tiempo n^2). Si me dejas darte mi opinión usa el sort que te viene en la librería algorithm y su tiempo es de lo mejor (logn*n), aparte es muy fácil de usar!

C' Est La Vie

Rilax

ya lo solucione:

Código (cpp) [Seleccionar]
void ordenar(struct ferreteria datos)
{
      FILE *f;
      char clave[10];
      int nclaves=0;
      int valor1[23];

      int i,n,m,j,p;



      if((f=fopen(nombre,"r"))==NULL)
      {
         printf("\nEL FICHERO NO EXISTE.");
         getch();
         exit(0);
      }

      nclaves=0;

      fread(&datos, sizeof(datos),1,f);
      while(!feof(f))
      {
           
        valor1[nclaves]=atoi(datos.clave);
        fread(&datos, sizeof(datos),1,f);
        nclaves++;
      }


         

     for(i=0;i<nclaves;i++){
        for(j=0;j<nclaves-1;j++){
          if(valor1[i]<valor1[j]){
     m=valor1[i];
             valor1[i]=valor1[j];
     valor1[j]=m;
          }
        }
     }

    printf("Claves Ordenadas.....\n");   

    for (i=0;i<nclaves; i++)
    {
       printf("clave: %d  \n", valor1[i]);
    }
         getch();

   fclose(f);

}



Gracias por todas y cada una de sus respuestas ;)

cbug

Tengo unas dudas:

1- ¿Por qué pasas como parámetro datos, directamente no sería mejor declararlo localmente si para lo único que lo utilizas es para leer datos del archivo?
2-¿Por qué ordenas si todo es en ámbito local y al salir se pierde la ordenación?