ProgIng - Programación en Ingeniería
Loading...
Searching...
No Matches
Ejemplo006.c File Reference

Etiquetado de una temperatura T usando 4 umbrales (T1<T2<T3<T4) y 5 categorías. More...

#include <stdio.h>
Include dependency graph for Ejemplo006.c:

Go to the source code of this file.

Functions

int main (int argc, char *argv[])
 Punto de entrada. Clasifica la temperatura T en 5 regiones usando umbrales.

Detailed Description

Etiquetado de una temperatura T usando 4 umbrales (T1<T2<T3<T4) y 5 categorías.

El programa lee cuatro umbrales de temperatura (T1, T2, T3, T4) y luego una temperatura T que se desea clasificar. Se generan 5 regiones:

1) T < T1 -> "Muy baja" 2) T1 <= T < T2 -> "Baja" 3) T2 <= T < T3 -> "Templada" 4) T3 <= T < T4 -> "Alta" 5) T >= T4 -> "Muy alta"

La clasificación se implementa con 4 banderas booleanas (B1..B4) y se empaquetan en un código de 4 bits (B4B3B2B1) para seleccionar el mensaje mediante switch().

Entrada
Dos lecturas desde stdin:
T1 T2 T3 T4
T
Salida
Imprime un código de depuración B (y sus bits) y una etiqueta textual: "muy baja", "baja", "templada", "alta" o "muy alta".
Precondiciones
  • Se asume el orden: T1 < T2 < T3 < T4.
Complejidad
Tiempo: O(1). Memoria: O(1).
Note
Si los umbrales no están ordenados, pueden aparecer códigos no contemplados y el programa podría no imprimir etiqueta (cae en default).

Definition in file Ejemplo006.c.

Function Documentation

◆ main()

int main ( int argc,
char * argv[] )

Punto de entrada. Clasifica la temperatura T en 5 regiones usando umbrales.

Parameters
argcNo usado.
argvNo usado.
Returns
0 si termina correctamente.

Definition at line 48 of file Ejemplo006.c.

49{
50 (void)argc;
51 (void)argv;
52
53 /*
54 T1, T2, T3, T4: Umbrales de temperatura que delimitan 5 regiones.
55 - T1: umbral inferior (más frío)
56 - T4: umbral superior (más caliente)
57 - Se asume el orden: T1 < T2 < T3 < T4
58
59 T: temperatura a clasificar (etiquetar).
60 */
61 float T1, T2, T3, T4, T;
62
63 /*
64 B1..B4 son banderas (booleanos como enteros 0/1) que indican si T es menor
65 que cada umbral, usando comparaciones del tipo (Ti > T).
66
67 Ejemplo:
68 B1 = (T1 > T) -> 1 si T es menor que T1
69 0 si T es mayor o igual que T1
70 */
71 int B1, B2, B3, B4;
72
73 /*
74 B será un "código" de 4 bits (B4 B3 B2 B1) que identifica en qué intervalo cae T.
75 Luego se usa switch(B) para imprimir la etiqueta.
76 */
77 int B;
78
79 /* --- Lectura de umbrales --- */
80 printf("Ingrese los rangos de temperaturas: ");
81 scanf("%f %f %f %f", &T1, &T2, &T3, &T4);
82
83 /* --- Lectura de la temperatura a evaluar --- */
84 printf("Ingrese la tempratura: ");
85 scanf("%f", &T);
86
87 /*
88 Se calcula cada bandera:
89 - B1 = 1 si T < T1
90 - B2 = 1 si T < T2
91 - B3 = 1 si T < T3
92 - B4 = 1 si T < T4
93
94 (Usa Ti > T, que es equivalente a T < Ti)
95 */
96 B1 = (T1 > T);
97 B2 = (T2 > T);
98 B3 = (T3 > T);
99 B4 = (T4 > T);
100
101 /*
102 Empaquetar (B4 B3 B2 B1) en un entero B usando desplazamientos:
103 B4 << 3 coloca B4 en el bit 3 (valor 8)
104 B3 << 2 coloca B3 en el bit 2 (valor 4)
105 B2 << 1 coloca B2 en el bit 1 (valor 2)
106 B1 queda en el bit 0 (valor 1)
107
108 Resultado:
109 B = (B4*8) + (B3*4) + (B2*2) + (B1*1)
110 */
111 B = (B4 << 3) | (B3 << 2) | (B2 << 1) | (B1);
112
113 /* Depuración: imprime B y sus bits B4B3B2B1 */
114 printf("%d (%d%d%d%d)\n", B, B4, B3, B2, B1);
115
116 printf("La temperatura es ");
117
118 /*
119 Para T1<T2<T3<T4, los códigos típicos son:
120 T < T1 -> 1111 (15) -> "muy baja"
121 T1<=T<T2 -> 1110 (14) -> "baja"
122 T2<=T<T3 -> 1100 (12) -> "templada"
123 T3<=T<T4 -> 1000 ( 8) -> "alta"
124 T>=T4 -> 0000 ( 0) -> "muy alta"
125 */
126 switch (B)
127 {
128 case 15:
129 printf("muy ");
130 /* fall-through intencional: completa con "baja" */
131 case 14:
132 printf("baja\n");
133 break;
134
135 case 12:
136 printf("templada\n");
137 break;
138
139 case 0:
140 printf("muy ");
141 /* fall-through intencional: completa con "alta" */
142 case 8:
143 printf("alta\n");
144 break;
145
146 default:
147 /* Código no contemplado (p.ej. umbrales desordenados) */
148 break;
149 }
150
151 printf("\n");
152 return 0;
153}