Documentos de Académico
Documentos de Profesional
Documentos de Cultura
4. Funciones.
5. Arrays y Punteros.
6. Cadenas de Caracteres.
7. Ficheros.
Una Visión General del Lenguaje C
Fue creado por Dennis Ritchie y Ken Thompson en 1972 como herramienta para los
programadores. Su principal objetivo consiste en ser un lenguaje útil.
Características
• Lenguaje moderno (programación estructurada y diseño modular).
• Lenguaje eficiente. Su diseño aprovecha las posibilidades de los ordenadores
actuales.
• Lenguaje portátil.
• Lenguaje potente y flexible. Resolución de problemas físicos y de ingeniería. Posee
control sobre aspectos asociados con los lenguajes ensambladores.
• Lenguaje compilado.
- Editor de texto.
- Compilador.
- Ejecución.
Un programa sencillo
#include <stdio.h>
int num;
num = 1;
printf("\n¡Maravilla, colega!");
printf("\nMi número es el %d por ser el primero.", num);
}
Variables, Constantes y Operadores.
• Un programa necesita trabajar con datos.
• Algunos están preseleccionados antes de la ejecución del programa y mantienen
sus valores inalterados durante la misma. Se denominan constantes.
• Otros pueden recibir nuevas asignaciones de valor durante la ejecución del
programa. Se trata de variables.
#include <stdio.h>
#define DOCE 12
int main() { /* pasa docenas a huevos */
int huevos;
int docenas = 4;
huevos = DOCE * docenas;
printf("\nHay %d huevos en %d docenas.", huevos, docenas);
return 0;
}
El tipo int.
• Es el tipo de dato entero básico y normalmente usa una palabra del procesador
para su almacenamiento. En los ordenadores personales ocupa cuatro bytes (32
bits) y permite un rango entre -231 y +231-1.
int main() {
int x = 100;
return 0;
}
• Declaración de constantes de tipo entero largo sin signo: Se usan los sufijos L o l
y U o u respectivamente.
• Para imprimir un dato de tipo char como carácter debe utilizarse el especificador
de formato %c.
#include <stdio.h>
int main() {
char ch;
printf("Introduce un carácter.\n");
scanf("%c", &ch);
printf("El código de %c es %d.", ch, ch);
return 0;
}
• Para almacenar un dato de tipo float, se usan 32 bits: 8 bits para expresar el
valor del exponente y su signo, y 24 bits para representar mantisa. Este sistema
permite una precisión de siete cifras decimales y un exponente entre 10-37 y 10+38.
• Muchos sistemas aceptan también el tipo double, que usa el doble de bits que el
tipo anterior.
• Para representar una constante en punto flotante se escribe una serie de cifras con
signo incluyendo un punto decimal, a continuación la letra e o E seguida de un
exponente con signo, que indica la potencia de diez a usar.
• El compilador supone que todas las constantes de punto flotante que aparecen en
el programa son de tipo double, a fin de asegurar la máxima precisión en los
cálculos.
• Los especificadores de formato a usar son %f para notación decimal y %e para
notación exponencial.
#include <stdio.h>
int main() {
return 0;
}
Otros tipos.
• En cualquier operación en que aparezcan dos tipos diferentes se eleva el rango del que lo
tiene menor para igualarlo al del mayor (promoción).
• El rango o categoría de los tipos de mayor a menor es: double, float, long, int,
short y char. Los tipos unsigned tienen el mismo rango que el tipo al que están
referidos.
• Mientras que la promoción pasa inadvertida fácilmente, la pérdida de rango puede originar
serios inconvenientes debido a que el tipo de menor rango puede no ser lo bastante amplio
como para albergar el valor de la expresión, cuyo tipo es de mayor rango.
• Para conservar la precisión numérica, en el lenguaje C todas las variables y constantes de
tipo float se convierten en double cuando se efectúan cálculos. El resultado final se
reconvierte en float si ése es el tipo declarado.
#include <stdio.h>
int main() {
int x;
float y = 1.0, z = 2.0;
x = (int) y + (int) z;
printf("\n%d.", x); /* Resultado: número entero 3 */
return 0;
}
Operadores y precedencias.
#include <stdio.h>
int main() {
if (<expresión>)
<sentencia>
else /* opcional */
<sentencia>
Ejemplo:
if (y > 0)
x = y;
else
x = -y;
• Pueden escribirse sentencias anidadas, donde cada sentencia else es, a su vez,
otra sentencia if-else.
• Si existen sentencias if-else anidadas, cada sentencia else corresponde
siempre a la sentencia if más próxima.
if (...)
if (...)
<sentencia_1>
else
<sentencia_2>
El operador condicional.
• Si un programa debe elegir una opción entre varias, resulta más legible si se usa
una sentencia switch en vez de varias sentencias if-else anidadas.
switch (<expresión_entera>) {
case const_1: sentencia/s
break; /* opcional */
case const_2: sentencia/s
break; /* opcional */
case_const_3: sentencia/s
break; /* opcional */
while (<expresión>)
<sentencia>
El bucle do-while.
do <sentencia>
while (<expresión>);
Ejemplo:
#include <stdio.h>
int main() {
char ch;
return 0;
}
#include <stdio.h>
int main() {
int elegido;
do {
printf("\nDame un número: ");
scanf("%d", &elegido);
} while(elegido != NUM);
printf("\n¡¡¡Acertaste!!!");
return 0;
}
El bucle for.
<inicialización>;
while (<test>) {
<sentencia>
<actualización>;
}
for (; <expresión>; )
<sentencia>
Ejemplos:
n = 1;
for (; n < 10; n++)
printf("\n%d.", n);
for (; ; ) printf("\nEternidad.");
Ejemplo:
while ((ch = getchar()) != EOF) {
if (ch == '\n') break;
putchar(ch);
}
Ejemplo:
while ((ch = getchar()) != EOF) {
if (ch == '\n') continue;
putchar(ch);
}
Funciones.
* Unidad de código diseñada para llevar a cabo una tarea determinada.
* El tipo de una función coincide con el valor devuelto por ésta (el tipo por omisión
es int).
* En C todas las funciones deben devolver un valor excepto aquéllas cuyo tipo es
void.
* Una función puede considerarse como una caja negra, definida exclusivamente
por la información suministrada (parámetros de entrada) y el producto recibido
(resultado de salida).
Ejemplo: printf()
- constante.
- variable.
- expresión (válida en C).
Ejemplo:
int abs(int x) {
int main() {
int x = 4, y = 10;
int z;
return 0;
}
x = (a > b)? a: b;
return x;
}
Declaración de parámetros obsoleta:
* Paso de parámetros:
- Por valor: Los valores de los parámetros reales se copian en los parámetros formales.
- Por referencia o por variable: Los valores de los parámetros reales (cuando son
variables) se modifican dentro de la función y permanecen alterados al abandonarla.
tipo *variable;
Ejemplo:
int main () {
puntnum = #
printf("\nEl entero apuntado por puntnum es %d.", *puntnum);
*puntnum = 10;
printf("\nEl entero num es ahora %d.", num);
return 0;
}
#include <stdio.h>
int main() {
int x = 5, y = 10;
return 0;
}
int temp = a;
a = b;
b = temp;
}
#include <stdio.h>
int main() {
int x = 5, y = 10;
return 0;
}
Ejemplo:
#include <stdio.h>
int main() {
double x = 4, y = 10;
double z;
z = max(x, y);
printf("El máximo de %lf y %lf es %lf.", x, y, z);
return 0;
}
Ejemplo:
- Local (auto): Su ámbito se reduce a la función donde ha sido declarada y fuera de ella
la variable es desconocida. Pueden existir dos variables locales declaradas en dos
funciones distintas pero con el mismo identificador.
- Global (extern): Se define fuera de cualquier función y es conocida por todas las
funciones del programa. No se recomienda usar una variable global debido a los
efectos laterales, excepto cuando ésta sea utilizada en muchas funciones de nuestro
programa.
Ejemplo:
#include <stdio.h>
int main() {
* Principio de inducción:
* Conceptos básicos:
* Funcionamiento de la recursividad:
Ejemplo:
* Ejercicio: Escribir un programa que calcule la suma de los n primeros números naturales
de foma recursiva.
- Identificar y resolver el caso base del problema. Debe devolver el resultado correcto
para el valor más pequeño.
- Expresar el problema para un tamaño dado en función del mismo problema para un
tamaño menor.
* Recursividad indirecta: Un módulo llama a otro, éste a otro, etc., acabando en que el
módulo original es llamado de nuevo. Admite distintos niveles de profundidad y resulta
más difícil de seguir y depurar.
- Estructura de Datos.
- Serie de elementos.
- Todos del mismo tipo.
* Acceso a un elemento:
* Tipos de arrays:
- Unidimensionales (vectores).
- Bidimensionales (tablas).
- Tridimensionales (cubos).
- Multidimensionales (en general).
* Declaración de un Array:
Tipo_Array Nombre_Array[Tam_l]...[Tam_N];
Ejemplos:
int main() {
return 0;
}
#include <stdio.h>
int main() {
int i, nums[5];
putchar('\n');
return 0;
}
* Ejercicio: Modificar un programa para que procese una tabla de 5x3 enteros.
Punteros.
* Proporcionan un método simbólico para utilizar direcciones de memoria.
* Ejemplo:
- Cuando se pasa un array como argumento, se pasa realmente su dirección, por lo que
a partir de ella se puede leer o modificar cualquier elemento del array (los arrays
siempre se pasan a través de sus direcciones).
Ejemplo:
/* Un array como argumento de la función convierte() */
void convierte(int [], int);
int main() {
* Ejemplo.
La función gets() captura una cadena introducida por el dispositivo de entrada estándar
del sistema. Esta función lee caracteres hasta que encuentra el carácter '\n'. Entonces el
ordenador toma todos los caracteres menos el carácter de nueva-línea, que se reemplaza
por el carácter '\0'.
Ejemplo:
Ejemplo:
La función scanf() permite leer una cadena de caracteres mediante el especificador %s.
Esta función devuelve un valor entero igual al número de items leídos. Si hay un error o se
encuentra un carácter EOF, scanf() devuelve éste último.
Ejemplo:
La función puts() acepta como único argumento un puntero a una cadena de caracteres.
Esta función sustituye el carácter nulo final por '\n' y lo envía a la salida estándar.
Ejemplo:
char mensaje[] = "Hola mundo";
puts(mensaje);
La función printf() también toma un puntero a una cadena como argumento, pero no
añade el carácter de nueva-línea al final de la cadena automáticamente.
Ejemplo:
#include <stdio.h>
#define MSJ "Fantástico"
int main() {
char *nombre = "Juan";
printf("Bien, %s, %s.\n", nombre, MSJ);
return 0;
}
Funciones de cadenas de caracteres.
* Prototipos en <string.h>.
#define MAX_LONG 80
int main() {
char flor[MAX];
char apendice[] = " es una flor bonita";
return 0;
}
* Comparación de cadenas.
strcmp("HOLA", "HOLB") /* -1 */
strcmp("HOLB", "HOLA") /* 1 */
strcmp("HOLA", "HOL") /* 65 */
strcmp("HOL", "HOLA") /* -65 */
* Copia de cadenas.
strcpy(char, char);
La función strcpy() (string copy) copia los caracteres de la cadena que se pasa
como segundo argumento en la cadena que se pasa como primer argumento.
Ejemplo:
#include <stdio.h>
#include <string.h>
int main() {
return 0;
}
Ficheros.
* Un fichero puede definirse como un almacenamiento de datos, generalmente en
disco, con un nombre.
* Apertura de un fichero.
Ejemplo:
#include <stdio.h>
int main() {
FILE *in;
int ch;
return 0;
}
Valor de retorno de fopen():
- Puntero a la estructura del fichero, que debe asignarse a una variable de este
tipo para poder acceder al fichero a través de esa variable.
- NULL si se ha producido un error al intentar abrir el fichero.
* Cierre de un fichero.
Argumentos de fseek():
- Puntero al fichero.
- Desplazamiento desde el punto de referencia.
- Modo que indica el punto de referencia.
- Si no ha habido error 0.
- En caso de error -1. Un error común consiste en intentar avanzar más allá de
los límites del fichero.
Ejemplo:
#include <stdio.h>
#include <stdlib.h>
FILE *fp;
long despl = 0L; /* cero "largo" */
char ch;
return 0;
}
Bibliografía
• Aprendiendo C. Tercera Edición Revisada y Ampliada. J.M. Rodríguez, J.
Galindo. Servicio de Publicaciones de la UCA, 2006.