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
17 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ö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)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Prosit
{
class Program
{
static void Main(string[] args)
{
string[] namensliste = new string[] { "Müller", "Meier", "Schmidt", "Schulz", "Weber", "Fischer", "Schneider", "Wagner", "Becker", "Bauer" };
int count = 0;
for (int i = 0; i < namensliste.Length; i++)
{
for (int j = i; j < namensliste.Length; j++)
{
if (i != j)
{
count++;
Console.WriteLine(count+". "+namensliste[i] +" stößt mit "+namensliste[j]+" an.");
}
}
}
Console.ReadKey();
}
}
}
Lösung von: Chrischi Leif (S&N Datentechnik)
// C++ 11 | VS-2022
#include <iostream>
#include <vector>
const std::vector<std::string>names{ "Gerber", "Meier", "Mueller", "Schmid" };
int main() {
for (auto it_a{ names.begin() }; it_a != names.end(); ++it_a)
for (auto it_b{ it_a + 1 }; it_b != names.end(); ++it_b)
std::cout << *it_a << " stoesst mit " << *it_b << " an." << "\n";
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Bei n Personen erklingen die Gläser n * (n-1) / 2 mal.
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | |
Schwierigkeit: | k.A. |
Webcode: | xsop-3ej7 |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |