1 TÉCNICAS DE PROGRAMACIÓN Lenguaje C Tercera Clase (Segunda de C)

Preview:

Citation preview

1

TÉCNICAS DE PROGRAMACIÓN

Lenguaje CTercera Clase

(Segunda de C)

2Daniel Finol

Cuerpo del whileCuerpo del while

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.

3Daniel Finol

Más acerca de printfMás acerca de printf

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 0 -17 20 -6 40 4 60 15 80 26 100 37 ...

1 -17 20 -6 40 4 60 15 80 26 100 37 ...

4Daniel Finol

Punto flotantePunto flotante

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;

5Daniel Finol

El programa quedaría así: #include <stdio.h>

/* 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; } }

6Daniel Finol

CambiosCambios

El programa quedaría así: #include <stdio.h>

/* 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; } }

7Daniel Finol

#include <stdio.h>

/* 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 EnteraOperandos de punto flotante -> Operación de Punto Foltante

8Daniel Finol

El programa quedaría así: #include <stdio.h>

/* 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.

9Daniel Finol

El programa quedaría así: #include <stdio.h>

/* 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.

10Daniel Finol

El programa quedaría así: #include <stdio.h>

/* 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.

11Daniel Finol

Más acerca de printfMás acerca de printf

%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.

12Daniel Finol

printf("%3.0f %6.1f\n", fahr, celsius);

imprime de esta manera:

0 -17.8

20 -6.7

40 4.4

...

13Daniel Finol

Sustitución de variables por constantes... #include <stdio.h>

/* 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; } }

14Daniel Finol

Sustitución de variables por constantes: #include <stdio.h>

/* 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; } }

15Daniel Finol

Sustitución de variable por expresión... #include <stdio.h>

/* 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.

16Daniel Finol

Sustitución de variable por expresión: #include <stdio.h>

/* 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.

17Daniel Finol

fahr -> int... #include <stdio.h>

/* 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; } }

18Daniel Finol

fahr -> int: #include <stdio.h>

/* 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; } }

19Daniel Finol

while -> for... #include <stdio.h>

/* 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; } }

20Daniel Finol

while -> for: #include <stdio.h>

/* 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)); }

21Daniel Finol

La instrucción forLa instrucción for

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));

22Daniel Finol

ConstantesConstantes

Es una mala práctica usar “constantes literales” como:

#include <stdio.h>

main()

{

int fahr;

for (fahr = 0; fahr <= 300; fahr = fahr + 20)

printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));

}

23Daniel Finol

Constantes simbólicasConstantes simbólicas

Es mejor usar “CONSTANTES SIMBÓLICAS” como:#include <stdio.h>

#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));

}

24Daniel Finol

Entrada y Salida de CaracteresEntrada y Salida de Caracteres

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”.

25Daniel Finol

getchar y putchargetchar y putchar

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);

26Daniel Finol

Copia la entrada a la salidaCopia la entrada a la salida

#include <stdio.h>

/* copy input to output; 1st version */ main() { int c;

c = getchar(); while (c != EOF) { putchar(c); c = getchar(); }

}

27Daniel Finol

Copia la entrada a la salida (versión 2)Copia la entrada a la salida (versión 2)

#include <stdio.h>

/* copy input to output; 2nd version */ main() { int c;

while ((c = getchar()) != EOF) putchar(c); }

28Daniel Finol

Conteo de caracteresConteo de caracteres

#include <stdio.h>

/* count characters in input; 1st version */ main() { long nc;

nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); }

29Daniel Finol

Conteo de caracteres (versión 2)Conteo de caracteres (versión 2)

#include <stdio.h>

/* count characters in input; 2nd version */ main() { double nc;

for (nc = 0; gechar() != EOF; ++nc) ; printf("%.0f\n", nc); }

30Daniel Finol

Conteo de líneasConteo de líneas

#include <stdio.h>

/* count lines in input */ main() { int c, nl;

nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); }

31Daniel Finol

Conteo de palabrasConteo de palabras #include <stdio.h>

#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); }