[C con Clase] Problemas de Estructuras (tema 11) para corregir

Marcos Collado Martín marquitos.mcm en gmail.com
Vie Abr 20 22:12:19 CEST 2012


Son dos problemas en uno, meti todos los problemas en el mismo archivo. El
primer main corresponde al problema 1 y el otro main a los problemas 2,3,4
y 5 que van conjuntos :)

Un saludo ^^

El 20 de abril de 2012 20:02, Santiago Tabarez
<santiago230792 en gmail.com>escribió:

> ¿no escribiste el cuerpo de la funcion main 2 veces? me parece que la
> redefiniste
>
> /*Escribir un programa que almacene en un array los nombres y números
> de teléfono de 10 personas.
> El programa debe leer los datos introducidos por el usuario y
> guardarlos en memoria (en el array).
> Después debe ser capaz de buscar el nombre correspondiente a un número
> de teléfono y el teléfono
> correspondiente a una persona. Ambas opciones deben se accesibles a
> través de un menú, así como
> la opción de salir del programa. El menú debe tener esta forma, más o
> menos:
> a) Buscar por nombre
> b) Buscar por número de teléfono
> c) Salir
>
> Pulsa una opción: */
>
> #include <iostream>
> #include "string.h" // El compilador de Code::Blocks no ve <string> nu
> se porque.
> using namespace std;
>
> struct datos
> {
>        char Nombre[200];
>        int Telefono;
> } Datos[11]; // 10 personas + 1 (nulo)
>
> int main()
> {
>        int x = 0;
>        while(x < 10)
>        {
>                cout << "Ingrese el nombre:" << endl;
>                cin >> Datos[x].Nombre;
>                cout << "Ingrese el numero de telefono:" << endl;
>                cin >> Datos[x].Telefono;
>                x++;
>        }
>
>        int action;
>
>        cout << "Menu Principal:" << endl << endl;
>        cout << " 1- Buscar por nombre:" << endl;
>        cout << " 2- Buscar por telefono:" << endl;
>        cout << " 3- Salir del programa" << endl;
>        cin >> action;
>
>        bool encontrado = false;
>        switch(action)
>        {
>        case 1: // Busqueda por nombre
>                char nombre[200];
>                cout << "Introduce el nombre:" << endl;
>                cin >> nombre;
>                for(int x = 0; x < 10; x++)
>                {
>                        if (strcmp(Datos[x].Nombre, nombre) == 0)// No
> hemos dado lo que se
> tenia que hacer aqui realmente
>                        {
>                                cout << "Existe el nombre" << endl;
>                                cout << "El telefono de la persona es:" <<
> Datos[x].Telefono << endl;
>                                encontrado = true;
>                        }
>                }
>                if(!encontrado)
>                {
>                        cout << "No existe ese nombre en la estructura" <<
> endl;
>                        return 0; // fin del programa
>                }
>                break;
>        case 2: // Busqueda por telefono
>                int tel;
>                cout << "Introduce el telefono:" << endl;
>                cin >> tel;
>
>                for(int x = 0; x < 10; x++)
>                {
>                        if(Datos[x].Telefono == tel)
>                        {
>                                cout << "Existe el telefono" << endl;
>                                cout << "El poseedor de ese telefono es:"
> << Datos[x].Nombre << endl;
>                                encontrado = true;
>                        }
>                }
>
>                if(!encontrado)
>                {
>                        cout << "No existe ese telefono en nuestra base de
> datos" << endl;
>                        return 0; // fin del programa
>                }
>                break;
>        case 3: // Salir
>                return 0;
>        }
>
>        return 0;
> }
>
>
> /*Para almacenar fechas podemos crear una estructura con tres campos:
> ano, mes y dia.
> Los días pueden tomar valores entre 1 y 31, los meses entre 1 y 12 y
> los años, dependiendo de la aplicación,
> pueden requerir distintos rangos de valores. Para este ejemplo
> consideraremos suficientes 128 años, entre 1960
> y 2087. En ese caso el año se obtiene sumando 1960 al valor de ano. El
> año 2003 se almacena como 43.
> Usando estructuras, y ajustando los tipos de los campos, necesitamos
> un char para dia, un char para mes y otro para ano.
> Diseñar una estructura análoga, llamada fecha, pero usando campos de
> bits. Usar sólo un entero corto sin signo
> (unsigned short), es decir, un entero de 16 bits. Los nombres de los
> campos serán: dia, mes y anno.
> Basándose en la estructura de bits del ejercicio anterior, escribir
> una función para mostrar fechas: void Mostrar(fecha);.
> El formato debe ser: "dd de mmmmmm de aaaa", donde dd es el día,
> mmmmmm el mes con letras, y aaaa el año. Usar un array
> para almacenar los nombres de los meses.
> Basandose en la estructura de bits del ejercicio anterior, escribir
> una función bool ValidarFecha(fecha);, que verifique
> si la fecha entregada como parametro es válida. El mes tiene que estar
> en el rango de 1 a 12, dependiendo del mes y del año,
> el dia debe estar entre 1 y 28, 29, 30 ó 31. El año siempre será
> valido, ya que debe estar en el rango de 0 a 127.
> Para validar los días usaremos un array int DiasMes[] = {31, 28, 31,
> 30, 31, 30, 31, 31, 30, 31, 30, 31};. Para el caso de
> que el mes sea febrero, crearemos otra función para calcular si un año
> es o no bisiesto: bool Bisiesto(int); Los años bisiestos
> son los divisibles entre 4, al menos en el rango de 1960 a 2087 se cumple.
> Seguimos con el tema de las fechas. Ahora escribir dos funciones más.
> La primera debe responder a este prototipo:
> int CompararFechas(fecha, fecha);. Debe comparar las dos fechas
> suministradas y devolver 1 si la primera es mayor,
> -1 si la segunda es mayor y 0 si son iguales.
> La otra función responderá a este prototipo: int Diferencia(fecha,
> fecha);, y debe devolver la diferencia en días entre las
> dos fechas suministradas.
> */
>
> #include <iostream>
> #include "string.h"
> using namespace std;
>
> struct fecha
> {
>        unsigned short int dia:5;
>        unsigned short int mes:4;
>        unsigned short int anno:7;
> } fechas[2];
> char meses[12][11] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo",
> "Junio", "Julio", "Agosto",
>        "Septiembre", "Octubre", "Noviembre", "Diciembre"};
> int DiasMes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
>
> void Mostrar(fecha);
> bool ValidarFecha(fecha);
> bool Bisiesto(int anno);
> int CompararFechas(fecha, fecha);
> int Diferencia(fecha, fecha);
> int Suma(fecha);
>
> int main() // La pongo porque si, ya que no lo pide en el problema
> {
>        int aux;
>
>        for(int i = 0; i < 2; i++) // 2 fechas a comparar
>        {
>                cout << "Introduce el dia de la primera fecha" << endl;
>                cin >> aux;
>                fechas[i].dia = aux;
>                cout << "Introduce el mes de la primera fecha" << endl;
>                cin >> aux;
>                fechas[i].mes = aux;
>                cout << "Introduce el anno de la primera fecha" << endl;
>                cin >> aux;
>                fechas[i].anno = (aux - 1960);
>
>                if(ValidarFecha(fechas[i]))
>                        cout << "Fecha correcta" << endl;
>                else
>                {
>                        cout << "Fecha incorrecta" << endl;
>                        i--;
>                }
>        }
>        cout << "Comparando las dos fechas:" << endl;
>        int c = CompararFechas(fechas[0], fechas[1]);
>        if(c > 0)
>                cout << "La primera fecha es mayor" << endl;
>        else
>                if(c == 0)
>                        cout << "Las dos fechas son iguales" << endl;
>                else
>                        cout << "La segunda fecha es mayor" << endl;
>
>        cout << " Diferencia entre las dos fechas:" << Diferencia(fechas[0],
> fechas[1]) << endl;
>        cin.get();
>        return 0;
> }
>
> void Mostrar(fecha f)
> {
>        cout << "El dia seleccionado es:" << f.dia << "de" << meses[f.mes -
> 1] << "de" << f.anno + 1960 << endl;
> }
>
> bool ValidarFecha(fecha f)
> {
>        if(f.dia > DiasMes[f.mes-1] || f.dia == 0 || f.mes > 12 || f.mes ==
> 0
> || (f.anno + 1960) < 1960)
>                return false;
>        return true;
> }
>
> bool Bisiesto(int Anno)
> {   // No entendi muy bien a que se referia en la nota.
>        if(Anno % 4 == 0 && Anno % 100 != 0)
>                return true;
>        return false;
> }
>
> int CompararFechas(fecha f1, fecha f2)
> {
>        int diasF1, diasF2;
>
>        if(ValidarFecha(f1) && ValidarFecha(f2)) // Primero comprobamos si
> son validas
>        {
>                diasF1 = Suma(f1);
>                diasF2 = Suma(f2);
>
>                // Ahora comparamos
>                if(diasF1 > diasF2)
>                        return 1;
>                else if(diasF1 < diasF2)
>                        return -1;
>                else // Si no es ni mayor ni menor, seran iguales.
>                        return 0;
>        }
>        else
>                cout << " Las fechas a comparar son invalidas" << endl;
>
> }
>
> int Suma(fecha f)
> {
>        int diasF = 0;
>        for(int i = 1; i < f.anno; i++) // Hay anno 0?
>        {
>                if(Bisiesto(i + 1960))
>                        diasF += 365;
>                else
>                        diasF += 364;
>        }
>        for(int i = 1; i < f.mes; i++)
>                diasF += DiasMes[f.mes - 1];
>        diasF += f.dia;
>
>        return diasF;
> }
> int Diferencia(fecha f1, fecha f2)
> {
>        int diasF1, diasF2;
>
>        if(ValidarFecha(f1) && ValidarFecha(f2)) // Primero comprobamos si
> son validas
>        {
>                diasF1 = Suma(f1);
>                diasF2 = Suma(f2);
>            diasF1 -= diasF2;
>                return diasF1;
>        }
>        else
>                cout << "Las fechas a comparar son invalidas" << endl;
> }
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120420/44e7ddad/attachment.html>


Más información sobre la lista de distribución Cconclase