Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FUNDAMENTOS DE PROGRAMACIÓN
Tema 3
__________________________________________________________________________________________________________
El C como lenguaje estructurado 0
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
1. HISTORIA DEL C.
FORTRAN.
A principios de la década de los 50 la mayoría de los programas informáticos
todavía se escribían en ensamblador, con los inconvenientes que ello suponía en cuanto
al esfuerzo a realizar, el tiempo a invertir, etc.. Evidentemente, esa forma de trabajar de
los programadores repercutía negativamente en la economía de las empresas que los
empleaban. Por este motivo, es decir, fundamentalmente por razones de carácter
económico, a finales de 1953 un empleado de IBM propuso la idea de desarrollar un
lenguaje de alto nivel, que se llamaría FORTRAN, de forma que se facilitaría el trabajo
de los programadores y se incrementaría su productividad.
Así pues, a principios de 1955, un grupo de trabajo se dedicó a diseñar e
implementar un compilador de FORTRAN y lo terminó en 1957. Pretendía ser un
lenguaje que se pudiera traducir eficazmente a lenguaje máquina y, además, fácil de
usar. Su notación era similar a la empleada en matemáticas. Su potencia en los cálculos
matemáticos era significativa. Este lenguaje serviría principalmente para desarrollar
aplicaciones técnicas y científicas.
La versión FORTRAN-66 consiguió ser independiente de la máquina, lo que
hizo a este lenguaje más portable. La versión FORTRAN-77 le añade instrucciones para
posibilitar la programación estructurada, el manejo de archivos y el tratamiento de
cadenas de caracteres. La última versión FORTRAN-90 incluye características como
recursividad, manejo de memoria dinámica, etc.
En resumen, podemos considerar al FORTRAN como el más antiguo de los
lenguajes de alto nivel.
ALGOL
El ALGOL (Algorithmic Languaje -lenguaje algorítmico-) se desarrolló entre
1957 y 1962 con la idea de ser un “lenguaje de programación universal”, de propósito
más general que el FORTRAN y de ser independiente de la máquina. Fue auspiciado
por la americana Association for Computing Machinery (ACM) y por su equivalente
europea, la GAMM. Con el tiempo fue adquiriendo una tendencia algebraica,
orientándose hacia las aplicaciones científicas y de ingeniería. Es un lenguaje de
estructura clara que ha tenido gran influencia en el desarrollo de otros lenguajes de alto
nivel (Pascal y ADA) y en la arquitectura de muchos ordenadores.
El lenguaje C.
Resumen cronológico
Año Autor Desarrollo
1962 Jonh Backus, ALGOL
Peter Naur,...
1967 Martin Richards Lenguaje BCPL
1970 Ken Thompson Escribe versión de MULTICS en ensamblador
UNICS
modifica BCPL lenguaje B
(no consigue escribir UNICS en lenguaje B)
1971 Dennis Ritchie Amplía y modifica el B lenguaje C
Escribe el UNICS en C UNIX
1972 Ken Thompson
Dennis Ritchie 1º versión definitiva de C
Brian Kernighan
1984 Bjarne Stroustrup Lenguaje C++
1989 Estándar ANSI C y el ISO C
finales al lenguaje ese mismo año, que se recogieron en un anexo del libro, el C se fue
haciendo famoso día a día. Se escribieron compiladores para prácticamente todas las
plataformas.
Con el tiempo, los fabricantes de compiladores empezaron a crear extensiones
del lenguaje, y algunos programadores empezaron a crear variantes, es decir,
lenguajes nuevos aplicados a un propósito específico pero basados en el C. El más
famoso de todos fue, y sigue siendo sin duda, el que Bjarne Stroustrup inventó en
1984, llamado C++.
En 1985 se vio claro que había que unificar criterios. Por eso el organismo
americano de estándares (ANSI) creó un comité llamado X3PJ11 para normalizar el
lenguaje. En 1989 el trabajo ya estaba hecho. No obstante, el organismo internacional
de normalización ISO también quiso darle carácter mundial al lenguaje C y creó otro
comité. Ya que el estudio estaba casi hecho no era cuestión de acabar teniendo dos
estándares. Simplemente, el organismo ISO copió la norma elaborada por ANSI, pero se
quejaron de que era demasiado «americano» (evidente, puesto que ANSI es American
National Standards Institute) y entonces empezaron a trabajar en la internacionalización
del lenguaje. Se dice que el C es el último lenguaje de programación sin
internacionalizar (se refieren al tradicional pre-ANSI) y también el primero que se
internacionalizó.
El mismo año 1989 ANSI acabó el trabajo; al año siguiente ISO acabó de
redactar su documento. Los dos son iguales; sólo varía el estilo de la redacción. Así,
podemos hablar de C ANSI o de C ISO indistintamente. El libro de Kernighan y Ritchie
[Kern87] fue revisado y salió una segunda edición un poco antes del estándar definitivo
que recoge casi todas las novedades y cambios del lenguaje.
Sea como fuere, se hizo un buen trabajo. No sólo se normalizó y reguló el
lenguaje sino también una biblioteca auxiliar de funciones que le proporcionan al C
todo lo que de por sí le falta. Entre estas funciones están las de internacionalización.
Mediante ellas es posible que un programa se comporte de forma diferente según el
entorno cultural donde se ejecute. Por ejemplo, mientras que en España o en México
una función que devolviera el nombre del día de la semana daría Domingo, en Gran
Bretaña o EE.UU. daría Sunday; en cambio, un número real se imprimiría en España
como 12,34 mientras que en México lo haría como 12.34.
En septiembre de 1994 se introdujo un anexo que incluía algunas ampliaciones
al sistema de internacionalización: algunas macros y funciones adicionales, y los
ficheros de cabecera <iso646.h>, <wctype.h> y <wchar.h>.
Uno de los puntos de la norma dice que cada cinco años el comité debe volver a
reunirse para revisarla; en efecto, en 1995 se empezó a trabajar en una posible revisión o
modificación y se hicieron algunas propuestas.
2. VENTAJAS DEL C.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 3
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
Concisión en la sintaxis.
3. DESVENTAJAS DEL C.
4. CARACTERÍSTICAS DEL C.
Esto no significa que sea menos potente, más difícil de utilizar o menos
desarrollado que un lenguaje de alto nivel como puede ser BASIC o Pascal; tampoco
implica que C sea parecido al lenguaje ensamblador y por tanto presente sus problemas
asociados. Por el contrario, manifiesta que el C combina elementos de los lenguajes de
alto nivel con la funcionalidad del lenguaje ensamblador; por ejemplo, permite la
__________________________________________________________________________________________________________
El C como lenguaje estructurado 5
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
manipulación de bits, bytes y direcciones (elementos básicos con los que opera la
computadora). Esto hace que se adapte al desarrollo de software base (programación del
sistema), donde estas operaciones son habituales.
Sólo tiene 32 palabras reservadas (27 por parte del estándar de Kemighan y
Ritchie y 5 incorporadas por el comité de estandarización ANSI), que son las órdenes
que constituyen el lenguaje C. Los lenguajes de alto nivel normalmente incluyen
algunas más.
El C es un lenguaje estructurado.
if (x<10)
{
printf(“Demasiado pequeño, inténtelo de nuevo.\n”);
restablecer_contador(-1);
}
}
las dos instrucciones que aparecen entre llaves tras el if se ejecutarán si x es menor que
10. Estas dos instrucciones, junto con las llaves, constituyen un bloque de código. Se
trata de una unidad lógica: una de las instrucciones no se puede ejecutar sin la otra. Los
bloques de código no solamente permiten implementar muchos algoritmos con claridad,
elegancia y eficiencia sino que también ayudan al programador a asimilar la verdadera
naturaleza de la rutina.
Portabilidad del C.
Eficiencia del C.
Quizás la razón más significativa por la que C se utiliza para todo tipo de tareas
de programación es que a los programadores ¡les gusta!. C ofrece la velocidad del
lenguaje ensamblador y la extensibilidad de FORTH, aunque tiene algunas de las
restricciones de Pascal o Modula-2. Cada programador de C puede crear y mantener una
biblioteca única de funciones que se ajuste a su personalidad y que puede utilizar en
diferentes programas. Puesto que C permite (de hecho fomenta) la compilación
separada, ofrece a los programadores poder gestionar proyectos con facilidad y
minimizar la duplicidad de esfuerzos. Y, por supuesto, es el lenguaje sobre el que está
desarrollado C++.
5. FORMATO DE UN PROGRAMA EN C.
Palabras reservadas.
La siguiente tabla muestra las 32 palabras reservadas que, junto con la sintaxis
formal de C, constituyen el lenguaje de programación C.
Funciones.
Todos los programas en C están constituidos por una o más funciones, las cuales
son los módulos básicos del programa y, al menos, una de ellas debe llamarse main() -
que significa "principal"-. Es decir, todo programa debe tener, al menos, una función
denominada main(), y se trata de la primera que se llama cuando comienza la ejecución
del programa. En un código C escrito correctamente, main() engloba el esbozo o
esqueleto de lo que realiza el programa; dicho esqueleto está compuesto por las
llamadas a las funciones. En definitiva, un programa en C siempre comienza
ejecutándose por la función main(); las demás funciones son llamadas desde main(), y
por tanto, se puede considerar que ésta es, por sí misma, el programa.
Aunque técnicamente main() no forma parte del lenguaje C, se debe tratar como
si lo fuera. Por ejemplo, no intente utilizar main como nombre de una variable.
El formato general de un programa en C se muestra en la siguiente figura, donde
f1() a fN() representan funciones definidas por el usuario y una de ellas debe ser main().
declaraciones globales
tipo_devuelto main(lista de parámetros)
{
secuencia de instrucciones
}
tipo_devuelto f1 (lista de parámetros)
{
secuencia de instrucciones
}
tipo_devuelto f2 (lista de parámetros)
{
secuencia de instrucciones
}
......................
tipo_devuelto fN (lista de parámetros)
{
secuencia de instrucciones
}
Ejemplo:
..............
void main(void)
{
int operando1, operando2;
int resultado_suma, resultado_producto;
..........
resultado_suma = suma(operando1, operando2);
resultado_producto = producto(operando1, operando2);
..............
}
int suma (int op1, int op2)
{
return op1 + op2;
}
int producto (int op1, int op2)
__________________________________________________________________________________________________________
El C como lenguaje estructurado 10
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
{
return op1 * op2;
}
El nombre de una función va seguido de unos paréntesis entre los cuales puede ir
o no uno o más argumentos. Una función consta de un encabezamiento (en el que va
incluido su nombre) y de un cuerpo, que está delimitado por llaves: { y } . El cuerpo
consiste en una serie de sentencias, cada una de las cuales termina en punto y coma.
Se hablará detenidamente de las funciones en el tema siguiente.
#include <stdio.h>
le indica al compilador que incluya en el programa datos del fichero stdio.h el cual se
suministra como parte del compilador y aporta información sobre aspectos
relacionados con la E/S de datos : funciones como printf(), scanf(), getchar(), ... Es
conveniente añadir siempre dicha línea pues no hay regla segura de cuando se necesitará
esa información; además, el compilador sólo tomará del mencionado fichero la
información que necesite y cualquier otra que no sea de utilidad no formará parte del
programa y, por tanto, no hará que sea más largo innecesariamente.
Sentencias.
Comentarios.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 11
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
6.TIPOS DE DATOS.
Existen cinco tipos de datos básicos en C: caracteres (char), enteros (int), punto
flotante (float), doble punto flotante (double) y sin valor (void).
- Los valores del tipo char se utilizan para almacenar caracteres ASCII o
cualquier cantidad de 8 bits.
- Las variables del tipo int se utilizan para almacenar cantidades enteras.
- Las variables del tipo float y double almacenan números reales.
- El tipo void se utiliza en tres casos:
Modificadores de tipo.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 12
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
7. DECLARACIÓN DE VARIABLES.
La declaración de variables consiste en asociar un tipo de datos determinado a
una variable. Todas las variables a usar en un programa se deben declarar antes de
utilizarlas. A continuación, se muestra el formato general de una declaración:
tipo lista_variables;
Aquí, tipo debe ser un tipo de dato válido en C y lista_variables puede estar
constituida por uno o más nombres de identificadores separados por comas.
No conviene mezclar, en una misma línea, variables que sólo se declaran con
otras que se inicializan.
8. CONSTANTES.
Las constantes en C se refieren a valores fijos que no puede modificar el
programa.
Las constantes literales representan valores fijos que pueden ser de cualquier
tipo de dato, como se muestra en la siguiente tabla.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 13
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
encierran entre comillas simples (apóstrofos). Debido a que las cadenas son
simplemente vectores de caracteres, se tratarán más adelante.
Encerrar todas las constantes de carácter entre apóstrofos funciona para la
mayoría de los caracteres de impresión, pero algunos, como el retorno de carro, son
imposibles de introducir desde el teclado. Por esta razón, C utiliza las constantes de
carácter especiales de barra invertida -mostradas en la siguiente tabla- cada uno de las
cuales equivale a un carácter único.
Se puede utilizar un código de barra invertida exactamente de la misma forma
que se haría con cualquier otro carácter; por ejemplo, se puede asignar a una variable de
tipo char.
Código Significado
\n nueva línea
\t tabulador horizontal
\v tabulador vertical
\b Retroceso
\’ Apóstrofo
\r retorno de carro
\” Comillas
\f salto de página
\0 carácter nulo
\a Alarma
\ooo constante octal (ooo = valor octal)
\xhh constante hexadecimal (hh = valor hexadecimal)
\\ barra atrás
__________________________________________________________________________________________________________
El C como lenguaje estructurado 14
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
9. OPERADORES.
Una característica del lenguaje C es la cantidad de variedad de operadores que
tiene, es decir, símbolos que operan sobre operandos (objetos) para producir los valores
deseados. Cualquier combinación válida de operadores con los operandos necesarios
constituye una expresión; una expresión completa que finaliza en un punto y coma es
una sentencia y una serie de sentencias componen un programa. La importancia de
operadores y expresiones es pues evidente; se encuentran entre las unidades de
construcción fundamentales de un programa en C.
Operadores aritméticos.
Operador Acción
- Resta, también signo menos unario.
+ Suma.
* Multiplicación
/ División
% Módulo de la división.
-- Decremento.
++ Incremento.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 15
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
q = 2 * a++;
q = 2 * ++a;
#include <stdio.h>
/#include <conio.h>
void main(void)
{
int a=1, b=1;
int a_mas, mas_b;
a_mas = a++;
mas_b = ++b;
printf(" a a_mas b mas_b\n");
printf("%5d%5d%5d%5d\n", a, a_mas, b, mas_b); //Salida: 2 1 2 2
getch();
}
__________________________________________________________________________________________________________
El C como lenguaje estructurado 16
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
variable += expresion;
Operadores relacionales
Operador Acción
Operador Acción
__________________________________________________________________________________________________________
El C como lenguaje estructurado 17
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
& Y
| O
^ O exclusivo (XOR)
˜ Complemento a uno
>> Desplazamiento a la derecha (divide por 2)
<< Desplazamiento a la izquierda (multiplica por 2)
Ejemplos:
x << 2;
z=x & y;
z=120^127;
float f;
printf(“%f”, sizeof f); // 4
printf(“%d”, sizeof(int));// 4 (suponiendo enteros de 32 bits)
- Resta
De movimiento de bits >> Desplazmiento de bits a la derecha
<< Desplazamiento de bits a la izquierda
Relacionales > Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
== Igual que
!= Distinto de
Binarios & AND binario
| OR binario
^ XOR binario
Lógicos && AND lógico
|| OR lógico
Condicionales ?: if..else abreviado
Asignaciones abreviadas =
*=
/=
%=
+=
-=
<<=
>>=
&=
|=
^=
Otros , Operador coma
10>5&&!(10<9)113<=4
- Como sucede con las expresiones aritméticas, se puede hacer uso de los
paréntesis para modificar el orden natural de evaluación de una expresión relacional o
lógica. Por ejemplo: !1&&0 será falso puesto que primero se evalúa ! (NOT) y, a
continuación, se evalúa && (AND). Sin embargo, cuando se utilizan paréntesis en la
misma expresión: !(1&&0) , el resultado es verdadero.
int x;
x = 100;
printf(“%d”, x>10); // muestra 1
#include <conio.h>
int num, a, b, c;
void main(void)
{ // Expresiones no aconsejables:
num = 5;
printf ("%10d %10d\n", num, num*num++); // 6 30
num = 5;
a = num/2 + 5*(1 + num++);
printf ("%10d %10d\n", num, a); // 6 32
a=8;
b=5;
c = a * b / 5 + ( a * b++);
printf ("%10d %10d %10d\n", c, b, a); // 48 6 8
a=8;
b=5;
c = (a * b++) + a * b / 5;
printf ("%10d %10d %10d\n", c, b, a); // 48 6 8
a=8;
b=5;
c = a * b++ + ( a * b / 5);
printf ("%10d %10d %10d\n", c, b, a); // 48 6 8
getch();
}
En C no existe el tipo cadena y por ello hay que declararla como un array de tipo
char. Ello permite imaginar los caracteres de la cadena (mejor dicho, sus códigos)
almacenados en posiciones de memoria adyacentes, cada una de las cuales puede
almacenar un valor de tipo char. Ocupando la última posición del array el compilador
del C (o el programador) coloca el carácter nulo \0 (código ASCII = 0) para indicar el
final de la cadena de caracteres. Por esta razón, para declarar arrays de caracteres es
necesario que la longitud del array tenga un carácter más que la cadena más larga que
pueda almacenar.
Hay que destacar que no es lo mismo, por ejemplo, el carácter 'x' que la cadena
"x", puesto que el primero pertenece a un tipo básico char mientras que el segundo es un
tipo derivado: un array de char y, además, contiene dos caracteres: 'x' y \0 .
Para manejar tanto la entrada -scanf()- como la salida -prinft()- de la cadena se
usa el especificador %s .
La función strlen() nos informa de la longitud de una tira en caracteres, y si es
un variable, deja de contar al llegar al carácter nulo, no importando si se ha declarado
una longitud mayor.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 20
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
Por su parte, el operador sizeof nos facilitará la longitud del array, o sea, el
valor indicado en su declaración, o bien, en caso de definir una cadena (constante) en el
encabezamiento, contará su longitud, incluyendo el carácter nulo.
Las cadenas de caracteres se estudiarán a fondo en el tema “Estructuras
estáticas”.
nombre_variable = expresión;
donde la expresión puede ser tan sencilla como una única constante o tan compleja
como una combinación de variables, operadores y constantes. El C utiliza un único
signo igual para indicar una asignación (a diferencia de Pascal o Modula-2, que utilizan
el constructor :=). El destino, o la parte izquierda, de la asignación debe ser una
variable, no una función o una constante.
Además de mediante instrucciones de asignación, también se puede asignar un
valor a una variable a través de las funciones de entrada de datos -por ejemplo, scanf()-
que permite introducir datos a través del teclado.
Asignaciones múltiples.
.........
int i;
char c;
float f;
void main (void)
__________________________________________________________________________________________________________
El C como lenguaje estructurado 21
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
{
c = i;
i = f;
f = c;
f = i,
}
..........
#include <stdio.h>
void main(void)
{
long importe = 35000L; // Sentencia de declaracion e inicialización
double veces = 1000e300;
printf ("¡Atencion!: El valor del entero largo de este");
printf ("\nprograma es %ld, pero puede ser cambiado", importe);
importe = -1000000000; // menos 100 millones
printf (" %.0e veces.\nPor ejemplo, ahora vale %ld.", veces, importe);
getchar();
}
#include <stdio.h>
void main(void)
{
unsigned short int ovejas, patas;
ovejas = 15000;
patas = 4 * ovejas;
printf ("En un rebaño de %u ovejas hay %hu ", ovejas, patas);
printf ("patas,\nsuponiendo que ninguna es coja.");
getchar();
}
#include <stdio.h>
void main(void)
{
__________________________________________________________________________________________________________
El C como lenguaje estructurado 22
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
#include <stdio.h>
void main(void)
{
unsigned long int inicial=10000L, gana=3000L, pierde=2000L;
printf("Carolina entro en el casino con %lu dolares, ", inicial);
gana = gana * 3;
printf("gano %lu y \nperdio ", gana);
printf("%lu. Aun puede perder %lu mas.",2*pierde,inicial+gana-
2*pierde);
getchar();
}
void main(void)
{
char comillas = '"'; // char comillas = 34 ;
char barraatras = '\\'; // char barraatras = 92 ;
short int i = 32767;
double a,b;
float c,d;
b = 2.0e10 + 1.0;
a = b-2.0e10;
printf("%lf \n", a); //Resulta 1.000000 => Si tiene bastante precisión
d = 2.0e10 + 1.0;
c = d-2.0e10;
printf("%f\n",c); //Resulta 0.000000 => No tiene suficiente precisión
printf("Se imprime una constante de caracter: %c\n", 'R');
printf("Juan dijo:\"%c es una barra invertida y su codigo es %d.%c.\n",
barraatras, barraatras, comillas);
printf("%hd %hd %hd \n", i, i+1, i+2);
getchar(); //Se desborda
}
1.000000
0.000000
Se imprime una constante de caracter: R
Juan dijo:"\ es una barra invertida y su codigo es 92.".
32767 -32768 -32767
__________________________________________________________________________________________________________
El C como lenguaje estructurado 23
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
#include <stdio.h>
void main(void)
{
printf("Un proverbio chino dice:\n" );
printf("Si no dominal infolmatica, ");
printf("infolmatica dominal a ti.\n");
printf(" Filmado: Pon te Yang \n");
getchar(); //El programa espera que se pulse INTRO.
}
item1, item2,.. son las distintas variables, constantes o expresiones, cuyo valor se
quiere imprimir. No tienen que aparecer obligatoriamente.
#include <stdio.h>
void main(void)
{
printf("Mas vale pajaro en mano ");
printf("que %d volando. No hay %u sin %u.\n La", 100, 2, 3);
printf(" letra %c es la %s del alfabeto.\n", 'z', "ultima" );
printf("%8.5s pesa %9.4f kilos y esa roca %.15g .\n",
“Mariano”, 75.687, 1234567890.1230e12);
printf("Gana %ld pesetas con %hu apuestas.\n", 35000000L, 100 );
printf ("ASCII 65 = \x41, ASCII 69 = \105 "); getchar();
}
ASCII 65 = A, ASCII 69 = E
Modificadores.
Consejos.
Para imprimir columnas de datos se puede conseguir una salida nítida utilizando
campos de anchura fija lo suficientemente grandes.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 25
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
Especificadores de formato.
Caracteres de espacio en blanco.
Caracteres distintos del espacio en blanco.
Especificadores de formato.
Código Significado
%c Leer un único carácter.
%d Leer un entero decimal.
%i Leer un entero decimal.
%e Leer un número en coma flotante.
%f Leer un número en coma flotante.
%g Leer un número en coma flotante.
%o Leer un número octal.
%s Leer una cadena.
%x Leer un número hexadecimal.
%p Leer un puntero.
%n Recibe un valor entero igual al número de caracteres leídos.
%u Leer un entero sin signo.
%[ ] Examinar un conjunto de caracteres.
#include <stdio.h>
#include <conio.h>
void main(void)
__________________________________________________________________________________________________________
El C como lenguaje estructurado 26
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
{
unsigned char ch=65; // es equivalente ->char ch='A';
printf("Inicialmente la variable ch vale %c.\n", ch);
ch = 129; // si ch fuera char, su código = -127
printf("Luego, ch vale %c y su codigo %d.\n", ch, ch);
printf ("Caracter (1 solo): ");
scanf("%c", &ch ); // &ch significa dirección de ch
printf("Ahora, ch vale %c cuyo codigo es %d.\n", ch, ch);
getch();
}
Lectura de números.
«x y»
Lectura de cadenas.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 27
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
La función scanf() se puede utilizar para leer una cadena desde el flujo de
entrada utilizando el especificador de formato %s. Este especificador le indica a scanf()
que lea caracteres hasta que encuentre un carácter de espacio en blanco. Los caracteres
que se leen se van introduciendo en el array de caracteres apuntado por el argumento
correspondiente y se añade un terminador nulo al resultado. En lo que se refiere a
scanf(), un carácter de espacio en blanco se corresponde con un espacio, un carácter de
nueva línea, un tabulador, un tabulador vertical o un salto de línea. A diferencia de
gets(), que lee una cadena hasta que se introduce un retorno de carro, scanf() lee una
cadena hasta que se introduce el primer carácter de espacio en blanco. Esto significa que
no se puede utilizar scanf() para leer una cadena del tipo «Esto es un prueba» debido a
que el primer espacio provoca la finalización del proceso de lectura.
#include <stdio.h>
#include <conio.h>
main()
{
int edad;
float peso, altura, valor;
char nombre[15], ape1[20];
printf ("Nombre: ");
scanf("%s", nombre);
printf ("Primer Apellido: ");
scanf("%s", ape1);
printf ("Edad: ");
scanf ("%d", &edad );
printf ("Peso (kilos): ");
scanf ("%f", &peso );
printf ("Altura (cm.): ");
scanf ("%f", &altura );
printf ("%s %s, su edad es %d, pesa %.2f kilos y mide %.2f
metros.\n",
nombre, ape1, edad, peso, altura/100);
//Se supone que 1 onza equivale a 32.1512 kg., luego en onzas:
valor = peso / 32.1512;
//Se supone cotización oro=400$ la onza.
valor = valor * 400.0;
printf ("Su peso en oro es $%.2f\n", valor);
getch(); //Lee un carácter del teclado, sin dar "eco" en la
pantalla
}
Nombre: María
Primer Apellido: García
Edad: 30
Peso (kilos): 60
Altura (cm.): 176
María García, su edad es 30, pesa 60.00 kilos y mide 1.76 metros.
Su peso en oro es $746.47
__________________________________________________________________________________________________________
El C como lenguaje estructurado 28
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
if
Ya hemos comentado en este mismo tema que una expresión de relación o una
expresión lógica, si es cierta toma el valor 1, y si es falsa toma el valor 0.
Por otra parte, una expresión cualquiera (combinación de operadores, constantes
y/o variables) se considera cierta si tiene un valor distinto de 0, y se considera falsa sólo
si toma el valor 0.
La sintaxis de la sentencia if es
if (expresión) sentencia
if (expresion)
sentencia_1
else
sentencia_2
if (expresion)
{ secuencia de sentencias_1 }
else
{ secuencia de sentencias_2 }
#include <stdio.h>
#include <conio.h>
int main(void)
{
__________________________________________________________________________________________________________
El C como lenguaje estructurado 29
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
Ifs anidados.
PSEUDOCODIGO LENGUAJE C
si a > 0 entonces if (a>0)
si a > 1000 entonces if (a>1000)
Escribir("a positivo grande") printf("a positivo grande”);
sino else
Escribir("a positivo pequeño") printf("a positivo pequeño”);
finsi else
sino if (a < -1000)
si a < -1000 entonces printf("a muy negativo”);
Escribir("a muy negativo”) else
sino printf("a poco negativo”);
Escribir("a poco negativo”)
finsi
finsi
if (n > 6)
{
if ( n<12 )
printf ("%d está comprendido entre 6 y 12.",n);
}
else
printf ("%d es menor o igual que 6.",n);
if (n > 6)
if ( n < 12 )
printf ("%d está comprendido entre 6 y 12.", n);
else
printf ("%d es mayor o igual que 12.", n);
// Aunque la sangría confunda el else depende del segundo if
#include <stdio.h>
#include <conio.h>
#define CLAVE 4444
void main(void)
{
printf("%d",CLAVE);
__________________________________________________________________________________________________________
El C como lenguaje estructurado 30
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
El operador condicional ?
Se puede utilizar para reemplazar a las instrucciones if/else que contengan sólo
sentencias simples.
Si la condición es cierta, la expresión condicional (todo el conjunto) toma el
valor de expresión_1; si es falsa (o sea, 0), toma el valor de expresión_2.
#include <stdio.h>
#include <conio.h>
#define CLAVE 15*433
void main(void)
{
int adivina;
printf("*** BANCO BBH2O del GUADALETE ***\n");
printf("Su clave secreta: ");
scanf("%d",&adivina);
if (CLAVE == adivina)
printf("Clave correcta, pero vuelva mañana que ya estaba cerrando.");
else
{
printf("Clave no válida. El número introducido ");
adivina<CLAVE?printf("es bajo.\n"):printf("es alto.\n");
}
getch();
__________________________________________________________________________________________________________
El C como lenguaje estructurado 31
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
switch
switch (expresión_entera)
{
case cte_1: sentencias;
[ break ];
case cte_2: sentencias;
[ break ];
......
[ default : sentencias ; ]
}
case x:
case y: <instrucciones> ;
- Dos constantes case del mismo switch no pueden tener los mismos
valores.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 32
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
#include <stdio.h>
#include <conio.h>
void main(void)
{
unsigned short nota;
printf("Su nota: ");
scanf("%d", ¬a);
switch (nota)
{
case 0: printf("No apareció.\n");
break;
case 1:
case 2: printf("Estudio muchísimo...una lección que no entraba.\n");
break;
case 3:
case 4: printf("Estudio toda la noche...y se durmió en el examen.\n");
break;
case 5: printf("Se le perdió una de las dos \"chuletas\".\n");
break;
case 6: printf("Usted va como España.\n");
printf("Si la gira 180 grados, ira sobresaliente.\n");
break;
case 7:
case 8: printf("Esa es una nota ble");
break;
case 9: printf("Si hace el pino, sólo verá Bien");
break;
case 10: printf("Le he pedido una nota, no dos.... ¡ah, bien!... \n");
printf("...Perdone, es la falta de costumbre.\n");
break;
default: printf("Desafina.");
}
getch();
}
while
La sintaxis es:
while (condición)
sentencia
#include <stdio.h>
#include <conio.h>
#define FIJO_CENT_FAHR 32.00
#define ESCALA 1.8
void main(void) // Grados centígrados a Fahrenheit desde -10 a 50
{
float cent, fahr ;
char tecla;
printf ("Conversión de Grados centígrados a Grados Fahrenheit\n\n");
cent = -10.0;
while (cent < 51.0)
{
fahr = ESCALA * cent + FIJO_CENT_FAHR ;
printf("%8.1f C = %5.1f F", cent, fahr);
// 8 5 5 2 = 20 caracteres cada vez
cent++;
}
printf ("\n\n Quiere calentarse más? (N/N) .\n");
while ( (tecla = getch()) != 'N' ) ; // sentencia vacía
}
#include <stdio.h>
#include <conio.h> // Mejora el ejemplo anterior
#define FIJO_CENT_FAHR 32.00
#define ESCALA 1.8
void main(void) // Grados centígrados a Fahrenheit desde -10 a 50
{
float cent, fahr;
char tecla;
printf ("Conversión de Grados centígrados a Grados Fahrenheit\n\n");
cent = -11.0; // cent = -10.0;
while (++cent < 51.0)
{
fahr = ESCALA * cent + FIJO_CENT_FAHR;
printf("%8.1f C = %5.1f F", cent, fahr);
}
printf ("\n\n Quiere calentarse más? (N/N) .\n");
while ( (tecla = getch()) != 'N' ) ; // sentencia vacía
}
do while
La sintaxis es:
do
sentencia
__________________________________________________________________________________________________________
El C como lenguaje estructurado 34
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
while (expresion);
do
{
sentencia_A;
sentencia_B;
...........
}
while (expresion);
Nótese cómo las llaves sólo son necesarias cuando la sentencia es compuesta. De
todos modos, las llaves se pueden utilizar siempre para mejorar la legibilidad. Es
frecuente usar esta estructura cuando, por ejemplo, se pide un dato por teclado o una
opción válida de un menú, ya que el bucle se ejecutará al menos una vez y si los datos
introducidos no son correctos, se volverán a pedir.
#include <stdio.h>
#include <conio.h>
#include <math.h> //necesario por las funciones fabs() y sqrt()
void main(void)
{
// Estando plácidamente sentado bajo una haya, acomodado entre
// sus raíces, y a raíz de no tener nada mejor que hacer (si no
// hago esto no me hallo) y queriendo evitar echar raíces intentando
// el cálculo manual de raíces cuadradas, diseñé este programa que
// las halla, lindo donde los haya.
double num, raiz , mem_raiz , error;
printf("CALCULO RAICES CUADRADAS.\n" "Numero=0 --> Fin del programa.\n\n");
do
{
do
{
printf("Numero: ");
scanf("%lf",&num);
if (num<0.0)
printf("Numero no válido\n");
}
while (num < 0.0);
if (num > 0.0)
{
do
{
printf("Margen error (>0 y <0.01) : ");
scanf("%lf",&error);
if (error<=0.0 || error>=0.01)
printf("Valor del margen de error no válido\n");
}
while (error <= 0.0 || error >= 0.01);
raiz = num / 2;
printf("Aproximaciones: \n");
do
{
__________________________________________________________________________________________________________
El C como lenguaje estructurado 35
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
mem_raiz = raiz;
raiz = ( num / raiz + raiz ) / 2 ;
printf("%20.8lf",raiz);
}
while (fabs ( raiz - mem_raiz ) >= error );
printf("\n\nRaiz cuadrada de %.3lf = %.8f\n\n", num, raiz);
printf("Calculado directamente: %.8lf\n\n\n", sqrt(num) );
}
}
while(num > 0.0);
}
for
- expresion_1 se realiza una sola vez, al comenzar el bucle for. Suele ser
una inicialización.
#include <stdio.h>
#include <conio.h>
void main(void)
{
int num, x;
printf(" N N al cubo\n"); //Tabla con 10 números y sus cubos
for (num=1; num<=10; num++)
printf("%5d %5d\n", num, num*num*num);
printf("\n\n");
getch(); //Del 100 al 1
num=100;
for (;num>=1;)
printf("%5d",num--);
printf("\n\n");
getch();
// De 0 a 50, con incrementos de 5, y
// de 50 a 100, con incrementos de 10.
for (num=0, x=5 ; num<=100; num+=x )
{
printf("%5d",num);
(num>=50)? x=10 : 1 ;// Hay que poner algún valor
} // detrás de los dos puntos, aunque no se
utilice
getch();
}
En todo caso, aunque una expresión se deje en blanco siempre hay que colocar
los dos punto y coma.
- Los parámetros de las expresiones 2 y 3 se pueden alterar dentro del cuerpo del
bucle.
- Se puede utilizar el operador coma (,) que enlaza las expresiones, por ejemplo,
para realizar más de una inicialización o más de una actualización. No tiene sentido
utilizarlo en la expresion_2, pues no equivale ni al operador && (and) ni al operador ||
(or) .
El operador coma evalúa las expresiones de izquierda a derecha.
- El operador coma no está renstringido al bucle for, pero es donde se utiliza con
mayor frecuencia. Por otra parte, no hay que confundirlo con el “separador coma” que
se usa por ejemplo en sentencias printf para distinguir argumentos.
- Si la condición es inicialmente falsa, no se ejecutará nunca el cuerpo del bucle.
- El bucle for se puede utilizar para generar un retardo; por ejemplo:
break
#include <stdio.h>
#include <conio.h>
int main(void)
{
const int VALOR_BUSCADO=789;
const int REPETICIONES=15;
__________________________________________________________________________________________________________
El C como lenguaje estructurado 37
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
continue
for (i=0;i<4;++i)
{
printf(“%d\n”,I);
if (i==2)
continue;
printf(“La variable es distinta de 2);
}
1º. En cualquier operación en que aparezcan dos tipos diferentes se eleva la "categoría" del
operando que la tiene menor para igualarla a la del mayor. Proceso conocido como "promoción".
2º. El rango o categoría de los tipos, de menor a mayor, es: char, short, int, long, float, double.
Los tipos unsigned tienen el mismo rango que el tipo a que están referidos.
3º. En una sentencia de asignación, el resultado final de los cálculos se reconvierte al tipo de la
variable a que están siendo asignados. Así pues, el proceso puede ser una "promoción" o una "pérdida de
rango", según que la variable a asignar sea de categoría superior o inferior.
Con el fin de conservar al máximo la precisión numérica, todas las variables y constantes float se
convierten en double cuando se realizan cálculos aritméticos con ellas. Así se reduce enormemente el
error de redondeo. Por supuesto, la respuesta final se reconvierte a float, si ese es el tipo declarado.
Cuando se convierte de enteros a caracteres, de enteros largos (long) a enteros y de enteros a enteros
cortos (short), la regla básica consiste en eliminar la cantidad apropiada de bits más significativos.
Cuando se utilizan enteros de 16 bits, significa que ...
- se perderán 8 bits cuando se convierta de entero a carácter
- se perderán 16 bits cuando se convierta de entero largo (long) a entero.
signed char unsigned char Si valor > 127 => destino negativo.
char short int Los 8 bits de mayor orden.
char int (16 bits) Los 8 bits de mayor orden.
char int (32 bits) Los 24 bits de mayor orden.
short int int (16 bits) Ninguna.
short int int (32 bits) Los 16 bits de mayor orden.
int (16 bits) long int Los 16 bits de mayor orden.
int (32 bits) long int Ninguna.
float double Precisión. Resultado redondeado.
double long double Precisión. Resultado redondeado.
Se deben recordar dos puntos importantes que pueden afectar a la portabilidad del código que se
escriba:
- Las conversiones de un int en un float o de un tipo float en un double, etcétera, no aumentarán
ninguna precisión ni exactitud. Estos tipos de conversiones sólo modificarán el formato en que se
representa el valor.
- Algunos compiladores (y procesadores) de C siempre tratarán una variable char como positiva, sin
importar el valor que tiene cuando se convierte en un entero o en un float. Otros compiladores pueden
tratar los valores de una variable char superiores a 127 como números negativos cuando se
convierten (como lo hace Borland C++). Así pues, en general se utilizarán variables char para caracteres
y, para evitar un posible problema de portabilidad en esta área, se debería utilizar en cada caso el tipo
adecuado: int, short int, signed char, unsigned char, etc.
Para utilizar la tabla anterior y realizar una conversión no mostrada directamente, simplemente se
convierte de tipo en tipo hasta alcanzar el tipo destino. Por ejemplo, para convertir un double en un int,
primero se convierte de double a float y, a continuación, de float a int.
Si se ha utilizado un lenguaje de programación como Pascal, que prohíbe esta conversión de tipo
automática, se puede pensar que C es muy relajado. Sin embargo, recuérdese que C se diseñó para
facilitar el trabajo del programador permitiendo realizar el trabajo en C en lugar de en ensamblador. Para
conseguir esto, C tiene que permitir estas conversiones de tipo.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 39