Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - bigfu

#1
Programación C/C++ / Ayuda con un ejercicio en C++
10 Septiembre 2011, 16:45 PM
Hola, os pongo el enunciado:
CitarSe pretende informatizar la gestión de una hemeroteca. Esta cuenta con cuatro tipos de revistas según la información que contiene: técnica, económica, humanística y ocio. Se calcula que de cada tipo de revista la hemeroteca tendrá un máximo de 500 unidades. El tipo de revista deberá ser definido como un enumerado. De cada revista se ha de almacenar la siguiente información: Nombre de la revista, ISSN (cadena de al menos 10 caracteres) y editorial.
Por otra parte, de cada revista también se desea mantener información de todos los ejemplares que de ella están almacenadas en la hemeroteca. Las características de cada ejemplar son: volumen, fecha de publicación, número de artículos y nombres de los autores de la revista (como máximo habrá 10). Suponemos que cada revista puede tener un máximo de 100 ejemplares. Se pide:
a) Define los tipos de datos TRevista, TEjemplar y THemeroteca. Usa tipos enumerados siempre que sea posible.
b) Implementa un subalgoritmo para inicializar la estructura de tipo THemeroteca.
c) Dados una revista y su tipo, implementa un subalgoritmo para darla de alta en la estructura. En caso de que no haya sitio libre en la estructura se dará el correspondiente error.
d) Dados un ejemplar de revista y el ISSN de la revista a la qu ecorresponde dicho ejemplar, implementa un subalgoritmo para dar de alta dicho ejemplar. En caso de no haber sitio libre en la estructura se dará el correspondiente error.
e) Implementa un subalgoritmo que, dados un tipo de revista y un mes y un año, devuelva el número de ejemplares almacenados de ese tipo de revista y cuya fecha de publicación es posterior a la fecha indicada por dicho mes y año.
f) Implementa un subalgoritmo que dado el ISSN de una revista muestre toda la información almacenada en la estructura relativa a dicha revista y sus ejemplares. En caso de no existir dicha revista, se dará el correspondiente mensaje de error.

Con este tipo de ejercicios siempre he tenido "problemas" con la definición de los tipos, ya que me cuesta un poco el definirlos.
He hecho el apartado a), pero como os acabo de decir, siempre me ha costado un poco este tipo de ejercicios y al no tener la solución del ejercico, estoy muy inseguro con la forma en la que lo he resuelto.
Me preguntaba si podríais echarle un vistazo e indicarme si algo está mal o darme algún consejo sobre la solución.

He de decir, que este ejercicio es algo antiguo y está diseñado para resolverlo a mano y en pseudocódigo, pero la asignatura este año se da en C++ y he modificado la solución acorde a lo que se ha visto en la asignatura (son muy muy parecidas).

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
using namespace std;

const unsigned MAX_TIPOS = 4;
enum TInformacion{tecnica,economica,humanistica,ocio};
const unsigned AUTORES = 10;
typedef string TAutores[AUTORES];
struct TNumAutores{
  TAutores a;
  unsigned num;
};
struct TEjemplar{
  unsigned volumen, num_art;
  string fecha_p;
  TNumAutores num_a;
};
const unsigned MAX_EJEMPLARES = 100;
typedef TEjemplar TEjemplares[MAX_EJEMPLARES];
struct TNumEjemplares{
  TEjemplares e;
  unsigned num;
};
struct TRevista{
  string nombre, ISSN, editorial;
  TNumEjemplares ejemplares;
};
const unsigned MAX_UNIDADES = 500;
typedef TRevista TUnidades[MAX_UNIDADES];
struct TNumUnidades{
  TUnidades n;
  unsigned num;
};
typedef TNumUnidades TArray[MAX_TIPOS];
struct TNumArray{
  TArray a;
  unsigned num;
};
struct THemeroteca{
  TInformacion info;
  TNumArray num;
};


Muchísimas gracias de antemano  :D
#2
Programación C/C++ / Duda con ejercicio
24 Agosto 2011, 20:16 PM
Hola, me piden el siguiente ejercicio:
Diseña una estructura de datos (TNatacion) para almacenar los datos de un grupo de nadadores que se presentan a una competicion de natacion. De cada nadador (TNadador) es necesario almacenar su nombre, edad, prueba en la que participa (espalda,mariposa,croll,braza) (TPrueba) y tiempo (minutos y segundos). La estructura contendrá un máximo de 16 nadadores. Se pide:
a) Define los tipos de datos (TNatacion, TNadador, TPrueba y aquellos que consideres necesarios), asi como un procedimiento para inicializar la estructura.
b) Implementa una función que permita leer los datos de un nadador. A la hora de leer el tipo de competición en la que participa, el programa seguirá pidiendo este dato hasta que se introduzca un tipo de competición correcto.
c) Implementa un procedimiento para introducir los datos de un nadador dentro de la estructura. Controla la posibilidad de que se produzca un error por falta de espacio en la misma.
d) Implementa un procedimiento que busque si un determinado nadador (identificado por su nombre) está dentro de la competición. El procedimiento habrá de devolver si el nadador ha sido encontrado o no y en caso afirmativo la posición de la estructura donde se encuentra.
e) Implementa un procedimiento que muestre para todos los nadadores inscritos en la competición en una determinada prueba (espalda,braza...), la diferencia entre su tiempo y el tiempo medio de todos los nadadores en este tipo de prueba. Controla la posibilidad de que la estructura este vacia, o que no haya nadadores participantes en este tipo de prueba.

He implementado el siguiente código:
Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
using namespace std;

const unsigned MAX_NADADORES = 16;
enum TPrueba {espalda, mariposa, croll, braza};
struct TTiempo{
unsigned min, seg;
};
struct TNadador{
string nombre;
unsigned edad;
TPrueba prueba;
TTiempo tiempo;
};
typedef TNadador TArray[MAX_NADADORES];
struct TNatacion{
TArray datos;
unsigned num_nadadores;
};

char Menu();
void inicializarEstructura(TNatacion& n);
void leerNadador(TNadador& nadador);
void LeerPrueba(TPrueba& p);
void string_a_tipoprueba(const string& s, TPrueba& p, bool& ok);
string tipoprueba_a_string(const TPrueba& p);
TPrueba SUC(const TPrueba& p);
void introNadador(TNatacion& n, const TNadador nadador);
void buscarNadador(const TNatacion& n, const string& nombre, bool& encontrado, unsigned& pos);
void mostrarNadadores(const TNatacion& n);

int main() {
TNatacion n;
TNadador nadador;
bool salir = false, encontrado;
string nombre;
unsigned pos;
char op;

inicializarEstructura(n);
while(!salir){
op = Menu();
switch(op){
case 'A': leerNadador(nadador);
break;
case 'B': introNadador(n,nadador);
break;
case 'C': cout << "Introduzca nombre: ";
 getline(cin,nombre);
 buscarNadador(n,nombre,encontrado,pos);
 if(encontrado){
 cout << "El nadador " << n.datos[pos].nombre << " se encuentra en la posicion " << pos << endl;
 }else{
 cout << "El nadador " << nombre << " no se encuentra introducido en la estructura." << endl;
 }
break;
case 'D': mostrarNadadores(n);
break;
case 'X': salir = true;
break;
default: cout << "Opcion Incorrecta." << endl;
}
}

return 0;
}

char Menu(){
char op;

cout << "A: Leer datos de un nadador." << endl;
cout << "B: Implementar datos del nadador en la estructura." << endl;
cout << "C: Buscar nadador." << endl;
cout << "D: Mostrar nadadores." << endl;
cout << "X: Salir." << endl;
cout << endl;
cout << "Introduzca opcion: ";
cin >> op;
op = toupper(op);

return op;
}

void inicializarEstructura(TNatacion& n){
n.num_nadadores = 0;
}

void leerNadador(TNadador& nadador){
TPrueba p;

cout << "Introduzca nombre: ";
getline(cin,nadador.nombre,'\n');
cout << "Introduzca edad: ";
cin >> nadador.edad;
LeerPrueba(p);
nadador.prueba = p;
cout << "Introduzca tiempo (mm ss): ";
cin >> nadador.tiempo.min >> nadador.tiempo.seg;
}

void LeerPrueba(TPrueba& p){
string s;
bool ok;

cout << "Introduzca prueba: ";
getline(cin,s,'\n');
string_a_tipoprueba(s,p,ok);
while(!ok){
cout << "Prueba erronea." << endl;
cout << "Introduzca prueba: ";
string_a_tipoprueba(s,p,ok);
}

}

void string_a_tipoprueba(const string& s, TPrueba& p, bool& ok){
ok = false;
p = espalda;

while((p<braza)&&(!ok)){
if(s==tipoprueba_a_string(p)){
ok = true;
}else{
p = SUC(p);
}
}
ok = ((ok) || tipoprueba_a_string(p)==s);
}

string tipoprueba_a_string(const TPrueba& p){
string s;
switch(p){
case espalda: s = "espalda";
break;
case mariposa: s = "mariposa";
break;
case croll: s = "croll";
break;
case braza: s = "braza";
break;
}
return s;
}

TPrueba SUC(const TPrueba& p){
unsigned ord;

ord = int(p)+1;
return p;
}

void introNadador(TNatacion& n, const TNadador nadador){
if(n.num_nadadores>=MAX_NADADORES){
cout << "La estructura esta llena" << endl;
}else{
n.datos[n.num_nadadores] = nadador;
n.num_nadadores++;
}
}

void buscarNadador(const TNatacion& n, const string& nombre, bool& encontrado, unsigned& pos){
encontrado = false;

for(unsigned i=0;i<n.num_nadadores;i++){
if(n.datos[i].nombre == nombre){
pos = i;
encontrado = true;
break;
}
}
}

void mostrarNadadores(const TNatacion& n){
TPrueba p;
bool ok = false;

LeerPrueba(p);
for(unsigned i=0;i<n.num_nadadores;i++){
if(n.datos[i].prueba == p){
ok = false;
cout << "Nombre: " << n.datos[i].nombre << endl;
cout << "Tiempo: " << n.datos[i].tiempo.min << "' " << n.datos[i].tiempo.seg << "''" << endl;
}
}
if(n.num_nadadores==0){
cout << "La estructura esta vacia." << endl;
}else if(!ok){
cout << "No hay nadadores inscritos en esa prueba." << endl;
}
}


El problema es que no funciona correctamente. Sospecho que tiene que ver con la lectura de la prueba al leer un nadador, pero la verdad, es que no tengo ni idea de porque no va... ¿le podéis echar un vistazo al código?

Muchas gracias!!
#3
Hola, haciendo un ejercicio me ha surgido la siguiente duda:
¿Hay alguna función que limpie el contenido de un string? es decir, tengo un bucle en el que en cada iteración imprimo por pantalla el contenido de un string, pero quiero "limpiar" el contenido que tiene el string en cada iteración, como si estuviese recién declarado.
Lo he resuelto asignándole "" a la variable string (s=""), pero querría saber si hay alguna función que te haga eso o alguna forma de hacerlo mejor.

Muchas gracias, saludos.
#4
Hola, tengo el siguiente enunciado:
Un cuadrado mágico de orden n es una ordenación de los números 1 a n en una tabla cuadrada de manera que la suma de cada fila y cada columna y las dos diagonales principales es la misma. La figura muestra un cuadrado mágico de orden 5 en el que todas las filas, columnas y las dos diagonales suman 65.

He hecho este código y al ejecutarlo introduzco la matriz tal y como está en el ejemplo (es un cuadrado magico) y nunca termina, se queda ejecutándose y nunca muestra el resultado. He estado buscando una y otra vez el fallo y no he conseguido dar con él, a ver si podéis echarme una mano...

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

const unsigned N = 5;
typedef unsigned Cuadrado[N][N];

void introDatos(Cuadrado& c);
bool es_magica(const Cuadrado& c);
unsigned resultado(const Cuadrado& c);
bool filas(const Cuadrado& c, unsigned res);
bool columnas(const Cuadrado& c, unsigned res);
bool d1(const Cuadrado& c, unsigned res);
bool d2(const Cuadrado& c, unsigned res);


int main() {
Cuadrado c;

introDatos(c);
if(es_magica(c)){
cout << "El cuadrado es magico" << endl;
}else{
cout << "No es un cuadrado magico" << endl;
}

return 0;
}

void introDatos(Cuadrado& c){
cout << "Introduzca numeros entre 1 y 25 sin repetir ninguno: " << endl;
for(unsigned i=0;i<N;i++){
for(unsigned j=0;j<N;j++){
cout << "c(" << i+1 << "," << j+1 << "): ";
cin >> c[i][j];
}
}
}

bool es_magica(const Cuadrado& c){
unsigned res = resultado(c);

if((!filas(c,res))||(!columnas(c,res))||(!d1(c,res))||(!d2(c,res))){
return false;
}else{
return true;
}
}

unsigned resultado(const Cuadrado& c){
unsigned res = 0;
for(unsigned j=0;j<N;j++){
res+=c[0][j];
}
return res;
}

bool filas(const Cuadrado& c, unsigned res){
bool igual = true;
unsigned suma = 0;

for(unsigned i=0;i<N;i++){
suma = 0;
for(unsigned j=0;j<N;j++){
suma+=c[i][j];
}
if(suma!=res){
igual = false;
break;
}
}
return igual;
}

bool columnas(const Cuadrado& c, unsigned res){
bool igual = true;
unsigned suma = 0;

for(unsigned i=0;i<N;i++){
suma = 0;
for(unsigned j=0;j<N;j++){
suma+=c[j][i];
}
if(suma!=res){
igual = false;
break;
}
}
return igual;
}

bool d1(const Cuadrado& c, unsigned res){
bool igual = true;
unsigned suma = 0, i=0, j=0;

while((i<N)&&(j<N)){
suma+=c[i][j];
i++;
j++;
}
if(suma!=res){
igual = false;
}
return igual;
}

bool d2(const Cuadrado& c, unsigned res){
bool igual = true;
unsigned suma = 0, i=N-1, j=N-1;

while((i>=0)&&(j>=0)){
suma+=c[i][j];
i--;
j--;
}
if(suma!=res){
igual = false;
}
return igual;
}


Muchas gracias!!

#5
Programación C/C++ / Reto Universidad [C++].
20 Julio 2011, 13:04 PM
Hola a todos, estoy estudiando este verano la asignatura de Fundamentos de la Programación para presentarme en septiembre, y se me ocurrió la idea de plantear aqui los ejercicios de cada tema (cada cierto tiempo) y asi poder comparar mis soluciones con las vuestras (no estoy pidiendo que me hagais los ejercicios), para ver si hubiese podido simplificar más el código y aprender un poco de vosotros; a la par de que al ser ejercicios de una asignatura de fundamentos, va a venir muy bien para todos aquellos que quieran aprender/estén aprendiendo C++.
La dificultad de los ejercicios se irá incrementando conforme vaya avanzando en los temas (espero que un tema cada dos días como mucho xD), y diré con cada ristra de ejercicios que está y que no está permitido utilizar, ya que puede ser anterior al tema donde se dan los vectores o recursividad, por poner un ejemplo. Si alguien está interesado, podría pasarle por privado los pdf's de cada tema o del tema en concreto.

CitarTema 1
En este tema se hace una introducción a C++, se ven los tipos de datos simples, las constantes, variables y asignaciones, la entrada y salida básicas, el flujo de control, las expresiones lógicas o booleanas y las estructuras de selección (if y switch) e iteración (while, do-while, for). También se hace mención al control de errores y excepciones, pero no pone mucho interés en ello, se puede obviar xD

Ejercicios Tema 1
1.- Confecciona un bucle que lea de teclado un texto carácter a carácter hasta localizar un punto, y que al final dé como salida el número de comas encontradas, y el número de caracteres leídos.

2.- Diseña un algoritmo que determine si la cadena 'abc' aparece en una sucesión de caracteres cuyo final viene dado por un punto.

3.- Diseña un algoritmo que lea un número n por teclado y calcule el n-ésimo número de la serie de Fibonacci. Los dos primeros números de esta serie son el cero y el uno, y a partir de éstos cada número se calcula realizando la suma de los dos anteriores.

4.- Escribe un algoritmo que encuentre el mayor, el menor y la media aritmética de una colección de N números leídos por el teclado donde N es el primero de los números.

5.- Escribe un algoritmo que lea una lista de números enteros terminada en 0, y que encuentre y escriba en la pantalla la posición de la primera y de la última ocurrencia del número 12 dentro de la lista. Si el número 12 no está en la lista, el algoritmo debería escribir 0. Por ejemplo, si el octavo número de la lista es el único 12, entonces 8 sería la primera y la última posición de las ocurrencias de 12.

6.- Desarrolla un algoritmo para el siguiente juego:
El usuario introduce un límite inferior, un límite superior y piensa un número en ese rango. El ordenador tiene que acertarlo. Para ello el ordenador propone un número y el usuario responde con >, < o = (correspondiente a acertado y el programa acaba). Si la respuesta es > o <, el ordenador propondrá otro número hasta que lo acierte.
(Si mal no recuerdo, para este ejercicio, el profesor indicó que tanto el usuario como el ordenador, somos nosotros, sino sería más complicado hacerlo con lo visto hasta ahora XD)

7.- Desarrollar un algoritmo para el siguiente juego:
El usuario introduce un número natural n que representa a n objetos. La máquina decide quien empieza y alternativamente, el usuario y la máquina retiran cada uno 1, 2 o 3 objetos (es decir, elige restar 1, 2 o 3 a n). El que retira el último objeto pierde.
En las condiciones del problema, es posible desarrollar un algoritmo para que siempre gane la máquina. Construir tal algoritmo.

CitarTema 2
En este tema se ve el diseño descendente, procedimientos y funciones (definición y declaración, llamada, parámetros reales y formales, paso de parámetros por valor y por referencia, interfaz, criterios de modularización, variables locales y globales y precondiciones y postcondiciones) y recursividad.
Lo mismo que en el tema anterior, si hay alguien interesado en el pdf, que lo pida y se lo paso.

Ejercicios Tema 2
1.- Escribe un programa que lea un número natural N por teclado y dibuje un triángulo de asteriscos con base y altura N. Por ejemplo, si N=5 debería dibujar:
    *
   * *
  * * *
 * * * *
* * * * *

2.- Escribe un programa que tome como entrada desde teclado dos números naturales (mayores que cero) "N" e "i", e imprima en pantalla el dígito que ocupa la posición i-ésima del número N. Si i es mayor que el número de dígitos de N, se escribirá en pantalla -1. Por ejemplo, para N=25064 e i=2, el resultado es el dígito 6, y para i=7, el resultado es -1.

3.- Escribe un programa que acepte como entrada desde teclado un número natural mayor que cero y dé como salida el resultado de sumar dos a dos los dígitos que aparecen en posiciones simétricas respecto al dígito central dentro del número dado como entrada. Por ejemplo:
para el número: 2354869
la salida es: 2+9=11, 3+6=9, 5+8=13, 4
para el número: 6582
la salida es: 6+2=8, 8+5=13

4.- Dada una sucesión, de longitud indeterminada, de ceros y unos, construir un programa que permita calcular el tamaño de la mayor sucesión ordenada de menor a mayor. La sucesión se lee desde teclado, y el final viene dado por el número 2.

5.- Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que: 1 <= h <= n y además a1<...ah-1 < ah > ah+1 > ...an
Por ejemplo 24, 13, 6, 15, 50 sería un valle.
Dada una secuencia de enteros terminada en cero (0) que como mínimo contiene una montaña y un valle (suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles), diseña un programa que calcule la longitud de la montaña y el valle más largos.

6.- El máximo común divisor (mcd) de dos números naturales p y q es el mayor entero d que divide a ambos. Un algoritmo muy conocido para calcularlo es el de Euclides. Éste utiliza dos variables, que contienen inicialmente a cada uno de los números, y trata de hacer que su contenido sea el mismo. Para ello, irá restando la menor a la mayor hasta que ambas contengan el mismo valor. En dicho momento, el valor obtenido en cualquiera de ellas es el máximo común divisor de los dos números iniciales. Por ejemplo, si P=18 y Q=12, el algoritmo hará que P y Q vayan tomando los siguientes valores:
Inicialmente P==18 y   Q==12     (P>Q => P=P-Q)
Después      P==6   y   Q==12     (Q>P => Q=Q-P)
Después      P==6   y   Q==6       (P==Q => El mcd es 6)

Diseña el algoritmo anterior siguiendo un enfoque recursivo:
unsigned mcd(unsigned P, unsigned Q)

7.- Diseña un procedimiento recursivo que lea una secuencia de caracteres de longitud arbitraria terminada en un punto, y la imprima en orden inverso. El procedimiento no tiene parámetros.

CitarTema 3
En este tema se ven los tipos de datos estructurados: Registros, arrays y cadenas de caracteres (tipo string) y la resolución de problemas usando tipos estructurados.
ESTE TEMA ES EL ÚLTIMO DE LA ASIGNATURA.

Ejercicios Tema 3
1.- Diseña un algoritmo que permita invertir el contenido de un array. El algoritmo no podrá utilizar arrays auxiliares. Impleméntalo de forma iterativa y recursiva.
Array Original: 24 12 45 90 7 9 15
Array Invertido: 15 9 7 90 45 12 24

2.- Escriba un programa que efectúe la conversión de un número natural en base 10 a otra determinada base, sabiendo que el resultado no sobrepasará los 50 dígitos. El usuario introducirá primero el número en base 10 y después la base a la que convertirlo (el programa debe asegurarse de que la base no sea ni menor de 2 ni mayor de 9)

3.- Diseña un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la frecuencia con la que aparece cada una de las letras del texto.

4.- Dados los siguientes tipos (para una constante MAX cualquiera):
Código (cpp) [Seleccionar]
typedef char Componentes[MAX]
struct Vector{
   Componentes datos;   //array de caracteres
   unsigned tam             //numero de celdas ocupadas
};

a) La moda de un array de caracteres es el carácter del array que se repite más frecuentemente. Si varios caracteres se repiten con la misma frecuencia máxima, entonces no hay moda. Escribe un procedimiento con tres parámetros. El primero es de entrada para recibir un registro de tipo Vector que contiene el array datos con tam caracteres. El segundo parámetro es de salida e indicará si se ha encontrado la moda en el array o no. El tercer parámetro es de salida y será el carácter que representa la moda (si es que existe).
b) Diseña una función booleana que dados dos registros de tipo Vector como parámetros devuelva TRUE si son iguales y FALSE en otro caso. Dos vectores son iguales si contienen los mismos elementos y en el mismo orden relativo, suponiendo que el primer elemento sigue al último. Por ejemplo, si los arrays fueran:
['A', 'C', 'D', 'F', 'E']
['D', F', 'E', 'A', 'C']
la función devolvería TRUE.
Supón, además, que cada carácter aparece a lo sumo una vez.
c) Diseña un procedimiento que tome como parámetros de entrada dos vectores con los arrays ordenados y devuelva (con un perámetro de salida) el vector resultado de realizar la mezcla ordenada de los dos arrays contenidos en los vectores de entrada.

5.- Los alumnos de informática desean celebrar una comida un día del presente mes en el que puedan acudir todos. Se pide realizar un algoritmo que recoja de cada alumno los días que le vendría bien ir a la comida, e imprima las fechas concordantes para todos los alumnos. Los datos se introducirán por teclado, y cada alumno escribirá una única línea con los números de los días libres separados por espacios.

6.- Se tiene un array de enteros. Obtén otro de forma que el contenido de cada elemento del nuevo array sea un índice que nos indique de menor a mayor los valores del array de enteros. El array original no se podrá modificar, ni se puede hacer copia del mismo. Por ejemplo:
[10,5,-7,0,12] ---> [2,3,1,0,4]

7.- La distancia entre dos letras en un texto es el número de letras que aparecen en el texto entre las dos letras indicadas. Diseñe un algoritmo que lea un texto de longitud indefinida formado por letras mayúsculas (que termina con un punto) y muestre por pantalla la máxima distancia entre cada par de letras repetidas. Aquellas letras que no se repitan no aparecerán en la salida.
Por ejemplo:
- Texto de entrada: ABEADDGLAKE.
- Salida:
    · Distancia entre A: 4
    · Distancia entre D: 0
    · Distancia entre E: 7

8.- Diseña un algoritmo para calcular la suma de los elementos de la diagonal principal de una matriz cuadrada.

9.- Una matriz tiene un punto silla en una de sus componentes, si ese componente es el mayor valor de su columna y el menor de su fila. Diseña un algoritmo que recogiendo de teclado los componentes de una matriz cuadrada de enteros de hasta un máximo de 10x10, muestre en la pantalla las coordenadas de todos sus puntos silla.

10.- Diseñe un algoritmo que lea de teclado un texto y muestre un listado por pantalla de todas las palabras del texto que comiencen por ciertas iniciales. Dichas iniciales serán las letras que formen la primera palabra del texto.
NOTAS:
- El texto contiene un número indefinido de palabras.
- El texto termina con la palabra FIN
- Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas)
- El carácter separador de palabras es el espacio en blanco.

11.- Diseñe un algoritmo que lea de teclado un patrón (una cadena de caracteres) y un texto, y dé como resultado las palabras del texto que contenga a dicho patrón. En la salida no habrá palabras repetidas. Ejemplo:
·Patrón: RE
·Texto: CREO QUE IREMOS A LA DIRECCION QUE NOS DIERON AUNQUE PIENSO QUE DICHA DIRECCION NO ES CORRECTA FIN
·Salida: CREO IREMOS DIRECCION CORRECTA

NOTAS:
- El texto contiene un número indefinido de palabras.
- El texto termina con la palabra FIN.
- Cada palabra tiene un número indefinido pero limitado de caracteres (todos alfabéticos mayúsculas).
- El caracter separador de palabras es el espacio en blanco.
- En el texto aparecerán un número máximo MAX_PAL_DIST (una constante) de palabras distintas.

12.- Una farmacia desea almacenar sus productos (TProducto) en una estructura. De cada producto hay que almacenar la siguiente información: código (unsigned), nombre (string), precio (float), fecha de caducidad (definir un tipo registro para la fecha). Diseña la estructura de datos (TFarmacia) para almacenar un máximo de MAX (una constante) productos y realiza los siguientes subalgoritmos:
- void LeerProducto(TProducto& p)
- void EscribirProducto(const TProducto& p)
- void InicializarFarmacia(TFarmacia& f)
 void InsertarProducto(TFarmacia& f, const TProducto& p)
- void BorrarProducto(TFarmacia& f, unsigned codigo)
- void BuscarProductoCodigo(const TFarmacia& f, unsigned codigo, bool&   encontrado, TProducto& p)
- void ListarFarmacia(const TFarmacia& f)