Code

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract VentureFund {

    struct Anteilseigner {
        bool gewaehlt;
        uint anteil;
    }
    mapping(address => Anteilseigner) public anteilseigner; // Ethereum-Adressen 
                                                            // der Anteilseigner
    struct Startup {
        address adresse;    // Ethereum-Adresse eines Startups für Auszahlung
        uint stimmen;
    }
    Startup[] public startups;  // Array von Startups die gewählt werden können

    uint public mindestsumme;
    uint public fondvolumen;

    constructor(address[] memory startupAdressen, uint _mindestsumme) {
        mindestsumme = _mindestsumme;
        for (uint i = 0; i < startupAdressen.length; i++) {
            startups.push(Startup({
                stimmen: 0,
                adresse: startupAdressen[i]
            }));
        }
    }

    // TODO: Was macht diese Funktion? Wie könnte ein Name der Funktion heißen? 
    function NAME () public payable { 
        anteilseigner[msg.sender].anteil += msg.value;  // 'msg.value' 
                                                        // entspricht der ETH, 
                                                        // die bei dem 
                                                        // Funktionsaufruf 
                                                        // mitgesendet werden
        fondvolumen += msg.value;
    }

    function abstimmen(uint startupNummer) public {    
        Anteilseigner storage sender = anteilseigner[msg.sender]; 
                                                 // 'msg.sender' entspricht der
                                                 // Ethereum-Adresse des
                                                 // Funktionsaufrufenden
        // TODO: Funktion selbst schreiben
        // Beachte, dass nur Anteilseigner abstimmen dürfen und diese sollten 
        // noch nicht gewählt haben. Man sollte zudem nur vor dem Ende 
        // abstimmen dürfen.
        // 'sender.gewaehlt' und 'sender.anteil' können genutzt werden genauso 
        // wie 'startups[startupNummer].stimmen'
    }

    function auszaehlen() public view                   
            returns (uint gewinner)
    {
        // TODO: Funktion selbst schreiben
        // Nutze eine for-Schleife, um aus dem 'startups'-Array, dasjenige mit 
        // den meisten Stimmen als Gewinner auszuzählen.
    }

    function auszahlen() public 
    {
        require(fondvolumen >= mindestsumme, "Noch nicht genug eingesammelt.");
        payable(startups[auszaehlen()].adresse).transfer(fondvolumen);
    }
}