Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: franvitali en 16 Enero 2019, 19:51 pm



Título: No consigo hacer un listado en Code blocks
Publicado por: franvitali en 16 Enero 2019, 19:51 pm
Hola estoy intentando realizar un listado de ingredientes y precios en Code blocks en lo que yo creo que es un arreglo. Si no es asi disculpen mi ignorancia. Les dejo lo que hice hasta ahora que no es mucho.
Lo estoy extrayendo de un txt en el que se carga el nombre del ingrediente y el precio de la siguiente forma "ingredinete""espacio""precio".
Soy muy novato en esto si alguien me ayuda se lo agradezco.

#include<stdio.h>






//Algoritmo principal
// Variables
FILE *Ingredientes;
char NombreI[12];
int precio, precioindividual [400],i;
Ingrediente [400][12];
main(){
    //Carga de productos
NombreI=a;
for (i=0;i<400;i++){
                Ingrediente [12]=NombreI;
                precioindividual =0;
       }
Ingredientes=fopen("Ingredientes.txt","r");
fscanf(Ingredientes,"%s %d ",&NombreI,&precio);
i=0;
    while(!feof(Ingredientes)){
        Ingrediente i [12]=NombreI;
        precioindividual i =precio;

        fscanf(Ingredientes,"%s %d ",&NombreI,&precio);
        i=i+1;
        }//Fin mientras
fclose(Ingredientes);
i=0;
    while(i<400){
        printf( "%d" "%s" " \n ", precioindividual i,Ingrediente i [12]);
        i=i+1;

    }

}


Cualquier duda acerca del mamarracho de arriba comenteme y les explico lo que quice hacer con gusto. Saludos


Título: Re: No consigo hacer un listado en Code blocks
Publicado por: K-YreX en 16 Enero 2019, 20:18 pm
Lo primero te recomiendo que pongas tu código entre etiquetas de código GeSHi, las puedes seleccionar encima del cuadro de texto que sale cuando escribes/modificas un mensaje. Sin ellas el código se hace ilegible.

Ahora respecto a lo que se puede sacar de ese código:
Las variables es preferible que las declares dentro del <main> para hacerlas locales, ya que tal y como lo has declarado tú son variables globales y no es muy seguro ni recomendable usarlas, excepto para algunos casos particulares.

Ahora me gustaría que me explicaras un poco que has querido crear con cada variable, es decir; qué uso le quieres dar a cada variable. Y ahora te doy una idea de cómo guardar los datos.

Tenemos unos ingredientes que son cadenas de caracteres <char*> con un precio <int> o <double> (mejor <double>). Entonces rápidamente se me ocurren dos formas de hacerlo, una usando un <struct> y otra sin hacer uso de <struct>:
Forma 1:
Creamos un <struct> llamado <Ingrediente> que tenga nombre y precio. Algo así:
Código
  1. const int TAM_NOMBRE = 20; // maximo numero de letras para el nombre de cada ingrediente
  2. const int MAX_INGREDIENTES = 10; // numero de ingredientes que podemos almacenar
  3.  
  4. struct Ingrediente{
  5.    char nombre[TAM_NOMBRE];
  6.    double precio;
  7. };
  8.  
  9. int main(){
  10.    Ingrediente mis_ingredientes[MAX_INGREDIENTES];
  11.    // el resto del codigo
  12. }
Con esta opción creamos un nuevo tipo de dato llamado <Ingrediente> (como si fuera un <int>) que dentro de cada variable de tipo ingrediente tenemos guardado su nombre y su precio. Para acceder al ingrediente 2 (contando el 0), accederíamos mediante:
Código
  1. char nombre2[] = mis_ingredientes[2].nombre;
  2. double precio2 = mis_ingredientes[2].precio;
Te recomiendo esta opción ya que deja la información más estructurada y es sencillo de ver.

Forma 2:
Creamos dos arrays (arreglos), uno para el nombre del ingrediente y otro para el precio:
Código
  1. const int TAM_NOMBRE = 20; // maximo numero de letras para el nombre de cada ingrediente
  2. const int MAX_INGREDIENTES = 10; // numero de ingredientes que podemos almacenar
  3. int main(){
  4.    char nombre[MAX_INGREDIENTES][TAM_NOMBRE];
  5.    double precio[MAX_INGREDIENTES];
  6.    // el resto del codigo
  7. }
Con esta segunda opción evitamos usar <struct>. Esta opción sólo te la recomendaría si tienes que evitar la opción anterior. Ya que aquí la información queda más "suelta". Para acceder al ingrediente 2 (empezando en 0), haríamos:
Código
  1. char nombre2 = nombre[2];
  2. double precio2 = precio[2];
Parece más sencillo de acceder a cada elemento pero lo tienes guardado en sitios distintos entonces está peor estructurado.

Espero que  esto te sirva para pensar y estructurar bien el programa ya que creo que tienes un lío con las variables. De todas formas espero tu respuesta para ver cómo lo tenías pensado tú, porque puede que no lo hayas implementado bien pero que estuviese bien pensado. Suerte :-X


Título: Re: No consigo hacer un listado en Code blocks
Publicado por: franvitali en 17 Enero 2019, 02:23 am
Muchas gracias por la respuesta. No entiendo mucho pero es cuestion de mirar y pensar bien lo que me estas diciendo. Mi idea es que mediante una nota de texto que esta ubicada en la misma direccion que el archivo.c, la lea yde ahi saque el nombre y el precio del ingrediente. Luego debo manipular esa info (suma, resta y demas) para asi sacar el precio de un producto terminado. El objetivo principal de  hacer un listado en la nota de texto y luego cargarlo es: Primero por lo que entiendo la memoria de un programita creado con code blocks de esta forma es volátil y la otra es que cuando modifique el precio en la lista me modifique el del producto terminado que posea dicho ingrediente tambien. No se si me llego a explicar del todo bien. De nuevo gracias por la ayuda.


Título: Re: No consigo hacer un listado en Code blocks
Publicado por: K-YreX en 17 Enero 2019, 17:31 pm
A lo que me refería era a qué me comentaras cómo habías planteado tú el ejercicio para usar las variables que habías creado. Es decir algo así como:
  • creo un <char nombre[12]> para guardar el nombre del ingrediente.
  • creo un <int precio_individual[400]> para...
Es decir, que me explicaras cómo quieres usar tus variables ya que algunas de tus variables son un poco raras. Entonces quiero ver cómo lo tenías pensado para decirte qué variables debes usar para lo que quieres hacer.

PD: El código de tu primer mensaje edítalo y pon el programa entre etiquetas de código GeSHi. Tiene que quedar algo así:
Código
  1. // tus funciones
  2. int main(){
  3.    // tu codigo
  4. }