Der übliche Weg, dies zu tun, ist:
-
Lesen Sie alle Zahlen ein und speichern Sie sie in einem Array (es hilft zu wissen, wie viele Zahlen im Voraus vorhanden sind, damit Sie das Array entsprechend dimensionieren können. Andernfalls müssen Sie sie erst zählen und dann einlesen)
-
Sortieren Sie sie in aufsteigender Reihenfolge
-
Um das 90. Perzentil zu finden, suchen Sie das Element, das auf sortedElement[floor(N * 0,9)] folgt
Das Sortieren ist etwas fortgeschritten. Es gibt einfache (leicht verständliche und umsetzbare) Algorithmen, die gut mit kleinen Datensätzen funktionieren. Einer dieser Algorithmen ist der "Bubble Sort". Sie beginnen an einem Ende und vergleichen zwei Zahlen. Die größere "blubbert" hoch, vergleichen erneut, usw. Nach einer Runde steht Ihre größte Zahl oben. Wiederholen Sie dies jetzt, beginnend am unteren Ende, aber um eins früher stoppen. Wenn Sie nur das 90. Perzentil benötigen (anstatt eines vollständig sortierten Arrays), müssen Sie dies nur einige Male tun (1/10 von N-Mal) - denn wenn Sie die 10% größten Zahlen geordnet haben, ist die niedrigste davon Ihre Antwort.
Mir scheint, basierend auf der ausgezeichneten Formulierung der Frage, dass Sie bereit sind, sich der Herausforderung zu stellen und diesen Code selbst zu schreiben. Wenn nicht, hinterlassen Sie einen Kommentar!
EDIT hier ist der Code:
#include
#include
int main(void) {
FILE* fp;
char* chBuf=NULL; // wo die Zeile gespeichert wird
int* myArray;
int ii, jj;
int lineCount;
int numCount;
size_t byteCount; // für das Einlesen der Zeile verwendet
if((fp = fopen("numbers.txt", "r")) == NULL) {
printf("Datei kann nicht geöffnet werden\n");
return -1;
}
// bis hierher gekommen, weil die Datei geöffnet ist.
// Lassen Sie uns herausfinden, wie viele Zeilen es gibt
lineCount = 0;
while(getline(&chBuf, &byteCount, fp)>0) lineCount++;
printf("Es gibt %d Zeilen in der Datei\n", lineCount);
// jetzt "zurückspulen" zum Anfang und lesen Sie eine Zeile nach der anderen:
fseek(fp, 0, SEEK_SET);
// Platz für die Zahlen erstellen:
myArray = malloc(lineCount * sizeof(int));
numCount = 0;
// Zahlen einlesen - dieses Mal in Integer konvertieren:
while(getline(&chBuf, &byteCount, fp) > 0) {
myArray[numCount] = atoi(chBuf);
// diese Zeile entfernen - nur um zu zeigen, dass es funktioniert:
printf("konvertierte Zahl %d: sie ist %d\n", numCount, myArray[numCount]);
numCount++;
}
fclose(fp);
// jetzt müssen wir sortieren. Da die Daten von niedrig nach hoch sortiert waren,
// sortiere ich von hoch nach niedrig, um zu zeigen, dass es funktioniert:
for(ii = 0; ii < numCount - 1; ii++) {
for(jj = ii + 1; jj < numCount; jj++) {
if(myArray[ii] < myArray[jj]) {
int temp = myArray[ii];
myArray[ii] = myArray[jj];
myArray[jj] = temp;
}
}
printf("sortiertes Element %d: %d\n", ii, myArray[ii]);
}
// wir sortieren die letzte Zahl nie... sie ist ans Ende geblubbert:
printf("sortiertes Element %d: %d\n", ii, myArray[ii]);
// jetzt finden Sie 10% der Anzahl der Elemente (abgerundet),
// und Sie werden die Zahl finden, die größer als 90% der Zahlen in der Datei ist
int index90 = 0,1 * numCount - 1; // wird automatisch abgeschnitten;
// Offset um 1, da Indizes bei 0 beginnen
printf("Die erste Zahl größer als 90%% ist Element %d: es ist %d\n", \
index90, myArray[index90]);
}
Es gibt hier einige "Tricks", die es wert sind, einem Anfängerprogrammierer zu erklären:
- Überprüfen Sie, ob die Datei erfolgreich geöffnet wurde, und handeln Sie entsprechend, wenn nicht
- Verwenden Sie
getline
(tatsächlich eine GCC-Erweiterung - ich weiß nicht, ob Sie diese haben), um sicher eine Zeile zu lesen: es stellt sicher, dass genügend Platz im Puffer vorhanden ist. Ihre Methode ist für Ihre Datei gültig - meine ist "generell sicherer".
- Verwenden Sie
malloc
, um genügend Platz für das Array der Zahlen zu reservieren
- Ich sortiere "alle Zahlen", auch wenn ich wirklich nur die ersten 10% sortieren muss, um das Problem zu lösen. Sie können die Leistung (in diesem Fall) verbessern, indem Sie das obere Limit von
ii
in der äußeren Sortierschleife ändern.
- Ich nutze die Tatsache, dass eine Gleitkommazahl einer
int
zugewiesen wird, um automatisch abzuschneiden, bei meiner Berechnung des Index der gesuchten Zahl.
Genießen Sie es!