Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Reihenfolge der Komponenten beim PC Zusammenbau

Diskussion: Reihenfolge der Komponenten beim PC Zusammenbau im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Da die Aufgabe Charminator anscheindend zu einfach war, kommt mal eine ohne solche Hilfestellungen . Wir haben uns eine Maschine ...

Antwort
Alt 14.06.07, 15:49   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard Reihenfolge der Komponenten beim PC Zusammenbau


Da die Aufgabe Charminator anscheindend zu einfach war, kommt mal eine ohne solche Hilfestellungen .

Wir haben uns eine Maschine gebaut, die Rechner zusammenschrauben kann. Die Unterprogramme zum Einbau einzelner Komponenten wie: Mainboard einbauen, RAM, Grafikkarte, S-ATA-Kabel etc einstecken sind schon fertig.

Allerdings wollen wir Rechner nach Kundenwünschen zusammenbauen und die Maschine sollte dies vollautomatisch machen. Jedoch muss man zuerst das Mainboard einbauen, bevor die Grafikkarte eingesteckt wird und der CPU-Kühler sollte erst nach dem Einbau der CPU angebracht werden. Deshalb wollen wir uns ein Programm schreiben, welches die eingegebenen Komponenten in die richtige Reihenfolge bringt, damit unsere Machine nach dieser Liste den Rechner zusammenbauen kann.

Berücksichtige folgendes:
- Gehäuselüfter müssen vor Grafik-,Sound-,Netwerkkarten angebracht werden.
- CPU-Kühler kann erst nach der CPU Montage platziert werden, aber unbedingt vor S-ATA und Audiokabel.
- CPU muss vor CPU-Kühler, S-ATA und Audiokabel rein.
- Mainboard muss vor allen anderen Komponenten (außer dem Gehäuselufter) montiert werden.
- Festplatte und DVD-Laufwerk kommen vor S-ATA Kabel
- SLI Kabel kann erst nach Grafikkarteneinbau eingesteckt werden
- Audiokabel kann erst nach Soundkarte und DVD-Laufwerk Einbau hinein.

Das Programm soll nicht irgendeine logische Überpfürung anstellen (z.B SLI Kabel für nur einge Grafikkarte oder CPU-Kühler ohne CPU), sondern nur eine Reihenfolge zum Montieren ausgeben.

Und da wir das Programm später für viel viel Geld an eine große Firma verkaufen wollen,sollte es auf für andere Probleme anwendbar sein .
Idealerweise sollte man zuerst die Konfiguration:
Elemente: A,B,C,D
A vor: B,C
C vor D
B vor C
eingeben können
und dann zu einer Eingabe die richtige Reihenfolge herausbekommen:
Eingabe: C,D,A
Ausgabe: A,C,D

Diesen Schritt mit Benutzereingabe könnt ihr bei eurem Demo-Code fürs Habo natürlich auslassen und die Eingabe schon im Source festkodieren.

Eingabe für diese Aufgabe:
Kundenwunsch: 2x "InVidia GeForce 80808" Grafikkarte, Ausus Mainboard, "Indel Core5 80Ghz" CPU, Super-silent-CPU Kühler, "LeechersChoice200TB"-Festplatte,DVD-Laufwerk, Gehäuselüfter,SLI-Kabel,S-ATA Kabel, Audiokabel,Soundkarte, Netzwerkkarte, 4x "Infeoneon 128 GB" RAM Riegel

__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 30.06.07, 01:18   #2 (permalink)
 
Registriert seit: 12.01.07
Ivan Dolvich Leistung: Facit NTK
Likes: 0
Standard RE: Reihenfolge der Komponenten beim PC Zusammenbau

Hi Hackers, hier ist meine Lösung in Groovy. Im Prinzip haben wir einen Abhängigkeits-Graphen hier, der dann in topologischer Reihenfolge traversiert wird.

Code:
/** Die Klasse räpresentiert die Beschreibung eines Computerteils */
class PartInfo
{
    String type             // Name des Teils
    
    List succs = []         // Nachvolger im Abhängigkeits-Graphen
    List prevs = []         // Vorgänger im Abhängigkeits-Graphen

    Integer deps = 0        // Anzahl Vorgänger von denen wir noch abhängen
    
    /** Fügt Nachfolger zu diesem Teil ein */
    void addSuccs(List succs) {
        this.succs.addAll(succs)
        succs.each { it.prevs.add(this); it.deps++ }
    }
    
    /** Sammelt rekursiv alle Vorgänger dieses Teils in einem Set */
    void collectPrevs(Set set) {
        set.addAll(prevs)
        prevs.each { it.collectPrevs(set) }
    }
    
    /** Befreit die Nachvolger von der Abhängigkeit */
    void releaseSuccs() {
        succs.each { it.deps-- }
    }
    
    String toString() { return type }
}

/** Hier wird die Konfiguration festgelegt */
Map readConfiguration() 
{
    PartInfo a = new PartInfo(type:"Gehäuselüfter")
    PartInfo b = new PartInfo(type:"Grafikkarte")
    PartInfo c = new PartInfo(type:"Soundkarte")
    PartInfo d = new PartInfo(type:"Netzwerkkarte")
    PartInfo e = new PartInfo(type:"CPU-Kühler")
    PartInfo f = new PartInfo(type:"CPU")
    PartInfo g = new PartInfo(type:"S-ATA-Kabel")
    PartInfo h = new PartInfo(type:"Audiokabel")
    PartInfo i = new PartInfo(type:"Mainboard")
    PartInfo j = new PartInfo(type:"Festplatte")
    PartInfo k = new PartInfo(type:"DVD-Laufwerk")
    PartInfo l = new PartInfo(type:"SLI-Kabel")
    PartInfo m = new PartInfo(type:"RAM")  
    
    a.addSuccs([b, c, d])
    e.addSuccs([g, h])
    f.addSuccs([e, g, h])
    i.addSuccs([b, c, d, e, f, g, h, j, k, l, m])
    j.addSuccs([g])
    k.addSuccs([g, h])
    b.addSuccs([l])
    c.addSuccs([h])
    m.addSuccs([f])
    
    return [(a.type):a, (b.type):b, (c.type):c, (d.type):d, (e.type):e,
            (f.type):f, (g.type):g, (h.type):h, (i.type):i, (j.type):j,
            (k.type):k, (l.type):l, (m.type):m]
}

/** Hier wird die Eingabe eingelesen */
List readInput() 
{
    return ["Grafikkarte", "Mainboard", "CPU", "CPU-Kühler", "Festplatte", 
            "DVD-Laufwerk", "Gehäuselüfter", "SLI-Kabel", "S-ATA-Kabel",
            "Audiokabel", "Soundkarte", "Netzwerkkarte", "RAM"]
}

// *** Das Programm startet hier ***

// Konfiguration und Input auslesen
Map config = readConfiguration()
List input = readInput()

// Input-Liste von String-Objekte nach PartInfo-Objekte konvertieren
input = input.collect { config.get(it) }

// Input-Liste vervollständigen (nicht-eingegebene Teile dazunehmen)
Set set = new HashSet(input)
input.each { it.collectPrevs(set) }
input = set.toList()

// Der Algorithmus: Abhängigkeits-Graph topologisch sortieren
// Solange der Graph Knoten hat:
// 1) die freien Knoten ermitteln
// 2) die freien Knoten ausgeben
// 3) die freien Knoten aus Graph entfernen
while (!input.isEmpty()) {
    List free = input.findAll { it.deps == 0 }
    println "Einbauen: ${free}"
    free.each { it.releaseSuccs() }
    input -= free
}
Die Ausgabe:

Code:
Einbauen: [Mainboard, Gehäuselüfter]
Einbauen: [RAM, Grafikkarte, Netzwerkkarte, Festplatte, DVD-Laufwerk, Soundkarte]
Einbauen: [SLI-Kabel, CPU]
Einbauen: [CPU-Kühler]
Einbauen: [S-ATA-Kabel, Audiokabel]
Grüße, Ivan
Ivan Dolvich ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 24.12.08, 20:22   #3 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard

Eine Python Lösung - Quick & Dirty:
Die "Regeln" der Konfiguration können über eine Textdatei gesteuert werden.

Code:
class Componente(object):
   def __init__(self, comp, name):
      self.comp = comp
      self.name = name
      self.before = []
      self.after = []
	
   def addbefore(self, part):
      self.before.append(part)
      self.before[-1].after.append(self)

def doIt():
   parts = []
   for line in open("PC.txt", "r"):
      line = line[:-1]
      if line != "":
         if "vor" not in line:
            parts.append(Componente(line.split("#")[0], line.split("#")[1]))
         else:
            for part1 in parts:
               for part2 in parts:
                  if part1.comp == line.split(" vor ")[1] and part2.comp == line.split(" vor ")[0]:
                     part1.addbefore(part2)
   return evaluate(parts)

def evaluate(parts, output="Reihenfolge:\n"):
   while len(parts) > 0:
      comps = filter(lambda p: len(p.before) == 0, parts)
      output += ", ".join([ c.name for c in comps ]) +"\n"
      for comp in comps:
         for p in comp.after:
            p.before.remove(comp)
      parts = filter(lambda part: part not in comps, parts)
   return output

if __name__ == "__main__":	
   print doIt()
Gruß
Felix
Ook! ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Reihenfolge der Komponenten beim PC Zusammenbau
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zahlen in zufälliger Reihenfolge CDW Programmieraufgaben 49 02.02.12 20:06
PC Zusammenbau Entscheidungshilfe Punky Duck Kaufberatung 1 08.02.09 20:33
Reihenfolge der via DHCP zugewiesenen DNS-Server bitmuncher Windows 12 20.08.07 11:07
Reihenfolge in GB-Einträgen zeitlich sortieren tine (Web-) Design und webbasierte Sprachen 16 18.02.06 15:45
SCSI Boot Reihenfolge Javanoth Hardware Probleme 13 22.08.03 20:47


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61