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ú

Mensajes - ciquee

#11
Muchas gracias por la respuesta YreX-DrW!

Pero llevo ya un tiempo dándole vueltas, y aunque entiendo lo que me dices, no consigo hacerlo. No me sale una función para determinar si un numero es abundante defectivo o perfecto con solo una variable como me dices, he conseguido reducirla a 2, una para el número introducido y otra para la suma de divisores, y me ha quedado tal que así:


#include <iostream>
using namespace std;

int Perfecto (int, int);

int main (void) {

    int valor1, valor2, abund;

    cout << "Este programa determina la suma de los numeros abundantes     comprendidos entre dos enteros determinados" << endl;

    cout << "Escribe un numero: ";
    cin >> valor1;

    cout << "Escribe otro numero: ";
    cin >> valor2;

//Debemos averiguar los numeros abundantes que hay entre esos dos valores tecleados:
for (int x = valor1 +1; x < valor2; x++) {
if (Perfecto(x,0) == 1){
abund++;
}
}

cout << "La suma de los numeros abundantes entre " << valor1 << " y " << valor2 << " es " << abund;

        cin.get();
return 0;
}


int Perfecto(int, int) {

int num, sum_div = 0;

while (num != 0){

for (int i = 1; i < num; i++) {
if (num%i == 0) {
sum_div = sum_div + i;
}
}

if (sum_div > num){
cout << "El número introducido es abundante";
return 1;
sum_div = 0;
}

else if (sum_div == num) {
cout << "El número introducido es perfecto";
return 0;
sum_div = 0;
}

else {
cout << "El número introducido es defectivo";
return -1;
sum_div = 0;
}
}
}


No sé si lo de devolver 1 cuando sea abundante, 0 cuando sea perfecto o -1 cuando sea defectivo se hace como lo he hecho yo. Da rabia esto de tenerlo casi pero no encontrarlo, pero a la vez es un reto muy interesante, aunque alfinal tenga que volver a preguntar casi siempre!

Y muchas gracias también por la aclaración de la biblioteca <conio.h> y las variables globales.
#12
Buenas, tengo una duda, estoy empezando a trabajar con varias funciones y no me aclaro para utilizar una desde otra, me explico: tengo que hacer un programa que me diga si un numero tecleado es perfecto, abundante o defectivo. Luego en otro ejercicio me piden que, utilizando esa misma función sin modificarla, haga un programa para saber los números abundantes que hay entre dos numero que se introducen por teclado. Mi código es este:


#include <iostream>
using namespace std;

int Perfecto (int, int, int );
int suma_div, i;

int main (void) {
int valor1, valor2, abund;

cout << "Este programa determina la suma de los numeros abundantes comprendidos entre dos enteros determinados" << endl;

cout << "Escribe un numero: ";
cin >> valor1;

cout << "Escribe otro numero: ";
cin >> valor2;

for (int x = valor1 +1; x < valor2; x++) {
x = Perfecto(x, suma_div, i);
if (x == ??????){
abund++;
}
}

cout << "La suma de los numeros abundantes entre " << valor1 << " y " << valor2 << " es " << abund;

return 0;
}


int Perfecto() {

int num, sum_div = 0, i;

cout<<"\nEscribe un número (Escribe el 0 para salir): ";
cin >> num;

while (num != 0){

for (i = 1; i <= (num / 2); i++) {
if (num%i == 0) {
sum_div = sum_div + i;
}
}

if (sum_div > num){
cout<<"El número introducido es abundante";
}

else if (sum_div == num) {
cout<<"El número introducido es perfecto";
}

else {
cout<<"El número introducido es defectivo";
}

cout << "\n\nEscribe un número (Escribe el 0 para salir): ";
cin >> num;
}

return 0;
}


Creo que el problema lo tengo en el bucle for de la función principal, y es que no sé a que igualar la x para saber cuantos de los números resultantes son abundantes, ya que en la función Perfecto no está declarado como variable ¿Me podéis ayudar por favor?

Ah y otra duda, yo en muchos programas declaro la librería <conio.h> y pongo el getch() antes del return 0 para que el programa no se cierra, pero he leído en un hilo (no me acuerdo cual) que alguien ha dicho que no se utilice esa librería, entonces ¿como se hace para que el programa no se cierre al acabar?

Muchas gracias! Saludos!
#13
Ok! Pues muchas gracias de nuevo!

Seguimos!
#14
Y una pregunta más, si el dato que tengo que extraer está en medio de muchos otros ¿he de ir guardando todos los datos en la "variable vertedero" hasta llegar al dato que quiero? Me explico, tengo un fichero con varios datos sobre estrellas...

Nombre de la estrella 1            Alfa Centauri
Distancia a la tierra (en años luz)      4.367
Radio (en Radios solares)            1.2
Masa (en kg)                  2.167e30
Magnitud absoluta               15.49
Temperatura (en Kelvin)             5790
...

Para coger el dato del nombre y la masa de cada una de las estrellas, debería descartar palabra por palabra las 5 primeras hasta llegar al nombre de la estrella, y luego descartar las 2 lineas siguientes y otras 3 palabras mas para llegar al dato de la masa? ¿O hay otra forma de hacerlo más directa y corta?

Sigo sin poder hacer uso ni de funciones o procedimientos auxiliares, ni utilizar datos estructurados (cadenas, registros, vectores o matrices).

Saludos y gracias de antemano!

#15
Muchísimas gracias por tu explicación, es genial y está muy bien argumentaba!

Lo conseguí!! y lo mejor de todo... aprendí algo nuevo!

Un saludo!
#16
Buenas YreX-DwX!!

Nada, que tengo un cloqueo con esto de los ficheros o archivos...

He resuelto el primer problema, porque se que getline lee una linea entera y la puedo guardar en una variable y ya operar con ella. Aunque igual no lo he hecho de la manera más eficaz, el programa consigue lo que me piden, elimino las lineas impares y me quedo con las pares:


int main(void) {
string linea;
ifstream archivo1;
ofstream archivo2;

archivo1.open ("notas.dat");
archivo2.open ("notas_sin_nombre.dat");

if(!archivo1)
cout<<"No se pudo abrir el archivo"<<endl;
else
{
while (!archivo1.eof())
{
getline(archivo1, linea);
getline(archivo1, linea);
archivo2<< linea << endl;
}
}

archivo1.close();
archivo2.close();

return 0;
}



Y, sí, en las lineas pares va todo junto: "Nombre_alumno_n" ¿porque es más fácil así? ilumíname porfa!

Y respecto al ejercicio 2 por más vueltas que le dé no consigo hacer nada, porque el problema lo tengo en que no se como sacar los datos del fichero para poder operar con ellos. Sé que getline lee una linea entera, también sé leer y copiar todo el contenido del fichero, y que  con .seekg(pos) puedo leer una posición concreta (pero un solo carácter). Pero ¿cómo puedo sacar esas notas concretas 5.8, 3.3 y 8.2 para guardarlos en float? ayúdame por favor! O dime si no se hace así y estoy demasiado perdido!!

Muchas gracias de antemano!
Saludos!
#17
Muchas gracias YreX-DwX!

He estado dandole vueltas a tu solución, pero creo que aún soy muy malo en esto del C++ porque no me aclaro. Aunque pienso que debe haber una forma más fácil, me explico, que la otra vez no me explique muy bien. El fichero ue tengo es del tipo:

Nombre alumno 1   Pepito Pérez
nota_alumno_1      5.8
Nombre alumno 2   Juan Gómez
nota_alumno_2      3.3
...               ...
Nombre alumno n   Mauricio Colmenero
nota_alumno_n      8.2

Con lo cual bastaría con leer linea a linea y copiar en otro archivo solo las lineas pares ¿no crees? pero no tengo ni idea de como hacerlo. A ver si me puedes orientar por favor! Este es el código que tengo por ahora...


#include <iostream>
#include <fstream>
#include <stdlib.h>

using namespace std;

int main(void) {
ofstream archivo;


archivo.open("notas.dat",ios::out);

if(archivo.fail()){
cout<<"No se pudo abrir el archivo";
exit(1);
}

while (!archivo.EOF())
{


}

archivo.close();
}


Saludos! y Buen finde!
#18
Buenas compañeros/as!

Necesito ayuda porque estoy bloqueado con el tema ficheros.
Tengo un archivo (notas.dat) con nombres de alumnos y notas, y necesito anonimizar el fichero, es decir, sustituir los nombres de los alumnos por "Alumno 1"... y guardar la información en otro nuevo fichero.

Yo sé abrir ficheros para leer y para escribir, pero no tengo ni idea de como identificar el nombre de los alumnos para sustituirlos.

Por otro lado también necesito trabajar con esas notas para calcular la mas alta, la mas baja y la media...

Para la realización de estos ejercicios NO puedo usar funciones o procedimientos auxiliares, ni la utilización de datos estructurados (cadenas, registros, vectores o matrices)

¿Me podéis guiar un poquito? Muchas gracias!
#19
Muchas gracias Yrex! Vaya tontería (=0) jajaja

Y gracias también FalForkXXI pero aún no he dado esas funciones y no puedo usarlas!

Un saludo!
#20
Buenas!! Gracias de nuevo por tu respuesta!
Creo que lo he pillado, pero tengo problemas con el cout, si lo pongo dentro del bucle me da el resultado infinitas veces, mientras que si lo pongo después de este (que es donde debe ir) no me da ningún resultado, me deja escribir el numero pero se queda ahí...

Este es mi código, a ver si me ayudas a ver que tengo mal:


...
while (num>=0) {
ultima_cifra = num%10; // descarto la última cifra por ser lugar impar
num /=10; // y me queda el número sin la última cifra
ultima_cifra = num%10; // ahora la última cifra SI que ocupa un lugar par
suma_pares = suma_pares + ultima_cifra; // guardo la cifra de lugar par en suma_pares
num /=10;
}

cout<<"La suma de las cifras de las posiciones pares es: "<<suma_pares<<endl;

return 0;
}