elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Programación C/C++ / Re: Problema char en C++ en: 13 Agosto 2016, 14:57 pm
Hola acronimo!.

Estas programando en C..

en el printf, fijate que pusiste %c y eso es para caracter.. Pero, a la llamada, tendrias que agregarle variable[0] para mostrar un caracter..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main ()
  5.    {
  6.    int i;
  7.    char variable [ ] = {"Texto1"};
  8.    char* variable2 = "Texto2";
  9.    printf ("El texto de variable es: %s\n", variable);         //muestro todo el texto
  10.    printf ("El texto de variable2 es %s\n", variable2);       //muestro todo el texto
  11.    printf ("El texto de variable es: %c\n", variable[0]);     //muestro el primer caracter
  12.    printf ("El texto de variable2 es %c\n", variable2[0]);   //muestro el primer caracter
  13.  
  14.  
  15.    return 0;
  16. }
2  Programación / Programación C/C++ / Re: Uso de Ficheros y LSE en C en: 13 Agosto 2016, 14:40 pm
No quiero abrir un tema nuevo.. Pero queria consultar como puedo mostrar esta agenda de una forma mas "elegante" con mejor grafico, que se vea mejor.. Que recomiendan para ello?. Lei por ahi de allegro, opengl, pero quizas eso es mas para juego.. Me dijeron de la biblioteca graphics, pero no me la recomendaron.. GRACIAS GENTE!!
3  Programación / Programación C/C++ / Re: Uso de Ficheros y LSE en C en: 10 Agosto 2016, 16:16 pm
Dejo el codigo terminado a mi entender.. O quizas, me faltaria dividorlo en cabeceras..
Algun consejo para esto?. Gracias..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #define ANCHO_PANTALLA 80 //Maximo de caracteres en la pantalla
  6. #define Max 26 //Arreglo Indice Apellido
  7.  
  8.  
  9. typedef struct TipoFecha{
  10. int dia;
  11. int mes;
  12. int año;
  13. }TFecha;
  14.  
  15. typedef struct TipoAmigo{
  16. char apellido[18];
  17. char nombre[18];
  18. char email[21];
  19. char celular[13];
  20. TFecha fecNac;
  21. bool flag;
  22. }Amigo;
  23.  
  24. typedef struct ElementoLista{
  25.  Amigo  dato;
  26.  struct ElementoLista *sig;
  27. }Persona;
  28.  
  29. typedef struct ListaIdentificar {
  30.    Persona *inicio;
  31. }Lista;
  32.  
  33. typedef struct {
  34. char letra;
  35. int pos;
  36. int cantidad;
  37. }Indice;
  38.  
  39. const char *arrMes[12]={"ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"};
  40. //const char arrMes[12]={'enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'};
  41.  
  42.  
  43. //MENU PRINCIPAL
  44. int menu(char *nombreArchivo,char *nombreArchivoIndice, Lista *lista);
  45. //devuelve la opcion elegido
  46. int mostrarMenu();
  47.  
  48. //Guarda contacto en el archivo
  49. void guardarContacto(Amigo persona, char *nombreArchivo);
  50.  
  51. void pausarPrograma();
  52.  
  53. void limpiar (char *cadena);
  54.  
  55. //----Guarda los datos en el archivo
  56.  
  57.  
  58. int actualizarArchivo(char *nombreArchivo,Lista *lista);
  59. //Pasa los datos de la lista al archivo
  60. int listaArchivo(Lista *lista, char *nombreArchivo);
  61. //Pasa los datos del archivo a la lista
  62. void archivoLista(char *NombreArchivo, Lista *lista);
  63. //Une 2 listas y las ordena
  64. int unirListas(Lista *lista,Lista *aux);
  65. //Borra los datos y libera la memoria
  66. int destruir(Lista *lista);
  67. //Suprime un dato de la lista
  68. int suprimirInicio (Lista *lista); //de acuerdo al campo flag=='*'
  69. //devuelve el tamaño del archivo
  70. int tamanioArchivo(char *nombreArchivo);
  71. //Muestra los datos guardados en el archivo
  72. void mostrarAgenda(char *nombreArchivo);
  73.  
  74. int borrarContactoArchivo(char *nombreArchivo, int pos);
  75.  
  76. Amigo pedirAmigoBuscar();
  77.  
  78. void mostrarBuscadoArchivo(char *nombreArchivo,Amigo buscoAmigo);
  79.  
  80.  
  81.  
  82. /*
  83. -------FUNCIONES MANEJO DE LISTA DINAMICA (Area de Intercambio)
  84. */
  85. //Inserta un dato al inicio de la lista en la memoria dinamica
  86. int insertarInicio (Lista *lista,Amigo p);
  87. //devuelve los datos de un amigo que llena el usuario
  88. Amigo pedirAmigo();
  89. //Pide la fecha y la devuelve
  90. TFecha ingresarFecha();
  91. //Duvuelve el maximo de dias que se pueden ingresar, dado un mes y un año
  92. int topeDias(int mes,int año);
  93. //agrega un amigo a la lista
  94. int agregarAmigo(Lista *lista,char *nombreArchivo);
  95. //revisa la lista para ver si encuentra datos
  96. int estaAmigoLista(Lista *l,Amigo p);
  97. //revisa el archivo para ver si encuentra datos
  98. int estaAmigoArchivo(char *nombreArchivo,Amigo p);
  99. //actualiza el archivo. Agrega datos de la lista y ordena el archivo
  100. //ordena la lista por apellido y nombre
  101. void ordenar(Lista *lista);
  102. //borra un contacto de la lista
  103. int borrarContactoLista(Lista *lista, int pos);
  104. //Muestra un amigo de acuerdo a unos datos dados
  105. void mostrarBuscadoLista(Lista *lista,Amigo buscoAmigo);
  106. //Muestra los apellido que comiencen con una dada letra
  107. void mostrarApellidoInicialLista(Lista *lista, char car);
  108.  
  109.  
  110. //Funciones de Muestra
  111. //Muestra un titulo con los datos de amigo (tipo Tabla)
  112. void tipoTabla();
  113. //Muestra un titulo con los datos de indice (tipo Tabla)
  114. void tipoTablaIndice();
  115. //Muestra los datos de la Lista
  116. void mostrarDatos(Lista *lista);
  117. //Muestra los datos de un amigo
  118. void mostrarAmigo(Amigo p);
  119. //Muestra un titulo en el medio
  120. void mostrarTituloMenu(char *titulo);
  121. //Muestra un mensaje de error
  122. void mostrarMensajeCentro(char *msj);
  123. //Muestra los datos del archivo indice
  124. void mostrarArchivoIndice(char* nombreArchivoIndice);
  125. //Muestra los datos de un elem del archivo indice
  126. void mostrarLetra(Indice indice);
  127.  
  128.  
  129. //Muestra los apellidos que comiencen con una letra "x"
  130. //dados una posicion y la cantidad a mostrar, se mueve en el archivo principal y muestra los datos
  131. void mostrarArchivoApellido(char *nombreArchivo,int pos,int cant);
  132. /*Listar amigos cuyo apellido comienza con una determinada letra.*/
  133. void mostrarApellidoInicialArchivo(char *nombreArchivo,char *nombreArchivoIndice,char c);
  134. //Inicializa el arreglo indice
  135. void inicializar(Indice indice[]);
  136. //Pasa del arreglo al arch
  137. void arregloArchivoIndice(char *nombreArchivoIndice,Indice indice[]);
  138. //Guarda un dato en el archivo INDICE
  139. void guardarIndice(char *nombreArchivoIndice,Indice ind);
  140. //Se forma el archivo indice
  141. void formarIndice(char *nombreArchivo,char *nombreArchivoIndice);
  142. /*
  143. Listar amigos que cumplen años un determinado mes: el mes será ingresado por
  144. el usuario. Mostrar los registros en formato tabla.
  145. */
  146.  
  147. void mostrarCumpleMesLista(Lista *lista,int mes);
  148.  
  149. void mostrarCumpleMesArchivo(char *nombreArchivo,int mes);
  150.  
  151. int main(){
  152. //boolean toReturn=true;
  153. char nombreArchivo[12]= "agenda.bin";
  154. char nombreArchivoIndice[12]= "indice.bin";
  155. Lista *lista;
  156. if ((lista = (Lista *) calloc (1,sizeof(Lista))) == NULL){
  157.    return false;
  158. }
  159. menu (nombreArchivo,nombreArchivoIndice,lista);
  160. return true;
  161. }
  162.  
  163.  
  164.  
  165. int mostrarMenu(){
  166. int opc;
  167. char cadena[10];
  168. do{
  169. mostrarTituloMenu("MENU GENERAL");
  170. printf("\n1) Agregar Amigo al Area de transacciones.");
  171. printf("\n2) Mostrar Area de transacciones.");
  172. printf("\n3) Actualizar Archivo agenda.");
  173. printf("\n4) Mostrar Archivo agenda.");
  174. printf("\n5) Mostrar contactos con la inicial ""x"" en el apellido.");
  175. printf("\n6) Mostrar contactos que cumplan años determinado mes.");
  176. printf("\n7) Buscar contacto.");
  177. printf("\n8) Borrar contacto.");
  178. printf("\n9) Eliminar Archivos.");
  179. printf("\n10) Salir.");
  180. printf("\n\nElige una opcion: ");
  181. fgets(cadena,10,stdin);
  182.        sscanf(cadena,"%i",&opc);
  183.        //scanf("%d",&opc);
  184. }while (opc<1 || opc>10);
  185. return opc;
  186. }
  187.  
  188. void mostrarTituloMenu(char *titulo){
  189. system("cls");
  190.    printf("%*s\n\n\n", ANCHO_PANTALLA/2 + strlen(titulo)/2, titulo);
  191. }
  192.  
  193. void mostrarMensajeCentro(char *msj){
  194.    printf("\n\n\n\n\n%*s\n\n\n", ANCHO_PANTALLA/2 + strlen(msj)/2, msj);
  195. }
  196.  
  197. void mostrarMensajeAviso(char *msj){
  198.    printf("\n\n%*s\n\n", ANCHO_PANTALLA/2 + strlen(msj)/2, msj);
  199. }
  200.  
  201. void presUnaTecla(){
  202. mostrarMensajeCentro("Presione ENTER para continuar.");
  203. while(getchar() != '\n');
  204.    setbuf(stdin, NULL);
  205. }
  206.  
  207.  
  208. int menu(char *nombreArchivo,char *nombreArchivoIndice, Lista *lista){
  209. int pos,opc,mes;
  210. char car[3],aux;
  211. tipoTablaIndice();
  212. mostrarArchivoIndice(nombreArchivoIndice);
  213. pausarPrograma();
  214. Amigo amigoBuscar;
  215.    do{
  216. opc=mostrarMenu();
  217.    switch (opc){
  218.     case 1:
  219.     if(!agregarAmigo(lista,nombreArchivo)){
  220. mostrarMensajeCentro("Hubo un error. Elemento duplicado");
  221. }else{
  222. printf("\n\nSe ha hecho correctamente");
  223.     ordenar(lista);
  224. }
  225. break;
  226. case 2:
  227. mostrarTituloMenu("AMIGOS EN AREA DE TRANSACCIONES");
  228. if(lista->inicio!=NULL){
  229. tipoTabla();
  230. mostrarDatos(lista);
  231. printf("\n\n\n\n");
  232. }else
  233. mostrarMensajeCentro("Lista Vacia.");
  234. break;
  235. case 3:
  236. if (actualizarArchivo(nombreArchivo,lista)!=false){
  237. formarIndice(nombreArchivo,nombreArchivoIndice);
  238. (destruir(lista)) ? mostrarMensajeAviso("Se actualizo el archivo y se borro la lista.") : mostrarMensajeAviso("Hubo un problema");
  239. }
  240. break;
  241. case 4:
  242. if(tamanioArchivo(nombreArchivo)!=0){
  243. mostrarTituloMenu("AMIGOS EN ARCHIVO");
  244. mostrarAgenda(nombreArchivo);
  245. printf("\n\n\n\n");
  246. }else{
  247. mostrarMensajeCentro("Archivo Vacio.");
  248. }
  249. break;
  250. case 5:
  251. mostrarTituloMenu("AMIGOS POR INICIAL");
  252. do{
  253.                printf("\nIngrese una letra:");
  254.                fgets(car,3,stdin);
  255.                limpiar(car);
  256.                aux = car[0];
  257.            }while((aux <65 || (aux >90 && aux <97)|| aux >122));
  258.            if (aux >96 || aux <123) aux =aux - 32; //Si no es mayuscula, la transforma en mayuscula
  259.            printf("%c",aux);
  260. mostrarApellidoInicialArchivo(nombreArchivo,nombreArchivoIndice,aux);
  261. mostrarApellidoInicialLista(lista,aux);
  262. break;
  263. case 6:
  264. mes=pedirNombreMes();
  265. mostrarTituloMenu("CUMPLEN AÑOS EN EL MES");
  266.            printf("\nDE %s:\n\n",arrMes[mes-1]);
  267.            printf("\n\nAmigos del archivo:\n\n\n");
  268. tipoTabla();
  269. mostrarCumpleMesArchivo(nombreArchivo,mes);
  270. printf("\n\nAmigos del archivo:\n\n\n");
  271. mostrarCumpleMesLista(lista,mes);
  272. break;
  273. case 7:
  274. amigoBuscar=pedirAmigoBuscar();
  275. printf("\nAmigos del archivo:\n\n\n");
  276. tipoTabla();
  277. mostrarBuscadoArchivo(nombreArchivo,amigoBuscar);
  278. printf("\n\n\nAmigos de la lista:\n\n\n");
  279. (lista->inicio!=NULL) ? mostrarBuscadoLista(lista,amigoBuscar) : mostrarMensajeAviso("Lista Vacia.");
  280. break;
  281. case 8:
  282.    mostrarTituloMenu("BORRAR AMIGO");
  283. if((tamanioArchivo(nombreArchivo)==0)&&(lista->inicio==NULL)){
  284.                mostrarMensajeCentro("No hay elementos.");
  285. }else if((tamanioArchivo(nombreArchivo)!=0)&&(lista->inicio==NULL)){
  286.    printf("\nAmigos en el archivo: \n");
  287.                mostrarAgenda(nombreArchivo);
  288.                printf("\nAmigos en la lista de Transaccion: \n");
  289.                mostrarMensajeAviso("Lista Vacia");
  290.                printf("Ingrese el numero de contacto: ");
  291.                scanf("%d",&pos);
  292.                if(borrarContactoArchivo(nombreArchivo,pos)) printf("\nSe ha borrado el usuario con exito");
  293. }else if((tamanioArchivo(nombreArchivo)==0)&&(lista->inicio!=NULL)){
  294.    tipoTabla();
  295.    printf("\nAmigos en el archivo: \n");
  296.    mostrarMensajeAviso("Archivo Vacio");
  297.                printf("\nAmigos en la lista de Transaccion: \n");
  298.                mostrarDatos(lista);
  299.                printf("Ingrese el numero de contacto: ");
  300.                scanf("%d",&pos);
  301.                borrarContactoLista(lista,pos);
  302. }else{
  303.    //CONTROLAR LOS MAXIMOS Y MINIMOS
  304.    printf("\nAmigos en el archivo: \n");
  305.                mostrarAgenda(nombreArchivo);
  306.                printf("\nAmigos en la lista de Transaccion: \n");
  307.                mostrarDatos(lista);
  308.                int eleccion;
  309.                printf("\n\n\n\n\nDe que lugar quiere eliminar el amigo?");
  310.                printf("\nIngrese \t1.)Agenda. \t2)Transaccion. \t3)Salir\n");
  311.                scanf("%d",&eleccion);
  312.                if (eleccion==1){
  313.                    printf("Ingrese el numero de contacto: ");
  314.                    scanf("%d",&pos);
  315.                    if(borrarContactoArchivo(nombreArchivo,pos)) printf("\nSe ha borrado el usuario con exito");
  316.                }else if(eleccion==2){
  317.                    printf("Ingrese el numero de contacto: ");
  318.                    scanf("%d",&pos);
  319.                    borrarContactoLista(lista,pos);
  320.                }
  321. }
  322. break;
  323. case 9:
  324. remove(nombreArchivo);
  325. remove(nombreArchivoIndice);
  326. mostrarMensajeCentro("Los archivos se borraron efectivamente.");
  327. break;
  328. case 10:
  329. printf ("\nAdios");
  330. break;
  331. }
  332. //
  333. presUnaTecla();
  334. } while (opc!=10);
  335. return 0;
  336. }
  337.  
  338.  
  339.  
  340. int agregarAmigo(Lista *lista,char *nombreArchivo){
  341. Amigo amigo=pedirAmigo();
  342. bool toReturn=true;
  343. if ((estaAmigoLista(lista,amigo)||(estaAmigoArchivo(nombreArchivo,amigo))))
  344.        toReturn=false;
  345. else{
  346. insertarInicio(lista,amigo);
  347. }
  348. return toReturn;
  349. }
  350.  
  351. void limpiar (char *cadena){
  352.    char *p;
  353.    p = strchr (cadena, '\n');
  354.    if (p){
  355.        *p = '\0';
  356.    }else{
  357.        pausarPrograma();
  358.    }
  359. }
  360.  
  361. void limpiar2 (char *cadena, int largo)
  362. {
  363.  char *p;
  364.  if(strlen(cadena)>=largo){
  365.      p = strchr (cadena, '\n');
  366.      printf("\nEs p=%s\n",p);
  367.    if (p)
  368.        printf("\nAca entro\n");
  369.        *p = '\0';
  370.  }
  371.  
  372. }
  373.  
  374.  
  375. Amigo pedirAmigo(){
  376. Amigo aux;
  377. system("cls");
  378. mostrarTituloMenu("MENU DE CARGA DE DATOS");
  379. do{
  380. printf("\nIngrese el apellido de su amigo.\n");
  381.        fgets(aux.apellido,20, stdin);
  382.        limpiar(aux.apellido);
  383. }while (strlen(aux.apellido)>17);
  384. do{
  385. printf("\nIngrese el nombre de su amigo.\n");
  386.        fgets(aux.nombre,20, stdin);
  387.        limpiar(aux.nombre);
  388. }while (strlen(aux.nombre)>17);
  389. do{
  390. printf("\nIngrese el email de su amigo.\n");
  391.        fgets(aux.email,20, stdin);
  392.        limpiar(aux.email);
  393. }while (strlen(aux.email)>17);
  394. do{
  395. printf("\nIngrese el celular de su amigo.\n");
  396.        fgets(aux.celular,18, stdin);
  397.        limpiar(aux.celular);
  398. }while (strlen(aux.celular)>15);
  399. printf("\nFecha de nacimiento de su amigo:\n");
  400. aux.fecNac=ingresarFecha();
  401. aux.flag=true;
  402. //mostrarAmigo(aux);
  403. return aux;
  404. }
  405.  
  406. int esBisiesto(int a){
  407. return (a%4==0 && a%100!=0) || (a%400==0);
  408. }
  409.  
  410. TFecha ingresarFecha(){
  411. int limDias,busqueda,buffer;
  412. TFecha fecha;
  413. char cadena[10];
  414. do{
  415. printf("\nIngrese el año de nacimiento: [1900..2016]\n");
  416. fgets(cadena,6, stdin);
  417. sscanf(cadena,"%d",&fecha.año);
  418. }while ((fecha.año>2016)||(fecha.año<1900));
  419. limpiar(cadena);
  420. do{
  421. printf("\nIngrese el mes de nacimiento:\n");
  422. fgets(cadena,4,stdin);
  423. sscanf(cadena,"%d",&fecha.mes);
  424. }while ((fecha.mes>12)||(fecha.mes<1));
  425. limDias=(topeDias(fecha.mes,fecha.año));
  426. do{
  427. printf("\nIngrese el dia de nacimiento:[1..%d]\n",limDias);
  428. fgets(cadena,4, stdin);
  429. sscanf(cadena,"%d",&fecha.dia);
  430. }while ((fecha.dia>limDias)||(fecha.dia<1));
  431. return fecha;
  432. }
  433.  
  434. int topeDias(int mes,int año){
  435. if((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12)){
  436. return 31;
  437. }else if((mes==4)||(mes==6)||(mes==9)||(mes==11)){
  438. return 30;
  439. }else if((mes==2)&&esBisiesto(año)){
  440. return 29;
  441. }else{
  442. return 28;
  443. }
  444. }
  445.  
  446.  
  447. int estaAmigoLista(Lista *lista,Amigo p){
  448.  bool existe = false;
  449.  Persona *aux;
  450.  for(aux=lista->inicio; aux && !existe; aux=aux->sig){
  451.    existe = (strcmpi(aux->dato.apellido,p.apellido)==0);
  452.    existe &= (strcmpi(aux->dato.nombre,p.nombre)==0);
  453.    existe &= (strcmpi(aux->dato.email,p.email)==0);
  454.    existe &= (strcmpi(aux->dato.celular,p.celular)==0);
  455.    existe &= (aux->dato.fecNac.año==p.fecNac.año);
  456.    existe &= (aux->dato.fecNac.mes==p.fecNac.mes);
  457.    existe &= (aux->dato.fecNac.dia==p.fecNac.dia);
  458.  }
  459.  return existe;
  460. }
  461.  
  462. //revisa el archivo para ver si encuentra datos
  463. int estaAmigoArchivo(char *nombreArchivo,Amigo p){
  464. FILE *file=fopen(nombreArchivo,"rb");
  465. bool existe =false;
  466. Amigo amigo;
  467. while(!existe && fread(&amigo, sizeof(Amigo), 1, file)){
  468.    existe = (strcmpi(amigo.apellido,p.apellido)==0);
  469.    existe &= (strcmpi(amigo.nombre,p.nombre)==0);
  470.    existe &= (strcmpi(amigo.email,p.email)==0);
  471.    existe &= (strcmpi(amigo.celular,p.celular)==0);
  472.    existe &= (amigo.fecNac.año==p.fecNac.año);
  473.    existe &= (amigo.fecNac.mes==p.fecNac.mes);
  474.    existe &= (amigo.fecNac.dia==p.fecNac.dia);
  475. }
  476. fclose(file);
  477. return existe;
  478. }
  479.  
  480.  
  481.  
  482.  
  483.  
  484. int insertarInicio(Lista *lista, Amigo amigo){
  485.  int toReturn = false; // error
  486.  Persona *aux = (Persona *) malloc (sizeof (Persona));
  487.  if (aux != NULL){
  488.    aux->dato=amigo;
  489.    aux->sig=lista->inicio;
  490.    lista->inicio=aux;
  491.    toReturn = true; // error
  492.  }
  493.  return toReturn;
  494. }
  495.  
  496. void tipoTabla(){
  497. printf("%-4s %-15s %-15s %-15s %-12s %-10s\n\n","NUM","APELLIDO","NOMBRE","EMAIL","CELULAR","DD/MM/AAAA");
  498. }
  499.  
  500.  
  501. void mostrarAmigo(Amigo p){
  502. printf("%-2s %-15s %-15s %-15s %-12s %i/%i/%i\n","",p.apellido,p.nombre,p.email,p.celular,p.fecNac.dia,p.fecNac.mes,p.fecNac.año);
  503. }
  504.  
  505.  
  506. void mostrarDatos(Lista *lista){
  507. Persona *aux=lista->inicio;
  508. int i=1;
  509. while (aux){
  510. printf(" %i ",i);
  511. mostrarAmigo(aux->dato);
  512. aux=aux->sig;
  513. i++;
  514. }
  515. }
  516.  
  517.  
  518. int tamanioLista(Lista *lista){
  519. Persona *aux=lista->inicio;
  520. int cant=0;
  521. while (aux){
  522. mostrarAmigo(aux->dato);
  523. aux=aux->sig;
  524. cant++;
  525. }
  526. return cant;
  527. }
  528.  
  529. void ordenar(Lista *lista){
  530. Amigo cam;
  531. Persona *aux,*aux2,*min;
  532. min=lista->inicio;
  533. while(min){
  534. aux=min;
  535. aux2=min->sig;
  536. while(aux2!=NULL){
  537. if((strcmpi(aux->dato.apellido,aux2->dato.apellido))>0){ //se comparan apellidos
  538. aux=aux2; //se compara el nombre
  539. }else if(((strcmpi(aux->dato.apellido,aux2->dato.apellido))==0)&&((strcmpi(aux->dato.nombre,aux2->dato.nombre))>0)){
  540. aux=aux2;
  541. }
  542. aux2=aux2->sig;
  543. }
  544. cam=min->dato;
  545. min->dato=aux->dato;
  546. aux->dato=cam;
  547. min=min->sig;
  548. }
  549.  
  550. }
  551.  
  552.  
  553. int destruir (Lista *lista){
  554.    bool toReturn=false;
  555.    while (lista->inicio){
  556.        suprimirInicio (lista);
  557.    }
  558.    if(lista->inicio==NULL) toReturn=true;
  559.    return toReturn;
  560. }
  561.  
  562.  
  563.  
  564. /* eliminación al inicio de la lista */
  565. int suprimirInicio (Lista *lista){
  566. // ¿Por qué -1? si no hace nada lo lógico sería retornar 0, equivalente natural de false
  567. bool   toReturn = false;
  568. if (lista->inicio){
  569. Persona *sig = lista->inicio->sig;
  570. free(lista->inicio);
  571. lista->inicio = sig;
  572. toReturn = true; // ¿Por qué 0? siguiendo el planteamiento análogo debería ser 1
  573. }
  574. return toReturn;
  575. }
  576.  
  577.  
  578. int listaArchivo(Lista *lista, char *nombreArchivo){
  579.    bool toReturn=false;
  580. if(lista->inicio){
  581. Persona *aux=lista->inicio;
  582. while (aux){
  583. if(aux->dato.flag){
  584. guardarContacto(aux->dato,nombreArchivo);
  585. aux=aux->sig;
  586. }
  587. }
  588. toReturn=true;
  589. }
  590. return toReturn;
  591. }
  592.  
  593.  
  594. int unirListas(Lista *lista,Lista *aux){
  595.    bool toReturn=false;
  596. if(aux){
  597. Persona *recorrer=aux->inicio;
  598. while(recorrer){
  599. insertarInicio(lista,recorrer->dato);
  600. recorrer=recorrer->sig;
  601. }
  602. ordenar(lista);
  603. toReturn=true;
  604. }
  605. return toReturn;
  606. }
  607.  
  608. int tamanioArchivo(char *nombreArchivo){
  609. FILE *file=fopen(nombreArchivo,"ab");
  610. fseek(file, 0, SEEK_END);
  611. int tamanio=ftell(file)/sizeof(Amigo);
  612. fclose(file);
  613. return tamanio;
  614. }
  615.  
  616.  
  617. int actualizarArchivo(char *nombreArchivo,Lista *lista){
  618. bool toReturn=true;
  619. if(tamanioArchivo(nombreArchivo)!=0){
  620. Lista *aux;
  621. if ((aux = (Lista *) calloc (1,sizeof(Lista))) == NULL){
  622. mostrarMensajeCentro("Error de Memoria.");
  623.     toReturn=false;
  624. }
  625. archivoLista(nombreArchivo,aux);
  626. if(remove(nombreArchivo)!=-1){
  627. unirListas(lista,aux); //une, ordena
  628. listaArchivo(lista,nombreArchivo);
  629. destruir(aux);
  630. }
  631. }else if(tamanioArchivo(nombreArchivo)==0){
  632. if (listaArchivo(lista,nombreArchivo)==-1){
  633. mostrarMensajeCentro("No hay elementos para guardar.");
  634. toReturn=false;
  635. }
  636. }
  637. return toReturn;
  638. }
  639.  
  640. //CORREGIR ESTO
  641.  
  642. void archivoLista(char *nombreArchivo, Lista *aux){
  643. FILE* file= fopen(nombreArchivo, "rb");
  644.    if (file==NULL){
  645.        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
  646.    }else{
  647.        Amigo amigo;
  648.        rewind(file);
  649.        while(fread(&amigo, sizeof(Amigo), 1, file)){
  650.            if(amigo.flag){
  651. insertarInicio(aux,amigo);
  652.         }
  653. }
  654.        fclose(file);
  655.    }
  656. }
  657.  
  658.  
  659. void guardarContacto(Amigo persona, char* nombreArchivo){
  660.    FILE* file= fopen(nombreArchivo, "ab");
  661.    if (file==NULL){
  662.        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
  663.    }
  664.    else{
  665.        fwrite(&persona, sizeof(Amigo), 1, file);
  666.        fclose(file);
  667.    }
  668. }
  669.  
  670.  
  671. void mostrarAgenda(char* nombreArchivo){
  672.    FILE* file= fopen(nombreArchivo, "rb");
  673.    if (file==NULL){
  674.        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
  675.    }
  676.    else{
  677.     int i=1;
  678.     tipoTabla();
  679.        Amigo persona;
  680.        while (fread(&persona, sizeof(Amigo), 1, file)){
  681.            if(persona.flag){
  682.             printf(" %i ",i);
  683. mostrarAmigo(persona);
  684. i++;
  685. }
  686.        }
  687.        fclose(file);
  688.    }
  689. }
  690.  
  691.  
  692. void inicializarIndice(Indice indice[]){
  693. int i;
  694. for (i=0;i<Max;i++){
  695. indice[i].letra=(17+i)+48;
  696. indice[i].pos=-1;
  697. indice[i].cantidad=0;
  698. }
  699. }
  700.  
  701.  
  702. int tamanioArchivoIndice(char *nombreArchivoIndice){
  703. FILE *file=fopen(nombreArchivoIndice,"ab");
  704. fseek(file, 0, SEEK_END);
  705. int tamanio=ftell(file)/sizeof(Indice);
  706. fclose(file);
  707. return tamanio;
  708. }
  709.  
  710.  
  711. void formarIndice(char *nombreArchivo,char *nombreArchivoIndice){
  712. Indice indice[Max];
  713. inicializarIndice(indice);
  714. Amigo persona;
  715. char inic;
  716. int j=0,encontrado,i=0;
  717. FILE *file=fopen(nombreArchivo,"rb");
  718. while(fread(&persona, sizeof(Amigo), 1, file)){
  719. inic=persona.apellido[0];
  720. if (inic>97 || inic<122) inic=inic-32; //Si no es mayuscula, la transforma en mayuscula
  721. encontrado=0;
  722. while(i<Max && encontrado!=1){
  723. if((indice[i].letra==inic)&&(indice[i].pos==-1)){
  724. indice[i].pos=j;
  725. indice[i].cantidad=indice[i].cantidad+1;
  726. encontrado=1;
  727. }else if((indice[i].letra==inic)&&(indice[i].pos!=-1)){
  728. indice[i].cantidad++;
  729. encontrado=1;
  730. }else{
  731. i++;
  732. }
  733. }
  734. j++;
  735. }
  736. fclose(file);
  737. remove(nombreArchivoIndice);
  738. arregloArchivoIndice(nombreArchivoIndice,indice);
  739. }
  740.  
  741. void arregloArchivoIndice(char *nombreArchivoIndice,Indice indice[]){
  742. int i;
  743. for (i=0;i<Max;i++){
  744. guardarIndice(nombreArchivoIndice,indice[i]);
  745. }
  746. }
  747.  
  748. void guardarIndice(char *nombreArchivoIndice,Indice ind){
  749.    FILE* file= fopen(nombreArchivoIndice, "ab");
  750.    if (file==NULL){
  751.        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
  752.    }
  753.    else{
  754.        fwrite(&ind, sizeof(Indice), 1, file);
  755.        fclose(file);
  756.    }
  757. }
  758.  
  759.  
  760. void tipoTablaIndice(){
  761. printf("%-10s %-15s %-15s\n\n","LETRA","POSICION","CANTIDAD");
  762. }
  763.  
  764. //Muestra uno
  765. void mostrarLetra(Indice ind){
  766.    if(ind.cantidad!=0) printf("%-10c %-15d %-15d\n\n",ind.letra,ind.pos,ind.cantidad);
  767. }
  768.  
  769. //Muestra el arreglo indice (No se usa, solo era para probar)
  770. void mostrarArregloIndice(Indice indice[]){
  771. int i;
  772. tipoTablaIndice();
  773. for (i=0;i<Max;i++){
  774. mostrarLetra(indice[i]);
  775. }
  776. }
  777.  
  778. //Muestra el archivo indice (No se usa, solo era para probar)
  779. void mostrarArchivoIndice(char* nombreArchivoIndice){
  780.    FILE* file= fopen(nombreArchivoIndice, "rb");
  781.    if (file==NULL){
  782.        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
  783.    }
  784.    else{
  785.        Indice indice;
  786.        while (fread(&indice, sizeof(Indice), 1, file)){
  787. mostrarLetra(indice);
  788.     }
  789.        fclose(file);
  790.    }
  791. }
  792.  
  793.  
  794. //Muestra los contactos dependiendo de la letra inicial
  795. void mostrarApellidoInicialArchivo(char *nombreArchivo,char *nombreArchivoIndice,char c){
  796. c=c-65; //Transforma el caracter en entero
  797. FILE *file=fopen(nombreArchivo,"rb");
  798. if (tamanioArchivo(nombreArchivo)==0){
  799. mostrarMensajeCentro("Archivo Vacio");
  800. fclose(file);
  801. }else{
  802. FILE *fileInd=fopen(nombreArchivoIndice,"rb");
  803. if (fileInd==NULL){
  804. mostrarMensajeCentro("Error al intentar acceder al archivo");
  805.    }else{
  806. Indice ind;
  807. fseek(fileInd,(c)*sizeof(Indice),SEEK_SET);
  808. fread(&ind,sizeof(Indice),1,fileInd);
  809. fclose(fileInd);
  810. mostrarArchivoApellido(nombreArchivo,ind.pos,ind.cantidad);
  811. }
  812. }
  813. }
  814.  
  815.  
  816. //Dada una pos y una cantidad, muestra contactos desde una posicion avanzando tanto como cant haya
  817. void mostrarArchivoApellido(char *nombreArchivo,int pos,int cant){
  818. FILE *file=fopen(nombreArchivo,"rb");
  819.    if (file==NULL){
  820.        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
  821.    }
  822.    else{
  823.     int i,elem,numero=1;
  824.     if (cant!=0){
  825.     elem=pos;
  826.     tipoTabla();
  827.     for (i=pos;i<pos+cant;i++){
  828.     Amigo amigo;
  829.     printf(" %d ",numero);
  830.     fseek (file, (elem)*sizeof(Amigo), SEEK_SET);
  831.        fread(&amigo, sizeof(Amigo), 1, file);
  832. mostrarAmigo(amigo);
  833. elem++;
  834. numero++;
  835. }
  836. }else{
  837. mostrarMensajeCentro("No hay amigos con esa inicial.");
  838. }
  839.        fclose(file);
  840.        printf("\n\n");
  841. }
  842. }
  843.  
  844.  
  845. void mostrarApellidoInicialLista(Lista *lista, char car){
  846.    Persona *aux=lista->inicio;
  847.    Amigo amigo;
  848.    char inic;
  849.    int i=1;
  850. if(aux){
  851. while (aux){
  852. if(aux->dato.flag){
  853.                amigo=aux->dato;
  854.    inic=amigo.apellido[0];
  855.    if(inic>96 && inic<123) inic=inic-32;
  856.    if(inic==car){
  857.                    printf(" %i ",i);
  858.                    mostrarAmigo(amigo);
  859.                    i++;
  860.    }
  861.                aux=aux->sig;
  862. }
  863. }
  864.    }
  865. }
  866.  
  867.  
  868.  
  869. int borrarContactoArchivo(char *nombreArchivo, int pos){
  870.    bool toReturn=true;
  871.    if((tamanioArchivo(nombreArchivo)<pos)||(pos<1)){
  872.        printf("La posicion indicada es invalida");
  873.        toReturn=false;
  874.    }else{
  875.        FILE *file=fopen(nombreArchivo,"r+b");
  876.        Amigo amigo;
  877.        fseek (file, (pos-1)*sizeof(Amigo), SEEK_SET);
  878.        fread(&amigo, sizeof(Amigo), 1, file);
  879.        mostrarAmigo(amigo);
  880.        presUnaTecla();
  881.        amigo.flag=false;
  882.        fseek (file, -1*sizeof(Amigo), SEEK_CUR);
  883.        fwrite(&amigo,sizeof(Amigo),1,file);
  884.        fclose(file);
  885.    }
  886.    return toReturn;
  887. }
  888.  
  889. int borrarContactoLista(Lista *lista, int pos){
  890.    Persona *aux=lista->inicio, *elemEliminar;
  891.    bool toReturn=false;
  892.    int i;
  893.    if(pos!=1){
  894.        for(i=1;i<pos-1;i++){
  895.            aux=aux->sig;
  896.        }
  897.        elemEliminar=aux->sig;
  898.        aux->sig=elemEliminar->sig;
  899.        free(elemEliminar);
  900.        toReturn=true;
  901.    }else{
  902.        suprimirInicio(lista);
  903.        toReturn=true;
  904.    }
  905.    return toReturn;
  906. }
  907.  
  908. void mostrarBuscadoArchivo(char *nombreArchivo,Amigo buscoAmigo){
  909. FILE *file=fopen(nombreArchivo,"rb");
  910. Amigo amigo;
  911. int i=1;
  912. while(fread(&amigo, sizeof(Amigo), 1, file)){
  913.        if (estaApellidONombre(amigo,buscoAmigo)){
  914.            printf(" %i ",i);
  915.            mostrarAmigo(amigo);
  916.            i++;
  917.        }
  918. }
  919. fclose(file);
  920.    if(i==1)mostrarMensajeAviso("No se encontraron amigos con ese nombre y/o apellido");
  921. }
  922.  
  923. void mostrarBuscadoLista(Lista *lista,Amigo buscoAmigo){
  924.    Persona *aux=lista->inicio;
  925.    int i=1;
  926. while(aux){
  927.        if(estaApellidONombre(aux->dato,buscoAmigo)){
  928.                printf(" %i ",i);
  929.                mostrarAmigo(aux->dato);
  930.                i++;
  931.        }
  932.        aux=aux->sig;
  933. }
  934. if(i==1) mostrarMensajeAviso("No se encontraron amigos con ese nombre y/o apellido");
  935. }
  936.  
  937. int estaApellidONombre(Amigo amigo, Amigo buscoAmigo){
  938.    bool existe =false;
  939.    existe = (strcmpi(amigo.apellido,buscoAmigo.apellido)==0);
  940.    existe |= (strcmpi(amigo.nombre,buscoAmigo.nombre)==0);
  941.    return existe;
  942. }
  943.  
  944. Amigo pedirAmigoBuscar(){
  945.    Amigo amigoBuscar;
  946.     do{
  947. printf("\nIngrese el apellido de su amigo.\n");
  948.        fgets(amigoBuscar.apellido,20, stdin);
  949.        limpiar(amigoBuscar.apellido);
  950. }while (strlen(amigoBuscar.apellido)>17);
  951. do{
  952. printf("\nIngrese el nombre de su amigo.\n");
  953.        fgets(amigoBuscar.nombre,20, stdin);
  954.        limpiar(amigoBuscar.nombre);
  955. }while (strlen(amigoBuscar.nombre)>17);
  956. return amigoBuscar;
  957. }
  958.  
  959.  
  960. int pedirNombreMes(){
  961.    char mes[12];
  962.    do{
  963.        printf("\nIngrese el nombre: \n");
  964.        fgets(mes,15, stdin);
  965.        limpiar(mes);
  966.    } while ((strlen(mes)>12) || (esMes(mes))==0);
  967. }
  968.  
  969. int esMes(char *mes){
  970.    int toReturn=-1;
  971.    int i=0;
  972.    while((i<12) && (toReturn==-1)){
  973.        if(strcmpi(arrMes[i],mes)==0){
  974.            toReturn=i+1;
  975.        }
  976.        i++;
  977.    }
  978.    return toReturn;
  979. }
  980.  
  981. void mostrarCumpleMesLista(Lista *lista,int mes){
  982.    Persona *aux=lista->inicio;
  983.    int i=1;
  984.    while(aux){
  985.        if(aux->dato.fecNac.mes==mes){
  986.            printf(" %i ",i);
  987.            mostrarAmigo(aux->dato);
  988.            i++;
  989.        }
  990.        aux=aux->sig;
  991.    }
  992. }
  993.  
  994. void mostrarCumpleMesArchivo(char *nombreArchivo,int mes){
  995.    FILE *file=fopen(nombreArchivo,"rb");
  996.    if(file==NULL){
  997.        mostrarMensajeAviso("Hubo un error al abrir el archivo");
  998.    }else{
  999.        Amigo amigo;
  1000.        int i=1;
  1001.        while(fread(&amigo,sizeof(Amigo),1,file)){
  1002.            if(amigo.fecNac.mes==mes){
  1003.                printf(" %i ",i);
  1004.                mostrarAmigo(amigo);
  1005.                i++;
  1006.            }
  1007.        }
  1008.    }
  1009.    fclose(file);
  1010. }
  1011.  
  1012. void pausarPrograma(){
  1013. while(getchar() != '\n');
  1014.    setbuf(stdin, NULL);
  1015. }
  1016.  
  1017.  
4  Programación / Programación C/C++ / Re: Uso de Ficheros y LSE en C en: 9 Agosto 2016, 21:15 pm
Insertar Cita
Hay que ver como esta llamando a


Código:
TFecha ingresarFecha(Amigo aux);

Código:
El detalle que tengo mucho que no programo sin apuntadores y el acceso a los elementos de tus estrucuras me confunde un poquito....

Esa seria una buena practica??. Como para mejorar, pregunto..



Código:
Donde validas que el mes tiene 2 en ese momento?

Despues del sscanf coloca un printf imprimiendo el valor capturado si ahi se imprime bien entonces el problema esta en otro lado

Vos sabes que habia hecho ese printf a modo de bandera..
Pero cuando preguntaste, como la invocaba me diste una idea de donde podria estar el error..

Código
  1. aux.fecNac=ingresarFecha();

antes, era..

Código
  1. aux.fecNac=ingresarFecha(aux);

Y cambie la funcion ingresarFecha..

Código
  1. TFecha ingresarFecha(){
  2. int limDias,busqueda,buffer;
  3. TFecha fecha;
  4. char cadena[10];
  5. do{
  6. printf("\nIngrese el año de nacimiento: [1900..2016]\n");
  7. fgets(cadena,6, stdin);
  8. sscanf(cadena,"%d",&fecha.año);
  9. }while ((fecha.año>2016)||(fecha.año<1900));
  10. limpiar(cadena);
  11. do{
  12. printf("\nIngrese el mes de nacimiento:\n");
  13. fgets(cadena,4,stdin);
  14. sscanf(cadena,"%d",&fecha.mes);
  15. printf("%d",fecha.mes);
  16. }while ((fecha.mes>12)||(fecha.mes<1));
  17. limDias=(topeDias(fecha.mes,fecha.año));
  18. do{
  19. printf("\nIngrese el dia de nacimiento:[1..%d]\n",limDias);
  20. fgets(cadena,4, stdin);
  21. sscanf(cadena,"%d",&fecha.dia);
  22. }while ((fecha.dia>limDias)||(fecha.dia<1));
  23. return fecha;
  24. }


Ahora funciona bien.. Probe ese error y no lo hizo mas..
Lo voy a probar bien y si funciona bien, lo subo..

Gracias AlbertoBSD..
5  Programación / Programación C/C++ / Re: Uso de Ficheros y LSE en C en: 9 Agosto 2016, 15:44 pm
AlbertoBSD

La solucion que mandaste anda espectacular.. ;)

Le agregue un par de cosas a la funcion limpiar..

Código
  1. void limpiar (char *cadena){
  2.    char *p;
  3.    p = strchr (cadena, '\n');
  4.    if (p){
  5.        *p = '\0';
  6.    }else{
  7.        pausarPrograma();
  8.    }
  9. }

y la pausarPrograma()

Código
  1. void pausarPrograma(){
  2. while(getchar() != '\n');
  3.    setbuf(stdin, NULL);
  4. }
  5.  

probando llegue a esa solucion..

Lo que si, tengo problemas con esta funcion..

Código
  1. TFecha ingresarFecha(Amigo aux){
  2. int limDias,busqueda,buffer;
  3. char cadena[10];
  4. do{
  5. printf("\nIngrese el año de nacimiento: [1900..2016]\n");
  6. fgets(cadena,6, stdin);
  7. sscanf(cadena,"%d",&aux.fecNac.año);
  8. }while ((aux.fecNac.año>2016)||(aux.fecNac.año<1900));
  9. limpiar(cadena);
  10. do{
  11. printf("\nIngrese el mes de nacimiento:\n");
  12. fgets(cadena,4,stdin);
  13. sscanf(cadena,"%d",&aux.fecNac.mes);
  14. }while (((aux.fecNac.mes>12)||(aux.fecNac.mes<1)));
  15. limDias=(topeDias(aux.fecNac.mes,aux.fecNac.año));
  16. do{
  17. printf("\nIngrese el dia de nacimiento:[1..%d]\n",limDias);
  18. fgets(cadena,4, stdin);
  19. sscanf(cadena,"%d",&aux.fecNac.dia);
  20. }while ((aux.fecNac.dia>limDias)||(aux.fecNac.dia<1));
  21. return aux.fecNac;
  22. }

Cuando agregas 1 amigo, anda bien.. Pero, al agregar 1 mas.. O sea..
Agrego un amigo, funciona bien..
Agrego otro amigo, y no se porque!?, en el mes, le pone 2..
Le pone 2, si vos apretas ENTER y no pones nada.. Se entiende?
Pero en el año y en el dia, no pasa nada..

Insisto, no le encuentro la vuelta, pero acarrea un 2.. Y solo sucede en el mes..
No se en que parte le estoy errando :/
6  Programación / Programación C/C++ / Re: Uso de Ficheros y LSE en C en: 8 Agosto 2016, 17:32 pm
Código:
		case 5:
mostrarTituloMenu("AMIGOS POR INICIAL");
printf("\nIngrese una letra:");
do{
                fgets(car,3, stdin);
                limpiar(car);
}while((car<65 || (car>90 && car<97)|| car>122)&&(strlen(car)>1));
if (car>97 || car<122) car=car-32; //Si no es mayuscula, la transforma en mayuscula

printf("\ncar %c\n%d\n",car,strlen(car));
presUnaTecla();
mostrarApellidoInicial(nombreArchivo,nombreArchivoIndice,car);
break;

En el case 5 de la funcion menu() Tengo un problema.. No se como hacer para leer un solo elemento y que me tome solo ese elemento..
En este caso si pongo mas de un caracter me da cualquier cosa y si pongo 1 me da error tambien..

Algun consejo?. La funcion limpiar sirve?.


Código:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
int main() {
char *busqueda = NULL;
char *buffer = calloc(1000,sizeof(char));
printf("Ingrese una cadena de prueba de mas de 10 caracteres: ");
fgets(buffer,10,stdin);
busqueda = strstr(buffer,"\n");
printf("Primer \\n encontrado en la posicion %lu",busqueda-buffer);
return 0;
}


Entonces en la fgets(buffer,10,stdin);
Deberia cambiarlo por:

Código:
fgets(buffer,3,stdin);

tenia todos scanf y gets con el fflush.. Y lei en este foro que era una mala practica y recomendaban el uso de fgets....
Segui leyendo y dio resultado, pero como que en esos casos de leer un char y eso, no le encuentro la vuelta.. :/

Desde ya, gracias y disculpa las molestias.. Quizas deberia leer mas..
 
7  Programación / Programación C/C++ / Re: Uso de Ficheros y LSE en C en: 8 Agosto 2016, 16:44 pm
Código:
El uso de

[code=c]fflush(stdin);

Esta indefinido recomiendo no usarlo en lo Absoluto.[/code]

Gracias por responder AlbertoBSD.. Si, se me paso por alto, use el fgets() y algunos me quedaron colgados.. Gracias por leer el codigo..

Código:
en los gets si le especificas que son 17 o X cantidad de caracteres  solo guarda el \n si la cadena ingresada es menor a X-2 de longitud

A esto lo soluciono usando fgets?.



En caso de que la cadena ingresada tebga mayor longiud automaticamente la corta y agrega \0 en la posicion numero 16 de la cadena por lo cual en dado caso no existiria un \n

Código:
Otra cosa es las variables enteras que usas como variables booleanas, si funciona claro pero si ya vas a usar true y false pues tambien declara  de una vez las variables bool

Con esto decis que deberia devolver un bool??


Gracias nuevamente por los consejos!


8  Programación / Programación C/C++ / Uso de Ficheros y LSE en C en: 8 Agosto 2016, 15:57 pm
Hola gente. Hace poco que estoy en esto de C.. Leyendo, trate de juntar todo ese conocimiento e hice una agenda.. Creo que se pude mejorar, pero me gustaria saber si las practicas utilizadas estan bien encaminadas.. Desde ya, muchas gracias.. Cualquier consejo, sera tomado como tal..

Código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define ANCHO_PANTALLA 80 //Maximo de caracteres en la pantalla
#define Max 26 //Arreglo Indice Apellido


typedef struct TipoFecha{
int dia;
int mes;
int año;
}TFecha;

typedef struct TipoAmigo{
char apellido[18];
char nombre[18];
char email[21];
char celular[13];
TFecha fecNac;
bool flag;
}Amigo;

typedef struct ElementoLista{
  Amigo  dato;
  struct ElementoLista *sig;
}Persona;

typedef struct ListaIdentificar {
    Persona *inicio;
}Lista;

typedef struct {
char letra;
int pos;
int cantidad;
}Indice;

const char *arrMes[12]={"ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"};
//const char arrMes[12]={'enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'};


//MENU PRINCIPAL
int menu(char *nombreArchivo,char *nombreArchivoIndice, Lista *lista);
//devuelve la opcion elegido
int mostrarMenu();

//Guarda contacto en el archivo
void guardarContacto(Amigo persona, char *nombreArchivo);



//----Guarda los datos en el archivo


int actualizarArchivo(char *nombreArchivo,Lista *lista);
//Pasa los datos de la lista al archivo
int listaArchivo(Lista *lista, char *nombreArchivo);
//Pasa los datos del archivo a la lista
void archivoLista(char *NombreArchivo, Lista *lista);
//Une 2 listas y las ordena
int unirListas(Lista *lista,Lista *aux);
//Borra los datos y libera la memoria
int destruir(Lista *lista);
//Suprime un dato de la lista
int suprimirInicio (Lista *lista); //de acuerdo al campo flag=='*'
//devuelve el tamaño del archivo
int tamanioArchivo(char *nombreArchivo);
//Muestra los datos guardados en el archivo
void mostrarAgenda(char *nombreArchivo);

int borrarContactoArchivo(char *nombreArchivo, int pos);

Amigo pedirAmigoBuscar();

void mostrarBuscadoArchivo(char *nombreArchivo,Amigo buscoAmigo);



/*
-------FUNCIONES MANEJO DE LISTA DINAMICA (Area de Intercambio)
*/
//Inserta un dato al inicio de la lista en la memoria dinamica
int insertarInicio (Lista *lista,Amigo p);
//devuelve los datos de un amigo que llena el usuario
Amigo pedirAmigo();
//Pide la fecha y la devuelve
TFecha ingresarFecha(Amigo aux);
//Duvuelve el maximo de dias que se pueden ingresar, dado un mes y un año
int topeDias(int mes,int año);
//agrega un amigo a la lista
int agregarAmigo(Lista *lista,char *nombreArchivo);
//revisa la lista para ver si encuentra datos
int estaAmigoLista(Lista *l,Amigo p);
//revisa el archivo para ver si encuentra datos
int estaAmigoArchivo(char *nombreArchivo,Amigo p);
//actualiza el archivo. Agrega datos de la lista y ordena el archivo
//ordena la lista por apellido y nombre
void ordenar(Lista *lista);

int borrarContactoLista(Lista *lista, int pos);

void mostrarBuscadoLista(Lista *lista,Amigo buscoAmigo);


//Funciones de Muestra
//Muestra un titulo con los datos de amigo (tipo Tabla)
void tipoTabla();
//Muestra un titulo con los datos de indice (tipo Tabla)
void tipoTablaIndice();
//Muestra los datos de la Lista
void mostrarDatos(Lista *lista);
//Muestra los datos de un amigo
void mostrarAmigo(Amigo p);
//Muestra un titulo en el medio
void mostrarTituloMenu(char *titulo);
//Muestra un mensaje de error
void mostrarMensajeCentro(char *msj);
//Muestra los datos del archivo indice
void mostrarArchivoIndice(char* nombreArchivoIndice);
//Muestra los datos de un elem del archivo indice
void mostrarLetra(Indice indice);


//Muestra los apellidos que comiencen con una letra "x"
//dados una posicion y la cantidad a mostrar, se mueve en el archivo principal y muestra los datos
void mostrarArchivoApellido(char *nombreArchivo,int pos,int cant);
/*Listar amigos cuyo apellido comienza con una determinada letra.*/
void MostrarApellidoInicial(char *nombreArchivo,char *nombreArchivoIndice,char c);
//Inicializa el arreglo indice
void inicializar(Indice indice[]);
//Pasa del arreglo al arch
void arregloArchivoIndice(char *nombreArchivoIndice,Indice indice[]);
//Guarda un dato en el archivo INDICE
void guardarIndice(char *nombreArchivoIndice,Indice ind);
//Se forma el archivo indice
void formarIndice(char *nombreArchivo,char *nombreArchivoIndice);
/*
Listar amigos que cumplen años un determinado mes: el mes será ingresado por
el usuario. Mostrar los registros en formato tabla.
*/
//falta
void MostrarCumpleMes(Lista *lista,int mes);


int main(){
//boolean toReturn=true;
char nombreArchivo[12]= "agenda.bin";
char nombreArchivoIndice[12]= "indice.bin";
Lista *lista;
if ((lista = (Lista *) calloc (1,sizeof(Lista))) == NULL){
    return false;
}
menu (nombreArchivo,nombreArchivoIndice,lista);
return true;
}



int mostrarMenu(){
int opc;
char cadena[10];
do{
mostrarTituloMenu("MENU GENERAL");
printf("\n1) Agregar Amigo al Area de transacciones.");
printf("\n2) Mostrar Area de transacciones.");
printf("\n3) Actualizar Archivo agenda.");
printf("\n4) Mostrar Archivo agenda.");
printf("\n5) Mostrar contactos con la inicial ""x"" en el apellido.");
printf("\n6) Mostrar contactos que cumplan años determinado mes.");
printf("\n7) Buscar contacto.");
printf("\n8) Borrar contacto.");
printf("\n9) Eliminar Archivos.");
printf("\n10) Salir.");
printf("\n\nElige una opcion: ");
fgets(cadena,10,stdin);
        sscanf(cadena,"%i",&opc);
        //scanf("%d",&opc);
}while (opc<1 || opc>10);
return opc;
}

void mostrarTituloMenu(char *titulo){
system("cls");
    printf("%*s\n\n\n", ANCHO_PANTALLA/2 + strlen(titulo)/2, titulo);
}

void mostrarMensajeCentro(char *msj){
    printf("\n\n\n\n\n%*s\n\n\n", ANCHO_PANTALLA/2 + strlen(msj)/2, msj);
}

void mostrarMensajeAviso(char *msj){
    printf("\n\n%*s\n\n", ANCHO_PANTALLA/2 + strlen(msj)/2, msj);
}

void presUnaTecla(){
mostrarMensajeCentro("Presione ENTER para continuar.");
while(getchar() != '\n');
    setbuf(stdin, NULL);
}


int menu(char *nombreArchivo,char *nombreArchivoIndice, Lista *lista){
int pos,opc,mes;
char car;
Amigo amigoBuscar;
    do{
opc=mostrarMenu();
    switch (opc){
    case 1:
    if(!agregarAmigo(lista,nombreArchivo)){
mostrarMensajeCentro("Hubo un error. Elemento duplicado");
}else{
printf("\n\nSe ha hecho correctamente");
    ordenar(lista);
}
break;
case 2:
mostrarTituloMenu("AMIGOS EN AREA DE TRANSACCIONES");
if(lista->inicio!=NULL){
tipoTabla();
mostrarDatos(lista);
printf("\n\n\n\n");
}else
mostrarMensajeCentro("Lista Vacia.");
break;
case 3:
if (actualizarArchivo(nombreArchivo,lista)!=false){
formarIndice(nombreArchivo,nombreArchivoIndice);
(destruir(lista)) ? mostrarMensajeAviso("Se actualizo el archivo y se borro la lista.") : mostrarMensajeAviso("Hubo un problema");
}
break;
case 4:
if(tamanioArchivo(nombreArchivo)!=0){
mostrarTituloMenu("AMIGOS EN ARCHIVO");
mostrarAgenda(nombreArchivo);
printf("\n\n\n\n");
}else{
mostrarMensajeCentro("Archivo Vacio.");
}
break;
case 5:
mostrarTituloMenu("AMIGOS POR INICIAL");
printf("\nIngrese una letra:");
do{
fflush(stdin);
scanf("%c",&car);
}while(car<65 || (car>90 && car<97)|| car>122);
if (car>97 || car<122) car=car-32; //Si no es mayuscula, la transforma en mayuscula
printf("\n\n\n");
mostrarApellidoInicial(nombreArchivo,nombreArchivoIndice,car);
break;
case 6:
    //pedirMes
mes=pedirNombreMes();
mostrarTituloMenu("CUMPLEN AÑOS EN EL MES");
            printf("\nDE %s:\n\n",arrMes[mes-1]);
            printf("\n\nAmigos del archivo:\n\n\n");
tipoTabla();
MostrarCumpleMesArchivo(nombreArchivo,mes);
printf("\n\nAmigos del archivo:\n\n\n");
MostrarCumpleMesLista(lista,mes);
break;
case 7:
amigoBuscar=pedirAmigoBuscar();
printf("\nAmigos del archivo:\n\n\n");
tipoTabla();
mostrarBuscadoArchivo(nombreArchivo,amigoBuscar);
printf("\n\n\nAmigos de la lista:\n\n\n");
(lista->inicio!=NULL) ? mostrarBuscadoLista(lista,amigoBuscar) : mostrarMensajeAviso("Lista Vacia.");
break;
case 8:
    mostrarTituloMenu("BORRAR AMIGO");
if((tamanioArchivo(nombreArchivo)==0)&&(lista->inicio==NULL)){
                mostrarMensajeCentro("No hay elementos.");
}else if((tamanioArchivo(nombreArchivo)!=0)&&(lista->inicio==NULL)){
    printf("\nAmigos en el archivo: \n");
                mostrarAgenda(nombreArchivo);
                printf("\nAmigos en la lista de Transaccion: \n");
                mostrarMensajeAviso("Lista Vacia");
                printf("Ingrese el numero de contacto: ");
                scanf("%d",&pos);
                if(borrarContactoArchivo(nombreArchivo,pos)) printf("\nSe ha borrado el usuario con exito");
}else if((tamanioArchivo(nombreArchivo)==0)&&(lista->inicio!=NULL)){
    tipoTabla();
    printf("\nAmigos en el archivo: \n");
    mostrarMensajeAviso("Archivo Vacio");
                printf("\nAmigos en la lista de Transaccion: \n");
                mostrarDatos(lista);
                printf("Ingrese el numero de contacto: ");
                scanf("%d",&pos);
                borrarContactoLista(lista,pos);
}else{
    //CONTROLAR LOS MAXIMOS Y MINIMOS
    printf("\nAmigos en el archivo: \n");
                mostrarAgenda(nombreArchivo);
                printf("\nAmigos en la lista de Transaccion: \n");
                mostrarDatos(lista);
                int eleccion;
                printf("\n\n\n\n\nDe que lugar quiere eliminar el amigo?");
                printf("\nIngrese \t1.)Agenda. \t2)Transaccion. \t3)Salir\n");
                scanf("%d",&eleccion);
                if (eleccion==1){
                    printf("Ingrese el numero de contacto: ");
                    scanf("%d",&pos);
                    if(borrarContactoArchivo(nombreArchivo,pos)) printf("\nSe ha borrado el usuario con exito");
                }else if(eleccion==2){
                    printf("Ingrese el numero de contacto: ");
                    scanf("%d",&pos);
                    borrarContactoLista(lista,pos);
                }
}
break;
case 9:
remove(nombreArchivo);
remove(nombreArchivoIndice);
mostrarMensajeCentro("Los archivos se borraron efectivamente.");
break;
case 10:
printf ("\nAdios");
break;
}
//
presUnaTecla();
} while (opc!=10);
return 0;
}



int agregarAmigo(Lista *lista,char *nombreArchivo){
Amigo amigo=pedirAmigo();
bool toReturn=true;
if ((estaAmigoLista(lista,amigo)||(estaAmigoArchivo(nombreArchivo,amigo))))
        toReturn=false;
else{
insertarInicio(lista,amigo);
}
return toReturn;
}

void limpiar (char *cadena)
{
  char *p;
  p = strchr (cadena, '\n');
  if (p)
    *p = '\0';
}

Amigo pedirAmigo(){
Amigo aux;
system("cls");
mostrarTituloMenu("MENU DE CARGA DE DATOS");
do{
printf("\nIngrese el apellido de su amigo.\n");
        fgets(aux.apellido,17, stdin);
        limpiar(aux.apellido);
}while (strlen(aux.apellido)>17);
do{
printf("\nIngrese el nombre de su amigo.\n");
        fgets(aux.nombre,17, stdin);
        limpiar(aux.nombre);
}while (strlen(aux.nombre)>17);
do{
printf("\nIngrese el email de su amigo.\n");
        fgets(aux.email,17, stdin);
        limpiar(aux.email);
}while (strlen(aux.email)>17);
do{
printf("\nIngrese el celular de su amigo.\n");
        fgets(aux.celular,15, stdin);
        limpiar(aux.celular);
}while (strlen(aux.celular)>15);
printf("\nFecha de nacimiento de su amigo:\n");
aux.fecNac=ingresarFecha(aux);
aux.flag=true;
//mostrarAmigo(aux);
return aux;
}

int esBisiesto(int a){||
return (a%4==0 && a%100!=0) || (a%400==0);
}

TFecha ingresarFecha(Amigo aux){
int limDias;
char cadena[10];
do{
printf("\nIngrese el año de nacimiento: [1900..2016]\n");
fgets(cadena,10, stdin);
sscanf(cadena,"%i",&aux.fecNac.año);
}while ((aux.fecNac.año>2016)||(aux.fecNac.año<1900));
do{
printf("\nIngrese el mes de nacimiento:\n");
fgets(cadena,10, stdin);
sscanf(cadena,"%i",&aux.fecNac.mes);
}while ((aux.fecNac.mes>12)||(aux.fecNac.mes<1));
limDias=(topeDias(aux.fecNac.mes,aux.fecNac.año));
do{
printf("\nIngrese el dia de nacimiento:[1..%d]\n",limDias);
fgets(cadena,10, stdin);
sscanf(cadena,"%i",&aux.fecNac.dia);
}while ((aux.fecNac.dia>limDias)||(aux.fecNac.dia<1));
return aux.fecNac;
}

int topeDias(int mes,int año){
if((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12)){
return 31;
}else if((mes==4)||(mes==6)||(mes==9)||(mes==11)){
return 30;
}else if((mes==2)&&esBisiesto(año)){
return 29;
}else{
return 28;
}
}


int estaAmigoLista(Lista *lista,Amigo p){
  bool existe = false;
  Persona *aux;
  for(aux=lista->inicio; aux && !existe; aux=aux->sig){
    existe = (strcmpi(aux->dato.apellido,p.apellido)==0);
    existe &= (strcmpi(aux->dato.nombre,p.nombre)==0);
    existe &= (strcmpi(aux->dato.email,p.email)==0);
    existe &= (strcmpi(aux->dato.celular,p.celular)==0);
    existe &= (aux->dato.fecNac.año==p.fecNac.año);
    existe &= (aux->dato.fecNac.mes==p.fecNac.mes);
    existe &= (aux->dato.fecNac.dia==p.fecNac.dia);
  }
  return existe;
}

//revisa el archivo para ver si encuentra datos
int estaAmigoArchivo(char *nombreArchivo,Amigo p){
FILE *file=fopen(nombreArchivo,"rb");
bool existe =false;
Amigo amigo;
while(!existe && fread(&amigo, sizeof(Amigo), 1, file)){
    existe = (strcmpi(amigo.apellido,p.apellido)==0);
    existe &= (strcmpi(amigo.nombre,p.nombre)==0);
    existe &= (strcmpi(amigo.email,p.email)==0);
    existe &= (strcmpi(amigo.celular,p.celular)==0);
    existe &= (amigo.fecNac.año==p.fecNac.año);
    existe &= (amigo.fecNac.mes==p.fecNac.mes);
    existe &= (amigo.fecNac.dia==p.fecNac.dia);
}
fclose(file);
return existe;
}





int insertarInicio(Lista *lista, Amigo amigo){
  int toReturn = false; // error
  Persona *aux = (Persona *) malloc (sizeof (Persona));
  if (aux != NULL){
    aux->dato=amigo;
    aux->sig=lista->inicio;
    lista->inicio=aux;
    toReturn = true; // error
  }
  return toReturn;
}

void tipoTabla(){
printf("%-4s %-15s %-15s %-15s %-12s %-10s\n\n","NUM","APELLIDO","NOMBRE","EMAIL","CELULAR","DD/MM/AAAA");
}


void mostrarAmigo(Amigo p){
printf("%-2s %-15s %-15s %-15s %-12s %i/%i/%i\n","",p.apellido,p.nombre,p.email,p.celular,p.fecNac.dia,p.fecNac.mes,p.fecNac.año);
}


void mostrarDatos(Lista *lista){
Persona *aux=lista->inicio;
int i=1;
while (aux){
printf(" %i ",i);
mostrarAmigo(aux->dato);
aux=aux->sig;
i++;
}
}


int tamanioLista(Lista *lista){
Persona *aux=lista->inicio;
int cant=0;
while (aux){
mostrarAmigo(aux->dato);
aux=aux->sig;
cant++;
}
return cant;
}

void ordenar(Lista *lista){
Amigo cam;
Persona *aux,*aux2,*min;
min=lista->inicio;
while(min){
aux=min;
aux2=min->sig;
while(aux2!=NULL){
if((strcmpi(aux->dato.apellido,aux2->dato.apellido))>0){ //se comparan apellidos
aux=aux2; //se compara el nombre
}else if(((strcmpi(aux->dato.apellido,aux2->dato.apellido))==0)&&((strcmpi(aux->dato.nombre,aux2->dato.nombre))>0)){
aux=aux2;
}
aux2=aux2->sig;
}
cam=min->dato;
min->dato=aux->dato;
aux->dato=cam;
min=min->sig;
}

}


int destruir (Lista *lista){
    bool toReturn=false;
    while (lista->inicio){
        suprimirInicio (lista);
    }
    if(lista->inicio==NULL) toReturn=true;
    return toReturn;
}



/* eliminación al inicio de la lista */
int suprimirInicio (Lista *lista){
// ¿Por qué -1? si no hace nada lo lógico sería retornar 0, equivalente natural de false
bool   toReturn = false;
if (lista->inicio){
Persona *sig = lista->inicio->sig;
free(lista->inicio);
lista->inicio = sig;
toReturn = true; // ¿Por qué 0? siguiendo el planteamiento análogo debería ser 1
}
return toReturn;
}


int listaArchivo(Lista *lista, char *nombreArchivo){
    bool toReturn=false;
if(lista->inicio){
Persona *aux=lista->inicio;
while (aux){
if(aux->dato.flag){
guardarContacto(aux->dato,nombreArchivo);
aux=aux->sig;
}
}
toReturn=true;
}
return toReturn;
}


int unirListas(Lista *lista,Lista *aux){
    bool toReturn=false;
if(aux){
Persona *recorrer=aux->inicio;
while(recorrer){
insertarInicio(lista,recorrer->dato);
recorrer=recorrer->sig;
}
ordenar(lista);
toReturn=true;
}
return toReturn;
}

int tamanioArchivo(char *nombreArchivo){
FILE *file=fopen(nombreArchivo,"ab");
fseek(file, 0, SEEK_END);
int tamanio=ftell(file)/sizeof(Amigo);
fclose(file);
return tamanio;
}


int actualizarArchivo(char *nombreArchivo,Lista *lista){
bool toReturn=true;
if(tamanioArchivo(nombreArchivo)!=0){
Lista *aux;
if ((aux = (Lista *) calloc (1,sizeof(Lista))) == NULL){
mostrarMensajeCentro("Error de Memoria.");
    toReturn=false;
}
archivoLista(nombreArchivo,aux);
if(remove(nombreArchivo)!=-1){
unirListas(lista,aux); //une, ordena
listaArchivo(lista,nombreArchivo);
destruir(aux);
}
}else if(tamanioArchivo(nombreArchivo)==0){
if (listaArchivo(lista,nombreArchivo)==-1){
mostrarMensajeCentro("No hay elementos para guardar.");
toReturn=false;
}
}
return toReturn;
}

//CORREGIR ESTO

void archivoLista(char *nombreArchivo, Lista *aux){
FILE* file= fopen(nombreArchivo, "rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }else{
        Amigo amigo;
        rewind(file);
        while(fread(&amigo, sizeof(Amigo), 1, file)){
            if(amigo.flag){
insertarInicio(aux,amigo);
        }
}
        fclose(file);
    }
}


void guardarContacto(Amigo persona, char* nombreArchivo){
    FILE* file= fopen(nombreArchivo, "ab");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
        fwrite(&persona, sizeof(Amigo), 1, file);
        fclose(file);
    }
}


void mostrarAgenda(char* nombreArchivo){
    FILE* file= fopen(nombreArchivo, "rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
    int i=1;
    tipoTabla();
        Amigo persona;
        while (fread(&persona, sizeof(Amigo), 1, file)){
            if(persona.flag){
            printf(" %i ",i);
mostrarAmigo(persona);
i++;
}
        }
        fclose(file);
    }
}


void inicializar(Indice indice[]){
int i;
for (i=0;i<Max;i++){
indice[i].letra=(17+i)+48;
indice[i].pos=-1;
indice[i].cantidad=0;
}
}


int tamanioArchivoIndice(char *nombreArchivoIndice){
FILE *file=fopen(nombreArchivoIndice,"ab");
fseek(file, 0, SEEK_END);
int tamanio=ftell(file)/sizeof(Indice);
fclose(file);
return tamanio;
}


void formarIndice(char *nombreArchivo,char *nombreArchivoIndice){
Indice indice[Max];
inicializar(indice);
Amigo persona;
char inic;
int j=0,encontrado,i=0;
FILE *file=fopen(nombreArchivo,"rb");
while(fread(&persona, sizeof(Amigo), 1, file)){
inic=persona.apellido[0];
if (inic>97 || inic<122) inic=inic-32; //Si no es mayuscula, la transforma en mayuscula
encontrado=0;
while(i<Max && encontrado!=1){
if((indice[i].letra==inic)&&(indice[i].pos==-1)){
indice[i].pos=j;
indice[i].cantidad=indice[i].cantidad+1;
encontrado=1;
}else if((indice[i].letra==inic)&&(indice[i].pos!=-1)){
indice[i].cantidad++;
encontrado=1;
}else{
i++;
}
}
j++;
}
fclose(file);
remove(nombreArchivoIndice);
arregloArchivoIndice(nombreArchivoIndice,indice);
}

void arregloArchivoIndice(char *nombreArchivoIndice,Indice indice[]){
int i;
for (i=0;i<Max;i++){
guardarIndice(nombreArchivoIndice,indice[i]);
}
}

void guardarIndice(char *nombreArchivoIndice,Indice ind){
    FILE* file= fopen(nombreArchivoIndice, "ab");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
        fwrite(&ind, sizeof(Indice), 1, file);
        fclose(file);
    }
}


void tipoTablaIndice(){
printf("%-10s %-15s %-15s\n\n","LETRA","POSICION","CANTIDAD");
}

//Muestra uno
void mostrarLetra(Indice ind){
if(ind.cantidad!=0) printf("%-10c %-15d %-15d\n\n",ind.letra,ind.pos,ind.cantidad);
}

//Muestra el arreglo indice (No se usa, solo era para probar)
void mostrarArregloIndice(Indice indice[]){
int i;
tipoTablaIndice();
for (i=0;i<Max;i++){
mostrarLetra(indice[i]);
}
}

//Muestra el archivo indice (No se usa, solo era para probar)
void mostrarArchivoIndice(char* nombreArchivoIndice){
    FILE* file= fopen(nombreArchivoIndice, "rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
        Indice indice;
        while (fread(&indice, sizeof(Indice), 1, file)){
mostrarLetra(indice);
    }
        fclose(file);
    }
}

//Dada una pos y una cantidad, muestra contactos desde una posicion avanzando tanto como cant haya
void mostrarArchivoApellido(char *nombreArchivo,int pos,int cant){
FILE *file=fopen(nombreArchivo,"rb");
    if (file==NULL){
        mostrarMensajeCentro("Error al intentar acceder al archivo\n");
    }
    else{
    int i,elem;
    if (cant!=0){
    elem=pos;
    tipoTabla();
    for (i=pos;i<pos+cant;i++){
    Amigo amigo;
    fseek (file, (elem)*sizeof(Amigo), SEEK_SET);
        fread(&amigo, sizeof(Amigo), 1, file);
mostrarAmigo(amigo);
elem++;
}
}else{
mostrarMensajeCentro("No hay amigos con esa inicial.");
}
        fclose(file);
        printf("\n\n");
}
}

//Muestra los contactos dependiendo de la letra inicial
void mostrarApellidoInicial(char *nombreArchivo,char *nombreArchivoIndice,char c){
c=c-65;
FILE *file=fopen(nombreArchivo,"rb");
if (tamanioArchivo(nombreArchivo)==0){
mostrarMensajeCentro("Archivo Vacio");
fclose(file);
}else{
FILE *fileInd=fopen(nombreArchivoIndice,"rb");
if (fileInd==NULL){
mostrarMensajeCentro("Error al intentar acceder al archivo");
    }else{
Indice ind;
fseek(fileInd,(c)*sizeof(Indice),SEEK_SET);
fread(&ind,sizeof(Indice),1,fileInd);
fclose(fileInd);
mostrarArchivoApellido(nombreArchivo,ind.pos,ind.cantidad);
}
}
}

int borrarContactoArchivo(char *nombreArchivo, int pos){
    bool toReturn=true;
    if((tamanioArchivo(nombreArchivo)<pos)||(pos<1)){
        printf("La posicion indicada es invalida");
        toReturn=false;
    }else{
        FILE *file=fopen(nombreArchivo,"r+b");
        Amigo amigo;
        fseek (file, (pos-1)*sizeof(Amigo), SEEK_SET);
        fread(&amigo, sizeof(Amigo), 1, file);
        mostrarAmigo(amigo);
        presUnaTecla();
        amigo.flag=false;
        fseek (file, -1*sizeof(Amigo), SEEK_CUR);
        fwrite(&amigo,sizeof(Amigo),1,file);
        fclose(file);
    }
    return toReturn;
}

int borrarContactoLista(Lista *lista, int pos){
    Persona *aux=lista->inicio, *elemEliminar;
    bool toReturn=false;
    int i;
    if(pos!=1){
        for(i=1;i<pos-1;i++){
            aux=aux->sig;
        }
        elemEliminar=aux->sig;
        aux->sig=elemEliminar->sig;
        free(elemEliminar);
        toReturn=true;
    }else{
        suprimirInicio(lista);
        toReturn=true;
    }
    return toReturn;
}

void mostrarBuscadoArchivo(char *nombreArchivo,Amigo buscoAmigo){
FILE *file=fopen(nombreArchivo,"rb");
Amigo amigo;
int i=1;
while(fread(&amigo, sizeof(Amigo), 1, file)){
        if (estaApellidONombre(amigo,buscoAmigo)){
            printf(" %i ",i);
            mostrarAmigo(amigo);
            i++;
        }
}
fclose(file);
    if(i==1)mostrarMensajeAviso("No se encontraron amigos con ese nombre y/o apellido");
}

void mostrarBuscadoLista(Lista *lista,Amigo buscoAmigo){
    Persona *aux=lista->inicio;
    int i=1;
while(aux){
        if(estaApellidONombre(aux->dato,buscoAmigo)){
                printf(" %i ",i);
                mostrarAmigo(aux->dato);
                i++;
        }
        aux=aux->sig;
}
if(i==1) mostrarMensajeAviso("No se encontraron amigos con ese nombre y/o apellido");
}

int estaApellidONombre(Amigo amigo, Amigo buscoAmigo){
    bool existe =false;
    existe = (strcmpi(amigo.apellido,buscoAmigo.apellido)==0);
    existe |= (strcmpi(amigo.nombre,buscoAmigo.nombre)==0);
    return existe;
}

Amigo pedirAmigoBuscar(){
    Amigo amigoBuscar;
    do{
printf("\nIngrese el apellido de su amigo.\n");
        fgets(amigoBuscar.apellido,17, stdin);
        limpiar(amigoBuscar.apellido);
}while (strlen(amigoBuscar.apellido)>17);
do{
printf("\nIngrese el nombre de su amigo.\n");
        fgets(amigoBuscar.nombre,17, stdin);
        limpiar(amigoBuscar.nombre);
}while (strlen(amigoBuscar.nombre)>17);
return amigoBuscar;
}


int pedirNombreMes(){
    char mes[12];
    do{
        printf("\nIngrese el nombre: \n");
        fgets(mes,12, stdin);
        limpiar(mes);
    } while ((strlen(mes)>12) || (esMes(mes))==0);
}

int esMes(char *mes){
    int toReturn=-1;
    int i=0;
    while((i<12) && (toReturn==-1)){
        if(strcmpi(arrMes[i],mes)==0){
            toReturn=i+1;
        }
        i++;
    }
    return toReturn;
}

void MostrarCumpleMesLista(Lista *lista,int mes){
    Persona *aux=lista->inicio;
    int i=1;
    while(aux){
        if(aux->dato.fecNac.mes==mes){
            printf(" %i ",i);
            mostrarAmigo(aux->dato);
            i++;
        }
        aux=aux->sig;
    }
}

void MostrarCumpleMesArchivo(char *nombreArchivo,int mes){
    FILE *file=fopen(nombreArchivo,"rb");
    if(file==NULL){
        mostrarMensajeAviso("Hubo un error al abrir el archivo");
    }else{
        Amigo amigo;
        int i=1;
        while(fread(&amigo,sizeof(Amigo),1,file)){
            if(amigo.fecNac.mes==mes){
                printf(" %i ",i);
                mostrarAmigo(amigo);
                i++;
            }
        }
    }
    fclose(file);
}
[code=c]
[/code]
9  Programación / Programación C/C++ / Re: ERROR en C process returned -10737441819 en: 14 Abril 2016, 16:19 pm
Código
  1. ordenarMenAMay(numero[Max],cant);

Cuando declaras un array, pones entre los corchetes su tamaño, bien. A partir de ahí, cuando pones un número entre los corchetes, estás indicando un elemento del array.
"numero" -> array
"numero[0]" -> primer elemento del array
"numero[MAX-1]" -> último elemento del array
"numero[MAX]" -> elemento inexistente (lo que habría después del último elemento). Esto debió darte el error, pues accedes a un lugar de memoria incorrecto.
Aunque no solo eso:

Código
  1. void CargarDatos (int num[],int lim)
Ahí pides como primer parámetro un array de entero. Le estabas pasando un entero, que interpretaría como una dirección de memoria. Quizás te diera algún warning a la hora de compilar.

Que gran explicacion.. Gracias, por ahi no me doy cuenta de esas cosas.. Es un error que espero no cometer.. Son errores minuciosos, pero por ahi son dificiles de encontrar.. Gracias nuevamente. Un abrazo!.
10  Programación / Programación C/C++ / Re: ERROR en C process returned -10737441819 en: 14 Abril 2016, 15:44 pm
-10737441819, en hexadecimal C0000005 es un error, violación en acceso a la memoria. Tienes algún problema con punteros y memoria, ya sea leer como escribir donde no es. Revisa los punteros. Localiza el problema.

Ahi revise todo.. El "error" o no se, es que pasaba todos los parametros con el valor Max
Código:
ordenarMenAMay(numero[Max],cant);


Al sacar eso del parametro y dejarlo asi:

Código:
ordenarMenAMay(numero,cant);

Ahora dejo el codigo corregido..
Desde ya, gracias a todos por la ayuda y pregunto..
Fue un error haber pasado el Max como parametro?. Yo cree la variable
Código:
int numero[Max];

Al hacer eso, dejo claro que el maximo de elementos va a ser "Max" y por eso no hace falta pasarlo como parametro en alguna funcion?.

Pregunto, porque no entendi el "error" en cuestion.. Disculpen las molestias.. Dejo el codigo..

Codigo funcionando:
Código:
#include<stdio.h>
#define Max 255

void EjDiez (int num[],int lim);
void CargarDatos (int num[], int lim);
void MostrarDatos (int num[],int lim);
void ordenarMenAMay(int num[], int lim);
void ordenarMayAMen (int num[],int lim);
void intercambiar(int *a, int *b);
void organizarParEImpar (int num[],int lim);

int main(){
    int numero[Max];
    int marca,largo,cant;
    printf("ingrese el maximo de numeros: ");
    scanf("%i",&cant);
    CargarDatos(numero, cant);
    printf("\nSi la cantidad de elementos es par, muestra el 1er num del arreglo\n");
    printf("sino, muestra el numero que esta en la mitad del arreglo\n");
    EjDiez(numero,cant);
    printf("\n");
    system("pause");
    printf("Ordena el arreglo de Menor a Mayor\n");
    ordenarMenAMay(numero,cant);
    MostrarDatos(numero, cant);
    system("pause");
    printf("Ordena el arreglo de Mayor a Menor\n");
    ordenarMayAMen(numero,cant);
    MostrarDatos(numero, cant);
    system("pause");
    printf("Ordena el arreglo de Par a Impar\n");
    organizarParEImpar(numero, cant);
    MostrarDatos(numero, cant);
    return 0;
    system("pause");
}


void CargarDatos (int num[],int lim){ //Carga el arreglo desde el teclado
    int a,i;
    for(i=0;i<lim;i++){
        printf("\n\nIngrese un numero: ");
        scanf("%i",&a);
        num[i]=a;
    }
    printf("\n");
}


void EjDiez (int num[],int lim){     //Si la cantidad de elemtos es par, muestra el 1er num del arreglo
    int i=0;                           //sino, muestra el numero que esta en la mitad del arreglo
    if ((lim % 2)==0){ //Se fija si es PAR
        printf("\n\nEl numero es PAR: (muestro el primer num del arreglo)  %i",num[i]);
    }
    else{
        i = (lim / 2); //Busca la mitad del arreglo
 //       printf("\n\n el div %i",i);
        printf("\n\nEl numero es IMPAR: (muestro el num de la mitad del arreglo) %i",num[i]);
    }
}

void MostrarDatos (int num[],int lim){  //Muestra los datos del arreglo
    int i;
    for(i=0;i<lim;i++){
        printf("\n\nMostrar un numero:%i \n",num[i]);
    }
}



void ordenarMayAMen (int num[],int lim){ //Ordena los elem del arreglo de Mayor a Menor
    int j,i;
    for (i=0;i<lim;i++){
        for (j=i;j<lim;j++){
            if (num[i]<num[j]){
                intercambiar(&num[i],&num[j]);
            }
        }
    }
}

void intercambiar(int *a, int *b){ //Intercambia 2 valores
    *b=*a+*b;
    *a=*b-*a;
    *b=*b-*a;
}


void ordenarMenAMay(int num[],int lim){ ////Ordena los elem del arreglo de Mayor a Menor
    int j,i;
    for (i=0;i<lim;i++){
        for (j=i;j<lim;j++){
            if (num[i]>num[j]){
                intercambiar(&num[i],&num[j]);
            }
        }
    }
}

void organizarParEImpar (int num[],int lim){ //Organiza la lista, primero los numeros pares y despues los impares
    int i=0,j=0,k=0;
    int cantPar,cantImpar;
    int par[Max];
    int impar[Max];
    for (i=0;i<lim;i++){
        if ((num[i] % 2)==0){
            par[j]=num[i];
            j++;
        }
        else {
            impar[k]=num[i];
            k++;
        }
    }

    cantImpar=k;
    cantPar=j;
    i=0;
    for(j=0;j<cantPar;j++){
        num[i]=par[j];
        i++;
    }
    for (k=0;k<cantImpar;k++){
        num[i]=impar[k];
        i++;
    }
 //   system("pause");
}
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines