0 Daumen
744 Aufrufe

Die Funktion squareVec soll alle Einträage eines Vektors x ∈ Rn quadrieren, d.h. aus
(−1, 2, 0) soll (1, 4, 0) werden. Der Vektor soll dabei als Pointer übergeben werden.

#include <stdio.h>

int squareVec(double vec, int n) {
int j=0;
for(j=1, j<dim; --j) {
*vec[j] = &vec[j] * &vec[j];
}
return vec;
}

main() {
double vec[3] = {-1.0,2.0,0.0};
int j=0;
squareVec(vec,3);
for(j=0; j<3; ++j) {
printf("vec[%d] = %f ",j,vec[j]);
}
printf("\n");
}


und nur die Funktion squareVec darf verändert werden, sodass der main Funktion das richtige Ergebnis ausgibt.
Hätte da jemand einen Lösungsansatz? Nur in C


Avatar von

2 Antworten

0 Daumen
 
Beste Antwort

Aloha :)

Ich würde das so aufschreiben:

#include <stdio.h>

void squareVec( double vec[], int n) {
  while (n-->0) vec[n]*= vec[n];
}

void main() {
  double vec[]= {-1.0,2.0,0.0};
  squareVec( vec, 3 );
  for (int j=0; j<3; ++j) printf("vec[%d]= %lf\n", j, vec[j]);
}

In deiner Lösung sind einige kleine Bugs:

int squareVec(double vec, int n) {
  int j=0;
  for(j=1, j<dim; --j) {
      *vec[j] = &vec[j] * &vec[j];
  }
  return vec;
}

1) Du sagst, im Funktiosnkopf, dass die Funktion einen int-Wert liefert, gibst aber dann das übergebene Array "vec" zurück.

2) Du übergibst mit "double vec" nur einen einzigen double-Wert, nicht das Array "vec".

3) Du initalisierst "int j=0" mit Null, nur um in der nächsten Zeile "j=1" zu setzen. Das ist einerseits überflüssiger Code, andererseits ein fataler Fehler, weil Arrays in C immer mit dem Index 0 beginnen.

4) Mit "--j" zählst du die Schleifenvariable runter. Weil du mit j=0 anfängst, durchläuft j alle negativen Zahlen, sodass ein Segmentation-Fault sicher ist.

5) Die Adressierung "*vec[j]=&vec[j] * &vec[j]" ist völliger Unsinn. Du hast noch nicht verstanden, wie man Arrays an Funktionen übergibt und aufruft. Dazu empfehle ich dir folgendes kurzes Video

https://youtu.be/gNlmJ2WrZSY

main() {
  double vec[3] = {-1.0,2.0,0.0};
  int j=0;
  squareVec(vec,3);
  for(j=0; j<3; ++j) {
      printf("vec[%d] = %f ",j,vec[j]);
  }
  printf("\n");
}

Die main()-Fukntion sieht schon besser aus, dazu noch einige Hinweise:

1) Die main()-Funktion hat keinen Rückgabewert, dann wird standardmäßig "int" als Rückgabewert eingesetzt. Die Funktion gibt aber keinen Wert zurück. Wenn du Glück hast, wirft der Compiler eine Warnung.

2) Seit C99 müssen Variablen nicht mehr am Anfang eines Blockes deklariert werden, daher kannst du die Zeile "int j=0" streichen und dafür die Deklaration in die Schleife reinnehmen: "for (int j=0; j<3; ++j)"

3) Seit C99 wird "float" nicht mehr automatisch in double konvertiert. Die Compiler können also in float rechnen. Daher sollte innerhalb "printf" der Formatspezifizierer "%lf" (long float) verwendet werden, wenn double-Werte ausgegeben werden sollen.

Avatar von
+1 Daumen
int squareVec(double vec, int n)
void squareVec(double* vec, int n)
*vec[j] = &vec[j] * &vec[j];
vec[j] = vec[j] * vec[j];
return vec;

Entweder du änderst den Typ des Rückgabewertes auf double* oder du löschst diese Zeile. Ich plädiere für letzteres.

Avatar von 5,7 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community