Curso Técnicas de programación Ciclo Superior de Desarrollo de Productos Electrónicos Instituto Río Duero Departamento de Electricidad-Electrónica Compilador empleado =
Estandar C y C++ Santiago J. Martín
LENGUAJES DE PROGRAMACIÓN PASCAL UNIX BASIC COBOL SQL ORACLE RUBY HASKELL ALGO
-
JAVA C FORTRAN DELPHI HTML EIFFEL WAP APL PROLOG ……………
Principios fundamentales Programaciรณn en C
INTRODUCCIร N El lenguaje C es actualmente uno de los mรกs utilizados por aquellos programadores que buscan la estructura de un lenguaje de alto nivel con la potencia y eficacia de un lenguaje ensamblador. Es utilizado para prรกcticamente cualquier tarea de programaciรณn.C
Orígenes del C
El lenguaje C fue inventado por Dennis Ritchie en 1972 cuando trabajaba, junto con Ken Thompson, en el diseño del sistema operativo UNIX. El lenguaje C deriva del lenguaje B de Thompson, el cual, a su vez, deriva del lenguaje BCPL desarrollado por Martin Richards. Durante muchos años el estándar de C fue la versión proporcionada con el sistema operativo UNIX versión 5. Pero pronto empezaron a surgir muchas implementaciones del C a raíz de la popularidad creciente de los microordenadores. Por este motivo, se hizo necesario definir un C estándar que está representado hoy por el ANSI C.
Características del lenguaje C
- Este lenguaje se ha utilizado para el desarrollo de aplicaciones tan dispares como: hojas de cálculos, gestores de bases de datos, compiladores, sistemas operativos, ...
- Es un lenguaje de medio nivel. Este lenguaje permite programar a alto nivel (pensando a nivel lógico y no en la máquina física) y a bajo nivel (con lo que se puede obtener la máxima eficiencia y un control absoluto de cuanto sucede en el interior del ordenador).
Características del lenguaje C
- Es un lenguaje portátil. Los programas escritos en C son fácilmente transportables a otros sistemas.
- Es un lenguaje potente y eficiente. Usando C, un programador puede casi alcanzar la eficiencia del código ensamblador junto con la estructura del Algol o Pascal.
Como desventajas habría que reseñar que es más complicado de aprender que otros lenguajes como Pascal o Basic y que requiere una cierta experiencia para poder aprovecharlo a fondo.
LENGUAJE C
Basado en el Sistema Operativo UNIX.C Parte del lenguaje BCPL (Martin) Mejorado por Thompson (lenguaje B) Lo inventó Dennis Ritchie 1972 En 1989 se crea el estándar ANSI de C Lenguaje de medio nivel Software de sistemas Multitud de compiladores : Turbo C / C++ Borland C / C++ Microsoft C / C++ Etc……..
COMPONENTES DE UN PROGRAMA EN C Todos los programas en C comparten unas caracterĂsticas comunes. Para familiarizarse con estos elementos se propone el siguiente programa: /* Primer programa en lenguaje C */ #include "stdio.h" main() { printf("Este es el primer programa en C"); } Una vez compilado y ejecutado, el programa muestra en pantalla el texto: Este es el primer programa en C
COMENTARIOS En C estรกndar de ANSI no se pueden anidar comentarios (uno dentro de otro), como muestra el siguiente comentario dentro de un comentario, que generarรก un error de compilaciรณn: /* esto es /* un error */ */
Turbo C tiene una opciรณn de anidar, pero haciendo esto se convierte en no transportable (el cรณdigo fuente no se puede llevar a otro compilador de C o a otro ordenador).
INCLUSIÓN DE LIBRERIAS #include "stdio.h" Si se encierra el archivo entre comillas, se busca el archivo primero en el directorio de trabajo actual. Si no se encuentra, se busca en cualquier directorio especificado en la línea de órdenes. Finalmente, si el archivo todavía no se ha encontrado, el compilador busca los directorios estándar.
INCLUSIÓN DE LIBRERIAS #include <stdio.h> En caso de encerrarse el archivo entre menor mayor, el compilador buscará primero en el archivo en los directorios que se especifican en la línea de órdenes de compilador. Si no se encuentra el compilador busca en los directorios estándar. En ningún momento el compilador busca el directorio actual de trabajo.C
SENTENCIAS Todas las sentencias de C terminan en punto y coma (;). C no reconoce el final de línea como un límite. Esto significa que no hay restricciones sobre la posición de las sentencias dentro de una línea. Se pueden situar dos o más sentencias en una línea. La forma más simple de una función de C: nombre_de_función() { secuencia de sentencias; }
main ( ) Aunque un programa en C puede contener diversas funciones, la única función que DEBE tener es main() ("principal"), la función main() es la función en la que comienza la ejecución de un programa. Es decir, cuando el programa comienza a operar, empiezan ejecutando las sentencias que hay dentro de la función main(), empezando por la primera sentencia que hay después de la llave de apertura. La ejecución del programa termina cuando se alcanza la llave de cierre.
IDENTIFICADORES Los operadores manipulan variables y constantes para formar expresiones. Estos cuatro -variables, constantes, operadores y expresiones- son el abecedario del lenguaje C. NOMBRES DE IDENTIFICADORES El lenguaje C define IDENTIFICADORES como los nombres que se utilizan para referenciar variables, funciones, etiquetas y otros objetos definidos por el usuario. En C un identificador puede tener de uno a varios caracteres. El primer carácter DEBE ser una letra o un subrayado, los restantes caracteres pueden ser cualquier combinación de caracteres alfabéticos y numéricos (incluido el símbolo de subrayado).
DECLARACIÓN DE VARIABLES Y ASIGNACIÓN DE VALORES Una VARIABLE es una posición de memoria con nombre que puede guardar distintos valores. En C, a diferencia de otros lenguajes de computadora, todas las variables se deben declarar antes de poder utilizarlas. C soporta 5 tipos diferentes básicos: char, int, float, double, void. Para declarar una variable se utiliza esta forma general: tipo nombre_de_variable; Por ejemplo a continuación se declara que contador es de tipo int: int contador;
En C una declaración de variable es una sentencia y debe terminar con un punto y coma. Se puede declarar más de una variable del mismo tipo utilizando una lista separada por comas. Por ejemplo: float x, y, z; En C se pueden dar valores a la mayoría de las variables a la vez que se declaran poniendo un signo igual y una constante después del nombre de la variable, el formato general de la inicialización es: tipo nombre_de_variable = valor;
Estudio de la sentencia printf printf (â&#x20AC;&#x153;%dâ&#x20AC;?, num); nombre de la variable sentencia
especificador de formato
La función printf() Muestra en pantalla los caracteres contenidos entre las comillas dobles de inicio y fin (las comillas dobles no se muestran en pantalla). printf ("cadena-a-mostrar");
En C uno o más caracteres encerrados entre comillas dobles se llama CADENA.
A la cadena entre comillas que hay entre los paréntesis de printf() se la llama ARGUMENTO.
función printf() Su
prototipo es:
int printf(char* cadena de control, lista de argumentos);
Este
prototipo de función está en el fichero de cabecera stdio.h. La CADENA DE CONTROL consta de 2 tipo de elementos: 1º Los caracteres que se imprimirán en la pantalla. 2º Órdenes de formato que definen la manera en que se visualizarán los argumentos
La función printf() En C, la llamada a una función de biblioteca es una sentencia; por eso debe terminar con un punto y coma. Para llamar a una función, se especifica su nombre seguido de la lista de argumentos que se va a pasar, entre paréntesis. Si la función no requiere ningún argumento, no se especificarán argumentos -y la lista entre paréntesis aparecerá vacía-. Si hay más de un argumento, los argumentos deben estar separados por comas.
printf -
secuencias de escape
Permite escribir por el dispositivo de salida estándar ---- Caracteres y secuencias de escape como \n . Ejemplo = printf (“ Instituto Río Duero \n “); \b Retroceso
\f Alimentador de hojas
\n Nueva línea
\r Retorno de carro
\t Tabulador horizontal
\" Doble comilla
\’ Comilla simple
\0 Nulo (para cadenas)
\\ Barra invertida
\v Tabulador vertical
\a Alerta
\o Constante octal
\x Constante hexadecimal
especificadores de conversión ---- Especificadores de conversión, empiezan por % . Ejemplo = printf (“hoy estamos a %d º de temperatura “, temp);
d = decimal o = octal f = float e = exponencial s = cadena de caracteres
x = hexadecimal c = carácter
Estudio de los especificadores de formato /* muestra valores de punto flotante en */ /* formato regular y exponencial */ main() { float A = 2500.125; float B = 0.0033; float C = -50.99; float D = 0.6664655555555555456; float E = 666; printf("\n%f\t %e\n\n", A,A); printf("%f\t %e\n\n", B,B); printf("%f\t %e\n\n", C,C); printf("%f\t %e\n\n", D,D); printf("Marca mi numero es el %f \n\n",E); }
main() { char hola='h',adios=104; int i=97; unsigned long l=12345678; float f=9876.54321; double d=66.6e+088; unsigned int acedo=65432; unsigned int suave=55434; printf("%c tipo char en caracter\n",hola); printf("%d tipo char en decimal\n",hola); printf("%c tipo char en caracter\n",adios); printf("%d tipo char en decimal\n",adios); printf("%c tipo int como caracter\n",i); printf("%d tipo int en decimal\n",i); printf("%x tipo int como hexadecimal\n",i); printf("%lc tipo long como caracter\n",l); printf("%ld tipo long como decimal\n",l); printf("%lx tipo long como hexadecimal\n",l); printf("%lc tipo float como caracter\n",f); printf("%f tipo float como decimal\n",f); printf("%e tipo float como exponencial\n",f); printf("%f tipo double como decimal\n",d); printf("%e tipo double como exponencial\n",d); }
Ejemplos con printf
Estudio de variables tipo char
/* muestra algunas variables de tipo */ /* char como caracteres y como enteros. */ main() { char plus = 'A' , ultra = 99; char b=98; char c=99,e=101,d=100,o=111; printf("El caracter %c tiene el codigo ASCII %d\n", plus,plus); printf("si se opera (A+10)-10 obtendra %c\n",(plus+10)-10); printf("El caracter %c tiene el codigo ASCII %d\n", ultra, ultra); printf("el caracter %c tiene el codigo ASCII = %d\n" ,b,b); printf("El caracter %c tiene el codigo ASCII = %d\n" ,c,c); printf("mi nombre es = %c%c%c%c%c\n",plus, c, e, d, o); }
Formas de imprimir con printf
main() { /* Muestra como printf() sigue en la misma linea. */ printf("\nEn realidad"); printf(" esta linea "); printf(" sale de tres distintas.\n"); printf("Esta linea es como es.\n"); printf("Esta introduce mi nombre que es %s.",“Jose Luis"); /* Estudio y utilizacion del \a \n \t */ printf (" \n\n \a\a\a \n\nLos programadores \t%s ","\somos todos\nsolo tienes\ \t\ que aplicarte\n\ \ adios \ "); }
Distintos formatos de
main() { int i = 12; long l = 1234; float f = 123.45; printf(" Entero: %d \n", i); printf(" Entero de tipo long: %ld\n\n", i); printf(" Entero: %d \n", l); printf(" Entero de tipo long: %d\n", l); printf(" Exponencial: %e\n", l); printf(" Float: %f \n\n", l); printf("%12.6f\n", f); printf("%8.4f\n", f); printf("%8.3f\n", f); printf("%8.2f\n", f); printf("%1.0f\n", f); }
/*
float
/* cuidado */ ojo */
PROGRAMA 4
Ejemplos
n = 65; b = d; hola = 2000; printf (“ el número %d es impar. \n”,n); printf (“ el número %c es impar. \n”,95); printf (“ el número %f es impar. \n”, n); printf (“ la resultante es =%d \n”,5+5); printf (“ el número %d es impar.\n”,a); printf (“ el número %c es impar. \n”,b); printf (“ el número %ld es impar.\n”,n); printf (“ si se suma 2+2 = %d \n”,2+6); printf (“ %d %c %d %d \n”,n,b,n,b,j); printf (“ %c %d %d %c \n”,n,b,hola,adiós);
Son conocidas a lo largo de todo el programa y las puede utilizar cualquier trozo de c贸digo del programa. Adem谩s, mantendr谩n su valor durante toda la ejecuci贸n del programa. Por ejemplo:
# include "stdio.h" int max; /* Esta es una variable global */ main() { max = 10; f1(); } f1() { int i; /* Variable local */ for(i = 0; i < max; i++) printf("%d",i); }
Variables globales
VARIABLES GLOBALES Y LOCALES Hay dos lugares básicos donde se declara una variable: dentro de una función y fuera de todas las funciones. Estas variables se llaman variables LOCALES y variables GLOBALES, respectivamente.
Las variables locales (declaradas dentro de una función) sólo las pueden referenciar las sentencias que estén dentro de esa función. No son conocidas fuera de su propia función. Una de las cosas más importantes que hay que entender sobre las variables locales es que solamente existen mientras se está ejecutando la función en la que están declaradas. Es decir, una variable local se crea al llamar a su función y se destruye cuando se sale por lo que no pueden mantener sus valores entre llamadas.
Ámbito de las variables La
declaración de las variables lleva asociado un ámbito, dentro del cual la variable es visible: – Ámbito global: La variable es visible para todas
las funciones del programa. – Ámbito local: La variable es visible sólo dentro de la función. (Tiene prioridad sobre el ámbito global)
En C, una variable local y una variable global pueden tener el mismo nombre. Por ejemplo:
# include "stdio.h" int contador;
/* contador como variable global */
main() { contador = 10 ; f1() ; printf ("contador en main(): %d\n", contador") ; } f1() { int contador;
/* contador como variable local */
contador = 100; printf("contador en f1() : %d", contador); } El programa muestra esta salida de pantalla: contador en f1() : 100 contador en main() : 10
Las variables globales son muy útiles cuando muchas funciones del programa utilizan los mismos datos. Sin embargo, se deberían utilizan variables locales donde se pueda, ya que un uso excesivo de variables globales tiene algunas consecuencias negativas: Primero, las variables globales utilizan memoria todo el tiempo que el programa está en ejecución, no sólo cuando se necesitan. En situaciones en las que la memoria es un recurso escaso, esto podría suponer un problema. Segundo, la utilización de una variable global donde serviría una variable local hace a una función menos general, ya que confía en algo que se debe definir fuera de sí misma.
TIPOS DE DATOS Todas las variables en C se deben declarar antes de usarlas. Es necesario porque el compilador debe saber qué tipo de datos es una variable antes de poder compilar cualquier sentencia en la que se use. En C hay cinco tipos básicos: carácter (character) entero (integer) punto flotante (floating-point) doble punto flotante (double-floating-point) sin valor (valueless) Las palabras claves para declarar variables de estos tipos son :
char, int, double y
float, void
Declaración de variables Declaración
simple:
– char c; – unsigned int i;
Declaración
múltiple:
– char c,d; – unsigned int i,j,k;
Declaración
y asignación:
– char c=’A’; – unsigned int i=133,j=1229;
Tipo
bit
Rango
char
8
-
128 a 127
int
16
-
32768 a 32767
float
32
-
3.4E-38 a 3.4E+38
double
64
-
1.7E-308 a 1.7E+308
void
0
-
sin valor
Los tipos de datos básicos excepto el tipo void se pueden modificar utilizando modificadores de tipo de C para que se ajusten más adecuadamente a las necesidades específicas surgidas en un programa. Estos modificadores de tipo son: Signed
unsigned
long
short
Tipo
bits
Rango
char
8
-128 a 127
unsigned char
8
0 a 255
Signed char
8
-128 a 127
int
16
-32.768 a 32.767
unsigned int
16
0 a 65.535
signed int
16
-32.768 a 32.767
short int
16
-32.768 a 32.767
unsigned short int
16
0 a 65.535
signed short int
16
-32.768 a 32767
long int
32
-2147483648 a 2147483647
signed long int
32
-2147483648 a 2147483647
float
32
3,4 E -38 a 3,4 E +38
double
64
1,7 E -308 a 1,7 E +308
long double
64
1,7 E -308 a 1,7 E +308
CÓDIGO FORMATO %c Un sólo carácter %f Punto flotante %e Notación científica (minúscula) %o Octal sin signo %u Entero decimal sin signo %p Muestra un puntero %ld Muestra un long %lx Muestra un long %le Muestra un double %Ld Muestra un long double %Le Muestra un long double
%d Entero decimal con signo %i Idem %E Notación científica (mayúscula) %s Cadena de caracteres %x Hexadecimal sin signo (letra minúscula) %X Hexadecimal sin signo (letra mayúscula) %lo Muestra un long %lf Muestra un double %lg Muestra un double %Lf Muestra un long double
Cálculo del máximo valor que admite un tipo Lo primero es conocer el tamaño en bytes de ese tipo de dato. Vamos a ver un ejemplo con el tipo INT. #include <stdio.h> int main() { Int num1; printf( "El tipo int ocupa %i bytes\n", sizeof(int) ); } En mi ordenador el resultado es: El tipo int ocupa 4 bytes. Ahora para calcular el máximo número debemos elevar 2 al número de bits obtenido. En nuestro ejemplo: 2^32=4.294.967.296.
Operador Sizeof
También nos permite conocer el tamaño en bytes de una variable. De esta manera no tenemos que preocuparnos en recordar o calcular cuanto ocupa. Además el tamaño de una variable cambia de un compilador a otro, es la mejor forma de asegurarse. Se usa poniendo el nombre de la variable después de sizeof y separado de un espacio: #include <stdio.h> int main() { int variable; printf( "Tamaño de la variable: %i\n", sizeof variable ); }
overflow El overflow es lo que se produce cuando intentamos almacenar en una variable un número mayor del máximo permitido. El comportamiento es distinto para variables de números enteros y para variables de números en coma flotante.
- Direcciones de las variables
Para ello utilizamos el carácter “&” seguido del nombre de la variable. El valor se imprimirá normalmente en hexadecimal. El especificador que emplearemos no depende del tipo de variable de la cual obtendremos la dirección . El valor numérico de la dirección de las variables siempre será de la misma longitud ( puede variar de un sistema a otro ). Ejemplos = printf (“ variable cuya dirección es = %d \n”, &ciclo); printf (“ variable cuyo valor es = %d \n”, ciclo);
OPERADORES ARITMÉTICOS
Los operadores aritméticos son: -
Resta y menos
+
Suma
*
Multiplicación
/
División
%
Módulo división
++
Incremento
--
Decremento
(no float o double)
INCREMENTOS Y DECREMENTOS DE FORMA COMPACTA
++
--
main() { int a=50; printf("a ES %d\n",a); printf("++a ES %d\n",++a); printf("--a ES %d\n",--a); printf("a++ Es %d\n",a++); printf("a ES %d\n",a); printf("a-- Es %d\n",a--); printf("a ES %d\n\n",a); } PROGRAMA 6
x++ ; /* equivale a x = x + 1 */ x-- ; /* equivale a x = x - 1 */ Estos operadores pueden preceder o seguir su operando: x++ ; o ++x ;
x-- ; o --x ;
Hay diferencia cuando se usa en una operaci贸n. Cuando un operador incremento o decremento precede a su operando, C realiza la operaci贸n de incremento o de decremento antes de usar el valor del operando. Cuando el operador sigue al operando, C usa el valor del operando antes de incrementar o decrementarlo. Ejemplo: x = 10 ;
y = ++x ; y = x++ ;
En ambos casos el valor final de x es 11, la diferencia es cuando lo hace.
Operador módulo : % Proporciona Ejemplo
el resto de una división
13 % 5 es 3
Utilizando
este operador realiza un programa que nos pida que introduzcamos segundos y nos informe los minutos que son y los segundos que sobran.
Precedencia de operadores en las expresiones
main() { int a = 15, b = 21, c = 7, d = 43; printf("87 + 13 = %d\n",87 + 13); /* Enteros. */ printf("65 + 12 - 9 = %d\n",65 + 12 - 9); printf("8.9 + 5.3 - 7 = %f\n",8.9 + 5.3 - 7); /* Flotantes. */ printf("1 + 2 * 3 = %d\n", 1 + 2 * 3); printf("5 * (8 - 5) = %d\n", 5 * (8 - 5)); printf("a * a - c + b = %d\n", a * a - c + b); printf("a * (a - (c + b)) = %d\n", a * (a - (c + b))); printf("Tipo entero: 10 / 3 = %d\n", 10 / 3); printf("Tipo float: 10 / 3 = %2.12f\n", 10.0 / 3.0); }
OPERADORES ARITMÉTICOS DE ASIGNACIÓN
+=
-=
*=
/=
%=
main() { float b=4,l=5; int a=20,n=10; printf("VALORES INICIALES a=%d n=%d l=%f b=%f\n",a,n,l,b); /*DISTINTAS OPERACIONES MATEMATICAS*/ printf("a+=5 HACE QUE a SEA %d\n",a+=5); printf("a-=n HACE QUE a SEA %d\n",a-=n); printf("l*=2 HACE QUE a SEA %f\n",l*=2); printf("l/=n HACE QUE a SEA %f\n",l/=n); printf("b+=5 HACE QUE a SEA %f\n",b+=5); printf("l+=l HACE QUE a SEA %f\n",l+=l); printf("l+=5 HACE QUE a SEA %f\n",l+=5); printf("n+=b HACE QUE a SEA %d\n",n+=b); printf("n+=l*b HACE QUE a SEA %d\n",n+=l*b); /*DISTINTAS FORMAS DE INCREMENTAR*/ printf("a=a+3 HACE QUE a SEA %d\n",a=a+3); printf("a+=1 HACE QUE a SEA %d\n",a+=1); printf("a=a*2 HACE QUE a SEA %d\n",a=a*2); printf("a=a*2 HACE QUE a SEA %d\n",a=a*2); printf("b=b*2+l/n HACE QUE a SEA %f\n",b=b*2+l/n); printf("l=l/3 HACE QUE a SEA %f\n",l=l/3); printf("n=n*5 HACE QUE a SEA %d\n",n=n*5); }
Valor de retorno de printf () 1. 2. 3. 4. 5. 6. 7. 8.
#include <stdio.h> main() { int n = 100; int rv; rv = printf("El punto de ebullici垄n del agua es %d grados.\n", n); printf("La funci贸n printf() ha impreso %d caracteres.\n", rv); }
Anchura de los campos #define RENTA 1234.56 main() #include <stdio.h> #define PAGINAS 336 main() { printf("/%d/\n", PAGINAS); printf("/%2d/\n", PAGINAS); printf("/%10d/\n", PAGINAS); printf("/%-10d/\n", PAGINAS); }
{ printf("/%f/\n", RENTA); printf("/%e/\n", RENTA); printf("/%4.2f/\n", RENTA); printf("/%3.1f/\n", RENTA); printf("/%10.3f/\n", RENTA); printf("/%10.3e/\n", RENTA); printf("/%+4.2f/\n", RENTA); printf("/%010.2f/\n", RENTA); }
estudio de la sentencia
scanf (“%d”,&num);
scanf
dirección de “nombre de la variable”
Sentencia
especificador de formato PROGRAMA 5
main() { int partidos, ganados, empatados, perdidos; int ptos_ganar, ptos_empatar, ptos_perder,ptos_total,puntosg,puntose,puntost; ptos_ganar= 3; ptos_empatar=1; ptos_perder=0; printf("\n\n\n\t Zamora CF \n"); printf("Partidos que ha ganado: "); scanf("%d", &ganados); printf("Partidos que ha empatado: "); scanf("%d", &empatados); printf("Partidos que ha perdido: "); scanf("%d", &perdidos); partidos= ganados + empatados + perdidos; puntosg=ptos_ganar * ganados; puntose=ptos_empatar * empatados; puntost=puntosg + puntose; printf("\n\n\n"); printf("\t\tRelaci¢n al equipo de futbol Zamora CF\n\n\n "); printf("\t\t\t\t Partidos\t Puntos\n"); printf("\t Partidos ganados =\t\t %2d\t\t%2d\n",ganados,puntosg); printf("\t Partidos empatados =\t\t %2d\t\t%2d\n",empatados,puntose); printf("\t Partidos perdidos =\t\t %2d\t\t___\n\n",perdidos); printf("\t Total =\t\t %2d\t\t%2d\n\n",partidos, puntost); }
Ejemplos con scanf
PROGRAMA 5
OPERADORES RELACIONES Y LÓGICOS Los operadores relacionales comparan 2 valores y devuelven un resultado verdadero o falso, basado en la comparación. Los operadores lógicos agrupan valores de verdadero/falso. En C, verdad es cualquier valor distinto de cero, mientras que falso es cero.
Los operadores relacionales y lógicos son: RELACIONALES
LÓGICOS
>
Mayor que
&&
AND
>=
Mayor o igual que
||
OR
<
Menor que
!
NOT
<=
Menor o igual que
==
igual que
!=
Distinto que
OPERADORES DE RELACIÓN > < >= <= !=
==
main () { int a=20, b=15, c=10; printf("Es a>b %d\n",a>b); printf("Es a= =b %d\n",a= =b); printf("Es a<b %d\n",a<=b); printf("Es a=b %d\n",a=b); printf("Es a= =b %d\n",a= =b); } Programa 7
Operadores l贸gicos Los operadores l贸gicos se usan para soportar las operaciones b谩sicas l贸gicas AND, OR y NOT de acuerdo con la siguiente tabla de verdad que usa "1"para verdad y "0" para falso. OPERADOR &&.El resultado es verdadero si los dos operandos son verdadero. OPERADOR ||.El resultado es verdadero si al menos uno de los operandos es verdadero. OPERADOR !.El resultado es verdadero si el operando el falso y viceversa.
Operadores lógicos
&& = AND
| | = OR
! = NOT
main() { printf("1 AND 1 es %d\n", 1 && 1); printf("1 AND 0 es %d\n", 1 && 0); printf("0 AND 1 es %d\n", 0 && 1); printf("0 AND 0 es %d\n\n", 0 && 0); printf("1 OR 1 es %d\n", 1 || 1); printf("1 OR 0 es %d\n", 1 || 0); printf("0 OR 1 es %d\n", 0 || 1); printf("0 OR 0 es %d\n", 0 || 0); } PROGRAMA 8
Diagramas de flujo operaciรณn en general operaciรณn de entrada / salida inicio - final modificaciรณn/inicializaciรณn operaciรณn auxiliar subprograma o subrutina comentarios
OPERADORES A NIVEL DE BIT C contiene diversos operadores especiales que incrementan enormemente su poder y flexibilidad especialmente para su programación a nivel del sistema que realizan sus operaciones bit a bit. Como C fué diseñado para reemplazar el lenguaje ensamblador en la mayoría de las tareas de programación, tenía que poseer la habilidad de soportar todas (o al menos muchas) operaciones que pueden realizarse en lenguaje ensamblador. Las operaciones sobre bits se refieren a la comprobación, configuración o desplazamiento de los bits reales contenidos en un byte o una palabra. Estos operadores trabajan con los tipos caracter y entero.
La lista de estos operadores es: &
AND
|
OR
^
OR EXCLUSIVA (XOR)
~
Complemento a 1 (NOT) (unario)
>>
Desplazamiento a la derecha
<<
Desplazamiento a la izquierda
FUNCIONES CON ARGUMENTOS Un argumento de una funci贸n es un valor que se pasa a la funci贸n en el momento que se realiza la llamada. Se pueden crear funciones que toman argumentos. Por ejemplo: /* Ejemplo de los argumentos de una funci贸n */ # include <stdio.h> main() { mul(10,11); } mul(a, b) int a, b; { printf("%d", a * b); }
FUNCIONES QUE DEVUELVEN VALORES En C, una funci贸n devuelve un valor a la rutina que la llama usando la clave return. # include <stdio.h> main() { int respuesta; respuesta = mul(10 , 11); printf("la respuesta es %d \n", respuesta); } /* Esta funci贸n devuelve un valor */ mul(int a , int b) { return a * b ; }
bucles for while do .............while
Bucle for El formato del bucle for es el siguiente: valores iniciales condiciones incrementos { conjunto de intrucciones a ejecutar en el bucle . . . . . }
SENTENCIAS
VALORES INICIALES
CONDICIÓN SI ACTUACIONES
SENTENCIAS DEL BUCLE
RESTO DEL PROGRAMA
NO
Bucle FOR
Ejemplo de bucle for main() { int i; for ( i=0 ; i<100 ; i++ ) { printf( instituto " ); printf( rĂo " ); printf( duero \n" ); } }
Cuando solo hay una sentencia se puede poner de forma compacta main() { for ( i=0 ; i<100 ; i++ ) printf( "Hola\n" ); }
/* cuidado con ;*/
PROGRAMA 9
SENTENCIAS
CONDICIÓN SI
NO
ACTUACIONES
RESTO DEL PROGRAMA
Bucle WHILE
Ejemplos del bucle while •
main()
•
{
•
int contador = 1;
•
while (contador <51)
•
{
•
printf("%d\n", contador);
•
contador++ ;
•
}
• •
printf("-Hecho!\n"); }
SENTENCIAS
Bucle
ACTUACIONES
DO
CONDICIÓN SI
NO
WHILE RESTO DEL PROGRAMA
Ejemplo del bucle do
......while 1. 2. 3. 4. 5. 6.
main() { int i=1; do { printf("%d\n",i); i++;
7. 8. 9. 10.
} while (i<11); printf ("-Hecho!\n"); } PROGRAMA 11
ejemplos de contadores 1.
main()
2.
{
3.
int contador =100;
4.
printf("\n\n ÂżquĂŠ hace este bucle ? \n\n");
5.
while (contador >50)
6.
{
7.
printf("\t\t%d\t\t\t ",contador);
8.
contador=contador-3;
9.
}
10. printf("\n\n\n"); 11. }
ejemplos de contadores 1. main() 2. { 3. int i=1; 4. do 5.
{
6.
printf("%d\n",i);
7.
i++;
8.
}
9. while (i<11); 10.
printf ("-Hecho!\n");
11.
}
1.
#include <stdio.h> Preprocesador
2.
#define PI 3.14159
3.
main()
4.
{
definiendo constantes
5.
float area, circun, radio;
6.
printf("¨Cuål es el radio de su pizza?\n");
7.
scanf("%f", &radio);
8.
area = PI * radio * radio;
9.
circun = 2.0 * PI * radio;
10.
printf("Los par metros b sicos de su pizza son:\n");
11.
printf("circunferencia = %1.2f, rea = %1.2f\n",circun, area);
12.
}
Campos de salida de ancho variable 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
#include <stdio.h> main() { unsigned anchura, precision; int numero = 256; double peso = 242.5; printf("¨Cuál es el ancho?\n"); scanf("%d", &anchura); printf("El número es :%*d:\n", anchura, numero); printf("Ahora introduzca el ancho y la precisión:\n"); scanf("%d %d", &anchura, &precision); printf("Peso = %*.*f\n", anchura, precision, peso); }
#include <stdio.h> #define TOPE 0.933 Ejemplo de #define ESCALA 0.6167 main() preprocesador con { bucles float zapato, pie; printf("Número zapato en centímetros pie\n"); zapato = 30.0; while (zapato < 48.5) /* empieza bucle while */ { /* comienzo del bloque */ pie = ESCALA*zapato + TOPE; printf("%10.1f %16.2f cm.\n", zapato, pie); zapato = zapato + 1.0; } /* final del bloque */ printf("Usted sabe dónde le aprieta el zapato.\n"); }
#include <stdio.h> main() { int num = 1; while (num < 21) { printf("%10d %10d\n", num, num*num); num = num + 1; } }
Tipo de Datos Tipo de dato
Bits
char
8
Rango (con signo) ‐128 a +127
int
16
‐32768 a +32767
float
32
‐3.2x10+38 a +3.2x10+38
double
64
‐1.7x10+308 a +1.7x10+308
void
0
sin valor
Rango (sin signo) 0 a 255 0 a 65535
sin valor
operadores Operadores aritméticos Operador
Significado
Operadores relacionales Operador Significado
+
Suma
>
Mayor
‐
Resta
>=
Mayor o igual
*
Multiplicación
/
División
<
Menor
%
Resto de la división
<=
Menor o igual
++
Incremento
==
Igual
‐‐
Decremento
¡=
Distinto
operadores Operadores lógicos Operador
&& | | ¡
Significado
AND OR NOT
Operadores a nivel de bit Operador
Significado
&
AND
|
OR
^
OR Exclusive
~
Complemento a 1
>>
Desplazamiento a la derecha
<<
Desplazamiento a la izquierda
Diagrama de flujo
Desarrolla un diagrama de flujo para el siguiente problema: – Programa que pida al usuario un número de cinco dígitos, dicho
–
– – – –
número se dividirá entre el resto de la división del número entre 2000 y se multiplicará por 8, al final al número resultante le sumaremos 2345. Al usuario le pediremos que introduzca el número resultante de las operaciones realizadas en el programa, informándole si el número introducido es mayor o menor que el número resultante, también contará los intentos realizados. Dejará realizar un máximo de 20 intentos. Si se localiza el número resultante antes de 10 intentos, imprimirá en pantalla el progrma “ es usted un buen matemático” Si se localiza entre 10 y 20 intentos imprimirá el mensaje “es usted un torpe”, Más de 20 imprimirá “no hay más intentos”.
Estructura SWITCH
Esta estructura se suele utilizar en los menús, de manera que según la opción seleccionada se ejecuten una serie de sentencias. switch (variable) { case contenido_variable1: sentencias; break; case contenido_variable2: sentencias; break; default: sentencias; }
/* Uso de la sentencia condicional SWITCH. */ #include <stdio.h> main() /* Escribe el día de la semana */ { int dia; printf("Introduce el día: "); scanf("%d",&dia); switch(dia){ case 1: printf("Lunes"); break; case 2: printf("Martes"); break; case 3: printf("Miércoles"); break; . . . }
#define LIMITE 15 main() { int cont; float suma, x; for (suma=0.0, x=1.0, cont=1; cont <= LIMITE; cont++, x *= 2.0) { suma += 1.0/x; printf("suma = %f en la etapa %d.\n", suma, cont); } }
/* Uso de la sentencia condicional IF. */ Dibuja
#include <stdio.h> main() /* Simula una clave de acceso */ { int usuario,clave=18276; printf("Introduce tu clave: "); scanf("%d",&usuario); if (usuario==clave) printf("Acceso permitido"); else printf("Acceso denegado"); }
el diagrama de flujo
/* Uso de la sentencia condicional ELSE...IF. */ #include <stdio.h> main() /* Escribe bebé, niño o adulto */ { int edad; printf("Introduce tu edad: "); scanf("%d",&edad); if (edad<1) printf("Lo siento, te has equivocado."); else if (edad<3) printf("Eres un bebé"); else if (edad<13) printf("Eres un niño"); Dibuja el diagrama else de flujo printf("Eres adulto"); }
1. main() 2. { 3.
int n = 3;
4.
while (n)
5.
printf("%d\n", n--);
6.
n = -3;
7.
while (n)
8.
printf("%2d\n", n++);
9. }
1.
#include <stdio.h>
2.
main()
3.
{
4. char ch; 5. 6.
do {
7.
scanf("%c", &ch);
8.
printf("%c", ch);
9. 10.
} while (ch != '#'); }
#define FILAS 6 #define CARS 6 main() { int fila; char ch; for (fila = 0; fila < FILAS; fila++) { for (ch = 'A'; ch < ('A' + CARS); ch++) printf("%c", ch); printf("\n"); } }
1.
#define FILAS 6
2.
#define CARS 6
3.
main()
4.
{
5.
int fila;
6.
char ch;
7.
for (fila = 0; fila < FILAS; fila++)
8.
{
9.
for (ch = ('A' + fila); ch < ('A' + CARS); ch++)
10.
printf("%c", ch);
11.
printf("\n");
12.
}
13. }
Operador
sizeof
#include <stdio.h> main() { printf("El tipo int ocupa %d bytes.\n", sizeof(int)); printf("El tipo char ocupa %d bytes.\n", sizeof(char)); printf("El tipo long ocupa %d bytes.\n", sizeof(long)); printf("El tipo double ocupa %d bytes.\n", sizeof(double)); }
PROGRAMA 13
LECTURA de un carácter desde teclado getchar() Acepta un carácter y lo imprime por pantalla. Su prototipo es: int getchar (void); Tiene el inconveniente de esperar a que se pulse la tecla de retorno para que el dato sea enviado a la computadora.
getche() Espera a pulsar una tecla y después devolver su valor. La función también hace "eco" de la tecla pulsada automáticamente en la pantalla. Su prototipo es: int getche (void);
getch() Es una variación de getche(); funciona de la misma manera excepto que getch() no hace "eco" de los caracteres tecleados.
LECTURA de un carácter desde teclado kbhit() Esta función se utiliza para determinar si se ha pulsado una tecla o no. Si el usuario ha pulsado una tecla, esta función devuelve "verdadero" (distinto de 0), pero no lee el carácter. Si hay una pulsación de tecla esperando se puede utilizar una de las funciones vistas anteriormente. Si no hay pendiente ninguna pulsación de tecla, kbhit() devuelve "falso". Su prototipo es: int kbhit(void);
LECTURA de un carácter desde teclado Un ejemplo para la utilización de kbhit() es: # include <conio.h> int tecla_pulsada, ch; main() { tecla_pulsada = kbhit(); if(tecla_pulsada = =0) ch = getch; } Es muy útil cuando se quiere permitir que el usuario interrumpa una rutina sin forzar realmente al usuario a responder continuamente a un indicador como "¿continuar?".
VISUALIZACIÓN de un carácter
putchar() Esta función muestra un sólo carácter en la pantalla. Su prototipo de función es: int putchar(int ch);
clrscr() Limpia la pantalla en modo texto. Su prototipo de función es: void clrscr(void);
#include <stdio.h>
/* jerga.h -- una forma estúpida de usar el preprocesador */
#include "jerga.h“ programa begin
#define programa main()
entero tuyo, mio vale
#define begin {
suelta("Escribe un entero\n") vale
#define end
traga("%d", &tuyo) vale
#define vale ;
mio = tuyo por DOS vale
#define traga scanf
suelta("-%d es el doble de tu número!", mio)
}
#define suelta printf #define DOS
vale end
2
#define por * #define entero int
Se suelen utilizar como llaves de programa, enmascaramientos, criptación……..
#define NL 10
putch(ARRIBADER);
#define CR 13
putch(NL);
#define BLANCO 32
putch(CR);
#define ARRIBAIZQ 201
for (i = 0; i < altura - 2; i++)
#define ARRIBADER 187
{
#define ABAJOIZQ 200
putch(LADO);
#define ABAJODER 188
for (j = 0; j < (anchura - 2); j++) { putch(BLANCO);
#define LINEA 205 #define LADO 186
} putch(LADO); putch(NL); putch(CR);
main() { int i, j, altura, anchura; printf("Que altura de caja quiere = ");
} putch (ABAJOIZQ);
scanf("%d", &altura);
for (i = 0; i < (anchura - 2); i++)
printf("Como la quiere de ancha? =);
putch(LINEA);
scanf("%d", &anchura);
putch(ABAJODER);
putch(ARRIBAIZQ);
putch(NL);
for (i = 0; i < (anchura - 2); i++) putch(LINEA);
putch(CR); }
#define ESPACIO ' ' int main(void) { char ch; ch = getchar(); while (ch != '\n') { if (ch == ESPACIO) putchar(ch); else putchar(ch + 1); ch = getchar(); } return 0; }
/* convierte segundos en minutos y segundos */ #include <stdio.h> #define SM 60
/* segundos en un minuto */
main() { int seg, min, resto; printf("Convierte segundos en minutos y segundos.\n"); printf("Introduzca segundos a convertir.\n"); scanf("%d", &seg);
/* se lee el numero de segundos */
min = seg / SM;
/* nĂşmero truncado de minutos */
resto = seg % SM;
/* nĂşmero de segundos de resto */
printf("%d segundos son %d minutos, %d segundos.\n", seg, min, resto); }
#define ESCALA "Centigrados"
Sentencia
#define CONGELA 0 int main(void) { float temperatura;
if
int congelado = 0; int dias = 0; printf("Introduzca la lista de temperaturas minimas diarias.\n"); printf("Use grados %s, y pulse s para terminar.\n", ESCALA); while (scanf("%f", &temperatura) == 1) { dias++; if (temperatura < CONGELA) congelado++; } if (dias != 0)
printf("%d dยกas en total: %.1f%% bajo cero.\n", dias, 100.0 * (float) congelado / dias); if (dias == 0) printf("-No se han introducido datos!\n"); return 0; }
/* programa terminado correctamente */
#include <stdio.h> #define ESPACIO ' ' int main(void) { char ch;
while ((ch = getchar()) != '\n') { if (ch == ESPACIO) putchar(ch);
/* deja car cter espacio /* sin modificar
*/
*/
else putchar(ch + 1); } return 0; }
/* cambia los dem s caracteres */
#define TARIFA1 5.418 /* tarifa de los primeros 240 kwh */ #define TARIFA2 7.047 /* tarifa de los siguientes 300 kwh */ #define TARIFA3 9.164 /* tarifa por encima de 540 kwh */ #define LIMITE1 240.0 /* primer bloque de tarifa */ #define LIMITE2 540.0 /* segundo bloque de tarifa */ #define BASE1 (TARIFA1 * LIMITE1) #define BASE2 (BASE1 + (TARIFA2 * (LIMITE2 - LIMITE1))) int main(void) { float kwh; float recibo; printf("Introduzca el gasto en kwh.\n"); scanf("%f", &kwh); if (kwh <= LIMITE1) recibo = TARIFA1 * kwh; else if (kwh <= LIMITE2) /* kwh entre 240 y 540 */ recibo = BASE1 + (TARIFA2 * (kwh - LIMITE1)); else recibo = BASE2 + (TARIFA3 * (kwh - LIMITE2)); printf("La cuenta total por %.1f kwh es %.0f pts.\n", kwh, recibo); return 0; }
#define NO 0 #define SI 1 main() { long num, div;
int primo;
printf("Introduzca el numero deseado; "); printf("pulse s para salir.\n"); while (scanf("%ld", &num) == 1) { for (div = 2, primo = SI; (div * div) <= num; div++) { if (num % div == 0) { if ((div * div) != num) printf("%ld es divisible por %ld y %ld.\n", num, div,num/div); else printf("%ld es divisible pro %ld.\n", num, div); primo = NO; } } if (primo == SI) printf("%ld es primo.\n", num); printf("Introduzca otro nÂŁmero para analizar; "); printf("pulse s para salir.\n"); }
}
Programa de aplicación Programa
que cuente caracteres, palabras de un texto. Se entenderá que el texto se ha terminado cuando se introduzca el carácter |
#define STOP '|' #define SI 1 #define NO 0 main() { char c; long nc = 0L; int nl = 0, np = 0,palabra = NO; while ((c = getchar()) != STOP) { nc++; if (c == '\n') nl++; if (c != ' ' && c != '\n' && c != '\t' && palabra == NO) { palabra = SI; np++; } if ((c == ' ' || c == '\n' || c == '\t') && palabra == SI) palabra = NO; } printf("caracteres = %ld, palabras = %d, lยกneas = %d\n", nc, np, nl); }
#include <stdio.h> #define PROFESOR “pesado y aburrido!" main() { char nombre[50]; printf(“¿Cómo se llama tu profesor?\n"); scanf("%s", nombre); printf(“%s es un tanto %s\n", nombre, PROFESOR); }
Función
strlen
#include <stdio.h> #define ELOGIO "-Por Júpiter, qué gran nombre!" main() { char nombre[50]; printf("¨Cómo te llamas?\n"); scanf("%s", nombre); printf("Hola, %s. %s\n", nombre, ELOGIO); printf("Tu nombre de %d letras ocupa %d celdas de memoria.\n", \ strlen(nombre), sizeof nombre); printf("La frase de elogio tiene %d letras ", strlen(ELOGIO)); printf("y ocupa %d celdas de memoria.\n", sizeof ELOGIO); }
PROGRAMA 14