Está en la página 1de 29

Instalacin y Mantenimiento de servicios de redes locales.

EJERCICIOS de C
BLOQUE 1

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

1.- Leer dos nmeros enteros y escribir el mayor de los dos o un mensaje si son iguales. (Solucin). 2.- Leer un carcter y dos nmeros enteros. Si el carcter ledo es un operador aritmtico calcular la operacin correspondiente, si es cualquier otro mostrar error. Hacer el programa utilizando if-else. 3.- Hacer el mismo programa usando la instruccin switch(). (Solucin)

4.- Leer un nmero entero y visualizar su tabla de multiplicar. (Solucin)

5.- Generar enteros de 3 en 3 comenzando por el 2 hasta el valor mximo menor que 30. Calcular la suma de los enteros generados que sean divisibles por 5.

6.- Media de una serie de nmeros que finaliza al introducir el 999. El 999 no debe ser tenido en cuenta para la media. (Solucin) 7.- Leer un nmero entero positivo y averiguar si es perfecto. Un n es perfecto cuando es igual a la suma de sus divisores excepto el mismo. (Solucin)

8.- Leer dos nmeros enteros a y b mayores o iguales que cero y calcular su producto mediante sumas. (Solucin)

9.- Leer un nmero entero y averiguar si es o no mltiplo de 9. Un nmero es mltiplo de 9 si la suma de sus cifras es 9 o mltiplo de 9. (Solucin)

Profesor: Angel Delgado Herrador

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

10.- Generar los N primeros trminos de la serie de Fibonacci. El valor de N (entero y positivo) deber ser ledo por teclado. En esta serie los dos primeros nmeros son 1, y el resto se obtiene sumando los dos anteriores: 1,1,2,3,5,8,13,21,... (Solucin)

11.- Presentar en la funcin main() el siguiente men de opciones: 1.- Tabla de multiplicar (leer en main() un nmero y en una funcin mostrar su tabla de multiplicar). 2.- Producto por sumas (en main() leer dos nmeros enteros mayores que 0 y en una funcin calcular su producto mediante sumas sucesivas). 3.- Mostrar nmeros comprendidos (leer dos nmeros enteros cualesquiera y en funcin mostrar los nmeros comprendidos entre ambos, no se incluyen). (Solucin) 12.- Leer por teclado un numero entero N. Escribir los nmeros primos comprendidos entre 1 y N. Disear una funcin que permita averiguar si un nmero es o no primo. (Solucin) 13.- Leer una fecha en formato dia-mes-ao, averiguar si es correcta e indicar el da siguiente. (Solucin) 14.- Implementar un programa que sea capaz de calcular el resultado de aplicar la frmula siguiente (n i)= n! /( i! * (n-i)!). Para ello se dispone de dos funciones, una de ellas lee un nmero por teclado que debe ser mayor o igual que cero. Teniendo en cuenta adems que n tiene que ser necesariamente mayor que i. La otra funcin calcula el factorial de un nmero. (Solucin) 15.-Mostrar los datos de un fichero de texto usando el smbolo de redireccin del sistema operativo MS-DOS. Ejecutar: programa<fich.txt (Solucin)

BLOQUE 2
1.- Cargar una tabla de p filas y q columnas, escribir la tabla en forma de matriz y escribir la suma de las filas y las columnas.

Profesor: Angel Delgado Herrador

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

2.- Cargar un array de m nmeros enteros decir cual es el mayor y donde esta. 3.- Cargar un array de n enteros y calcular la media de los que estn en posiciones pares.(Solucin) 4.- Programa: Leer en la funcin main() un nmero entero "n" mayor que 2 y menor o igual que 20. Cargar, en una funcin, un array de "n" nmeros enteros. Mostrar el vector, en una sola lnea, en otra funcin. En main() leer otro nmero entero y en una funcin contar las veces que aparece dicho nmero en el array, el resultado debe indicarse en main(). (Solucin) 5.- Leer, en main(), una cadena de caracteres y llamar a un funcin que la modifique. En la funcin se deben cambiar maysculas por minsculas, minsculas por maysculas y dgitos por puntos. El resultado se escribe en la funcin main(). (Solucin) 6.- Leer una cadena de caracteres y cortarla en palabras escribiendo cada palabra en una lnea. Se supone que las palabras se separan slo por blancos. (Solucin) 7.- Leer un numero n y pedir n veces tres nmeros enteros e imprimirlos cada vez ordenados de menor a mayor. Utilizar una funcin que, con ayuda de punteros, permita ordenar dos nmeros.(Solucin) 8.- Convertir una cadena de caracteres a un valor entero mediante una funcin que reciba la direccin de la cadena y la direccin de la variable que almacenar el resultado. (Se supone que hay nmeros el la cadena). -Buscar el comienzo del nmero distinto de blanco, supondremos + o -. -Averiguar el signo, si no es un carcter valido devuelve un error. -Si el carcter es un digito se pasa a decimal ((ascii)numero-48)*10. -Si la funcin finaliza de forma correcta devuelve un uno. (Solucin) 9.- Generar los N primeros trminos de la serie de Fibonacci, utilizando para ello una funcin en las que se trabaja con variables estticas. (Solucin) 10.- Cargar un array bidimensional de p*q y devolver un puntero apuntando a la fila que mas suma. (Solucin) Profesor: Angel Delgado Herrador 3

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

11.- Leer por teclado un nmero entero largo e indicar si el nmero ledo es o no capica. Para ello debe utilizarse un array unidimensional donde almacenaremos cada una de las cifras del nmero ledo. Se implementarn dos funciones, una para descomponer el nmero en cifras y cargar el array, y otra para comparar las posiciones del array y determinar si el nmero es capica. (Solucin) 12.- Introducir una cadena de caracteres, e indicar si la cadena leda es o no un palndromo (se lee igual de izquierda a derecha, que de derecha a izquierda). Ej: Dabale arroz a la zorra el abad (Solucin) 13.- Leer por teclado un nmero entero mayor que 0 y menor o igual que 10 para determinar el rango de una matriz de enteros. Leer un segundo nmero entero, que servir para indicar el valor de comienzo. Cargar, recorriendo en espiral, una matriz de enteros, a partir del segundo valor ledo, y con el rango indicado. (Solucin)

Profesor: Angel Delgado Herrador

Instalacin y Mantenimiento de servicios de redes locales.

SOLUCIONES EJERCICIOS de C
BLOQUE 1

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

1.- Leer dos nmeros enteros y escribir el mayor de los dos o un mensaje si son iguales. Solucin: .

/*Leer dos nmeros enteros y escribir el mayor de ambos o un mensaje si son iguales.*/ #include <stdio.h> void main() { int a,b; printf("Dame dos numeros... "); scanf("%d%d",&a,&b); if (a>b) printf("El mayor numero es... %d",a); else if (b>a) printf("El numero mayor es.... %d",b); else printf("Los numeros son iguales"); }

2.- Leer un carcter y dos nmeros enteros. Si el carcter ledo es un operador aritmtico calcular la operacin correspondiente, si es cualquier otro mostrar error. Hacer el programa utilizando if-else. 3.- Hacer el mismo programa usando la instruccin switch(). Solucin: /* Leer un carcter y dos nmeros enteros. Si el carcter ledo es un operador aritmtico calcular la operacin correspondiente, si es cualquier otro mostrar error. Hacer el programa utilizando la instruccin switch() */ Profesor: Angel Delgado Herrador 5

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

#include <stdio.h> void main() { char c; int a,b; printf("dame un caracter\n"); c=getchar(); fflush (stdin); printf("dame dos numeros\n"); scanf("%d %d",&a,&b); switch (c) { case '+': printf("resultado %d",a+b); break; case '-': printf("resultado %d",a-b); break; case '*': printf("resultado %d",a*b); break; case '/': printf("resultado %d",a/b); break; default: printf("error"); } }

4.- Leer un nmero entero y visualizar su tabla de multiplicar. Solucin: /* Leer un nmero entero y visualizar su tabla de multiplicar. */ #include <stdio.h> void main() { int a,b; printf ("Introduce el nmero:"); scanf("%d",&a); b=1; while (b<=10) { printf("%d * %d = %d\n",a,b,a*b); b++; } } Profesor: Angel Delgado Herrador 6

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

5.- Generar enteros de 3 en 3 comenzando por el 2 hasta el valor mximo menor que 30. Calcular la suma de los enteros generados que sean divisibles por 5.

6.- Media de una serie de nmeros que finaliza al introducir el 999. El 999 no debe ser tenido en cuenta para la media. Solucin: /* Media de una serie de nmeros que finaliza al introducir el 999. El 999 no debe ser tenido en cuenta para la media. */ #include <stdio.h> void main() { int n,c=0,s=0; // Tpico esquema mientras. // Se lee el primer elemento de la secuencia fuera del bucle printf("Dame el primer n:"); scanf("%d",&n); while(n!=999) { s+=n; // Se trata el elemento ledo c++; printf("Dame el siguiente n:"); // Se obtiene el siguiente elemento scanf("%d",&n); } if (c) // Slo se podr dividir si en la secuencia hay algn n printf("\nLa media de los nmeros es %.2f\n",(float)s/c); else Profesor: Angel Delgado Herrador 7

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

printf("\nNo se ha ledo ningn nmero.\n"); } 7.- Leer un nmero entero positivo y averiguar si es perfecto. Un n es perfecto cuando es igual a la suma de sus divisores excepto el mismo. Solucin: /* Leer un entero positivo y averiguar si es perfecto. Un n es perfecto cuando es igual a la suma de sus divisores excepto el mismo */ #include <stdio.h> void main() { int i,numero,suma=0; do{ printf("Dame un numero:"); scanf("%d",&numero); } while (numero<=0); for (i=1;i<=(numero/2);i++) if ((numero%i)==0) suma+=i; if (numero==suma) printf("El numero es perfecto."); else printf("El numero NO es perfecto."); }

8.- Leer dos nmeros enteros a y b mayores o iguales que cero y calcular su producto mediante sumas. Solucin: /* Leer dos nmeros enteros a y b mayores o iguales que cero y calcular su producto mediante sumas sucesivas. (Se usan, a modo de ejemplo, los tres esquemas repetitivos existentes en C.*/ #include <stdio.h> void main() { int a,b,c,i,producto=0; Profesor: Angel Delgado Herrador 8

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

do{ printf("Dame un a:"); scanf("%d",&a); } while (a<0); do{ printf("Dame b:"); scanf("%d",&b); } while (b<0); // Suponemos que a es mayor que b en caso contrario se hace un intercambio if (a<b) { c=a; a=b; b=c; } printf("a=%d b=%d\n",a,b); for (i=0;i<b;i++) producto+=a; printf("El producto con for es: %d\n",producto); producto=0; i=0; while (i<b) { producto+=a; i++; } printf("El producto con while es: %d\n",producto); producto=0; i=0; do /* con este bucle al multiplicar por cero */ { /* me daria "a" */ producto+=a; i++; } while (i<b); printf("El producto con do-while es: %d",producto); } 9.- Leer un nmero entero y averiguar si es o no mltiplo de 9. Un nmero es mltiplo de 9 si la suma de sus cifras es 9 o mltiplo de 9. Solucin: /* Leer un numero entero y averiguar si es o no mltiplo de 9. Un n es mltiplo de 9 si la suma de sus cifras es 9 o mltiplo de 9. Profesor: Angel Delgado Herrador 9

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

Ej.: 99 es mltiplo pues 9+9=18, que a su vez 1+8=9 */ #include <stdio.h> void main() { int numero,sumacifras,s; printf("Dame un numero: "); scanf("%d",&numero); s=numero; while (numero>9) { sumacifras=(numero%10); while ((numero/=10)!=0) de 0 //Inicializamos sumacifras con el primer resto. //Mientras la parte entera de la divisin sea distinta //Seguimos sumando los restos

sumacifras+=(numero%10); numero=sumacifras; } if (numero==9)

//Asignamos la suma de las cifras al nmero

//Al salir si el nmero es igual a 9 es mltiplo

printf("El numero %d, es multiplo de 9.",s); else printf("El numero %d, NO es multiplo de 9.",s); } 10.- Generar los N primeros trminos de la serie de Fibonacci. El valor de N (entero y positivo) deber ser ledo por teclado. En esta serie los dos primeros nmeros son 1, y el resto se obtiene sumando los dos anteriores: 1,1,2,3,5,8,13,21,... Solucin:

Profesor: Angel Delgado Herrador

10

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

/* Generar los N primeros trminos de la serie de Fibonacci. El valor de N (entero y positivo) deber ser ledo por teclado. En esta serie los dos primeros nmeros son 1, y el resto se obtiene sumando los dos anteriores: 1,1,2,3,5,8,13,21,... */ #include <stdio.h> void main() { int n,a,b,c,aux; do{ // Se lle el nmero hasta que sea mayor que cero. printf("\nDame un numero :"); scanf("%d",&n); } while(n<=0); a=1;b=0; for(c=1;c<=n;c++) { printf("%d\t",a); aux=a; a+=b; b=aux; } } 11.- Presentar en la funcin main() el siguiente men de opciones: 1.- Tabla de multiplicar (leer en main() un nmero y en una funcin mostrar su tabla de multiplicar). 2.- Producto por sumas (en main() leer dos nmeros enteros mayores que 0 y en una funcin calcular su producto mediante sumas sucesivas). 3.- Mostrar nmeros comprendidos (leer dos nmeros enteros cualesquiera y en funcin mostrar los nmeros comprendidos entre ambos, no se incluyen). Solucin: /* Programa: Presentar en la funcin main() el siguiente men de opciones: 1.- Tabla de multiplicar (leer en main() un nmero y en una funcin mostrar su tabla de multiplicar). 2.- Producto por sumas (en main() leer dos nmeros enteros mayores que 0 y en una funcin calcular su producto mediante sumas sucesivas). 3.- Mostrar nmeros comprendidos (leer dos nmeros enteros cualesquiera y en funcin mostrar los nmeros comprendidos entre ambos, no se incluyen). */ #include <stdio.h> void tabla(int); void producto(int,int); void numeros(int,int); Profesor: Angel Delgado Herrador 11

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

void main() { int op,n,m; do { system ("cls"); printf ("\n MEN DE OPCIONES"); printf ("\n ================\n"); printf ("\n 1.- TABLA DE MULTIPLICAR\n"); printf ("\n 2.- PRODUCTO POR SUMAS\n"); printf ("\n 3.- MOSTRAR NMEROS COMPRENDIDOS ENTRE DOS\n"); printf ("\n 4.- SALIR \n\n\n\n"); printf ("\n ELIGE UNA OPCION : "); scanf ("%d",&op); switch (op) { case 1: system ("cls"); printf ("\n Dame un nmero : "); scanf ("%d",&n); tabla(n); // Llamada a la funcin printf ("\n"); system("pause"); break; case 2: system ("cls"); do{ printf ("\n Dame un nmero : "); scanf ("%d",&n); }while (n < 0); do{ printf ("\n Dame otro nmero : "); scanf ("%d",&m); }while (m < 0); producto(n,m); printf ("\n"); system("pause"); break; case 3: system ("cls"); printf ("\n Dame un nmero : "); scanf ("%d",&n); printf ("\n Dame un nmero : "); scanf ("%d",&m); numeros(n,m); printf ("\n"); system("pause"); break; } }while (op != 4); } Profesor: Angel Delgado Herrador 12

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

void tabla(int n) { int c,p=1; for (c=1;c<=10;c++) { p=n* c; printf ("\n %d * %d = %d",n ,c,p); } return; } void producto(int n, int m) { int c,sum=0,aux; if (n > m) // Se supone n el menor, en caso de no serlo se intercambian los valores { aux=n; n=m; m=aux; } for (c=1;c<=n;c++) sum+=m; printf ("\n El producto por sumas es %d",sum); return; } void numeros(int n, int m) { int c,aux; if (n > m) { aux = n; n = m; m = aux; } if (n+ 1 >= m) printf ("\n No hay nmeros \n"); else for (c=n + 1;c < m ;c++) printf ("\n %d",c); return; } 12.- Leer por teclado un numero entero N. Escribir los nmeros primos comprendidos entre 1 y N. Disear una funcin que permita averiguar si un nmero es o no primo. Solucin: /* Leer por teclado un numero entero N. Escribir los nmeros primos comprendidos entre 1 y N. Disear una funcin que permita averiguar si un nmero es o no primo. */

Profesor: Angel Delgado Herrador

13

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

#include <stdio.h> #define TRUE 1 #define FALSE 0 int primo(int); void main() { int n,i; printf("\nDame un numero:"); scanf("%d",&n); for (i=1;i<=n;i++) if(primo(i)) printf(" %d ",i); } int primo (int n) { int i; for (i=2;i<=(n/2);i++) if((n%i)==0) return FALSE; return TRUE; } 13.- Leer una fecha en formato dia-mes-ao, averiguar si es correcta e indicar el da siguiente. Solucin: /* Leer una fecha en formato dia-mes-ao, averiguar si es correcta e indicar el da siguiente. */ #include <stdio.h> #define TRUE 1 #define FALSE 0 int correcta_fecha(int,int,int); int bisiesto(int); void main() { int dia,mes,anio; printf("Dame una fecha:(dd-mm-aaaa)"); scanf("%d-%d-%d",&dia,&mes,&anio); if (!correcta_fecha(dia,mes,anio)) printf("\nLa fecha no es correcta."); } int correcta_fecha(int dia,int mes,int anio) Profesor: Angel Delgado Herrador 14

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

{ int d; switch (mes) { case 4: case 6: case 9: case 11:d=30; break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: d=31; break; case 2: if (bisiesto(anio)) d=29; else d=28; break; default: return FALSE; } if (dia<=d) { if (dia<d) dia++; else { dia=1; if (mes==12) { mes=1; anio++; } else mes++; } printf("\nEl proximo dia sera:%2d-%2d-%d.",dia,mes,anio); return TRUE; } else return FALSE; } /* Un ano es bisiesto cuando es multiplo de 4 pero no de 100 o multiplo de 400. */ int bisiesto(int anio) { if ((anio%4==0 && anio%100!=0) || (anio%400==0)) return TRUE; Profesor: Angel Delgado Herrador 15

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

return FALSE; } 14.- Implementar un programa que sea capaz de calcular el resultado de aplicar la frmula siguiente (n i)= n! /( i! * (n-i)!). Para ello se dispone de dos funciones, una de ellas lee un nmero por teclado que debe ser mayor o igual que cero. Teniendo en cuenta adems que n tiene que ser necesariamente mayor que i. La otra funcin calcula el factorial de un nmero. Solucin: /* Implementar un programa que sea capaz de calcular el resultado de aplicar la frmula siguiente (n i)= n! /( i! * (n-i)!). Para ello se dispone de dos funciones, una de ellas lee un nmero por teclado que debe ser mayor o igual que cero. Teniendo en cuenta adems que n tiene que ser necesariamente mayor que i. La otra funcin calcula el factorial de un nmero. */ #include <stdio.h> int lee_numero(); long int factorial(int); // Programa principal. void main() { int n,i; printf("Valor de i...\n"); i=lee_numero(); printf("\nValor de n...\n"); do n=lee_numero(); while(n<i); printf("Resultado %d sobre %d = %d",n,i,factorial(n)/(factorial(i)*factorial(n-i))); } // Funciones. int lee_numero() { int a; do{ printf("Escribe un valor:"); scanf("%d",&a); }while(a<0); return a; } long int factorial(int x) Profesor: Angel Delgado Herrador 16

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

{ long int f=1; for(;x>0;x--) f*=x; return f; } 15.-Mostrar los datos de un fichero de texto usando el smbolo de redireccin del sistema operativo MS-DOS.Ejecutar: programa<fich.txt Solucin: /* Mostrar los datos de un fichero de texto usando el smbolo de redireccin del sistema operativo MS-DOS. Ejecutar: programa<fich.txt Tambin se puede generar un archivo de texto, si se usa el smbolo de redireccin > en este caso, la entrada de datos por teclado debe finalizar al pulsar ^Z*/ #include <stdio.h> void main() { char c; while((c=getchar())!=EOF) putchar(c); }

BLOQUE 2
1.- Cargar una tabla de p filas y q columnas, escribir la tabla en forma de matriz y escribir la suma de las filas y las columnas. 2.- Cargar un array de m nmeros enteros decir cual es el mayor y donde esta. 3.- Cargar un array de n enteros y calcular la media de los que estn en posiciones pares. Solucin: /* Cargar un array de n enteros y calcular la media de los que estn en posiciones pares. */ #include <stdio.h> #define MAX 100 int carga_array(int[]); float media(int[],int); void main() { int a[MAX],eltos; Profesor: Angel Delgado Herrador 17

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

eltos=carga_array(a); if (eltos) printf("\nLa media es %f.",media(a,eltos)); } int carga_array(int a[]) { int i,num; printf("\nDame un numero:"); scanf("%d",&num); for (i=0;i<num;i++) { printf("Dame un elto:"); scanf("%d",&a[i]); } return num; } float media(int a[],int eltos) { int i,suma=0,num=0; for (i=1;i<eltos;i+=2) { suma+=a[i]; num++; } return ((float)suma/num); } 4.- Programa: Leer en la funcin main() un nmero entero "n" mayor que 2 y menor o igual que 20. Cargar, en una funcin, un array de "n" nmeros enteros. Mostrar el vector, en una sola lnea, en otra funcin. En main() leer otro nmero entero y en una funcin contar las veces que aparece dicho nmero en el array, el resultado debe indicarse en main(). Solucin: /*Programa: Leer en la funcion main() un nmero entero "n" mayor que 2 y menor o igual que 20. Cargar, en una funcin, un array de "n" nmeros enteros. Mostrar el vector, en una sola lnea, en otra funcin. En main() leer otro nmero entero y en una funcion contar las veces que aparece dicho nmero en el array, el resultado debe indicarse en main().*/ #include <stdio.h> void cargar(int[],int); void mostrar(int[],int); int contar(int[],int,int); void main() { int n,a,t[20]; system("cls"); do{ printf("Cuntos elementos tiene la tabla?"); scanf("%d",&n); Profesor: Angel Delgado Herrador 18

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

}while (n<3 || n>20); cargar(t,n); system("cls"); printf("Los elementos de la tabla son...\n"); mostrar(t,n); printf("\n\n\nDame el nmero que vas a buscar: "); scanf("%d",&a); printf("\n\nEl nmero %d aparece %d veces en la tabla.",a,contar(t,n,a)); } void cargar(int t[],int n) { int i; for(i=0;i<n;i++) { printf("Elemento %d: ",i+1); scanf("%d",&t[i]); } return; } void mostrar(int t[],int n) { int i; for(i=0;i<n;i++) printf("%6d",t[i]); return; } int contar(int t[],int n,int a) { int i,cont=0; for(i=0;i<n;i++) if (t[i]==a) cont++; return cont; } 5.- Leer, en main(), una cadena de caracteres y llamar a un funcin que la modifique. En la funcin se deben cambiar maysculas por minsculas, minsculas por maysculas y dgitos por puntos. El resultado se escribe en la funcin main(). Solucin: /* Leer, en main(), una cadena de caracteres y llamar a un funcin que la modifique. En la funcin se deben cambiar maysculas por minsculas, minsculas por maysculas y dgitos por puntos. El resultado se escribe en la funcin main(). */ #include <stdio.h> void modificar (char[]);

Profesor: Angel Delgado Herrador

19

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

void main() { char cad[30]; printf("Dame una cadena caracteres:"); gets(cad); modificar(cad); puts(cad); } void modificar(char cad[]) { int i; for(i=0;cad[i]!='\0';i++) { if(isupper(cad[i])) cad[i]=tolower(cad[i]); else if(islower(cad[i])) cad[i]=toupper(cad[i]); else if(isdigit(cad[i])) cad[i]='.'; } return; } 6.- Leer una cadena de caracteres y cortarla en palabras escribiendo cada palabra en una lnea. Se supone que las palabras se separan slo por blancos. Solucin: /* Leer una cadena de caracteres y cortarla en palabras escribiendo cada palabra en una lnea. Se supone que las palabras se separan slo por blancos. */ #include <stdio.h> #include <ctype.h> #include <string.h> void escribe_palabras(char[]); void main() { char frase[50]; gets(frase); escribe_palabras(frase); } void escribe_palabras(char frase[]) { char palabra[10]; int i=0,j=0; Profesor: Angel Delgado Herrador 20

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

while(frase[i]!='\0') { while(frase[i]==' ') i++; j=0; while((frase[i]!=' ') && (frase[i]!='\0')) palabra[j++]=frase[i++]; palabra[j]='\0'; puts(palabra); } } 7.- Leer un numero n y pedir n veces tres nmeros enteros e imprimirlos cada vez ordenados de menor a mayor. Utilizar una funcin que, con ayuda de punteros, permita ordenar dos nmeros. Solucin: /* Leer un numero n y pedir n veces tres nmeros enteros e imprimirlos cada vez ordenados de menor a mayor. Utilizar una funcin, que con el uso de punteros, permita ordenar dos nmeros. */ #include <stdio.h> void ordena (int*,int*); // funcin que ordena nmeros de dos en dos void main() { int n,i,a,b,c; do{ printf("dame un nmero:"); scanf("%d",&n); }while (n<=0); for (i=0;i<n;i++) { printf("Dame tres nmeros:"); scanf("%d-%d-%d",&a,&b,&c); ordena(&a,&b); ordena(&a,&c); ordena(&b,&c); printf("%d-%d-%d\n",a,b,c); } } void ordena(int *pa,int *pb) Profesor: Angel Delgado Herrador 21

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

{ int aux; if (*pa>*pb) { aux=*pa; *pa=*pb; *pb=aux; } return; } 8.- Convertir una cadena de caracteres a un valor entero mediante una funcin que reciba la direccin de la cadena y la direccin de la variable que almacenar el resultado. (Se supone que hay nmeros el la cadena). -Buscar el comienzo del nmero distinto de blanco, supondremos + o -. -Averiguar el signo, si no es un carcter valido devuelve un error. -Si el carcter es un digito se pasa a decimal ((ascii)numero-48)*10. -Si la funcin finaliza de forma correcta devuelve un uno. Solucin: /* Convertir una cadena de caracteres a un valor entero mediante una funcin que reciba la direccin de la cadena y la direccin de la variable que almacenar el resultado. (Se supone que hay nmeros el la cadena). -Buscar el comienzo de numero distinto de blanco, supondremos + o -. -Averiguar el signo, si no es un carcter valido devuelve un error. -Si el carcter es un digito se pasa a decimal ((ascii)numero-48)*10. -Si la funcin finaliza de forma correcta devuelve un uno. */ #include <stdio.h> #include <ctype.h> #include <string.h> int convierte(char*,float*); void main() { char cadena[50]; float valor; printf("Dame una cadena:"); gets(cadena); if (convierte(cadena,&valor)) printf("El valor es:%f",valor); else puts("ERROR"); } int convierte(char *pcadena,float *pvalor) { int neg=1,error=0; Profesor: Angel Delgado Herrador 22

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

while(*pcadena==' ') pcadena++; if (!isdigit(*pcadena)) { if (*pcadena=='-') neg=-1; else if (*pcadena=='+') neg=1; else error=1; pcadena++; } while ((*pcadena) && (!error)) { if (!isdigit(*pcadena)) error=1; else *pvalor=*pvalor*10+((int)(*pcadena-48)); pcadena++; } if (error) return 0; *pvalor=(*pvalor)*(float)neg; return 1; } 9.- Generar los N primeros trminos de la serie de Fibonacci, utilizando para ello una funcin en las que se trabaja con variables estticas. Solucin: /* Generar los N primeros trminos de la serie de Fibonacci, utilizando para ello una funcin en las que se trabaja con variables estticas.*/ #include <stdio.h> long int fibonacci(int); void main() { int n,cont; printf("\n Cuntos nmeros de Fibonacci??"); scanf("%d",&n); for(cont=1;cont<=n;cont++) printf("\ni=%2d\t F=%ld",cont,fibonacci(cont)); } long int fibonacci(int cont) Profesor: Angel Delgado Herrador 23

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

{ static long int f1=1,f2=1; // Se inicializan en la primera llamada a la funcin. long int f; f=(cont<3)?1:f1+f2; // if (cont<3) f=1; else f=f1+f2; f2=f1; // se denomina operador condicional f1=f; return f; } 10.- Cargar un array bidimensional de p*q y devolver un puntero apuntando a la fila que mas suma. Solucin: /* Cargar un array bidimensional de p*q y devolver un puntero apuntando a la fila que mas suma.*/ #include <stdio.h> #define fil 5 #define col 5 void cargar_tabla(int(*)[col],int,int); int *max_fila(int(*)[col],int,int); void main() { int p,q,array[fil][col]; int *pfila,i; do{ printf("Dame las filas:"); scanf("%d",&p); }while(p<2 || p>5); do{ printf("Dame las columnas:"); scanf("%d",&q); }while(q<2 || q>5); cargar_tabla(array,p,q); pfila=max_fila(array,p,q); for (i=0;i<q;i++) printf(" %d ",*(pfila+i)); } void cargar_tabla(int (*array)[col],int p,int q) { int i,j; for(i=0;i<p;i++) for (j=0;j<q;j++) { printf("Dame un [%d,%d]:",i,j); scanf("%d",(*(array+i)+j)); Profesor: Angel Delgado Herrador 24

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

} return; } int *max_fila(int (*array)[col],int p,int q) { int i,j,suma=0,max,pos; for(i=0;i<p;i++) { for (j=0;j<q;j++) suma+=*(*(array+i)+j); if(!i) { max=suma; // Para no inicializar el mayor a cero si pos=i; // me dan todos los nmeros negativos } else if(suma>max) { max=suma; pos=i; } suma=0; } return (*(array+pos)); } 11.- Leer por teclado un nmero entero largo e indicar si el nmero ledo es o no capica. Para ello debe utilizarse un array unidimensional donde almacenaremos cada una de las cifras del nmero ledo. Se implementarn dos funciones, una para descomponer el nmero en cifras y cargar el array, y otra para comparar las posiciones del array y determinar si el nmero es capica. Solucin: /* Leer por teclado un nmero entero largo e indicar si el nmero ledo es o no capica. Para ello debe utilizarse un array unidimensional donde almacenaremos cada una de las cifras del nmero ledo. Se implementarn dos funciones, una para descomponer el nmero en cifras y cargar el array, y otra para comparar las posiciones del array y determinar si el nmero es capica. */ #include int int main() { long Profesor: Angel Delgado Herrador <stdio.h> descomponer_numero(long int,int[]); comparar_posiciones(int,int[]);

int 25

n;

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

int system("cls"); printf("\nIntroduce un numero scanf("%ld",&n); c=descomponer_numero(n,t); if(comparar_posiciones(c,t)) printf("\n\t\t\t else printf("\n\t\t\t }

t[10],c; para ver si es capicua :");

CAPICUA NO int

\n CAPICUA a,int

"); \n"); tabla[]) cifras=0;

int descomponer_numero(long { int while(a!=0) {

return cifras; } int { int while(i<c) {

tabla[cifras]=a%10; a=a/10; cifras++; } //Devolvemos la cantidad de cifras que tena el nmero

comparar_posiciones(int

c,int

tabla[]) i=0; if(tabla[i]!=tabla[c-1]) es capica i++; c--; } es capica

return

0;

//Falso,

no

return }

1;

//Verdadero,

12.- Introducir una cadena de caracteres, e indicar si la cadena leda es o no un palndromo (se lee igual de izquierda a derecha, que de derecha a izquierda). Ej: Dabale arroz a la zorra el abad Solucin: /* Leer por teclado una cadena de caracteres, e indicar si es o no un palndromo (se puede leer tanto de izquierda a derecha, como de derecha a izquierda). Ej: Dabale arroz a la zorra el abad */ #include<stdio.h>

Profesor: Angel Delgado Herrador

26

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

V#include<string.h>
#include<ctype.h> void int void { char printf("Cadena:"); gets(cad); quitar_blancos(cad); if(palindromo(cad)) printf("\nLa else printf("\nLa cadena } quitar_blancos(char[]); palindromo(char[]); main() cad[80];

cadena leda es un leda NO es un

palndromo."); palndromo.");

void quitar_blancos(char { char int for(i=0;i<strlen(cad);i++) if(!isspace(cad[i])) { a[c]=cad[i]; a[c]='\0'; strcpy(cad,a); return; }

cad[]) a[80]; i,c=0; c++; }

int palindromo(char cad[]) { // Se puede hacer de cualquiera de las dos maneras siguientes... // // // int if(cad[i]!=cad[k]) return i,k=strlen(cad)-1; for(i=0;i<k;i++,k--) 0; a[80]; para darle la vuelta return return a una cadena. 0; 1;

char strcpy(a,cad); strrev(a); // Sirve if(strcmp(cad,a)) else }

13.- Leer por teclado un nmero entero mayor que 0 y menor o igual que 10 para determinar el rango de una matriz de enteros. Leer un segundo nmero entero, que servir para indicar el valor de comienzo.Cargar, recorriendo en espiral, una matriz de enteros, a partir del segundo valor ledo, y con el rango indicado. Profesor: Angel Delgado Herrador 27

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

Solucin: /* Cargar una matriz, numrica entera, de orden N, a partir de un valor cualquiera, introducido por teclado, y recorrindola en espiral. Ej: N=4 ,Vi=6 Matriz resultante: 6 7 8 9 17 18 19 10 16 21 20 11 15 14 13 12 */ #include <stdio.h> void mostrar(int[][10],int); void espiral(int[][10],int,int); void main() { int m[10][10],rango,a; system("cls"); do{ printf("Rango de la matriz(1-10)?"); scanf("%d",&rango); }while(rango<=0||rango>10); printf("Valor de A:"); scanf("%d",&a); espiral(m,rango,a); system("cls"); printf("\nDatos de la tabla...\n"); mostrar(m,rango); printf("\n\nPulse una tecla para acabar..."); system("pause>nul"); } void espiral(int t[][10],int r,int n) { int tope,a,i,k; if(r%2) tope=r/2+1; else tope=r/2; for(a=0;a<tope;a++) { for(i=a,k=a;k<r-a;k++,n++) t[i][k]=n; printf("\n"); for(i=a+1,k--;i<r-a;i++,n++) t[i][k]=n; printf("\n"); for(k--,i--;k>=a;k--,n++) t[i][k]=n; printf("\n"); for(k++,i--;i>a;i--,n++) t[i][k]=n; } Profesor: Angel Delgado Herrador 28

Instalacin y Mantenimiento de servicios de redes locales.

1 C.F. G.M. Explotacin de Sistemas Informticos. IES Inca Garcilaso Montilla (Crdoba)

return; } void mostrar(int t[][10],int r) { int i,k; for(i=0;i<r;i++) { for(k=0;k<r;k++) printf("%5d",t[i][k]); printf("\n"); } return; }

Profesor: Angel Delgado Herrador

29