Aunque este es un foro de Perl, creo que puedo contestar
Hay un bucle que lee los valores, pero ¿dónde los guarda?
Y si no los guarda... creo que alguna llave está mal puesta...
Esta es una versión sin almacenamiento de los datos (los vamos sacando a medida de que los vamos leyendo)
Using c Syntax Highlighting
/*
Encontrar valores mayores que cinco
Joaquin Ferrero, 20121115
*/
#include <stdio.h>
void main(int argc, char * argv) {
int i;
int numero_examenes;
int id;
float nota;
scanf("%d", &numero_examenes);
printf("Número de exámenes: [%d]\n", numero_examenes);
for(i = 1; i <= numero_examenes; i++) {
int r = scanf("%d %f", &id, ¬a);
if (r != 2) {
printf("ERROR: no he podido leer la nota número %d\n", i);
}
else {
if (nota > 5.0) {
printf("Aprobado: alumno %d: %.01f\n", id, nota);
}
}
}
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Lo compilamos:
Using bash Syntax Highlighting
explorer@casa:~/Documentos/Desarrollo> gcc -o mayor_5 mayor_5.c
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
y lo probamos
Using bash Syntax Highlighting
explorer@casa:~/Documentos/Desarrollo> echo "5 1 1.0 2 3.0 3 5.0 4 5.6 5 8.7" | ./mayor_5
Número de exámenes: [5]
Aprobado: alumno 4: 5.6
Aprobado: alumno 5: 8.7
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y esta es otra versión con almacenamiento (primero leemos toda la entrada y luego sacamos el resultado)
Using c Syntax Highlighting
/*
Encontrar valores mayores que cinco
Joaquin Ferrero, 20121115
*/
#include <stdio.h>
#include <stdlib.h>
int ids[80]; /* Array para los id */
float notas[80]; /* Lo mismo para las notas */
void main(int argc, char * argv) {
int i;
int numero_examenes;
int id;
float nota;
scanf("%d", &numero_examenes);
printf("Número de exámenes: [%d]\n", numero_examenes);
if (numero_examenes >= 80) {
printf("ERROR: No puedo procesar tantas notas. Máximo: 80\n");
exit(1);
}
for(i = 1; i <= numero_examenes; i++) {
int r = scanf("%d %f", &id, ¬a);
if (r != 2) {
printf("ERROR: no he podido leer la nota número %d\n", i);
}
else {
/* guardamos los valores */
ids[i-1] = id;
notas[i-1] = nota;
}
}
/* Buscamos los valores que superen el corte */
for(i = 0; i < numero_examenes; i++) {
if (notas[i] > 5.0) {
printf("Aprobado: alumno %d: %.01f\n", ids[i], notas[i]);
}
}
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El resultado es el mismo. Lo importante es ver el uso de los vectores y cómo los recorremos.
P.D. Hacía 10 años que no programaba en C... algo normal, porque entonces conocí Perl, y aprendí que este problema se podía resolver en una sola línea
Using bash Syntax Highlighting
explorer@casa:~/Documentos/Desarrollo> echo "5 1 1.0 2 3.0 3 5.0 4 5.6 5 8.7" | perl -E '($n, %notas) = split " ", <>; say "Número de exámenes: [$n]"; for (keys %notas) { printf "Aprobado: alumno %d: %.01f\n", $_, $notas{$_} if $notas{$_} > 5.0 }'
Número de exámenes: [5]
Aprobado: alumno 4: 5.6
Aprobado: alumno 5: 8.7
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y he tardado mucho (pero que mucho) menos tiempo en resolverlo