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

Santiago Tabarez santiago230792 en gmail.com
Vie Abr 20 20:02:24 CEST 2012


¿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;
}




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