1

Mi código es una agenda, tiene un menú de 6 opciones.... mi case 4 la función llama a los datos que están guardados, pero en el campo del teléfono lo imprime raro.

#include<iostream>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<fstream>
#include<cstring>
using namespace std;

Estas son las librerias que he utilizado, si alguna esta de más me seria de mucha utilidad que me lo dijeran o que la este empleando mal.

struct spersonas{
 char nombre[25];
 string apellido;
 double telefono;
 string direccion;
 string correo_elec;
}agenda[50]; 

Estos son los prototipos que estoy usando, para después llamarlos al menú

void agregar_personas();
void buscar_contacto();
void modificar(int nm);
void imprimir();
void eliminaContacto();
int numper=0;
int tele;
int even;
int numE=0;
char nombre[25];
int nm;
int ce;
int ne;
int main(){
int opc;
do {

     cout<<"\t\t______________________________\n";
     cout<<"\t\t Agenda electronica \n";
     cout<<"\t\t______________________________ \n";
     cout<<"1. Agregar contacto \n";
     cout<<"2. Buscar contacto \n";
     cout<<"3. Modificar datos \n";
     cout<<"4. Imprimir listado \n";
     cout<<"5. Eliminar contacto \n";
     cout<<"6. Salir \n";
     cout<<"Ingrese la opcion deseada \n";
     cin>>opc;
     system("cls");

Aquí empienzan los cases del programa, en el numero 4 es donde tengo el error

switch(opc){

En el caso número 1, cuando corro el programa no me arroja ningún error de que algo este mal. Sino que se captura perfectamente, sin ningún problema de lo que capturo, no se si el error se en la función o sea error del menú.

 case 1:
 agregar_personas();
 break;

Cuando quiero realizar la búsqueda, igualmente me arroja el mismo error del número de teléfono que he ingresado en la opción de capturar.

 case 2:
 buscar_contacto();
 break;
 case 3:
 cout<<"Se va a realizar una busqueda con respecto al telefono, la agenda le mostrara los datos de este contacto\n";
 cout<<"Digite el telefono de la persona a la que va a modificar ";
 cin>>nm;
 modificar(nm);
 break;

En este case de mi menú es donde yo mando a llamar la función que previamente hice. El error que me arroja es de que el número de teléfono me lo imprime mal.

 case 4:
 imprimir();
 break;

El case número 5 funciona sin ninguno problema case 5:

 eliminaContacto();
 break;
 case 6:
 cout<<"Hasta pronto.";

 break;
 }
} while(opc!=6);

getch();
return (0);
}

Este es el prototipo de la función donde capturo los datos, y donde el número de teléfono me lo imprime después mal. No se porque me arroje ese dato mal, si este usando la función mal o algo.

void agregar_personas(){
 cout<<"Digite el nombre: ";
 cin>>agenda[numper].nombre;
 cout<<"Digite el apellido: ";
 cin>>agenda[numper].apellido;
 cout<<"Digite el numero de telefono: ";
 cin>>agenda[numper].telefono;
 cout<<"Digite direccion: ";
 cin>>agenda[numper].direccion;
 cout<<"Digite correo electronico: ";
 cin>>agenda[numper].correo_elec;
 numper++;
 cout<<"\n\n Los datos se guardaron con exito.\n\n";

 ofstream out("contactos.txt");
 for(int i=0; i<numper; i++){
 out<<"Número de Registro: "<<i+1<<endl;
 out<<"Nombre ==>:"<<agenda[i].nombre<<endl;
 out<<"Télefono ==>:"<<agenda[i].telefono<<endl;
 out<<"Dirección ==>:"<<agenda[i].direccion<<endl;
 out<<"Correo ==>:"<<agenda[i].correo_elec<<"\n\n"<<endl;
 }
 system("pause");
 system("cls");
}
void buscar_contacto(){
 int i, j, op ;
 char nom[25];
 int encontrado=0;
 cout<<"Desea buscarlo por: \n1.Nombre \n2.Telefono \n";
 cin>>op;
 switch(op){
 case 1:
 cout<<"Escriba el nombre que va a buscar \n";
 cin>>nom;
 for(i=0;i<numper;i++){
 if(strcmp(agenda[i].nombre, nom)== 0){
 if (agenda[i].telefono!=0){
 cout<<"Numero de Registro: "<<i+1<<endl;
 cout<<"Nombre ==>:"<<agenda[i].nombre<<endl;
 cout<<"Telefono ==>:"<<agenda[i].telefono<<endl;
 cout<<"Direccion ==>:"<<agenda[i].direccion<<endl;
 cout<<"Correo ==>:"<<agenda[i].correo_elec<<endl;
 cout<<"-----------------------------------------"<<endl;
 j=1;
 system("pause");
 system("cls");
 }

 }

 }
 if(j!=1){
 cout<<"No existe esa persona en la lista de contactos."<<endl;
 system("pause");
 system("cls");
 }
 break;
 case 2:
 cout<<"Ingrese el telefono de la persona que va a buscar: \n";
 cin>>tele;
 for (i=0;i<numper;i++){
 if(agenda[i].telefono == tele){
 encontrado=1;
 j=i;
 break;
 }
 }


if (encontrado==1){
 cout<<"Numero de Registro: "<<i<<endl;
 cout<<"Nombre ==>:"<<agenda[j].nombre<<endl;
 cout<<"Telefono ==>:"<<agenda[j].telefono<<endl;
 cout<<"Direccion ==>:"<<agenda[j].direccion<<endl;
 cout<<"Correo ==>:"<<agenda[j].correo_elec<<endl;
 cout<<"-----------------------------------------"<<endl;
 }
 else
 cout<<"No existe ese telefono."<<endl;
 system("pause");
 system("cls");
 }
}

void modificar (int nm){
 int i, j;
 int encontrado=0;
 for (i=0;i<numper;i++){
 if(agenda[i].telefono==nm){
 encontrado=1;
 j=i;
 break;
 }
 }
if (encontrado==1){
 cout<<"Numero de Registro: "<<i+1<<endl;
 cout<<"Nombre ==>:"<<agenda[j].nombre<<endl;
 cout<<"Telefono ==>:"<<agenda[j].telefono<<endl;
 cout<<"Direccion ==>:"<<agenda[j].direccion<<endl;
 cout<<"Correo ==>:"<<agenda[j].correo_elec<<endl;
 cout<<"-----------------------------------------"<<endl;
 int qw;
cout<<"Que desea modificar de la persona \n";
cout<<"1.Nombre \n"<<"2.Telefono \n"<<"3.Dirección \n"<<"4.Correo electronico \n";
cin>>qw;
switch(qw){
case 1:
cout<<"Digite el nombre:";
cin>>agenda[j].nombre;
break;
case 2:
cout<<"Digite el numero de telefono:";
cin>>agenda[j].telefono;
break;
case 3:
cout<<"Digite Direccion:";
cin>>agenda[j].direccion;
break;
case 4:
cout<<"Digite correo electronico:";
cin>>agenda[j].correo_elec;
break;
}
cout<<"Completado.\n ";
ofstream out("contactos.txt");
 for(int i=0; i<numper; i++){
 out<<"Número de Registro: "<<i+1<<endl;
 out<<"Nombre ==>:"<<agenda[i].nombre<<endl;
 out<<"Télefono ==>:"<<agenda[i].telefono<<endl;
 out<<"Dirección ==>:"<<agenda[i].direccion<<endl;
 out<<"Correo ==>:"<<agenda[i].correo_elec<<"\n\n"<<endl;
 }
 }
 else
 cout<<"No exíste ese numero."<<endl;
 system("pause");
 system("cls");
}
void imprimir(){
 int i, t=0;
 cout<<"\t Listado de contactos"<<endl;
 for(i=0; i<numper; i++)
 {
 if(agenda[i].telefono!=1){
 cout<<"No. del contacto \t"<<t+1<<"\nNombre del contacto \t"
<<agenda[i].nombre<<"\nApellido"<<agenda[i].apellido<<"\nTelefono \t"<< agenda[i].telefono<<"\nDireccion \t"<<agenda[i].direccion<<"\nCorreo electronico\t"<<agenda[i].correo_elec <<"\n\n"<<endl;t++;
 }
 }
 system("pause");

 system("cls");



}
void eliminaContacto(){
 int i, r, k;
 do{
 cout<<"Digite el numero de telefono de la persona que va a eliminar, se le va mostrar\n los datos de las personas y verificara si es el que esta buscando\n";
 cin>>ce;
 for(i=0; i<numper; i++){
 if(ce==agenda[i].telefono){
 cout<<"Numero de Registro: "<<i+1<<endl;
 cout<<"Nombre ==>:"<<agenda[i].nombre<<endl;
 cout<<"Telefono ==>:"<<agenda[i].telefono<<endl;
 cout<<"Direccion ==>:"<<agenda[i].direccion<<endl;
 cout<<"Correo ==>:"<<agenda[i].correo_elec<<endl;
 cout<<"-----------------------------------------"<<endl;

 i=ne;
 do{
 cout<<"Esta seguro que desea eliminar el contaco? 1:Si 2:No";
 cin>>r;
 if(r<1 || r>2){
 cout<<"Error, intente de nuevo";
 system("pause");
 system("cls");

 }
 else {
 agenda[ne].telefono=0;
 }

 }while(r<1 || r>2);
 system("cls");
 break;

 }else {cout<<"El contacto no existe o no tiene ese numero\n Desea intentar de nuevo? 1:Si 2:No \n";
 cin>>k;
 system("cls");
 }
 }
 }while(k==1);

 }

Aquí escribo todos los datos sin ningún problema Al imprimir los datos, en el numero de teléfono sale así Al momento de cambiar double por string sale este error

eferion
  • 49,291
  • 5
  • 30
  • 72
  • Las capturas de pantalla son minúsculas, no se puede ver nada en ellas. En todo caso es curioso que uses un *double* para un número de teléfono; si acaso un *long* sería mucho más adecuado (los números en punto flotante tienen bastantes complicaciones). – SJuan76 May 18 '19 at 23:29
  • Se puede analizar todo tu código, pero lamentablemente no se puede ver como se visualiza los números debido a la resolución de las últimas imágenes... Podrías poner otras más claras??? – Víctor Hugo Tirado May 19 '19 at 01:39
  • Listo, volví a subir las capturas – Andrea Esqueda May 19 '19 at 02:28
  • declara telefono como tipo `string`, si no vas a hacer calculos con el telefono no ocupas guardarlo como `double`, te lo esta arrojando en notación científica, cambiar el tipo de dato debería corregirlo – Luis Alejandro May 19 '19 at 03:41
  • @LuisAlejandro ya cambie el double por string pero me sale error – Andrea Esqueda May 19 '19 at 05:21
  • ¿Que error te produce? – Luis Alejandro May 19 '19 at 09:19

1 Answers1

2

El campo del teléfono lo imprime raro.

Esto no ayuda, no podemos saber lo que tú consideras "raro", viendo tus capturas de pantalla a mi me parece que todo funciona con normalidad:

3.31025e+009

Ese número es 3,31025×109, que en la notación natural sería 331.025.000. Es la manera habitual de imprimir valores de tipo double y no tiene absolutamente nada de raro.

Pero seguramente te parece raro porque no esperas que un teléfono se muestre de esa manera; si quieres cambiar la manera en que se muestran los números, deberás indicar al flujo de salida de datos lo que quieres:

//                         vvvvv <--- Notación tradicional
cout << "Telefono ==>:" << fixed << setprecision(0) << agenda[i].telefono << endl;
//                                  ~~~~~~~~~~~~~~~ <--- Sin decimales

El modificador std::fixed indica al flujo de salida de datos que quieres la salida con notación fija (en lugar de la salida con notación científica, que es la normal para los datos double), mientras que el modificador std::setprecision indica al flujo de salida de datos la cantidad de decimales que quieres mostrar, al ser un teléfono asumo que no querrás ningún decimal.

Otras cosas a tener en cuenta.

  • Estás mezclando cabeceras de con cabeceras de , y no deberías hacerlo. Lee este hilo para saber mas detalles.
  • Estás incluyendo cabeceras que no usas. La cabecera <conio.h> es necesaria para comunicarse con las rutinas de la consola de C, pero estás usando la consola de C++. La cabecera <stdio.h> es necesaria para usar las utilidades de entrada y salida de C, pero estás usando las de C++.
  • Estás incluyendo cabeceras repetidas, pero de diferentes lenguajes. La cabecera <string.h> y la cabecera <cstring> son la misma, con la diferencia que la segunda es una versión de la primera adaptada a C++. Lee este hilo para saber mas detalles.
  • Podría ser mejor guardar el teléfono como entero largo (unsigned long) en lugar de como double, los enteros largos no se imprimen con notación científica.
  • No hay obligación de usar la cláusula using namespace std; pues es sólo es una ayuda a la escritura de código; si decides usar esta cláusula no lo hagas en el ámbito global, úsala en el ámbito más pequeño posible. Lee este hilo para saber por qué.
  • Si estás usando cadenas de caracteres, no uses formaciones de caracteres. Guardar el nombre como char[25] en lugar de como std::string, a demás de ser inconsistente con el resto de tu código, es un engorro de mantenimiento.
  • Usa nombres autoexplicativos para tus variables. Los nombres de las variables deberían indicarnos con un corto vistazo cuál es su misión, nombres como even, numE, nm, ce, ne y opc no ayudan para nada a saber cuál es la misión de esas variables; si usas mejores nombres la gente que trabaje contigo (y tu yo futuro) te lo agradecerán.
  • Usa plural para referirte a colecciones de cosas no para cosas individuales. La estructura personas guarda una persona, no varias.
  • Por lo que más quieras, indenta el código. Es posible que te parezca molón el código todo alineado, pero no lo es. La indentación de código existe para dar claridad al código, ayudar a su comprensión y facilitar el desarrolo.
  • Intenta no abusar de std::endl: Lee este hilo para saber más al respecto.

Para acabar, estás programando en C++, y si bien es cierto que es un lenguaje multiparadigma, es conocido por sus utilidades de programación orientada a objetos, saca provecho de estas utilidades, comparto un ejemplo de cómo podría redactarse tu programa para ser orientado a objetos.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82