Hier ein paar Hinweise zur Aufgabe 1:
int drei (int a, int b) {
  int i=1; j=0;
  do (i=i*a; j=j*b; a--)
  while a>0;
    return i+j;
}
Du übergibst an die Funktion die beiden Zweien: drei(2,2) und erhältst im 1. Durchlauf:
int drei (a=2, b=2) {
   int i=1; j=0;
   do (
      i=i*2;
      j=j*2;
      2--)   // 2-- heißt 2-1 = 1 (a wird um 1 vermindert beim nächsten Durchgang)
   while 2-1>0;  // führe die do-Schleife aus, solange a > 0 ist, a ist hier 1, da 2-- gerechnet wurde
     return i+j;  // returned wird erst, wenn die do-while verlassen wurde, im nächsten Durchlauf!
 }
Ergänzung zu i und j: Du weißt zu Beginn sind i=1 und j=0, werden jedoch auch verändert:
int drei (a=2, b=2) {
   int i=1; j=0;
   do (
      i=1*2;  // i = 2 nach dem 1. Durchlauf
      j=0*2;  // j = 0 nach dem 1. Durchlauf
      2--)
   while 2-1>0; 
     return i+j;
 }
2. Durchlauf: Jetzt ist nur noch die do-while zu betrachten, mit i = 2 und j = 0, nunmehr ist a = 1:
do (
      i=2*1;  // i = 2 nach dem 2. Durchlauf
      j=0*2;  // j = 0 nach dem 2. Durchlauf
      1--)
   while 1-1>0;   // 1-1 = 0 und 0 ist nicht größer als 0, die Bedingung wird nicht mehr erfüllt, verlasse Schleife!
     return 2+0;  // wirft 2 zurück
 }
Am besten du gibst dir bei jedem Durchlauf die Werte über die Console aus. Du erhältst dann:
i=2 j=0 a=1 b=2
 i=2 j=0 a=0 b=2
 result = 2