ayuda para entender código en c++

Iniciado por migcv, 7 Noviembre 2012, 08:29 AM

0 Miembros y 2 Visitantes están viendo este tema.

migcv

Hola amigos de elhacker.net XD
(Voy empezando en esto de la programación porfavor no insultos todos fueron como yo alguna ves). Bueno el caso es que estoy siguiendo un tutorial que me encontré en Internet de aprender c++  y dentro de este viene un ejemplo de una agenda el codigo es el siguiente:

#include <fstream>   // Biblioteca para el manejo de ficheros
#include <iostream>  // Biblioteca para la entrada-salida estándar
#include <cstdlib>   // Biblioteca estándar de C
using namespace std;
// Ejemplo de una agenda de teléfonos con toda la información en disco.
//CONSTANTES
const char FINCAD = char(0);
const int MAXCAD  = 80;
const int ENTER  = '\n';
const char SP = ' ';
//TIPOS
typedef char TCadena[MAXCAD+1]; // MAXCAD caracteres + FINCAD
struct TPersona
{
 TCadena nombre;
 TCadena apellido1;
 TCadena apellido2;  
 int telefono;
};
// CABECERA DE PROCEDIMIENTOS Y FUNCIONES
char menu();
void pausa();
void borrar_pantalla();
bool confirmar_salida();
void LeerPersona(TPersona &p);
void EscribirPersona(TPersona p);
// Algoritmos de Manejo de Ficheros de Texto
void insertarPersonaTXT(TCadena nombreFichero, TPersona p);
void listarAgendaTXT(TCadena nombreFichero);
void LeePersonaFicheroTXT(ifstream &fichero, TPersona &p);
void EscribePersonaFicheroTXT(ofstream &fichero, TPersona p);

// PROGRAMA PRINCIPAL
int main()
{
 TPersona p;;
 char opcion;
int num;
bool fin,encontrado;
 TCadena nomFich;
 fin = false;
 do
{
   borrar_pantalla();
   opcion = menu();
 
   switch(opcion)
   {
     case 'A': cout << "Nombre del Fichero: ";
               cin >> nomFich;
               LeerPersona(p);
               insertarPersonaTXT(nomFich,p);                
               break;
     case 'B': cout << "Nombre del Fichero: ";
               cin >> nomFich;
               listarAgendaTXT(nomFich);                
               break;                            
     case 'X': fin = confirmar_salida();
               break;
   }
   
if (!fin)
   {
     pausa();
   }
 } while (!fin);
   
 pausa();
 return 0;
}
// IMPLEMENTACIÓN DE PROCEDIMIENTOS Y FUNCIONES
void pausa() //Funcion que hace una pausa en el sistema no retorna un valor
{
 system("PAUSE");}
 
void borrar_pantalla()//Funcion que borra la pantalla no retorna un valor
{
 system("CLS");
}

char menu() // Funcion que escribe el meni principal
{
 char op;
 cout << "AGENDA EN FICHERO" << endl;
 cout << "-----------------" << endl;
 cout << "Autor: <Apellidos> <Nombre>" << endl;
 cout << "A. Insertar Persona TXT" << endl;
 cout << "B. Listar TXT" << endl;
 cout << "X. Salir del Programa." << endl;
 cout << endl;
 cout << "Introduzca Opción:";
 
 cin >> op;
 op = toupper(op);
 while( ((op<'A') || (op>'B')) && (op!='X') )
 {
   cout << "... Opcion Incorrecta ..." << endl;
   cout << endl;
   cout << "Introduzca Opción:";
   cin >> op;
   op = toupper(op);
 }
 return op;
}

void LeerPersona(TPersona &p) //Funcion que pregunta al usauario los datos de la persona a guardar i los almacena en variables
{  
 cout << "Nombre    : " ;
 cin  >> p.nombre;
 cout << "Apellidos1: " ;
 cin  >> p.apellido1;
 cout << "Apellidos2: " ;
 cin  >> p.apellido2;
 cout << "Teléfono  : ";
 cin  >> p.telefono;
}

void EscribirPersona(TPersona p) //Funcion que escribe en pantalla los datos de la variable
{
 cout << "Nombre             : " << p.nombre << endl;
 cout << "Apellidos          : " << p.apellido1
      << " " << p.apellido2 << endl;
 cout << "Teléfono           : " << p.telefono << endl;
}

bool confirmar_salida() //Funcion que saca al usuario de donde esta
{
 char car;
 cout << "¿Está seguro de salir (S/N)?";
 cin >> car;
 car = toupper(car);
 
return (car=='S');
}

// Algoritmos de Manejo de Ficheros de Texto
void insertarPersonaTXT(TCadena nombreFichero, TPersona p)
{
 ofstream out;
 out.open(nombreFichero,ios::app);
 // Abro el fichero para añadir
 if (out.bad())
 { // El fichero no existe ... lo creo
   out.open(nombreFichero);
 }
 EscribePersonaFicheroTXT(out,p);
 out.close();
}

void listarAgendaTXT(TCadena nombreFichero)
{ ifstream in;
 TPersona persona;
 in.open(nombreFichero);
 if (in.bad())
 {
   cout <<  "Error al abrir el fichero: "
        << nombreFichero << endl;
 }
 else  
{
   LeePersonaFicheroTXT(in,persona);
   while (!in.eof())
   {
     EscribirPersona(persona);
     LeePersonaFicheroTXT(in,persona);
     pausa();
   }
   in.close();
 }
}
void LeePersonaFicheroTXT(ifstream &fichero, TPersona &p)
{
 fichero  >> p.nombre;
 fichero  >> p.apellido1;
 fichero  >> p.apellido2;
 fichero  >> p.telefono;
}
void EscribePersonaFicheroTXT(ofstream &fichero, TPersona p)
{
 fichero << p.nombre    << SP;
 fichero << p.apellido1 << SP;
 fichero << p.apellido2 << SP;
 fichero << p.telefono  << endl;
}


Bueno mi problema es que no entiendo varias partes de el código y me gustaría que me alludaran a comprender :D

Duda1: "const char FINCAD = char(0);" Como es que se declara esta variable se que es una constante del tipo char pero eso de  "= char(0);" que significa por que hace eso???????????

Duda2: "typedef char TCadena[MAXCAD+1];" Esta linea tampoco la entiendo bien creo que es la asignacion de una varible pero no me queda claro que es lo que hace

Duda3: "void EscribirPersona(TPersona p);" En la declaración de esta función por que entre "TPersona" y "p" no hay una coma??????
( según creo eso es para que al llamar a esa variable en la función  no se tenga que escribir el nombre completo y solo se escriba la "p" pero no estoy seguro corrijanme si estoy mal)

Duda4: "void LeerPersona(TPersona &p);" En esta función por que el  parámetro "p" tiene una "&" antes?????????

Duda5: "TPersona p;;" En verdad esta linea no la entiendo nada :S si aguien me pudiera iluminar un poco en porque el doble punto y coma al final y que es lo que hace

Duda6: "TCadena nomFich;" Igual como la anterior pero sin el doble punto y como pero que hace???????????

Bueno seria dos y agradecería mucho su ayuda y sus respuestas desde ya muchísimas gracias y se que mis dudas pueden ser tontas pero es que ya busque y busque en el tutorial y no viene nada de eso :'( no lo explica :'(

rir3760

Cita de: migcv en  7 Noviembre 2012, 08:29 AMDuda1: "const char FINCAD = char(0);" Como es que se declara esta variable se que es una constante del tipo char pero eso de  "= char(0);" que significa por que hace eso?
Construye un carácter con el valor cero.

Cita de: migcv en  7 Noviembre 2012, 08:29 AMDuda2: "typedef char TCadena[MAXCAD+1];" Esta linea tampoco la entiendo bien creo que es la asignacion de una varible pero no me queda claro que es lo que hace
No es una declaración, es la definición de un tipo. En ella se indica que el uso de "TCadena" sera equivalente a "char [MAXCAD+1]", a partir de esa definición puedes utilizar:
Código (cpp) [Seleccionar]
TCadena cadena_1;
char cadena_2[MAXCAD+1];

Para declarar dos variables cuyo tipo es el mismo: array de 81 elementos de tipo "char".

Cita de: migcv en  7 Noviembre 2012, 08:29 AMDuda3: "void EscribirPersona(TPersona p);" En la declaración de esta función por que entre "TPersona" y "p" no hay una coma?
Porque como indicas es una declaración y en ella se debe indicar el tipo de cada uno de los argumentos a utilizar cuando se llame. En una declaración el nombre de los parámetros es opcional. Por ejemplo:
Código (cpp) [Seleccionar]
void EscribirPersona(TPersona);
void EscribirPersona(TPersona p);

Tienen el mismo efecto: indican que la función con el nombre "EscribirPersona" no retorna un valor y al llamarse se debe pasar un argumento de tipo "TPersona".

Cita de: migcv en  7 Noviembre 2012, 08:29 AMDuda4: "void LeerPersona(TPersona &p);" En esta función por que el  parámetro "p" tiene una "&" antes?
Porque indica que el argumento sera pasado por referencia. Eso lo debes ver mas adelante en el curso, en el apartado sobre funciones (si estas empezando no entiendo porque ya estas tratando con funciones, te vas a complicar la vida).

Cita de: migcv en  7 Noviembre 2012, 08:29 AMDuda5: "TPersona p;;" En verdad esta linea no la entiendo nada :S si aguien me pudiera iluminar un poco en porque el doble punto y coma al final y que es lo que hace
El punto y coma de mas no hace nada, es un error.

Cita de: migcv en  7 Noviembre 2012, 08:29 AMDuda6: "TCadena nomFich;" Igual como la anterior pero sin el doble punto y como pero que hace?
Declara un objeto cuyo nombre es "nomFich" y su tipo es "TCadena". Si revisas tu primera pregunta te daras cuenta que esa variable se puede declarar de dos formas (por supuesto equivalentes):
Código (cpp) [Seleccionar]
TCadena nomFich;

// O tambien
char nomFich[MAXCAD+1];

La variable "nomFich" es un array de caracteres cuyo objetivo es almacenar una cadena de caracteres que indique el nombre del fichero (archivo).

Cita de: migcv en  7 Noviembre 2012, 08:29 AMBueno seria dos y agradecería mucho su ayuda y sus respuestas desde ya muchísimas gracias y se que mis dudas pueden ser tontas pero es que ya busque y busque en el tutorial y no viene nada de eso :'( no lo explica :'(
Si estas completamente seguro que ese tutorial es deficiente lánzalo a la basura y empieza con otro, puedes revisar recomendaciones utilizando el motor de búsqueda de los foros.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

migcv

Bueno rir3760 primero que nada muchas gracias por tomarte la molestia de responder mis torpes dudas XD pero hay unas cosas que todavía no me quedan muy claro
1.-Por que en mi duda 5 dices que el doble punto y coma es un error???????? si el compilador lo ejecuta y si lo quito no lo compila bien???????
2.-En la duda1 que significa que construye un carácter con el valor cero osea que como para que hace eso ???????
seria todo y de nuevo muchas gracias por la paciencia ;)

BatchianoISpyxolo

@migcw:

La terminación de las instrucciones con doble piunto y coma es una sintaxis incorrecta.

Y en lo segundo el char '\0' representa la terminación de un string o cadena de caracteres en memoria. Porque si guardas un string en memoria y luego lo quieres mostrar, en algún sitio tiene que terminar.
Puede que desees aprender a programar desde 0: www.espascal.es

do-while

Cita de: BatchianoISpyxolo en  8 Noviembre 2012, 15:26 PM
@migcw:

La terminación de las instrucciones con doble piunto y coma es una sintaxis incorrecta.

Falso, no es incorrecto, solo estas incluyendo una sentencia vacia al final de la linea. Aunque sobra (una sentencia vacia no realiza ninguna accion), la sintaxis no es incorrecta. De hecho puedes poner, uno detras de otro, todos los punto coma que quieras.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Cita de: migcv en  8 Noviembre 2012, 06:22 AM1.-Por que en mi duda 5 dices que el doble punto y coma es un error? si el compilador lo ejecuta y si lo quito no lo compila bien?
Como ya comento BatchianoISpyxolo el punto y coma se utiliza como terminador de sentencia. Si utilizas dos no es un error pero el segundo esta de mas, no es necesario y un compilador no puede quejarse por eso (alguna otra cosa estará mal en tu programa).

Cita de: migcv en  8 Noviembre 2012, 06:22 AM2.-En la duda1 que significa que construye un carácter con el valor cero osea que como para que hace eso ?
Utilizar "char(0)" indica que, en base al valor 0 de tipo "signed int", se genere el valor 0 de tipo "char". De esa forma coinciden los tipos de la variable y el valor inicial.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language