Programm mit Dynamischen Vektoren



  • Habe diese Code programmiert, aber er funktioniert nicht. der Fehler wird bei der main bei den Funktionen angezeigt

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>

    void selectionSort(double* x, int n) {
    int i,j,min;
    double tmp;
    
    
    for(i = 0; i < n-1; i++) {
     min=i;
      
    for(j = i+1; j < n; j++) {
          if(x[j] < x[min]){
            min=j;
      }
    }
      if(min != i) {
         tmp=x[min];
         x[min]=x[i];
         x[i]=tmp;
      }
    }
    }
    double* scanVector(int n) {
    int j = 0;
    double* x = NULL;
    assert(n > 0);
    
    x = malloc(n*sizeof(double));
    assert(x != NULL);
     for (j=0; j<n; ++j) {
     x[j] = 0;
    printf("x[%d] = ",j);
    scanf("%lf",&x[j]);
    }
    return x;
    }
    
    void printVector(double* x, int n) {
    int j = 0;
    assert(x != NULL);
    assert(n > 0);
    
     for (j=0; j<n; ++j) {
    printf("x[%d] = %f\n",j,x[j]);
    }
    }
    
    
    int main() {
     double* x= NULL;
     int N=0;
    
    
    printf("Geben sie die Länge des Vektors ein:\n");
    printf("N= ");
    scanf("%d",&N);
    
    
    
    x = scanVektor(N);
     selectionSort(x, N);
    
    printVektor(x,N);
    
    free(x);
    x=NULL;
    
    printf("\n");
    return 0;
    

    }

    danke für die Hilfe!



  • Schreibe bitte in eine Zeile vor Deinem Code ``` und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> in der Symbolleiste über dem Bearbeitungsfenster. Du kannst Deine Beiträge nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du in dem Drei-Punkte-Menü rechts unter Deinem Beitrag.

    • scanVektor vs. scanVector
      printVektor vs. printVector
    • assert() ist in scanVector() nach malloc() ungeeignet.
    • Deklariere Variablen so lokal wie möglich.
    • x = NULL in main() - wozu?
    • Einzelne Character gibt man mit putchar() bzw. fputc() aus, Strings ohne Format mit puts() bzw. fputs().
    • Benutzereingaben IMMER überprüfen.

    Den Rest habe ich mir nicht angesehen.



  • Danke für die Hilfe. Hättest du vielleicht noch eine Idee wie man die Funktion Selection Sort mit dynamischen Vektoren am besten schreiben könnte?



  • @Maien sagte in Programm mit Dynamischen Vektoren:

    Hättest du vielleicht noch eine Idee wie man die Funktion Selection Sort mit dynamischen Vektoren am besten schreiben könnte?

    Passt doch was Du gemacht hast? Was gefällt Dir daran nicht?

    Das andere Zeugs:

    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    
    void clear(FILE *stream)
    {
    	for (int ch = fgetc(stream); ch != EOF && ch != '\n'; ch = fgetc(stream));
    }
    
    void selectionSort(double* x, size_t n)
    {
    	assert(x && n > 0);
    
    	for (size_t i = 0; i < n - 1; i++) {
    		int min = i;
    
    		for (size_t j = i + 1; j < n; j++)
    			if (x[j] < x[min])
    				min = j;
    
    		if (min != i) {
    			double tmp = x[min];
    			x[min] = x[i];
    			x[i] = tmp;
    		}
    	}
    }
    
    double* scanVector(size_t n)
    {
    	assert(n > 0);
    
    	double *x = malloc(n * sizeof *x);
    	if (!x)
    		return x;
    
    	for (size_t j = 0; j != n; ++j) {
    		while (printf("x[%zu] = ", j),
    		       scanf(" %lf", &x[j]) != 1)
    		{
    			clear(stdin);
    		}
    	}
    	return x;
    }
    
    void printVector(double* x, int n)
    {
    	assert(x && n > 0);
    
    	for (size_t j = 0; j < n; ++j)
    		printf("x[%zu] = %f\n", j, x[j]);
    }
    
    int main()
    {
    	fputs("Geben sie die Länge des Vektors ein:\nN = ", stdout);
    	size_t N;
    	if (scanf(" %zu", &N) != 1) {
    		fputs("Input error :(\n\n", stderr);
    		return EXIT_FAILURE;
    	}
    
    	double *x = scanVector(N);
    	if (!x) {
    		fputs("Out of memory :(\n\n", stderr);
    		return EXIT_FAILURE;
    	}
    
    	selectionSort(x, N);
    	printVector(x, N);
    
    	putchar('\n');
    	free(x);
    }
    

Log in to reply