Veamos este programita que nos ilustra en manejar macros o funciones para tener una programación mas estructurada.
#include <stdio.h>
/* Una macro es simplemente una substitucion de texto */
#define cuadrado(i) ((i)*(i))
#define cubo(i) cuadrado(i)*(i)
main()
{
int i=3;
printf("\n%d al cuadrado es %d\n",i,cuadrado(i));
printf("%d al cubo es %d\n",i,cubo(i));
}
Programa que crea una matriz de 7 filas por 10 columnas y que la rellena de la siguiente forma: en la 1 columna pone el factorial de la fila y en las demas rellana con números primos.
/* Librerias utilizadas */
#include <stdio.h> /* Libreria estandar */
#include <math.h> /* Libreria matematica */
#define filas 7 /* Dos constantes */
#define columnas 10
int factorial (numero)
/* Usamos una funcion recursiva para calcular el factorial */
{
if (numero > 0)
/* si el numero pasado es mayor que cero calcula el factorial del numero anterior */
{
numero = numero * factorial(numero-1);
}
if (numero == 0) /* Y si es igual a cero, el factorial de cero es igual a uno */
{
numero = 1;
}
return(numero); /* Devuelve el valor del factorial */
}
int numprimo(int *i,int *ptr) /* Calcula los numeros primos */
/* Se le pasan dos punteros */
{
long int resto,esprimo,a,num; /* Declaramos las variables locales */
num = *i;
/* Asignamos el valor del puntero a una de las variables */
esprimo = 0;
while (esprimo==0)
{
a=sqrt(num);
/* Euclides dijo que para saber si un numero es primo hab¡a que comprobarlo
unicamente con los numeros inferiores a su raiz cuadrada, lo que hacemos es
cuadrada, lo que aligera bastante el calculo. */
while (a != 1)
/* Divide el numero entre los menores a su raiz cuadrada (a), hasta 1 */
{
resto=num%a;
a--;
if (resto == 0)
/* Si el resto es cero, no es rpimo y deja de calcular */
{
a = 1;
}
}
if (resto != 0)
/* Pero si nunca ha sido cero, es un numero primo */
{
if (a == 1)
{
esprimo = 1;
}
else {esprimo = 0;}
}
num++;
}
*ptr = num; /* Modificamos el valor al que apunta el puntero */
}
void main()
{
int primo,i=2,numero,compara=1,n=0;
/* Declaramos variables */
int tabla [7][10];
/* Declaramos una matriz de 7x10 */
int fil,col;
for (fil=0;fil<filas;fil++)
{
/* Rellenamos la primera */
for (col=0;col<columnas;col++)
/* columna con los factoriales */
{
if (col == 0)
{
numero = fil;
tabla [fil][col] = factorial(numero+1);
/* Llamada a la funcion por recursividad */
}
}
}
fil = 0;
col = 1;
do{
numprimo(&i,&primo); /* Aqui rellenamos con los numeros primos */
{
tabla [fil][col] = primo - 1;
col++;
if (col == 10)
/* Ademas, se evita que salgan dos numeros iguales */
{
fil++;
col = 1;
}
n++;
}
compara = primo-1;
i++;
}
while (n<63);
for (fil=0;fil<filas;fil++) /* Sacamos a pantalla */
{
printf("(");
for (col=0;col<columnas;col++)
{
printf("%6d",tabla[fil][col]);
}
printf(" )\n");
}
printf("\n\n");
}
Ejemplo de lógica con bits.
#include<stdio.h>
main()
{
int i,j,k;
i=5; /* Inicializamos la variable i */
j=i<<2; /* Movemos los bits 2 lugares a la izquierda */
k=j>>2; /* Los movemos a la derecha */
printf("\ni = %d j = %d k = %d\n",i,j,k); /* Imprimimos */
}
En este ejemplo se muestra las diferentes formas de incrementar variables en el lenguaje de c.
/* http://www.pro-gramas.com */
/*Este programa trata sobre las distintas formas de incrementar
una variable, y como operar con ella*/
#include <stdio.h>
main()
{
int i; /*Declaramos la variable*/
i = 0; /*La inicializamos, con el valor 0*/
i = i + 1; /*Esta es la forma habitual de incrementar una variable
pero c permite otras formas mas eficaces*/
i++; /* Estas instrucciones incrementa en uno el valor de la*/
++i; /* varible i, la diferencia entre las dos reside en que*/
/* en un bucle (for, while...), ++i incrementa y luego
ejecuta el bucle, e i++ ejecuta el bucle y luego incrementa*/
i--;
--i; /*Tambien existe en la resta*/
i += 1; /* Esta es otra forma de incrementar i, se permite con otras
operaciones (- , * , /,..)*/
printf ("i = %d\n",i); /*Esto debe dar como resultado i = 2*/
}
Veremos un programita que permite realizar conversiones monetarias, pero solo convierte de pesetas a euros.
/* http://www.pro-gramas.com */
#include<stdio.h>
void main()
{
float pesetas,euros;
printf("\nIntroduzca la cantidad en pesetas -> ");
scanf("%f",&pesetas);
euros=pesetas/166.386;
/* Nota: al poner en el printf .2 redondea solo */
printf("\n\n%f pesetas son %.2f euros",pesetas,euros);
}
Programa que hace una copia de un fichero, las rutas se pasan a la función main, controla el número de argumentos de main, la apertura de los ficheros, y la sobre escritura en un archivo existente, similar al copy de MS-DOS.
/* http://www.pro-gramas.com */
#include<stdio.h>
void main(int argc,char *argv[])
{
char sino,car;
FILE *f1,*f2;
/* Control del paso de los argumentos de main */
if(argc!=3)
{
printf("\nSintaxis correcta: copia origen destino\n");
exit(-1);
}
/* Control de apertura del fichero origen */
f1=fopen(argv[1],"r");
if (f1==NULL)
{
printf("\nError abriendo archivo origen\n");
exit(-1);
}
/* Control de apertura del fichero destino */
f2=fopen(argv[2],"r");
if (f2==NULL)
{
printf("\nError abriendo archivo destino\n");
exit(-1);
}
/* Control de sobrescritura del archivo destino */
if(fgetc(f2)!=EOF)
{
fclose(f2);
printf("\nEl archivo ya existe, ¨desea sobrescribir? (S/N)\n");
scanf("%c",&sino); if ((sino=='N')||(sino=='n')) exit(-1);
}
f2=fopen(argv[2],"w");
/* Bucle que copia caracter a caracter los ficheros */
do
{
car=fgetc(f1);
fputc(car,f2);
}
while(car!=EOF);
}
Vamos a ver este programa que ilustra el tratamiento de cadenas de caracteres en Lenguaje C. Cada instrucción
lleva un ejemplo./* Programa que ilustra el manejo de cadenas, con un
ejemplo de cada sentencia */
/* http://www.pro-gramas.com */
#include <stdio.h>
#include <string.h>
#define salto printf("\n");
main()
{
int p;
char cadena[1000]="",nombre[8]="Manolo",*c;
gets(cadena); /* Lee una cadena */ salto;
puts(cadena); /* Escribe la cadena */ salto;
strcat(cadena,nombre); /* Copia nombre al final de cadena */
puts(cadena);
strncat(cadena,nombre,3); /* Copia 3 caracteres de nombre al final de cadena */
puts(cadena); salto;
strcpy(cadena,"Hola, amiguitos");
puts(cadena);
strncpy(cadena,"Hola mundo",8);
puts(cadena); salto;
c=strtok(cadena,"sin");
if(c) puts(c);
printf("%d\n",strlen(cadena)); salto;
strcpy(cadena,"Manola"); /* Compara dos cadenas y devuelve un entero */
p=strcmp(cadena,nombre); /* El valor del entero indica cual es mayor */
getchar();
if (p<0) puts("cadena es menor que nombre");
else if (p>0) puts("cadena es mayor que nombre");
else if (!p) puts("Son iguales");
salto;
strcpy(cadena,"Manola"); /* Compara a las dos cadenas 5 caracteres */
p=strncmp(cadena,nombre,5); /* Lo demas es similar a lo anterior */
if (p<0) puts("cadena es menor que nombre");
else if (p>0) puts("cadena es mayor que nombre");
else if (!p) puts("Son iguales");
salto;
/* Compara las cadenas hasta el caracter que difieren */
p=strspn(cadena,nombre);
printf("Cadena y nombre difieren en el caracter %d\n",p);
/* Compra las cadenas hasta encontrar un caracter igual */
strcpy(cadena,"Veo y subo");
p=strcspn(cadena,nombre);
printf("El primer caracter que coinciden es el %d\n",++p);
c=strpbrk(cadena,nombre); /* Encuentra un caracter comun */
printf("%s\n",c); salto;
/* Devuelve un puntero a la primera 'd' en cadena */
strcpy(cadena,"En un lugar de la mancha...");
c=strchr(cadena,'d');
p=c-cadena;
printf("La primera -d- esta en la posicion %d\n",p);
printf("%s\n",c); salto;
/* Devuelve un puntero a la ultima 'n' en cadena */
c=strrchr(cadena,'n');
p=c-cadena;
printf("La ultima -n- esta en la posicion %d\n",p);
printf("%s\n",c); salto;
/* Devuelve el puntero a la primera ocurrencia de nombre en cadena */
c=strstr(cadena,"lugar");
printf("%s\n",c); salto;
/* Cuando una sentencia no ha funcionado devuelve null */
c=strstr(cadena,nombre);
printf("%s\n",c); salto;
getchar();
printf("***************************************************\n");
printf("***************************************************\n");
printf("***************************************************\n\n\n");
}