The Museum of HP Calculators

HP Forum Archive 21

[ Return to Index | Top of Index ]

hp prime - programming with lists
Message #1 Posted by Giancarlo on 9 Nov 2013, 9:12 a.m.

Hello, Today i was playing with lists in programs and in particular list of strings. Please tell me if i am wrong with explorations.

1) sort(list) doesn't work with strings. Items are unchanged after 'sort'. 'Sort' does work with numbers.

2) i am not able to delete an item of a list in my program. I was trying to remove a string from a list in vain. Since i wasn't able to remove it, i assigned an empty value "" to it. Do you know which command there is to remove an item from a list? I could write a program to do it in case it doesn't exist.

3) i read somewhere in this forum that the way to assign a string to a variable via a Input() command was to define the variable and assign a value to it like: local X2:=""; input (x2, "my title","my variable"); The result is not very useful. I can see an empty string into the variable entry field but i cannot use it because i edit the command line so i have to manually add the string "" and then entry my text.

4) I defined an input() of a string in a "repeat... until..." loop. When i run into this loop the first time i can entry the string but starting from the second loop, when i see the input screen of the string, i can still see the value i entered during the first run. Did you encouter the same issue?

Thanks

Giancarlo

P.s. please answers to my points referring to the point numbers i indicated. The reading will be easier.

      
Re: hp prime - programming with lists
Message #2 Posted by Marcus von Cube, Germany on 9 Nov 2013, 10:29 a.m.,
in response to message #1 by Giancarlo

ad 2: remove(what,list) removes the item 'what' from a list. To be precise, 'what' is either a boolean function to identify list items to remove or the value to remove. 'what' is not the position! A workaround could be to replace the item in question by a special value and then use remove() to remove all occurrences of the marker from the list.

      
Re: hp prime - programming with lists
Message #3 Posted by Patrice on 9 Nov 2013, 4:05 p.m.,
in response to message #1 by Giancarlo

1+2) Here is a couple utilities about list handling in a programming point of view. The name come from the language Clipper (xBase)

with examples at the end

EXPORT AAdd(Lst, Val_)  // add element at end of list
BEGIN
RETURN CONCAT(Lst, {Val_});
END;

EXPORT AIns(Lst, Pos_, Val_) // insert element in list BEGIN IF Pos_ == 1 THEN RETURN CONCAT({Val_}, Lst); END; IF Pos_ > SIZE(Lst) THEN RETURN CONCAT(Lst, {Val_}); END; RETURN CONCAT(CONCAT(Sub(Lst, 1, Pos_-1), {Val_}), Sub(Lst, Pos_, (SIZE(Lst)))); END;

EXPORT ADel(Lst, Pos_) // delete element of list BEGIN LOCAL Tmp; IF Pos_ == 1 THEN IF SIZE(Lst) == 1 THEN Tmp:= {}; ELSE Tmp:= SUB(Lst,2,SIZE(Lst)); END; ELSE IF Pos_ == SIZE(Lst) THEN Tmp:= SUB(Lst,1,SIZE(Lst)-1); ELSE Tmp:= CONCAT(Sub(Lst, 1, Pos_-1), Sub(Lst, Pos_+1, (SIZE(Lst)))); END; END; RETURN Tmp; END;

EXPORT ADelTail(Lst) // delete last element of list BEGIN IF SIZE(Lst) == 1 THEN RETURN {}; ELSE RETURN SUB(Lst,1,SIZE(Lst)-1); END; END;

EXPORT ASize(Lst, NewSize) // resize list BEGIN LOCAL Tmp; IF NewSize == 0 THEN Tmp:= {}; END; IF SIZE(Lst) > NewSize THEN Tmp:= SUB(Lst,1, NewSize); END; IF SIZE(Lst) == NewSize THEN Tmp:= Lst; END; IF SIZE(Lst) < NewSize THEN Tmp:= CONCAT(Lst, MAKELIST(0, A, SIZE(Lst)+1, NewSize)); END; RETURN Tmp; END;

EXPORT ATail(Lst) // Last element of list BEGIN RETURN Lst(SIZE(Lst)); END;

EXPORT ASort(Lst, Col) // Sort a list of lists BEGIN LOCAL Scan, Tmp, Pos, Db, Fn, Ml; IF SIZE(Lst) > 0 THEN Tmp:= {Lst(1)}; FOR Scan FROM 2 TO SIZE(Lst) DO IF Lst(Scan,Col) < Tmp(1,Col) THEN Tmp:= AIns(Tmp, 1, Lst(Scan)); ELSE IF Lst(Scan,Col) >= Tmp(SIZE(Tmp),Col) THEN Tmp:= AAdd(Tmp, Lst(Scan)); ELSE Db:= 2; Fn:= SIZE(Tmp)-1; WHILE Db <= Fn DO Ml:= IP((Db+Fn)/2); IF Tmp(Ml,Col) <= Lst(Scan,Col) THEN Db:= Ml+1; ELSE Fn:= Ml-1; END; END; Tmp:= AIns(Tmp, Db, Lst(Scan)); END; END; END; ELSE Tmp:= {}; END; RETURN Tmp; END;

EXPORT TestList() BEGIN LOCAL Cnt, List; List:= {}; FOR Cnt FROM 1 TO 15 DO List:= AAdd(List, Cnt); MSGBOX(ATail(List)+":"+STRING(List)); END;

List:= MAKELIST(A, A, 1, 15, 1); FOR Cnt FROM 1 TO 15 DO List:= ADel(List, 1); MSGBOX(List); END;

List:= MAKELIST(A, A, 1, 15, 1); FOR Cnt FROM 1 TO 10 DO List:= ADel(List, 3); MSGBOX(List); END;

List:= MAKELIST(A, A, 1, 15, 1); FOR Cnt FROM 1 TO 15 DO List:= ADelTail(List); MSGBOX(List); END;

END;

            
Re: hp prime - programming with lists
Message #4 Posted by Giancarlo on 10 Nov 2013, 2:13 a.m.,
in response to message #3 by Patrice

Hello Markus and Patrice, Thank you very much for your answer. I am goign to work on this today and let you know the result(s).

Regarding point 4). Running a loop with an input() command in it is obvious that the local variable maintain the last value entered at each iteration of the loop. Anyway i solved the issue, assigning a "" value at the end of each iteration.

At this point only question 3 remains unsolved. Any idea on how to input() a string in a clean way? This is what i tried:

EXPORT PROVA() BEGIN

LOCAL X1:=""; INPUT(X1,"titolo","stringa: ");

END

As said at the first post of this thread, i assigned to my local variable an empty string "". When i execute the program, i can see the two "" in the variable entry field at the top of the screen but i use the command line to fill my data and i have to write my string in brackets again. At this point there is no need to preassign a string if you can't use its predefined brakets ("").

Thanks for any hint in this field.

Giancarlo from cappuccino state


[ Return to Index | Top of Index ]

Go back to the main exhibit hall