07651a8047
Para uso exclusivo con fines de estudio. Se prohíbe su uso para entregas calificables y/o uso comercial.
194 lines
5.1 KiB
C++
194 lines
5.1 KiB
C++
//Examen Febrero 2013 - Grupos A, B, D y G.
|
|
//Fernando Méndez Torrubiano
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <iomanip>
|
|
using namespace std;
|
|
|
|
|
|
//Constantes:
|
|
const int MAX_NUM = 100;
|
|
|
|
//Tipos:
|
|
typedef int tNumeros[MAX_NUM];
|
|
typedef struct tSecuencia {
|
|
tNumeros numeros;
|
|
int contador;
|
|
};
|
|
|
|
|
|
//Funciones:
|
|
void ejecutarMenu();
|
|
int menu();
|
|
bool generar(tSecuencia&, const int&);
|
|
bool guardar(tSecuencia&);
|
|
void recorrer(tSecuencia&);
|
|
bool esFeliz(int&);
|
|
bool buscar(tSecuencia&, int&, int&);
|
|
|
|
|
|
int main() {
|
|
|
|
ejecutarMenu();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void ejecutarMenu() {
|
|
tSecuencia secuencia;
|
|
int opc = 1, maximo, error, i = 1;
|
|
bool generado = false;
|
|
|
|
while (opc != 0) {
|
|
opc = menu();
|
|
switch (opc){
|
|
case 0: break;
|
|
case 1:
|
|
cout << "Introduzca el limite superior para los numeros de la secuencia: ";
|
|
cin >> maximo;
|
|
if (generar(secuencia, maximo)) {
|
|
cout << "Secuencia generada correctamente." << endl;
|
|
generado = true;
|
|
}
|
|
else {
|
|
cout << "Error al generar la secuencia." << endl;
|
|
}
|
|
system("PAUSE");
|
|
break;
|
|
case 2:
|
|
if (generado == true) {
|
|
recorrer(secuencia);
|
|
}
|
|
else {
|
|
cout << "Primero debes generar una secuencia." << endl;
|
|
}
|
|
system("PAUSE");
|
|
break;
|
|
case 3:
|
|
if (generado == true) {
|
|
cout << "Introduzca un error: ";
|
|
cin >> error;
|
|
if (buscar(secuencia, error, i)) {
|
|
cout << "Encontrado en la linea " << i << " (diferencia: " << error << ")." << endl;
|
|
}
|
|
else {
|
|
cout << "No encontrado." << endl;
|
|
}
|
|
}
|
|
else {
|
|
cout << "Primero debes generar una secuencia." << endl;
|
|
}
|
|
system("PAUSE");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
system("cls");
|
|
}
|
|
}
|
|
|
|
int menu() {
|
|
int opc = 0;
|
|
|
|
cout << setw(25) << setfill('=') << "MENU" << setw(25) << "\n" << setfill(char(0));
|
|
cout << "1.-Generar una secuencia." << endl;
|
|
cout << "2.-Procesar la secuencia" << endl;
|
|
cout << "3.-Buscar en la secuencia." << endl;
|
|
cout << "0.-Salir" << endl;
|
|
cout << setw(50) << setfill('=') << "\n" << setfill(char(0));
|
|
|
|
do {
|
|
cout << "Introduzca una opcion: ";
|
|
cin >> opc;
|
|
} while (opc < 0 || opc > 3);
|
|
|
|
return opc;
|
|
}
|
|
|
|
bool generar(tSecuencia& secuencia, const int& maximo) {
|
|
secuencia.contador = 0;
|
|
|
|
do{
|
|
cout << "Introduzca un numero (0 para terminar): ";
|
|
cin >> secuencia.numeros[secuencia.contador];
|
|
if ((secuencia.numeros[secuencia.contador] < maximo) && (secuencia.numeros[secuencia.contador] > 0)) {
|
|
secuencia.contador++;
|
|
}
|
|
} while ((secuencia.numeros[secuencia.contador] != 0));
|
|
|
|
return guardar(secuencia) ? true : false;
|
|
}
|
|
|
|
bool guardar(tSecuencia& secuencia) {
|
|
bool save = false;
|
|
ofstream archivo;
|
|
|
|
archivo.open("datos.txt");
|
|
if (!archivo.is_open()) {
|
|
save = false;
|
|
}
|
|
else {
|
|
for (int i = 0; i < secuencia.contador; i++){
|
|
archivo << secuencia.numeros[i] << endl;
|
|
}
|
|
archivo << -1;
|
|
save = true;
|
|
}
|
|
|
|
return save;
|
|
}
|
|
|
|
void recorrer(tSecuencia& secuencia) {
|
|
int numero = 0;
|
|
|
|
for (int i = 0; i < secuencia.contador; i++){
|
|
numero = secuencia.numeros[i];
|
|
if (esFeliz(numero)) { cout << "El numero: " << secuencia.numeros[i] << " ES FELIZ." << endl; }
|
|
else { cout << "El numero: " << secuencia.numeros[i] << " NO ES FELIZ." << endl; }
|
|
|
|
}
|
|
}
|
|
|
|
bool esFeliz(int& num) {
|
|
int digito[10] = { 0,0,0,0,0,0,0,0,0,0 }, i = 0, aux;
|
|
|
|
do {
|
|
if (num > 10) { //Igualamos una variable auxiliar al valor anterior del número (si el número, es mayor de 10).
|
|
aux = num;
|
|
}
|
|
else { //Si el número es menor que 10, igualamos el auxiliar a 10 para que entre en el bucle y procese el número.
|
|
aux = 10;
|
|
}
|
|
while (aux >= 10) { //Si el auxiliar es mayor o igual a 10, significa que el número aun tiene más de dos cifras y por tanto hay que continuar extrayendo dichas cifras.
|
|
digito[i] = num % 10; //Hacemos el módulo 10 del número para extraer el digito correspondiente a las unidades.
|
|
num -= digito[i]; //Restamos al número el valor de las unidades, para hacerlo potencia de 10.
|
|
aux = num; //Igualamos una variable auxiliar al valor anterior del número. Porque en la siguiente comprobación del bucle, el número estará dividido entre 10 y daría una vuelta menos.
|
|
num /= 10; //Dividimos el número entre 10 para en la siguiente vuelta del bucle, seguir extrayendo el próximo dígito, que antes eran las decenas y ahora correcponderá a las unidades.
|
|
i++; //Sumamos uno para guardar la siguiente cifra en la próxima posición del vector. Como vamos a sumar los dígitos, nos da igual que se guarden en orden inverso.
|
|
}
|
|
|
|
num = 0;
|
|
for (int j = 0; j < i; j++) {
|
|
num += pow(digito[j], 2); //Calculamos la suma de las potencias cuadradas de cada uno de los dígitos del número.
|
|
}
|
|
i = 0;
|
|
} while (num >= 10);
|
|
|
|
return (num == 1) ? true : false;
|
|
}
|
|
|
|
bool buscar(tSecuencia& secuencia, int& error, int& i) {
|
|
bool encontrado = false;
|
|
|
|
while ((!encontrado) && (i < secuencia.contador)) {
|
|
if ((secuencia.numeros[i] - secuencia.numeros[i - 1]) < error) {
|
|
error = secuencia.numeros[i] - secuencia.numeros[i - 1];
|
|
encontrado = true;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
return encontrado;
|
|
} |