1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C Tercera Clase (Segunda de C)
Daniel Finol 2 while: el cuerpo de una instrucción while puede consistir de Una o más instrucciones encerradas entre llaves; o Una sola instrucción sin llaves. En todo caso, para que el código sea fácil de leer y entender (para el lector humano), se debe sangrar (indent) el cuerpo del while (así como cualquier sub-bloque de código) para resaltar la estructura lógica del programa. Posición de las llaves. Punto y coma(;) - 1 instrucción por línea.
Daniel Finol 3 Si sustituimos la línea: printf("%d\t%d\n", fahr, celsius); por: printf("%3d %6d\n", fahr, celsius); la tabla se imprimirá con justificación a la derecha: en vez de
Daniel Finol 4 Para tener más precisión en los datos de la tabla de conversión necesitamos trabajar con números fraccionarios en vez de enteros. Entonces la variables fahr y celsius deben cambiarse a float, sustituyendo: int fahr, celsius; por float fahr, celsius;
Daniel Finol 5 El programa quedaría así: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperatuire scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; }
Daniel Finol 6 El programa quedaría así: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperatuire scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; }
Daniel Finol 7 #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperatuire scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } Operandos enteros -> Operación Entera Operandos de punto flotante -> Operación de Punto Foltante
Daniel Finol 8 El programa quedaría así: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperatuire scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } Si uno de los operandos es de punto flotante y el otro entero,el entero se transforma en punto flotante.
Daniel Finol 9 El programa quedaría así: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperatuire scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } Así que lo podemos poner de esta manera.
Daniel Finol 10 El programa quedaría así: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperatuire scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } Con estos dos tampoco hay problema.
Daniel Finol 11 %f – imprime como punto flotante. %6f – igual pero con por lo menos 3 caracteres de amplitud. %6.1f – igual pero con una cifra después del punto. %.2 – imprime como punto flotante con dos cifras después del punto decimal.
Daniel Finol 12 printf("%3.0f %6.1f\n", fahr, celsius); imprime de esta manera:
Daniel Finol 13 Sustitución de variables por constantes... #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperatuire scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; }
Daniel Finol 14 Sustitución de variables por constantes: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; fahr = 0; while (fahr <= 300) { celsius = (5.0/9.0) * (fahr-32); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + 20; }
Daniel Finol 15 Sustitución de variable por expresión... #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr, celsius; fahr = 0; while (fahr <= 300) { celsius = (5.0/9.0) * (fahr-32); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + 20; } En cualquier contexto en el que se permita usar el valor de una variable es posible usar una expresión del mismo tipo.
Daniel Finol 16 Sustitución de variable por expresión: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr; fahr = 0; while (fahr <= 300) { printf("%3.0f %6.1f\n", fahr, (5.0/9.0) * (fahr-32)); fahr = fahr + 20; } En cualquier contexto en el que se permita usar el valor de una variable es posible usar una expresión del mismo tipo que la variable.
Daniel Finol 17 fahr -> int... #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { float fahr; fahr = 0; while (fahr <= 300) { printf("%3.0f %6.1f\n", fahr, (5.0/9.0) * (fahr-32)); fahr = fahr + 20; }
Daniel Finol 18 fahr -> int: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { int fahr; fahr = 0; while (fahr <= 300) { printf("%3.0f %6.1f\n", fahr, (5.0/9.0) * (fahr-32)); fahr = fahr + 20; }
Daniel Finol 19 while -> for... #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { int fahr; fahr = 0; while (fahr <= 300) { printf("%3.0f %6.1f\n", fahr, (5.0/9.0) * (fahr-32)); fahr = fahr + 20; }
Daniel Finol 20 while -> for: #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300; floating-point version */ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); }
Daniel Finol 21 for(inicialización; condición; incremento) cuerpo; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
Daniel Finol 22 Es una mala práctica usar “constantes literales” como: #include main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); }
Daniel Finol 23 Es mejor usar “CONSTANTES SIMBÓLICAS” como: #include #define LOWER 0 /* lower limit of table */ #define UPPER 300 /* upper limit */ #define STEP 20 /* step size */ main() { int fahr; for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); }
Daniel Finol 24 Toda entrada y salida de texto se trata como un “flujo (stream) de caracteres” Un “flujo de texto” es una secuencia de texo dividido entre líneas; cada línea consta de cero o más caracteres seguidos de un carácter “nueva línea”.
Daniel Finol 25 La función getchar (de la biblioteca estándar) lee el siguiente carácter de la entrada de una secuencia de texto y lo devuelve como su valor: c = getchar(); La función putchar escribe el contenido de una variable entera como un carácter en la salida (generalmente la pantalla). putchar(c);
Daniel Finol 26 #include /* copy input to output; 1st version */ main() { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); }
Daniel Finol 27 #include /* copy input to output; 2nd version */ main() { int c; while ((c = getchar()) != EOF) putchar(c); }
Daniel Finol 28 #include /* count characters in input; 1st version */ main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); }
Daniel Finol 29 #include /* count characters in input; 2nd version */ main() { double nc; for (nc = 0; gechar() != EOF; ++nc) ; printf("%.0f\n", nc); }
Daniel Finol 30 #include /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); }
Daniel Finol 31 #include #define IN 1 /* inside a word */ #define OUT 0 /* outside a word */ /* count lines, words, and characters in input */ main() { int c, nl, nw, nc, state; state = OUT; nl = nw = nc = 0; while ((c = getchar()) != EOF) { ++nc; if (c == '\n') ++nl; if (c == ' ' || c == '\n' || c = '\t') state = OUT; else if (state == OUT) { state = IN; ++nw; } printf("%d %d %d\n", nl, nw, nc); }