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.370735Ich 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; }