prosty kalkulator w delphi - pomocy

prosty kalkulator w delphi - pomocy
0

witam
ładnych pare lat nie babrałem się w delphi, a nawet jak się babrałem to nie szło najlepiej :P
i teraz potrzebuje pomocy w napisaniu prostego programu
a mianowicie ma to być kalkulator
jest 26 liczb np. 2626, 273, 1027...
ten kalkulator miałby te wszystkie liczby pododawać w każdej możliwej kombinacji
ALE interesują mnie tylko wyniki typu 1000, 2000, 3000 itd aż do 10000 <-- żeby mi je wyszukał.
np. 150+500+350=1000 <--taki wynik mi wyświetli,
150+540+350=1040 <-- tego mi nie wyświetli, bo szukam wyników tysięcznych (2000, 5000 itd.)
proszę o jakieś wskazówki, czy fragmenty kodu, nie wiem jak to jakoś logicznie połączyć
jeśli ktoś jest w stanie pomóc to byłbym bardzo wdzięczny. mam nadzieje że w sposób wystarczająco klarowny przedstawiłem o co mi chodzi.
pozdrawiam

cimak
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 9 lat
  • Postów:1668
0

zawsze dodaje trzy liczby czy moga byc dwie lub cztery...?
czy liczby moga sie powtarzac? np 250+250+250 ?

edytowany 1x, ostatnio: cimak
0

może dodawać obojętnie ile liczb (z puli dwudziestu sześciu liczb)

2626, 1456, 2652, 520, 936, 260, 2574, 364, 260, 2834, 1638, 1781, 2899, 2847, 2509, 273, 767, 923, 299, 169, 2873, 1235, 1027, 2405, 2275, 845

jak widać np. liczba 260 występuje 2 razy wiec tyle razy może być użyta
jest baza 26liczb, program wybiera liczby w roznych kombinacjach i szuka wyniku tysięcznego (1000, 2000, 3000... do 10000)

0
  1. generujesz wszystkie podzbiory (oprócz pustego) zbioru n elementowego (tutaj 26)
  2. w każdym takim zbiorze sumujesz wszystkie elementy
  3. jeśli suma mod 1000 wynosi 0 to wyświetlasz te elementy
0

zgubiłem się w punkcie 1.
nie podejrzewałem że to będzie tak skomplikowane

SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
0

Niestety, będzie skomplikowane i czasochłonne.
Wszystkich podzbiorów będzie ponad 67 milionów, a dokładnie 2^26 - 1 (-1, bo oprócz pustego)

edytowany 1x, ostatnio: simplex
DE
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 14 lat
  • Postów:3
0

jest jakiś sens się w tym babrać, jeśli mam na to 10dni? wczoraj sobie przypomnialem jak zrobic prosty kalkulator, także nie wiem czy w 10dni nabiore takich umiejętności żeby mi wyszukał potrzebnych wyników

SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
0
simplex napisał(a)

Niestety, będzie skomplikowane i czasochłonne.

No i niestety będę musiał odwołać, to co napisałem wcześniej. Powinienem bardziej wierzyć w możliwości obliczeniowe dzisiejszych komputerów. Mój komputer (wcale nie dzisiejszy, bo ma już ok. 8 lat) obliczył to w pół minuty.
Dla tych 26 przykładowych liczb z drugiego posta autora wątku wyszło 57 655 sum podzielnych przez 1000. Jako ciekawostkę dodam, że są to tylko dwie różne liczby - 13 000 oraz 26 000.

Poniżej algorytm, z którego korzystałem. Może nie jest optymalny, ale mam nadzieję, że jest poprawny

Kopiuj
procedure TForm1.Button1Click(Sender: TObject);
const
  Tab: array[1..26] of Integer = (2626, 1456, 2652, 520, 936, 260,
                                  2574, 364, 260, 2834, 1638, 1781,
                                  2899, 2847, 2509, 273, 767, 923,
                                  299, 169, 2873, 1235, 1027, 2405,
                                  2275, 845);
var
  Suma, Ile: Integer;
  a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z: Boolean;
begin
  Ile:= 0;
  for a:= false to true do
   for b:= false to true do
    for c:= false to true do
     for d:= false to true do
      for e:= false to true do
       for f:= false to true do
        for g:= false to true do
         for h:= false to true do
          for i:= false to true do
           for j:= false to true do
            for k:= false to true do
             for l:= false to true do
              for m:= false to true do
               for n:= false to true do
                for o:= false to true do
                 for p:= false to true do
                  for q:= false to true do
                   for r:= false to true do
                    for s:= false to true do
                     for t:= false to true do
                      for u:= false to true do
                       for v:= false to true do
                        for w:= false to true do
                         for x:= false to true do
                          for y:= false to true do
                           for z:= false to true do begin
                             Suma:= 0;
                             if a then Inc(Suma, Tab[1]);
                             if b then Inc(Suma, Tab[2]);
                             if c then Inc(Suma, Tab[3]);
                             if d then Inc(Suma, Tab[4]);
                             if e then Inc(Suma, Tab[5]);
                             if f then Inc(Suma, Tab[6]);
                             if g then Inc(Suma, Tab[7]);
                             if h then Inc(Suma, Tab[8]);
                             if i then Inc(Suma, Tab[9]);
                             if j then Inc(Suma, Tab[10]);
                             if k then Inc(Suma, Tab[11]);
                             if l then Inc(Suma, Tab[12]);
                             if m then Inc(Suma, Tab[13]);
                             if n then Inc(Suma, Tab[14]);
                             if o then Inc(Suma, Tab[15]);
                             if p then Inc(Suma, Tab[16]);
                             if q then Inc(Suma, Tab[17]);
                             if r then Inc(Suma, Tab[18]);
                             if s then Inc(Suma, Tab[19]);
                             if t then Inc(Suma, Tab[20]);
                             if u then Inc(Suma, Tab[21]);
                             if v then Inc(Suma, Tab[22]);
                             if w then Inc(Suma, Tab[23]);
                             if x then Inc(Suma, Tab[24]);
                             if y then Inc(Suma, Tab[25]);
                             if z then Inc(Suma, Tab[26]);
                             if (Suma mod 1000 = 0) and (Suma <> 0) then begin
                               Inc(Ile);
                               Memo1.Lines.Add(IntToStr(Suma));
                             end;
                           end;
  Memo1.Lines.Add('Razem ' + IntToStr(Ile));
end;
Patryk27
OMG. Byłeś pijany, jak to pisałeś ?
cimak
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 9 lat
  • Postów:1668
0
simplex napisał(a)

Jako ciekawostkę dodam, że są to tylko dwie różne liczby - 13 000 oraz 26 000.

tego zdania nie lapie...
btw, mozna by chyba skrocic ten kod o kilka linijek dajac jeszcze jedna petle i tablice zamiast zmiennych abcd...

edytowany 1x, ostatnio: cimak
SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
0

Cimak

  1. Wśród tych 57655 liczb (podzielnych przez 1000), które znalazł program, przewijają się tylko liczby 13000 i 26000. Innych nie ma. Ot taka ciekawa właściwość.
  2. Też pomyślałem na zastosowaniem tablicy zamiast 26 zmiennych, ale odpuściłem. Jakoś nic mi nie przychodziło do głowy
edytowany 1x, ostatnio: simplex
DE
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 14 lat
  • Postów:3
0

ogromne dzięki za pomoc!
jest możliwość, żeby taki program wyświetlił jaką kombinacje liczb użył, aby otrzymać np. wynik 13000?
szkoda że nie ma wyniku mniejszego lub równego 10000 ;/
jeszcze raz dzięki

SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
0

Oczywiście, że jest możliwość i nie jest to wcale trudne

  • Deklarujesz dodatkową zmienną tekstową (np Tekst)
  • W odpowiednim miejscu przypisujesz jej łańcuch pusty (domyśl się w którym)
  • Modyfikujesz warunki if ... then (oczywiście każdy), aby zawierały dwie instrukcje. W tej drugiej instrukcji dodajesz do zmiennej Tekst to, o co powiększasz zmienną Suma (oczywiście zamienione na tekst). Dwie instrukcje, więc koniecznie begin ... end
  • Modyfikujesz instrukcję, która wyświetla sumę, aby wyświetlała Sumę i Tekst

Wiem, że lepszy byłby gotowiec, ale ostatecznie to Twój program.

cimak
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 9 lat
  • Postów:1668
0
simplex napisał(a)

Oczywiście, że jest możliwość i nie jest to wcale trudne

  • Deklarujesz dodatkową zmienną tekstową (np Tekst)
  • W odpowiednim miejscu przypisujesz jej łańcuch pusty (domyśl się w którym)
  • Modyfikujesz warunki if ... then (oczywiście każdy), aby zawierały dwie instrukcje. W tej drugiej instrukcji dodajesz do zmiennej Tekst to, o co powiększasz zmienną Suma (oczywiście zamienione na tekst). Dwie instrukcje, więc koniecznie begin ... end
  • Modyfikujesz instrukcję, która wyświetla sumę, aby wyświetlała Sumę i Tekst

Wiem, że lepszy byłby gotowiec, ale ostatecznie to Twój program.

a gdzie optymalizacja?
nawet jak suma nie bedzie podzielna przez 1000 to program bedzie wykonywal dodatkowe linijki kodu - przy tkaiej ilosci danych czas sie moze znacznie wydłużyć.
lepiej jest sprawdzic jakie liczby zsumowano dopiero wtedy gdy ich suma bedzie podzielna przez 1000.

edytowany 1x, ostatnio: cimak
DE
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 14 lat
  • Postów:3
0

od ostatniego posta mecze sie z tym delphi i nic ciagle jakies bledy, w koncu wyrzucilem ten delphi compilatior
prosiłbym o gotowca(jesli ktos mialby checi i czas) bo juz mi leb od tego wysiada, a program jest bardzo potrzebny
dzieki simplex za udostepneinie tego kodu
pozdrawiam

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)