Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C Anfänger Kritik

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
22.04.2018, 04:40 Uhr
Jones



Hallo, ich möchte als erste Programmiersprache gerne C erlernen und habe hier meinen ersten eigenen Code. Um schlechte Angewohnheiten gar nicht erst entstehen zu lassen, würde ich mich über Kritik freuen.

mfg Jones


C++:
/*
Dieses Projekt, test die Funktion "rand()"
durch eine Wahrscheinlichkeitsrechnung (Droprate)
*/



#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <stdbool.h>


//gibt true wieder wenn die Zufallszahl innerhalb des Prozentbereiches liegt ansonsten false
bool droprate(int prozent)
{
    bool jein =((rand() % 100)+1 <= prozent);
    return jein;
}



int warscheinlichkeit( int durchlaeufe,int wiederholungen, int proz_warscheinlichkeit)
{
    int cou = 0; //zählt die true Werte
    float pro[durchlaeufe]; //speichert die errechneten % Werte von jedem Durchlauf
    srand(time(NULL)); //timer für rand auf NULL setzen

    for (int k = 0; k<durchlaeufe; k++)
    {
        for (int i = 0; i<wiederholungen; i++)
        {
            if (droprate(proz_warscheinlichkeit))
            {
                cou++; //zählt nur true Werte
            }
        }

        float proz = (float)(100 * cou) /wiederholungen; //errechnet die prozentuale Anzahl der true Werte
        pro[k]=proz;

        //variablen reset
        proz = 0;
        cou =0;
    }
    //alle Ergebnisse zusammenzählen und den Durchschnitt ausgeben
    float gesamt = 0;
    for (int i =0; i<durchlaeufe; i++)
    {
        gesamt +=pro[i];
    }
    printf("Bei %d Wiederholungen und %d Durchläufen, ergibt der Durchschnitt %f%%\n",wiederholungen,durchlaeufe,gesamt/durchlaeufe);

    return 0;

}



main()
{

    //200 Durchläufe mit 2000 Versuchen und 20% Wahrscheinlichkeit auf true
    warscheinlichkeit(200,20000,20);


}




Edit:

Ist es möglich das als einen Ternary Operator darzustellen?


C++:

if (droprate(proz_warscheinlichkeit))
            {
                cou++; //zählt nur true Werte
            }


Dieser Post wurde am 22.04.2018 um 04:47 Uhr von Jones editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.04.2018, 10:02 Uhr
ao

(Operator)


Mit dem Fragezeichen-Operator könnte das so aussehen:

C++:
cou = droprate(proz_wahrscheinlichkeit) ? cou + 1 : cou;


Es gibt aber Argumente dagegen:

1. Mögliche Performancenachteile, weil in jedem Fall eine Zuweisung durchgeführt wird und nicht nur in den True-Fällen.

2. Im Sinne von Lesbarkeit und Verständlichkeit ist es immer zu empfehlen, das zu kodieren, was man ausdrücken will. Du willst hier im True-Fall einen Zähler erhöhen, und im False-Fall soll nichts passieren. Dann solltest du das auch so schreiben. Der Fragezeichen-Operator impliziert, dass in beiden Fällen etwas passiert. Dass das in Wahrheit nicht der Fall ist, muss der Leser des Codes erst erkennen. Schade um die Zeit, die dafür nötig ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.04.2018, 17:57 Uhr
Jones



Wenn ich das richtig verstehe ist true / false auch 1/0.

Ich hab jetzt den Ternary Operator durch ein einfachen Vergleich esetzt.



C++:

cou += (droprate(proz_warscheinlichkeit)); //zählt true Werte





Wäre das IO?

mfg Jones
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.04.2018, 21:38 Uhr
ao

(Operator)


"IO" im Sinne von "macht das Richtige" ist das, ja.

Was Verständlichkeit angeht, kann ich mich nur wiederholen: Der beste Code ist der, über den man nicht nachdenken muss, weil man auf den ersten Blick sieht, was geschieht. Und wenn man über jede deiner Codezeilen so lange nachdenken muss wie über diese (droprate gibt entweder 0 oder 1 zurück, also wird hier cou hochgezählt oder auch nicht ...), dann wird das Lesetempo nicht allzu hoch sein, fürchte ich.

Wozu sollen diese Mikrooptimierungen denn gut sein, und warum schreibst du nicht einfach so?

C++:
if (droprate (...) != 0)
    cou++;


Die Frage ist ernst gemeint, also überleg dir bitte eine Antwort.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.04.2018, 21:53 Uhr
ao

(Operator)


Außerdem: Deine Bezeichner (warscheinlichkeit, pro, proz, gesamt, jein, ...) lassen vermuten, dass du dir über die Wichtigkeit von treffenden Namen noch keine Gedanken gemacht hast. Dabei sind die Namen das erste, was der Leser sieht und was sein Denken in die richtige Richtung lenkt oder ihn verwirrt. Du solltest dir hier mehr Mühe geben.

Und entscheide dich entweder für deutsche oder für englische Bezeichner. Multikulti ist zwar im Prinzip toll, aber nicht beim Programmieren.

Dieser Post wurde am 23.04.2018 um 22:16 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.04.2018, 22:23 Uhr
Jones



Es geht bei den Mikrooptimierungen darum einen Style anzueignen den ich dann versuche beizubehalten.

Besonders bei "if" hab ich da noch keinen Style denn ich beforzuge.
Ich stehe da immer vor der Frage "if", ternary, dict(weis ich NOCH nicht wie das überhaupt in C geht).

Ich Verstehe das "var +=(irgendwas)" schwer zu deuten ist und ich das vermutlich nach 2-3 Tagen selbst nicht mehr verstehe.
Das "if (irgendwas !=0)" sorgt da für mehr Verständnis (ist ein Vergleich der wenn er nicht 0 ist etwas macht).

Stellt sich mir die Frage, welchen Stellenwert der Ter.Op. im Programmierbuisnes hat?

Desweiteren versuche ich mich an DRY zu halten und so wenig wie möglich Abzweigungen zu bauen.

mfg Jones
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.04.2018, 22:51 Uhr
ao

(Operator)



Zitat von Jones:
Stellt sich mir die Frage, welchen Stellenwert der Ter.Op. im Programmierbuisnes hat?

Stellenwert ... nun ja.

Es gibt Situationen, wo er gut passt, nämlich immer da, wo in einem Ausdruck abhängig von einer Bedingung der eine oder der andere Wert gebraucht wird. Beispiel Signumfunktion:

C++:
int sign (float x)
{
    return (x > 0) ? 1 : 0;
}



In anderen Situationen passt er hingegen nicht so gut, zum Beispiel in der, die du beschrieben hast - da wird nämlich nur in einem der beiden Fälle eine Aktion gebraucht.

Danach sollte man entscheiden, und nicht nach "Stellenwert" oder "Style".


Zitat:
Desweiteren versuche ich mich an DRY zu halten und so wenig wie möglich Abzweigungen zu bauen.

Wenn du dich an Programmierparadigmen halten willst, dann stell sicher, dass du sie richtig verstanden hast. DRY heißt, dass du Codeblöcke nicht kopieren sollst. Es heißt nicht, dass du nicht verzweigen darfst.

Dieser Post wurde am 24.04.2018 um 12:32 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.04.2018, 00:18 Uhr
Jones




Zitat:
Desweiteren versuche ich mich an DRY zu halten und so wenig wie möglich Abzweigungen zu bauen.



Zitat:
Wenn du dich an Programmierparadigmen halten willst, dann stell sicher, dass du sie richtig verstanden hast. DRY heißt, dass du Codeblöcke nicht kopieren sollst. Es heißt nicht, dass du nicht verzweigen darfst.


Wenn du Fragen Beantworten möchtest solltest du sicher sein das du es richtig Gelesen hast.Nur weil ich DRY und Abzweigungen in einem Satz unterbringe, heißt das nicht das es zusammengehört.

mfg Jones
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.04.2018, 16:48 Uhr
ao

(Operator)



Zitat von Jones:
Nur weil ich DRY und Abzweigungen in einem Satz unterbringe, heißt das nicht das es zusammengehört.

Dann wünsche ich viel Erfolg im Kommunizieren mit anderen Individuen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.04.2018, 17:15 Uhr
Jones



etwas zum Nachdenken:

Ich habe heute 12 Eier und einen Regenschirm gekauft.

Das Wetter ist super und Klaus arbeitet bei OBI.

Er macht Yoga und sie kratzt sich am Kopf.

mfg Jones

Dieser Post wurde am 25.04.2018 um 17:16 Uhr von Jones editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: