Python für ˆ Minimum ˆ Maximum ˆ arithmetischem Mittel ˆ Standardabweichung?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lropro
User
Beiträge: 3
Registriert: Dienstag 23. November 2021, 01:00

Hallo,ich brauche Hilfe, es wäre sehr nett wenn mir jemand die Lösüng zeigen könnte, danke.

Die Ergebnisse einer Klausur liegen als Liste von Zahlen vor. Implementieren Sie die Berechnung von

ˆ Minimum ˆ Maximum ˆ arithmetischem Mittel ˆ Standardabweichung

der Listeneinträge und geben Sie die ermitteln Werte aus. Verwenden Sie anstatt echter Daten eine Liste von 100 gleichverteilten, ganzzahligen Zufallszahlen zwischen 1 und einschließlich 6.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Bitte einmal diesen Beitrag lesen: An alle Schüler und Studenten mit Informatikproblemen. Danke. 🙂
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also früher, ja, da mussten wir ja erst einmal etwas planen, und ein Struktogramm zeichnen, bevor wir an den Rechner durften! 👴
Bild
🤡 (Ich hoffe ich habe das mit der Abweichung hinbekommen.)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
lropro
User
Beiträge: 3
Registriert: Dienstag 23. November 2021, 01:00

__blackjack__ hat geschrieben: Dienstag 23. November 2021, 11:33 Also früher, ja, da mussten wir ja erst einmal etwas planen, und ein Struktogramm zeichnen, bevor wir an den Rechner durften! 👴
Bild
🤡 (Ich hoffe ich habe das mit der Abweichung hinbekommen.)
Hallo ,veile Dank . Aber ich kann das struktogramm nicht übersetzen. wenn es möglich wäre, können Sie mir das python-programm statt Struktogramm bitte zeigen?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du den Link gelesen, den __blackjack__ gepostet hat? Wir schreiben keine Hausaufgaben fuer dich. Du musst dich schon selbst bemuehen. Bei konkreten Problemen helfen wir gerne. Aber einfach auf Bestellung liefert Amazon, nicht wir.
Benutzeravatar
Dennis89
User
Beiträge: 1125
Registriert: Freitag 11. Dezember 2020, 15:13

__blackjack__ hat geschrieben: Dienstag 23. November 2021, 11:33 Also früher,[...]
🤡
Na das war aber nur nötig, weil ihr nicht in einem Forum fragen konntet :P

Die Art wie du das Strukturprogramm geschrieben hast, entspricht das auch irgend einer Konvention? Da steht ja zum Beispiel "var Summe: Real := 0" ist das eine Anlehnung an eine Programmiersprache? Bei dir würde ich jetzt spontan auf BASIC tippen und kurzes googln brachte auch Ergebnisse in die RIchtung.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Das ist mehr Pascal. In dem Zusammenhang hatte ich das daaaaamaaaals auch kennengelernt in der Schule. Ein Punkt bei diesem Diagrammtyp ist es, dass man damit kein GOTO ausdrücken kann, und zumindest für die ”vintage” BASIC-Dialekte kann man das nicht (direkt) gebrauchen. Der C64 den ich zu dem Zeitpunkt zuhause hatte, startet mit einem BASIC (CBM BASIC V2) das nicht einmal ein ELSE zum IF … THEN kennt.

Die Beschreibung von den Erfindern von 1973 (da war ich noch nicht auf der Welt) ist mit Schreibmaschine getippt und enthält einen Haufen handgezeichneter Diagramme: Flowchart Techniques for Structured Programming (PDF).

Das ganze mal in (Turbo) Pascal umgesetzt:

Code: Alles auswählen

program Notenstatistik;

const N = 100;

type TMark = 1..6;

var
  Marks: Array[1..N] of TMark;
  mark, Minimum, Maximum: TMark;
  Mean, StandardDeviation: Real;
  marksTotal: Word;
  sum: Real;
  i: Byte;

begin
  Randomize;
  for i := 1 to N do Marks[i] := Random(High(TMark)) + Low(TMark);

  Minimum := Marks[1];
  Maximum := Marks[1];
  for i := 1 to N do
    begin
      mark := Marks[i];
      if mark < Minimum then Minimum := mark;
      if mark > Maximum then Maximum := mark;
    end;

  marksTotal := 0;
  for i := 1 to N do marksTotal := marksTotal + Marks[i];
  Mean := marksTotal / N;

  sum := 0;
  for i := 1 to N do sum := sum + Sqr(Marks[i] - Mean);
  StandardDeviation := Sqrt(sum / (N-1));

  WriteLn('           Minimum:', Minimum);
  WriteLn('           Maximum:', Maximum);
  WriteLn('      Durchschnitt:', Mean);
  WriteLn('Standardabweichung:', StandardDeviation);
end.
Ist gar nicht sooo lang. Aber mit Python und eingebauten Funktionen und einen Modul aus der Standardbibliothek, wird das natürlich noch deutlich kürzer.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Random(High(TMark)) + Low(TMark)
Ich bin mir nicht sicher ob man nicht damit außerhalb des Bereichs kommt.

Die coolen Kids benutzen inc mit zweiten Argument. :mrgreen:
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das Beispiel aus der Online-Hilfe von Turbo Pascal deutet auf Ergebnisse zwischen 0 und Argument - 1 hin:

Code: Alles auswählen

uses Crt;
begin
  Randomize;
  repeat
    { Write text in random colors }
    TextAttr := Random(256);
    Write('!');
  until KeyPressed;
end.
Folgendes kleines Testprogramm (mit `Inc()`):

Code: Alles auswählen

type
  TMark = 1..6;
var
  histogram: Array[0..7] of Word;
  mark: TMark;
  i: Word;
begin
  Randomize;
  for i := 1 to 64000 do
    begin
      mark := Random(High(TMark)) + Low(TMark);
      Inc(histogram[mark]);
    end;

  for i := 0 to 7 do Write(histogram[i]:6);
  WriteLn;
end.
Gibt das hier als Ergebnis:

Code: Alles auswählen

     0 10599 10864 10694 10648 10676 10519     0
Sieht also okay aus, auch wenn so ein Zufallsprogramm natürlich theoretisch 64.000 mal innerhalb der Grenzen geblieben sein könnte. 😎

Stimmt, `Inc()` hätte ich für `marksTotal` verwenden können.

Aber die richtig coolen Kids sind total begeistert, dass man ASM-Blöcke direkt in den Pascal-Quelltext schreiben kann, und damit die Summe der Noten und die Min/Max-Werte während des berechnens alle in Registern behalten kann, wo das doofe Turbo Pascal auch die Zwischenergebnisse immer brav in den Speicher schreibt, und auch wieder von dort liest:

Code: Alles auswählen

program Notenstatistik;

const N = 100;

type TMark = 1..6;

var
  Marks: Array[1..N] of TMark;
  mark, Minimum, Maximum: TMark;
  Mean, StandardDeviation: Real;
  marksTotal: Word;
  sum: Real;
  i: Byte;

begin
  Randomize;
  for i := 1 to N do Marks[i] := Random(High(TMark)) + Low(TMark);

  asm
    xor ah,ah
    mov al,byte ptr Marks
    mov bl,al
    mov bh,al
    mov dx,ax
    mov cx,N-1
    cld
    lea si,[Marks+1]
  @L0:
    lodsb
    add dx,ax
    cmp al,bl
    jnl @L1
    mov bl,al
  @L1:
    cmp al,bh
    jng @L2
    mov bh,al
  @L2:
    loop @L0

    mov marksTotal,dx
    mov Minimum,bl
    mov Maximum,bh
  end;
  Mean := marksTotal / N;

  sum := 0;
  for i := 1 to N do sum := sum + Sqr(Marks[i] - Mean);
  StandardDeviation := Sqrt(sum / (N-1));

  WriteLn('           Minimum:', Minimum);
  WriteLn('           Maximum:', Maximum);
  WriteLn('      Durchschnitt:', Mean);
  WriteLn('Standardabweichung:', StandardDeviation);
end.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1125
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Erklärung @__blackjack__ :)
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Sprünge sind teuer.

Code: Alles auswählen

  asm
    xor ah,ah
    mov al,byte ptr Marks
    mov bh,al
    mov dx,ax
    mov cx,N
    cld
    lea si,[Marks+1]
  @L0:
    mov bl,al
  @L1:
    dec ecx
    jz @L2
    lodsb
    add dx,ax
    cmp al,bl
    jl @L0
    cmp al,bh
    jng @L1
    mov bh,al
    jmp short @L1
  @L2:

    mov marksTotal,dx
    mov Minimum,bl
    mov Maximum,bh
  end;
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Ich habe damals immer eher auf ”Verständlichkeit” Wert gelegt, weil wirklich so ziemlich *alles* was man per Hand geschrieben hat, besser ist, als was Turbo Pascal produziert. Die haben ja auch immer nur damit Werbung gemacht wie verdammt schnell der Compiler ist, nie damit, dass der optimierten Code erzeugen würde.

Abgesehen von dem einen "ebx" was ein "bx" sein sollte und dem "short" was der integrierte Assembler nicht versteht, was aber auch keinen Unterschied macht, denn da optimiert der Compiler dann tatsächlich mal in dem er automatisch die kürzeste Sprunganweisung wählt, funktioniert das aber prima. 👍 Wobei der Unterschied bei 100 Noten nicht wirklich auffällt. Auf der DOS-Kiste läuft das gesamte Programm in 0.00661 Sekunden, sagt Turbo Profiler. 🙂 Ich hatte damals auch viel Assembler einfach nur geschrieben weil ich's kann, nicht weil es nötig gewesen wäre.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier mal noch eine Lösung in BASIC:

Code: Alles auswählen

   10 N=100:DIM M(N):X=RND(-TI)
   20 FOR I=1 TO N:M(I)=INT(RND(1)*6)+1:NEXT
   30 MI=M(1):MA=M(1):MT=0:FOR I=1 TO N:M=M(I):MT=MT+M
   40 IF M<MI THEN MI=M:GOTO 60
   50 IF M>MA THEN MA=M
   60 NEXT:ME=MT/N:S=0:FOR I=1 TO N:S=S+(M(I)-ME)^2:NEXT:SD=SQR(S/(N-1))
   70 PRINT"    MIN";MI:PRINT"    MAX";MA:PRINT"   MEAN";ME:PRINT"STD.DEV";SD
Und eine in Python:

Code: Alles auswählen

#!/usr/bin/env python3
from random import choices
from statistics import mean, stdev


def main():
    marks = choices(range(1, 7), k=100)
    for description, function in [
        ("Minimum", min),
        ("Maximum", max),
        ("Durchschnitt", mean),
        ("Standardabweichung", stdev),
    ]:
        print(f"{description:>18}: {function(marks)}")


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten