Papierrolle-Abspulvorgang

Hallo zusammen,

ich sitze schon seit längerer Zeit vor einem Problem und komme auf keine Lösung.
Vielleicht kann mir jemand einige Tipps oder Vorschläge geben.

Aufgabenstellung:

Es soll ein Java-Programm geschrieben werden, das den Abrollvorgang einer Papierrolle simuliert. Dabei soll eine Papierrolle durch folgende Werte beschrieben werden
• Außendurchmesser des Rollenkerns
• Außendurchmesser der Papierrolle
• Breite der Papierrolle
• Stärke des Papiers
Ihr Programm soll zu Beginn jeweils diese vier Werte einlesen. Aus den eingegebenen Werten können Sie leicht die Länge der auf der Rolle aufgespulten Papierbahn berechnen. Falls erforderlich, können Sie statt der eigentlichen Spiralform der Papierbahn auf der Rolle annehmen, es lägen jeweils einzelne Papierlagen in Zylinderform übereinander. Nun sollen Abspulvorgänge simuliert werden. Dazu soll Ihr Programm nach der Eingabe der Rollendaten in einer Schleife laufen und bei jedem Durchlauf jeweils einen Wert vom Benutzer abfragen: entweder die Anzahl der Umdrehungen beim Abspulen oder die Papierfläche, die von der Rolle abgespult werden soll. Der Benutzer muss bei jedem Durchlauf der Schleife die Möglichkeit haben, zwischen den beiden Möglichkeiten zu wählen. Nach jeder Eingabe soll Ihr Programm ausrechnen und ausgeben, wie lang die abgespulte Papierbahn sein muss und wie viel Papierlänge auf der Rolle verbleibt. Wenn die abzuspulende Papierlänge größer als die noch auf der Rolle befindliche Papierlänge ist, soll Ihr Programm eine entsprechende Meldung mit der nicht mehr lieferbaren Länge ausgeben und sich dann beenden.

Vorgehensweise:

Nachdem alle Werte eingelesen sind wird ein Feld erstellt:
(Bsp. 4 Lagen Papier auf der Rolle)

[table=“width: 500, class: grid”]

0
1
2
3


Lage
1
2
3
4


verbl. Lage
1
1
1
1


Länge
pi*d1
pi*d2
pi*d3
pi*d4


Durchmesser
d1
d2
d3
d4

[/table]

wenn jetzt die Anzahl der Umdrehungen bestimmt wird soll die abgespulte Länge von der Gesamtlänge abgezogen werden.
Das Problem ist, ich weiß nicht wie ich dann bei dem zweiten Schleifendurchlauf bestimmen kann welche Lage zurzeit aufgerollt ist, da diese ja verschiedene Durchmesser haben.
Kann man evtl das letzte Feldelement löschen, wenn verbleibe Lage auf 0 ist?

Ich bin für jeden Vorschlag sehr dankbar!

Also ich versteh die Tabelle irgendwie nicht, alles recht verwirrend, hier mal meine ersten Ideen

Außendurchmesser des Rollenkerns d
Außendurchmesser der Papierrolle D
Breite der Papierrolle braucht man für Papierfläche, die von der Rolle abgespult werden soll.
Stärke des Papiers p

Rein mathematisch solltest du zuerst die gesamte Länge der Papierbahn berechnen

auf der ersten Lage pi d

auf der zweiten Lage pi (d+p)

auf der dritten Lage pi (d+2p)

auf der vierten Lage pi (d+3p)

auf der n-ten Lage pi (d+(n-1)p), wobei d+(n-1)p=D der Aussendurchmesser ist, daraus kriegst du n-1 und damit n

Aber das ist schon Nonsens, denn d, D und p müssen zueinander “passen”, damit das funktioniert - und welcher Benutzer des Programms gibt schon diese Werte ein??

Wenn du die alle aufsummierst, ist das L=n pi d + pi d (n-1) n / 2 oder sowas (arithmetische Reihe)

Was mich da stört, ist das Abziehen einer Fläche: da wird ja eine Lage unter Umständen nur halb abgewickelt, was soll das Programm dann machen?

Ich glaube, dass man sich da bei der Modellierung nicht ins Bockshorn jagen lassen sollte und die Papierrolle nicht über die Eingabeparameter (Durchmesser) definieren sollte, sondern über die darauf aufgewickelte Papierlänge und ihre Breite. (Ggf. noch die Papierdicke und den Innendurchmesser der Rolle, um den Zustand vollständig abzubilden.)
Für die Beantwortung der Fragen wäre das mMn ein geeignetes Modell.
Die Umrechnung der Durchmesser in eine Papierlänge würde ich in eine Methode auslagern. Falls es später gewünscht ist, kann man dann auch noch eine Umkehrfunktion bauen, anhand derer man die Anzahl Wicklungen / Außendurchmesser der Rolle wieder errechnet.

dafür ist die Tabelle mit ‚verbl. Lage‘ doch ziemlich gut,
jede Lage = Zylinder (statt Spirale) kann man etwas separat betrachen und sich merken ob noch 30% da ist (oder ein absoluter Wert zwischen 0 und Maximalwert dieser Lage) oder nix mehr, dann wieviel von der Lage darunter usw.,

ist doch normal (um nicht ‚leicht‘ zu sagen), den genauen Zustand zu merken

da muss man interpretieren, was mit einer Umdrehung gemeint ist, bzw. was möglich sein soll,
entweder nur ganze Umdrehungen zulassen oder auch genaue Eingaben a la ‚1.7 Umdrehungen‘,
Aufwand wohl gleich:

wenn vorher die oberste Lage noch voll war, dann ist sie bei 1.7 weg und von der nächsten sind 0.7 = 70% weg,
→ noch 30% oder 30% * aktuellen Umfang = so und so viel absolute Länge übrig,

immer wenn es um Umdrehungen geht braucht man % bzw. Werte zwischen 0 und 1,
und beim andereren mit der Fläche braucht man die absoluten Werte, fleißig beides modellieren, lustig hin- und herrechnen

mit Spirale mag alles etwas komplizierter sein,
aber wenn schon hier im Forum Hilfe, dann sicher nicht mehr Anspruch auf die Top-Lösung :wink:
(ohne zu behaupten, dass ich direkt eine Vorstellung davon hätte)

kann man, oder auch ignorieren, wichtig ist an korrekter Stelle weiterzurechnen, bei den Ausgaben aufzupassen usw.,
was im Modell steht und wie das Modell überhaupt aufgebaut ist, ist immer zweitrangig,

mache es so wie du es für deinen Code als hilfreich erachtest

theoretisch muss man auch gar nichts speichern, kann aus den Ausgangsdaten und den bisherigen Eingaben
immer wieder on the fly die ‚Lage‘ (der Nation) neu berechnen

Zur Spirale: https://de.wikipedia.org/wiki/Archimedische_Spirale

[QUOTE=Vivess]Hallo zusammen,

ich sitze schon seit längerer Zeit vor einem Problem und komme auf keine Lösung.
Vielleicht kann mir jemand einige Tipps oder Vorschläge geben.

Aufgabenstellung:

Es soll ein Java-Programm geschrieben werden, das den Abrollvorgang einer Papierrolle simuliert.[/QUOTE]

Soll das Abspulen der Rolle dabei im 45 ° Winkel zur Rollenmittelpunktgeraden (Klopapierhalter) (halb schief/schräg) (physikalisch korrekt) visuell dargestellt werden? (Das ist auch gar nicht so einfahc, vermute ich).

Ehm, bei dem Anderen… eine Umdrehung größeren Durchmessers bedeutet mehr abgespultes Papier und vice versa.

Ich würde auch immer die verbleibende Länge betrachten (kann viel sein…), z. B. 196,987 m, und ggf. passig runden.

Sry, dass ich nicht besser zu Diensten sein konnte.

Kann an der Uhrzeit liegen, aber jetzt schreibt keiner was.

Ich finde die Aufgabenstellung super.

Aber kann man vereinfacht annehmen,

Die Länge des abgerollten Stücks Klopapiers beträgt (Genitiv außen vor) beträgt den Kreisumfang des Kreis’ mit dem Radius des Klopapieraußenkreis’ (- Klopapierdicke)?

Danach wird vom Klopapieraußenkreis die Klopapierdicke abgezogen usw. usf.?

Gibt’s Klopapierblattdickestauchungen oder -Streckungen (aufgrund der Wicklung)?

Angeberisch: Niemand sollte hier die Ha für sie/ihn machen, auch, wenn die Aufgabenstellung verlockend sein mag.

[quote=SlaterB]theoretisch muss man auch gar nichts speichern, kann aus den Ausgangsdaten und den bisherigen Eingaben
immer wieder on the fly die ‘Lage’ (der Nation) neu berechnen[/quote]

ist vielleicht der beste Hinweis:

rekursive Lösung wahrscheinlich elegant: nach einer Benutzereingabe/einem Abspulvorgang ist man wieder genau in der Anfangs-Situation, nur eben mit weniger Papier

bisschen Unterschied schon, im Verlauf Teil-Lagen, ganz am Anfang kann man mit vollen Lagen anfangen, obwohl es auch lustig wäre bei

[quote=Bleiglanz]auf der n-ten Lage pi (d+(n-1)p), wobei d+(n-1)p=D der Aussendurchmesser ist, daraus kriegst du n-1 und damit n

Aber das ist schon Nonsens, denn d, D und p müssen zueinander “passen”, damit das funktioniert - und welcher Benutzer des Programms gibt schon diese Werte ein??[/quote]
die äußerste Schicht so prozentual zu wählen, dass es dem evtl. Fehler Rechnung trägt

Abstand Außen zu Innendurchmesser = 2cm, Stärke Papier = 1.1 mm? -> 18.18 Lagen -> 19 Lagen, die letzte zu 18% gefüllt

Ich vermute es soll gar nichts dargestellt werden, sondern nur die verbliebene länge an Klopapier berechnet werden und die entnommene länge des Klopapieres bei z.b. einer Umdrehung (das kann je nach füllstand der Rolle unterschiedliche Länge sein) da eine leerere Rolle, einen kleineren Umfang hat und somit ein kürzeres Stück Klopapier bei einer Umdrehung abgenommen wird,

Danke für die vielen Antworten.

[QUOTE=Bleiglanz]ist vielleicht der beste Hinweis:

rekursive Lösung wahrscheinlich elegant: nach einer Benutzereingabe/einem Abspulvorgang ist man wieder genau in der Anfangs-Situation, nur eben mit weniger Papier[/QUOTE]

Mit dem “on the fly” versteh ich noch nicht so wirklich. Ich kann nicht von Anfang anfangen wenn der Radius kleiner geworden ist.
Oder versteh ich das jetzt falsch?

[QUOTE=CyborgBeta;120980]Soll das Abspulen der Rolle dabei im 45 ° Winkel zur Rollenmittelpunktgeraden (Klopapierhalter) (halb schief/schräg) (physikalisch korrekt) visuell dargestellt werden? (Das ist auch gar nicht so einfahc, vermute ich).

Ehm, bei dem Anderen… eine Umdrehung größeren Durchmessers bedeutet mehr abgespultes Papier und vice versa.

Ich würde auch immer die verbleibende Länge betrachten (kann viel sein…), z. B. 196,987 m, und ggf. passig runden.

Sry, dass ich nicht besser zu Diensten sein konnte.[/QUOTE]

Es muss nichts visualisiert werden. Es müssen “nur” die korrekten Ausgabewerte gegeben sein.
Man kann sich vorstellen dass die Papierlage zum Rollenmittelpunkt geschnitten wird.

Ich möchte euch meinen Code vorstellen. Evtl ist das Problem dann leichter zu verstehen:

public class Papierrolle
{

	public static void main(String[] args)
	{
		IO.println("Geben Sie bitte folgende Werte in mm ein:");
		double pi=Math.PI;
		double di= IO.readDouble("Außendurchmesser des Rollenkerns:");
		double da= IO.readDouble("Außendurchmesser der Papierrolle:" );
		double b = IO.readDouble("Breite der Papierrolle:");
		double s = IO.readDouble("Stärke des Papiers:");
		
		if (di>=da || di<=0 || da<=0 ||  b<=0 || s<=0 )
		{
			IO.println("Falscher Eingabewert:");
			if (di>=da)
			{
				IO.println("- Rollenkern größer/gleich Papierrolle!");
			}
			if (di<=0)
			{
				IO.println("- Rollenkern kleiner/gleich 0!");
			}
			if (da<=0)
			{
				IO.println("- Papierrolle kleiner/gleich 0!");
			}
			if (b<=0)
			{
				IO.println("- Rollenbreite kleiner/gleich 0!");
			}
			if (s<=0)
			{
				IO.println("- Papierstärke kleiner/gleich 0!");
			}
			System.exit(0);
		}
		double schleifendurchmesser=di-s;
		double papierlaenge=0;
		int zaehler=0;
		double schleifenlagen0=(da/2-di/2)/s;
		int schleifenlagen=(int) schleifenlagen0;
		double[][] feld=new double[4][schleifenlagen];
		while (schleifendurchmesser<(da-2*s))
		{
			zaehler=zaehler+1;
			schleifendurchmesser = schleifendurchmesser + 2*s;
			feld[0][zaehler-1]=zaehler;
			feld[1][zaehler-1]=pi*schleifendurchmesser;
			feld[2][zaehler-1]=1;
			feld[3][zaehler-1]=schleifendurchmesser;
			papierlaenge=papierlaenge+feld[1][zaehler-1];
		}
		while (papierlaenge>0)
		{
			IO.println("Wahlen Sie aus:");
			IO.println("- [1] Anzahl Umdrehungen");
			IO.println("- [2] Papierfläche");
			int auswahl=IO.readInt("Geben Sie bitte die gewünschte Option ein: ");
			
			if (auswahl==1)
			{
				double umdrehungen=IO.readDouble("Anzahl Umdrehungen: ");
				
				}
			}
		}

	}

Da man sich die Lagen als Zylinderform darstellen kann habe ich die Lagen immer als ganze Zahlen gerundet.
Zu meinem Problem zurück, ich verstehe nicht wie ich eine Schleife so laufen lassen kann, dass immer die passende Lage sowie die verbleibende Lage berechnet wird. Es muss nämlich auch die Möglichkeit bestehen nach einem abgespultem Durchlauf mit 1,4 Umdrehungen, 10mm² abzuspulen und anschließend wieder 1,4 Umdrehungen. Mein Gedanke war es, eine for-schleife anstatt der while (papierlaenge>0) und als Laufkriterien die Papierlagen zu nutzen. Bin leider zu keinem Ergebnis gekommen. Ich werde es mit der Spiralform versuchen. Vielleicht bringt mich dies etwas weiter

ich meinte dabei dass, wenn die Parameter gegeben sind + ‚Abnutzungen‘ A) 1,4 Umdrehungen, B) 10mm2, C) 1,4 Umdrehungen, D) …
dann muss man nicht unbedingt irgendwas weiter merken, sondern kann diese gesammelten Eingabe-Werte in eine Methode stecken und jedesmal neu, auch bei D) ausrechnen ob noch was über bleibt,

also es braucht nicht unbedingt das Zylinder- oder sonstige Modell über die Verarbeitungsschleifen hinweg gespeichert,
aber das nur als theoretische Betrachtung, besser ist es meist schon

Bleiglanz meinte, dass man nach jedem Abzug eine Situation wie am Anfang vorliegen haben könnte,
um deine Worte aufzunehmen, wenn der radius am Anfang 15 war und nach einem Schleifendurchlauf 13, dann ist er kleiner geworden,
aber das kann man dann doch genauso betrachten wie eine Rolle die von Anfang an schon 13 war,

Teil-Lagen natürlich zu beachten usw., wird dadurch auch nicht besonders einfacher, nur ein Modell von vielen


dein Code enthält das typische Problem von viel Eingabe, natürlich auch etwas verständlich, sonst hättest du nur halb so viel zu posten,
aber andererseits interessiert das kaum einen, spammt nur das Posting voll,
und für deine Entwicklung ist das auch nicht gut, du willst gewiss nicht bei jedem Test irgendwas eintippen

ersetze es durch einmal gewählte Test-Werte

        double da= 3;
        double b = 4;
        double s = 5;

oder was auch immer, bewußt falsche Werte, und entferne ruhig auch erstmal wieder den ganzen Einlesecode,
kannst ihn ja irgendwo ablegen, aber besser nicht nochmal posten, stört nur (etwas)

die Eingabe in der Schleife kann ja noch bleiben, theoretisch auch für dich besser ebenfalls zu ersetzen a la

        double da= 3;
        double b = 4;
        double s = 5;

buildData(di, da, b, s);
takeRounds(1.4);
takeMM(10)
takeRounds(1.4);
..

aber will es dir nicht zu sehr aufdrängen :wink:


das Modell nahe deiner Tabelle im ersten Posting sieht schon recht gut aus,
nach Spirale brauchst du nicht schauen, das wird glaube ich nichts einfacher machen

nun noch rechnen, in feld[2] speicherst du mit der 1 = 100% den Stand je Lage/ Zylinder,

wenn nun die Eingabe 0.4 Umdrehungen erfolgt, dann diese 1 von oberster noch vorhandener Lage reduzieren,
wenn unter 0 dann Rest auf nächste Lage usw., Konzept nicht klar?

Dieses Konzept hatte ich auch geplant. Habs noch nicht umsetzen können. Aber ich bleib am Ball.
Ich bedanke mich für die Bemühungen und halte euch auf den laufenden

*** Edit ***

Kann mir bitte noch jemand erklären, wie ich ein Feldelement lösche wenn die verbl. Lage auf 0 ist? Ich glaube das ist der Schlüssel zum Ziel :eek:

merke dir einfach einen Index auf die aktuelle Lage/ Zylinder/ Feldelement,
am Anfang das Letzte, schleifenlagen-1 oder so, zaehler steht vielleicht auch richtig, über den Daumen ±1

musst du doch eh haben, bevor ans Löschen zu denken ist, erst überhaupt mit etwas arbeiten?

wenn bei der Rechnung eine Lage wegfällt, dann dort auf 0 reduzieren oder auch nicht, wird eh nicht mehr angeschaut,
auf jeden Fall Zähler/ Index um 1 absenken, dann ist nur noch diese nächsttiefere Lage (+ die darunter) interessant

wenn die Letze und 0, dann Alarm auf der Toilette

Ich versuche mit feld.length zu arbeiten. Das würde mir leichter fallen.
Daher suche ich etwas in der Art wie: feld[2][feld.length]=feld[2][feld.length-1];
Dies geht aber leider nicht.

Grundkurs zweidimensionales Array,

oder noch vorher Grundkurs allgemeine Programmierintelligenz :wink: :
welchen Wert erwartest du für feld.length und kontrolliere das auch statt vage anzunehmen?,
→ System.out.println() nutzen!, ist mit ungeahnten Abstand der einzige als wichtig zu bezeichnende, zentrale Befehl jeder einfachen Anwendung,
gib aus was feld.length ist, das wäre nämlich 4, nicht besonders hilfreich, stimmts?

die Länge der zweiten Dimension ist vielleich feld[0].length, aber auch das dürfte man nicht als Index nehmen,
denn ein Array der Länge 3 hat nur die Indexe 0, 1 und 2, nicht Index 3

würde dir aber alles eh nicht helfen, dann kommt als nächstes nämlich die fachliche Frage,
was versprichst du dir davon, einen Wert woanders hin ins Array zu kopieren?

lose Befehle in den Raum zu werfen bringt nix, außer dein Ziel war meine langen Monologe (ich fühle mich schon viel besser :wink: ),
wichtig ist deine fachlichen Pläne zu beschreiben


vielleicht liegt es dir näher, eine Liste zu verwenden, eine Liste von Objekten einer neuen Klasse Lage/ Zylinder/ Umdrehung, jedenfalls etwas mit 4 Werten,
objektorientiert sowieso strengstens empfehlenswert, was besseres kannst du kaum lernen (außer Umgang mit System.out.println() :wink: )

in einer Liste kannst du Einträge entfernen, um auf dein früheres Thema zurückzukommen,
dann hättest du ziemlich leicht immer das letzte (oder bei umgekehrter Sortierung das erste) Element im Blick,

mit deinen Kopierbefehl kann ich das aber nicht in Verbindung bringen
ich sprach zuletzt von einem index,
index–;

feld[2][index] (und die anderen feld[…][index]) ist immer der Platz an dem die aktuelle Lage lagert

Ich habe jetzt nicht jeden einzelnen Beitrag bis zum Ende gelesen, habe aber hier mal die Formel zur Berechnung der Papierbahnlänge aus Stirnfläche und Erzeugnisdicke:

[TEX]l = \frac{A_{eff}}{D} = \frac{({d_{a}}^2 - {d_{i}}^2) \cdot \pi}{D \cdot 4}[/TEX]

l = Länge
Aeff = Stirnfläche
D = Dicke
da = Durchmesser außen (Rollendurchmesser)
di = Durchmesser innen (Außendurchmesser der Hülse)

Was meinst du denn mit Stirnfläche?

Seitenansicht mit Guckloch, ein dicker Ring, eine Fläche,
die Fläche als 2D ist aufgerollt oder abgerollt theoretisch gleich, durch die Dicke ergibt sich die Länge

allein reicht das aber nicht,
auch zu berechnen bei exakt welchen Winkel es nach Abnahme von 50 cm steht
bzw. umgekehrt wieviel cm in 2 Umdrehungen steckt, am Anfang, in der Mitte, am Ende, unterschiedlich

edit:
wobei man auf die Winkel auch verzichten könnte, Länge einfach immer kürzen bis irgend 0 erreicht,
zu jedem Längenstand noch Durchmesser/ Umfang zu berechnen, eine Umdrehung könnte dann als 1x Umfang gewertet werden,

allerdings ändert jeder Millimeter Länge weniger theoretisch bereits den berechneten Durchmesser, irgendwo muss man doch runden,
ein echter Ring ist es ja eigentlich auch nicht,
außen da wo das Papier aufhört kräftiger Huckel, ob das mal alles hinkommt…

(ich mag neue Wörter, ‚Huckel‘ zuvor nicht in Forumsuche erwähnt :wink: )

Betrachte mal eine Papierrolle von der Seite in der 2D-Ansicht. Was siehst du? Einen Kreis bzw. einen Kreisring.

Die Stirnfläche ist quasi ein Kreis, von dem man die Fläche eines kleineren Kreises subtrahiert.