#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <time.h>
#include <string>
using namespace std;
//Se generan variables globales para evitar el paso de parametros o argumentos entre las funciones
int i=0, j=0, k=0, l=0;
int n=0;
int cn=0; //Numero de datos leidos y a ordenar
int guardacn;
int temp;
int arreglo[1000000]; //maximo se podran ordenar 1000000 de numeros
clock_t t_ini, t_fin;
double secs;
string nombrearchivo; //nombre del archivo de entrada
int continuar = 0;
int numBuscar = 0;
int bandera = 0;
struct Entrada { //declaracion de estructura que permiten leer y copiar los numeros en el arreglo "arreglo"
int valor;
} entrada;
//***** Prototipo o definición del metodo de ordenamiento
int busSecElimDup();
int busqueda();
void leeArchivo();
//**** Funcion de lectura del archivo
//lee los numeros contenidos en el archivo y los copia en el arreglo "arreglo"
//Se dejan los numeros en un arreglo llamado "arreglo" para que la función (algoritmo o metodo) de Burbuja los pueda ordenar
void leeArchivo(){
FILE *archivo1; //Crea un apuntador de archivo, utilizando en la función fopen, el apuntador se le asigná el llamado al archivo
cout<<"\n Teclea el nombre del archivo de entrada (sin espacio, ni caracteres especiales): ";
cin>>nombrearchivo;
nombrearchivo+= ".txt"; // Se le agrega al nombre del archivo la extension ".txt"
archivo1 = fopen(nombrearchivo.c_str(), "r"); // Se abre el archivo de modo lectura
if(archivo1== NULL ){ // el archivo contiene los numeros a ordenar
cout<<"\n No se puede abrir el archivo "; //si no se puede abrir el archivo termina con error el programa
exit(1);
}
else{
cout<<"\n Se abrio el archivo "<<nombrearchivo.c_str()<<" correctamente";
}
//Lee el archivo y copia los numeros contenidos en el archivo en el arreglo "arreglo"
cn=0;
for (int i=0; !feof(archivo1); i++) { // Repite hasta que sea el fin del archivo
fscanf (archivo1, "%i", &entrada.valor); // Lee el numero contenido en el archivo y lo guarda en la estructura
arreglo[i]=entrada.valor; // El numero contenido en la estructura lo pasa al arreglo "arreglo"
cn++; // suma 1 al contador de numeros leidos
}
cn--;
cout<<"\n\nSe ha generado el arreglo con los datos del archivo de entrada";
cout<<"\nLa cantidad de numeros contenidos en el arreglo son: "<<cn<<"\n\n";
n=cn;
fclose(archivo1); //cierra el archivo de entrada
system ("pause");
}
//Llama en general a una funcion de busqueda
int busqueda() {
busSecElimDup(); //Se utiliza cuando los datos estan desordenados
return (0);
}
//Metodo de Busqueda Secuencial
int busSecElimDup(){
int contador = 0;
cout<<"\nDato originales\n";
for (i=0; i<n; i++){
cout<<arreglo[i]<<" ";
}
// Busca duplicados dentro del arreglo
for (i=0; i<n; i++) {
if (arreglo [i] == arreglo[i+1]){
// corrimiento a la izquierda
for (j=i; j < n; j++) { // eliminar con corrimiento a la izquierda
arreglo [j-1] = arreglo[j];
}
contador ++;
}
}
cout<<endl;
cout<<"\nDato eliminados\n";
for (i=0; i<n; i++){
cout<<arreglo[i]<<" ";
}
cout<<endl;
return (0);
}
//*** Funcio main ()
int main() {
continuar = 1;
leeArchivo();
n = cn; // lee y copia en una arreglo los numeros contenidos en el archivo de entrada
/* do {
system ("cls");
for (l=0; l<n; l++){
cout<<arreglo[l]<<" ";
}
cout<<endl<<endl;
cout<<"\n\nTeclee el numero a buscar o consultar: ";
cin>>numBuscar;
*/
t_ini = clock(); // guarda tiempo inicial (antes de ordenar)
busqueda ( ); //Llama al metodo de ordenamiento
t_fin = clock(); // guarda tiempo final (despues de ordenar)
// Imprime el tiempo que se tardo el metodo en ordenar los datos
secs = (double)(t_fin - t_ini) / (double)CLOCKS_PER_SEC; // determina los milisegundo utilizados
printf("%.16g milisegundos", secs * 1000.0); // imprime el tiempo utilizado
cout<<"\n\n"; // se utiliza printf porque es una sentencia mas poderosa que cout
// permite ver cantidades muy pequeñas o muy grandes
/*
cout<<"\nDesea consultar otro numero (SI = 1, NO = 0)";
cin>>continuar;
cout<<"\n\n";
} while (continuar == 1);
*/
cout<<"\n\nMetodo de Busqueda Secuencial con eliminacion concluido \n\n";
system ("pause");
}
Editado: Código formateado con geshi.
La siguiente función debe usarse sobre un array ya ordenado.
array contiene el array ordenado
tam contiene el número de elementos de dicho array
Cuando la función ha terminado
array contiene los elementos sin duplicar en su parte más baja
tam marca el índice más alto a partir del cual los datos son inválidos. Indica el nuevo tamaño del array.
El código es en C:
void array_eliminar_duplicados(int array[], size_t *tam) {
size_t k = *tam;
for(int i=0, j=1; j<k; ++i, ++j) {
if(array[i] >= array[j]) {
--*tam;
while(array[i] >= array[j] && j<k) {
++j;
}
}
array[i+1] = array[j];
}
}