C - Lenguaje C
C - Lenguaje C
C - Lenguaje C
C
Forma general de un programa en C
Declaraciones globales
main( )
{
variables locales
sentencias
}
f1( )
{
.........
}
...
...
fn ( )
{
.........
}
Nombre de indentificadores
Son los nombres usados para referirse a las variables, funciones, etiquetas y otros objetos
definidos por el usuario.
Tipos de datos
Modificadores de tipos
signed
unsigned
long
short
Los modificadores signed, unsigned, long y short se pueden aplicar a los tipos base entero y
carácter. Sin embargo, long también se puede aplicar a double.
Modificadores de acceso
Las variables de tipo const no pueden ser cambiadas durante la ejecución del programa. Por
ejemplo,
const int a;
Declaración de variables
Todas las variables han de ser declaradas antes de ser usadas. Forma general:
Existen tres sitios donde se pueden declarar variables: dentro de las funciones (variables
locales), en la definición de parámetros de funciones (parámetros formales) y fuera de todas las
funciones (variables globales).
Variables externas
Si una función situada en un fichero fuente desea utilizar una variable de este tipo declarada en
otro fichero, la debe declarar (o mejor dicho referenciar) con la palabra extern.
2
Archivo 1 Archivo 2
int x,y; extern int x,y;
char ch; extern char ch;
Tienen memoria asignada durante toda la ejecución del programa. Su valor es recordado
incluso si la función donde está definida acaba y se vuelve a llamar más tarde. Ejemplo:
series (void)
{
static int num;
num=num+23;
return (num);
}
Variables registro
El especificador register pide a Turbo C que mantenga el valor de una variable con ese
especificador de forma que se permita el acceso más rápido a la misma. Para enteros y
carácteres esto significa colocarla en un registro de la CPU.
Sólo se puede aplicar a variables locales y a los parámetros fomales de una función.
Son ideales para el control de bucles.
Sentencias de asignación
Abreviaturas en C
3
Conversión de tipos
Inicialización de variables
char c='a';
int primero=0;
float balance=123.23;
Todas las variables globales se inicializan a cero sino se especifica otro valor inicial. Las
variables locales y register tendran valores desconocidos antes de que se lleve a cabo su
primera asignación.
Constantes
Una constante de tipo cadena de carácteres está constituida por una secuencia de carácteres
entre comillas dobles "Hola".
\n Nueva línea
\t Tabulación horizontal
\b Espacio atras
\r Retorno de carro
\f Salto de página
\\ Barra invertida
\' Comilla simple
\" Comilla doble
Operadores
Aritmeticos
- resta
+ suma
* producto
/ división
% módulo (resto de la división entera)
-- decrementar
++ incrementar
4
x=10; x=10;
y=++x; y=x++;
y=11 y=10
Relacionales
Lógicos
&& y
|| o
! no
El operador ?
Se evalua exp1 si es cierto se evalua exp2 y toma ese valor para la expresión. Si exp1 es falso
evalua exp3 tomando su valor para la expresión.
Ejemplo: x=10:
y=x>9 ? 100 : 200 --------> y = 100
Sizeof
Ejemplo: flat f;
printf ("%f",sizeof f); Mostrara 4
printf ("%d", sizeof (int)); Mostrara 2
If
if (expresion) {
............
............
}
else {
...........
...........
}
Switch
switch (variable) {
case cte1 :
...........
...........
break;
case cte2 :
...........
...........
break;
..................
..................
default :
...........
...........
}
BUCLES
For
Ejemplo: for (x=1; x<=100; x++) printf ("%d",x); Imprime los numeros del 1 al 100
While
6
Do / While
do {
...........
...........
} while (condicion);
Break
Exit
main (void)
{
if (!tarjeta_color( )) exit(1);
jugar( );
}
Continue
Hace comenzar la iteración siguiente del bucle, saltando así la secuencia de instrucciones
comprendida entre el continue y el fin del bucle.
do {
scanf("%d",&num);
if (x<0) continue;
printf("%d",x);
} while (x!=100);
Funciones
7
Llamada por valor
Es posible causar una llamada por referencia pasando un puntero al argumento. Se pasa la
dirección del argumento a la función, por tanto es posible cambiar el valor del argumento
exterior de la función.
Arrays
char p [10]; array de carácteres que tiene 10 elementos, desde p[0] hasta p[9].
func1 (i);
}
8
Inicialización de arrays
lista de valores, es una lista de constantes separadas por comas, cuyo tipo es compatible con el
tipo del array. La primera constante se coloca en la primera posición del array, la segunda
constante en la segunda posición y así sucesivamente.
Los arrays de carácteres que contienen cadenas permiten una inicialización de la forma:
Ejemplo:
Es posible que C calcule automáticamente las dimensiones de los arrays utilizando arrays
indeterminados. Si en la inicialización no se especifica el tamaño el compilador crea un array
suficientemente grande para contener todos los inicializadores presentes.
Cadenas
Aunque C no define un tipo cadena, estas se definen como un array de carácteres de cualquier
longitud que termina en un carácter nulo ('\0').
Una constante de cadena es una lista de carácteres encerrada entre dobles comillas.
char *strcpy (char *s1, const char *s2); copia la cadena apuntada por s2 en la apuntada por
s1. Devuelve s1.
char *strcat (char *s1, consta char *s2); concatena la cadena apuntada por s2 en la apuntada
por s1, devuelve s1.
int strlen (const char *s1); devuelve la longitud de la cadena apuntada por s1.
int strcmp (const char *s1, const char *s2); compara s1 y s2, devuelve 0 si con iguales, mayor
que cero si s1>s2 y menor que cero si s1<s2. Las comparaciones se hacen alfabéticamente.
9
Arrays Bidimensionales
Cuando se utiliza un array bidimensional como argumento de una función realmente sólo se
pasa un puntero al primer elemento, pero la función que recibe el array tiene que definir al
menos la longitud de la primera dimensión para que el compilador sepa la longitud de cada fila.
Ejemplo: función que recibe un array bidimensional de dimensiones 5,10 se declara así:
Arrays y Punteros
char p[10]; - p
- &p[0]
Esto también se puede aplicar con los arrays de dos o más direcciones.
int a[10][10];
a=&a[0][0];
a[0][4]=*((*a)+4);
Memoria dinámica
Malloc (n) reserva una porción de memoria libre de n bytes y devuelve un puntero sobre el
comienzo de dicho espacio.
Si no hay suficiente memoria libre para satisfacer la petición, malloc ( ) devuelve un nulo.
10
Ejemplo:
char *p;
p=malloc(1000);
Estructuras
struct etiqueta {
tipo nombre_variable;
tipo nombre_variable;
.............................
.............................
} variables _de_estructura
Ejemplo:
struct dir {
char nombre[30];
char calle[40];
char ciudad[20];
char estado[3];
unsigned long int codigo;
} info_dir;
Ejemplo:
info_dir.codigo = 12345;
struct familia {
char apellido[10];
char nombrePadre[10];
char nombreMadre[10];
int numerohijos;
} fam1={"Garcia","Juan","Maria",7};
Arrays de estructuras
Se define primero la estructura y luego se declara una variable array de dicho tipo.
Ejemplo:
Cuando se utiliza una estructura como argumento de una función, se pasa la estructura íntegra
mediante el uso del método estándar de llamada por valor.
Ejemplo:
struct tipo_estructura {
int a,b;
char c;
};
main ( )
{
struct tipo_estructura arg;
arg.a = 1000;
f1(arg);
return 0;
}
Punteros a estructuras
Para encontrar la dirección de una variable de estructura se coloca & antes del nombre de la
estructura.
Ejemplo:
struct bal {
float balance;
char nombre[80];
} persona;
No podemos usar el operador punto para acceder a un elemento de la estructura a través del
puntero a la estructura. Debemos utilizar el operador flecha ->
p -> balance
12
Tipo enumerado
Los valores son: penique 0, niquel 1, diez_centavos 2, cuarto 100, medio_dolar 101, dolar 102
Punteros
px=py; copia el contenido de py sobre px, de modo que px apuntará al mismo objeto que
apunta py.
px=&x; px apunta a x.
Ejemplo:
p1=p1+9; p1 apunta al noveno elemento del tipo p1 que está más allá del elemento al
que apunta actualmente.
13
Punteros y arrays
cad[4] o *(p1+4)
Arrays de punteros
int *x [10];
Para asignar la dirección de una variable entera llamada var al tercer elemento del array de
punteros, se escribe:
x[2]=&var;
*x[2]
Punteros a punteros
float **balancenuevo;
Ejemplo:
main(void)
{
int x, *p, **q;
x=10;
p=&x;
q=&p;
printf("%d",**q); /* imprime el valor de x */
return 0;
}
14
E/S por consola
getche ( ) lee un carácter del teclado, espera hasta que se pulse una tecla y entonces devuelve
su valor. El eco de la tecla pulsada aparece automáticamente en la pantalla. Requiere el archivo
de cabecera conio.h
Ejemplo:
- Getch ( ): trabaja igual que getche ( ) excepto que no muestra en la pantalla un eco del
carácter introducido.
gets ( ) y puts ( )
gets ( ) lee una cadena de carácteres introducida por el teclado y la situa en la dirección
apuntada por su argumento de tipo puntero a carácter. Su prototipo es:
Ejemplo:
main ( )
{
char cad[80];
gets (cad);
printf ("La longitud es %d", strlen (cad));
return 0;
}
15
char * puts (const char *cad);
%c un único carácter
%d decimal
%i decimal
%e notación científica
%f decimal en coma flotante
%o octal
%s cadena de carácteres
%u decimales sin signo
%x hexadecimales
%% imprime un signo %
%p muestra un puntero
Las órdenes de formato pueden tener modificadores que especifiquen la longitud del campo,
número de decimales y el ajuste a la izquierda.
Un entero situado entre % y el código de formato actua como un especificador de longitud
mínima de campo. Si se quiere rellenar con ceros, se pone un 0 antes del especificador de
longitud de campo.
Si se aplica a cadenas o enteros el número que sigue al punto especifica la longitud máxima del
campo.
Ejemplo:
scanf ("%d",&cuenta);
16