Buscador (C)

Iniciado por dfr2198, 16 Mayo 2017, 12:25 PM

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

dfr2198

Estoy desarrollando un programa. La clave del programa es leer de un txt una serie de vectores.
EL primer problema es que esos vectores, dos de ellos deberían de ser vectores, y cada uno d elos elementos de ese vector deberían de ser cadenas de caracteres.Y no sé muy bien como implementar eso.

Es mi primer post. Espero no incumplir ninguna norma.
Me han sugerido que sea un vector de punteros, y cada puntero apunte a una cadena de caracteres. No sé muy bien si eso es viable.

En segundo lugar. Cada uno de los vectores mencionado correponde a una categoría de datos(de forma que los 7 vectores, el elemento [1] correponde a diferentes caracteristicas de un elemento).
El funcionamiento del porgrama sería "yo quiero buscar todos los elementos que tienen un rendimiento mayor que 85%". Ese 85% estaría colocoado en el vector "Rendimeintos" y te mostraría las demas carcateristicas (es decir, todos las posiciones [a] de los vectores, en los cuales el vector 7 (rendimeinto) tuviera la posicion [a] mayor de 85).

Para ello se me ocurre utilizar punteros, apuntado a cada uno de los vectores. Así, si selecciono "Potencia", se buscara en el vector potencia a traves de su puntero.
Me parece que los conceptos son buenos. De cualquier forma, cualquier recomendación o consejo sería muy de agradecer.
Muchas gracias a todos.

MAFUS

Pon un ejemplo de cómo sería el texto.
Usa el botón cita o código de las herramientas de formato que tienes arriba para poner el contenido

dfr2198

El archivo de texto a cargar es este. He separado cada elemento medinate una coma y un espacio (planeo usar alguna variante de función while para cargar los vectores) y terminan en un ";". Es una version resumida (cada array tiene unos 100 elementos).
Código (xml) [Seleccionar]

DAWN mission NSTAR, Resistojet, Radioisotope;  (Este sería el nombre)
ESTAT, ETHERM, NTR SOLID; (codigo)
1.37e-06, 7.25e-04, 5.85e-03; (energía)
3,1, 296; (eficiencia)
9.00e-05, 1, 2; (empuje)
26, N/A, N/A; (peso)


En cuanto al codigo, aun no lo he implementado, por lo que he explicado anteriormente. Solo he porgramado un menú switchcase para seleccionar el criterio de busqueda (nombre, eficiencia, etc).

MAFUS

Ah, ok, ok. Como cada línea tiene una representación de todos los elementos, ordenado según sus características, una forma sencilla sería:

[code = c]// Suponiendo que tu lista tendrá máximo 100 elementos.
#define ELEMENTOS 100

char nombre[ELEMENTOS][255];  // 255 es el tamaño máximo que se pueda dar al nombre + el caracter de fin de cadena, por tanto solo puedes tener como mucho 254 caracteres en el nombre.
char codigo[ELEMENTOS][255]; // Igual que nombres.
double energia[ELEMENTOS];
unsigned eficiencia[ELEMENTOS];
double empuje[ELEMENTOS];
int peso[ELEMENTOS]; // puedes usar un número negativo para representar N/A, por ejemplo.


Así tu elemento será interpretado en los arrays como su número índice, por ejemplo el primer elemento será
nombre[0]
codigo[0]
energia[0]
eficiencia[0]
...


El segundo elemento
nombre[1]
codigo[1]
energia[1]
...


Y para los arrays haces algo así:

Leer la línea del archivo
i = 0
Bucle mientras i < ELEMENTOS:
    token = dato de la linea
    nombre[i] = token
Fin de bucle

Leer la linea del archivo
i = 0
Bucle mientras i < ELEMENTOS
    token = dato de la linea
    codigo[i] = token
Fin de bucle
...

dfr2198

La verdad es que desconocía que podías jugar con los char de esa manera, muchas gracias.

dfr2198

Probablemente esté esto mal definido hasta la saciedad, pero no se me ocurre como salir de este berenjenal, esto está bastante más lejos de lo que yo controlo.

int objetivo;
char nombre[][255], char codigo[][255], float power[], float v[], float isp[], float empuje[], float peso[];

FILE *fent;//Apertura de archivo.
fent=fopen (field, "r");
if (fent==NULL)

{
printf("ERROR DE APERTURA DE %d\n",field);//Comprobación de errores en apertura.
}
if (fent != 0)
{
while (fgets (contadorf, 5000 , fent) != ";")//Aquí se realiza la cuenta para saber los elementos de char.
{
if (contadorf[contador]==",")
{contador2++;
}
contador++;
}
nombre=(int*)malloc(sizeof(char)contador2);//Especificamos que el puntero contiene las cadenas especificadas por contador2
codigo=(int*)malloc(sizeof(char)contador2);//Lo mimso
int *ppower
ppower=(int*)malloc(sizeof(int)contador2);//Especificamos que el array contiene contador2 enteros
int *pv
pv=(int*)malloc(sizeof(int)contador2);
int *pisp
pisp=(int*)malloc(sizeof(int)contador2);
int *pempuje
pempuje=(int*)malloc(sizeof(int)contador2);
int *ppeso
ppeso=(int*)malloc(sizeof(int)contador2);

MAFUS

Las instrucciones malloc no se ejecutan así, además en C mo hace falta realizar el cast.
Es más, el cast que haces está mal porque tu necesitas que sea puntero a char y lo haces a puntero a int.

dfr2198

Bueno, pues ya está. Un programa de 628 lineas de codigo, todas ellas dentro de la función principal hasta que me funcione bien y vea qué puedo separar... Y se atasca en la 39.
El programa se cuelga y windows me lo cierra. Y es entre la linea 39 y 51. Y ya no sé qué hacer.
Asíque acudo aquí a ver si a alguien se le ocure algo.
Sí. Probablemente sea el codigo más basura que hayáis visto, incluso a mi me parece feo a la vista. Pero...
(Y si alguen me dice a que se debe o como solucionar los warning de "comparision between pointer and integeer" (lineas de la 41 a la 385) ya me salava del todo)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  
#include <windows.h>
#include <math.h>
int main (int argc, char *argv[])
{
char field [5000];
int buscador=0;


printf("A continuacion, indique los criterios de busqueda\n");
printf("Introduzca 1 para buscar por el nombre del sistema\n");
printf("Introduzca 2 para buscar por el código del sistema de propulsion\n");
printf("Introduzca 3 para buscar según la energia del sistema (en MW)\n");
printf("Introduzca 4 para buscar en terminos de velocidad de escape de la masa de reaccion\n");
printf("Introduca 5 para buscar segun el Impulso especifico (en segundos)\n");
printf("Pulse 6 para buscar según el empuje (en Newtons)\n");
printf("Con el 7, buscará según la masa del motor(se mostraran los valores iguales o mas pequeños)\n");
printf("Pulse 0 para salir\n");
scanf("%d", &buscador);
printf("Seleccione el contenido a buscar. tenga en cuenta que para valores numericos distintos del peso,\n se mostraran cantidades iguales o SUPERIORES\n");

int contador=1;
int contador2=0;
char contadorf[500000];

int objetivo;
strcpy(field, argv[1]);
FILE *fent;//Apertura de archivo.
fent=fopen (field, "r");



if (fent==NULL)
{
printf("ERROR DE APERTURA DE %d\n",field);//Comprobación de errores en apertura.
}
printf("Se ha completado la carga del archivo\n");

fgets(contadorf, 5000, fent)
for(contadorf[contador] != ";"; contador=0; contador++)//Aquí se realiza la cuenta para saber los elementos de char.
{
if (contadorf[contador]==",")
{
contador2++;
}
}


printf("Se ha completado comprobación de longitud\n");

int i=0;
char **nombre = (char**) calloc(contador2, sizeof(char*));

for ( i = 0; i < contador2; i++ )
{
   nombre[i] = (char*) calloc(500, sizeof(char));
}
char **codigo = (char**) calloc(contador2, sizeof(char*));

for ( i = 0; i < contador2; i++ )
{
   codigo[i] = (char*) calloc(500, sizeof(char));
}

float * power = malloc(contador2 * sizeof(float));
float * v = malloc(contador2 * sizeof(float));
float * isp = malloc(contador2 * sizeof(float));
float * empuje = malloc(contador2 * sizeof(float));
float * peso = malloc(contador2 * sizeof(float));
int x=0, y=0, z=0, xx=0, yy=0, zz=0;
char auxiliar[40];
float suma=0;

printf("Asignacion de memoria completada\n");

for(fgets(contadorf, contador2, fent)!=EOF; contador=0; contador++)
{
for(contadorf[x]!=";"; x=0; x++)

{
while (contadorf[x]!=" ,")
{
y=0;
nombre[x][y]=contadorf[x+y];
y++;
}
}
for(contadorf[x]!=";"; x; x++)
{

while (contadorf[x]!=" ,")
{
y=0;
codigo[z][y]=contadorf[x+y];
y++;
}
z++;
}
for(contadorf[x]!=";"; x; x++)
{
{

while (contadorf[xx]!=" ,")
{
y=0;
auxiliar[y]=contadorf[x+y];
y++;
}
xx = strlen(auxiliar);
while (xx>=0)
{
if (auxiliar[xx]=="1")
{
auxiliar[xx]=1;
}
if (auxiliar[xx]=="2")
{
auxiliar[xx]=2;
}
if (auxiliar[xx]=="3")
{
auxiliar[xx]=3;
}
if (auxiliar[xx]=="4")
{
auxiliar[xx]=4;
}
if (auxiliar[xx]=="5")
{
auxiliar[xx]=5;
}
if (auxiliar[xx]=="6")
{
auxiliar[xx]=6;
}
if (auxiliar[xx]=="7")
{
auxiliar[xx]=7;

}
if (auxiliar[xx]=="8")
{
auxiliar[xx]=8;
}
if (auxiliar[xx]=="9")
{
auxiliar[xx]=9;
}
suma=suma+auxiliar[xx]*pow(10, strlen(auxiliar)-xx);
xx--;
}
suma=power[zz];
zz++;
}
suma=0;
zz=0;
for(contadorf[x]!=";"; x; x++)
{
{

while (contadorf[xx]!=" ,")
{
y=0;
auxiliar[y]=contadorf[x+y];
y++;
}
xx = strlen(auxiliar);
while (xx>=0)
{
if (auxiliar[xx]=="1")
{
auxiliar[xx]=1;
}
if (auxiliar[xx]=="2")
{
auxiliar[xx]=2;
}
if (auxiliar[xx]=="3")
{
auxiliar[xx]=3;
}
if (auxiliar[xx]=="4")
{
auxiliar[xx]=4;
}
if (auxiliar[xx]=="5")
{
auxiliar[xx]=5;
}
if (auxiliar[xx]=="6")
{
auxiliar[xx]=6;
}
if (auxiliar[xx]=="7")
{
auxiliar[xx]=7;

}
if (auxiliar[xx]=="8")
{
auxiliar[xx]=8;
}
if (auxiliar[xx]=="9")
{
auxiliar[xx]=9;
}
suma=suma+auxiliar[xx]*pow(10, strlen(auxiliar)-xx);
xx--;
}
suma=v[zz];
zz++;
}

}
suma=0;
zz=0;
for(contadorf[x]!=";"; x; x++)
{
{

while (contadorf[xx]!=" ,")
{
y=0;
auxiliar[y]=contadorf[x+y];
y++;
}
xx = strlen(auxiliar);
while (xx>=0)
{
if (auxiliar[xx]=="1")
{
auxiliar[xx]=1;
}
if (auxiliar[xx]=="2")
{
auxiliar[xx]=2;
}
if (auxiliar[xx]=="3")
{
auxiliar[xx]=3;
}
if (auxiliar[xx]=="4")
{
auxiliar[xx]=4;
}
if (auxiliar[xx]=="5")
{
auxiliar[xx]=5;
}
if (auxiliar[xx]=="6")
{
auxiliar[xx]=6;
}
if (auxiliar[xx]=="7")
{
auxiliar[xx]=7;

}
if (auxiliar[xx]=="8")
{
auxiliar[xx]=8;
}
if (auxiliar[xx]=="9")
{
auxiliar[xx]=9;
}
suma=suma+auxiliar[xx]*pow(10, strlen(auxiliar)-xx);
xx--;
}
suma=isp[zz];
zz++;
}

}
suma=0;
zz=0;
for(contadorf[x]!=";"; x; x++)
{
{

while (contadorf[xx]!=" ,")
{
y=0;
auxiliar[y]=contadorf[x+y];
y++;
}
xx = strlen(auxiliar);
while (xx>=0)
{
if (auxiliar[xx]=="1")
{
auxiliar[xx]=1;
}
if (auxiliar[xx]=="2")
{
auxiliar[xx]=2;
}
if (auxiliar[xx]=="3")
{
auxiliar[xx]=3;
}
if (auxiliar[xx]=="4")
{
auxiliar[xx]=4;
}
if (auxiliar[xx]=="5")
{
auxiliar[xx]=5;
}
if (auxiliar[xx]=="6")
{
auxiliar[xx]=6;
}
if (auxiliar[xx]=="7")
{
auxiliar[xx]=7;

}
if (auxiliar[xx]=="8")
{
auxiliar[xx]=8;
}
if (auxiliar[xx]=="9")
{
auxiliar[xx]=9;
}
suma=suma+auxiliar[xx]*pow(10, strlen(auxiliar)-xx);
xx--;
}
suma=empuje[zz];
zz++;
}

}
suma=0;
zz=0;
for(contadorf[x]!=";"; x; x++)
{
{

while (contadorf[xx]!=" ,")
{
y=0;
auxiliar[y]=contadorf[x+y];
y++;
}
xx = strlen(auxiliar);
while (xx>=0)
{
if (auxiliar[xx]=="1")
{
auxiliar[xx]=1;
}
if (auxiliar[xx]=="2")
{
auxiliar[xx]=2;
}
if (auxiliar[xx]=="3")
{
auxiliar[xx]=3;
}
if (auxiliar[xx]=="4")
{
auxiliar[xx]=4;
}
if (auxiliar[xx]=="5")
{
auxiliar[xx]=5;
}
if (auxiliar[xx]=="6")
{
auxiliar[xx]=6;
}
if (auxiliar[xx]=="7")
{
auxiliar[xx]=7;

}
if (auxiliar[xx]=="8")
{
auxiliar[xx]=8;
}
if (auxiliar[xx]=="9")
{
auxiliar[xx]=9;
}
suma=suma+auxiliar[xx]*pow(10, strlen(auxiliar)-xx);
xx--;
}
suma=peso[zz];
zz++;
}
}
}
printf("%c",*nombre);
printf("%c",*codigo);
}
fclose (fent);

printf("Carga de datos a programa completada");

int * resultados = malloc(contador2 * sizeof(int));
i=0;
int j=0;
char objetivof[50];
switch(buscador)
{

case 1:

printf("Ha pulsado el 1\n");
printf("Introduzca el contenido a buscar.");
scanf("%c", &objetivof);
printf("Los siguientes resultados concuerdan con los criterios de busqueda:\n");
while(i<contador2)
{
if (strstr(nombre[i], objetivof) != NULL);
{
resultados[j]=i;
j++;
}
i++;
}
break;

case 2:

printf("Ha pulsado el 2\n");
printf("Introduzca el contenido a buscar.");
scanf("%c", &objetivof);
printf("Los siguientes resultados concuerdan con los criterios de busqueda:\n");
while(i<contador2)
{
if (strstr(codigo[i], objetivof) != NULL);
{
resultados[j]=i;
j++;
}
i++;
}
break;


case 3:
printf("Ha pulsado el 3\n");
printf("Introduzca el contenido a buscar.");

scanf("%d", &objetivo);
printf("Los siguientes resultados concuerdan con los criterios de busqueda:\n");
while(i<contador2)
{
if((power[i])>=objetivo)
{
resultados[j]=i;
j++;
}
i++;
}
break;


case 4:
printf("Ha pulsado el 4\n");
printf("Introduzca el contenido a buscar.");

scanf("%d", &objetivo);
printf("Los siguientes resultados concuerdan con los criterios de busqueda:\n");
while(i<contador2)
{
if((v[i])>=objetivo)
{
resultados[j]=i;
j++;
}
i++;
}


break;


case 5:
printf("Ha pulsado el 5\n");
printf("Introduzca el contenido a buscar.");

scanf("%d", &objetivo);
printf("Los siguientes resultados concuerdan con los criterios de busqueda:\n");
while(i<contador2)
{
if((isp[i])>=objetivo)
{
resultados[j]=i;
j++;
}
i++;
}

break;


case 6:
printf("Ha pulsado el 6\n");
printf("Introduzca el contenido a buscar.");

scanf("%d", &objetivo);
printf("Los siguientes resultados concuerdan con los criterios de busqueda:\n");
while(i<contador2)
{
if((empuje[i])>=objetivo)
{
resultados[j]=i;
j++;
}
i++;
}

break;


case 7:
printf ("Ha pulsado el 7\n");
printf("Introduzca el contenido a buscar.");

scanf("%d", &objetivo);
printf("Los siguientes resultados concuerdan con los criterios de busqueda:\n");
while(i<contador2)
{
if((peso[i])<=objetivo)
{
resultados[j]=i;
j++;
}
i++;
}

break;

case 0:
exit(0);


default:
{
printf("Ha introducido un caracter no incluido en el menu\n");
}
break;
}

printf("Busqueda y comparacion completada\n");

if(j != 0)
{
printf("Se han encontrado los siguientes resultados que concuerdan con el criterio:\n");
for(i=0; i!=j; i++)
{
printf("%c\n", *nombre[resultados[i]]);
printf("[%d]\n",i);
}
}
if (j != 0)
{
int sino=0;
int comp=1;
printf("¿Desea ver los datos de alguno de los sistemas presentados? [1 si, 0 no]\n");
scanf("%c", &sino);
if(sino==1)
{
printf("A cada resultado anterior se le ha asignado un numero identificativo que figura bajo cada resultado. Por favor, insertelo a continuacion.\n");
printf("Para salir, presione el [0].\n");
while(comp!=0)
{ scanf("%d", &comp);
printf("Nombre: %c", *nombre[comp]);
printf("Tipo: %c", *codigo[comp]);
printf("Energia: %f", power[comp]);
printf("velocidad de escape: %f", v[comp]);
printf("ISP: %f", isp[comp]);
printf("Empuje: %f", empuje[comp]);
printf("Peso: %f", peso[comp]);
printf("Introduzca más datos, o pulse 0 para salir.\n");
}
}
}
if(j != 0)
{
int sino=0;
int comp=0;
printf("¿Desea iniciar la funcion calculadora? [1 si, 0 no]");
scanf("%c", &sino);
if(sino==1)
{
int mf=0;
int mi=0;
int comb=0;
float resultado=0;
printf("A cada resultado anterior se le ha asignado un numero identificativo que figura bajo cada resultado. Por favor, insertelo a continuacion.\n");
scanf("%d",&comp);
printf("¿Cuanto pesa el vehiculo?(en kg)\n");
scanf("%d",&mi);
printf("¿Cuantos kilos de combustible lleva?\n");
scanf("%d", &comb);
mf=comb+mi;
resultado=v[comp]*log(mi/mf);
printf("Delta-V estimada: %f m/s\n");
}
}
for ( i = 0; i < contador2; i++ )
{
   free(nombre[i]);
}

free(nombre);
for ( i = 0; i < contador2; i++ )
{
   free(codigo[i]);
}

free(codigo);
free(v);
free(isp);
free(power);
free(peso);
free(empuje);


}


Muchas gracias a cualquiera que se tome su tiempo en ayudar a gente como yo.

MAFUS

Sobre esa parte que comentas. Si encuentras un error en la apertura del archivo debes detener el programa para que no siga actuando sobre ese archivo, sin embargo solo marcas el error pero dejas al programa que continúe.

engel lex

lo que veo por encimita es el error de manejo de caractreres


contadorf[contador]==","


";" no es el char de el simbolo ; , es un string que contiene eso y otras cosas

tiene que ser ';' con comillas simples
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.