|
141
|
Programación / Programación C/C++ / Re: problema con lista indexada
|
en: 4 Enero 2014, 04:15 am
|
gracias por sus respuestas, es en lenguaje C. preguntaba lo de los indices porque queria hacer una busqueda binaria con una lista enlazada y necesitaba saber el número total de elementos, pero mejor voy a hacer la busqueda secuencial. Una ultima duda si ya tengo hecha la lista enlazada y quiero buscar un elemento,le paso a la funcion de buscar() el puntero que apunta al primer nodo y despues voy recorriendo la lista para ver si se encuentra el elemento, pero el problema es que el codigo siempre me imprime NO SE ENCONTRO EL CODOP DE OPERACION y no entiendo por que typedef struct nodo { char *codigo; struct nodo *sig; }CODOP; void buscarCodop(CODOP *cabeza) { CODOP *ptr; char *codop = "BLE"; int encontrado = 0; for(ptr = cabeza;(ptr != NULL)&&(encontrado);ptr = ptr->sig) { if((strcmp(ptr ->codigo ,codop )) == 0) encontrado = 1; } if(encontrado == 0) printf("\nNO SE ENCONTRO EL CODOP DE OPERACION\n"); else printf("\nNO SE ENCONTRO EL CODOP DE OPERACION\n"); }
esta es la parte que me da problemas, no posteo todo el codigo porque son como 360 lineas gracias
|
|
|
142
|
Programación / Programación C/C++ / problema con lista indexada
|
en: 4 Enero 2014, 01:37 am
|
Saludos, estoy haciendo una lista simplemente ligada la cual tiene un campo indice para que cada que vaya agregando un elemento sepa cuantos elementos tiene. El problema es que cuando inicializo ese campo a 0 dentro de la structura me aparece un error typedef struct nodo { char *codigo; int indice = 0; struct nodo *sig; }NODO;
me dice que expected ':', ','...... or attribute before token gracias
|
|
|
143
|
Programación / Programación C/C++ / Re: busqueda binaria en archivo
|
en: 2 Enero 2014, 00:34 am
|
El lenguaje es C, y el archivo en el cual tengo que buscar un codop es este:
ABA NO INH 1806 2 0 2 ABX NO IDX 1AE5 2 0 2 ABY NO IDX 19ED 2 0 2 ADCA SI IMM 89ii 1 1 2 DIR 99dd 1 1 2 EXT B9hhll 1 2 3 IDX A9xb 1 1 2 IDX1 A9xbff 1 2 3 IDX2 A9xbeeff 1 3 4 [D,IDX] A9xb 1 1 2 [IDX2] A9xbeeff 1 3 4
el problema es que aqui si quiero hacer la busqueda binaria no se puede porque aunque tengo 4 codops(aby,adca, etc) el archivo tiene 11 lineas porque el adca tiene muchos modos de direccionamiento y no podria saber donde esta el codop ubicado en la mitad del archivo, entonces no se como podria resolver eso, es la parte que me confunde mas!!! y luego despues de buscar el codop tengo que ver si tiene operando, los modos de direccionamiento e imprimirlos
gracias
|
|
|
144
|
Programación / Programación C/C++ / Re: busqueda binaria en archivo
|
en: 1 Enero 2014, 02:13 am
|
gracias leosansan, entonces no puedo hacer una busqueda binaria directamente de un archivo de texto???tomando en cuenta que los codops del archivo estan ya ordenados y otra duda que sería más conveniente por ejemplo si tengo la linea:
ABA NO INH 1806 2 0 2
si primero tengo que buscar el codop y despues ver checar algunas cosas con los demas datos, que seria mas conveniente guardar solo el ABA en una estructura o toda la linea
|
|
|
145
|
Programación / Programación C/C++ / busqueda binaria en archivo
|
en: 31 Diciembre 2013, 22:54 pm
|
Saludos
tengo la siguiente tabla de instrucciones(de un ensamblador) capturada en un archivo txt:
codop ABA NO INH 1806 2 0 2 ABX NO IDX 1AE5 2 0 2 ABY NO IDX 19ED 2 0 2 ADC SI IMM 89ii 1 1 2 .. .. ..
y tengo por ejemplo un codigo de operacion que dice ABY, el cual lo tengo que buscar en este archivo, para ello pense que seria mas rapido si lo hago con una busqueda binaria, pero me queda la duda de si tengo primero que guardar solamente los codigos de operacion(ABA,ADB...) en una estructura de datos para despues poder hacer la busqueda, o si tengo que recorrer el archivo completo linea por linea para saber cuantos codops son?? no les pido que posteen el codigo solo que me dijeran cual podria ser la manera más optima y rapida de hacerlo
gracias
|
|
|
146
|
Programación / Programación C/C++ / funcion strcmpi()
|
en: 31 Diciembre 2013, 05:05 am
|
Saludos
tengo una duda con respecto a si la funcion strcmpi esta recomendada usarla o no. tengo entendido que a diferencia de strcmp, esta no es estandar, y si tengo que comparar dos cadenas pero sin diferenciar mayusculas de minusculas no se si hacerlo con esta funcion o hacerlo yo todo el procedimiento
de antemano gracias, y felices fiestas
|
|
|
147
|
Programación / Programación C/C++ / Re: Programa identifique partes de una linea
|
en: 28 Diciembre 2013, 02:17 am
|
ya supe donde estaba el error, en la bandera esEtiqueta, tuve que inicializarla a 1 porque si no no funcionaba y tambien por ejemplo en la etiqueta dos tambien me estaba leyendo dos mas un espacio en blanco y por eso me aparecia que todas las etiquetas tenian error, porque ese ' ' no es ni letra, ni digito ni guion bajo #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG_ETIQUETA 8 #define LONG_CODOP 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void erroresCodop(char *codop); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char caracter); booleano esLetra(char caracter); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL ) { while((car = fgetc(fd ))!= EOF ) { if(car == ';') { if(esComentario(fd)) else buscarFinLinea(fd); } else if(esLetra(car)) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("\nETIQUETA = %s\n",etiqueta ); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); erroresCodop(codop); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } booleano esLetra(char caracter) { if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z')) return 1; else return 0; } booleano esNumero(char caracter) { if(caracter >= '0' && caracter <= '9') return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; if(linea == ETIQUETA||linea == CODOP) { do { lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd )) != '\n') lon++; } cadena = (char*)calloc((lon +1),sizeof(char)); return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i = 0,esEtiqueta = 1; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n"); for(i = 0;(i < tam-1)&&(esEtiqueta);i++) { if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_')) esEtiqueta = 0; } if(!esEtiqueta) printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); } void erroresCodop(char *codop) { int tam,i = 0,esCodop = 1,punto = 0; if(tam-1 > LONG_CODOP) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if(!esLetra(codop[i])) printf("\tError:los codigos de operacion deben iniciar con letra\n"); else { for(i = 1;(i < tam-1)&&(esCodop)&&(punto>=0&&punto<=1);i++) { if((!esLetra(codop[i]))&&(codop[i] != '.')) esCodop = 0; else if(codop[i] == '.') punto++; } if(!esCodop) printf("\tError:los caracteres validos en los codigos de operacion son letras y el caracter punto\n"); if(punto > 1) printf("\tError:los codigos de operacion no pueden tener mas de un punto\n"); } }
pero yo todavia no entiendo por que no puedo inicializar la bandera con 0 aqui ya no hace lo que le pido void erroresEtiqueta(char *etiqueta) { int tam,i = 0,esEtiqueta = 0; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n"); for(i = 0;(i < tam-1)&&(esEtiqueta);i++) { if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_')) esEtiqueta = 1; } if(esEtiqueta == 1) printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); }
|
|
|
148
|
Programación / Programación C/C++ / Re: Programa identifique partes de una linea
|
en: 27 Diciembre 2013, 21:49 pm
|
Gracias leosansan por tu respuesta, yo crei que al hacer esto: esLetra(etiqueta,i) le estaba enviando un solo elemento de la cadena, lo que equivaldria a un caracter, para ya despues en la funcion poder hacer esto: if((etiqueta[i] >= 'A' && etiqueta[i] <= 'Z')||(etiqueta[i] >= 'a' && etiqueta[i] <= 'z')) return 1;
pero me queda una duda, si yo por ejemplo le agregara la regla de: los codigos de operacion deben iniciar con letra a los CODOPS e hiciera una funcion para verificar los errores de CODOPS, en este caso el if(!esLetra(codop,i)) si funciona y si me imprime el mensaje de error, cosa que no hace con la verificacion de errores en etiquetas por que es esto? void erroresCodop(char *codop) { int tam,i = 0; if(tam-1 > LONG_CODOP) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if(!esLetra(codop,i)) printf("\tError:los codigos de operacion deben iniciar con letra\n"); }
el codigo completo era este: #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG_ETIQUETA 8 #define LONG_CODOP 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void erroresCodop(char *codop); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char caracter[],int i); booleano esLetra(char caracter[],int i); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL ) { while((car = fgetc(fd ))!= EOF ) { if(car == ';') { if(esComentario(fd)) else buscarFinLinea(fd); } else if((car >= 'A' && car <= 'Z')||(car >= 'a' && car <= 'z')) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("\nETIQUETA = %s\n",etiqueta ); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); erroresCodop(codop); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } booleano esLetra(char caracter[],int i) { if((caracter[i] >= 'A' && caracter[i] <= 'Z')||(caracter[i] >= 'a' && caracter[i] <= 'z')) return 1; else return 0; } booleano esNumero(char caracter[],int i) { if(caracter[i] >= '0' && caracter[i] <= '9') return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; if(linea == ETIQUETA||linea == CODOP) { do { lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd )) != '\n') lon++; } return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i = 0,caracterInvalido = 0; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n"); for(i = 0;(i < tam)&&(caracterInvalido);i++) { if((!esLetra(etiqueta,i))&&(!esNumero(etiqueta,i))&&(etiqueta[i] != '_')) caracterInvalido = 1; } if(caracterInvalido == 1) printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); } void erroresCodop(char *codop) { int tam,i = 0; if(tam-1 > LONG_CODOP) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if(!esLetra(codop,i)) printf("\tError:los codigos de operacion deben iniciar con letra\n"); }
gracias y felices fiestas
|
|
|
149
|
Programación / Programación C/C++ / Programa identifique partes de una linea
|
en: 27 Diciembre 2013, 04:45 am
|
Saludos tengo un programa que me tiene que leer un archivo como por ejemplo: ;comentario numero 1 =TALLER= Et1 equ $ffFF dos LDAA @4732 ;comentario numero 2 ¡Programacion! ;comentario numero 3 tres sWi x,5 Netq%23 RMB 556 Et12_xyz12 ADCA 1,PC y me tiene que imprimir sus partes COMENTARIO ETIQUETA = Et1 CODOP = equ OPERANDO = $ffFF ... ... y asi con todas las lineas el problema es que para las las etiquetas tengo dos reglas, una que su longitud no sea mayor a 8 caracteres y otra, que solo tenga letras, numeros y el guion bajo, si una etiqueta tiene otro caracter tengo que imprimir Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo pero para el Netq%23 me tendria que imprimir un mensaje de error, por que tiene el %, pero no imprime nada no entiendo por que #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG_ETIQUETA 8 #define LONG_CODOPS 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char cadena[],int i); booleano esLetra(char cadena[],int i); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL ) { while((car = fgetc(fd ))!= EOF ) { if(car == ';') { if(esComentario(fd)) else buscarFinLinea(fd); } else if((car >= 'A' && car <= 'Z')||(car >= 'a' && car <= 'z')) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("\nETIQUETA = %s\n",etiqueta ); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } booleano esLetra(char *etiqueta,int i) { if((etiqueta[i] >= 'A' && etiqueta[i] <= 'Z')||(etiqueta[i] >= 'a' && etiqueta[i] <= 'z')) return 1; else return 0; } booleano esNumero(char *etiqueta,int i) { if(etiqueta[i] >= '0' && etiqueta[i] <= '9') return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; if(linea == ETIQUETA||linea == CODOP) { do { lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd )) != '\n') lon++; } return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i,caracterInvalido = 0; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n"); for(i = 0;(i < tam)&&(caracterInvalido);i++) { if((!esLetra(etiqueta,i))&&(!esNumero(etiqueta,i))&&(!etiqueta[i] == '_')) caracterInvalido = 1; } if(caracterInvalido) printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); }
el resto del codigo funciona bien, solo tengo problema con esa parte gracias
|
|
|
150
|
Programación / Programación C/C++ / fgetc()
|
en: 25 Diciembre 2013, 08:54 am
|
Saludos
Yo sé que la función fgetc funciona con un argumento que es un stream de tipo FILE, pero tengo la duda de si fgetc puede aceptar argumentos de otros tipos como char*??
gracias
|
|
|
|
|
|
|