0

Se supone me debe dar que alumno pasa y cual no pasa la materia, ¿Qué debo cambiar para que el código funcione?

#include <stdio.h>
#include <stdlib.h>

struct alumnos {
 int alum[50];
    float cal[10];
    }alumno[10];
    int i;
    
int main(int argc, char *argv[]) {
    printf("Ingresa el nombre de 10 alumnos junto con su calificacion de la materia de matematicas\n");
    
    for(i=0; i<10; i++){
        printf("Nombre del alumno: \n");
        scanf("%s", alumno[i].alum);
        printf("Ingrese calificacion: \n");
        scanf("%f", alumno[i].cal);
        if(alumno[i].cal>=6){
            printf("Pasa\n");
        }if(alumno[i].cal<6){
            printf("No pasa\n");
        }
    }
    return 0;
}
Alfabravo
  • 7,352
  • 5
  • 21
  • 31
Zamx
  • 11
  • 5
  • Bienvenido a SOe. No pongas el código como captura de pantalla, ponlo como texto por favor. – SJuan76 Sep 15 '20 at 22:11
  • `cal`, por tu definición, es un arreglo de `floats`. Tendrías que especificar cuál de los items en `cal` querrías usar para comparar (lo cual me lleva a pensar que no tienes bien tu estructura de datos.... parece que cada alumno va a tener 10 calificaciones). – eftshift0 Sep 15 '20 at 22:43

3 Answers3

0
float cal[10];

y

if(alumno[i].cal>=6){

cal es un array de 10 floats. C (y C++) trata los arrays como punteros, la única diferencia es que les asigna automáticamente el espacio requerido (y no tienes que hacer malloc).

En tus ifs, estás comparando un array de números con un único número. No tiene sentido. Si hicieras

if (alumno[i].cal[0] >= 6) {

ya estarías comparando un número (el primer número del array) con un número, que es algo que tiene sentido.

Como la comparación le parece rara, te muestra un warning. El programa es compilado (C/C++ permiten muchas cosas raras), pero al menos te avisa de que igual quieres revisar lo que pasa.

SJuan76
  • 10,771
  • 5
  • 17
  • 31
0

El código tiene varias fallas:

1.- alum es un array de enteros y después intentas pedir una cadena como si alum fuera un array de caracteres:

scanf("%s", alumno[i].alum);

Solución: alum debe ser un array de caracteres:

struct alumnos 
{
    char alum[50];
    float cal[10];
}alumno[10];

2.- No tiene sentido comparar una dirección de memoria con un entero:

if(alumno[i].cal>=6)

Ten en cuenta que cal es una simple alias de la dirección del primer elemento del array, así que el resultado que esperaras puede ser erróneo.

Noto que tu intención es pedir 10 calificaciones por teclado y verificar si es mayor o igual a 6, para lograr esto, debes hacer uso de un bucle anidado:

for(int j = 0; j < 10; j++)
{
    printf("Ingrese la %d calificacion: \n", j + 1);
    scanf("%f", &alumno[i].cal[j]);
    if(alumno[i].cal[j] >= 6)
        printf("Pasa\n");
    else
        printf("No pasa\n");
}

Date cuenta que no hace falta el segundo if, es redundante.

3.- Sí vas a pedir una cadena por medio de scanf, evita el desbordamiento de búfer:

//Con esto el usuario solo podrá ingresar 49 caracteres.
scanf("%49s", alumno[i].alum);

En este hilo explico más a fondo sobre como evitar este tipo de desbordamiento.

El código corregido quedaría así:

struct alumnos 
{
    char alum[50];
    float cal[10];
}alumno[10];

int i;

int main(int argc, char *argv[]) 
{
    printf("Ingresa el nombre de 10 alumnos junto con su calificacion de la materia de matematicas\n");
    
    for(i=0; i<10; i++)
    {
        printf("Nombre del alumno: \n");
        scanf("%49s", alumno[i].alum);      
        for(int j = 0; j < 10; j++)
        {
            printf("Ingrese la %d calificacion: \n", j + 1);
            scanf("%f", &alumno[i].cal[j]);
            if(alumno[i].cal[j] >= 6)
                printf("Pasa\n");
            else
                printf("No pasa\n");
        }
    }
    return 0;
}

Observación:

No uses variables globales, no la necesitas en este caso. Mira este hilo para más información.

MrDave1999
  • 7,491
  • 1
  • 7
  • 22
  • Ahora que ya se puede sacar quien paso y quien con, necesito saber como sacar el porcentaje de los que pasaron y los que no pasaron e imprimirlo en pantalla. Ya lo intente de varias maneras pero de ninguna me resulta. ¿Cómo puedo sacar el porcentaje de los que pasaron y los que no? Ayuda por favor – Zamx Sep 16 '20 at 01:40
  • @Zamx Debes tener dos contadores (variables) que cuenten los que pasaron y los que no. Al final, para sacar el porcentaje, debes multiplicarlo por 100.. – MrDave1999 Sep 16 '20 at 20:37
0

Entiendo que estas aprendiendo y por eso cometes tantos errores de sintaxis. Asi que voy a expicar un poco cada cosa.

#include <stdio.h>
struct Alumno {
    int calificacion;
    char nombre[20];
};


int main() {
    struct Alumno grupo[10];
    printf("Programa de ingreso de notas:\n");
    for (int i = 0; i < 10; i++) {
        printf("Ingrese nombre:");
        scanf("%s", &(grupo[i].nombre));
        printf("Ingrese nota:");
        scanf("%i", &(grupo[i].calificacion));
    }
    printf("\n\n");
    for (int i = 0; i < 10; i++) {
        printf("Nombre: %s\n", grupo[i].nombre);
        printf("Calificacion: %i\n", grupo[i].calificacion);
        if (grupo[i].calificacion >= 6) printf("Estado: Aprobo.\n");
        else printf("Estado: No aprobo.\n");
    }
    return 0;
}

Como puedes notar, hay muchas diferencias con tu codigo.
Primero el uso de scanf() tiene 02 parametros, el primero es el tipo de dato que vas a insertar

  • %s si es cadena de caracteres
  • %c si es un solo caracter
  • %d si es cualquier digito

Luego de esto es obligatorio usar el simbolo & antes de la variable. Ej. scanf("%s", &nombre);
Segundo el uso de las variables de struct

Cuando usas un struct estas definiendo una clase(una clase es un tipo de variable inventado por ti) y llamas sus atributos(o elementos internos) con el ., en este caso he hecho un arreglo de 10 alumnos y a cada uno de ellos les he hecho insertar su nombre y su calificacion.
Luego al momento de imprimir los datos, ya teniendo todo ingresado, comparo la calificacion para ver si aprobo o no.

Por ultimo, al momento de operar arreglo o listas, debes usar los corchetes para indicar a que parte del arreglo vas a modificar.
Ej. grupo[1].nombre; te refieres al nombre del elemento 1 en el grupo.
Espero que todo esto te haya servido.

Egon Stetmann.
  • 565
  • 4
  • 20