Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - MAFUS

#1041
En cuanto tenga una máquina delante para teclear código te voy a hacer unos ejemplos. No voy a corregirte todo el código ya que supongo esti es un trabajo escolar tuyo.
#1042
Viéndolo así, por encima:
Usas gets para capturar las cadenas de las variables de tus libros. Esta función captura el caracter  de nueva línea y te puede dar resultados indeseados cuando la imprimas. Aparte de otros problemas intrínsecos de la función.

Veo que al final de las funciones llamas explícitamente a main. Muy mala práctica porque fada vez vas llenando más y más la pila de la memoria. Las funciones deben volver de forma natural y en main, o quien controle el programa, debe tener un bucle que haga que todo se repita hasta que el usuario quiera salir.
#1043
Si me puedes copiar la salida del tu pantalla desde que ejecutas hasta que empieza a repetir sin control te pordía ayudar mejor.
#1044
Eso y el gets por fgets para prevenir desbordamiento de buffer. Aquí el código modificado:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct materiales{
   int codart, stock, stockmin;
   char desc[20];
   float precio;
};
struct ventas{
      int cod,cant;
};


//ACA YO CARGO EL ARCHIVO AMTERIALES
int main() {
    FILE *archivomateriales;
    FILE *archivoventa;
    int op;
    struct materiales mat;
    struct ventas ven;
   
    if((archivomateriales=fopen("materiales.dat","wb")) != NULL) {
        do {
            printf("\n\tIngrese el codigo del articulo");
            scanf("%d", &mat.codart);
            printf("\n\tIngrese un breve descripcion");
            getchar();
            fgets(mat.desc, 20, stdin);
            printf("\n\tIngrese stock actual del articulo");
            scanf("%d", &mat.stock);
            printf("\n\tIngrese stock minimo");
            scanf("%d", &mat.stockmin);
            printf("\n\tPor utimo ingrese precio");
            scanf("%f", &mat.precio);
            fwrite(&mat, sizeof(mat), 1, archivomateriales);
            printf("\n\t¿Desea ingresar otro articulo? [1]-Para SI // [0]-Para NO");
            scanf("%d", &op);
        } while(op != 0);
   }
   else {
      printf("\n\nError de archivo");
   }
   fclose(archivomateriales);
   
//ACA YO CARGO EL ARCHIVO VENTAS

    int opc;

    if((archivoventa=fopen("ventas.dat","wb")) != NULL) {
        do{
            printf("\n\tIngrese codigo del articulo");
            scanf("%d", &ven.cod);
            printf("\n\tIngrese cantidad vendida del articulo");
            scanf("%d", &ven.cant);
            fwrite(&ven,sizeof(ven),1,archivoventa);
            printf("\n\t¿Desea registrar otra venta? [1]-Para SI // [0]-Para NO");
            scanf("%d", &opc);
        } while(opc!=0);
    }
    else {
      printf("\nError de archivo");
    }
    fclose(archivoventa);
   
    //ACA ES DONDE ESTA LA FALLA
   
    if((archivoventa=fopen("ventas.dat","rb")) != NULL) {
        if((archivomateriales=fopen("materiales.dat","r+b")) != NULL) {
            fread(&ven, sizeof(ven), 1, archivoventa);
            while(!feof(archivoventa)) {   
                fread(&mat, sizeof(mat), 1, archivomateriales);           
                while(!feof(archivomateriales)) {   
                    if(mat.codart == ven.cod) {
                         mat.stock = mat.stock-ven.cant;
                         printf("\n\nEl stock entonces quedo en %d", mat.stock);
                         fseek(archivomateriales, -1*(sizeof(mat)),SEEK_CUR);
                         fwrite(&mat,sizeof(mat), 1, archivomateriales);
                    }                       
                    fread(&mat, sizeof(mat), 1, archivomateriales);
                    printf("\nHola");     
                }
                rewind(archivomateriales);
                fread(&ven,sizeof(ven),1,archivoventa);
                printf("\nHola2"); 
            }
        }
        else {
            printf("\nError archivo");
        }
        fclose(archivomateriales);   
    }
    else {
        printf("\nError archivo");
    } 
    fclose(archivoventa); 
    printf("\n\t\tError3");
   
    if((archivomateriales=fopen("materiales.dat","rb")) != NULL){
        fread(&mat, sizeof(mat), 1, archivomateriales);
        while(!feof(archivomateriales)) {
            printf("\n\nEl codigo de articulo es %d", mat.codart);
            printf("\n\nEl stock actualizado quedo asi %d", mat.stock);
            fread(&mat, sizeof(mat), 1, archivomateriales);
        }
    }
    else {
        printf("Error");
    }
    fclose(archivomateriales);
}
#1045
C2 no hace falta que sea un array de 1 solo elemento, basta sea una variable.

En la línea 39 deberías hacer un strcpy para copiar el valor de C1[0].Nconductor a C2.Nconductor.
De igual forma deberías hacer en una nueva línea después de la 45.
#1046
He cambiado la variable tipo FILE* materiales por archivomateriales, para evitar un posible conflicto con el nombre del struct y esto es lo que he conseguido del programa:
   Ingrese el codigo del articulo1

   Ingrese un breve descripcionmesa

   Ingrese stock actual del articulo10

   Ingrese stock minimo5

   Por utimo ingrese precio10

   ¿Desea ingresar otro articulo? [1]-Para SI //
  • -Para NO0

       Ingrese codigo del articulo1

       Ingrese cantidad vendida del articulo6

       ¿Desea registrar otra venta? [1]-Para SI //
  • -Para NO0


    El stock entonces quedo en 4
    Hola
    Hola2
          Error3

    El codigo de articulo es 1

    El stock actualizado quedo asi 4

#1047
Como ves pides un dato que es el sexo del alumno. Ahora viene cuándo debes hacer uso de este dato para mostrar solo el resultado de las alumnas.
#1048
Lo único que puede ocurrir si, el array queda ordenado al principio, es que el programa va a recorrerlo sin realizar muchas acciones más.

La cosa es que nadie sabe cuándo un array queda ordenado, y la máquina tampoco, por lo que tendrá que comprobarlo antes de decidir si lo está.
#1049
Tendrías que mirar si (*nodo)->sig->sig vale NULL para sacar el valor de (*nodo)->sig->valor. Después hacer un free sobre (*nodo)->sig para terminar llevando a NULL (*nodo)->sig. Como puedes ver es muy complicado.

Te sería mucho más fácil cambiar la función agregar para hacer de tu lista una pila. El último objeto que entres debe estar en cabeza. Tu función pop quedaría tal y como la tienes. Para tu función agregar (por conveniencia sería mejor que la llamaras push):
La función debe recibir un puntero a la lista y el valor a añadir.
Dentro: creas una variable auxiliar de tipo nodo. Como valor le das el valor que te han pasado a la función. Como siguiente elemento apuntas a la lista.
Haces que la raíz de la lista que te han pasado como argumento apunte al nodo auxiliar.
Listo, ya tienes tu programa funcional.
#1050
Usa whereis y locate a ver si los encuentras.