KLEINSTE ZAHL <- gelöst

Für Fragen von Einsteigern und Programmieranfängern...
Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

KLEINSTE ZAHL <- gelöst

Beitrag von Stephanie H. »

Hi
Also ich muss von über 1000 Zahlen die kleinste herausfinden mit einen Programm
[die Zahlen sind in einer Array-Tabelle gespeichert...]
Danke schon mal im Vorraus
Zuletzt geändert von Stephanie H. am Sa 8. Mai 2010, 15:21, insgesamt 3-mal geändert.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: KLEINSTE ZAHL

Beitrag von Hitman »

Wie ist denn dein bisheriger Ansatz? Am besten mit etwas Code unterlegt.

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: KLEINSTE ZAHL -> gelöst

Beitrag von Stephanie H. »

hab ich schon gelöst :D

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: KLEINSTE ZAHL

Beitrag von Stephanie H. »

doch nicht
also das hier war eigentlich mein lösungsansatz also da sind solche array-schleifen:

Code: Alles auswählen

for e := 0 to Zeilenanzahl
                           begin
                              for a := 0 to Zeilenanzahl do
                                  begin
                                    if e = a then
                                    begin
                                         inc(a);
                                    end
                                    else
                                    begin
                                        if wert[i,e] < wert[i,a] then         //wenn der wert von zeile ''i'' kleiner ist als der wert von zeile ''a'' soll das programm folgendes tun
                                        begin
                                             dec(e);                                     //dann soll ''e'' um 1 erniedrigt werden 
                                                                                                damit die zeile ''e'' im nächsten 
                                                                                   durchgang mit einen anderen wert verglichen wird                                
                                           end
                                         else
                                            begin
                                                 if e < a then           // da der 2.wert kleiner ist muss die zeilenzahl von e bis zu a verkleinert oder vergrößert werden 
                                                                                  bis zu zeilenzahl a um diesen wert in zeile a im nächsten durchgang zu vergleichen
                                                    begin 
                                                       REPEAT inc(e);      
                                                       UNTIL e = a;
                                                       dec(e);            //dann soll ''e'' um 1 erniedrigt werden 
                                                                                        damit die zeile ''e'' im nächsten 
                                                                                   durchgang mit einen anderen wert verglichen wird   
                                                    end
                                                 else
                                                    begin
 
                                                       REPEAT dec(e);
                                                       UNTIL e = a
                                                       dec(e);            //dann soll ''e'' um 1 erniedrigt werden 
                                                                                          damit die zeile ''e'' im nächsten 
                                                                                   durchgang mit einen anderen wert verglichen wird   
                                                    end;
                                              end;
                                         end;
                                    end;
                                  end;

also mein problem ist das man a und e von der forschleife irgenwie nicht erhöhen oder erniedrigen kann...
also hier könnt ihr noch mal die fehlermeldung sehen:
project.lpr(88,47) Error: Illegal assignment to for-loop variable "e"

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: KLEINSTE ZAHL

Beitrag von theo »

Horror, schalte bitte den Code Higlighter ein und mach Einzüge. Da wird einem ja schlecht.

Zu deinem Problem: Nimm eine TList, sortiere sie und nimm dann den Wert an Stelle 0.

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: KLEINSTE ZAHL

Beitrag von Stephanie H. »

aha und wie soll ich das sortieren?

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: KLEINSTE ZAHL

Beitrag von theo »

Stephanie H. hat geschrieben:aha und wie soll ich das sortieren?
http://www.freepascal.org/docs-html/rtl ... .sort.html" onclick="window.open(this.href);return false;

Schaltest du bitte oben den Code Highlighter ein? Danke.

So könnte das gehen:

Code: Alles auswählen

Function NumSort(Item1: Pointer;Item2: Pointer): Integer;
Begin
  If Item1=Item2 Then
    Begin
      Result := 0;
      Exit
    End;
  If Item1>Item2 Then Result := 1  Else Result := -1;
End;
 
Function KleinsterWert(L:TList): Integer;
Begin
  L.Sort(@NumSort);
  Result := Cardinal(L[0]);
End;
 
Procedure TForm1.Button1Click(Sender:TObject);
 
Var L: TList;
Begin
  L := TList.Create;
  L.Add(Pointer(2));
  L.Add(Pointer(20));
  L.Add(Pointer(1));
  L.Add(Pointer(5));
  Caption := inttostr(KleinsterWert(L));
  L.Free;
End;

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: KLEINSTE ZAHL

Beitrag von Stephanie H. »

ich versteh deinen quelltext irgendwie nicht...:(
aber ich schreib das projekt nicht objektorientiert also nicht mit formularen und so...
also ich fand meinen lösungsansatz ganz ok eigentlich

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: KLEINSTE ZAHL

Beitrag von theo »

Stephanie H. hat geschrieben:ich versteh deinen quelltext irgendwie nicht...:(
aber ich schreib das projekt nicht objektorientiert also nicht mit formularen und so...
Das Benutzen der vorhandenen Klassen hat mit Formularen nichts zu tun.
Stephanie H. hat geschrieben: also ich fand meinen lösungsansatz ganz ok eigentlich
Ich kann ihn nicht lesen ohne dass mir schlecht wird.
SCHALTE BITTE DEN "Highlighter" AUF "Freepascal/Lazarus"

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: KLEINSTE ZAHL

Beitrag von Stephanie H. »

Code: Alles auswählen

for e := 0 to Zeilenanzahl
    begin
        for a := 0 to Zeilenanzahl do
            begin
                if e = a then
                    begin
                        inc(a);
                    end
                else
                    begin
                         if wert[i,e] < wert[i,a] then       //wenn der wert von zeile ''i'' kleiner ist als der wert von zeile
                                                                             // ''a'' soll das programm folgendes tun
                             begin
                                  dec(e);                          // dann soll ''e'' um 1 erniedrigt werden
                                                                         // damit die zeile ''e'' im nächsten
                                                                          //durchgang mit einen anderen wert verglichen wird
                             end
                       else
                             begin
                                 if e < a then                  // da der 2.wert kleiner ist muss die zeilenzahl von e bis zu a verkleinert oder vergrößert werden
                                                                       //bis zu zeilenzahl a um diesen wert in zeile a im nächsten durchgang zu vergleichen
                                       begin
                                          REPEAT inc(e);
                                          UNTIL e = a;
                                          dec(e);                //dann soll ''e'' um 1 erniedrigt werden damit die zeile ''e'' im nächsten durchgang mit einen
                                                                      //anderen wert verglichen wird
                                       end
                                 else
                                       begin
                                          REPEAT dec(e);
                                          UNTIL e = a
                                          dec(e);                  //dann soll ''e'' um 1 erniedrigt werden damit die zeile ''e'' im nächsten durchgang mit einen
                                                                          //   anderen wert verglichen wird
                                         end;
                              end;
                     end;
           end;
    end;

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: KLEINSTE ZAHL

Beitrag von theo »

Grundsätzlich kann man bei for Schleifen den Zähler nicht verändern. Da braucht es eine "while do" oder "repeat until" Schleife.
Aber warum kompliziert und fehleranfällig? Mach's doch einfach wie in meinem Vorschlag.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1619
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: KLEINSTE ZAHL

Beitrag von corpsman »

Lese ich das Richtig ?

Stephanie H. will die kleinste Zahl aus einem Array mit 1000 Zahlen ?

Warum sortiert ihr dann die Zahlen ?

Code: Alles auswählen

uses math;
var
  a : Array of Integer;
  i, m: Integer;
begin
  setlength(a,1000);
  //.. Einlesen von A
  // Ermitteln des kleinsten Elementes
  m := a[0];
  for i := low(a) + 1 to high(a) do begin
    m := min(m, a[i]);
  end;
  showmessage(inttostr(m));
  setlength(a,0);
end;
--
Just try it

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: KLEINSTE ZAHL

Beitrag von theo »

corpsman hat geschrieben: Warum sortiert ihr dann die Zahlen ?
Warum nicht? Es ist eine (eingebaute) Lösung, die praktisch ohne Hirn funktioniert.
Deine Lösung geht nat. auch.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1619
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: KLEINSTE ZAHL

Beitrag von corpsman »

Irgendwie bin ich ein bischen Minimalist ;)

Sortieren O(n*log(n))
Mein Ansatz O(n)
--
Just try it

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: KLEINSTE ZAHL

Beitrag von theo »

corpsman hat geschrieben: Sortieren O(n*log(n))
Mein Ansatz O(n)
Ich glaube nicht, dass Stephanie H. sich für die halbe Millisekunde interessiert. Prinzipiell hast du nat. recht.

Antworten