Computadoras y Programación · ENES Juriquilla · UNAM
Extra del curso · Arreglos y ciclos
terminal — curso
$ ./a.outnotas[4] = 6$

Arreglos y ciclos en C.

Una variable con muchas casillas y un ciclo que las recorre: explicación, dos ejemplos y diez retos.
Por
Walter Rosales
Arreglos · ¿para qué?

Guardar 500 calificaciones: ¿quinientas variables?

Con lo que ya sabes
quinientas_variables.c
int nota1 = 9;
int nota2 = 8;
int nota3 = 10;
… 494 líneas más …
int nota500 = 7;
Con un arreglo
un_arreglo.c
int notas[500];
notas[0] = 9;
notas[499] = 7;
9
0
8
1
10
2
…
7
499
Técnicamente funciona. Humanamente, no.
Un arreglo: un solo nombre, muchas casillas del mismo tipo. Se cuentan desde 0: la primera es notas[0] y la última, notas[499].
Arreglos en C

Declarar, acceder y modificar.

arreglos.c (cuerpo de main)
int notas[5] = {9, 8, 10, 7, 6};
int n = sizeof(notas) / sizeof(notas[0]);
 
printf("notas[0] = %d\n", notas[0]);
notas[1] = 9;
printf("notas[1] = %d\n", notas[1]);
printf("casillas: %d\n", n);
notas (tras notas[1] = 9)
9
0
9
1
10
2
7
3
6
4
terminal
$ ./a.out notas[0] = 9 notas[1] = 9 casillas: 5
notas[1] = 9 cambió la casilla 1: de 8 a 9. sizeof cuenta las casillas: 5.
notas[5]
No existe: las casillas son de la 0 a la 4. C no avisa y lee lo que haya.
imprimió 0
int vacio[3];
Sin valores iniciales, trae basura hasta que guardes algo.
imprimió 135
Esos dos valores son los de esta corrida (gcc 16.2.0): en otra computadora pueden ser otros.
Ciclo for

for: una vuelta por casilla.

for (int i = 0; i < n; i++) {
1 · Inicio
int i = 0 — empieza en la casilla 0
2 · Condición
i < n — repite mientras sea verdad
3 · Paso
i++ — avanza a la siguiente casilla
recorrer_for.c (cuerpo de main)
int notas[5] = {9, 8, 10, 7, 6};
int n = 5;
 
for (int i = 0; i < n; i++) {
printf("notas[%d] = %d\n", i, notas[i]);
}
terminal
$ ./a.out notas[0] = 9 notas[1] = 8 notas[2] = 10 notas[3] = 7 notas[4] = 6
i < n, no i <= n: con n = 5 las casillas son de la 0 a la 4.
Ciclo while

while: mientras la condición se cumpla.

for
Sé cuántas vueltas: una por casilla.
while
No sé cuántas: depende de una condición.
recorrer_while.c (cuerpo de main)
int notas[5] = {9, 8, 10, 5, 7};
int n = 5;
int i = 0;
 
while (i < n && notas[i] >= 6) {
i++;
}
printf("Aprobadas seguidas: %d\n", i);
 
if (i < n) {
printf("Falla en notas[%d] = %d\n",
i, notas[i]);
}
terminal
$ ./a.out Aprobadas seguidas: 3 Falla en notas[3] = 5
do-while: pregunta al menos una vez
do {
scanf("%d", &cal);
} while (cal < 0 || cal > 10);
&& es « y »: las dos condiciones a la vez. El if ejecuta sus llaves solo si es verdad.
Ejemplo 1 · en clase
Arreglo + for10 min

Ejemplo 1: el promedio del grupo.

Problema
Cinco calificaciones del grupo. Quieres su suma y su promedio.
notas (lo que teclea el usuario)
8
0
9
1
9
2
7
3
6
4
Antes de ver la solución
¿Cuánto es 39 / 5 entre enteros?
1
Declaraint notas[5]; int suma = 0;
2
Un for lee las 5 casillasscanf("%d", &notas[i]);
3
En el mismo for, acumulasuma = suma + notas[i];
4
Fuera del for, dividesuma entre 5: ¿con int o con float?
Solución · Ejemplo 1
Arreglo + for

Suma en el ciclo. Divide al final, con decimales.

promedio.c
1#include <stdio.h>
2 
3int main(void)
4{
5 int notas[5];
6 int suma = 0;
7 
8 for (int i = 0; i < 5; i++) {
9 scanf("%d", &notas[i]);
10 suma = suma + notas[i];
11 }
12 
13 printf("Suma: %d\n", suma);
14 printf("Promedio con int: %d\n",
15 suma / 5);
16 printf("Promedio con float: %.2f\n",
17 (float)suma / 5);
18 return 0;
19}
inotas[i]suma
088
1917
2926
3733
4639
gcc -Wall -Wextra promedio.c
$ echo "8 9 9 7 6" | ./a.out Suma: 39 Promedio con int: 7 Promedio con float: 7.80
39 / 5 son dos int: vale 7. Con (float)suma / 5 sale 7.80.
Ejemplo 2 · en clase
Arreglo + for + if10 min

Ejemplo 2: ¿cuántas aprueban y cuál es la mayor?

Problema
Seis calificaciones. Aprobar es sacar 6 o más. Cuenta las aprobadas y encuentra la mayor.
notas
9
0
5
1
10
2
6
3
4
4
8
5
Antes de ver la solución
mayor arranca en notas[0], no en 0. ¿Por qué?
1
Arranca conaprobadas = 0 · mayor = notas[0]
2
Un for recorre las 6 casillasi = 0 … 5
3
if (notas[i] >= 6) → aprobadas++if: las llaves se ejecutan solo si es verdad
4
if (notas[i] > mayor) → mayor = notas[i]la casilla actual reemplaza al mayor
Solución · Ejemplo 2
Arreglo + for + if

Un solo ciclo, dos preguntas.

aprobadas.c
1#include <stdio.h>
2 
3int main(void)
4{
5 int notas[6] = {9, 5, 10, 6, 4, 8};
6 int aprobadas = 0;
7 int mayor = notas[0];
8 
9 for (int i = 0; i < 6; i++) {
10 if (notas[i] >= 6) {
11 aprobadas++;
12 }
13 if (notas[i] > mayor) {
14 mayor = notas[i];
15 }
16 }
17 
18 printf("Aprobadas: %d de 6\n", aprobadas);
19 printf("Mayor: %d\n", mayor);
20 return 0;
21}
inotas[i]aprobadasmayor
0919
1519
210210
36310
44310
58410
gcc -Wall -Wextra aprobadas.c
$ ./a.out Aprobadas: 4 de 6 Mayor: 10
mayor arranca en notas[0]: así siempre es una nota real del arreglo (en 0 fallaría con datos negativos).
En clase · opcional

Las estrellas valen puntos.

1
Equipos de 3 o 4Una computadora por equipo. Todos opinan.
2
★ = 1 punto · ★★ = 2 · ★★★ = 3+1 si el programa compila sin avisos.
3
Comodines: cada uno cuesta 1 puntoPista del profe · pregunta al grupo · pregunta a un chatbot.
El chatbot responde con total aplomo. Tu compilador, con la verdad.
Reto 1
Completa el códigoFísica · temperaturas★8 min

Cinco temperaturas en °C. Complétalo para verlas en °F.

semana_f.c
#include <stdio.h>
 
int main(void)
{
float c[5] = {-5.0f, 0.0f, 12.5f,
25.0f, 38.0f};
 
for (int i = 0; i < ______; i++) {
float f = c[i] * ______ + 32;
printf("%.1f C = %.1f F\n", c[i], f);
}
return 0;
}
lo que debe imprimir
$ ./a.out -5.0 C = 23.0 F 0.0 C = 32.0 F 12.5 C = 54.5 F 25.0 C = 77.0 F 38.0 C = 100.4 F
fórmulaF = C × 9 / 5 + 32
Respuesta · Reto 1
Completa el códigoFísica · temperaturas★8 min

El hueco traicionero: 9.0 / 5, no 9 / 5.

semana_f.c
#include <stdio.h>
 
int main(void)
{
float c[5] = {-5.0f, 0.0f, 12.5f,
25.0f, 38.0f};
 
for (int i = 0; i < 5; i++) {
float f = c[i] * 9.0 / 5 + 32;
printf("%.1f C = %.1f F\n", c[i], f);
}
return 0;
}
con 9.0 / 5
$ ./a.out -5.0 C = 23.0 F 0.0 C = 32.0 F 12.5 C = 54.5 F 25.0 C = 77.0 F 38.0 C = 100.4 F
con 9 / 5 (mal)
$ ./a.out -5.0 C = 27.0 F 0.0 C = 32.0 F 12.5 C = 44.5 F 25.0 C = 57.0 F 38.0 C = 70.0 F
9 / 5 son dos int: vale 1. Por eso 25 °C sale como 57 °F y no como 77.
Reto 2
Predice la salidaFinanzas · gastos★8 min

Presupuesto de $400. ¿Cuántos gastos caben?

gastos.c
1#include <stdio.h>
2 
3int main(void)
4{
5 int gastos[5] = {120, 80, 200, 50, 300};
6 int presupuesto = 400;
7 int total = 0;
8 int i = 0;
9 
10 while (i < 5 &&
11 total + gastos[i] <= presupuesto) {
12 total = total + gastos[i];
13 i++;
14 }
15 printf("Alcanzo para %d gastos: $%d\n",
16 i, total);
17 return 0;
18}
¿Qué imprime?
Opción A
Alcanzo para 2 gastos: $200
Opción B
Alcanzo para 4 gastos: $450
Opción C
Alcanzo para 3 gastos: $400
Respuesta · Reto 2
Predice la salidaFinanzas · gastos★8 min

Gana C: el cuarto gasto ya no cabe.

igastos[i]total + gasto¿cabe? (≤ 400)
0120120sí
180200sí
2200400sí
350450no
Con i = 3: 400 + 50 = 450 pasa de 400. El while se detiene con i = 3 y total = 400.
gcc -Wall -Wextra gastos.c
$ ./a.out Alcanzo para 3 gastos: $400
A: así sale si escribes < en vez de <= (lo corrimos: Alcanzo para 2 gastos: $200).
B: 450 ya se pasó de 400. No cabe.
Reto 3
Encuentra el bugSalud · pulso★★10 min

Compila sin avisos. Y aun así, algo no cuadra.

pulso.c
1#include <stdio.h>
2 
3int main(void)
4{
5 int pulso[7] = {72, 70, 75, 68, 71, 69, 74};
6 int suma = 0;
7 
8 for (int i = 0; i <= 7; i++) {
9 suma = suma + pulso[i];
10 }
11 
12 printf("Promedio: %.1f\n", suma / 7.0);
13 return 0;
14}
lo que imprime
$ ./a.out Promedio: 71.4
Pulso en reposo durante 7 días. Los siete valores suman 499, y 499 / 7 es 71.3. ¿Quién metió el 71.4?
Pista: cuenta cuántas veces da vueltas el for.
Respuesta · Reto 3
Encuentra el bugSalud · pulso★★10 min

Siete casillas, ocho vueltas.

pulso.c
1#include <stdio.h>
2 
3int main(void)
4{
5 int pulso[7] = {72, 70, 75, 68, 71, 69, 74};
6 int suma = 0;
7 
8 for (int i = 0; i < 7; i++) {
9 suma = suma + pulso[i];
10 }
11 
12 printf("Promedio: %.1f\n", suma / 7.0);
13 return 0;
14}
pulso
72
0
70
1
75
2
68
3
71
4
69
5
74
6
?
7
arreglado: i < 7
$ ./a.out Promedio: 71.3
i <= 7 hace 8 vueltas: la última lee pulso[7], que no existe. C no avisó: sumó un valor que no era un pulso y salió 71.4 aquí; con otra memoria, otro número.
Reto 4
Traza la tablaMúsica · compás★★10 min

Un compás de 4 tiempos. ¿Cuántas notas lo llenan?

compas.c
1#include <stdio.h>
2 
3int main(void)
4{
5 int dur[5] = {2, 1, 2, 2, 4};
6 int total = 0;
7 int i = 0;
8 
9 while (total < 4) {
10 total = total + dur[i];
11 i++;
12 }
13 printf("%d notas, %d tiempos\n", i, total);
14 return 0;
15}
dur (tiempos de cada nota)
2
0
1
1
2
2
2
3
4
4
idur[i]total
0??
1??
2??
3??
Completa la tabla (puede sobrar una fila) y di qué imprime el printf.
Respuesta · Reto 4
Traza la tablaMúsica · compás★★10 min

El compás se llena en la tercera nota.

dur
2
0
1
1
2
2
2
3
4
4
idur[i]total
022
113
225
En i = 2 el total llega a 5. Como 5 no es < 4, el while se detiene.
gcc -Wall -Wextra compas.c
$ ./a.out 3 notas, 5 tiempos
i cuenta las notas usadas (3). total pasó de 4: la última nota no cabía completa en el compás.
Reto 5
Escribe desde ceroDeportes · tiempos★★★20 min

Seis vueltas a la pista: ¿cuál fue la mejor?

Problema
En un entrenamiento de pista registras el tiempo, en segundos, de seis vueltas.
Qué debes lograr
Lee los 6 tiempos en un arreglo. Muestra qué número de vuelta fue la más rápida (si hay empate, la primera) y el promedio con 1 decimal.
Entregable
Programa en C
desde cero · arreglo de 6, for y scanf
caso 1 · típico
$ ./a.out 72 70 74 69 71 73 Mejor vuelta: 4 (69 s) Promedio: 71.5 s
caso 2 · empate
$ ./a.out 80 80 80 80 80 80 Mejor vuelta: 1 (80 s) Promedio: 80.0 s
caso 3 · va mejorando
$ ./a.out 75 74 73 72 71 70 Mejor vuelta: 6 (70 s) Promedio: 72.5 s
Respuesta · Reto 5
Escribe desde ceroDeportes · tiempos★★★20 min

Guarda el índice, no el valor.

vueltas.c
1#include <stdio.h>
2 
3int main(void)
4{
5 int t[6];
6 int suma = 0;
7 int mejor = 0;
8 
9 for (int i = 0; i < 6; i++) {
10 scanf("%d", &t[i]);
11 suma = suma + t[i];
12 if (t[i] < t[mejor]) {
13 mejor = i;
14 }
15 }
16 
17 printf("Mejor vuelta: %d (%d s)\n",
18 mejor + 1, t[mejor]);
19 printf("Promedio: %.1f s\n", suma / 6.0);
20 return 0;
21}
gcc -Wall -Wextra vueltas.c
$ echo "72 70 74 69 71 73" | ./a.out Mejor vuelta: 4 (69 s) Promedio: 71.5 s $ echo "80 80 80 80 80 80" | ./a.out Mejor vuelta: 1 (80 s) Promedio: 80.0 s $ echo "75 74 73 72 71 70" | ./a.out Mejor vuelta: 6 (70 s) Promedio: 72.5 s
mejor guarda la posición: t[mejor] da el tiempo y mejor + 1 el número de vuelta. suma / 6.0 evita la división entera.
Reto 6
Escribe el programaQuímica · pH★8 min

Seis soluciones de laboratorio: ¿ácidas, neutras o básicas?

Problema y datos
Se teclean 6 valores de pH (con decimales), uno por solución. Menos de 7 es ácida, igual a 7 es neutra y más de 7 es básica. Cuenta cuántas hay de cada tipo.
Salida exacta · sin acentos
Acidas: <n>
Neutras: <n>
Basicas: <n>
Entregable
Programa en C
desde cero · arreglo de 6, for e if
caso 1 · una mezcla
$ ./a.out 2.5 7.0 8.3 6.9 11.0 7.4 Acidas: 2 Neutras: 1 Basicas: 3
caso 2 · todas neutras
$ ./a.out 7 7 7 7 7 7 Acidas: 0 Neutras: 6 Basicas: 0
caso 3 · todas ácidas
$ ./a.out 1.0 0.5 3.2 6.0 6.8 2.2 Acidas: 6 Neutras: 0 Basicas: 0
Respuesta · Reto 6
Escribe el programaQuímica · pH★8 min

Contadores en 0 y un float para el pH.

ph_soluciones.c (cuerpo de main)
1float ph[6];
2int acidas = 0;
3int neutras = 0;
4int basicas = 0;
5 
6for (int i = 0; i < 6; i++) {
7 scanf("%f", &ph[i]);
8 if (ph[i] < 7) {
9 acidas++;
10 }
11 if (ph[i] == 7) {
12 neutras++;
13 }
14 if (ph[i] > 7) {
15 basicas++;
16 }
17}
18 
19printf("Acidas: %d\n", acidas);
20printf("Neutras: %d\n", neutras);
21printf("Basicas: %d\n", basicas);
gcc -Wall -Wextra ph_soluciones.c
$ ./a.out 2.5 7.0 8.3 6.9 11.0 7.4 Acidas: 2 Neutras: 1 Basicas: 3 $ ./a.out 7 7 7 7 7 7 Acidas: 0 Neutras: 6 Basicas: 0 $ ./a.out 1.0 0.5 3.2 6.0 6.8 2.2 Acidas: 6 Neutras: 0 Basicas: 0
Los tres if son excluyentes: cada pH suma en un solo contador. Como ph es float, tecleas 7 o 7.0 y es el mismo neutro.
Error típico: guardar el pH en un int. El scanf se atora en el «.5» y el resto queda sin leer; en el caso 1 sale Neutras: 0 y Basicas: 4 en esta corrida, y debió ser 1 y 3 (lo corrimos).
Reto 7
Escribe el programaGeografía · lluvias★★12 min

Un año de lluvia: ¿cuántos meses superan el promedio?

Problema y datos
Se teclean los milímetros de lluvia de los 12 meses de un año (enteros). Calcula el total anual, el promedio mensual con 1 decimal y cuántos meses llovieron más que ese promedio.
Salida exacta · p con 1 decimal
Total anual: <t> mm
Promedio mensual: <p> mm
Meses sobre el promedio: <n>
Entregable
Programa en C
desde cero · arreglo de 12 y dos recorridos
caso 1 · año lluvioso
$ ./a.out 5 8 12 20 55 90 85 70 60 30 10 5 Total anual: 450 mm Promedio mensual: 37.5 mm Meses sobre el promedio: 5
caso 2 · año parejo
$ ./a.out 5 5 5 5 5 5 5 5 5 5 5 5 Total anual: 60 mm Promedio mensual: 5.0 mm Meses sobre el promedio: 0
caso 3 · un diluvio
$ ./a.out 5 0 0 0 0 0 0 0 0 0 0 55 Total anual: 60 mm Promedio mensual: 5.0 mm Meses sobre el promedio: 1
Respuesta · Reto 7
Escribe el programaGeografía · lluvias★★12 min

Dos pasadas: primero promedia, después compara.

lluvias.c (cuerpo de main)
1int mm[12];
2int total = 0;
3int arriba = 0;
4 
5for (int i = 0; i < 12; i++) {
6 scanf("%d", &mm[i]);
7 total = total + mm[i];
8}
9 
10float prom = total / 12.0;
11 
12for (int i = 0; i < 12; i++) {
13 if (mm[i] > prom) {
14 arriba++;
15 }
16}
17 
18printf("Total anual: %d mm\n", total);
19printf("Promedio mensual: %.1f mm\n",
20 prom);
21printf("Meses sobre el promedio: %d\n",
22 arriba);
gcc -Wall -Wextra lluvias.c
$ ./a.out 5 8 12 20 55 90 85 70 60 30 10 5 Total anual: 450 mm Promedio mensual: 37.5 mm Meses sobre el promedio: 5 $ ./a.out 5 5 5 5 5 5 5 5 5 5 5 5 Total anual: 60 mm Promedio mensual: 5.0 mm Meses sobre el promedio: 0 $ ./a.out 5 0 0 0 0 0 0 0 0 0 0 55 Total anual: 60 mm Promedio mensual: 5.0 mm Meses sobre el promedio: 1
El promedio solo existe cuando termina la lectura: por eso hay un segundo for. Un promedio con enteros es un promedio de buena fe.
Error típico: total / 12 en vez de total / 12.0. Divide como enteros: en el caso 1 imprime 37.0 y no 37.5 (lo corrimos).
Reto 8
Escribe el programaCocina · la cuenta★★12 min

La cuenta del mercado: ¿cuánto pagas y qué pesó más?

Problema y datos
Compras 5 artículos. Se teclean primero los 5 precios (con centavos) y luego las 5 cantidades. Calcula el total y qué artículo (1 a 5) pesó más en la cuenta: precio × cantidad. Con empate, el primero.
Salida exacta · t y s con 2 decimales
Total: $<t>
Mayor gasto: #<k> ($<s>)
Entregable
Programa en C
desde cero · arreglos paralelos y float
caso 1 · compra normal
$ ./a.out 12.50 8.25 45.00 3.50 20.75 2 3 1 4 2 Total: $150.25 Mayor gasto: #3 ($45.00)
caso 2 · todo empata
$ ./a.out 10 10 10 10 10 1 1 1 1 1 Total: $50.00 Mayor gasto: #1 ($10.00)
caso 3 · barato que pesa
$ ./a.out 5.50 40.00 2.25 3.00 1.50 10 1 8 6 20 Total: $161.00 Mayor gasto: #1 ($55.00)
Respuesta · Reto 8
Escribe el programaCocina · la cuenta★★12 min

Arreglos paralelos: precio, cantidad y subtotal.

cuenta.c (cuerpo de main)
1float precio[5];
2int cant[5];
3float sub[5];
4float total = 0;
5int mayor = 0;
6 
7for (int i = 0; i < 5; i++) {
8 scanf("%f", &precio[i]);
9}
10for (int i = 0; i < 5; i++) {
11 scanf("%d", &cant[i]);
12 sub[i] = precio[i] * cant[i];
13 total = total + sub[i];
14 if (sub[i] > sub[mayor]) {
15 mayor = i;
16 }
17}
18 
19printf("Total: $%.2f\n", total);
20printf("Mayor gasto: #%d ($%.2f)\n",
21 mayor + 1, sub[mayor]);
gcc -Wall -Wextra cuenta.c
$ ./a.out 12.50 8.25 45.00 3.50 20.75 2 3 1 4 2 Total: $150.25 Mayor gasto: #3 ($45.00) $ ./a.out 10 10 10 10 10 1 1 1 1 1 Total: $50.00 Mayor gasto: #1 ($10.00) $ ./a.out 5.50 40.00 2.25 3.00 1.50 10 1 8 6 20 Total: $161.00 Mayor gasto: #1 ($55.00)
precio[i], cant[i] y sub[i] hablan del mismo artículo. El mayor se busca entre los subtotales, no entre los precios.
Error típico: comparar precios en vez de subtotales. En el caso 3 elige el artículo 2 ($40.00) cuando el que más pesó fue el 1 ($55.00) (lo corrimos).
Reto 9
Escribe el programaDemografía · censos★★★20 min

Seis censos de una ciudad: ¿cuándo creció más?

Problema y datos
Se teclean los habitantes (en miles) de una ciudad en 6 censos seguidos. Encuentra entre qué dos censos consecutivos la población subió más (cambio con signo: si todos bajan, el que menos bajó; con empate, el primero), el cambio total y el cambio por censo.
Salida exacta · p con 1 decimal, con signo
Mayor cambio: <a> a <b> (<c> mil)
Cambio total: <t> mil
Por censo: <p> mil
Entregable
Programa en C
desde cero · compara datos vecinos
caso 1 · crece
$ ./a.out 120 135 150 190 205 230 Mayor cambio: 3 a 4 (40 mil) Cambio total: 110 mil Por censo: 22.0 mil
caso 2 · se despuebla
$ ./a.out 500 480 450 440 400 390 Mayor cambio: 3 a 4 (-10 mil) Cambio total: -110 mil Por censo: -22.0 mil
caso 3 · empate
$ ./a.out 100 110 120 130 140 150 Mayor cambio: 1 a 2 (10 mil) Cambio total: 50 mil Por censo: 10.0 mil
Respuesta · Reto 9
Escribe el programaDemografía · censos★★★20 min

Compara casillas vecinas, sin salirte del arreglo.

censos.c (cuerpo de main)
1int pob[6];
2int mayor;
3int donde = 0;
4 
5for (int i = 0; i < 6; i++) {
6 scanf("%d", &pob[i]);
7}
8 
9mayor = pob[1] - pob[0];
10for (int i = 1; i < 5; i++) {
11 if (pob[i + 1] - pob[i] > mayor) {
12 mayor = pob[i + 1] - pob[i];
13 donde = i;
14 }
15}
16 
17printf("Mayor cambio: %d a %d (%d mil)\n",
18 donde + 1, donde + 2, mayor);
19printf("Cambio total: %d mil\n",
20 pob[5] - pob[0]);
21printf("Por censo: %.1f mil\n",
22 (pob[5] - pob[0]) / 5.0);
gcc -Wall -Wextra censos.c
$ ./a.out 120 135 150 190 205 230 Mayor cambio: 3 a 4 (40 mil) Cambio total: 110 mil Por censo: 22.0 mil $ ./a.out 500 480 450 440 400 390 Mayor cambio: 3 a 4 (-10 mil) Cambio total: -110 mil Por censo: -22.0 mil $ ./a.out 100 110 120 130 140 150 Mayor cambio: 1 a 2 (10 mil) Cambio total: 50 mil Por censo: 10.0 mil
Se resta pob[i + 1] - pob[i]: seis censos son cinco cambios, así que el for llega a i < 5. Con i < 6 leería pob[6], que no existe.
Error típico: arrancar con mayor = 0. En el caso 2 todo baja, nada supera el 0 y sale «1 a 2 (0 mil)» (lo corrimos).
Reto 10
Escribe el programaEducación · calificaciones★★★20 min

Diez calificaciones: al revés y la más repetida.

Problema y datos
Se teclean 10 calificaciones enteras de 0 a 10. Muéstralas en orden inverso y di cuál es la moda (la que más se repite; con empate, la menor) y cuántas veces aparece. Pista: un arreglo que cuente, con la calificación como índice.
Salida exacta · espacio antes de cada número
Al reves: <c> <c> ... <c>
Moda: <m> (<n> veces)
Entregable
Programa en C
desde cero · arreglo de datos y arreglo contador
caso 1 · la moda es 8
$ ./a.out 8 9 10 8 7 8 6 9 10 5 Al reves: 5 10 9 6 8 7 8 10 9 8 Moda: 8 (3 veces)
caso 2 · empate: gana 9
$ ./a.out 10 10 9 9 8 7 6 5 4 3 Al reves: 3 4 5 6 7 8 9 9 10 10 Moda: 9 (2 veces)
caso 3 · ceros y dieces
$ ./a.out 10 0 10 0 3 3 10 7 7 10 Al reves: 10 7 7 10 3 3 0 10 0 10 Moda: 10 (4 veces)
Respuesta · Reto 10
Escribe el programaEducación · calificaciones★★★20 min

Un arreglo que cuenta: la calificación es el índice.

calificaciones.c (cuerpo de main)
1int cal[10];
2int conteo[11] = {0};
3int moda = 0;
4 
5for (int i = 0; i < 10; i++) {
6 scanf("%d", &cal[i]);
7 conteo[cal[i]]++;
8}
9 
10printf("Al reves:");
11for (int i = 9; i >= 0; i--) {
12 printf(" %d", cal[i]);
13}
14printf("\n");
15 
16for (int v = 1; v <= 10; v++) {
17 if (conteo[v] > conteo[moda]) {
18 moda = v;
19 }
20}
21printf("Moda: %d (%d veces)\n",
22 moda, conteo[moda]);
gcc -Wall -Wextra calificaciones.c
$ ./a.out 8 9 10 8 7 8 6 9 10 5 Al reves: 5 10 9 6 8 7 8 10 9 8 Moda: 8 (3 veces) $ ./a.out 10 10 9 9 8 7 6 5 4 3 Al reves: 3 4 5 6 7 8 9 9 10 10 Moda: 9 (2 veces) $ ./a.out 10 0 10 0 3 3 10 7 7 10 Al reves: 10 7 7 10 3 3 0 10 0 10 Moda: 10 (4 veces)
conteo[cal[i]]++ suma uno en la casilla de esa calificación; {0} los deja todos en cero. Para ir al revés, el for cuenta hacia atrás: i-- mientras i >= 0.
Error típico: int conteo[10]. De 0 a 10 hay 11 calificaciones; con 10 casillas, el 10 escribe fuera del arreglo.
Gracias
Walter Rosales
CEO & Co-Founder iGalenus
walter.rosales@igalenus.com
Instagram @walterr_rosales
https://walter-rosales.com