Make your own free website on Tripod.com

Programación Estructurada

Unidad I. Paradigmas de la programación estructurada.

1.1 Programación modular y programación estructurada.
1.2 Funciones generales.
1.3 Estructura básica de un programa.
1.4 Zonas de memoria.

1.4.1 Variables.
1.4.2 Constantes.

1.5 Operadores.

1.5.1 Operadores de asignación y expresión.
1.5.2 Operadores aritméticos, de relación y lógicos.
1.5.3 Jerarquía de operadores.

1.6 Expresiones básicas.

1.6.1 Instrucciones de asignación, entrada/salida.
1.6.2 Expresiones aritméticas.
1.6.3 Funciones matemáticas.
1.6.4 Sentencias y bloques.

1.7 Estructuras selectivas.

1.7.1 if().
1.7.2 else if().
1.7.3 switch case

Unidad II. Elementos básicos de un lenguaje imperativo de programación (control y arreglos)

2.1 Estructuras de control.

2.1.1 Teoría de ciclos.
2.1.2 Contadores, acumuladores.
2.1.3 Ciclos controlados por contadores, centinelas.

2.2 Tipos de ciclos.

2.2.1 while y for.
2.2.2 do()-while.

2.3Anidaciones.
2.4 Introducción a los arreglos.
2.5 Arreglos unidimensionales.
2.6 Arreglos bidimensionales.
2.7 Arreglos multidimensionales.

Unidad III. Funciones

3.1 Forma general de una función.

3.1.1 Funciones predefinidas.
3.1.2 Funciones creadas por el programador.

3.2 Prototipos de funciones.

3.2.1 Alcance de las variables.

3.3 Argumentos y parámetros de las funciones.
3.4 Recursividad.

Unidad IV. Estructuras.

4.1 Definición de estructura.
4.2 Acceso a los miembros de una estructura.
4.3 Estructuras con funciones.
4.4 arreglos y estructuras dentro de las funciones.
4.4 enumeraciones.
4.5 Uniones.
4.6 Tipos de datos definidos por el usuario.

Unidad V. Punteros

5.1 Introducción.
5.2 Declaración e inicialización de variables de punteros.
5.3 Operadores de apuntadores.
5.4 Llamar funciones por referencia.
5.5 Expresiones de apuntadores y aritmética de apuntadores.
5.6 Relación entre Arreglos y apuntadores.
5.7 Aplicación de llamada por referencia a funciones.

Unidad VI. Archivos

6.1 Jerarquía de los datos.
6.2 Archivos texto(secuenciales).
6.3 Archivos binarios(Directos).
6.4 Aplicaciones.

Bibliografia

Inicio


Unidad I. Paradigmas de la programación estructurada

1.1 Programación modular y programación estructurada

Programación modular

La programación modular conciste en dividir un programa en módulos. Es un metodo de diseño que tiende a dividir el problema, de forma lógica, en partes perfectamente diferenciadas que pueden ser analizadas, programadas y puestas a punto independientemente.

La división de un programa en módulos o programas independientes exige otro módulo que controle y relacione a todos los demás, es el denominado módulo base o principal del problema.

Realmente la programación modular es un intento para diseñar programas, de forma tal que cualquier función lógica pueda ser intercambiada sin afectar a otras partes del programa.

Las ventajas de la programación modular se resumen en la tabla 1.1.

Ventajas de la programación modular
Un programa es mas facil de escribir y depurar (ejecutar, probar y poner a punto). Se puede profundizar en las pruebas parciales de cada módulo mucho más de que se hace en un programa mayor.
Un programa modular es facil de mantener y modificar.
Un programa modular es facil de controlar. El desglose de un problema en módulos permite encomendar los modulos mas complejos a programadores más experimentados y los más sencillos a los programadores más noveles.
Posibilita el uso repetitivo de las rutinas en el mismo o en diferentes programas.

Tabla 1.1 Ventajas de la programación modular

Los incovenientes se resumen en la tabla 1.2.

Inconvenientes de la programación modular
No se disponen de algortimos formales para aplicar la modularidad, por lo que a veces los programadores no tienen claras las ideas de los módulos.
La programación modular requiere más memoria y tiempo de ejecución.

Tabla 1.2 Inconvenientes de la programación modular

Una síntesis de los objetivos de la programación modular se muestran en la tabla 1.3.

Objetivos de la programación modular
Disminuir la complejidad.
Aumentar la claridad y fiabilidad.
Aumentar el control del proyecto.
Facilitar la ampliacion del programa mediante nuevos modulos.
Facilitar la ampliacion del programa mediante nuevos modulos.
Facilitar las modificaciones y correcciones al quedar automaticamente localizadas en un modulo.

Tabla 1.3 Objetivos de la programación modular

Por último, la definición de módulo es:

"Un módulo esta constituido por una o varias instrucciones fisicamente contiguas y logicamante encadenadas, las cuales se pueden referenciadas mediante un nombre y pueden ser llamadas desde diferentes puntos del programa"

Un módulo puede ser un programa, una función o una subrutina (procedimiento).

Programación estructurada

Para aumentar la eficiencia de la programación y matenimiento de los programas estos deben tener una estructura. Esto asegurara, adicionalmente, que los programas sean adaptables, manejables, facilmente comprensibles y transportables. A estas condiciones se les suele llamar claridad y simplicidad.

La programación estructurada es:

"Una técnica de construcción de programas que utiliza al máximo los recursos del lenguaje, limita el conjunto de estructuras aplicables a leer y presenta una serie de reglas que coordinan adecuadamente el desarrollo de las diferentes fases de la programación"

La programación estructurada utiliza en su diseño:

  1. Estructuras básicas de control.
  2. Recursos abstractos.
  3. Diseño descendente "arriba-abajo" (top-down).

Estructuras Básicas de Control

Las estructuras básicas se muestran en las tablas 1.4, 1.5 y 1.6.

Estructura Secuencial

Tabla 1.4 Estructura secuencial

Condicional Simple
Condicional Doble
Condicional Múltiple

Tabla 1.5 Estructuras Condicionales

Ciclo Mientras
Ciclo Repetir

Tabla 1.6 Estructuras repetitivas

Recursos Abstractos

La estructuración debe complir el uso de recursos abstractos. El proceso de realización de diferentes pasos hasta encontrar la solución de un problema es un proceso abstracto.

Diseñar o concebir un problema en terminos abstractos conciste en no tener en cuenta la maquina que lo va a resolver asi como el lenguaje de programación que se va a utilizar. Esto lleva consigo la obtención de un conjunto de acciones que se han de realizar para obtener una solución.

Al considerar un algoritmo y los calculos que se incluyen, se hace una abstracción de los valores especificos. Igualmente el concepto de variable implica una abstracción cuando se da un nombre a una operación determinada, y se utiliza considerando lo que hace pero sin preocuparnos de como lo hace.

Tras encontrar la solución adecuada mediante diagramación o el algortimo, se analiza esta solución con la computadora y el lenguaje de programación que se van a utilizar, a fin de comprobar si diferentes acciones son susceptibles de ser ejecutadas por la maquina tal y como han sido concebidas, si eso no fuera posible, será preciso descomponer las acciones en otras subacciones más elementales, continuandose con el proceso hasta que cada subacción pueda ser codificada en el lenguaje elegido y por consiguiente ejecutado en la computadora.

Metodología Descendente "Arriba-Abajo" (top-down)

La metodología o diseño descendente (top-down), tambien conocida como arriba-abajo conciste en establecer una serie de niveles de menor o mayor complejidad (arriba-abajo) que den solución al problema. En esencia conciste en efectuar una relación entre las etapas de la estructuración de forma que una etapa jerárquica y su inmediatamente inferior se relacionen mediante entradas y salidas de información.

Un programa estructurado tiene una representación en forma de árbol.

Representación de arbol de un programa estructurado

Tabla 1.7 El árbol de un programa estructurado

La marcha analítica de un proceso descendente estaria basada en dos caracteristicas esenciales: representación en forma de árbol y descomposición funcional. El diseño se basa en la realización de varios niveles. El primer nivel resuelve totalmente el problema y el segundo y sucesivos son refinamientos sucesivos del primero (stepwise) y se sigue siempre la metodologia de recursos abstractos. Si el diseño y planteamiento es correcto nunca será preciso volver atras ya que los niveles anteriores al que se este situado en un momento dado ya habra resuelto el problema en su totalidad.

La realización del diseño estructurado de un programa se basa en la aplicación de los siguientes conceptos:

  1. Ir de los general a lo particular, descendiendo en la estructura del programa.
  2. De la definición inicial del problema se pasa a un esquema de algoritmo descrito en pseudocodigo.
  3. Independencia inicial del lenguaje.
  4. Diseño por niveles, dejando detalles para niveles posteriores. Verificando en cada nivel el esquema correcto.
  5. Finalizar con un trabajo de recomposición del algortimo completo.

Inicio


1.2 Funciones generales
1.3 Estructura básica de un programa

Un programa en C puede tener muchas variantes. Aun así se pueden identificar las siguientes secciones: Librerias, Constantes, Variables, Funciones y la función main. El siguiente formato es el sugerido: definir las librerias, definir las constantes, definir las variables, definir y especificar las funciones y por ultimo las escritura de la función main.

Estructura de un programa en lenguaje C

Tabla 1.8 Estructura de un programa en C

Librerias

Esta sección es utilizada para incluir funciones proporcionadas, en archivos denominadas librerias, por el paquete del compilador utilizado.

Para especificar la intencion de incluir una libreria se escribe la frase #include seguido del nombre de la libreria (archivo) entre los simbolos menor que (<) y mayor que (>). Ejemplo #include <stdio.h>.

Constantes

Esta sección es utilizada para definir las constantes que el programa utilizara. Vease zonas de memoria.

Variables

Esta seccón es utilizada para definir las variables globales a utilizar por el programa (variables globales). Vease zonas de memoria.

Funciones

Esta sección es utilizada para definir y especificar el cuerpo de las funciones utilizadas por el programa. Vease funciones.

La función main

La función main es la primer función que el lenguaje C localiza para iniciar la ejecucion del programa. Dado que el resto de las funciones seran utilizadas por ella o por otras y el lenguaje C no permite usar una función que no este definida antes, la función main debe ser la última.

Ejercicio Identificar las secciones dentro de un programa escrito en lenguaje C.

Inicio


1.4 Zonas de memoria

Los programas de computadoras contienen ciertos valores que no deben cambiar durante la ejecución de un programa. Tales valores se llaman constantes. De igual manera, existen otros valores que cambiaran durante la ejecución del programa; a estos valores se les llama variables.

1.4.1 Variables
Nombres de variables

Cada variable tiene un nombre y un valor. El nombre identifica la variable, el valor del dato almacenado. Existe una limitación para estos nombres. Cada nombre de variable en C debe comenzar con una letra, el resto del nombre puede consistir en letras, números y caracteres de la raya. Para C las mayúsculas y minúsculas son diferentes. Finalmente, no se pueden utilizar las palabras claves (reservadas) de C como main, while, switch, etc para nombres variables.

Palabras reservadas del lenguaje C

Tabla 1.9 Palabras reservadas del lenguaje C

Ejemplos de nombres variables legales son:

Generalmente se evita el uso de mayúsculas en nombres variables. Éstas se utilizan para los nombres de constantes. Algunas viejas versiones de C utilizan solamente los primeros 8 caracteres de un nombre variable. La mayoría modernos don't aplican este límite sin embargo.

Nota: Las reglas que gobiernan nombres variables también se aplican a los nombres de funciones.

Tipos de Datos

Tipo de dato

Tamaño
Rango
unsigned char
8
0 a 255
char
8
-128 a 127
enum
16
-32,768 a 32,767
unsigned int
16
0 a 65,535
short int
16
-32,768 a 32,767
int
16
-32,768 a 32,767
unsigned long
32
0 a 4,294,967,295
long
32
-2,147,483,648 a 2,147,483,647
float
32
3.4 x 10-38 a 3.4 x 10+38
double
64
1.7 x 10-308 a 1.7 x 10+308
long double
80
3.4 x 10-4932 a 1.1 x 10+4932

Tabla 1.10 Tipos de datos

Declaración de Variables

La declaración de variables sigue la sintaxis:

tipo_de_dato nombre_variable[= valor_inical, nombre_variable2[= valor_inicial],...];

En C, una variable debe ser declarada antes de que pueda ser utilizada. Las variables se pueden declarar en el comienzo de cualquier bloque del código, pero la mayoría se encuentran en el comienzo de cada función. Se crean cuando se llama la función y se destruyen cuando termina su ejecución. Una declaración comienza con el tipo, seguido por el nombre de unas o más variables. Por ejemplo:

int alta, baja, resultados[20];

Los declaraciones se pueden separar, permitiendo espacio para un comentario explicativo. Las variables se pueden también inicializar cuando se declaran, esto es, agregando un igual y el valor requerido después del declaración.

int alta= 250; /* Maxima Temperatura */
int baja= -40; /* Minima Temperatura */
int resultados[20]; /* Serie de temperaturas leidas*
1.4.2 Constantes.

Una constante de C es generalmente la versión escrita de un número. Por ejemplo 1, 0, 5.73, 12.5e9. Podemos especificar nuestras constantes en octal o hexadecimal, o forzarlas para ser tratados como números enteros largos.

Las constantes de carácter son justamente el carácter entre apóstrofes; 'a', 'b', 'c'. Algunos caracteres no pueden ser representados de esta manera, así que utilizamos una secuencia de 2 caracteres (secuencia de escape).

Secuencia
Caracter equivalente
'\n'
Nueva línea
'\t'
Tabulación
'\\'
Barra invertida
'\''
Comilla simple
'\0'
Carácter nulo (Usado para terminar una cadena de caracteres automaticamente)
'\a'
Alarma (bocina de la pc)
'\b'
Backspace
'\f'
Alimentación de hoja
'\r'
Retorno de carro
'\v'
Tabulador vertical
'\"'
Comillas dobles
'\xoo'
Número hexadecimal
'\ooo'
Número octal

Tabla 1.10 Secuencias de escape

Además, un patron de bits se puede especificar usando su equivalente octal.

'\044' produce el patron de bits 00100100.

Las constantes de carácter se utilizan raramente, puesto que las constantes de cadena de caracteres son más convenientes. Una constante de cadena de caracteres es rodeada por comillas dobles ej. "Brian y Dennis". La cadena se almacena realmente como un arreglo de caracteres. El carácter nulo '\0' se coloca automáticamente en el extremo de tal secuencia para actuar como un símbolo de fín de cadena.

Un carácter es un tipo de dato diferente una cadena de un caracter.

Declaración de constantes

La declaración de constantes sigue la siguiente sintaxis:

#define nombre_constante valor_constante

Ejemplos:

#define PI 3.141516
#define MAX_LONGITUD 50
#define ALARMA '\a'
#define NUEVA_LINEA '\n'
#define DOBLE_RAYA_HORIZONTAL 205

Tambien utilizando la frase const en la declaración de una variable. Ejemplo:

const double e = 2.71828182845905;

const char msg[] = "precaución: "

Ejercicios Identificar errores en la declaración de variables y contantes y uso de tipos de datos en un programa escrito en Lenguaje C.

Inicio


1.5 Operadores

1.5.1 Operadores de asignación y expresión
Operadores de Asignación *
Prioridad
Símbolo
Tipo
Operador
Ejemplo
Significado
Nivel 1
=
Binario
Asignación simple
x = y
El valor de y asignaselo a x
*=
Binario
Multiplicar y asignar
x *= y
Asignale a x la multiplicacion de x por y
/=
Binario
Dividir y asignar
x /= y
Asignale a x la división de x sobre y
%=
Binario
Modulo y asignar
x %= y
Asignale a x el modulo de x sobre y
Nivel 2
+=
Binario
Sumar y asignar
x += y
Asignale a x la suma de x con y
-=
Binario
Restar y asignar
x -= y
Asignale a x la resta de y a x

* Datos tomados de Borland Turbo C++ 3.0.

1.5.2 Operadores aritméticos, de relación y lógicos
Operadores Aritméticos *
Prioridad
Símbolo
Tipo
Operador
Ejemplo
Significado
Nivel 1
+
Unario
Positivo
+5
Cinco positivo
-
Unario
Negativo
-5
Cinco negativo
++
Unario
Incremento
a++
Incrementar a en 1
--
Unario
Decremento
a--
Decrementar a en 1
Nivel 2
*
Binario
Multiplicación
a * b
Multiplicar a con b.
/
Binario
División
a / b
Dividir a sobre b.
%
Binario
Modulo
a % b
Lo que sobra de la division de a sobre b
Nivel 3
+
Binario
Suma
a + b
Sumar a con b
-
Binario
Resta
a - b
Restar b de a

* Datos tomados de Borland Turbo C++ 3.0.

 

Operadores Relacionales *
Prioridad
Símbolo
Tipo
Operador
Ejemplo
Significado
Nivel 1
<
Binario
Menor que
A < B
Verdadero si A es menor que B
<=
Binario
Menor o igual que
A <= B
Verdadero si A es mayor o igual que B
>
Binario
Mayor que
A > B
Verdadero si A es mayor que B
>=
Binario
Mayor o igual que
A >= B
Verdadero si A es mayor o igual que B
Nivel 2
==
Binario
Igual que
A == B
Verdadero si A es igual que B
!=
Binario
Diferente de
A != B
Verdadedi si A es diferente de B

* Datos tomados de Borland Turbo C++ 3.0.

 

Operadores Lógicos *
Nivel
Símbolo
Tipo
Operador
Ejemplo
Significado
Nivel 1
!
Unario
Negación
!A
Verdadero si A es falso o falso si A es verdadero
Nivel 2
&&
Binario
And
A && B
Verdadero si A y B son verdaderos (los dos tiene que ser verdad).
Nivel 3
||
Binario
Or
A || B
Verdadero si A o B son verdaderos (al menos uno es verdad).

* Datos tomados de Borland Turbo C++ 3.0.
 
1.5.4 Jerarquía de operadores
Precedencia de los Operadores *
Prioridad
Símbolo
Tipo
Operador
Ejemplo
Significado
Nivel 1
!
Unario
Negación
!A
Verdadero si A es falso o falso si A es verdadero
+
Unario
Negativo
+5
Cinco positivo
-
Unario
Positivo
-5
Cinco negativo
++
Unario
Incremento
a++
Incrementar a en 1
--
Unario
Decremento
a--
Decrementar a en 1
Nivel 2
*
Binario
Multiplicación
a * b
Multiplicar a con b.
/
Binario
División
a / b
Dividir a sobre b.
%
Binario
Modulo
a % b
Lo que sobra de la division de a sobre b
Nivel 3
+
Binario
Suma
a + b
Sumar a con b
-
Binario
Resta
a - b
Restar b de a
Nivel 4
<
Binario
Menor que
A < B
Verdadero si A es menor que B
<=
Binario
Menor o igual que
A <= B
Verdadero si A es mayor o igual que B
>
Binario
Mayor que
A > B
Verdadero si A es mayor que B
>=
Binario
Mayor o igual que
A >= B
Verdadero si A es mayor o igual que B
Nivel 5
==
Binario
Igual que
A == B
Verdadero si A es igual que B
!=
Binario
Diferente de
A != B
Verdadedi si A es diferente de B
Nivel 6
&&
Binario
And
A && B
Verdadero si A y B son verdaderos (los dos tiene que ser verdad).
||
Binario
Or
A || B
Verdadero si A o B son verdaderos (al menos uno es verdad).
Nivel 7
=
Binario
Asignación simple
x = y
El valor de y asignaselo a x
*=
Binario
Multiplicar y asignar
x *= y
Asignale a x la multiplicacion de x por y
/=
Binario
Dividir y asignar
x /= y
Asignale a x la división de x sobre y
%=
Binario
Modulo y asignar
x %= y
Asignale a x el modulo de x sobre y
+=
Binario
Sumar y asignar
x += y
Asignale a x la suma de x con y
-=
Binario
Restar y asignar
x -= y
Asignale a x la resta de y a x

* Datos tomados de Borland Turbo C++ 3.0.

Inicio


1.6 Expresiones básicas

1.6.1 Instrucciones de asignación, entrada/salida
int printf ( const char *format [, argument, ...]);

La función printf hace lo siguiente:

Esta funcion aplica el primer especificador de formato al primer argumento, el segundo especificador al segundo argumento, el tercero al tercero, etc., hasta al final del formato.

Nota: Deben existir los suficientes argumentos para cada especificador de formato.

Nota: El exceso de argumentos ( mas de los requeridos por los especificadores de formato) son ignaroados.

Especificadores de Formato [const char *format]

Sigue la sintaxis:

% [flags] [width] [.prec] type_char

Cada especificador de formato inicia con el carácter de porcentaje (%).

El % va seguido de:

Componente
Significado
[flags]

(Opcional) caracteres de banderas.

Justificacion de la salida, signo en los numeros, punto decimal, ceros a la izquierada decimal, ceros de relleno, octal y hex prefijos.

[width]

(Opcional) Especificador del ancho.

El minimo numero de caracteres a imprimir, rellenando con ceros o espacios en blanco.

[.prec]

(Opcional) Especificador de precision.

Numero maximo de caracteres a imprimir; para enteros, minimo numero de digitos a imprimir.

type_char
(Requerido) Caracter para el tipo de conversion.

Caracteres de banderas [flags]

Especifican la justificacion de la salida, signo numerico, punto decimal, ceros a de relleno y prefijos octal y hexadecimal.

Los caracteres de baderas pueden aparecer en cualquier orden.

Bandera
Significado
-

Justifica a la izquierda el resultado, imprime espacios en al derecha.
Si se omite, el resultado se justifica a la derecha, imprime espacios en la izquierda.

+

Muestra el resultado con signo. (+) valores positivos o (-) valores negativos.

blanco

Si el valor es no negativo, la salida inicia con espacios sin un (+); los valores negativos inician con (-).

0
Imprime ceros de relleno.

El mas (+) tiene precedencia sobre blanco( ) en el caso que ambos sean especificados.

Especificadores de ancho [width]

Los especificadores ancho colocan el ancho minimo para la salida de un valor. value.

El ancho es especificado en una de la siguientes formas:

Si usa un asterisco, el siguiente argumento en la llamada ( el cual debera ser un entero) especificara el ancho minimo para la salida.

Si el resultado de la conversion es mas ancho que el especificador, el campo se expande para contener la conversion.

Especificar de Precision [.prec]

Coloca el máximo numero de caracteres ( o minimo numero de digitis enteros) se van a imprimir.

Un especificador de precision debe iniciar con el caracter punto (.) para separarlo de cualquier especificador de ancho.

Asi, como [width], precision es especificado en una de las dos formas:

Si usa un asterisco, el siguiente argumento en la llamada ( el cual debera ser un entero) especificara el ancho minimo para la salida.

[.prec]
Significado
(none)

La precision es por omision:
= 1 para los tipos d, i, o, u, x, X.
= 6 para los tipos e, E, f.
= Todos los digitos significativos para los tipos g, G.
= Imprime hasta el primer caracter null en los tipos s.
= No tiene efecto en los tipos c.

.0

Para los tipos d, i, o, u, x, la precision es colocada por omision; para los tipos e, E, f, no se imprime el punto decimal.

.n

n caracteres o n lugares decimal son impresos. Si el valor de salida tiene mas de n caracteres la salida podria ser truncada o redondeada. (Si esto
sucede depende del tipo caracter).

*
En la lista de argumentos la precision es indicada la precision, este debera seguir despues del argumento que esta siendo formateado.

[.prec] afecta la conversion de la siguiente manera:

Caracter del tipo
Efecto de [.prec] (.n) sobre la conversión
d
o
u
x
X

Especifica que al menos n digitos son impresos.
Si un argumento de entrada tiene menos que n digitos,
el valor de salida será rellenada con espacios o ceros.
Si un argumento de entrada tiene más de n digitos, la salida no es truncada.

e
E
f

Especifica que n caracteress son impresos despues del punto decimal, y el ultimo digito es redondeado.

g
G

Especifica que los n digitos mas significativos son impresos.

c
No tiene efecto sobre la salida.
s
Especifica que no mas de n caracteres son impresos.

Caracteres para el tipo de conversión (type_char)

Caracter del tipo
Salida esperada
Formato de salida

Numéricos

d
Entero

Entero decimal con signo.

i
Entero

Entero decimal con signo.

o
Entero
Entero octal sin signo.
u
Entero
Entero decimal sin signo..
x
Entero
Entero hexadecimal sin signo (con a, b, c, d, e, f)
X
Entero
Entero hexadecimal sin signo (con A, B, C, D, E, F)
f
Flotante
Valor con signo de la forma [-]dddd.dddd.
e
Flotante
Valor con signo de la forma [-]d.dddd or e[+/-]ddd
g
Flotante
Valor con signo de la forma e o f, se basa en el valor y precision. Ceros de relleno y punto decimal son impresos si es necesario.
E
Flotante
Igual que e; con E para exponente.
G
Flotante
Igual que g; con E para exponente si e format es usado.
Caracteres
c
Caracter
Un solo caracter.
s
Ptr a caracter
Imprime los caracteres hasta el caracter nulo o hasta la precision indicada.
%
None
Imprime el caracter %.

Los numero de punto flotante infinitos son impresos como +INF y -INF.

int scanf ( const char *format [, address, ...])

La funcion scanf:

Argumento
Significado
address
Apuntador a una lista de argumentos.
format
Cadena de formato.

Debe existir un especificador de formato y dirección para cada campo.

Espeficicador de Formato [format]

Las cadenas de formato tiene la siguiente forma:

% [width] type_char

Cada especificador de formato inicia con el caracter de porcentaje (%).

Cada % va seguido de:

Componente
Significado
[width]
(Opcional) especificador de tamaño.
Inidica el numero maximo de caracteres a leer; no todos los caracteres seran leido si la funcion encuentra espacios en blanco o caracteres imposibles de convertir.
type_char
(Requerido) Caracter de tipo.

Caracter de Tipo [type_char]

Caracter del tipo
Entrada esperada
Tipo de argumento

Numéricos

d
Entero decimal

Pointer to int (int *arg).

D
Entero decimal
Pointer to long (long *arg)
e, E
Punto flotante Pointer to float (float *arg)
f
Punto flotante Pointer to float (float *arg)
g, G
Punto flotante Pointer to float (float *arg)
o
Entero octal Pointer to int (int *arg)
O
Entero octal Pointer to long (long *arg)
i
Entero decimal, octal o
hexadecimal
Pointer to int (int *arg)
I
Entero decimal, octal o hexadecimal Pointer to long (long *arg)
u
Entero decimal sin signo Pointer to unsigned int(unsigned int *arg)
U
Entero decimal sin signo Pointer to unsigned long (unsigned long *arg)
x
Entero hexadecimal Pointer to int (int *arg)
X
Entero hexadecimal Pointer to long (long *arg)
Caracteres
c
Cáracter Apuntador a char (char *arg) si un campo tiene especificado el ancho W (como %5c) necesita un arreglo de W caracteres (char arg[W]).
s
Cadena de caracteres Apuntador a arreglo de carcateres (char arg[])
%
Cáracter No se hace conversion; el % es almacenado
1.6.2 Expresiones aritméticas

Ejercicios Desarrollo de programas.

Ejercicios ¿Qué hacen los programas?


1.6.3 Funciones matemáticas
1.6.4 Sentencias y bloques

Una expresión como x = 0 o i++ o printf(...) es una sentencia cuando es seguida de un punto y coma (;), como en:

x = 0;
i++;
printf(...);

En C, el punto y coma es un simbolo que indica la terminacion de una sentencia.

Las llaves { y } son usadas para agrupar declaraciones y sentencias como una sentencia compuesta o bloque. Esto es , son sintacticamente equivalentes a una sola sentencia. Las llaves que encierran las sentencias de una función (vease funciones) son un ejemplo obvio de esto; llaves seguidas de las sentencias if, else, while o for son otros ejemplos.

Ejercicios. Identifique los bloques existentes en cada programa.

Inicio


1.7 Estructuras selectivas

1.7.1 if()

La sentencia if-else es utilizada para expresar decisiones. La sintaxis formal es:

if (expresión)

    Sentencias1;

[ else

    Sentencias2; ]

Donde la parte else es opcional (los corchetes. La expresion es evaluada; si esta toma un valor verdadera (si de la expresion se obtiene un valor diferente de cero), las Sentencias1 son ejecutadas. Si esta es falso (la expresión es cero) y si existe una parte else, las Sentencia2 son ejecutadas.

Ya que un if simplemente prueba un valor númerico de una expresión, ciertas abreviaciones son posibles. La mas obvia escritura es:

if (expresión)

En lugar de:

if (expresión != 0)

En algunas ocasiones esto es natural y claro; otras ocasiones puede ser dificil de apreciar.

Debido a que la parte else es opcional, existe una ambiguedad cuando el else es omitido de una secuencia de if. Esto se resuelve asociando el else con if usando bloques. Ejemplo:

if (n>0)
    if (a >b)
        z = a;
    else
        z = b;

El else va junto con el segundo if, tal como lo muetra la identacion. Si esto no es lo que deseamos, se deben usar las llaves para forzar la asociacion. Ejemplo:

if (n>0)
{
    if (a >b)
        z = a;
}
else
    z = b;

Ejercicios. Desarrollo de programas usando if, if else.

Inicio


1.7.2 else if()

La construcción:

if (expresión1)
    Sentencias1
else if (expresión2)
    Sentencias2
else if (expresión3)
    Sentencias3
else if (expresión4)
    Sentencias4
else
    Sentencias5

Ocurre con tanta frecuencia. Es la forma mas general de escribir multipledecisiones. Las expresiones son evaluadas en ese orden; si cualquiera de las espresiones es cierta (se obtiene un valor diferente de cero), las sentencias asociadas con esta son ejecutadas y esta termina con la cadena entera.

El ultimo else maneja la situación "Ninguna de las anteriores" o la omisión en caso de que ninguna de las condiciones sea satisfecha. En ocasiones no existira una accion "por omisión"; en este caso la parte

else
    Sentencias5

Se omite.

Ejercicios. desarrollo de programas usando else if.

1.7.3 switch case

La sentencia switch es una sentencia para la multiple decisión. Si una expresion puede igualar con valor de un conjunto de constantes númericas enteras, el swith es la sentencia adecuada a utilizar. Su sintaxis es la siguiente:

swicth (expresión)
{
    case CONSTANTE1:
        Sentencias

    case CONSTANTE2:
        Sentencias

    case CONSTANTE3:
        Sentencias

    [ default:
        Sentencias
    break;]
}

Cada case es etiquetada por una o mas constantes numericas de valores enteros. Si el valor de un case iguala la expresión, la ejecución inicia en este case. Todos los valores case deben ser diferentes. Las sentencias de la etiqueta default son ejecutadas si ningún valor de las etiquetas case iguala. La etiqueta default es opcional.

Para interrupir la ejecucion de sentencias y terminar la sentencia switch se utiliza la instrucción break (vease break y continue).

Ejemplo:

main()
{
    char tecla;
    printf("Presiona una tecla de una operador: ");
    scanf("&c", &tecla);
    switch (tecla)
    {
        case '+':
            printf("Suma");
        break;

        case '-':
            printf("Resta");
        break;

        case '*':
            printf("Multiplicación");
        break;

        case '-':
            printf("División");
        break;

        default:
            printf("Noes un operador valido");
        break;
    } /* fin del switch */
} /* Fin del main */

Ejercicios. Desarrollo de programas usando switch.

Inicio


Unidad II. Elementos básicos de un lenguaje imperativo de programación (control y arreglos)

2.1 Estructuras de control.

2.1.1 Teoría de ciclos

Un ciclo (bucle) es un proceso en el que se ejecutan una serie de operaciones en un número determinado de veces; las operaciones seran siempre las mismas, pero con datos y resultados diferentes. El ciclo constara de una entrada y una salida; la entrada se producira con una o varias instrucciones y la salida del ciclo —fin del proceso repetitivo— se producirá cuando se cumpla una condición.

Una iteración es la repetición controlada de una secuencia de acciones internas al ciclo.

Un ciclo consta de las siguientes partes:

Preparación o arranque: una o más intrucciones que pueden ser asignación de valores a constantes, contadores a cero, dimensionado de listas o tablas, etc.

Cuerpo del ciclo: grupo de instrucciones que integran realmente al ciclo para cumplir el objetivo especificado y que se repiten mientras no se cumpla la condición.

Modificación del ciclo: conjunto de instrucciones que modifican el ciclo, haciendo progresar su ejecución hasta su terminación final; se suele utilizar con contadores o totalizadores.

Comprobación de la condición: Consta de una instruccion para averiguar si se ha producido la condicion que determinará la salida del ciclo.

Típico Ciclo
2.1.2 Contadores, acumuladores.

Contador: es un campo de memoria (variable) que esta determinado para contener los diferentes valores que se van incrementando o decrementando en cada iteración.

En las instrucciones de preparación del ciclo se realiza la inicialización del contador o contadores. La inicialización consiste en poner un valor inicial en la variable que representa el contador.

N = 5, I = 3, P = 0

En las instrucciones de modificación del ciclo se realiza el incremento o decremento del contador o contadores. El incremento o decremento consiste en sumar 1 o restar 1, respectivamente, a la variable contador.

N = N + 1, I = I - 1, P = P - 1

Acumulador o totalizador: es un campo o zona de memoria cuya misión es almacenar cantidades variables resultantes de sumas sucesivas. Realiza la funcion de un contador con la diferencia que el incremento o decremento de cada suma es variable en lugar de constante como en el caso del contador.

Se representa por: S = S + N, donde N representa una variable y no una constante.

2.1.3 Ciclos controlados por contadores, centinelas

Inicio


2.2 Tipos de ciclos.

2.2.1 while y for.

La sintaxis de la sentencia while es:

La expresión es evaluada. Si este es un número diferente de cero, las sentencias son ejecutadas y la expresión es reevaluada. Este ciclo continua hasta que la expresión llega a cero.

while (expresión)
    Sentencias

La sintaxis de la sentencia for es:

for (expr1; expr2; expr3)
    Sentencias

y es equivalente a:

expr1;
while (expr2)
{
    Sentencias
    expr3;
}

En un ciclo for las expresiones expr1 y expr3 comunmente son asignaciones y expr2 es una expresión relacional (condición). Ademas cualquiera de las 3 partes puede ser omitida pero las comas deben estar presentes.

La utilización de un ciclo while en lugar de un for se da por preferencias personales. Por ejemplo, en:

while ( (c = getchar()) == ' ' || c == '\n' || c == '\t')
    ; /* Se brinca los caracteres de espacios */

No existe inicialización o reinicialización, por esto el while es más natural.

El for es preferido cuando existe una simple inicializacion y un incremento. Asi un for es mas obvio en:

for ( i=0; i<n; i++)
    ...

Ejemplos:

#include <stdio.h>

main() /* cuenta los digitos, los espacios en blanco y otros */
{
    int c, i, nespacios, ndigitos[0], notros;

    nespacios = notros = 0;
    for ( i=0; i < 10; i++ )
        ndigitos[i] = 0;

    while ( (c=getchar()) != EOF)
    {
        switch(c)
        {
            case '0': case '1': case '2': case '3': case '4':
            case '5: case '6': case '7': case '8': case '9':
                ndigitos[c-'0']++;
            break;

            case ' ': case '\n': case '\t':
                nespacios++;
            break;

            default:
                notros++;
            break;

        }
    }
    printf("Digitos: ");
    for ( i=0; i<10; i++)
        printf("%d=%d;", i, ndigitos[i]);

    printf("\nEspacios = %d", nespacios);
    printf("Otros = %d", notros);
}

Ejercicios: Desarrollo de programas.

2.2.2 do()-while.

La sintaxis del ciclo do-while es:


do{
    Sentencias
} while(expr);

Las sentencias son ejecutadas despues la expr es evaluada. Si es resulta un valor diferente de cero, las sentencias son ejecutadas. Si es cero continua con la siguiente instrucción.

Ejemplo:

#include <stdio.h>
#include <string.h>

main() /* cuenta los digitos, los espacios en blanco y otros */
{
    int i, signo, n;
    char s[50]; JN

    printf("Dame un numero:");
    scanf("%d",&n);

    if ( (signo = n) < 0) /* Almacena el signo*/
        n = -n; /* Hace n positivo */

    i = 0;
    do { /* Genera los digitos en orden inverso */
        s[i++] = n % 10 + '0'; /* obtiene el siguiente digito*/
    }while ( (n /= 10) > 0); /* borra este digito */

    if sign < 0)
        s[i++]='-';

    s[i] = '\0';
    strrev(s);
}

Ejercicios 16.0 Desarrollo de programas.

Inicio


2.3Anidaciones.

2.4 Introducción a los arreglos.

Un arreglo es una colección finita, homogenea y ordenada de elementos.

Finita porque todo arreglo tiene un limite; es decir debe determinarse cual sera el numero maximo de elementos que podra formar parte del arreglo.

Homogenea porque todos los elementos de un arreglo son del mismo tipo (todos enteros, todos booleanos, etc..., pero nunca una combinacion de distintos tipos).

Ordenanda porque se puede determinar cual es el primero, el segundo, ... y el último (n-esimo) elemento.

Un arreglo puede representarse graficamente como:

Arreglo

Modelo de un arreglo almacenado en memoria

En los arreglos se distinguen 2 partes: Componentes e indices.

Los componentes hacen referencia a los elementos que forman el arreglo. Es decir, los valores que se almacenan en cada una de la casillas.

Los indices especifican cuantos elementos tendra el arreglo y ademas de que modo podran accesarse esos componentes del arreglo en forma individual, es decir, distinguir entre los elementos del mismo.

2.5 Arreglos unidimensionales.

En C la definicion de un arreglo sigue la sintaxis:

tipo_de_dato nombre_arreglo[num_elementos];

Ejemplos:

Para accesar o modificar un elemento del arreglo se sigue la sintaxis:

nombre_arreglo[indice]

El indice puede ser una variable entera o una constante numérica.

Ejemplos:

2.6 Arreglos bidimensionales.

En C la definicion de un arreglo bidimensional sigue la sintaxis:

tipo_de_dato nombre_arreglo[num_elementos][num_elementos];

Ejemplos:

Para accesar o modificar un elemento del arreglo bidimensional se sigue la sintaxis:

nombre_arreglo[indice_renglon][indice_columna]

El indice_renglon o el indice_columna puede ser una variable entera o una constante numérica.

Ejemplos:

2.7 Arreglos multidimensionales.

Semejante a los arreglos bidimensionales, sólo hay que agregar a la definición y al acceso un juego de [número]. Donde número para la definición significa cuantos elementos va a tener el arreglo y en el acceso el indice con el que se accesara al elemento.

Inicio


Unidad III. Funciones

3.1 Forma general de una función.

3.1.1 funciones predefinidas.
3.1.2 Funciones creadas por el programador.

3.2 Prototipos de funciones.

3.2.1 Alcance de las variables.

3.3 Argumentos y parámetros de las funciones.
3.4 Recursividad.

Inicio


Unidad IV. Estructuras.

4.1 Definición de estructura.
4.2 Acceso a los miembros de una estructura.
4.3 Estructuras con funciones.
4.4 arreglos y estructuras dentro de las funciones.
4.4 enumeraciones.
4.5 Uniones.
4.6 Tipos de datos definidos por el usuario.

Inicio


Unidad V. Punteros

5.1 Introducción
5.2 Declaración e inicialización de variables de punteros
5.3 Operadores de apuntadores
5.4 Llamar funciones por referencia
5.5 Expresiones de apuntadores y aritmética de apuntadores
5.6 Relación entre Arreglos y apuntadores
5.7 Aplicación de llamada por referencia a funciones

Inicio


Unidad VI. Archivos

6.1 Jerarquía de los datos
6.2 Archivos texto(secuenciales)
6.3 Archivos binarios(Directos)
6.4 Aplicaciones

Inicio


Bibliografia

Como Programar en C/C++
Autor: Deitel/Deitel
Editorial: Prentice Hall

C Guía de Autoenseñanza.
Autor: Herbert Schildt.
Editorial: McGraw-Hill.

Turbo C/C++ Manual del
Usuario.
Autor: Herbert Schildt.
Editorial: McGraw-Hill.

La completa referencia de
Turbo C.
Autor: Herbert Schildt.
Editorial: McGraw-Hill.