Introducción
• El lenguaje de programación C:
– Es de uso general – Sintaxis compacta – Alta portabilidad
(ANSI-C) – Creado por Dennis Ritchie, Laboratorios Bell hacia 1972
– Es un lenguaje compilado
• Utilizar editor de texto para escribir (nombre.c) • Compilar para
detectar errores sintacticos • Ejecutar programa resultante
(a.out)
Tema 3
“Resolución de Problemas” Usando el lenguaje de
programación - C
Primer programa
• #include main() • Explicar
sintaxis:
– – – – – – #include main() ; n
printf(“ … ”);
Un segundo programa: Jalisco
#include main()
• ¡Usa variables!
– Declaración 1ro. – Uso al
imprimir
• Recibe una entrada del
usuario
– Scanf – Uso de variables al preguntar
• Hace calculos intermedios
Comentarios en C
• • • • Incluir comentarios en un programa es una
practica saludable, ayuda a su comprensión. Para el compilador C, los
comentarios son inexistentes, No generan líneas de código.
En el lenguaje C se toma como comentario todo caracter interno a los simbolos:
/* */ Los comentarios pueden ocupar uno o mas renglones, por ejemplo:
• • /* esto es un comentario */ /* esto también es un
comentario; pero ocupa 2 líneas */
– – – – –
Identificadores
• Nombres que identificana los objetos de un programa en C:
Variables Funciones Constantes Estructuras de datos Definiciones de tipos
(hechas mediante typedef)
• Los identificadores se construyen con:
– Letras (las del alfabeto mayúsculas y minúsculas, menos
la ñ, Ñ y las acentuadas). No es posible emplear acentos o
caracteres especiales del alfabeto español.
– Dígitos numéricos (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) –
Símbolo de subrayado ) – Sin embargo,
el primer caracter debe ser una letra.
1
Como escoger
buenos identificadores
• Autoexplicativos • Ni muy cortos, ni muy
largos • No pueden ser palabras ya definidas en el lenguaje. Son
“palabras reservadas”:
auto break case char continue default do double else entry extern float for
goto if int long register return sizeof short static struct switch typedef
union unsigned while
Como escoger buenos identificadores
• El lenguaje C es case-sensitive
– Maximo y maximo son dos identificadores distintos.
• El símbolo de subrayado (_) se emplea para dar mayor legibilidad
a nombres compuestos por varias palabras. • Se acostumbra emplear letras
minúsculas para nombrar a las variables y mayúsculas para las
constantes simbólicas.
Identificadores en C - ejemplos
• Identificadores validos:
– – – – – – – – – puntero
nombre_empleado area TAMANO_STRING EdadEmpleado potencia10 i Nombre nombre
Variables
• Toda variable debe ser declarada antes de usarla • Forma
genérica:
[= ] ; donde: puede ser: int, float, char, etc. puede corresponder a una
constante deltipo entero, real, caracter, arreglo, etc. ([] significa opcional)
• Identificadores invalidos:
– – – – 1texto nombre-empleado Teléfono while
Variables
• Ejemplos de declaraciones de variables:
– int numero; – char nombre; •
Tipos de datos provistos por C
Enteros
– – – int (-32.768 a 32.767) short (-128 a 127) long
(-4.294.967.296 a 4.294.967.295)
• Ejemplos de declaraciones asociados a un dato:
– int numero=10; – char nombre = ’G’;
de
variables
•
Reales
– – float (con 7 decimales de aproximación) double (con 16
decimales de aproximación)
•
Caracteres
– char
(´a´,´z´,´?´,´$´,´@´,´G´,´7´,
etc.; en total los 256 caracteres del código ASCII)
2
Cód
Caracter
Cód
Caracter
Cód
Caracter
Cód
Caracter
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31
NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK
SYN ETB CAN EM SUB ESC FS GS RS US
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
58 59 60 61 62 63
SPACE ! ' # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 ; < = > ?
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
117 118 119 120 121 122 123 124 125 126 127
` a b c d e f g h i j k l m n o p q r s t u v w x y z ~ DEL
ExpresionesAritméticas
• Valores numéricos, de tipos enteros o reales. • Operadores
binarios
+ * / % Suma Resta Multiplicación División Módulo
(sólo para int
• Precedencia
++ -- - (unitario) * / % + -
• Operadores unitarios
++ -Signo negativo Incremento Decremento
• Asociatividad
Por la izquierda
Expresiones Aritméticas
• Los operandos pueden ser variables o constantes numéricas.
– Los operadores unarios ++ y -- fueron pensados para aplicarse a
variables; y, – el operador unario - a constantes.
Ejemplos de expresiones aritméticas
• • • • • • • • • •
• 2 + 3 * 2 (2 + 3) * 2 -2 / x x++ ++x 2 - 1 + 3 15 % 6 -x 3 * 4 % 5 3 *
(4 % 5 ) 1 + 15 % 6
• Syntaxis
– operando operador-binario operando – operador-unario operando
– Caso particular:
++ -- (notación pre o postfija)
Expresiones lógicas o booleanas
• Este tipo de valores se emplea para dirigir al programa por un
determinado flujo de ejecución dependiendo de si la evaluación de
una expresión lógica da verdadero o falso. • A diferencia
de otros lenguajes de programación, C no cuenta con un
tipo de datos que permita manipular valores booleanos, o valores de verdad.
• En C, las instrucciones que dependen de valores lógicos dependen
en realidad de un valor entero que se interpreta como
– falso cuando es cero, y – verdadero en caso contrario
•
Expresiones lógicas o booleanas
Operadores binarios && AND || OR Operadores unitarios ! NOT
lógico
•
• Operadores relacionales o comparación == igual != distinto <
menor mayor >= mayor o igualde
3
Expresiones lógicas o booleanas
• Sintaxis
– operando operador-logico-binario operando –
operador-logico-unario operando
Ejemplos de expresiones booleanas
• • • • • • • • • •
• x !x 1 1 || x 0 0 && x (x > 5) && !y (x==1) 5 == 6 4
>= 2 (4 % 2 == 0) || (4 % 3 == 0) && 0
• Precedencia < = > == != && || • Asociatividad
– Se aplica de izquierda a derecha, para operadores con igual
precedencia.
Expresiones
• La precedencia de todos los operadores de C
Maxima
( ) [ ] ! ~ ++ -- - (unitario) * / % + == != & | && || = += -= /=
Estructura de un programa
• directiva #include
– Incluye librerías o bibliotecas de funciones predefinidas
• Ejemplos
#include #include #include #include /* /* /* /* funciones de entrada y salida
*/ funciones basicas */ funciones matematicas basicas */
funciones para manejar cadenas de caracteres */
Mínima
Estructura de un programa
• directiva #define
– Definición de constantes simbólicas – Consiste en
asignar a un identificador un valor que permanecera constante durante el
programa
Estructura de un programa (resumen)
1.
#include #define
2. 3.
Inclusión de librerías Constantes Programa principal
• Ejemplo
#define PI 3.1415
main()
4
Algunas recomendaciones
• Hacer código ordenado:
– 1 instrucción por línea – Utilizar nombres de
variables autoexplicativos – Identar el código – Comentar el
código
Entrada y Salida
• Las de mayor uso son las orientadas a la entrada y salida de datos con
formato(biblioteca stdio.h) • printf
– Salida con formato
• scanf
– Entrada de datos con formato
• Basadas en una serie de caracteres de conversión
Salida con formato: printf
• Sintaxis
printf( 'cadena-de-formato', );
Especificaciones de Conversión
• Los caracteres de conversión de mayor uso son:
número entero en notación decimal (base 10) caracter cadena de
caracteres (string) número con decimales, expresado en notación
exponencial o de punto flotante (mantisa y exponente) f número con
decimales, expresado en notación de punto fijo (parte entera, punto,
parte decimal) d c s e
• Cadena de formato
– Debe ir delimitada por comillas dobles – Debe incluir una
especificación de conversión por cada argumento en la lista de
argumentos. – Texto aparecera durante el
despliegue, y cada especificación de conversión sera
reemplazada por el correspondiente argumento.
• La lista de argumentos consiste de una secuencia de expresiones que se
desean desplegar.
Especificaciones de Conversión
• Pueden incluir
– Un signo menos, que indica que el campo debe ajustarse a la izquierda. – Un número entero, que indica el tamaño
mínimo que debera ocupar el campo al desplegarse. – Un
punto seguido de un número entero, que indica
las posiciones decimales que deben desplegarse. De ser
necesario, se agregan ceros al final.
Ejemplos
printf('El valor de la variable x es: %dn',
x); El valor de la variable x es: 100 Si x contenía un valor igual a
100. Avanzara a la siguiente línea luego del despliegue
printf('Elvalor de dos + cinco es: %dn', 2+5); El valor de dos +
cinco es: 7 Avanzara a la siguiente línea luego del despliegue
printf('El area de %.2fn', radio, area); un circulo con radio %.2f
es
• Secuencias especiales:
%% n t ASCII para imprimir un símbolo de % para provocar que el
cursor cambie de línea para producir una tabulación en el
despliegue despliega el caracter con el código ASCII suministrado
El area de un circulo con radio 1.00 es 3.14 Suponiendo los valores indicados
para las variables. Avanzara a la siguiente línea luego del despliegue
5
Ejemplos
printf('Este es el numero 2 con formato %%5d:
%5d', 2); Este es el numero 2 con formato %5d: 2
Ejemplo: Diversos Formatos de Conversión
/* Impresion de los valores de la variable x con distintos formatos. */
#include main()
printf('Numero 2 con formatos %%-5d y %%d: %-5d %d', 2, 2); Numero 2
con formatos %-5d y %d: 2 2
printf('Este es el caracter %c cuyo codigo ASCII es %d', 'A', 'A');
Este es el caracter A cuyo codigo ASCII es 65
Entrada con formato: scanf
• Sintaxisscanf ( 'cadena_de_control', );
Contenido de cadena de control
• Espacios en blanco, tabuladores o finales de línea, los cuales
no se tomaran en cuenta. • Caracteres ordinarios (distintos de %),
los cuales se espera que coincidan con el próximo caracter %, distinto
de blanco del
flujo de entrada. • Especificaciones de conversión • Un campo de entrada se define como una cadena de caracteres delimitada por
espacios en blanco (incluyendo tabulador y fin de línea).
• La lista de argumentos consiste de una secuencia de punteros a
variables, en las cuales se almacenaran las entradas dadas por el
usuario.
Caracteres de conversión
d número entero; argumento debe ser puntero a int. h número
entero; argumento debe ser puntero a short int. lx número entero;
argumento debe ser puntero a long int. c caracter; argumento debe ser
puntero a char. Para leer el primer caracter distinto de blanco debe emplearse
%1s. s cadena de caracteres; argumento debe ser un
puntero a caracter, o el nombre de un vector de caracteres. f
número con decimales; argumento debe ser puntero a float. Entrada puede ser en notación de punto fijo (parte entera,
punto, decimales), o de punto flotante (mantisa, E, exponente). lf número con decimales; argumento debe ser puntero a
double.
Ejemplos
scanf('%d', &edad); Espera entero que
sera almacenado en la variable edad. scanf('%4d',
&agno); Espera el año actual (4 dígitos). Si se ingresan
mas de 4 dígitos, los restantes se descartaran, o se
dejaran para la siguiente llamada a scanf.scanf('%d
%f', &edad, &salario); Espera un número entero y uno con
decimales. scanf('%s', nombre); Espera una
cadena de caracteres (string). Entrada se almacenara en el vector
nombre, y se delimitara con un ASCII(0) al
final.
6
Ejemplo: lectura de números enteros
#include main()
Algunos detalles sobre el lenguaje C
• Conversiones de tipos • Problema de intercambiar dos variables
• Operadores ++ y --
Conversiones de tipos
• Conversiones automaticas
– De entero a flotante:
• a = 4 + 4.0 • b = 3.5 + 3 4.0 + 4.0 3.5 + 3.0 8.0 6.5 6
Para los ejemplos: float a; int b;
El problema de intercambiar dos variables
• En C:
tmp=A A=B B=tmp
– De flotante a entero:
• Conversiones manuales (casting de tipos)
– (float)1 – (int)1.5 1.0 1.0
El problema de intercambiar dos variables
#include main()
/* Imprime el valor antes del intercambio */ printf('var1 contiene %d y
var2 contiene %dn', var1, var2); aux= var1; var1 = var2; var2 = aux; /*
Imprime el valor luego del intercambio */ printf('var1 contiene %d y var2
contiene %dn', var1, var2); }
b es indefinido y x es %dn', x); x++;n'); x es %dn', b, x);
++x;n'); x es %dn', b, x);
7
Operadores ++ y -• Interpretación correcta
b = x++; – notación postfija (asigna a b el valor antes del
incremento) b = ++x; – notación prefija (asigna a b el valor
después del incremento)
El comando “if”
if ( condición )
• Si ocurre la expresión, se lleva a cabo el bloque de
instrucciones
Variación if/else
if ( condición ) else /* (X) */
Variación if/else if/else
if ( condición ) else if (
expresión-booleana ) else
/* (Y) */
• Permite escoger entre varias ramas • Ej.: programa que imprime
etapa de la vida dependiendo de la edad (niño 0-12, adolescente 13-19,
joven 20-30, adulto 31-50, mayor 51-…)
• Si ocurre algo, hacer X, si no ocurre hacer Y
Ejemplos if
• Crédito autorizado
int salario, credito; if (salario > 1000000) credito = 5000000; else if
(salario > 500000) credito = 2000000; else if (salario > 100000) credito
= 1000000; else credito = 0;
Ejemplo: ¿Qué hago el sabado por la noche?
main() else } /*
continua en pagina siguiente */
8
Ejemplo: ¿Qué hago el sabado por la noche?
else else }
Instrucción switch
switch ( expresión ) case constante2 : case constanteN : default : } 1
2
N
N+1
• Similar a if / else if / else • Es mas claro, es similar a
un menú dealternativas. • “break” hace que el programa
salte al final del
switch. • “default” es un
“atrapa todo”.
Ejemplos switch
/* Tipico switch para un menu de una aplicacion. En la variable entera opcion
el usuario ingreso su eleccion dentro del menu */ switch (opcion) case 2 : case 3 : default : printf('Opcion invalidan'); }
Ejemplos switch
/* Dado un mes, identifica el trimestre */ switch (mes) case 4 : ; case 5 :
; case 6 : case 7 : ; case
8 : ; case 9 : case 10 : ;
case 11 : ; case 12 :
default : }
Ejemplo: Calculo de 2n
• Programa que calcula 2n, para n entre 1 y 10. Para
la implementación se emplea un switch sin
breaks, lo cual puede ser una técnica de programación peligrosa.
main() } x x x x x x x x x = = = = = = = = =
x x x x x x x x x * * * * * * * * * 2; 2; 2; 2; 2; 2; 2; 2; 2;
printf('Resultado: %dn', x);
9
Instrucción while
while ( condición )
Instrucción while
• Al ejecutarse la instrucción while, se evaluara la
condición en losparéntesis, y si su valor es verdadero (distinto
de cero), se ejecutaran las instrucciones entre . •
Una vez hecho esto, la condición se vuelve a
evaluar y se procede de la misma manera. • Cuando la condición se vuelve
falsa (es decir, cero), se dara la instrucción while por
terminada cuando se evalúe. • Las instrucciones subordinadas al
while pueden ser compuestas, es decir, otras instrucciones while, if, etc.
• Realiza una tarea mientras ocurre una cierta condición
• ¡Ahora podemos hacer un programa que
itere! • Se abren muchas posibilidades…
Ejemplo: Contar desde 1 a N
#include main() }
Ejemplo: Tabla de conversión de temperaturas
#include main()
Ejemplo de for
#include int main()
#include main() { double base, pot; int exponente, i;
Calculo de xn
/* Base empleada para el calculo */ /* Exponente empleado para el calculo */
printf('nIngrese el valor de la base: '); scanf('%lf',
&base); printf('Ingrese el valor del exponente: ');
scanf('%d', &exponente); /* Ciclo que realiza el calculo: i
variara de 2 a exponente */ pot = base; for (i=2; i