es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo editar los valores de estructura después de pasarlos

Hola chicos, solo quiero leer los estudiantes de un archivo y luego pedir al usuario que agregue un nuevo estudiante, pero primero tengo que agregarlo a mi estructura y realmente no sé cómo editar o añadir estudiantes a mi estructura asignada. Por favor, enséñame cómo enviar los valores de mi estructura a cualquier otra función y editarlos.

struct estudiante {
    char personnummer[11];
    char förnamn[11];
    char efternamn[10];
    char genero[7];
    char programmdife[20];
    char edad[4];
    char correo[30];
    //struct likaprogramms *likaprogramm;
} *personer;

void f(struct estudiante <em>*x)
{
    char str[200];
    int j=0;
    struct estudiante *personer = (struct estudiante</em>)malloc(j * sizeof(struct estudiante));
    FILE* f;
    f = fopen("elever.txt", "r");

while (fgets(str,sizeof str, f)!=NULL )
{
    sscanf(str, "%10s %9s %9s %6s %19s %3s %29s", personer[j].personnummer,personer[j].förnamn, personer[j].efternamn, personer[j].genero, personer[j].programmdife, personer[j].edad, personer[j].correo);
    printf("%10s %9s %9s %6s %19s %3s %29s\n", personer[j].personnummer,personer[j].förnamn, personer[j].efternamn, personer[j].genero, personer[j].programmdife, personer[j].edad, personer[j].correo);
    j++;
    *x=personer;
}

fclose(f);
//free(personer);
}

int i;
int main()
{
    getchar();
    printf("escriba nuevo número de persona\n");
    getchar();
    fgets(personer->personnummer,11,stdin);
    printf("escriba nombre\n");
    getchar();
    fgets(personer->förnamn,50,stdin);
    printf("escriba genero\n");
    fgets(personer->genero,20,stdin);
    printf("escriba programa\n");
    fgets(personer->programmdife,50,stdin);
    printf("escriba edad\n");
    getchar();
    fgets(personer->edad,4,stdin);
    printf("escriba correo\n");
    getchar();
    fgets(personer->correo,40,stdin);
    // printf("%s %s %s %s %s %s %s", personnummer,förnamn,efternamn,gender,programm,age,email);

return 0;
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Primero, para agregar un nuevo estudiante a la estructura asignada, necesitas reasignar memoria para el arreglo personer utilizando realloc. Aquí tienes un ejemplo:

    void add_student(struct student **x, int *num_students)
    {
        *num_students += 1;
        struct student *temp = realloc(*x, (*num_students) * sizeof(struct student));
        if (temp == NULL) {
            // manejar error
            exit(1);
        }
        *x = temp;
    
        // solicitar al usuario los datos del nuevo estudiante
        printf("Ingrese los datos del nuevo estudiante:\n");
        printf("Personnummer: ");
        fgets((*x)[*num_students-1].personnummer, 11, stdin);
        printf("Förnamn: ");
        fgets((*x)[*num_students-1].fö[email protected],11,stdin);
        printf("Efternamn: ");
        fgets((*x)[*num_students-1].ef[email protected],10,stdin);
        printf("Género: ");
        fgets((*x)[*num_students-1].gender, 7, stdin);
        printf("Programmdife: ");
        fgets((*x)[*num_students-1].programmdife, 20, stdin);
        printf("Edad: ");
        fgets((*x)[*num_students-1].age, 4, stdin);
        printf("Email: ");
        fgets((*x)[*num_students-1].email, 30, stdin);
    }
    

    En esta función, pasamos un puntero x al arreglo personer asignado, así como un puntero num_students al número actual de estudiantes en el arreglo. Primero incrementamos num_students para reflejar la adición de un nuevo estudiante. Luego, utilizamos realloc para asignar memoria al arreglo personer actualizado. Si la asignación de memoria falla, salimos del programa.

    A continuación, solicitamos al usuario los datos del nuevo estudiante utilizando fgets. Accedemos a los datos del nuevo estudiante utilizando (*x)[*num_students-1], que utiliza aritmética de punteros para acceder a los elementos del estudiante recién agregado.

    Para enviar los valores de la estructura a otra función, puedes pasar un puntero a la estructura como parámetro. Aquí tienes un ejemplo:

    void print_student(struct student *s)
    {
        printf("Personnummer: %s\n", s->personnummer);
        printf("Förnamn: %s\n", s->fö[email protected]);
        printf("Efternamn: %s\n", s->ef[email protected]);
        printf("Género: %s\n", s->gender);
        printf("Programmdife: %s\n", s->programmdife);
        printf("Edad: %s\n", s->age);
        printf("Email: %s\n", s->email);
    }
    

    En esta función, pasamos un puntero s a una estructura student. Luego utilizamos el operador -> para acceder a los elementos de la estructura e imprimir sus valores. Para llamar a esta función, puedes pasar un puntero a una variable de tipo struct student, de la siguiente manera:

    print_student(&personer[0]);
    

    Esto imprimiría los valores del primer estudiante en el arreglo personer.

    Nota: En el código original, el arreglo personer se declara como una variable global, por lo que no es necesario pasarla a otras funciones utilizando punteros. Sin embargo, si quisieras pasarla como parámetro, podrías hacerlo de la siguiente manera:

    void some_function(struct student *personer, int num_students)
    {
        // código de la función
    }
    
    int main()
    {
        struct student *personer;
        int num_students = 0;
    
        // asignar memoria para personer
    
        some_function(personer, num_students);
    
        // resto del código principal
    }
    

    En este ejemplo, pasamos el arreglo personer y el contador num_students como parámetros a la función some_function.

Comments are closed.