Professional Documents
Culture Documents
DE
SISTEMAS
INFORMATICOS
RESUMEN
DE
APUNTES
DE
FUNDAMENTOS
DE
PROGRAMACION
TEMA 1: METODOLOGIA DE LA PROGRAMACION
A. Algoritmos
Un algoritmo debe ser preciso, definido (debe dar el mismo resultado si se dan las
mismas condiciones) y finito.
INICIO
Inicio de programa:
procesar(num1,num2,num3)
Subprograma:
Líneas de flujo:
- Pseudocódigo
Es una serie de instrucciones en español que se aproxima a la codificación final sin
utilizar ningún lenguaje de programación:
Subprograma: procesar(num1,num2,num3)
C. Programación estructurada
D. Programación modular
Son módulos o partes en que dividimos el programa bien para llamarlas desde distintos
puntos del programa sin tener que repetir el código; bien para hacer más legible el
programa principal (separándolo en partes bien diferenciadas); o bien para su
reutilización en futuros programas.
F. Ejercicios
b) Leer dos números y decir cual es el mayor, si el primero, el segundo o si son iguales.
f) Leer tres cadenas: nombre, apellido1 y apellido2. Escribir el nombre completo y sus
tres iniciales.
g) Leer los tres coeficientes de una ecuación de segundo grado y escribir su solución:
ax^2+bx+c; x=-b ±RAIZ((b^2-4ac)/2a).
h) Leer tres números (longitud de los lados) y escribir si pueden formar un triángulo.
i) Leer el número del día de la semana (1-7) y escribir si ese día hay o no hay clase.
j) Leer el número del día de la semana (1-7) y escribir si ese día hay clase de FPR.
k) Leer el número del día de la semana (1-7) y escribir el nombre del día.
l) Mostrar el menú: 1. Alta//2. Baja//3. Modificación//0. Salir//Elegir opción (0-3).
Gestionar este menú suponiendo que tenemos las instrucciones instrAlta, instrBaja, e
instrModificacion.
g) Escribir los números de la serie: 4, 8, 11, 16, 20, 23, 28 menores de 1000 (+4+3+5).
h) Escribir los números de la serie: 3, 5, 8, 10, … (+2+3) cuya suma no pase de 1000.
i) Leer números hasta que se introduzca el 0. Escribir la suma de los introducidos antes
del primero mayor de 200 (excluido y puede no introducirse). Escribir la suma de los
introducidos después del primero mayor de 200 (excluido). Escribir el número de
valores introducidos (sin contar el 0 ni el primero mayor de 200).
l) Escribir los tres primeros números perfectos (número natural igual a la suma de todos
sus divisores. Ej: 6=1+2+3).
m) Leer 100 números. Para cada 10 números escribir la decena actual y el mayor de la
decena. Escribir el mayor de todos y su decena.
TEMA 2: FUNDAMENTOS DE PROGRAMACION EN C
2.1 ELEMENTOS DE C
- Palabras reservadas: tiene un significado en lenguaje C, se escriben en minúsculas y
no pueden usarse como nombre de variables:
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
- Variables y constantes: se usan para manejar los datos, se declaran indicando el tipo
de datos que almacenan (las constantes van precedidas de ‘const’, ej: const float g=9.8).
Podemos definir una constante simbólica con #define: #define IVA 0.16;
Si una variable se declara ‘volatile’ indicamos que puede modificarse desde fuera del
programa: volatile int ticsreloj;.
Puede haber variables globales (comunes a todo el programa) y variables locales (se
definen dentro de una subrutina y sólo tienen sentido dentro de ella).
Tipos alfanuméricos:
Tipo Descripción Ejemplos
char Carácter char letra=´A´; char digito=´8´;
char[n] Cadena de caracteres de longitud máxima n-1 char diasemana[10]=”Martes”;
char[] Cadena de caracteres de longitud automática char nombre[]=”Lucas Pérez”;
char* Puntero a cadena de caracteres char* nombre=”Lucas Pérez”;
Array (Vector): es una colección de datos del mismo tipo, pueden tener varias
dimensiones (matrices), ej: char diasmes[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int frutassemana[2][7]={{0,0,2,0,0,1,0},{0,0,0,0,3,0,0}};
- Tipos de operadores:
Aritméticos:
+ (suma)
- (resta)
* (multiplicación)
/ (división)
% (módulo)
- (signo)
++ (incremento)
-- (decremento)
+= (sumar al destino)
-= (restar al destino)
*= (multiplicar al destino)
/= (dividir el destino)
%= (dividir destino y dar resto)
Relacionales:
> (mayor)
>= (mayor o igual)
< (menor)
<= (menor o igual)
== (igual)
!= (distinto)
Lógicos:
|| (O)
&& (Y)
! (NO)
De manejo de bits:
| (O)
& (Y)
~ (NO)
^ (O exclusivo)
|= y &= y ^= (manejo de bits con el destino)
<< (desplazamiento a la izquierda)
>> (desplazamiento a la derecha)
>>= y <<= (desplazar el destino)
Las funciones printf y scanf usan secuencias escape para mostrar caracteres especiales,
los principales son:
CODIGO SIGNIFICADO CODIGO SIGNIFICADO
\0 Nulo, fin de cadena \a Alarma
\n Nueva línea \´ Comilla simple
\r Retorno de carro \” Comilla doble
\f Nueva página \\ Barra
\t Tabulador horizontal \? Interrogación
\v Tabulador vertical \N Valor octal N
\b Retroceso \xN Valor hexadecimal N
PARA var DESDE vini HASTA vfin DE incr for(var=vini; var <= vfin; var += incr){
Instrucciones Instrucciones;
FIN-PARA }
HACER do{
Instrucciones Instrucciones;
HASTA condición while(!condición);
2.7 EJERCICIOS
1. Evalúa las siguientes expresiones (a mano) y realiza un programa que las codifique y
muestre los resultados: bx=1; b=3*2; c=(3/2)*5; a=bx+c*(3/2); b<7;
2. Codifica las variables: char c=’a’; int i=1; float f=2.01; short s=32767; int a=32767 y
evalúa (a mano) y calcula: c=c+f; f=f+i; i=i+f; s=a+s;.
3. Dado a=5.0; b=6.0; c=8.0; d=10 evalúa (a mano) y calcula a+b/c+d;.
4. Cuantas veces se ejecuta el bucle: for(i=1; i<1; i++){printf(“se ejecuta”);}.
5. Codificar en C todos los ejercicios del tema 1 y probarlos.
6. Suma 2.5 + 2.8 como reales y como enteros y muestra el resultado.
7. Queremos mostrar las manzanas que hemos comprado cada día de la semana (3 el
lunes, 6 el jueves y 9 el domingo).
8. Mostrar el valor de la variable g = 9.8 y su dirección de memoria.
9. Crea la estructura libro con título, autor, editorial, año y páginas; rellena los datos de
‘El Quijote’ muéstralos. Crea un nuevo tipo LIBRO.
10. Evalúa las siguientes expresiones (a mano) y realiza un programa que las codifique
y muestre los resultados: x=5; y=2; (x!=y)||(x<y); (x!=y)&&(x<y); (x!=y)||(x>y);
!(x<y);
11. Evalúa las siguientes expresiones (a mano) y realiza un programa que las codifique
y muestre los resultados: x=9; y=9; x++; ++y; x+=y; x/=y;
12. Evalúa las siguientes expresiones (a mano) y realiza un programa que las codifique
y muestre los resultados: unsigned int x=65; int y=114; x&y; x|y; x^y; x>>1; ~x;.
13. Imprimir la nota literal de un alumno dependiendo de su nota numérica.
14. Leer dos números y una operación (+,-,*,/,%) y muestra el resultado de la operación.
15. Escribir 100 veces “Prometo prestar atención en las clases”.
16. Calcular la pendiente de la recta que pasa por dos puntos leídos: m=(y2-y1)/(x2-x1).
17. Leer un número y decir si es par o impar y si es primo o no.
18. Leer un carácter e indicar si es un valor alfabético, numérico o especial (usar el
código ASCII o la fuente System).
19. Leer un número natural e indicar qué dígitos presenta y cuantas veces aparecen.
El acceso a la función consiste en llamar a esa función pasándole valores para que nos
devuelva el resultado de la función. Al llamar a una función se pasa el control a dicha
función y se devolverá el control al punto donde se le llamó cuando se ejecute la
sentencia return.
Formato de llamada: nomFunc(var1, var2, …)
Ejemplo de llamada: printf(“el cubo de 99 es: %d”, cubo(99));
Si deseamos utilizar una variable global que aún no está definida, dentro de una función,
debemos indicar que es una variable externa: ‘extern tipo variable;’.
Las variables locales son automáticas por defecto (auto), se les asigna espacio en
memoria cada vez que se llama a su función.
Para que una variable local conserve su valor entre sucesivas llamadas a la función
debemos definirla como estática: ‘static int numveces;’. También podemos declarar
funciones y variables globales como estáticas (la función o variable, sería local a ese
fichero fuente).
Podemos indicar al compilador que almacene el valor de una variable en un registro de
la CPU: register int contador;.
Los tipos de datos compuestos (arrays, estructuras, etc) deben pasarse por referencia.
Para acceder al contenido de una variable pasada por referencia usamos ‘*’, [] o ‘->’:
int entero=5;
char cadena[25]=”Hola”;
struct persona{
int dni;
char nombre[20];
char ape1[15];
char ape2[15];
char edad;
} persona1, persona2, persona3;
main(){
mostrarentero(&entero);
mostrarcaracter3(cadena);
strcpy(persona1.ape1, “Lopez”);
mostrarape1(persona1);
}
3.4 RECURSIVIDAD
Una función recursiva se caracteriza porque se llama a si misma.
Recursividad directa: la función se llama a si misma desde dentro de la función.
Recursividad indirecta: la función llama a una o más funciones y alguna de ellas, o
varias llaman a la función original.
Utiliza una función para calcular la máxima, mínima, media y otra función para calcular
la dispersión.
TEMA 4: ESTRUCTURAS Y UNIONES
4.1 UNIONES
Una estructura de datos (registro) es una agrupación de datos de igual o distinto tipo.
Una unión es una agrupación de datos de igual o distinto tipo, compartiendo el mismo
espacio de memoria. Por ejemplo, si un alumno se identifica bien por su dni o bien por
su matrícula:
union alumno{
char matricula[6];
int dni;
}
Los datos deben ser excluyentes y se suele poner un dato fuera de la unión indicando
cual es el dato válido dentro de la unión:
enum datosunionalumno{ matr, DNI};
struct alum{
datosunionalumno datovalido;
union alumno estudiante;
}
4.7 EJERCICIOS
1. Utiliza la función ‘sizeof(variable)’ para mostrar el tamaño de la estructura ‘libro’ del
ejercicio 2.9 y de cada uno de sus campos.
2. Muestra el tamaño de la unión alum del apartado 4.1 y de cada uno de sus campos.
3. Crea una estructura que guarde el NIF usando los campos DNI y LETRA. Crea una
función para validar el dni y su letra teniendo en cuenta que la letra se obtiene del array
'TRWAGMYFPDXBNJZSQVHLCKE' y la posición dentro del array es el resto de
dividir el dni entre 23.
4. Escribe una estructura para manejar datos de meses: el número de días del mes y el
orden en que se suceden a lo largo del año.
5. Escribe una estructura para manejar datos de coches: modelo, marca, potencia,
consumo en ciudad y en carretera, presión de neumáticos y velocidad máxima.
6. Representa con una estructura un punto cartesiano. Crea una función que calcule el
punto medio de una recta que pase por dos puntos.
7. Escribe una estructura para manejar datos fechas: número de día, día de la semana,
mes y año.
8. Escribe una estructura que represente las cartas de la baraja y otra que represente una
baza en el juego de la escoba (nº de cartas, número de sietes, nº de oros y la posibilidad
de hacer escoba).
9. Crea una estructura con una unión que permita almacenar los precios de productos en
pesetas o euros.
10. Escribe un vector de uniones que represente las fichas de casino que posee un
jugador, sabiendo que es daltónico (no puede reconocer más que algunos colores) y que
sólo conoce los valores asociados que tienen algunos colores de fichas.
11. Dado el siguiente código:
struct nomb{
char nombre[20];
char ape1[20];
};
struct bem{
int brazos;
struct nomb registro;
char origen[30];
}
struct bem *pb;
struct bem deb={6,{“Santiago”,”Bernabeu”},”Chamartin”};
pb=&deb;
Qué imprimirán las sentencias:
printf(“%d”, deb.brazos);
printf(“%s”, pb->origen+2);
printf(“%s”, (*pb)..origen);
12. Describe con una unión las posibles jugadas del póker (reponer, escalera de color,
póker, foul, trío, color, dobles parejas y parejas) sabiendo que es relevante representar el
valor más alto de la escalera, el valor de los póker, parejas y tríos, y los dos valores del
foul y de las dobles parejas.
13. Escribe un programa que lea una fecha (día, mes y año) y que utilice las estructuras
de los ejercicios 4 y 7. Crea una función que devuelva el nº de días trascurridos en ese
año hasta la fecha indicada (supón que no hay bisiestos). Mostrar ese nº de días
transcurridos y mostrar el nº total de días hasta la fecha actual.
14. Representa la estructura encadenada de un nodo de un árbol binario, sabiendo que
un tiene un único nodo raíz, y cada nodo puede tener hasta dos nodos hijos.
15. Representa la estructura encadenada de la situación de las piezas de un jugador en
un tablero de ajedrez en una partida ya empezada.
16. Crea un programa que reciba un vector con 4 puntos cartesianos y determine si
forman un cuadrado, un rectángulo o ninguna de las figuras anteriores.
17. Usa las estructuras del ejercicio 8 y crea un programa que asigne un valor a los
campos de la estructura ‘jugada_escoba’ con un vector de estructuras de tipo carta.