Capítulo 5 ESTRUCTURAS DE SELECCIÓN: SENTENCIAS IF Y SWITCH EJEMPLO 5.1.. int main() { int n, d; printf( "Introduzca dos enteros: "); scanf("&d &d",&n,&d); if (n%d == 0) printf(" %d es divisible por %d\n",n,d); return 0; } Ejecución Introduzca dos enteros: 24 4 24 es divisible por 4 EJEMPLO 5.2.. #include <stdio.h> int main() { int x, y; printf( "Introduzca dos enteros: "); scanf("%d %d",&x,&y); if ( x > y) printf("%6d\n", x); else printf("%6d\n", y); return 0; } Ejecución Introduzca dos enteros: 17 54 54 EJEMPLO 5.3 x == y ? f1(x) : f(x,y); es equivalente a la siguiente sentencia: if ( x == y ) 1 f1( x ); else f2( x , y); PROBLEMAS RESUELTOS 5.1. La expresión correcta debe ser la siguiente: if (x > 25.0 ) y = x; else y = z; Por tanto le falta los paréntesis en la expresión lógica y un punto y coma después de la sentencia de asignación y = x 5.2 . Si velocidad toma el valor de 120 entonces necesariamente consumo debe tomar el valor de 12.00 5.3. El error que presente la sentencia es que x < y < z no es una expresión lógica. Debería haberse puesto (x < y) && (y < z). 5.4. Para el primer caso aparece escrito Chuleta lechal Para el segundo caso aparece escrito Chuletón y en la siguiente línea Postre de pastel, ya que case 3: no lleva la orden break. 5.5. #include <stdio.h> int main() { int nota; printf(" dame nota: "); scanf("%d", &nota); if (nota < 100) printf(" Baja "); else if (x >100) printf("Alta"); return 0; } 5.6. 2 #include <stdio.h> int main() { int n1,n2,n3, mayor; puts(" introduzca tres nuumeros "); scanf(" %d %d %d", &n1, &n2,&n3); mayor = n1; if(mayor < n2) mayor = n2; if(mayor < n3) mayor = n3; printf(" el mayor es %d\n", mayor); return 0; } 5.7: #include <stdio.h> int main() { int x = 10; if (x < 0) printf("%d es negativo\n",x); else if (x <= 100) printf("0 <= x = %d <= 100\n", x); else printf("x = %d > 100\n", x); return 0; } 5.8. #include <stdio.h> // función primo int primo( int x) { int d = 2; // los únicos primos son los que son divisibles // por si mismos y por la unidad. while ( x %d != 0) d++; return (d == x); } // función potencia de dos int p2( int x) { int d = 2; while ( x %d == 0) x = x / 2; return (x == 1); } // programa principal int main() 3 { int x; puts(" introduzca numero entero \n"); scanf(" %d ", &x); if (x < 0) printf("%d es negativo\n", x); else if (x > 30) printf(" x = %d > 30\n",x); elseif (primo(x)) { if (x == 2) printf("x= %d es primo y potencia de dos\n",x); else printf("x = %d es primo y no potencia de dos \n", x); } else if (p2( x )) printf("x = %d es compuesto y potencia de dos\n", x); else printf("x = %d es compuesto y no potencia de dos\n",x); return 0; } 5.9. #include <stdio.h> int bisiesto( int x); int main() { int x; puts(" introduzca año entero \n"); scanf(" %d", &x); if (bisiesto(x)) printf("%d es bisiesto\n", x); else printf (" %d no es un año bisiesto \n", x); return 0; } int bisiesto( int x) { if (x % 400 ==0) return 1; else if (x % 100 == 0) return 0; else return (x % 4 == 0); } 5.10. #include <stdio.h> int bisiesto( int a); int ndd( int m, int a) 4 { switch (m) { case 1,3,5,7,8,10,12: return (31); case 2: if (bisiesto(a)) return (29); else return (28); default: return (30); } } int main() { int m, a; do { puts(" introduzca año entero \n"); scanf(" %d", &a); } while (a < 0); do { puts(" introduzca mes entero \n"); scanf(" %d", &m); } while (( m < 1) || (m > 12)); puts( "el numero de días"); printf(" del mes %d del año %d es:\n", m, a); printf (" %d ", ndd(m,a)); return 0; } 5.11. #include <stdio.h> int bisiesto( int x) ; int main() { int mes, ano; puts(" introduzca mes entre 1 y 12 \n"); scanf(" %d", &mes); puts(" introduzca año \n"); scanf(" %d", &ano); if (mes == 2) if(bisiesto(ano)) printf(" tiene 29 dias\n"); else printf(" tiene 28 dias\n"); else if((mes == 4) || (mes == 6) || (mes == 9) || (mes == 11)) printf(" tiene 30 dias \n"); else printf(" tiene 31 dias \n"); return 0; } 5 5.12 . #include <stdio.h> #include <math.h> int main() { float a, b, c, d, x1,x2; puts(" introduzca los tres coeficientes\n"); scanf("%f %f %f", &a, &b, &c); if (a != 0) { d = b * b – 4 * a * c; if (d > 0) { printf( " dos soluciones reales y distintas\n"); x1 = (-b + sqrt(d)) / (2 * a); x2 = (-b - sqrt(d)) / (2 * a); printf(" x1= %6.2f x2= %6.2f\n", x1, x2); } else if(d == 0) { printf( " dos soluciones reales e iguales\n"); x1 = (-b) / (2 * a); printf( " x= %6.2f\n", x1); } else { printf(" no tiene solucion real\n"); printf( " tiene dos soluciones complejas \n"); x1 = -b / (2 * a); x2 = sqrt(-d) / (2 * a); printf(" primera solucion\n"); printf(" parte real %6.2f\n", x1); printf(" parte imaginaria %6.2f\n",x2); printf(" segunda solucion\n"); printf(" parte real %6.2f\n", x1); printf(" parte imaginaria %6.2f \n",-x2); } } else if (b != 0) printf (" una solucion simple= %6.2f \n", -c / b); else if (c == 0) printf( " se introdujo la identidad 0 = 0\n"); else printf(" sin solucion\n"); return 0; } 5.13. #include <stdio.h> void main() { float x; printf(" dame dato\n"); scanf("%f", &x); 6 if( x < 0 ) printf(" menor que cero "); if ( x > 0 ) printf("mayor que cero"); } 5.14 . #include <stdio.h> void main() { float x, y, z; printf(" dame tres datos\n"); scanf("%f %f %f", &x,&y,&z); if( ( x <= y) && ( y <= z) ) printf(" ordenados "); else printf("no ordenados"); } 5.15 #include <stdio.h> void main() { float nota; printf(" dame nota\n"); scanf("%f", &nota); if(( nota < 0.0 ) || ( nota > 10 )) printf(" error en nota "); else if ( nota < 5.0 ) printf("Suspenso"); else if( nota < 6.5 ) printf("Aprobado"); else if ( nota < 8.5) printf("Notable"); else if ( nota < 10) printf("Sobresaliente"); else printf("Matricula de Honor"); } 5.16 . #include <stdio.h> void main() { float x, Mayor; int i; printf(" dame numero\n"); scanf("%f" , &Mayor); for(i = 2; i <= 5; i++) { printf(" dame numero\n"); scanf("%f" , &x); if( Mayor < x) 7 Mayor = x; } printf(" el mayor es %f\n", Mayor); } 5.17: #include <stdio.h> void main() { float Horas, Extras, Tasa, SalarioBruto, SalarioNeto; printf(" dame Horas\n"); scanf("%f" , &Horas); if ( Horas <= 38 ) Extras = 0; else { Horas = 38; Extras = Horas - 38; } printf("introduzca Tasa\n"); scanf("%f",&Tasa); SalarioBruto = Horas * Tasa + Extras * Tasa * 1.5; if (SalarioBruto < 50000.0) SalarioNeto = SalarioBruto; else SalarioNeto = SalarioBruto * 0,9; printf(" Salario bruto %f \n", SalarioBruto); printf(" Salario neto %f \n", SalarioNeto) ; } 5.18 . Arranque Hola desde el segundo if Fin Arranque de nuevo De nuevo fin 5.19 . El error está determinado porque el else no está bien enlazado con el if. O bien se elimina una de las dos sentencias o bien se pone llaves, como se indica a continuación. #include <stdio.h> void main() { int n; printf("Introduzca n:"); scanf("%d", &n); if ( n < 0 ) { puts("Este número es negativo. Pruebe de nuevo ."); scanf("%d", &n); } 8 else printf("conforme. n= %d\n", n); } 5.20 . La sentencia anterior tiene de incorrecta que x = 0 es una sentencia de asignación y no es una expresión lógica. Lo que el programador es probable que haya querido poner es: if (x == 0) printf("%d = 0\n", x); else printf("%d = 0\n", x); 5.21 #include <stdio.h> void main() { int nota1,nota2,nota3,nota4; float media; printf("Dame nota 1 "); scanf("&d", &nota1); printf("Dame nota 2 "); scanf("&d", &nota2); printf("Dame nota 3 "); scanf("&d", &nota3); printf("Dame nota 4 "); scanf("&d", &nota4); media = (float)(nota1 + nota2 + nota3 + nota4) / (float)4; if(( media < 0) || ( media > 100 )) printf("fuera de rango "); else if( media >= 90) printf(" media = %f A", media); else if(media >= 80) printf(" media = %f B", media); else if(media >= 70) printf(" media = %f C", media); else if(media >= 60) printf(" media = %f D", media); else printf(" media = %f E", media); } 9