Escolar Documentos
Profissional Documentos
Cultura Documentos
Tema 1 - Introduccin.
El lenguaje de programacin C fue creado por Brian Kernighan y Dennis
Ritchie a mediados de los aos 70. La primera implementacin del mismo la realiz
Dennis Ritchie sobre un computador DEC PDP-11 con sistema operativo UNIX. C es
el resultado de un proceso de desarrollo que comenz con un lenguaje anterior, el
BCPL, el cual influy en el desarrollo por parte de Ken Thompson de un lenguaje
llamado B, el cual es el antecedente directo del lenguaje C. El lenguaje C es un
lenguaje para programadores en el sentido de que proporciona una gran flexibilidad
de programacin y una muy baja comprobacin de incorrecciones, de forma que el
lenguaje deja bajo la responsabilidad del programador acciones que otros lenguajes
realizan por si mismos. As, por ejemplo, C no comprueba que el ndice de referencia
de un vector (llamado array en la literatura informtica) no sobrepase el tamao del
mismo; que no se escriba en zonas de memoria que no pertenecen al rea de datos del
programa, etc.
2.1 - Identificadores.
Antes de proceder a explicar los identificadores en C, es necesario resaltar que
C es un lenguaje sensible al contexto, a diferencia por ejemplo de Pascal, por lo cual,
C diferencia entre maysculas y minsculas, y por tanto, diferencia entre una palabra
escrita total o parcialmente en maysculas y otra escrita completamente en
minsculas.
Tipo de Descripcin.
dato
char Carcter o entero pequeo (byte)
int Entero
float Punto flotante
double Punto flotante (mayor rango que
float)
void Sin tipo (uso especial)
Tabla 2.2.1: Tipos de datos en C.
unsigned char a;
long double b;
short int i;
Fuera de todas las funciones del programa, son las llamadas variables globales,
accesibles desde cualquier parte del programa.
Dentro de una funcin, son las llamadas variables locales, accesibles tan solo
por la funcin en las que se declaran.
Dentro de un bloque de cdigo del programa, accesible tan solo dentro del
bloque donde se declara. Esta forma de declaracin puede interpretarse como
una variable local del bloque donde se declara.
Para un mejor comprensin, veamos un pequeo programa de C con variables
declaradas de las cuatro formas posibles:
#include <stdio.h>
int sum; /* variable global, accesible desde cualquier parte */
/* del programa*/
void suma(int x) /* variable local declarada como parmetro, */
/* accesible solo por la funcin suma*/
{
sum=sum+x;
return;
}
void intercambio(int *a,int *b)
{
if (*a>*b)
{
int inter; /* variable local, accesible solo dentro del */
/* bloque donde se declara*/
inter=*a;
*a=*b;
*b=inter;
}
return;
}
int main(void) /*Funcin principal del programa*/
{
int contador,a=9,b=0; /*variables locales, accesibles solo */
/* por main*/
sum=0;
intercambio(&a,&b);
for(contador=a;contador<=b;contador++) suma(contador); printf(u
%d\n",suma);
return(0);
}
Especificador de Efecto
almacenamiento
auto Variable local
(por
extern Variable
static externa
Variable
register Variable
registro en C.
Tabla 2.4.1: Especificadores de almacenamiento
El especificador auto se usa para declarar que una variable local existe
solamente mientras estemos dentro de la subrutina o bloque de programa donde se
declara, pero, dado que por defecto toda variable local es auto, no suele usarse.
Para variables locales, el especificador static indica que dicha variable local
debe almacenarse de forma permanente en memoria, tal y como si fuera una
variable global, pero su alcance ser el que correspondera a una variable
local declarada en la subrutina o bloque. El principal efecto que provoca la
declaracin como static de una variable local es el hecho de que la variable
conserva su valor entre llamadas a la funcin.
2.5 - Constantes.
En C, las constantes se refieren a los valores fijos que el programa no puede
alterar. Algunos ejemplos de constantes de C son:
Tipo de Constantes de
char 'a' '9' 'Q'
int 1 -34 21000
long int -34 6785 456
short int 10 6L
-12 1500
unsigned 45600 345 3
int
float 12.45 4.34e -2.8e9
double - -3
- 1.0e1
Tabla 2.S.1: Tipos de constantes en C.
Cdi Significado
\b Retroceso
\f Alimentacin de
\n Nueva lnea
\r Retorno de carro
\t Tabulador horizontal
\" Doble comilla
\' Simple comilla
\0 Nulo
\\ Barra invertida
\v Tabulador vertical
\a Alerta
\o Constante octal
\x Constante
hexadecimal
Tabla 2.S.2: Constantes de barra invertida en C.
Los operadores ++, -- y % solo pueden usarse con datos de tipo int o char. El
operador incremento (++), incrementa en una unidad el valor de la variable sobre la
que se aplica, el operador decremento (--), decrementa en una unidad el valor de la
variable, y el operador mdulo (%), calcula el resto de una divisin de dos variables
de tipo entero o carcter.
int var1=10,var2;
var2=++var1; /* Pone 11 en var2, pues primero incrementa var1,*/
/* y luego asigna su valor a var2 */
int var1=10,var2;
var2=var1++; /* Pone 10 en var2, pues primero asigna su valor */
/* a var2, y luego incrementa var1 */
3.2 - Operadores relacinales y lgicos.
Los operadores relacinales y lgicos de C, ordenados de mayor a menor
prioridad son:
Los operadores relacinales y lgicos tiene menor prioridad que los operadores
aritmticos antes descritos, as , escribir 1O>3+9 es equivalente a escribir 1O>(3+9).
Si tenemos char a[2O], sizeof(a) devuelve el valor 20, y si tenemos float a[6],
sizeof(a) devuelve el valor 24 (4*6).
3.5 - Operadores sobre bits.
El lenguaje C posee operadores que actan a nivel de bits sobre los datos, estos
operadores son:
Los operadores &, 1 y /\ actan sobre dos operandos, mientras que ,<< y >>
actan sobre un solo operando. Veamos su actuacin sobre dos valores cualquiera:
Donde los nmeros que acompaan a los operadores << y >> indican cuantas
posiciones se desplaza el operando. La prioridad de los operadores sobre bits es:
Los operadores << y >> tienen la prioridad situada entre los operadores
aritmticos y los operadores relacinales y lgicos.
3.6 - El operador ?.
El operador ? se usa para reemplazar las sentencias if/else (que veremos con
posterioridad) de formato general:
if (condicin)
expresin;
else
expresin;
Donde expresin debe ser una expresin sencilla y no otra sentencia de C.
int x,y;
y=(x>10) ? 100 200;
int t;
(t) ? f1(t)+f2() printf(ut vale cero");
Todos los char y short int se convierten a int. Todos los float a double.
char ch;
int i;
float f;
double d;
( ch / i ) + (f * d ) ( f+ i );
char int float double float int
( ch / i ) + ( f * d ) ( f + i );
int int double double double int
Al ser los dos operandos de igual tipo, realizamos la primera operacin, (ch /
i), y el resultado es de tipo int. De igual forma, para la segunda operacin, (f * d), y el
resultado es de tipo double.
Para la tercera operacin, y dado que las variables no son del mismo tipo, se
aplica la segunda regla, convirtindose el int en double, realizndose la suma (f + i)
como dos datos de tipo double, y siendo por tanto el resultado un double.
Ahora procedemos a realizar la suma de los dos primeros resultados (ch / i) + (f
* d), como uno de ellos es de tipo int, y el otro de tipo double, el int se convierte en
double por la segunda regla, y el resultado es un double.
y por ltimo, realizamos la resta final, siendo los dos operandos de tipo double
y el resultado final, por tanto, de tipo double.
(tipo)expresin
int a=3,b=2;
float c;
c=a/b;
La operacin asigna a c el valor 1.O en vez de el valor 1.S, ello se debe a que
al ser a y b variables de tipo entero, se realiza una divisin entre enteros, y el
resultado de 3/2 es 1. A continuacin ese valor 1 se convierte a un valor en coma
flotante para realizar la asignacin (valor 1.O), y se asigna a c. Si lo que se desea es
que la divisin se realice en punto flotante, debe escribirse la operacin de la siguiente
forma:
c=(float)a/b;
if (condicin
sentencia;
else
sentencia;
int a,b;
if (a>b)
{
b ;
a=a+5;
}
else
{
a++;
b=b 5;
}
if (b a!=7)
b=5;
if (x)
{
if (y)
printf(u1");
}
else
printf(u2");
switch(variable)
{
case const1
sentencia;
break;
case const2
sentencia;
break;
...
default
sentencia;
}
Donde variable debe ser de tipo char o int, y donde const1, const2, ..., indican
constantes de C del tipo de datos de la variable. Dichas constantes no pueden
repetirse dentro del switch. El default es opcional y puede no aparecer, as como los
break de los case. La sentencia switch se ejecuta comparando el valor de la variable
con el valor de cada una de las constantes, realizando la comparacin desde arriba
hacia abajo. En caso de que se encuentre una constante cuyo valor coincida con el
valor de la variable, se empieza a ejecutar las sentencias hasta encontrar una sentencia
break. En caso de que no se encuentre ningn valor que coincida, se ejecuta el default
(si existe). Veamos algunos ejemplos:
int valor;
switch(valor)
{
case 0 cont++;
break;
case 5 cont ;
break;
default cont= 10; /* Se ejecuta si valor no es 0 o 5 */
}
char d;
int cont=0;
switch(d)
{
case '\r' cont++; /* Si d es un retorno de carro, se */
/* ejecuta este cont++ y el siguiente*/
/* al no aparecer un break */
case '\x1B' cont++;
break;
default cont= 1;
}
Las sentencias switch pueden aparecer unas dentro de otras, igual que suceda
con las sentencias if. Vemoslo con un ejemplo:
char d,e;
switch(d)
{
case 'a'
case 'A' switch(e)
{
case '1' d='z';
e='+';
break;
case '2' d='z';
e=' ';
}
break;
case 'b'
case 'B' switch(e)
{
case '0' d='2';
default e='+';
}
}
Ejemplos de programas en C:
Se cargan por teclado tres nmeros distintos. Mostrar por pantalla el mayor de ellos.
Se ingresa por teclado un valor entero, mostrar una leyenda que indique si el
nmero es positivo, negativo o nulo (es decir cero)
#include<stdio.h>
int main()
{
int num1,num2,num3;
printf("Ingrese primer valor:");
scanf("%i",&num1);
printf("Ingrese segunda valor:");
scanf("%i",&num2);
printf("Ingrese tercer valor:");
scanf("%i",&num3);
if (num1 > num2)
{
if (num1 > num3)
{
printf("%i",num1);
}
else
{
printf("%i",num3);
}
}
else
{
if (num2 > num3)
{
printf("%i",num2);
}
else
{
printf("%i",num3);
}
}
getch();
return 0;
}
programa15.c
#include<stdio.h>
int main()
{
int num;
printf("Ingrese un valor:");
scanf("%i",&num);
if (num == 0)
{
printf("Se ingreso el cero");
}
else
{
if (num > 0)
{
printf("Se ingreso un valor positivo");
}
else
{
printf("Se ingreso un valor negativo");
}
}
getch();
return 0;
}
switch
case
default
break
int a;
switch(a)
{
case 0:
//operaciones a realizar en caso de que a valga 0;
break;
case 1:
//mismo proceso
break;
...
case n:
//n tiene que ser una constante, o numrica {0,1,2 ....} o una
definida #define n 2
break;
default:
//en caso de que no se de ninguna de las anteriores hacer...
}
int a;
if(a==0)
//operaciones para 0
else if(a==1)
//operaciones para 1
...
else if(a==n)
//operaciones para n
else
//cualquier otro caso
Aunque toda la estructura del if junto con el else correspondiente equivale a una sola
instruccin, por lo que las llaves podran ser omitidas en algunos casos, pero es aconsejable
colocarlas por claridad.
Ahora borramos lo que tiene el main ya que queremos aprender a programar desde el
principio.
Ahora ya podemos escribir nuestro cdigo que seria el siguiente:
int main()
{
int nivel;
float salario, slanuevo;
printf("Introduce el nivel de antiguedad del trabajador: ");
scanf("%d",&nivel);
printf("Introduce tu salario: ");
scanf("%f",&salario);
switch (nivel) {
case 5:
slanuevo=salario+(salario*.035);
printf("\nTu salario es:%f\n",slanuevo);
break;
case 6:
slanuevo=salario+(salario*.041);
printf("\nTu salario es: %f\n",slanuevo);
break;
case 7:
slanuevo=salario+(salario*.048);
printf("\nTu salario es: %f\n",slanuevo);
break;
case 8:
slanuevo=salario+(salario*.053);
printf("\nTu salario es: %f\n",slanuevo);
break;
default:
printf("\nTu salario es: %f\n",salario);
}
system("PAUSE");
return 0;
}
El resultado es el siguiente:
Como podemos observar, el nivel de antigedad es 7 lo cual significara un aumento de
48%, lo que nos queda con el nuevo salario con el aumento.
#include <stdio.h>
main(void)
{
int nota;
printf("introduce tu nota\n");
scanf("%i",¬a);
switch(nota)
{
case 1:
case 2:
case 3: //ntese que pueden estar desordenados
case 0:
case 4:
printf("Suspenso\n");
break;
case 5:
case 6:
printf("Aprobado\n");
break;
case 9:
case 10:
printf("Sobresaliente\n");
break;
case 7:
case 8:
printf("Notable\n");
}
system("pause");
}
El resultado es el siguiente:
Como se puede observar, el nota introducida era 5, por lo que entrara en el case 5, pero
como no tiene break, pasa al siguiente case que es el 6 e imprime Aprobado, y apenas se
encuentra con el break se sale del switch.
#include <stdio.h>
int dia = 0;
main(void) {
printf("Elige un Dia a la Semana\n\n");
printf("1. Lunes\n");
printf("2. Martes\n");
printf("3. Miercoles\n");
printf("4. Jueves\n");
printf("5. Viernes\n");
printf("6. Sbado\n");
printf("7. Domingo\n");
printf("Que numero de dia de la semana escoges: ");
scanf("%i",&dia);
switch(dia) {
case 1 :
printf("Lunes es, Luna\n");
break;
case 2 :
printf("Martes es, Marte\n");
break;
case 3 :
printf("Miercoles es, Mercurio\n");
break;
case 4 :
printf("Jueves es, Jupiter\n");
break;
case 5 :
printf("Viernes es, Venus\n");
break;
case 6 :
printf("Sbado es, Saturno\n");
break;
case 7 :
printf("Domingo es, Sol\n");
break;
default :
printf("No existe\n");
}
system ("PAUSE");
}
El resultado es el siguiente:
La estructura anterior, de realizarse con sentencias if, necesitara cuatro de ellas, resultando
un enorme bloque muy difcil de leer. En la mayora de los casos, adems, la
sentencia switch proporciona una ganancia en velocidad del cdigo, pues permite al
compilador trabajar en base a que se trata de una decisin mltiple para una nica variable,
cosa que con sentencias if el compilador no tiene por qu detectar.
Como vemos, para cada valor de la variable se ejecuta un bloque de sentencias distinto, en
el que no necesitamos llaves. Hay un caso especial, default, que se ejecuta si ningn otro
corresponde, y que no es necesario poner. Es, en todo, equivalente al bloque else de una
sentencia if.
#include <stdio.h>
main(void)
{
int opcion,a,b,resultado;
printf("Ingrese un numero entero [a]: ");
scanf("%d",&a);
printf("Ingrese un numero entero [b]: ");
scanf("%d",&b);
printf("Menu\n");
printf("1. Sumar\n");
printf("2. Restar\n");
printf("3. Dividir\n");
printf("4. Multiplicar\n");
printf("Elija una operacion: ");
scanf("%d",&opcion);
switch(opcion)
{
case 1:
resultado=a+b;
printf("%d + %d = %d\n",a,b,resultado);
break;
case 2:
resultado=a-b;
printf("%d - %d = %d\n",a,b,resultado);
break;
case 3:
resultado=a/b;
printf("%d / %d = %d\n",a,b,resultado);
break;
case 4:
resultado=a*b;
printf("%d x %d = %d\n",a,b,resultado);
break;
defalut:
printf("Opcion no valida\n");
}
system ("PAUSE");
}
El resultado es el siguiente:
#include<stdio.h>
int main()
{
int lado;
int superficie;
printf("Ingrese el valor del lado del cuadrado:");
scanf("%i",&lado);
superficie = lado * lado;
printf("La superficie del cuadrado es:");
printf("%i",superficie);
getch();
return 0;
}
#include<stdio.h>
int main()
{
int lado;
int superficie;
printf("Ingrese el valor del lado del cuadrado:");
scanf("%i",&lado);
superficie = lado * lado * lado;
printf("La superficie del cuadrado es:");
printf("%i",superficie);
getch();
return 0;
}