elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Lenguaje C : Ayuda con vectores porfavor
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lenguaje C : Ayuda con vectores porfavor  (Leído 2,926 veces)
gonuto

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Lenguaje C : Ayuda con vectores porfavor
« en: 19 Mayo 2017, 22:46 pm »

Hola buenas,
estoy muy perdido en cuanto a vectores en c y necesito hacer un programa en C básico que a través del programa haga lo del siguiente ejemplo:

Imaginemos que tenemos un fichero llamado ejemplo.txt con lo siguiente:
Citar
pera,manzana,kiwi,1
manzana,pera,kiwi,2
kiwi,pera,manzana,3
manzana,kiwi,pera,4
pera,kiwi,manzana,5
kiwi,manzana,pera,6
Y a través de una función[QUE YA TENGO ELABORADA] introduzco una nueva linea con el orden de palabras que quiera y un número al final fijo, el 0. El fichero quedaría a continuación así:
Citar
manzana,kiwi,pera,0
pera,manzana,kiwi,1
manzana,pera,kiwi,2
kiwi,pera,manzana,3
manzana,kiwi,pera,4
pera,kiwi,manzana,5
kiwi,manzana,pera,6
Pues bien, ahora viene el lío, lo que quiero es una función que analice el orden de las palabras y sustituya el 0 por el número que tiene al final de la línea la misma combinación de palabras más abajo. En el ejemplo, la función debería sustituir el 0 por 4 y quedaría así:
Citar
manzana,kiwi,pera,4
pera,manzana,kiwi,1
manzana,pera,kiwi,2
kiwi,pera,manzana,3
manzana,kiwi,pera,4
pera,kiwi,manzana,5
kiwi,manzana,pera,6

Sé que tengo que introducir los datos del fichero en un vector de registros pero no consigo que me funcione nada  :( :(
Si alguien me pudiera ayudar le estaría muy agradecido, si necesitais algún tipo de información, tan solo pedidla. Muchas gracias!


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Lenguaje C : Ayuda con vectores porfavor
« Respuesta #1 en: 19 Mayo 2017, 23:58 pm »

El fuente con el error, para tener una base con la que partir.


En línea

gonuto

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Lenguaje C : Ayuda con vectores porfavor
« Respuesta #2 en: 20 Mayo 2017, 11:03 am »

Muchas gracias por responder  ;D
 
En cuanto al programa entero voy así de avanzado:
Código
  1. // CABECERAS
  2.  
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #define MAX 9
  7.  
  8. //DECLARACIONES DE ESTRUCTURAS
  9. struct frutas{
  10. char columna1[MAX]
  11. char columna2[MAX]
  12. char columna3[MAX]
  13. int numero;
  14. };
  15.  
  16. //DECLARACIONES DE FUNCIONES
  17.  
  18. int SolicitarOpcion();
  19. void OpcionesMenu(int);
  20. void NuevaFila(FILE *);
  21. int modificaCampoNum();
  22. int clean_stdin();
  23.  
  24. /** Función encargada de limpiar el buffer cuando se introducen datos de tipo erroneo.*/
  25.  
  26. int clean_stdin(){
  27.  while(getchar() != '\n') ;
  28. return 1;
  29. }
  30.  
  31. //PROGRAMA PPAL
  32.  
  33. int main(){
  34.  int opcion;
  35.  do{
  36.  printf("1. Dar de alta una nueva línea\n2. Modificar campo numérico\n3. Salir del programa (opción 0)\n");
  37.  printf("Introduzca opción menú <0-2>:");
  38.  opcion=SolicitarOpcion();
  39.  OpcionesMenu(opcion);
  40. }
  41. while (opcion != 0);
  42. printf("HASTA LUEGO LUCAS\n");
  43.  return 0;
  44. }
  45.  
  46. //DEFINICIONES DE FUNCIONES
  47.  
  48. int SolicitarOpcion(){
  49.  int x;
  50.  scanf("%u",&x);
  51.  return x;
  52. }
  53.  
  54. void OpcionesMenu(int x){
  55.  FILE *frutas;
  56.  switch(x){
  57.    case 1: NuevaFila(frutas);break;
  58.    case 2: modificaCampoNum();break;
  59.    case 0: ;break;
  60.  
  61.    default: printf("Opción no válida");break;
  62.  }
  63. }
  64.  
  65. void NuevaFila(FILE *frutas){
  66. char campo[MAX];
  67. _Bool c=1;
  68. if ((frutas = fopen("frutas.txt", "a")) == NULL){
  69.      perror("frutas.txt");
  70.   }
  71. while(c!=0){
  72. printf("\nSe encuentra en la columna 1, introduce uno de los datos: pera, manzana o kiwi.\n");
  73. scanf("%s",campo);
  74. if(strcmp(campo,"pera")==0 || strcmp(campo,"manzana")==0 || strcmp(campo,"kiwi")==0){
  75. c=0;
  76. fprintf(frutas,"\n");
  77. fprintf(frutas,"%s,",campo);
  78. }else{
  79. printf("\n¡ERROR! al introducir el texto, prueba de nuevo.\n");
  80. };
  81. };
  82. c=1;
  83. while(c!=0){
  84. printf("\nSe encuentra en la columna 2, introduce uno de los datos: pera, manzana o kiwi.\n");
  85. scanf("%s",campo);
  86. if(strcmp(campo,"pera")==0 || strcmp(campo,"manzana")==0 || strcmp(campo,"kiwi")==0){
  87. c=0;
  88. fprintf(frutas,"%s,",campo);
  89. }else{
  90. printf("\n¡ERROR! al introducir el texto, prueba de nuevo.\n");
  91. };
  92. };
  93. c=1;
  94. while(c!=0){
  95. printf("\nSe encuentra en la columna 3, introduce uno de los datos: pera, manzana o kiwi.\n");
  96. scanf("%s",campo);
  97. if(strcmp(campo,"pera")==0 || strcmp(campo,"manzana")==0 || strcmp(campo,"kiwi")==0){
  98. c=0;
  99. fprintf(frutas,"%s,0\n",campo);
  100. }else{
  101. printf("\n¡ERROR! al introducir el texto, prueba de nuevo.\n");
  102. };
  103. };
  104. fclose(frutas);
  105. return;
  106. }
  107. int modificaCampoNum(){
  108.  
  109. }
  110.  
Como podeis ver la función que no aparece nada (modificaCampoNum)es en la que estoy atrancado. He hablado con un viejo conocido y me ha pasado una serie de indicaciones para realizarlo, pero estoy igual de perdido.
Me ha dicho que dentro de esta función lo primero que debo hacer es ver que filas tienen el 0 en el campo numérico(Solo lo tendrán las que metamos por el programa) y luego comparar el resto de campos de la linea con 0 con las demás lineas( con el comando strcmp). Y ya de ahí sacar el valor por el que sustituir a 0 (Como pongo en el ejemplo del tema)/b]
El fichero que gestiona (frutas.txt) es el siguiente:
Código:
manzana,manzana,manzana,1
manzana,manzana,kiwi,2
manzana,manzana,pera,3
manzana,kiwi,manzana,4
manzana,kiwi,kiwi,1
manzana,kiwi,pera,2
manzana,pera,manzana,3
manzana,pera,kiwi,4
manzana,pera,pera,1
kiwi,manzana,manzana,2
kiwi,manzana,kiwi,3
kiwi,manzana,pera,4
kiwi,kiwi,manzana,1
kiwi,kiwi,kiwi,2
kiwi,kiwi,pera,3
kiwi,pera,manzana,4
kiwi,pera,kiwi,1
kiwi,pera,pera,2
pera,manzana,manzana,3
pera,manzana,kiwi,4
pera,manzana,pera,1
pera,kiwi,manzana,2
pera,kiwi,kiwi,3
pera,kiwi,pera,4
pera,pera,manzana,1
pera,pera,kiwi,2
pera,pera,pera,3


Muchas gracias de nuevo!
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Lenguaje C : Ayuda con vectores porfavor
« Respuesta #3 en: 20 Mayo 2017, 12:03 pm »

He estado mirando esto y hay algunos errores de base.

El 0 es el número a modificar si alguna entrada posterior existe con otro número.
Tu función NuevaFila por defecto la crea con el 0, por tanto si no hay entradas iguales se queda con 0.

Esto llevará a:
Si aparece una entrada que ya exista y esta lleva 0 tendrá 0.
En un archivo nuevo desde este programa todas las líneas tendrán 0.

Por cierto, append, la "a" de fopen, hace que el archivo crezca por el final, no por el principio.
Deberías replantear de nuevo el programa.
En línea

gonuto

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Lenguaje C : Ayuda con vectores porfavor
« Respuesta #4 en: 20 Mayo 2017, 13:21 pm »

He estado mirando esto y hay algunos errores de base.

El 0 es el número a modificar si alguna entrada posterior existe con otro número.
Tu función NuevaFila por defecto la crea con el 0, por tanto si no hay entradas iguales se queda con 0.

Esto llevará a:
Si aparece una entrada que ya exista y esta lleva 0 tendrá 0.
En un archivo nuevo desde este programa todas las líneas tendrán 0.

Por cierto, append, la "a" de fopen, hace que el archivo crezca por el final, no por el principio.
Deberías replantear de nuevo el programa.
En efecto, lo que pretendo es que todas las lineas que se creen desde el programa tengan  por defecto el 0.  
De esta manera cuando acceda desde el menú a la función modificaCampoNum esta deberá de modificar el valor numerico de las nuevas lineas (El 0) en el vector de registros. A continuación se debería asignar el mismo valor que tenga otra fila en el fichero con exactamente los mismos valores en las tres primeras columnas.
En cuanto al append, no encuentro ninguna otra manera de poder cargar el archivo sin que el proceso de escritura pise los datos anteriores del fichero...
Muchas gracias por tu respuesta :D
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Lenguaje C : Ayuda con vectores porfavor
« Respuesta #5 en: 20 Mayo 2017, 17:58 pm »

Si es así:
1. Consigue las tres palabras a buscar
2. Consigue el número para modificar
3. Abre el archivo para lectura/escritura
4. Lee una frase del archivo a una cadena
5. Mientras no hayas llegado al final del archivo
5.1. Consigue la primera palabra de la cadena
5.2. Consigue la segunda palabra de la cadena
5.3. Consigue la tercera palabra de la cadena
5.4. Compara las palabras conseguidas con las que has conseguido del usuario
5.4.1. Si todas se corresponden regresa al archivo tantos bytes como de largo es la frase que leíste
5.4.2. Escribe una nueva frase como lo haces en NuevaFila() pero en vez del 0 incluyes el número que te ha dado el usuario
5.5. Lees una nueva frase del archivo
6. Cierra el archivo
En línea

gonuto

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Lenguaje C : Ayuda con vectores porfavor
« Respuesta #6 en: 20 Mayo 2017, 20:17 pm »

Muchas gracias de nuevo, atendiendo a tus indicaciones, he consigo avanzar hasta este punto:
Código
  1. int numeroFilas(FILE *frutas){
  2.   int ch, num_filas;
  3.   frutas=fopen("frutas.txt","r") ;  
  4.   num_filas = 0;
  5.   while ((ch = fgetc(frutas)) != EOF)
  6.      if (ch == '\n')
  7.         num_filas++;
  8.  
  9.   fclose(frutas);
  10.   return num_filas;
  11. }
  12.  
  13. int modificaCampoNum(FILE* frutas){
  14. int num_filas;
  15. num_filas=numeroFilas(frutas);
  16. struct tiposfrutas{
  17. char columna1[MAX];
  18. char columna2[MAX];
  19. char columna3[MAX];
  20. };
  21.   struct tiposfrutas reg[num_filas];
  22.   int numero;
  23.    int i,num_cero,filas_cargadas,n;
  24. frutas=fopen("frutas.txt","r");
  25. num_cero=0;
  26. for(i=0;i<num_filas;i++){
  27.      fscanf(frutas,"%[^,],%[^,],%[^,],%d", reg[i].columna1, reg[i].columna2,reg[i].columna3,&numero);
  28. filas_cargadas++;
  29.      if(numero == 0){
  30. num_cero++;
  31. n=i;
  32.  
  33. }
  34. }
  35. printf("Hay %d lineas con 0\n", num_cero);
  36.  
  37. num_cero=0;
  38. fclose(frutas);
  39.  
  40.   return 0;
  41. }
  42.  
Como puedes ver consigo saber cuantas lineas tienen cero.Ahora me faltaría comparar cada una de estas lineas que tienen cero con las demás hasta encontrar con la que coincide, supongo que seria algo asi
Código:
if(strcmp(reg[n].columna1,reg[i].columna1)==0 && strcmp(reg[n].columna2,reg[i].columna2)==0 && strcmp(reg[n].columna3,reg[i].columna2)==0)
Donde n es el valor de i cuando numero es igual a cero.
La cuestión es donde ponerlo. Si alguien me pudiera ayudar porfavor!!!!! :rolleyes: :rolleyes: :rolleyes:
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda en vectores...!!!
Programación C/C++
Schiffer04 2 2,256 Último mensaje 13 Mayo 2012, 01:57 am
por utz
Ayuda con vectores. « 1 2 »
Programación C/C++
elkiedis 10 6,075 Último mensaje 10 Octubre 2012, 07:19 am
por rir3760
ayuda con vectores c++
Programación C/C++
indict 3 2,370 Último mensaje 15 Noviembre 2012, 09:23 am
por norris
C++ Mas iteradores, con vectores de vectores ¡ juerga !
Programación C/C++
Orubatosu 1 2,613 Último mensaje 4 Diciembre 2014, 17:18 pm
por Eternal Idol
Me ayudarían a convertir este algoritmo del lenguaje C a lenguaje C++ porfavor
Programación C/C++
Andricziel 1 3,230 Último mensaje 17 Mayo 2021, 03:38 am
por BloodSharp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines