Hello Michael,
Would it be an option to work with characters instead of numbers?
length = 10;
op0 = {"+", "*"};
op = RandomChoice[op0, length - 1];
numbers = If[# < 0, "(" <> ToString[#] <> ")", ToString[#]] & /@ RandomInteger[{-9, 9}, length];
calc = StringJoin @@ Riffle[numbers, op]
(* Out: "4*9+8+(-8)*(-8)+(-9)+(-3)+1*(-6)+5" *)
EDIT:
Here a little improvement in case you need the results too:
ClearAll["Global`*"]
length = 10;
op0 = {"+", "*"};
op := RandomChoice[op0, length - 1];
numbers := If[# < 0, "(" <> ToString[#] <> ")", ToString[#]] & /@ RandomInteger[{-9, 9}, length];
Table[With[{calc = StringJoin @@ Riffle[numbers, op]},
calc <> " = " <> ToString[ToExpression[calc]]], 20] // Column
If you set the number of lines/calculations big enough you can keep your young pupils busy forever!