resulta que este año vi un ejercicio muy bueno en un curso programacion, y decidi hacerlo ya que se ve muy entrenido, ya que involucra usar varias librerias y libreria de windows.h para posicionar el cursor en la consola, asi mismo usar Sleep(), para realizar una pausa, otro punto importante es usa libreria time.h que se usa para conocer la hora del sistema, aunque se haya realizado con if la seleccion del mes ya que asi es facil su comprension pero lo recomendable seria usar enum junto a un puntero para que sea mas frexible el programa, otra cosa es la funcion que genera el numeros en letras menciono otra vez que se hizo con if para que fuera rapido su compresion aunque se podia usar un un puntero y sobrecargar la funcion para que fuera mas rapido su funcionamiento, para capturar el teclado se uso getch(); junto el codigo hex del teclado para capturar interrupcion en este caso se uso el F1, F2, F3,f4, y ESC.
Esto fue probado en el editor de codeblocks 8.02 y 10.5 lo puedes bajar de www.codeblocks.org o aqui, y el compilador que fue usar es MinGW32 version 2 4.6.1 fue bajado de http://tdm-gcc.tdragon.net/download en este caso yo selecione el paquete de tdm-gcc-4.6.1 que es de 32 bits con 64 bits cruzado(x86-64) deberia de funcionar en cualquier computadora, bueno tambien lo probe en visual++-2005, y borland 5.5(no funcioan con otro borlan inferior a 5.5), una vez descargado tdm-gcc-4.6.1 debemos de selecionarlo y al momento de instarlo debemos de hacerlo en el directorio de C:\MinGW32 , ahora lo puedes compilar.
Luego deberá mostrar en la parte inferior de la pantalla el mensaje “Hacer otro F1 Salir Esc”, en el cual deberá presionar una de las teclas de opción; si en caso presiona otra tecla mostrará el mensaje “Presione una de las teclas indicadas.”, y deberá seguir esperando que presione la tecla de opción. Si en caso se desea “Hacer otro”, le solicitará de nuevo los datos; si se desea “Salir”, regresara al menú principal para que elija otra opción. Después de tres veces que no escoja una opción valida el sistema terminará. Cuando seleccione una opción valida el sistema almacenará los datos en un archivo llamado: “cheques.bin”. Cuando el sistema almacene los datos deberá también almacenar los índices para el campo “No. Cheque”, que será utilizado para la búsqueda.
OPCION 2, BUSQUEDA DE CHEQUE. (F2)
Al momento de presionar la tecla F2, el sistema deberá de solicitar el número de cheque a buscar. Cuando el usuario ingrese el número de cheque, el sistema lo buscará en el archivo de índices, el cual estará ordenado de forma ascendente, y tendrá la referencia al registro almacenado en el archivo “cheques.bin”, y si lo encuentra deberá mostrar el contenido del mismo en una pantalla similar a la opción 1, si no encuentra el cheque el sistema deberá de indicar con un mensaje que no se encontró el cheque.
Luego deberá mostrar en la parte inferior de la pantalla el mensaje “Buscar otro F1 Salir Esc”, en el cual deberá presionar una de las teclas de opción; si en caso presiona otra tecla mostrará el mensaje “Presione una de las teclas indicadas.”, y deberá seguir esperando que presione la tecla de opción. Si en caso se desea “Buscar otro”, le solicitará de nuevo el número de cheque a buscar; si se desea “Salir”, regresara al menú principal para que elija otra opción.
OPCION 3, ELIMINACIÓN DE CHEQUES. (F3)
Al momento de presionar la tecla F3, el sistema deberá de solicitar el número de cheque a eliminar. Cuando el usuario ingrese el número de cheque, el sistema lo buscará en el archivo índice y obtendrá la referencia al registro almacenado “cheques.bin”, y si lo encuentra deberá mostrar el contenido del mismo en una pantalla similar a la opción 1.
Luego deberá mostrar en la parte inferior de la pantalla el mensaje “Eliminar F1 Salir Esc”, en el cual deberá presionar una de las teclas de opción; si en caso presiona otra tecla mostrará el mensaje “Presione una de las teclas indicadas.”, y deberá seguir esperando que presione la tecla de opción. Si en caso se desea “Eliminar” lo pondrá eliminado (lógico carnet par, físico carnet impar); si se desea “Salir”, regresara al menú principal para que elija otra opción.
OPCION 4, CARGAR ARCHIVO DE ENTRADA. (F4)
Al momento de presionar la tecla F4, el sistema deberá de buscar el archivo “cheques.bin”, y deberá de crear el archivo indexado de registros “cheques.idx”, tome en cuenta que el archivo de entrada puede tener cientos de registros. Luego de crear el archivo de índice deberá de solicitar un número de cheque, este número de cheque deberá de ser buscado en el archivo “cheques.bin” directamente, y deberá mostrar el tiempo que le tomo al sistema encontrarlo “Tiempo de búsqueda en archivo BIN: XXXX minutos”, en seguida el sistema empezará a buscar el cheque en el archivo indexado y luego deberá mostrar el tiempo de búsqueda por medio del mensaje: “Tiempo de búsqueda en archivo IDX: XXXX minutos”. Por ultimo mostrara el cheque encontrado con el formato presentado en la opción 1.
OPCION 5, SALIDA. (ESC)
Presionando ESC del menú principal se podrá salir del programa.
link para bajarlo: Proyecto Generar Cheque – ChocCac
pass: www.mynorrene.choccac.com
codigo:
/* Autor: Mynor Rene choc Cac 01-Mayo-2012 Guatemala, San Cristobal Verapaz. */ #include <windows.h> #include <conio.h> #include <time.h> #include <sstream> #include <string.h> #include <iostream> #include <stdio.h> using namespace std; typedef struct{ char NumCheq[10];//numero de cheque char LugaFe[60];//lugar y fecha char nombrePag[60];//nombre paguese a: int Qtzl; //cantidad de que se va pagar char InsQtzl[255];// esto cantidad que se pago en letras char NomEstu[255]; char NumCar[255]; }ChIndex; void F_1(void); void F_3(void); void F_2(void); std::string sistfech(); std::string G_Nums(int x); void posicionxy(int x, int y); char nombre_fichero[] = "Cheques.bin"; FILE *abrir_fichero_b(char cadena[], int metodo); //int asd; int main() { FILE *fp; int ch; fp = abrir_fichero_b(nombre_fichero,0); if( fp ){ fclose(fp); } else { cout << "Error archivo no existe\n"; cout << "Presiona cualquier tecla para continuar.... y Crear el Archivo"; fp = abrir_fichero_b(nombre_fichero,1); fclose(fp); cin.get();cin.get(); } do{ system("cls"); system("color A0"); cout << "1)Emision de cheque F1\n"; cout << "2)Busqueda de cheque F2\n"; cout << "3)Eliminacion de cheque F3\n"; cout << "4)Cargar un archivo de Entrada F4\n"; cout << "5)Para Salir Teclee ESC\n"; cout << "Que opcion eliges." << endl; cin.clear(); switch(ch = getch()) { cin.clear(); case '\x3b': { system("cls"); system("color F0"); F_1(); posicionxy(1,20);cout <<"Presiona Cualquier Tecla para Regresar al Menu"; cin.get();cin.get(); } break; case '\x3c': { system("cls"); system("color E0"); F_2(); posicionxy(1,20);cout <<"Presiona Cualquier Tecla para Regresar al Menu"; cin.get();cin.get(); } break; case '\x3d': { system("cls"); system("color 30"); F_3(); posicionxy(1,20);cout <<"Presiona Cualquier Tecla para Regresar al Menu"; cin.get();cin.get(); } break; case '\x3e': { system("cls"); system("color B0"); posicionxy(1,20);cout <<"Presiona Cualquier Tecla para Regresar al Menu"; cin.get();cin.get(); } break; } }while (ch != '\x1b'); return 0; } void F_1(void) { FILE *fp; ChIndex aux; char convertidor[255]; char convertidor1[255]; int temp,ays; std::string capturador; std::string capturador1; char cad[60]; fp=abrir_fichero_b(nombre_fichero,2); if(!(fp)) cout << "Error de apuertura del archivo Cheques.bin"; else{ //formato de cheque: for(int x=0;x<67;x++) { posicionxy(x,1);cout << "="; } posicionxy(2,4);cout << "Cheque No.________"; posicionxy(30,4);cout << "Fecha:_______________________________ "; posicionxy(2,7);cout << "Paguese a:_____________________________________ "; posicionxy(50,7);cout << "Q._______________"; posicionxy(2,10);cout << "La Cantidad de:__________________________________________________"; posicionxy(2,12);cout << "Nombre del Estudiante:________________________________"; posicionxy(2,14);cout << "Numero de Carne:________________________________"; posicionxy(50,12);cout << "Firma:___________"; for(int x=0;x<67;x++) { posicionxy(x,16);cout << "="; } do{ if(ays>999999) { posicionxy(2,4);cout << "Cheque No.________"; posicionxy(2,4);cout << "Cheque No.ERROR!__"; Sleep(3000); posicionxy(2,4);cout << "Cheque No.________"; } posicionxy(12,4);gets(aux.NumCheq); ays = atoi(aux.NumCheq); }while(ays>999999); capturador1 = sistfech(); for(int ix=0;ix<255;ix++) convertidor1[ix]=capturador1[ix]; strcpy(aux.LugaFe,convertidor1); posicionxy(36,4);cout << aux.LugaFe; posicionxy(12,7);gets(aux.nombrePag); do{ if(aux.Qtzl>999999) { posicionxy(50,7);cout << "Q.ERROR__________"; posicionxy(50,7);cout << "Q._______________"; Sleep(3000); posicionxy(50,7);cout << "Q._______________"; posicionxy(2,10);cout << "La Cantidad de:__________________________________________________"; } posicionxy(53,7);aux.Qtzl=atoi(gets(cad)); temp = aux.Qtzl; capturador =G_Nums(temp); for(int i=0;i<255;i++) convertidor[i]=capturador[i]; strcpy(aux.InsQtzl,convertidor); posicionxy(18,10);cout << aux.InsQtzl; }while(aux.Qtzl>999999); posicionxy(25,12);gets(aux.NomEstu); posicionxy(19,14);gets(aux.NumCar); fwrite(&aux, sizeof(aux), 1, fp); fclose(fp); } } void F_3(void){ FILE *fp,*fd; ChIndex aux; int encontrado=0; char cadena[25]; cout << "Introduce el Cheque a borrar: "; gets(cadena); cout << "\n BORRANDO REGISTROS \n"; fp=abrir_fichero_b(nombre_fichero,0); if(!(fp)) cout << "\n Error de apuertura del archivo Cheques.bin\n"; else{ fd=abrir_fichero_b("IndexTemp.ibx",1); if(!(fd)) cout << "\n Error Imposible crear archivo auxiliar\n"; else{ while ((fread(&aux, sizeof(aux), 1, fp))!=0) if(stricmp(aux.NumCheq,cadena)!=0) fwrite(&aux, sizeof(aux), 1, fd); else encontrado=1; fclose(fd); } fclose(fp); if(encontrado){ system("del Cheques.bin"); system("ren IndexTemp.ibx Cheques.bin"); cout << "\nNo. Cheque BORRADO con Exito!!!\n"; } else{ system("del IndexTemp.ibx"); cout << "\nEl No. Cheque NO SE ENCONTRO, no fue borrado!!!"; } } fclose(fd);//esto lo puse } void posicionxy(int x, int y) { COORD c; c.X = x - 1; c.Y = y - 1; // SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), xc); } void F_2(void) { FILE *fp; ChIndex aux; int n; char cadena[25]; cout << "Introduce el Numero de Cheque: "; gets(cadena); cout << "Buscando cheque\n"; fp=abrir_fichero_b(nombre_fichero,0); if(!(fp)) cout << "Error de apuertura del archivo Cheques.bin"; else{ while ((n=fread(&aux, sizeof(aux), 1, fp))!=0 && stricmp(aux.NumCheq,cadena)!=0); if (n==0) cout << "No existe el Cheque llamado: " << cadena; else { cout << "Cheque Encontrado encontrado....!!!\n"; //formato de cheque: for(int x=0;x<67;x++) { posicionxy(x,4);cout << "="; } posicionxy(2,6);cout << "Cheque No.____"; posicionxy(30,6);cout << "Fecha:_______________________________ "; posicionxy(2,9);cout << "Paguese a:_____________________________________ "; posicionxy(50,9);cout << "Q._______________"; posicionxy(2,12);cout << "La Cantidad de:__________________________________________________"; posicionxy(2,14);cout << "Nombre del Estudiante:________________________________"; posicionxy(2,16);cout << "Numero de Carne:________________________________"; posicionxy(50,14);cout << "Firma:___________\n"; for(int x=0;x<67;x++) { posicionxy(x,17);cout << "="; } posicionxy(12,6);cout << aux.NumCheq; posicionxy(36,6);cout << aux.LugaFe; posicionxy(12,9);cout << aux.nombrePag; posicionxy(53,9);cout << aux.Qtzl; posicionxy(18,12);cout << aux.InsQtzl; posicionxy(25,14);cout << aux.NomEstu; posicionxy(19,16);cout << aux.NumCar; } } fclose(fp);//esto lo puse } FILE *abrir_fichero_b(char cadena[], int metodo){ FILE *x; switch(metodo){ case 0: x = fopen(cadena,"rb"); break; case 1: x = fopen(cadena,"wb"); break; case 2: x = fopen(cadena,"ab"); break; case 3: x = fopen(cadena,"r+b"); break; } return x; } std::string G_Nums(int x) { std::string acumula=""; if((x<1)||(x>9999)){posicionxy(18,10);cout << "INGRESA UN NUMERO DEL 1 AL 999999";} else { if(x>=9000) {acumula += "NUEVE MIL " ;x=x-9000;} if(x>=8000) {acumula += "OCHO MIL " ;x=x-8000;} if(x>=7000) {acumula += "SIETE MIL " ;x=x-7000;} if(x>=6000) {acumula += "SEIS MIL " ;x=x-6000;} if(x>=5000) {acumula += "CINCO MIL " ;x=x-5000;} if(x>=4000) {acumula += "CUATRO MIL ";x=x-4000;} if(x>=3000) {acumula += "TRES MIL " ;x=x-3000;} if(x>=2000) {acumula += "DOS MIL " ;x=x-2000;} if(x>=1000) {acumula += "MIL " ;x=x-1000;} if(x>=900) {acumula += "NOVECIENTOS " ;x=x-900;} if(x>=800) {acumula += "OCHOCIENTOS " ;x=x-800;} if(x>=700) {acumula += "SETECIENTOS " ;x=x-700;} if(x>=600) {acumula += "SEISCIENTOS " ;x=x-600;} if(x>=500) {acumula += "QUINIENTOS " ;x=x-500;} if(x>=400) {acumula += "CUATROCIENTOS " ;x=x-400;} if(x>=300) {acumula += "TRESCIENTOS " ;x=x-300;} if(x>=200) {acumula += "DOSCIENTOS " ;x=x-200;} if(x>100) {acumula += "CIENTO " ;x=x-100;} if(x==100) {acumula += "CIEN" ;x=x-100;} if(x>90) {acumula +"NOVENTA Y " ;x=x-90; } if(x==90) {acumula += "NOVENTA" ;x=x-90; } if(x>80) {acumula += "OCHENTA Y " ;x=x-80; } if(x==80) {acumula += "OCHENTA" ;x=x-80; } if(x>70) {acumula += "SETENTA Y " ;x=x-70; } if(x==70) {acumula += "SETENTA" ;x=x-70; } if(x>60) {acumula += "SESENTA Y " ;x=x-60; } if(x==60) {acumula += "SESENTA" ;x=x-60; } if(x>50) {acumula += "CINCUENTA Y " ;x=x-50; } if(x==50) {acumula += "CINCUENTA" ;x=x-50; } if(x>40) {acumula += "CUARENTA Y " ;x=x-40; } if(x==40) {acumula += "CUARENTA" ;x=x-40; } if(x>30) {acumula += "TREINTA Y " ;x=x-30; } if(x==30) {acumula += "TREINTA" ;x=x-30; } if(x>20) {acumula += "VEINTI" ;x=x-20; } if(x==20) {acumula += "VEINTE" ;x=x-20; } if(x>=16) {acumula += "DIECI" ;x=x-10; } if(x==15) {acumula += "QUINCE" ;x=x-15; } if(x==14) {acumula += "CATORCE" ;x=x-14; } if(x==13) {acumula += "TRECE" ;x=x-13; } if(x==12) {acumula += "DOCE" ;x=x-12; } if(x==11) {acumula += "ONCE" ;x=x-11; } if(x==10) {acumula += "DIEZ" ;x=x-10; } if(x==9) {acumula += "NUEVE" ;x=x-9; } if(x==8) {acumula += "OCHO" ;x=x-8; } if(x==7) {acumula += "SIETE" ;x=x-7; } if(x==6) {acumula += "SEIS" ;x=x-6; } if(x==5) {acumula += "CINCO" ;x=x-5; } if(x==4) {acumula += "CUATRO" ;x=x-4; } if(x==3) {acumula += "TRES" ;x=x-3; } if(x==2) {acumula += "DOS" ;x=x-2; } if(x==1) {acumula += "UNO" ;x=x-1; } } return acumula; } std::string sistfech() { struct tm *tiempo; int dia; int mes; int anio; std::string fecha; std::string convnum,convnum1; std::stringstream salida, salida1; char mes2[20]; time_t fecha_sistema; time(&fecha_sistema); tiempo=localtime(&fecha_sistema); anio=tiempo->tm_year + 1900; mes=tiempo->tm_mon + 1; if(mes==1){strcpy(mes2,"Enero");} if(mes==2){strcpy(mes2,"Febrero");} if(mes==3){strcpy(mes2,"Marzo");} if(mes==4){strcpy(mes2,"Abril");} if(mes==5){strcpy(mes2,"Mayo");} if(mes==6){strcpy(mes2,"Junio");} if(mes==7){strcpy(mes2,"Julio");} if(mes==8){strcpy(mes2,"Agosto");} if(mes==9){strcpy(mes2,"Septiembre");} if(mes==10){strcpy(mes2,"Octubre");} if(mes==11){strcpy(mes2,"Noviembre");} if(mes==12){strcpy(mes2,"Diciembre");} dia=tiempo->tm_mday; salida << dia; convnum = salida.str(); fecha += convnum; fecha += " de "; fecha += mes2; fecha += " del "; salida1 << anio; convnum1 = salida1.str(); fecha += convnum1; fecha +="."; return fecha; }
para mas informacion o duda puedes escribirme a mi correo: mynorrene@choccac.com
nota: Bueno resultqueqye hay preguntas por correo copie la pregunta tal cual como me lo hicieron;
¿Comoc puedeo agregar mas datos al cheque?
1. typedef struct puedes agrear otros datos del tipo que deseas y llamargo en la funcion.
para la segunda pregunta.
¿Modificar datos o unos datos ?
2. para modificar un dato puedes buscar por el numero de cheque o por el nombre del usuario(aunque esto no te lo recomienddo ya que puede ser que exista dos personas con el mismo nombre, pero que sean diferentes), hacer una funcion que pregunte que dato modificar y seleciones con algun captura de tecla para modificar por que me imagino aunque no entendi tu pregunta bien, que quieres modificar todo o algun dato, puedes selecionar un dato con swicht() capturando el teclado y volver a guardar todo ahora usando struct aux.
respuesta a pregunta 3:
¿Puedo Compilarlo en Linux?
3. Resulta que hace como dos años yo use el ncurses.h en gnu/debiam para posicionar el cursor eje x oyy para usar Sleep() puedes usar stdio.h instales lo paquetes y puedes usarlo.
bueno esto funcional pero puedes pasarlo en visual c++, y borlan 5.5
tengo que realizar un proyecto y es exactamente igual lo que me pidieron en la U, pero quiero aprender hacerlo.