Praktikum - Programmierung

naja, um auch mal was sinnvolle szu schreiben.

Du schreibst du hast in deiner schulischen Ausbildung C/c++ gelernt. Sicherlich nicht ;)
Und PHP-klassen coding in 2-3 tagen. Alles klar ;)

Es ist ein himmelweiter Unterschied, in etwa zu wissen worum es geht und dem Code seine Funktion zu entnehmen oder wirklich zu programmieren. Das erlernen einer Sprache ist lediglich das Benutzen eines Werkzeugs zu erlernen.
Allerdings, wenn Du schon so einiges kannst, haste ja auch sicherlich etwas Code den du zeigen kannst. Dann waere allgemeines Feedback viel einfacher.

Ansonsten rate ich dir dringend mit einer gewaltigen Portion Bescheidenheit in ein Vorstellungsgespraech zu gehen ;)
 
Es ist etwas schwer Code zu zeigen da das meiste ja aus den Zusammenhang gerissen ist und ich hier nicht massenweise Code posten will. Aber ich denke für dich ist das nicht mehr als 'ne Müde Ausrede ;) deswegen habe ich hier mal was rausgekramt:

Dies sind Code Ausschnitte aus einem Kartenspiel Server. Der Server bekommt Daten und die "Arbeiter"-Klassen kümmern sich um die Ausführung. Als erstes der Code der Basis Arbeiter Klasse und dann einmal eine Klasse die sich um den Shop kümmert wo man Karten kaufen kann und einmal eine Klasse die sich um das einloggen/ausloggen kümmert.

Code:
#ifndef ARBEITER_H
#define ARBEITER_H

#include <iostream>
#include "datenbank.h"
#include "KartenspielClient.h"
#include "Server.h"
using namespace std;

class Arbeiter{
protected:
    Connection *con;
    static string datentrenner;
    Server* server;
public:
    Arbeiter(Connection* mysqlconnection,Server* aserver);
    static void setDatentrenner(string str);

    virtual bool arbeiten(KartenspielClient *client, string befehl,vector<string>& daten)=0;
};

#endif



Code:
#include "ALogin.h"

bool ALogin::arbeiten(KartenspielClient *client, string befehl,vector<string>& daten){

    if(befehl == "CallLogin" && daten.size() == 3){
        Query query(con);
        query << "select * from benutzer where name ="<<quote<<daten[0]<<" and passwort like SHA1("<<quote<<daten[1]<<")";
        if(StoreQueryResult res = query.store()){
            if(res.num_rows() == 1 && eingeloggteSpieler.find(daten[0]) == eingeloggteSpieler.end() && daten[2] == version){
                eingeloggteSpieler[daten[0]]=client;
                client->setName(daten[0]);
                client->loginBestaetigung();
                if(daten[0]=="Botti" || daten[0]=="asd"){
                    client->setCheater(true);
                    client->nachrichtenBox("Du bist ein Cheater!");
                }
            }
            else{
                if(daten[2] != version)
                    client->nachrichtenBox("Die Client Version ist ungueltig. Server akzeptiert Version "+version);
                if(eingeloggteSpieler.find(daten[0]) != eingeloggteSpieler.end()){
                    client->nachrichtenBox("Der eingegebene Account ist bereits eingeloggt. Account wurde ausgeloggt.");
                    eingeloggteSpieler[daten[0]]->ausloggen();
                    eingeloggteSpieler.erase(eingeloggteSpieler.find(daten[0]));
                }
                server->datenSenden(client->getId(),"R_CallLogin"+ datentrenner + "0");
            }
        }
        else{
            client->loginAbweisung();
            throw(static_cast<string>("ALogin::arbeiten:") + query.error());
        }
        return true;
    }
    return false;

}

void ALogin::loggtSichAus(string spieler){
    if(eingeloggteSpieler.find(spieler) != eingeloggteSpieler.end()){
        eingeloggteSpieler.erase(eingeloggteSpieler.find(spieler));
    }
    else{
        cout<<"ALogin::loggtSichAus spieler ist nicht eingeloggt"<<endl;
    }
}

Code:
#include "AShop.h"

bool AShop::arbeiten(KartenspielClient *client, string befehl,vector<string>& daten){


    //////// Shop

    //// GetGeld()
    if(befehl == "GetGeld"){
        client->infoGeld();
        return true;
    }

    //// GetShopArtikel()
    if(befehl == "GetShopArtikel"){
        Query query(con);
        query<<"select name from artikel";
        string daten;
        if(StoreQueryResult res = query.store()){
            for(unsigned int i=0; i<res.num_rows(); ++i){
                if(i)
                    daten+=datentrenner;
                daten+=(string)res[i]["name"];
            }
            client->infoShopArtikel(daten);
        }
        else{
            cout << "GetShopArtikelFailed to get item list: " << query.error() << endl;
        }
        return true;
    }

    //// GetKaufBeschreibung(artikel)
    if(befehl == "GetKaufBeschreibung" && daten.size() == 1){
        Query query(con);
        query<<"select beschreibung,anzahl,preis from artikel where name="<<quote<<daten[0];
        if(StoreQueryResult res = query.store()){
            if(res.num_rows()){
                    client->infoKaufbeschreibung((string)res[0]["beschreibung"]+
                                                  "<br>Anzahl: "+(string)res[0]["anzahl"]+
                                                  "<br>Preis: "+(string)res[0]["preis"]);
            }
        }
        else{
            cout << "GetKaufBeschreibung to get item list: " << query.error() << endl;
        }
        return true;
    }

    // CallKaufen(artikel)
    if(befehl == "CallKaufen" && daten.size() == 1){
        cout<<"bin in kaufen"<<endl;
        Query query(con);
        query<<"select * from artikel where name="<<quote<<daten[0];
        if(StoreQueryResult res = query.store()){
            cout<<"gefunden"<<endl;
            if(res.num_rows()){
                    if((int)res[0]["preis"] > client->getGeld()){
                        client->nachrichtenBox("Du hast zu wenig Geld");
                    }
                    else{
                        if((int)res[0]["anzahl"] == 0){
                          client->nachrichtenBox("Der Artikel ist ausverkauft");
                        }
                        else
                        {
                            query<<"update artikel set anzahl=anzahl-1 where name ="<<quote<<daten[0];
                            query.execute();
                            client->setGeld(client->getGeld()-(int)res[0]["preis"]);
                            // Es wird gekauft
                            if((string)res[0]["anzahlzufallskarten"] == "0"){
                                query<<"select kartenid,karten.name from artikelkarten\n"
                                     <<"inner join karten on artikelkarten.kartenid=karten.id\n"
                                     <<"where artikelid="<<quote<<res[0]["id"];
                                string neuekarten;
                                if(StoreQueryResult res = query.store()){
                                    for(unsigned int i=0; i<res.num_rows(); ++i){
                                            cout<<"gib karte"<<endl;
                                            if(i)
                                                neuekarten+=datentrenner;
                                            neuekarten+=(string)res[0]["name"];
                                            query<<"INSERT INTO benutzerkarten(benutzerid,kartenid) VALUES((select id from benutzer where name\n"<<
                                            "="<<quote<<client->getName()<<"),"<<res[i]["kartenid"]<<")";
                                            query.execute();
                                    }
                                }
                                else{
                                    cout << "CallKaufen2 to get item list: " << query.error() << endl;
                                }
                                client->gibNeueKarten(neuekarten);
                            }
                            else{

                                int sehr_haeufig=(int)res[0]["anzahlzufallskarten"]*0.4;
                                int normal=(int)res[0]["anzahlzufallskarten"]*0.4;
                                int rar=(int)res[0]["anzahlzufallskarten"]*0.15;
                                int selten=(int)res[0]["anzahlzufallskarten"]*0.05;
                                string neuekarten;
                                cout<<"zufallskauf!"<<endl;
                                string hk;
                                int anz=0;
                                for(int k=0;k<4;++k){
                                    if(k==0){
                                        hk="normal";
                                        anz=normal;
                                    }
                                    if(k==1){
                                        hk="rar";
                                        anz=rar;
                                    }
                                    if(k==2){
                                        hk="selten";
                                        anz=selten;
                                    }
                                    if(k==3){
                                        hk="sehr haeufig";
                                        anz=sehr_haeufig;
                                    }

                                    query<<"select karten.id,karten.name from ((artikelkarten inner join karten on\n"
                                         <<"artikelkarten.kartenid=karten.id) inner join artikel\n"
                                         <<"on artikelkarten.zufallsid=artikel.zufallsid)\n"
                                         <<"inner join haeufigkeiten on haeufigkeiten.id = karten.haeufigkeit\n"
                                         <<"where haeufigkeiten.bezeichnung like "<<quote<<hk<<" and\n"
                                         <<"artikelkarten.artikelid="<<quote<<res[0]["id"];

                                    if(StoreQueryResult res2 = query.store()){
                                        if(res2.num_rows()){
                                            for(int i=0;i<anz;++i){
                                                if(neuekarten != "")
                                                    neuekarten+=datentrenner;
                                                cout<<"zufallskarte"<<endl;

                                                int z=rand()%res2.num_rows();
                                                neuekarten+=(string)res2[z]["name"];

                                                query<<"INSERT INTO benutzerkarten(benutzerid,kartenid) VALUES((select id from benutzer where name\n"<<
                                                "="<<quote<<client->getName()<<"),"<<res2[z]["id"]<<")";
                                                query.execute();
                                            }
                                        }
                                    }
                                    else{
                                        cout << "CallKaufen3 to get item list: " << query.error() << endl;
                                    }

                                }
                                client->gibNeueKarten(neuekarten);
                            }
                        }
                    }
            }
        }
        else{
            cout << "CallKaufen1 to get item list: " << query.error() << endl;
        }
        return true;
    }
    return false;
}
 
Ja, ich bin pingelig, ich stehe dazu:
1. Bei Vektoren bietet es sich an statt operator[] die Funktion at(...) zu verwenden, da diese den Bereich überprüft und bei Fehlern eine Exception wirft anstatt undefiniertes Verhalten zu produzieren.
2. in ALogin.cpp übergibst du Daten by reference, aber nicht konstant. Soweit ich jetzt nichts übersehen habe ist dieser Parameter aber auch ein reiner In-Parameter, weshalb ein const wohl angebracht wäre.

Jetzt bin ich glücklich :D

mfg benediktibk
 
Code:
int sehr_haeufig=(int)res[0]["anzahlzufallskarten"]*0.4;                                 
            int normal=(int)res[0]["anzahlzufallskarten"]*0.4;

Ihr Gauner!
 
Wie gemein ;) Hat aber alles momentan seinen Sinn. Außerdem habe ich eigentlich kein Problem in der Plural-Form angesprochen zu werden doch so öffentlich macht das doch einen recht schizophrenen Eindruck.

@benediktibk
at statt [] hat demnach wirklichen einen entscheidenden Vorteil. Wobei ich subjektiv [] einfach lieber mag. Und bei const Schlampe ich immer ahrr.. Ich Maße mir nicht an zu sagen das es sinnlos ist aber für das was ich programmiere bringt mehr es nur wenig Mehrwert. Wobei demnach ich in einer Klasse auch alles public deklarieren könnte... was ich aber nicht mache. Meine Argumentation befriedigt nicht wirklich^^
 
Zurück
Oben