Szybkie sumowanie.
Algorytm pokazuje jak w prosty sposób można przeprowadzić sumowanie kolumn liczbowych zawierających nawet kilkadziesiąt milionów wierszy. Zaletą prezentowanego tutaj sposobu jest to, że aktualizowanie kolumn liczbowych nie wymaga przeliczania wszystkich wartości jakie się w nich znajdują.
Sprawdźmy na przykładzie jak będzie wyglądało sumowanie kolumny zawierającej przykładowe wartości, tak jak to pokazanow w tabeli:
| wiersz [1]. | 100,00 |
| wiersz [2]. | 200,00 |
| wiersz [3]. | 300,00 |
| wiersz [4]. | 400,00 |
| wiersz [5]. | 500,00 |
| wiersz [6]. | 600,00 |
Algorytm sumowania dla tej tabeli mógłby wyglądać np. tak:
| int suma = 0; for(int i = 0; i < 6; i++){ suma = suma + wiersz[i]; } |
| StringGrid1 | wartość: |
| ColCount | 2 |
| Options | goEditing = true |
| Options | goAlwaysShowEditor = true |
| RowCount | 1000000 |
| Edit1 | wartość: |
| Text | pozostaw pole puste |
| // Plik nagłówkowy np. Unit1.h. //-------------------------------- private: void __fastcall Indeksowanie(int n, int c); void __fastcall Dodawanie(int n, String t); AnsiString Wpisz(double s); double id[1000000]; double suma; //-------------------------------- |
| plik tekstowy |
| // Plik źródłowy np. Unit1.cpp //-------------------------------- void __fastcall TForm1::Indeksowanie(int n, int c) { suma = 0; for(int i = 0; i < n; i++){ if(!StringGrid1->Cells[c][i].Trim().IsEmpty()){ String a = StringReplace(StringGrid1->Cells[c][i + 1].Trim(), " ", "", TReplaceFlags() << rfReplaceAll); try{id[i] = a.ToDouble();}catch(...){id[i] = 0;} } else{id[i] = 0;} suma = suma + id[i]; } Edit1->Text = Wpisz(suma); } //-------------------------------- AnsiString TForm1::Wpisz(double s) { String a = FloatToStrF(s, ffNumber, 13, 2); return a; } //-------------------------------- void __fastcall TForm1::Dodawanie(int n, String t) { String a = StringReplace(t.Trim(), " ", "", TReplaceFlags() << rfReplaceAll); suma = suma - id[n]; try{id[n] = a.ToDouble();}catch(...){id[n] = 0;} suma = suma + id[n]; } //-------------------------------- |
| plik tekstowy |
| // Plik źródłowy np. Unit1.cpp //-------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { Indeksowanie(StringGrid1->RowCount - 1, 1); } //-------------------------------- |
| // Plik źródłowy np. Unit1.cpp //-------------------------------- void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { Dodawanie(StringGrid1->Row, StringGrid1->Cells[1][StringGrid1->Row]); Edit1->Text = Wpisz(suma); } //-------------------------------- |