Array mit wiederholten float Inhalen bearbeiten



  • Ich wollte ein Array mit mehrmals wiederholten float Inhalten in einem anderen array kopieren, mit der Bedingung, dass die float Inhalten nur einmal auftauchen sollen.
    Ich hab diesen Code geschrieben:

    float erliest_start[gnum_plan_ops];
    float help_start[gnum_plan_ops];

    int g,s;

    help_start[0]= erliest_start[0];
    for( g=1;g < gnum_plan_ops;g++)
    {
    for(s=0; s<g; s++) {
    if(erliest_start[g]!= help_start[s]) continue;
    }
    if (s==g) {
    if(help_start[g-1]==erliest_start[g])
    help_start[g]= erliest_start[g];
    }
    }

    und getestet, aber ich bekomme immer komische Ausgaben.

    Vor der Anwendung dieser Code, die Daten sehen so aus:

    erliest_start sortiert: 0.000000

    erliest_start sortiert: 0.000000

    erliest_start sortiert: 1.010000

    erliest_start sortiert: 15.343333

    erliest_start sortiert: 15.343333

    erliest_start sortiert: 15.343334

    erliest_start sortiert: 29.676666

    erliest_start sortiert: 29.676666

    erliest_start sortiert: 29.686666

    erliest_start sortiert: 44.019997

    Nach der Anwendung:

    help_start sortiert: 0.000000
    help_start sortiert: 0.000000
    help_start sortiert: 0.000000
    help_start sortiert: 0.000000
    help_start sortiert: 0.000000
    help_start sortiert: 0.000000
    help_start sortiert: 2.370735
    help_start sortiert: 2.370108
    help_start sortiert: 0.000000
    help_start sortiert: 2.370735

    Ich bedanke mich für jede Hilfe. 🙂 🙂 🙂



  • Das Problem liegt meiner Ansicht nach im Vergleich von float-Werten. Dies geht fast immer schief, insbesondere wenn mit den Daten gerechnet wurde.

    Wandle die Werte zunächst in einen String mit ecvt, fcvt oder gcvt um und führe den Vergleich mit strcmp durch. Bei der Konvertierung muss dann die Genauigkeit angegeben werden. Alternative 2 wäre die Umwandlung in einen Long-Wert mit Multiplikation für die Nachkommastellen, sofern die Anzahl der signifikanten Stellen für einen Long-Wert ausreichend ist.



  • Hallo,
    Meiner Ansichtnach liegt das Problem unter anderem in der Programierung.deine 2te for schleife z.B. geht nur solange bis s<g ist und deine darauf folgende if Abfrage s==g kann somit niemals wahr sein.
    Danach Fragst du Ab ob deine help variable mit dem index -1 == deiner erliest variblen mit dem momentanen index ist. sollte nur dies der fall sein wird die variable übernommen und gespeichert, wenn aber der fall auftritt, dass du eine variable doppelt hast, dann wird das array an dieser stelle ja leer sein und somit wird dann wiederrum diese if abfrage kein richtiges ergebnis mehr liefern.
    ich hoffe dir etwas weitergeholfen zu haben



  • barodo94 schrieb:

    Ich wollte ein Array mit mehrmals wiederholten float Inhalten in einem anderen array kopieren, mit der Bedingung, dass die float Inhalten nur einmal auftauchen sollen.

    Also ich würde das so lösen. Bin aber für Verbesserungsvorschläge offen:

    #include <stdio.h>
    
    #define SIZE 10
    
    float A[SIZE] = { 0.000000, 0.000000, 1.010000, 15.343333, 15.343333,
    				  15.343334, 29.676666, 29.676666, 29.686666, 44.019997 };
    
    float B[SIZE] = { 0.0 };   // Init. bei globaler Var. eigentlich nicht nötig
    
    int main(void)
    {
    	int i, j, k, found = 0;
    
    	B[0] = A[0];
    
    	k = 1;                      // aktueller Index für B
    	for (i = 1; i < SIZE; i++)  // aktueller Index für A
    	{
    		for (j = 0; j < k; j++) // temporärer Index für B
    			if (B[j] == A[i])
    			{
    				found = 1;
    				break;
    			}
    
    		if (found)
    		{
    			found = 0;
    			continue;   // next A
    		}
    
    		B[k++] = A[i];
    	}
    
    	for (i = 0; i < k; i++)
    		printf("%f ", B[i]);
    
    	getch();
    	return 0;
    }
    


  • EinGast schrieb:

    Also ich würde das so lösen.

    Wenn das Array mit den Werten schon der Größe nach sortiert vorliegt (wie es hier der Fall zu schein seint), dann kann man das Ganze natürlich noch einfacher lösen:

    #include <stdio.h>
    
    #define SIZE 10
    
    float A[SIZE] = { 0.000000, 0.000000, 1.010000, 15.343333, 15.343333,
    				  15.343334, 29.676666, 29.676666, 29.686666, 44.019997 };
    
    float B[SIZE] = { 0.0 };
    
    int main(void)
    {
    	int i, j;
    
    	B[0] = A[0];
    	for (i = 1, j = 0; i < SIZE; i++)
    		if (A[i] != B[j]) B[++j] = A[i];
    
    	for (i = 0; i <= j; i++)
    		printf("%f ", B[i]);
    
    	getch();
    	return 0;
    }
    

Anmelden zum Antworten