Documente Academic
Documente Profesional
Documente Cultură
FUNDAMENTOS DE PROGRAMACIÓN
Tema 3
__________________________________________________________________________________________________________
El C como lenguaje estructurado 1
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
__________________________________________________________________________________________________________
El C como lenguaje estructurado 3
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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.
• 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
manipulación de bits, bytes y direcciones (elementos básicos con los que opera la
__________________________________________________________________________________________________________
El C como lenguaje estructurado 6
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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++.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 9
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 10
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
• 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 11
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.
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.
7. DECLARACIÓN DE VARIABLES.
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. Estas pueden ser de cualquier tipo de dato, como se muestra en la siguiente
tabla.
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
9. OPERADORES.
• 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
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
El C como lenguaje estructurado 16
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();
}
variable += expresion;
__________________________________________________________________________________________________________
El C como lenguaje estructurado 17
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
Operadores relacionales
Operador Acción
> Mayor que
>= Mayor o igual que.
< Menor que.
<= Menor o igual que.
== Igual.
!= Distinto.
Operadores lógicos
Operador Acción
&& AND (Y)
|| OR (O)
! NOT (NO)
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)
__________________________________________________________________________________________________________
El C como lenguaje estructurado 18
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
El C como lenguaje estructurado 19
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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();
}
__________________________________________________________________________________________________________
El C como lenguaje estructurado 20
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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.
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.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 21
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
.........
int i;
char c;
float f;
void main (void)
{
c = i;
i = f;
f = c;
f = i,
}
..........
#include <stdio.h>
void main(void)
{
long importe = 35000L; // Sentencia de declaracion e
inicialización
__________________________________________________________________________________________________________
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 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)
{
unsigned short int patas, patos, cojos;
patos=25;
cojos=3;
patas = 2 * patos;
printf("En un lago hay %u patos con %u ", patos, patas-cojos);
printf("patas,\nsuponiendo que %u son cojos.\n", cojos);
getchar();
}
#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();
}
__________________________________________________________________________________________________________
El C como lenguaje estructurado 23
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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
#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.
}
__________________________________________________________________________________________________________
El C como lenguaje estructurado 24
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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();
}
__________________________________________________________________________________________________________
El C como lenguaje estructurado 25
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
• Modificadores.
• Consejos.
Para imprimir columnas de datos se puede conseguir una salida nítida utilizando
campos de anchura fija lo suficientemente grandes.
Cuando un número está destinado a aparecer dentro de una frase es a menudo
conveniente especificar un campo igual o menor que el esperado, para evitar que
aparezcan blancos suplementarios que afeen el texto.
• Especificadores de formato.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 26
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
• 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)
{
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.
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);
__________________________________________________________________________________________________________
El C como lenguaje estructurado 28
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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
• 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
lógica: if (sw)...
aritmética if ( x + y )...
En caso de que la expresión sea verdadera (en general, si es distinta de 0) se
ejecuta la sentencia; en caso contrario, se pasa a ejecutar la siguiente sentencia a if.
La sentencia o instrucción puede ser simple o compuesta. Si es simple, consistirá
en una sola sentencia terminada en punto y coma. Si es compuesta, contendrá varias
sentencias terminadas en punto y coma que están delimitadas por llaves, lo que se
conoce como bloque.
De una forma más general, la sintaxis de la sentencia if es:
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)
{
int clave = 4300 + 'A' , adivina;
printf("*** BANCO BBUVA de LAS VIÑAS ***\n");
printf("Su clave secreta: ");
scanf("%d",&adivina);
if (clave == adivina)
{
printf("Su clave es correcta, pero mejor, vaya al otro ");
printf("cajero de la esquina porque me queda poco dinero.\n");
}
else
printf("Clave no válida.\n");
getch();
}
• Ifs anidados.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 30
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
Para anidar sentencias if hay que tener en cuenta: La sentencia if...else cuenta
como una única sentencia, y por tanto, no es necesario encerrarla entre llaves.
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);
int adivina, decenas;
printf("*** BANCO BBMOSTO de LAS VIDES ***\n\n");
printf("Su clave secreta: ");
scanf("%d",&adivina);
if (CLAVE == adivina)
{
printf("Clave correcta... pero por razones técnicas transitorias,");
printf(" momentáneas y pasajeras, no podemos atenderle.\n");
}
else
{
printf("Clave no válida... Pero creo que esa es la clave de ");
if (adivina < CLAVE)
{
printf("su cuñada, que es mas baja.\n");
decenas =(CLAVE-adivina)/10 ;
if (decenas)
printf("Suba %d decena\s.\n", decenas);
}
else
{
printf("su vecina, que es mas alta.\n");
decenas = (adivina-CLAVE)+/10 ;
if (decenas)
__________________________________________________________________________________________________________
El C como lenguaje estructurado 31
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();
}
• switch
switch (expresión_entera)
{
case cte_1: sentencias;
[ break ];
case cte_2: sentencias;
[ break ];
__________________________________________________________________________________________________________
El C como lenguaje estructurado 32
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
......
[ default : sentencias ; ]
}
case x:
case y: <instrucciones> ;
- Dos constantes case del mismo switch no pueden tener los mismos
valores.
- Si se utilizan constantes de carácter en el switch, éstas se convierten
automáticamente en sus valores enteros.
#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");
__________________________________________________________________________________________________________
El C como lenguaje estructurado 33
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programació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)
{
__________________________________________________________________________________________________________
El C como lenguaje estructurado 34
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
#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
while (expresion);
do
{
sentencia_A;
sentencia_B;
...........
}
while (expresion);
__________________________________________________________________________________________________________
El C como lenguaje estructurado 35
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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
{
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.
__________________________________________________________________________________________________________
El C como lenguaje estructurado 36
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programació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:
__________________________________________________________________________________________________________
El C como lenguaje estructurado 37
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
• break
#include <stdio.h>
#include <conio.h>
#define VALOR_BUSCADO 789
#define REPETICIONES 15
int main(void)
{
int t, visualizado, salir, count;
for(t=0; t<100; t++) // se sale cuando t vale 10
{
printf("%3d ", t);
if(t==10)
break;
}
printf("\n\n");
getch();
printf("Puedes esperar a visualizar %d " "o bien, pulsar una tecla para
salir.\n\n", VALOR_BUSCADO);
t = 0;
salir = 0;
visualizado = 0;
do
{
for ( ; t < 1000 ; t++ )
{
printf("%d\r", t);
if (!visualizado)
visualizado = t == VALOR_BUSCADO ? 1 : 0 ;
if(kbhit())
{ //KBHIT() devuelve 0 si no se ha pulsado una tecla
salir = 1;
break;
}
}
}
while (!visualizado && !salir ) ;
if (visualizado)
printf("Valor visualizado.\n");
printf("\n\n");
getch();
printf ("Ahora, %d veces los NUEVE primeros numeros.\n", REPETICIONES);
for(t=0; t< REPETICIONES; ++t)
{
count = 1;
for(;;) // BUCLE INFINITO
{
printf("%4d", count);
count++;
if(count==10) break;
}
printf("\n");
}
getch();
}
__________________________________________________________________________________________________________
El C como lenguaje estructurado 38
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);
}
__________________________________________________________________________________________________________
El C como lenguaje estructurado 39
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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.
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
__________________________________________________________________________________________________________
El C como lenguaje estructurado 40
I.E.S. Francisco Romero Vargas –Departamento de Informática - Fundamentos de Programación
__________________________________________________________________________________________________________
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 41