Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
19.01.2002, 10:21
CabaL



Also ich habe folgendes Problem. Zum Thema Arrays bekamen wir in der Schule diese Aufgabe:

Schreibe einen Programmteil in dem ein 1000-maliger Würfelwurf simuliert wird. Dabei soll gezählt werden:
a)wie oft die Zahl6,
b)wie oft eine ungerade Zahl,
c)wie oft eine Zahl 3-mal hintereinander
auftrat.

mein code:
Quellcode:x:=1;
c:=1;
for i:=1 to 1000 do begin
a:=random(6)+1;
if a=6 then begin             //a)
x:=x+1;
count.text:=IntToStr(x);
if (a/2=2) or (a/2=3) or (a/2=1) then begin //b)
c:=c+1;
unger.text:=IntToStr(c);
end;
end;
end;
end;

Ich habe jetzt keine Ahnung was ich da mit Arrays machen soll?? Ich bin in dem Gebiet noch nicht so ganz erfahren und wie ich b).tens lösen soll habe ich kA...
weiß jmd. Rat?
p.s. bitte lacht mich nicht wegen meines schlechten styles aus(<-nub)

[edit]a) und b) sind mir klar[/edit]

--

..::I've carved my soul to shreds in service of the Cabal. What little humanity I retain is corrupted by the Beast, which has grown stronger with every life I've taken::.


Dieser Beitrag wurde am 19.01.2002 um 10:40 von CabaL- bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
19.01.2002, 13:24
Another1



so ich hatte jetzt keinen bock mir dein code durchzulesen, aber so macht man das mit arrays (nen bissle statistik =)

(ich packs mal hierhin, kA ob es funzt, ich habs nit getestet)

Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var werte : array[1..1000] of integer;
    i : integer;
    eins,zwei,drei,vier,fuenf,sechs : integer;
    letzterDreier,dreierReihen: integer;
    durchschnitt : real;

begin
   Randomize;
   letzterDreier := 0;
   durchschnitt := 0;
   dreierReihen := 0;
   eins := 0;zwei := 0;drei := 0;sechs := 0;

   for i:=1 to 1000 do
        werte[i] := Random(6)+1;

   // auswerten
   for i:=1 to 1000 do
   begin
      durchschnitt := durchschnitt + werte[i];
      if(i >= 3) and ((i - letzterDreier) >= 3) then // teste 3er
      begin
        if (werte[i-2] = werte[i]) and (werte[i-1] = werte[i])then
        begin
                letzterDreier := i;
                inc(dreierReihen);
        end;

      end;

      case werte[i] of
      1 : inc(eins);
      2 : inc(zwei);
      3 : inc(drei);
      4 : inc(vier);
      5 : inc(fuenf);
      6 : inc(sechs);
      end;
   end;

   durchschnitt := durchschnitt / 1000;


end;

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
002
19.01.2002, 15:57
CabaL



ich kapiers ned so ganz aber danke schön ;D

--

..::I've carved my soul to shreds in service of the Cabal. What little humanity I retain is corrupted by the Beast, which has grown stronger with every life I've taken::.

zum Seitenanfang zum Seitenende Profil || Suche
003
19.01.2002, 15:59
CabaL



ich kenn inc gar nicht, was es macht...

--

..::I've carved my soul to shreds in service of the Cabal. What little humanity I retain is corrupted by the Beast, which has grown stronger with every life I've taken::.

zum Seitenanfang zum Seitenende Profil || Suche
004
19.01.2002, 18:13
Another1



inc(i) entspricht i := i + 1; // increment, wie ++ in c etc ...

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
005
19.01.2002, 18:22
feigling



Hier noch Bespiele aus der Delphi-Hilfe.
Da wird alles genau erklärt:

zu inc
Quellcode:
var  IntVar: Integer;
  LongintVar: Longint;
begin
  Inc(IntVar); { IntVar := IntVar + 1 }
  Inc(LongintVar, 5); { LongintVar := LongintVar + 5 }
end;

und zu dec, dem Gegenteil von inc :)
Quellcode:
var  IntVar: Integer;
      LongintVar: Longint;
begin
  Intvar := 10;
  LongintVar := 10;
  Dec(IntVar); { IntVar := IntVar - 1 }
  Dec(LongintVar, 5); { LongintVar := LongintVar - 5 }
end;

Ich denke mal, das sollte dir helfen :)

--

zum Seitenanfang zum Seitenende Profil || Suche
006
19.01.2002, 20:11
Hanfling



wo kommst du her??? wir machen grad das gleiche in der schule, auch die aufgabe, zufällig lms in leverkusen?.... naja eigentlich ist unser unterrichtsmaterial von ner anderen schule in dem zusammenhang geklaut...

--

Nun ist deine Zeit gekommen sprach der Tod, stolperte und brach sich das Genick. :o

zum Seitenanfang zum Seitenende Profil || Suche
007
19.01.2002, 20:44
TheTinySteini



Vielleicht sollte man Another1's Code mal ein bisschen kommentieren (und verbessern =) ), also:
Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var werte : array[1..1000] of integer; // Tausend integer, die wir mit Würfen füllen
_i : integer;
_Sechser : integer; // Anzahl Sechser
_Ungerade: integer; // Anzahl ungerader Würfe
_DreierReihen: integer; // Anzahl DreierReihen
_LetzterDreier: integer; // Position des letzten Dreiers
begin
_Randomize;
_Sechser := 0;
_Ungerade := 0;
_DreierReihen := 0;
_LetzterDreier := 0;
_for i:=1 to 1000 do
__werte[ i ] := Random(6)+1; // Tausend mal würfeln

// Auswerten (produziertes Array durchgehen)
_for i:=1 to 1000 do
_begin
__if(i >= 3) and ((i - letzterDreier) >= 3) then
__// falls es mindestens der dritte Wurf war und der letzte Dreier
__// mindestens 3 Würfe her war, auf nen Dreier testen
__begin
___if (werte[i-2] = werte[ i ]) and (werte[i-1] = werte[ i ]) then
___begin
____LetzterDreier := i; // Position speichern
____inc(DreierReihen); // Zähler erhöhen
___end;
__end;
__if( werte[ i ] = 6 ) then // Sechser zählen
___inc(Sechser);
__if( (werte[ i ] mod 2) = 1 ) then // ungerade Zahl, mod gibt den Rest einer Division aus
___inc( Ungerade );
_end;
// hier fehlt noch die Ausgabe
end;

(die _ am Anfang sollen nur ein bisschen Ordnung in das Layout bringen, einfach ignorieren.)

Noch kurz zu Mod, falls du das nicht kennst: Mod gibt den Rest einer Division aus, in diesem Fall wird also werte[ i ] durch 2 geteilt und dann geguckt, ob ein Rest übriggeblieben ist. War die Zahl ungerade, dann ist 1 übriggeblieben, war die Zahl gerade, ist 0 übriggeblieben.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
008
19.01.2002, 22:09
CabaL



cool ihr macht es nubs wie mir leicht.
vielen dank
@aga nein ich komme aus freiburg ;D

--

..::I've carved my soul to shreds in service of the Cabal. What little humanity I retain is corrupted by the Beast, which has grown stronger with every life I've taken::.

zum Seitenanfang zum Seitenende Profil || Suche
009
20.01.2002, 15:31
Kriz



Spam: Würfelspiele - Perverses Delphi >;) hrhrhr

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
010
20.01.2002, 15:50
CY4N1D3



procedure Komm_Gibs_Mir;
.Var Var1, Var2, Wuerfel: Integer;
......Count6, CountUngrade, Count3x: Integer;
......Test3x: Array[0..2] of Integer;
begin
.Randomize;
.Count6 := 0; CountUngrade := 0; Count3x := 0;
.For Var1 := 0 to 2 do Test3x[Var1] := Var1;
.For Var1 := 0 to 999 do
.Begin
..Wuerfel := Random(7);
..if Wuerfel = 6 Then inc(Count6);
..if (Wuerfel / 2 = Wuerfel div 2) Then inc(CountUngrade);
..For Var2 := 0 to 1 do Test3x[Var2] := Test3x[Var2+1];
..Test3x[2] := Wuerfel;
..if (Test3x[0] = Test3x[1]) and (Test3x[1] = Test3x[2]) Then Inc(Count3x)
.End;
.Showmessage( 'endresultat:'+chr(13)+chr(13)+
..............'die 6 kam '+IntToStr(Count6)+' mal'+chr(13)+chr(13)+
..............IntToStr(CountUngrade)+' mal kam eine ungerade zahl'+chr(13)+chr(13)+
..............'und '+IntToStr(Count3x)+' mal kamen 3 gleiche zahlen hintereinander' )
end;

hf Cyan

--

ob nun delphi, c oder java. kein programm lässt sich mit allen 3en gleichschnell entwickeln.


Dieser Beitrag wurde am 20.01.2002 um 18:21 von CY4N1D3 bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
011
20.01.2002, 16:16
Kriz



Quellcode:#include <stdlib.h>
#include <iostream.h>

void main(void)
{
....int Var1, Var2, Wuerfel, Count6, CountUngrade, Count3x;
....int Text3x[2];
....char string[1024];
....srand(1);
....Count6 = CountUngrade = Count3x = 0;
....for(Var1=0; Var1<=2; Var1++) Test3x[Var1] = Var1;
....for(Var1=0; Var1<=999; Var1++)
....{
........Wuerfel = rand()%6;
........if(Wuerfel==6) Count++;
........if((Wuerfel>>2)==(Wuerfel%2)) CountUngrade++;
........for(Var2=0; Var2<=1; Var2++) Test3x[Var2] = Test3x[Var2+1];
........Test3x[2] = Wuerfel;
........if((Test3x[0]==Test3x[1])&&(Test3x[1]==Test3x[2])) Count3x++;
....}
....cout << "Endresultat:\n\n" << "Die 6 kam " << itoa(Count6) << " mal\n\n"
.........<< itoa(CountUngrade) << " mal kam eine ungerade Zahl\n\nUnd "
.........<< itoa(Count3x) << " mal kamen 3 gleiche Zahlen hintereinander.";
}

Hm, und nu? =)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
012
21.01.2002, 07:29
Tron



@Kriz:
if((Wuerfel>>2)==(Wuerfel%2)) CountUngrade++;

hae? 2 ist also ungerade: (2 >> 2) == 0, (4 % 2) == 0 => (2 >> 2) == (4 % 2)

wie waer's einfach mit:
if (Wuerfel % 2) CountUngrade++;
oder
if (Wuerfel & 1) CountUngrade++;

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
013
21.01.2002, 10:31
Kriz



Cynaid hat geschrieben:

if (Wuerfel / 2 = Wuerfel div 2) Then inc(CountUngrade);

Wuerfel / 2 bedeutet ja wohl Wuerfel geteilt durch 2. Das kann man in C++ sowohl als Wuerfel/2 wie auch atomar als Wuerfel>>1 schreiben (Sorry, da habe ich 2 statt 1 geschrieben =).

Ich gebe zu, daß ich mich beim zweiten Teil der Auswertung vertan habe. Wuerfel div 2 habe ich fälschlicherweise als Wuerfel%2 interpretiert, also Wuerfel mod 2. Da Mod (%) aber nur den Rest einer Division ausspuckt, ist Wuerfel div 2 wohl eher der Divisor einer Division mit 2.

Wuerfel: 1,2,3,4,5,6
Div 2: 0,1,1,2,2,3

Sehe ich das richtig? Keine Ahnung mehr von Pascal, ist schon mehr als 9 Jahre her...

C/C++ kennt keinen Divisor Operator, da der Divisor-Operator redundant ist, sobald man Wuerfel>>1 schreibt. Ok, dann lautet der Ausdruck eben:

if( (Wuerfel/2) == (Wuerfel>>1)) CountUngrade++;

Cu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
014
21.01.2002, 11:36
CY4N1D3



*lol*, ne is seeehr simpel...

der "a / b" operator teilt mit einem float ergebniss
der "a div b" operator teilt mit einem int ergebniss

wenn "a / b" = "a div b" is dann is die zahl gerade *g*

is blödsinn, wa ? *G*

kannst in c auch einfach schreiben:

if (int(a/b)==(a/b)) { mach blödsinn } // hau mich jetzt nicht, ich geh gerade davon aus das int(x) einen float in einen int umwandelt :-/... hab gerade kein c kompiler zur hand. ich hoffe du hast aber verstanden was ich meine *g* und bitte korrigier mich wenn ich mit int() falsch lag

--

ob nun delphi, c oder java. kein programm lässt sich mit allen 3en gleichschnell entwickeln.


Dieser Beitrag wurde am 21.01.2002 um 11:37 von CY4N1D3 bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
21.01.2002, 12:38
Kriz



Hm...

Der Typ des Ergebnisses ist in C/C++ abhängig von den Typen der Operanden. Wenn ein höherer Datentyp vorhanden ist, dann ist das Ergebnis entsprechend dem höheren Typen:

int = int / int;
float = int / float;
float = float / int;

Also der Divisionsoperator in C/C++ würde bei Wuerfel/2 in deinem Falle standardmäßig auf jeden Fall ein int zurückliefern und kein float. Daher ist der Vergleich zwischen (int(Wuerfel/2) == (Wuerfel/2)) in C/C++ sinnlos, außer man schreibt es...

C-like:

if( ((int)((float)Wuerfel/2.0f)) == (Wuerfel/2) ) ...

oder C++-like:

if( (static_cast<int>((static_cast<float>(Wuerfel)/2.0f))) == (Wuerfel/2) )...

Aber wie dem auch sei, es ist in C/C++ Unsinn, einen derartigen Vergleich zu starten :)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
016
21.01.2002, 12:59
CY4N1D3



oki *merk*

--

ob nun delphi, c oder java. kein programm lässt sich mit allen 3en gleichschnell entwickeln.

zum Seitenanfang zum Seitenende Profil || Suche
017
21.01.2002, 17:32
Prefect



Wie nett von Kriz uns vorzuführen, warum static_cast dumm ist :)

Ein paar Leute hier müssen noch was zum Thema Optimierungen lernen ;) Ich würde das ganz spontan mal so lösen (in C, weil ich mich nicht in die Pascal-Syntax reindenken will):

Quellcode:
int pa = 0, pb = 0, pc = 0;
int cbuf[2];
int i, v;

for(i = 0; i < 1000; i++) {
....v = rand() % 6 + 1;
....if (v == 6) pa++;
....if (v & 1) pb++;
....
....if (i >= 2)
........if (cbuf[0] == cbuf[1] && cbuf[0] == v) pc++;
....cbuf[i & 1] = v;
}

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
018
21.01.2002, 21:32
Tron



@Prefect:
hab noch ne optimierung: initialisiere cbuf mit {0, 0} dann kannst du das if (i >= 2) weglassen (;

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
019
22.01.2002, 15:46
Hessie J.



Ich glaub so ist's noch nen Zacken schneller, oder?:
Quellcode:int pa = 0, pb = 0, pc = 0;
int cbuf[2] = {0, 0};
int i, v;

for(i = 0; i < 1000; i++) {
....v = rand() % 6 + 1;
....if (v & 1) pb++;
....else if (v == 6) pa++;

....if (cbuf[0] == cbuf[1] && cbuf[0] == v) pc++;
....cbuf[i & 1] = v;
}

Ungerade und 6 schliessen sich ja gegenseitig aus, deshalb das else
Und wenn man zuerst auf ungerade checkt, braucht man nur noch in ca. 50% der Fälle auf 6 zu checken.

--


Dieser Beitrag wurde am 22.01.2002 um 15:51 von Hessie J. bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
22.01.2002, 19:50
Kriz



Jupp. Gut mitgedacht.

@Prefi: Ich hab da nix vereinfacht oder optimiert, sondern nur mal 1:1 portiert :)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
021
23.01.2002, 17:45
shenZi



ganz ruhig jungs ;D

--

..::Follow the rabbit ::..

zum Seitenanfang zum Seitenende Profil || Suche