Glosario

Abreviatura para la Notación Polaca Inversa o Reverse Polish Notation.
Esta notación de sufijo es la sintaxis de entrada que casi todas las calculadoras HP usan. Básicamente hay dos tipos de RPN. Una usada en calculadoras más viejas, hace que el ENTER duplique el nivel uno del stack en la línea de edición, y otro, usado en las 28/38G/48/49/50, que hace que el ENTER duplique el nivel uno si la línea de edición no está siendo usada, y que pone el contenido de la línea de edición en el nivel uno si la línea de edición está siendo usada. RPN usa notación de sufijo, así que 1+1 es introducido 1 ENTER 1 + en vez de 1 + 1 =.
Esto puede parecer más confuso al principio, pero es mucho más sencillo con expresiones más complejas. La Notación Polaca Inversa se basa en los trabajos de el polaco Jan Lukasiewicz, quien creó la notación de prefijo ( + 1 1 ) llamada Notación Polaca.

Ayuda porfa :), duda con programacion HPGCC

12 respuestas [Último envío]
Integró: 24/06/2009
Envíos: 1
MonedasHP: 0
Imagen de Elias
Calc: HP50
Ayuda porfa :), duda con programacion HPGCC
 
Mié, 24/06/2009 - 18:18

Tengo una gran duda, como puedo ingresar un numero imaginario al realizar un programa en hpgcc, por ejemplo para un entero es muy facil (int x), y despues con printf podemos imprimir un cierto numero, pero con los numeros complejos como le hago? Sad, como puedo declarar un complejo?, operaciones entre complejos?, y mostrar numeros complejos?, por favor ayuda,:'(, necesito saber como Smile, grax

Top
Integró: 31/03/2007
Envíos: 50
MonedasHP: 26
Imagen de billyhp
 
#1
Lun, 06/07/2009 - 12:18

Hola Elias, no conozco mucho sobre este lenguaje y su uso en la calculadora, estoy aprendiendo igual que tú, pero vi algo relacionado con tu pregunta en la página:

http://sense.net/~egan/hpgcc/

En el indice verás en la parte 2:

Extend your 50g with C - Part 2
How to Follow the Examples
The Examples

Example: Real and Complex LogGamma

Este ejemplo habla sobre como manipular complejos pero es descargando un archivo dado en la misma sección, lo pongo por si acaso:

http://www.hydrix.com/Download/Hp/hpgcc/arm-elf-toolchain.4.2.2.linux.ta...

Este solo sirve para el compilado utilizando cygwin, bueno toda la información detallada la encuentras en está página, que a mi me está sirviendo mucho, saludos.

Top
Integró: 27/07/2006
Envíos: 318
MonedasHP: 454
Imagen de angel_legendario
 
#2
Mié, 11/08/2010 - 11:40

Holas, despues de mucho tiempo vuelvo a este negocio jejeje (estaba falto de tiempo) y queria una ayuda con este codigo, porque me sale error en una de las funciones.

#include hpgcc49.h

#define MAXCADENA 200

enum { Ver=1, Alta, Buscar, Salir} ;

struct Entrada {
char * nombre;
char * direccion;
char * telefono;
};

struct NodoAgenda {
struct Entrada datos;
struct NodoAgenda * sig;
};

typedef struct NodoAgenda * TipoAgenda;

void quita_fin_de_linea(char linea[])
{
int i;
for (i=0; linea[i] != '\0' ; i++)
if (linea[i] == '\n') {
linea[i] = '\0';
break;
}
}

void muestra_entrada(struct NodoAgenda * e)
// POdríamos haber pasado e por valor, pero resulta más eficiente (y no mucho más
// incómodo) hacerlo por referencia: pasamos así sólo 4 bytes en lugar de 12.
{
printf("Nombre : %s\n", e->datos.nombre);
printf("Direccion: %s\n", e->datos.direccion);
printf("Telefono : %s\n", e->datos.telefono);
}

void libera_entrada(struct NodoAgenda * e)
{
int i;

free(e->datos.nombre);
free(e->datos.direccion);
free(e->datos.telefono);
free(e);
}

TipoAgenda crea_agenda(void)
{
return NULL;
}

TipoAgenda anyadir_entrada(TipoAgenda agenda, char nombre[],
char direccion[], char telefono[])
{
struct NodoAgenda * aux, * e;

/* Averiguar si ya tenemos una persona con ese nombre */
if (buscar_entrada_por_nombre(agenda, nombre != NULL))
return agenda;

/* SI llegamos aquí, es porque no teníamos registrada a esa persona. */
e = malloc(sizeof(struct NodoAgenda));
e->datos.nombre = malloc((strlen(nombre)+1)*sizeof(char));
strcpy(e->datos.nombre, nombre),
e->datos.direccion = malloc((strlen(direccion)+1)*sizeof(char));
strcpy(e->datos.direccion, direccion);
e->datos.telefono = malloc((strlen(telefono)+1)*sizeof(char));
strcpy(e->datos.telefono, telefono);
e->sig = agenda;
agenda = e;
return agenda;
}

void muestra_agenda(TipoAgenda agenda)
{
struct NodoAgenda * aux;

for (aux = agenda; aux != NULL; aux = aux->sig)
muestra_entrada(aux);
}

struct NodoAgenda * buscar_entrada_por_nombre(TipoAgenda agenda, char nombre[])
{
struct NodoAgenda * aux;

for (aux = agenda; aux != NULL; aux = aux->sig)
if (strcmp(aux->datos.nombre, nombre) == 0)
return aux;

return NULL;
}

void libera_agenda(TipoAgenda agenda)
{
struct NodoAgenda * aux, *siguiente;

aux = agenda;
while (aux != NULL) {
siguiente = aux->sig;
libera_entrada(aux);
aux = siguiente;
}
}

void escribe_agenda(TipoAgenda agenda, char nombre_fichero[])
{
struct NodoAgenda * aux;
FILE * fp;

fp = fopen(nombre_fichero, "w");
for (aux=agenda; aux!=NULL; aux=aux->sig)
fprintf(fp, "%s\n%s\n%s\n", aux->datos.nombre,
aux->datos.direccion,
aux->datos.telefono);
fclose(fp);
}

TipoAgenda lee_agenda(char nombre_fichero[])
{
TipoAgenda agenda;
struct Entrada * entrada_leida;
FILE * fp;
char nombre[MAXCADENA+1], direccion[MAXCADENA+1], telefono[MAXCADENA+1];
int longitud;

agenda = crea_agenda();

fp = fopen(nombre_fichero, "r");
while(1) {
fgets(nombre, MAXCADENA, fp);
if (feof(fp)) break; // Si se acabó el fichero, acabar la lectura.
quita_fin_de_linea(nombre);

fgets(direccion, MAXCADENA, fp);
quita_fin_de_linea(direccion);

fgets(telefono, MAXCADENA, fp);
quita_fin_de_linea(telefono);

agenda = anyadir_entrada(agenda, nombre, direccion, telefono);
}
fclose(fp);

return agenda;
}

/**********************
* Programa principal *
**********************/

int main(void)
{
TipoAgenda miagenda;
struct NodoAgenda * encontrada;
int opcion;
char nombre[MAXCADENA+1];
char direccion[MAXCADENA+1];
char telefono[MAXCADENA+1];
char linea[MAXCADENA+1];

clear_screen();

miagenda = lee_agenda("agenda.txt");

do{
printf("Menu:\n");
printf("1) Ver contenido completo de la agenda.\n");
printf("2) Dar de alta una persona.\n");
printf("3) Buscar telefonos de una persona.\n");
printf("4) Salir.\n");
printf("Opcion: ");
gets(linea); sscanf(linea, "%d", &opcion);

switch(opcion) {
case Ver:
muestra_agenda(miagenda);
break;

case Alta:
printf("Nombre : "); gets(nombre);
printf("Direccion: "); gets(direccion);
printf("Telefono : "); gets(telefono);
miagenda = anyadir_entrada(miagenda, nombre, direccion, telefono);
break;

case Buscar:
printf("Nombre: "); gets(nombre);
encontrada = buscar_entrada_por_nombre(miagenda, nombre);
if (encontrada == NULL)
printf("No hay nadie llamado %s en la agenda.\n", nombre);
else
muestra_agenda(encontrada);
break;
}
} while (opcion != Salir);

escribe_agenda(miagenda, "agenda.txt");
libera_agenda(miagenda);

while(!keyb_isON());
}

Porque error en la funcion: "buscar_entrada_por_nombre()"
Lo copie de un ejemplo en un libro, pero parece que esta mal, lo probe con devc++ y me sale el mismo error.

Gracias por adelantado por la ayuda.

RPN=Realidad , ALGEBRAICO=Subjetivo
https://sites.google.com/site/calcu50g/
Les invito a que visiten mis blogs:
http://santo-grial-hp.blogspot.com/
http://sub-vivencias.blogspot.com/

Un site dedicado a la hidrología http://sites.google.com/site/c

Top
Integró: 20/05/2003
Envíos: 209
MonedasHP: 214
Imagen de Edwin
Calc: HP48G/GX
 
#3
Mié, 11/08/2010 - 13:52

Hola Angel,
En la línea 60 usted tiene

/* Averiguar si ya tenemos una persona con ese nombre */
if (buscar_entrada_por_nombre(agenda, nombre != NULL))
return agenda;

debería ser:
/* Averiguar si ya tenemos una persona con ese nombre */
if (buscar_entrada_por_nombre(agenda, nombre) != NULL)
return agenda;

Ahora estas tratando de usar la función "buscar_entrada_por_nombre()" en la línea 60, la cual no ha sido declarada, aparece declarada en la línea 84, entonces para solucionar esto una posibilidad es declarar esta función al principio en la línea 20 después de definir TipoAgenda, quedaría así:

typedef struct NodoAgenda * TipoAgenda;
struct NodoAgenda * buscar_entrada_por_nombre(TipoAgenda agenda, char nombre[]);

Los otros ya son Warming, de variables no usadas, hay que agregarle un enter al final del documento, y al final de la función main agregar return 0; ya que main() retorna un entero.

La cuestión en la vida no es saber mucho, sino olvidarse de poco.
http://www.edwincordoba.com/

Top
Integró: 17/09/2007
Envíos: 153
MonedasHP: 211
Imagen de LuisBeas
 
#4
Mié, 11/08/2010 - 19:31

Holas aprovechando que Edwin esta contestando Laughing out loud y hice un programa para ahorrar pilas:

#include 
int pr( char ch );
int letra( char ch );
void redibujador(int no, double *datos);
int main(){
	char linea[100];
    char ch;
    /* an es auxiliar de los numeros*/
    double an,datos[200];
    int cedun,cedul,sig,c,no=0,pos=0,aoa=0,t=0,ac; 
    /* no es la cantidad de niveles ocupados */
    /* cedun Carga Exitosa De Un Numero*/
    /* cedul Carga Exitosa De Un Letra*/
	clear_screen();
    for(c=7;c>0;--c) printf("%d:\n",c);
	while(!keyb_isON()){
	gets(linea); 
    t=0;
    while(linea[t]!='\0')t++;
    pos=0;
    while(linea[pos]!='\0' && pos <= t ){
         cedun=cedul=c=aoa=0;
         sig=1.,an=ac=0;
         ch=linea[pos]; 
         if(ch=='-'){sig=-1.;
                     pos++;        
                     ch=linea[pos];}
         
         while(pr(ch)){if(ch=='.'){c++;
                                   pos++;        
                                   ch=linea[pos];}
       
                                   if(pr(ch)){if(c){an=(an*pow(10,c)+ch-'0')/pow(10,c);
                                                    c++;}
                                              else an=an*10.+ch-'0';
                                              cedun=1;
                                              pos++;        
                                              ch=*(linea+pos);}
                                 }/* */ 
        if(cedun==1){for(c=no;c>0;--c)datos[c]=datos[c-1];
                     datos[0]=an*sig;
                     no++;
                     redibujador(no,datos);}
                       
        else{if(sig==-1.){datos[0]=datos[1]-datos[0];
                          if(no>2)for(c=2;c2)for(c=2;c0;--c)datos[c]=datos[c-1];
                                                  ++no;
                                                  redibujador(no,datos);
                                break; 
                                
                                case 'S'+'W'+'A'+'P': an=datos[1];
                                                      datos[1]=datos[0]; 
                                                      datos[0]=an;
                                                      redibujador(no,datos);
                                break;
                                
                                case 'R'+'O'+'T': an=datos[2];
                                                  datos[2]=datos[1];
                                                  datos[1]=datos[0];
                                                  datos[0]=an;
                                                  redibujador(no,datos);
                                break;
                                
                                case 'U'+'N'+'R'+'O'+'T': an=datos[0];
                                                          datos[0]=datos[1];
                                                          datos[1]=datos[2];
                                                          datos[2]=an;
                                                          redibujador(no,datos);
                                break;
                                
                                case 'S'+'Q': datos[0]=datos[0]*datos[0];
                                              redibujador(no,datos);
                                break;               
                                case 'S'+'Q'+'R'+'T': datos[0]=sqrt(datos[0]);
                                                      redibujador(no,datos);
                                break;                      
                                case 'S'+'I'+'N': datos[0]=sin(datos[0]*3.141592/180.);
                                                  redibujador(no,datos);
                                break;                  
                                case 'C'+'O'+'S': datos[0]=cos(datos[0]*3.141592/180.);
                                                  redibujador(no,datos);
                                break;                  
                                case 'T'+'A'+'N': datos[0]=tan(datos[0]*3.141592/180.);
                                                  redibujador(no,datos);
                                break;                   
                               }                             
                      }
                                                           
        
        if(ch==' '){ pos++; }
        
        }  /* fin del while segundario*/ 
                  
             } /* fin del while principal*/ 
return 0; } /* fin de la funcion main() */




 
int pr( char ch ){ return ( '0'<=ch && ch<='9' ) || (ch == '.') ; }
int letra( char ch ){ return ( 'A'<=ch  && ch<='Z' );  } 
void redibujador(int no, double *datos){
      int c;
      clear_screen(); 
      if(no<7){
               for(c=0;c<7;++c)
                                if(7>(no+c)) printf("%c:\n",'7'-c); 
                                else printf("%c:  %f\n",'7'-c,*(datos+6-c));                      
               
               }
      else { for(c=0;c<7;++c)printf("%c:  %f\n",'0'+7-c,*(datos+6-c)); }  
}

Pero cuando yeve el programa a la calculadora me di con una sorpresa y fue no poder teclear el caracter '/', ¿como se puede teclear este caracter en la calculadora?

Top
Integró: 20/05/2003
Envíos: 209
MonedasHP: 214
Imagen de Edwin
Calc: HP48G/GX
 
#5
Mié, 11/08/2010 - 21:19

Hola Luis,
No a mi no me compila ni siquiera el programa, veo unos errores en los ciclos for de la línea 47, y además veo que usas el case, pero en ningún momento declaro el switch. Me muestra los siguientes errores:

> "dmake" test2.o
arm-elf-gcc -mtune=arm920t -mcpu=arm920t -mlittle-endian -fomit-frame-pointer -msoft-float -Wall -Os -pipe -mthumb-interwork -mthumb -IC:\HPGCC-2.0-native-win32-SP2/include -I.. -c test2.c -o test2.o
test2.c: In function 'main':
test2.c:47: error: 'c2' undeclared (first use in this function)
test2.c:47: error: (Each undeclared identifier is reported only once
test2.c:47: error: for each function it appears in.)
test2.c:47: error: expected ';' before ')' token
test2.c:47: error: 'c0' undeclared (first use in this function)
test2.c:52: error: case label not within a switch statement
test2.c:58: error: case label not within a switch statement
test2.c:65: error: case label not within a switch statement
test2.c:72: error: case label not within a switch statement
test2.c:75: error: case label not within a switch statement
test2.c:78: error: case label not within a switch statement
test2.c:81: error: case label not within a switch statement
test2.c:84: error: case label not within a switch statement
test2.c:114:2: warning: no newline at end of file
make: *** [test2.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00

La cuestión en la vida no es saber mucho, sino olvidarse de poco.
http://www.edwincordoba.com/

Top
Integró: 17/09/2007
Envíos: 153
MonedasHP: 211
Imagen de LuisBeas
 
#6
Mié, 11/08/2010 - 23:35
Top
Integró: 27/07/2006
Envíos: 318
MonedasHP: 454
Imagen de angel_legendario
 
#7
Jue, 12/08/2010 - 10:40

Gracias Edwin por la ayuda, si yo sabia que iba por ahi el problema pero plantee mal la solucion. Ahora el problema que me presenta es que... no funciona el programa Big smile , parece que es un error de punteros jijiji, tendre que hacer una revision total de todo.
Nuevamente gracias Edwin y un saludo.

RPN=Realidad , ALGEBRAICO=Subjetivo
https://sites.google.com/site/calcu50g/
Les invito a que visiten mis blogs:
http://santo-grial-hp.blogspot.com/
http://sub-vivencias.blogspot.com/

Un site dedicado a la hidrología http://sites.google.com/site/c

Top
Integró: 20/05/2003
Envíos: 209
MonedasHP: 214
Imagen de Edwin
Calc: HP48G/GX
 
#8
Jue, 12/08/2010 - 13:46

Si ahora si me compila, 0 errores 0 warnings. Pero el problema que tienes es la implementación para la calculadora del comando gets(). Ya que para la calculadora comparte la tecla 'Z' y '/'. Y el comando gets() lo toma siempre como Z. Como solución puedes reprogramar el comando gets con comandos como:
keyb_isAnyKeyPressed()
keyb_isKeyPressed(a,b)
...

La cuestión en la vida no es saber mucho, sino olvidarse de poco.
http://www.edwincordoba.com/

Top
Integró: 17/09/2007
Envíos: 153
MonedasHP: 211
Imagen de LuisBeas
 
#9
Jue, 12/08/2010 - 15:48

Esta bien gracias Edwin

Top
Integró: 20/05/2003
Envíos: 209
MonedasHP: 214
Imagen de Edwin
Calc: HP48G/GX
 
#10
Vie, 13/08/2010 - 22:28

angel_legendario cita:
Gracias Edwin por la ayuda, si yo sabia que iba por ahi el problema pero plantee mal la solucion. Ahora el problema que me presenta es que... no funciona el programa Big smile , parece que es un error de punteros jijiji, tendre que hacer una revision total de todo.
Nuevamente gracias Edwin y un saludo.

Hola Angel, estuve probando el programa y funciona bien, lo que necesita es que exista por lo menos un archivo agenda.txt vació en la tarjeta SD.

La cuestión en la vida no es saber mucho, sino olvidarse de poco.
http://www.edwincordoba.com/

Top
Integró: 27/07/2006
Envíos: 318
MonedasHP: 454
Imagen de angel_legendario
 
#11
Sáb, 14/08/2010 - 17:31

Laughing out loud Ahora si! gracias Edwin eres un grande!.

RPN=Realidad , ALGEBRAICO=Subjetivo
https://sites.google.com/site/calcu50g/
Les invito a que visiten mis blogs:
http://santo-grial-hp.blogspot.com/
http://sub-vivencias.blogspot.com/

Un site dedicado a la hidrología http://sites.google.com/site/c

Top
Integró: 15/08/2010
Envíos: 2
MonedasHP: 8
Imagen de MarcusSnake
Calc: HP50 | ROM:2.15
 
#12
Dom, 15/08/2010 - 00:34

soy nuevo aqui , se que aprendere mucho GRACIAS A TODOS linda comunidad Smile

Top

Twitter

Cargando...

CAPTCHA
Esta pregunta es para probar si usted es un visitante humano y así evitar el spam automatizado.
5 + 13 =
Solucione este simple problema matemático e ingrese el resultado. Por ejemplo: para 1+3, ingrese 4.