El Lenguaje de Programación C 2a Edición Kernighan, Brian W., Ritchie, Dennis
Resumen Teórico - Cátedra de Programación · El Lenguaje C (1) • El C es un lenguaje de...
Transcript of Resumen Teórico - Cátedra de Programación · El Lenguaje C (1) • El C es un lenguaje de...
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
1
Programación
Unidades 2 y 4Resumen Teórico
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
2
El Lenguaje C (1)• El C es un lenguaje de programación creado en 1972
por Dennis Ritchie en los Laboratorios Bell.
• Es evolución de un lenguaje más antiguo: B (a su vezbasado en BCPL). A su vez, hay otros lenguajespopulares que derivan de él (como el C++) o seinspiran en él (como el JAVA).
• Aunque no fue estandarizado hasta 1988 (ANSI C) y en1990 fue ratificado como estándar ISO.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
33
El Lenguaje C (2)• Es un lenguaje imperativo estructurado que posee
estructuras de alto nivel, pero que también permiteprogramación de bajo nivel.
• Inicialmente muy utilizado para desarrollar sistemasoperativos. Por ejemplo, LINUX está desarrollado en C.
• Se ha usado de manera intensiva también en entornoscientíficos. Junto con el FORTRAN ha sidoposiblemente el lenguaje de programación máspopular.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
4444
El Lenguaje C (3)• Algunas de sus características son:
Pequeño: Sólo 32 palabras reservadas.
De propósito general: Es aplicable a diversos tipos deproblemas.
Portable: Funciona en cualquier máquina.
Conciso: Genera programas reducidos (compactos).
Eficiente: En el uso de los recursos de la máquina.
Modular: Permite la Programación Modular.
Potente: Se utiliza en el desarrollo de software de base.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
5555
Historia del Lenguaje C• En 1964 se desarrolló el sistema operativo MULTICS,
en donde trabajaron Ken Thomson y Dennis Ritchie.
• En 1969 Thompson desarrolló el sistema operativoUNIX (en ensamblador). Luego lo reescribió en ellenguaje B (que aún dependía del hardware).
• En 1970 el lenguaje B fue revisado por Ritchie, quien loindependizó del hardware, obteniendo una nuevaversión al que denominó lenguaje C.
• En 1973 Thompson y Ritchie reescribieron casitotalmente (en un 95%) UNIX con este lenguaje.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
6
Genealogía del Lenguaje C
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
7
El Modelo de Compilación de C
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
88888
El Preprocesador (1)• El preprocesador del lenguaje C consiste en un sencillo
procesador de textos que, previamente a lacompilación de un programa, realiza funciones deinclusión de archivos, sustitución de macros einclusión condicional de textos. Todas las sentenciasdel preprocesador comienzan con el carácter numeral.
1. La inclusión de archivos se realiza con la sentencia:#include <archivo>
• De esta manera el preprocesador incluirá el contenidode un archivo dentro de un programa.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
999999
El Preprocesador (2)2. Sustitución de macros, definidos mediante la
sentencia:#define <macro> <texto>
• Todas la apariciones de <macro> serán reemplazadaspor el <texto>. La macro tiene la misma forma que unnombre de variable, mientras que el texto dereeemplazo es arbitrario. Por ejemplo:
#define PI 3.1416#define N 100#define repitesiempre for(;;)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
101010101010
Librerías del Lenguaje C• C es un lenguaje muy pequeño que no tiene, por
diseño, instrucciones especiales para muchas de lasoperaciones tradicionales, que otros lenguajes deprogramación sí las tienen ya incorporadas, tales comolas operaciones de entrada/salida, las funcionesmatemáticas, etc.
• En lugar de ello, todas las operaciones utilizadasfrecuentemente están "encapsuladas" en librerías (óbibliotecas).
• Es decir, las librerías son funciones que pueden serenlazadas opcionalmente, con código C compilado.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
1111
Estructura General de un Programa
#include <stdio.h>
main(){
printf("!Hola Mundo!\n");getch();
}
Librería para entrada y salida
Sentencia de salida
Espera una tecla
Función principal
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
12121212
Declaración de Variables• Las variables permiten almacenar valores de diferentes
tipos. Sus características son:
Nombre: un identificador válido. Tipo: int, float, double, char, etc. Valor: el valor almacenado.
• En C es necesario definir todas las variables que seutilicen, con la siguiente sintaxis: tipo var;
• Por ejemplo: int a, b, c; float r, s;
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
13
Sensible a Mayúsculas/Minúsculas• C distingue entre mayúsculas y minúsculas (case
sensitive en inglés).
• Los identificadores Pepito, pepito y PEPITO son
diferentes.
• Todas las palabras reservadas del lenguaje van en
minúsculas.
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
14
Comentarios• Existen dos formas de introducir comentarios:
1) Comentario de una línea:// Comentario de una línea
2) Comentario en una o más líneas:/* Comentario
de másde una línea
*/
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
15
• Son los nombres de las variables, constantes, tipos dedatos, funciones, etc.
• No tienen una longitud máxima, pero sólo son válidoslos primeros 32 caracteres.
• El primer carácter del identificador debe ser: A–Z, a–z,_, $, y el resto debe ser: A – Z, a – z, _, $, 0 – 9.
• No se permiten vocales acentuadas ni la letra eñe (Ñ, ñ).
• No se permite utilizar palabras reservadas comoidentificadores.
Identificadores
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
16
La disposición de los elementos dentro del código es libre.
• Sentencias: Línea simple de código terminada en ;.x = y + z + w;
• Bloque de código: Conjunto de sentencias agrupadasentre llaves.
{x = x + y;c = c +1;
}
Lenguaje de Formato Libre
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
17
• Una variable es un zona de memoria cuyos valores vana cambiar durante la ejecución del programa.
• Declaración:
<tipo> <identificador>; ó<tipo> <identificador>, <identificador>;
Por ejemplo:int a, b, c;
float x,y;
Variables
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
18
• Una constante es una zona de memoria cuyos valoresno varían durante la ejecución del programa.
• Las constantes simbólicas favorecen la realización demodificaciones en los programas (Modificabilidad).
• Declaración:
#define <identificador> = <valor>;
• Por ejemplo:#define PI = 3.1416;
Constantes Simbólicas
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
19
auto break case char
const continue default do
double else enum extern
float for goto if
int long register return
short signed sizeof static
struct switch typedef union
unsigned void volatile while
Palabras Reservadas
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
20
• Se utiliza el operador de asignación =:<variable> = <expresión>;
• La parte izquierda siempre debe ser una variable.
• La parte derecha puede ser un literal, una variable, unafunción o una combinación de todos.
• Se puede asignar un valor a una variable en el momentode declararla. Por ejemplo:
int s = 0;
Asignación de Variables
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
21
Operadores (1)• Operadores unarios: + , –
• Operadores aritméticos: +, –, *, /, % (resto de ladivisión entera)
• Operadores de asignación: =, +=, *=, /=, %=. Porejemplo, <var> += <expresión> es equivalente a<var> = <var> + <expresión>.
• Por ejemplo:x += 3; x = x + 3;
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
2222
• Operadores incrementales: ++, ––
Precediendo a la variable: ++<var> , --<var> Siguiendo a la variable: <var>++ , <var>--
Por ejemplo:• {i=1;j=i++;} i=1;j=i;i=i+1; ≡ i=2,j=1
• {i=1;j=++i;} i=1;i=i+1;j=i; ≡ i=2,j=2
• {x = ((++z ) – (w--) % 100 ;} equivale a:{z = z+1; x= (z – w) % 100 ; w = w – 1;}
Operadores (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
23
• Operadores relacionales: == (igual), != (distinto),> (mayor que), < (menor que), >= (mayor ó igual que),<= (menor ó igual que).
• Operadores lógicos: && (AND) || (OR) ! (NOT) & (AND bit a bit) | (OR bit a bit)
Operadores (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
2424
Operadores (4)• Operadores condicional:
<exp1> ? <exp2> : <exp3>;
• Se evalúa como <exp2> si <exp1> es cierto ó como<exp2> en caso contrario. Por ejemplo:
x = (y > 10) ? z + 1 : 30;
equivale a:
si (y > 10) entonces x ← z + 1
sino x ← 30
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
252525
Operadores (5)• Operadores de tamaño:
sizeof <tipo> ó sizeof(<expresión>)
• El operador sizeof informa del espacio (en bytes)que el <tipo> ó la <expresión> ocupan en lamemoria.
• Por ejemplo: sizeof(int) = 4 sizeof(2.5) = 8 sizeof("Pepito") = 7
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
2626
PRIORIDAD OPERADOR
Operadores sufijos (más alta) [] (argumentos)->
Operadores unarios ~ ! -- - (tipo) * & sizeof
Multiplicativos * / %
Aditivos + -
Desplazamiento << >>
Relacional < > <= >=
Igualdad == !=
AND (bits) &
OR exclusivo (bits) ^
OR inclusivo (bits) |
AND lógico &&
OR lógico ||
Condicional ? :
Asignación = += -= *= /= %=
Coma (más baja) ,
Jerarquía de los Operadores
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
2727
La biblioteca math.h contiene la definición de variasfunciones matemáticas útiles. Algunas de ellas son lassiguientes:
• ceil(x): Redondea al menor entero mayor ó igualque x.
• cos(x): Coseno de x.
• exp(x): ex.
• fabs(x): Valor absoluto de x.
Funciones Matemáticas (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
282828
• floor(x): Redondea al mayor entero menor ó igualque x.
• log(x): Logaritmo natural de x.
• log10(x): Logaritmo en base 10 de x.
• pow(x,y): xy.
• sin(x): Seno de x.
• sqrt(x): Raíz cuadrada de x.
• tan(x): Tangente de x.
Funciones Matemáticas (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
29
• La función scanf(), (de «scan" = leer y "f" = formato)disponible al incluir stdio.h, permite leer datos porteclado. La función scanf se usa de un modo similar aprintf: su primer argumento es una cadena decontrol con formatos que indican de qué tipo es el valorque vamos a leer, y a éste le siguen la dirección dememoria en donde se almacenará el valor leído.
• La forma general de utilizarla es la siguiente:
scanf(<cadena_de_formato>, &<variable>);
Entrada Estándar (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
30
• Observemos que la variable cuyo valor se lee porteclado va obligatoriamente precedida por el operador&: es así como se obtiene la dirección de memoria en laque se almacena el valor de la variable.
• Por ejemplo, la siguiente sentencia de lectura lee unvalor entero, y lo deposita en la dirección de memoriaen donde se encuentra la variable x :
scanf("%d", &x);
Entrada Estándar (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
3131
• Los caracteres de conversión que se utilizan para darleformato a los valores que se ingresan por teclado son:
Entrada Estándar (3)
Carácter de Conversión Tipo
c chard intf floatlf doubles cadena
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
3232
• La función printf() (de "print" = imprimir y "f" =formato) sirve para escribir datos en el dispositivo desalida estándar (generalmente la pantalla) con unformato determinado por el programador. La formageneral de utilizarla es la siguiente:
printf(<cadena_de_formato>, <variables>);
• El primer argumento especifica el modo en el que sedeben mostrar los datos que aparecen a continuación.
Salida Estándar (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
333333
• Esta cadena se compone de una serie de códigos deformato que indican a C qué tipo de datos son los quese desean imprimir. Todos los códigos estánprecedidos del símbolo de porcentaje (%). Por ejemplo,el código %d indica a la función que se desea escribir unnúmero de tipo int, y el código %f, que se deseaescribir un número real de tipo float. Por ejemplo:
printf("%d \t %d \n",a,b);
Salida Estándar (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
3434
• Algunos de los caracteres de conversión para darleformato a los valores que se muestran por teclado son:
Salida Estándar (3)
Carácter de Conversión Tipoc chard intf floats cadenao Octalx hexadecimal
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
35353535
• Si observamos la tabla de caracteres ASCII, veremosque algunos caracteres no son imprimibles. ¿Cómopodemos escribir un carácter que no se puede teclear?El lenguaje C permite dos formas de hacerlo:
1. La primera forma es utilizar el propio código ASCII.Simplemente se usa el número de código en octal,precedido por una diagonal invertida. Por ejemplo:
NUL = '\0'; pitido = '\07';
Secuencias de Escape (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
3636363636
2. La segunda forma que utiliza C para representarcaracteres “raros” es usar secuencias especiales desímbolos, denominadas “secuencias de escape”.Algunas de ellas son:
Secuencias de Escape (2)
Nueva Línea NL \n
Tabulación Horizontal HT \t
Diagonal Invertida \ \\Apóstrofe ‘ \’Comillas ‘’ \’’
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
3737
• Las sentencias de control del flujo de ejecución,permiten tomar decisiones y realizar un procesorepetidas veces.
• Hay dos tipos principales de sentencias de control deflujo:
Condicionales: if, switch Iteración: for, while, do - while
• Otras sentencias que permiten interrumpir el flujonormal de ejecución son break y continue.
Estructuras de Control
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
38
La Sentencia if – else (1)
if (<expresión>){<sentencias_1;}
else {<sentencias_2>;}
• Por ejemplo:
if (x < min) x = min else i = i + 1;
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
39
La Sentencia if – else (2)• Por definición, el valor numérico de una expresión de
relación o lógica es 1 (uno) si la relación es Verdadera, y0 (cero) si la relación es Falsa.
• En un sentido amplio, el lenguaje C consideraverdadera una expresión si es distinta de 0 (cero), yfalsa en caso contrario.
• Por ejemplo:if (x--) y = a else y = b;
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
4040
La Sentencia switch (1)switch (<variable>){
case valor1: [<grupoSentencias1>;][break;]
...case valorN: [<grupoSentenciasN>;]
[break;]
[default: <grupoSentencias>;]}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
414141
La Sentencia switch (2)• Opciones de un menú:
1) Altas 2) Bajas 3) Modificaciones 4) Salir
switch (opcion){ case 1: altas(); break;case 2: bajas(); break;case 3: modificaciones(); break;case 4: default: salir();
}
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
42
• Permite la ejecución repetida un número de vecespredeterminado, de un grupo de sentencias.
La Sentencia for (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
4343
for (<inicializa>;<exprLógica>;actualiza>){
<grupoSentencias>;}
• <inicializa>: Asignación del valor inicial de lasvariables que intervienen en la expresión.
• <exprLógica>: Condición lógica (booleana).
• <actualiza>: Asignación del nuevo valor de lasvariables.
La Sentencia for (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
4444
• En <inicializa> y en <actualiza> pueden ir másde una asignación, separadas por comas.
• Por ejemplo, el siguiente código:for (i=0, j=10; i < j; i++, j -= 3)
printf("%d \t %d \n",i,j);
produce la siguiente salida:
0 101 72 4
La Sentencia for (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
45
• El grupo de sentencias se ejecuta mientras se cumpla laexpresión booleana.
while (<exprBooleana>){<grupoSentencias>;
}• Por ejemplo:
i = 0;while (i < 10){printf ("%d", i);i += 1;
}
La Sentencia while
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
4646
• El grupo de sentencias se ejecuta mientras se cumpla laexpresión booleana.
do {<grupoSentencias>;
} while (<exprLógica>)
• Por ejemplo:i = 0;do {
printf ("%d", i); i++;} while (i < 10);
La Sentencia do-while
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
4747
• La sentencia break provoca la terminación inmediatade un ciclo ó de una sentencia switch (quedando sinejecutar el resto de las sentencias).
• Es válida para for, while, do – while y switch.
• La sentencia continue provoca la terminacióninmediata de una iteración en un ciclo.
• Es válida para for, while y do – while.
Sentencias break y continue
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
48
Tipos de Datos Simples en C
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
494949494949
Tipos de Datos NuméricosTipo Longitud Rango
unsigned int 16 bits 0 a 65.535
short int 16 bits -32.768 a 32.767
int 16 bits -32.768 a 32.767
unsigned long 32 bits 0 a 4.294.967,295
long 32 bits -2.147.483.648 a 2.147.483.647
float 32 bits 3,4*(10^-38) a 3,4*(10^+38)
double 64 bits 1,7*(10^-308) a 1,7*(10^+308)
long double 80 bits 3,4*(10^-4932) a 1,1*(10^+4932)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
505050
• En C un carácter es un valor entero representado por sucorrespondiente código ASCII, y encerrado entrecomillas.
• Para definir una variable de tipo carácter podemosescribir:
char c = ‘A’;
• Internamente, los caracteres se almacenan comonúmeros . Por ejemplo, la letra A se almacenainternamente como el número 65, la letra B es 66, etc.
Tipos de Datos Carácter (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
51515151515151
• Dado que el tipo char representa valores en el rango -128 a +I27 y se asocian con el código ASCII, Cproporciona el tipo unsigned char para representarvalores de 0 a 255 y así poder representar a todos loscaracteres ASCII.
• Como el tipo char es un subconjunto del tipo int, sepuede asignar un carácter a un entero.
• Para leer un carácter: getchar(c);
• Para escribir un carácter: putchar(c);
Tipos de Datos Carácter (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
52525252
• En C existe un tipo de dato especial, denominado void
("nada").
• Por ejemplo, se utilizan para definir funciones que nodevuelven un valor, ó que no necesitan argumentos.
• También se lo utiliza para definir punteros genéricos, esdecir, que apuntan a lugares de memoria pero no estánrelacionados con un tipo de dato específico.
El Tipo de Dato void
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
53535353
• Una cadena de caracteres es un conjunto de caracteresque se almacena en localidades contiguas de memoria.En C se representa como un vector de caracteres, endonde cada elemento del vector representa un carácterde la cadena. Por ejemplo:
char nombre[7] = "Pepito";
• Toda cadena termina con el carácter nulo (‘\0’).
Tipos de Datos Cadena (1)
‘P’ ‘e’ ‘p’ ‘i’ ‘t’ ‘o’ ‘\0’
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
5454545454
• Leer una cadena del teclado: Leer una frase: gets(nombre); Leer una palabra: scanf("%s", nombre);
• Mostrar una cadena en pantalla: puts(nombre); printf("Nombre: %s \n", nombre);
• Asignar un valor a una cadena:strcpy(nombre, "Pepito");
Tipos de Datos Cadena (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
555555555555
• Arreglo de cadenas:#define LON_MAX 80
#define CAN_MAX 100
main(){
typedef char Cadena[LON_MAX];
typedef Cadena VectorCadenas[NRO_ELEMS];
VectorCadenas V; int i;
for(i = 0; i < NRO_ELEMS; i++){
printf("Cadena Nro %i", i); scanf("%s",V[i]);}
}
Tipos de Datos Cadena (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
5656
• Una enumeración es una lista de nombres que almacenanvalores enteros constantes. El primer nombre de la listatiene el valor 0, el siguiente 1, etc. La declaración adoptala forma siguiente:
enum <nombre_tipo> {<lista_de_identificadores>};
• Una vez hecha una definición como esta, se puedenemplear variables del tipo de esta enumeración, que sese declaran en de la siguiente manera:
enum <nombre_de_tipo> <var_1>, ..., <var_n>;
Tipos de Datos Enumerados (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
575757
• Por ejemplo:
main(){enum dias {Lu, Ma, Mi, Ju, Vi}; enum dias x, y, z;
x = Lu; y = Vi;for (z = x; z <= y; z++)
printf("z vale %d\n", z);}
Tipos de Datos Enumerados (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
585858
• Podemos dar un nombre nuevo a cualquier tipo de datosmediante typedef. La sintaxis es:
typedef <declaración>;
• En donde declaración tiene la forma de unadeclaración de variable, sólo que estamos definiendo unnuevo tipo de datos. Por ejemplo:typedef enum {Lu, Ma, Mi, Ju, Vi} dias;
• Y luego podemos declarar variables de este tipo:dias x, y, z;
Declaración de Nuevos Tipos de Datos
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
59
• La conversión de tipos se denomina "moldeo" (casting)y se realiza anteponiendo a la expresión a moldear, elnombre del tipo requerido entre paréntesis:
(<tipo>) <expresión>
• El conjunto de paréntesis y tipo recibe el nombre de"operador de moldeo" (cast). Por ejemplo, si n es unint, entonces: (double)n forzará al valor de n paraque la expresión tenga el tipo double, permaneciendoinalterable el valor que tiene en la memoria.
Conversión de Tipos
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
6060
Tipos de Datos Compuestos en C
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
6161616161
• Un arreglo (array) una colección homogénea de datossimples ó compuestos, que se referencian con un nombrecomú, y cuyos elementos son accedidos mediante uníndice.
• Se utilizan los corchetes ([]) para declarar el arreglo ypara acceder a sus elementos. La sintaxis es:
<tipo> <variable>[<dimensión>];
• Por ejemplo:int V[100];
Arreglos (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
626262626262
• Los índices de un arreglo comienzan siempre en 0 (cero).
• Para acceder a los elementos de un array:V[6] = 9;
• Para recorrer un array:
for (i = 0; i<5; i++){V[i] = i;printf("V[%d] = %d \n", i, V[i]);
}
Arreglos (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
63636363636363
• En C todos los arreglos son unidimensionales.
• Si queremos tener arreglos multidimensionales (de másde una dimensión), necesitamos un conjunto de corchetespor cada una de ellas.
• Por ejemplo:
int X[10]; // 1 dimensiónint Y[10][20]; // 2 dimensionesint Z[10][50][100]; // 3 dimensiones
Arreglos (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
64646464
• Un registro ó estructura es una colección heterogénea dedatos simples ó compuestos, cuyos elementos sondenominados campos ó miembros. Por ejemplo, unalumno contiene una colección de datos diversos, comopor ejemplo, entre otros:
Número de Libreta: Un tipo entero largo. Carrera: Un tipo enumerado con los valores (TUP,
TIG, TEU, etc.). Fecha de Nacimiento: Una fecha también es del tipo
estructura: DD/MM/AAAA.
Estructuras (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
65
Estructuras (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
6666666666
• Es decir que el esquema de una estructura es la siguiente:
Estructuras (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
676767676767
• Siendo la sintaxis en el lenguaje C, para definir unaestructura la siguiente:
Estructuras (4)
struct <nombre>{
<tipo_1> <miembro_1>;
<tipo_2> <miembro_2>;
...
<tipo_N> <miembro_N>;
} <variables>;
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
68686868686868
• Por ejemplo:
struct nroComplejo{
int pteReal;
int pteImag;
} z;
• Y para acceder a cada uno de los miembros de laestructura anterior, utilizamos el operador punto:
z.pteReal = 1; z.pteIm = 0;
Estructuras (5)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
6969696969696969
• También podemos almacenar un conjunto de estructurasen un arreglo. Por ejemplo, sean las declaraciones:
typedef struct {
char nombre[30];
int nota;
} alumno;
alumno V[N]; char nroAux[5];
Estructuras (6)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
707070707070707070
• Entonces, para ingresar cada uno de los valores quetienen los elementos de las estructuras del arregloescribiremos:
for (i=0;i<N;i++){
gets(V[i].nombre);
gets(nroAux);
sscanf(nroAux,"%d",&V[i].nota);
}
Estructuras (7)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
71717171717171717171
• Con respecto al código anterior debemos hacer lasiguiente aclaración:
Es "peligroso" mezclar órdenes gets y scanf, porque sileemos un número con scanf, la pulsación de la teclade "Entrada" posterior queda almacenada en el bufferdel teclado, lo que puede provocar que despuésintentemos leer con gets un texto, pero sólo leamos esapulsación de la tecla "Entrada". Para evitarlo, losnúmeros los leeremos "en dos etapas": primero leeremosla cadena nroAux con gets y luego la convertiremos alnúmero nota con sscanf.
Estructuras (8)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
7272727272727272727272
• La función sscanf (string scanf) obtiene la entrada quese va a analizar, de una cadena de caracteres dada. Lasintaxis de dicha función es la siguiente:
sscanf(cadena, formato, &variable);
Estructuras (9)
Formato Lectura Ejemplo%d Como un entero 123%f Como un real 123.400%g Como un real 123.4
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
73737373737373
• Es una estructura compuesta por bits, siendo la formageneral de declararla la siguiente:
Campos de Bits (1)
struct <nombre>{
<tipo_1> <miembro_1>: <longitud_1>;
<tipo_2> <miembro_2>: <longitud_2>;
...
<tipo_N> <miembro_N>: <longitud_N>
} <variables>;
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
74
• En donde:
tipo: Puede declararse como char, int, signed óunsigned.
longitud: Define la longitud en bits de cada campo,pudiendo variar entre 1 y el máximo número de bits, deacuerdo al tipo del campo. Por ejemplo, si es del tipochar, entonces podrá valer entre 1 y 8 bits. Y si lalongitud es 1, sólo podrá ser el campo del tipounsigned.
Campos de Bits (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
7575757575757575
• Por ejemplo:
Campos de Bits (3)
struct naipe{
unsigned valor: 4;
unsigned palo: 2;
}carta;
carta.valor = 10;
carta.palo = 3;
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
7676767676
• Una unión es una posición de memoria que escompartida por varias variables, que pueden ser de tiposdiferentes. Por ejemplo, en la siguiente declaración x esuna variable, que podrá alojar tanto un entero como uncarácter:
union IntChar{int num;
char car;
} x;
Uniones (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
77777777777777
• En la variable x, tanto el entero num como el carácter carcomparten la misma posición de memoria. Y elcompilador asigna el suficiente espacio de memoria, paraque se pueda almacenar al más grande de los miembrosespecificados. Y si escribimos la siguiente porción decódigo:x.num = 4427;printf("Int = %d – Char = %c \n", x.num, x.car);
x.car = ‘M’;printf("Int = %d – Char = %c \n", x.num, x.car);
Uniones (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
78787878787878
• Produciéndose como salida:
Int = 4427 ; Char = KInt = 4429 ; Char = M
• Recordemos que el tipo int ocupa dos bytes, y el charun byte; por lo tanto:
Uniones (3)
int = B1 B0 char = B0
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
7979797979797979
• Primeramente tenemos:
• Y a continuación:
Uniones (4)
B1 = 0 0 0 1 0 0 0 1
B0 = 0 1 0 0 1 0 1 1 = 75
B0 = 0 1 0 0 1 1 0 1 = 77
B1 = 0 0 0 1 0 0 0 1
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
8080808080808080
• Podemos usar las uniones con los campos de bits parapoder modificar una variable, tanto a nivel de los bytescomo a nivel de los bits. Por ejemplo:
union puerto{unsigned char valor;struct{
unsigned bit_0: 1;..................unsigned bit_7: 1;
};}byte;
Uniones (5)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
818181818181818181
• Hemos declarado una unión, que internamente contieneuna estructura anónima, porque no posee nombre.
• Entonces si queremos escribir un valor en byte,utilizamos la variable de la siguiente forma:
byte.valor = 0xFE;
• Y si queremos acceder a los bits de esa variable,escribiremos:
byte.bit_0 = 1;byte.bit_4 = byte.bit_7;
Uniones (6)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
828282828282
• Una variable del tipo puntero es aquella que almacenauna dirección de memoria en donde se almacena unvalor de un determinado tipo.
• Los punteros se se definen mediante la siguiente sintaxis:
<tipo> * <puntero>;
• Por ejemplo, int *p declara que p es una variable quealmacena una dirección de memoria, en donde se puedealmacenar un entero. Por lo tanto se dice que p"apunta" a una variable de tipo entero.
Punteros (1)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
83838383838383
• Los operadores asociados a punteros:
&: Devuelve la dirección que una variable tiene enmemoria (operador de dirección) . Por ejemplo:
& <variable>;
*: Devuelve el contenido que tiene una dirección dememoria (operador de indirección). Por ejemplo:
* <puntero>;
Punteros (2)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
8484848484848484
• La aritmética de punteros consiste básicamente en tratara los punteros como variables numéricas (que contienendirecciones), é incrementar ó disminuir estas variablespara acceder a las direcciones de memoria contiguas a ladirección original. Por ejemplo, si tenemos la declaracióndel siguiente puntero a una variable entera: char *p;
• Entonces la siguiente sentencia hace que el puntero papunte a la dirección de memoria contigua (posterior) :
p = p + 1;
• Cuando sumamos 1 a un puntero, el incremento seadecúa al tamaño en memoria de la variable apuntada.
Punteros (3)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
858585858585858585
• Existe una estrecha relación entre punteros y arreglos,tanto que pueden ser usados en forma casi indistinta.Esto es, una variable de tipo arreglo puede considerarsecomo un puntero al tipo del arreglo.
• Por ejemplo, sean las siguientes declaraciones:int V[N],*p;
• Entonces podemos hacer las siguientes asignaciones:p = V ó p = &V[0]
*(p + i) = valor ó V[i] = valor
Punteros (4)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
86868686868686868686
• Por ejemplo, sea el siguiente ciclo:for (i = 0; i < N; i++)
s = s + V[i];
• El mismo podría ser escrito también como:for (i = 0; i < N; i++)
s = s + *(V + i);
• Que es equivalente a:for (p = V; p < &V[N]; p++)
s = s + *p;
Punteros (5)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
87878787878787878787
• Así también, como una cadena de caracteres es unarreglo, podemos definir un puntero a una cadena decaracteres de la forma:
char *cadena;
• Por ejemplo, podemos escribir:char *nombre = "Pepito", *p;p = nombre;while (*p != '\0') p++;printf("Largo: %d", p - nombre);
Punteros (6)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
8888888888888888888888
• En el ejemplo, asignamos a la variable nombre ladirección de comienzo de la cadena de caracteres(Pepito). El compilador añade al final de ella elcarácter nulo, para poder detectar el final de la misma.
• Luego copiamos la dirección de inicio de la cadena en elpuntero p, y al incrementarlo en uno, vamos tomandocarácter por carácter, hasta llegar al carácter nulo.
• Siendo la diferencia p – nombre la longitud de lacadena.
Punteros (7)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
898989898989898989898989
• Puesto que la sentencia while sólo comprueba si laexpresión:
*p != '\0'• es distinta de cero, en lugar de hacer la comparación
explícita se puede hacer ímplicitamente de la siguientemanera:
while (*p) p++;
• Y como ahora la expresión está formada únicamente por*p, podemos por lo tanto escribir finalmente:
while (*p++);printf("Largo: %d", p – nombre - 1);
Punteros (8)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
90909090909090909090909090
• También podemos tener punteros a estructuras. Porejemplo, supongamos que tenemos las siguientedeclaraciones:
typedef struct{int re, im;
}complejo;
complejo x, y, *z;
• El puntero z apunta a una estructura del tipocomplejo.
Punteros (9)
Sede Regional OránUNIVERSIDAD NACIONAL DE SALTA
ProgramaciónTÉCNICO UNIVERSITARIO EN PROGRAMACIÓN
9191919191919191919191919191
• Ahora surge la pregunta: ¿Cómo asignamos a laestructura apuntada por z, la suma de los campos re éim, respectivamente? La respuesta inicial sería:
(*z).re = x.re + y.re;(*z).im = x.im + y.im;
• Y para facilitar la notación, utilizaremos el operadorflecha (->), que permite a un puntero acceder a undeterminado campo:
z->re = x.re + y.re;z->im = x.im + y.im;
Punteros (10)