Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Prosit (Simulationen)

Die alte kombinatorische Aufgabe kennt man aus dem Mathematikunterricht. Wie oft erklingen die Gläser an einer Party mit n Personen, wenn jede/r mit jedem/er anstößt.

Die folgende Aufgabe verlangt nun aber explizit, dass Ihr Programm alle Prosit-Rufe einzeln ausgibt und zwar in der folgeden Form:

1. Gerber stößt mit Meier an.
2. Gerber stößt mit Müller an.
3. Gerber stößt mit Schmid an.
4. Meier stößt mit Müller an.
5. Meier stößt mit Schmid an.
6. Müller stößt mit Schmid an.

Dabei können die beteiligten Personen ab einer Datei oder interaktiv eingelesen werden.

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

15 Lösung(en)

/* Autor: ph. gressly */
/* Datum: 17. Mai 2011 */
/* Prosit: Programmieraufgaben.ch. */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
  void*  next;
  char*  name;
} PERSON;

typedef PERSON*   PERSONPTR;
typedef PERSONPTR PERSONENLISTE;


PERSONPTR makePerson(char * name, PERSONPTR prev) {
  char * newName = malloc(strlen(name) + 1);
  strcpy(newName, name);
  
  PERSONPTR pp = malloc(sizeof(PERSON));
  if(NULL != prev) {
    prev->next = pp;
  }
  pp->name = newName;
  pp->next = NULL;
  return pp;
}

PERSONPTR einlesenEinzelPerson(PERSONPTR prev) {
  char name[1024];
  printf("Bitte Name eingeben (\"ENDE\" zum Beenden):");
  scanf("%s", name);
  if(0 == strcmp("ENDE", name)) {
    return NULL; // ende
  } else {
    return makePerson(name, prev);
  }
}

PERSONENLISTE personenEinlesen() {
  PERSONPTR prev = NULL;
  PERSONPTR akt = einlesenEinzelPerson(prev);
  PERSONPTR first = akt;
  while(NULL != akt) {
    prev = akt;
    akt = einlesenEinzelPerson(prev);
  }
  return first;
}


int prositNr = 1; // global

void ausgabePrositAbHier(PERSONPTR p) {
  PERSONPTR next = p->next;
  while(NULL != next) {
    printf("%d. %s stößt mit %s an.\n", prositNr, p->name, next->name);
    prositNr = prositNr + 1;
    next = next->next;
  }
}

void ausgabeAlleProsits(PERSONENLISTE pl) {
  while(NULL != pl) {
    ausgabePrositAbHier(pl);
    pl = pl->next;
  }
}

void freemem(PERSONENLISTE pl) {
  PERSONPTR next = NULL;
  while(NULL != pl) {
    next = pl->next;
    free(pl->name);
    free(pl);
    pl = next;
  }
}

main() {
  PERSONENLISTE liste;
  liste = personenEinlesen();
  ausgabeAlleProsits(liste);
  freemem(liste);
}
                

Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

# python3
# Prosst mit Ausgabe der anstossenden

gaeste = ['Uwe','Ina','Jo','Katja','Nico','Laura']

while gaeste:
    prost1 = gaeste.pop()
    for prost2 in gaeste:
        print('{0} stoesst mit {1} an'.format(prost1,prost2))


                

Lösung von: Frank Schneider ()

package ch.programmieraufgaben.prosit;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

/**
 * @author philipp gressly freimann 4 programmieraufgaben.ch
 * @version 10. Juni 2011
 */


public class Prosit implements DocumentListener{
  public static void main(String[] args) {
    new Prosit().top();
  }
  
  ArrayList<JTextField> eingabeFelder = new ArrayList<JTextField>();
  
  JFrame jf = new JFrame("Prosit");
  JPanel eingabePanel = new JPanel(); // links
  JPanel anzeigePanel = new JPanel(); // rechts
  
  void top() {
    layoutsFestlegen();
    neuesTextfeldAnfuegen();
    anzeigen();
  }
  
  void anzeigen() {
    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new GridLayout(1, 2));
    mainPanel.add(eingabePanel);
    mainPanel.add(anzeigePanel);
    jf.add(mainPanel);
    jf.setSize(600, 300);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setVisible(true);
  }
  
  Component theStrut = Box.createVerticalStrut(400);
  
  void neuesTextfeldAnfuegen() {
    eingabePanel.remove(theStrut);
    JTextField neuesFeld = new JTextField(20);
    eingabeFelder.add(neuesFeld);
    eingabePanel.add(neuesFeld);
    eingabePanel.add(theStrut);
    neuesFeld.getDocument().addDocumentListener(this);
    eingabePanel.validate();
  }
  
  void layoutsFestlegen() {
    eingabePanel.setLayout(new BoxLayout(eingabePanel, BoxLayout.Y_AXIS));
    anzeigePanel.setLayout(new BoxLayout(anzeigePanel, BoxLayout.Y_AXIS));
  }

  void eingabe() {
    int anzahlNamen = anzahlNamenZaehlen();
    if(anzahlNamen == eingabeFelder.size()) {
      neuesTextfeldAnfuegen();
    }
    if(anzahlNamen > 1) {
      ausgabe();
    }
  }
  
  void ausgabe() {
    List<String> namensListe = new ArrayList<String>();
    
    namensListeErzeugen(namensListe);
    anzeigePanel.removeAll();
    ausgabeListeErzeugen(namensListe);
    anzeigePanel.validate();
    anzeigePanel.repaint();
  }

  void namensListeErzeugen(List<String> namensListe) {
    for(JTextField f : eingabeFelder) {
        String text = f.getText();
        if(null != text && text.length() > 0) {
            namensListe.add(text);
        }
    }
  }
  
  void ausgabeListeErzeugen(List<String> namensListe) {
    int a = 0;
    while(a <= namensListe.size() - 2) {
        int b = a + 1;
        while(b <= namensListe.size() - 1 ) {
          prositLabelAnfuegen(namensListe.get(a), namensListe.get(b));
          b = b + 1;
        }
        a = a + 1;
    }
  }
  
  void prositLabelAnfuegen(String a, String b) {
      JLabel lbl = new JLabel(a + " stößt mit " + b + " an.");
      anzeigePanel.add(lbl);
  }
  
  int anzahlNamenZaehlen() {
    int anzahlNamen = 0;
    for(JTextField f : eingabeFelder) {
      String text = f.getText();
      if(null != text && text.length() > 0) {
          anzahlNamen = anzahlNamen + 1;
      }
    }
    return anzahlNamen;
  }
  
  @Override
  public void insertUpdate(DocumentEvent e) {
    eingabe();    
  }
 
  @Override
  public void removeUpdate(DocumentEvent e) {
    eingabe();
  }

  @Override
  public void changedUpdate(DocumentEvent e) {
    eingabe();    
  }
  
} // end of class Prosit
                

Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

people = ["Anna", "Ben", "Hans", "Vera", "Katrin", "Lena", "Olga", "Lucas"]
people.sort()
for a in people:
    for b in people:
        if a<b:
            print a, "stoesst mit", b, "an"
                

Lösung von: Name nicht veröffentlicht

DCL TAB_GUESTS(5)  CHAR(6)                                       
                     INIT('ALFRED','URBAN','OLGA','MAUZ','ENZO');
DCL IND_PROSIT     BIN FIXED(31) INIT(0);                        
DCL IND_POS        BIN FIXED(31) INIT(0);                        
                                                                 
DO IND_POS = 1 TO HBOUND(TAB_GUESTS);                            
  DO IND_PROSIT = (IND_POS+1) TO HBOUND(TAB_GUESTS);             
    PUT SKIP LIST(TRIM(TAB_GUESTS(IND_POS)) !! ' STÖSST MIT ' !! 
                  TRIM(TAB_GUESTS(IND_PROSIT)) !! ' AN');        
  END; /* IND_PROSIT = (IND_POS+) TO HBOUND(TAB_GUESTS) */       
END; /* IND_POS = 1 TO HBOUND(TAB_GUESTS) */                     
                

Lösung von: Valentin Marolf (AXA)



// Lösung, bei der ein Array entleert wird
$arrGaeste = array('Anton','Berta','Doris','Alfred','Johann');
while($Anstosser = array_shift($arrGaeste)) {
  foreach ($arrGaeste as $Gast) {
    echo $Anstosser . " stösst mit " . $Gast . " an.<br>";
  }
}
                

Lösung von: Valentin Marolf (AXA)

arrGaeste = new Array("Anton","Berta","Doris","Alfred","Johann");
while(anstosser = arrGaeste.shift()) {
  for(Gast in arrGaeste) {
    document.getElementById('ausgabe').innerHTML += anstosser + " st&ouml;sst mit " + arrGaeste[Gast] + " an.<br>";
  }
}

                

Lösung von: Valentin Marolf (AXA)

Solution for VBA:

'Vars
Private ppl As Object

'Constructor
Private Sub Class_Initialize()
    Set ppl = CreateObject("System.collections.arraylist")
    
    'Inserts some Name as Standardvalue
    With ppl
        .Add "Meier"
        .Add "Gerber"
        .Add "Müller"
        .Add "Schmid"
        .Add "Becker"
        .Add "Hausmann"
    End With
    
End Sub



'Generate List of Prosits
Public Function GetProsits() As String
Dim i As Long, j As Long, count As Long
Dim sRet As String

'Init
count = 0

'Algorithm
For i = 0 To ppl.count - 2
    For j = (i + 1) To ppl.count - 1
        count = count + 1
        sRet = sRet & count & ". " & ppl.Item(i) & _
               " stößt mit " & ppl.Item(j) & " an." & vbCrLf
    Next j
Next i

GetProsits = sRet

End Function

'Add new Person
'Returns false, if Person already exists
Public Function Add_Item(ByVal sName As String) As Boolean
Dim bRet As Boolean

bRet = Not (ppl.contains(sName))
If bRet Then
    If sName <> "" Then ppl.Add sName
End If

Add_Item = bRet

End Function

'Adds new Persons
'Returns false, if at least 1 Person already exists
Public Function Add_Items(ByVal sNames As Variant) As Boolean
Dim bRet As Boolean
Dim i As Long

If IsArray(sNames) Then
        
    For i = 0 To UBound(sNames)
        If Not (ppl.contains(CStr(sNames(i)))) Then
            If sNames(i) <> "" Then ppl.Add CStr(sNames(i))
        Else
            bRet = True
        End If
    Next i
Else
    bRet = True
End If

Add_Items = Not (bRet)

End Function

'Adds new Persons from delimited Textfile
'Returns false, if at least 1 Person already exists
Public Function Add_Items_from_File(ByVal sPath As String, ByVal sDelim As String) As Boolean
Dim bRet As Boolean
Dim sText As Variant

Open sPath For Binary As #1
    sText = Split(Input(LOF(1), #1), sDelim)
Close #1

If IsArray(sText) Then
    bRet = Me.Add_Items(sText)
Else
    bRet = Me.Add_Item(sText)
End If

Add_Items_from_File = bRet

End Function

'Clears all Persons from List
'Returns false if clearing fails for some reason
Public Function Clear_Items() As Boolean
On Error GoTo err_clear

Dim bRet As Boolean

    ppl.Clear
    Clear_Items = Not (bRet)

Exit Function
'_______________
err_clear:
    bRet = True
    Resume Next
End Function

'Removes one Person from list
'Returns false if removing fails for some reason
Public Function Remove_Item(ByVal sName As String) As Boolean
On Error GoTo err_clear

Dim bRet As Boolean
Dim i As Long

    If ppl.contains(sName) Then
        For i = 0 To ppl.count - 1
            If ppl.Item(i) = sName Then ppl.RemoveAt (i)
        Next i
    Else
        bRet = True
    End If
    Remove_Item = Not (bRet)

Exit Function
'_______________
err_clear:
    bRet = True
    Resume Next
End Function


'Test-Procedure
Public Sub TestProsit()
Dim ppl As New clsProsit

With ppl
    .Add_Item "Peter"
    .Add_Items_from_File "X:\Eigene Dateien\name.txt", vbCrLf
    .Add_Items Array("Hannes", "Reinhold", "Riedling", "Gerber", "Ullrichs")
    .Add_Items_from_File "X:\Eigene Dateien\namen.txt", vbCrLf
    
    Debug.Print .GetProsits
    
    ppl.Remove_Item "Peter"
    
    Debug.Print .GetProsits
    
    ppl.Clear_Items
    
    Debug.Print .GetProsits

End With

End Sub
                

Lösung von: Felix Reinhold ()

package prosit;

/**
 * Jede Person im "personen"-Array stößt mit jeder anderen an!
 * @author Markus Seiffert (smarkus18@gmx.de)
 * @version 26. September 2012
 */
public class Prosit{
  
  public static String[] personen = {"Gerber", "Meier", "Müller", "Schmidt"};
  
  
  public static void main(String[] args) {
    new Prosit().anStossen(personen);
  }
  
  public void anStossen(String[] namen){
    int cnt = 1;
    for(int i = 0; i<namen.length;i++){
      for(int j = i+1; j<namen.length; j++){
        System.out.println(cnt + ". " + namen[i] + " Stößt mit " + namen[j] + " an!");
        cnt++;
      }
    }  
  }
}
                

Lösung von: Markus Seiffert (Privat)

'Lösung von Patrick Prem
Public Class Domino
 Private Sub cmdinput_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdgästeliste.Click
        Dim a As String 'Eingabe per Inputbox
        Dim i As Integer 'Laufvariable
        Dim g As Integer = 1 'Zählvariable
        Dim j As Integer 'Zählvarisble

        Do
            a = InputBox("Name eingeben", "Gästeliste", " ")    'Namen werden in Listbox eingelesen
            Lbnamen.Items.Add(a)
        Loop Until a = " "

        For i = 0 To Lbnamen.Items.Count - 3
            For j = i + 1 To Lbnamen.Items.Count - 2
                Txtausgabe.Text &= g & " " & "." & Lbnamen.Items.Item(i) & " und  " & Lbnamen.Items.Item(j) & " stossen an " & vbNewLine

                g = g + 1

            Next j
            '
        Next i





    End Sub
End Class
                

Lösung von: Patrick Prem (Htl Jenbach)

// Autor:				Andy Großhennig
// Solution for task:	Prosit (Simulationen)

#include <iostream>
#include <string>
#include <vector>

using namespace std;

// Function: Get the names of the party guests
void inlet(vector <string> &names)
{
	string name;

	// Loop: Ask for the guest names until the input is "ende"
	while(name != "ende")
	{
		cout << "Gib den Vornamen des Gastes ein oder \"ende\": ";
		cin >> name;

		// If: Add the names to the vector if the name is not "ende"
		if(name != "ende")
			names.push_back(name);
	}
}

// Function: Simulate prosit
void party()
{
	vector <string> names;
	short shVectorSize;

	inlet(names);

	shVectorSize = names.size();

	if(shVectorSize > 1)
	{
		for(int i = 0;i < shVectorSize;i++)
		{
			for(int j = (i + 1);j < shVectorSize;j++)
			{
				cout << names.at(i) << " stoesst mit " << names.at(j) << " an.\n";
			}
		}
	}
	else
		return;
}

int main()
{
	party();

	cout << "\n\n";
	system("Pause");
	return 0;
}
                

Lösung von: Andy Großhennig (Bundeswehr)

package programmieraufgaben.ch;

import java.util.ArrayList;
import java.util.Scanner;

/* Berechnet wie oft angestoßen wird, wenn n Personen,
 * die noch nüchtern genug zum treffen sind,
 * zusammen an einem Tisch sitzen und lostrinken möchten
 */
public class Prosit {

    // Zählt die Stoße
    private int angestoßen;

    // Liste mit den Namen
    private ArrayList<String> namen;

    // Gibt bei einer Textausgabe einen Zeilenumbruch wieder
    private String zeilenumbruch = System.getProperty("line.separator");

    // Liest die Namen der Personen ein
    private void namenEinlesen() {
        namen = new ArrayList<String>();

        // Scanner zum Einlesen von Strings
        Scanner scan = new Scanner(System.in);

        // Liest so lange Namen ein bis "LOS" eingegeben wird
        while (true) {

            // Aufforderung und einlesen
            System.out.println("Gib einen Namen an, oder tippe LOS zum starten.");
            String str = scan.nextLine();
            System.out.println(zeilenumbruch);

            // Überprüft auf "LOS"
            if (str.equals("LOS")) {

                // Bricht das Starten ab wenn noch kein Name eingelesen wurde
                if (namen.isEmpty()) {
                    System.out.println(zeilenumbruch + "Du hast noch keinen einzigen Namen angegeben!" + zeilenumbruch);
                }

                // Schließt den Scanner und springt aus der Dauerschleife
                else {
                    scan.close();
                    break;
                }
            }

            // Fügt den Namen der Liste hinzu
            else {
                namen.add(str);
            }
        }
    }

    // Sorgt für die Ausgabe und die Berechnung
    public void stoßauswertung() {

        // Liest die Namen ein
        namenEinlesen();

        /*
         * Wenn mehr als eine Person angegeben werden Stöße berechnet und
         * ausgegeben
         */
        if (namen.size() > 1) {
            angestoßen = 0;

            // Stöße werden durchgegangen und ausgegeben
            for (int i = 0; i < namen.size() - 1; i++) {
                for (int o = namen.size() - 1; o > i; o--) {
                    angestoßen++;

                    System.out.println(angestoßen + ". " + namen.get(i) + " hat mit " + namen.get(o) + " angestossen");
                }
            }
            System.out.println(zeilenumbruch + "Alle freuen sich schon auf ihr kaltes Bier! Prost!");
        }

        // Wenn nur eine Person angegeben wurde wird diese Ausgabe gemacht
        else {
            System.out.println(namen.get(0)
                    + " ist sehr einsam und deshalb alleine da. Schade dass er keinen Anstoßpartner hat :(");
        }
    }

    // Hauptmethode
    public static void main(String[] args) {

        // Klassenobjekt um auf die Methode zugreifen zu können
        Prosit bierMussHer = new Prosit();

        // Methode zur berechnung und Ausgabe der Stöße
        bierMussHer.stoßauswertung();
    }

}
                

Lösung von: Sebastian Littel ()

guests = ["Meier", "Miep", "Foo", "Bar"]
guests.each do |doer|
  ((guests.find_index(doer)+1)...guests.length).each do |not_doer|
      puts "#{doer} stösst mit #{guests[not_doer]} an."
  end
end
                

Lösung von: Name nicht veröffentlicht

using System;
using System.Collections.Generic;

namespace Prosit {
	class Program {
		static void Main() {
			List<string>
				habenAngestoßen = new List<string>(),
				Personen = new List<string>();

			bool addBlankLine = false;
			do {
				if (addBlankLine) {
					Console.WriteLine("\n");
					addBlankLine = false;
				}

				Console.Write("Name>");
				string temp_name = Console.ReadLine();

				if (Personen.Exists(x => x.Equals(
						temp_name,
						StringComparison.OrdinalIgnoreCase
						))) {
					Console.WriteLine("{0} existiert bereits", temp_name);
					addBlankLine = true;
				}
				else {
					Personen.Add(temp_name);
				}

				if (Personen.Count > 1) {
					Console.Write("Eingabe beenden[Esc]");
					addBlankLine = true;
				}

			} while (
				Personen.Count < 2
				|| Console.ReadKey(true).Key != ConsoleKey.Escape);

			Console.WriteLine();

			foreach (string Anstoßer in Personen) {
				habenAngestoßen.Add(Anstoßer);
				Console.WriteLine();
				foreach (string Angestoßener in Personen) {
					if (!habenAngestoßen.Contains(Angestoßener)) {
						Console.WriteLine("{0} stößt mit {1} an.", Anstoßer, Angestoßener);
					}
				}
			}

			Console.ReadKey(true);
		}
	}
}
                

Lösung von: Marcel Kapma ()

<?php

$x = array('Gerber','Meier','Müller', 'Schmid');

while($prosit = array_shift($x))
{
    foreach ($x as $gast)
    {
        echo $prosit . " stößt mit " . $gast . " an.<br>";
    }
}
?>
                

Lösung von: Maik Scheiermann (Powercloud GmbH)

Verifikation/Checksumme:

Bei n Personen erklingen die Gläser n * (n-1) / 2 mal.

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit:
Schwierigkeit: k.A.
Webcode: xsop-3ej7
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen