Ablaufdatum (Schleifen)
Arzneimittel enthalten einen kritischen Wirkstoff. Dieser darf eine gewisse Konzentration nicht unterschreiten, sonst verliert das Medikament an Wirkung. Gehen wir davon aus, dass ein Medikament bei der Herstellung 80mg des Wirkstoffs enthält aber jeden Monat 0.25% des Wirkstoffs verliert. Minimal muss das Medikament jedoch immer 70mg des Wirkstoffs enthalten.
Ihr Programm soll berechnen, nach wie vielen Monaten das Medikament seine kritische Wirkstoffkonzentration unterschreitet - m. a. W.: Nach wie vielen Monaten darf das Medikament nicht mehr angewendet werden.
Der Anwender gibt die Anfangskonzentration (mg) und die kritische Minimalkonzentration (mg) ein. Ebeneso muss er die monatliche prozentuale Abnahme angeben.
4 Kommentare
15 Lösung(en)
package ch.programmieraufgaben.iteration.ablaufdatum;
import java.util.Scanner;
/**
* Ablaufdatum berechnen
* @author Philipp Gressly (phi@gressly.ch)
*/
/*
* History: first Implementation: May 17, 2012
* Bugs :
*/
public class Ablaufdatum {
public static void main(String[] args) {
new Ablaufdatum().top();
}
void top() {
double mgAnfang = einlesen("mg am Anfang");
double mgMuss = einlesen("mg minimum");
double procMonat = einlesen("wie viel sich pro Monat verflüchtigt (Prozent)");
schleife(mgAnfang, mgMuss, procMonat);
}
void schleife(double mgAnfang, double mgMuss, double procMonat) {
double mgIst = mgAnfang;
int monate = 0;
while(mgIst >= mgMuss) {
monate = monate + 1;
mgIst = mgIst * (1 - procMonat/100);
}
System.out.println("Das Medikament läuft nach " + monate + " Monaten aus.");
}
Scanner sc = new Scanner(System.in);
double einlesen(String groesse) {
System.out.println("Bitte " + groesse + " eingeben: ");
return sc.nextDouble();
}
}
// end of class Ablaufdatum
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
"""Konzentrationsabnahme/Haltbarkeit"""
konz = float(input("Anfangskonzentration in mg: "))
minKonz = float(input ("Minimalkonzentration in mg: "))
abnahme = float(input ("Monatliche prozentule Abnahem der Konzentration: "))
monat = 0
while konz >= minKonz:
konz = konz*(1-(abnahme/100))
monat +=1
print monat
Lösung von: Py Thon ()
; Programmiersprache: PureBasic, Version 4.60
OpenConsole()
PrintN("Wie viel Wirkstoff ist enthalten? (mg)")
anfangswert.f=ValF(Input())
PrintN("Wie viel Wirkstoff muss mndestes enthalten sein? (mg)")
grenzwert.f=ValF(Input())
PrintN("Um wie viel Prozent nimmt die Wirkstoffkonzentration monatlich ab?")
abnahme.f=ValF(Input())
i=0
aktuellerwert.f = anfangswert.f
While aktuellerwert.f >= grenzwert.f
PrintN("Nach "+Str(i)+" Monaten sind noch "+StrF(aktuellerwert.f)+"mg enthalten.")
aktuellerwert.f = aktuellerwert.f*((100-abnahme.f)/100)
i=i+1
Wend
PrintN("")
PrintN("Nach "+Str(i)+" Monaten ist das Medikament nicht mehr zu verwenden, der Grenzwert von "+StrF(grenzwert.f)+"mg wurde mit "+StrF(aktuellerwert.f)+"mg um "+StrF(grenzwert.f-aktuellerwert.f)+"mg unterschritten.")
Input()
Lösung von: Ich Bins (tubs)
/**
* Autor: ph. gressly freimann
* Datum: 27. Juni 2012
* Berechne das Ablaufdatum eines Medikamentes
*/
#include <stdio.h>
/**
* Einlesen der Größen.
* mg am Anfang: Wie viel mg der benötigten Substanz sind am Anfang im
* Medikament vorhanden.
* mg Muss : Wie viel der benötigten Substanz muss mindestens im
* Medikament vorhanden sein, damit es noch wie
* angegeben wirkt.
* proc Monat : Wie viel (in %) sich pro Monat "verflüchtigt" oder
* andrswertig "auflöst" (z. B. chemisch verändert wird)
*/
void eingabe(float* mgAnfang, float* mgMuss, float* procMonat)
{
printf("Vorhandene Substanz in mg am Anfang: ");
scanf ("%f", mgAnfang );
printf("Minimale Konzentration (in mg) : ");
scanf ("%f", mgMuss );
printf("Monatliche prozentuale Abnahme : ");
scanf ("%f", procMonat);
}
/**
* Berechne die Anzahl Monate (ganzzahlig)
* nach welchen die Konzentration das Minimum unterschreiten wird.
*/
int berechneMonate(float mgAnfang, float mgMuss, float procMonat)
{
float mgIst ;
int monate;
float rate ; /* Verflüchtigungsrate */
mgIst = mgAnfang ;
monate = 0 ;
rate = (1.0 - procMonat/100.0) ;
while(mgIst >= mgMuss)
{
monate = monate + 1;
mgIst = mgIst * rate;
}
return monate;
}
/**
* Hauptprogramm
* Drei nötige Größen einlesen und Monate berechnen und ausgeben.
*/
main()
{
float mgAnfang, mgMuss, procMonat;
int monate;
eingabe (&mgAnfang, &mgMuss, &procMonat);
monate = berechneMonate( mgAnfang, mgMuss, procMonat);
printf("Das Medikament läuft nach %d Monaten aus.\n", monate);
}
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
#include <stdio.h>
int main (void) {
float wirkstoff, untergrenze;
float verfall, abzug;
int monate = 0;
printf("Wirkstoff Menge: ");
scanf("%f", &wirkstoff);
printf("Kritische Untergrenze: ");
scanf("%f", &untergrenze);
printf("Monatlicher prozentualer Verfall: ");
scanf("%f", &verfall);
abzug = (100.0 - verfall) / 100.0;
do {
wirkstoff *= abzug;
monate++;
} while(wirkstoff >= untergrenze);
printf("Nach %d Monaten verfallen!\n", monate);
return 0;
}
Lösung von: Name nicht veröffentlicht
// Autor: Andy Großhennig
// Solution for task: Ablaufdatum (Schleifen)
#include <iostream>
using namespace std;
// Function: Get the input data's
void getData(float &fOriginalSubstance, float &fMinSubstance, float &fDecreasePercent)
{
cout << "Dez-Zahlen mit Punkt trennen!\nGeben sie an wieviel mg Wirkstoff das Medikament enthaelt: ";
cin >> fOriginalSubstance;
cout << "\nGeben sie an wieviel mg Wirkstoff das Medikament enthalten muss: ";
cin >> fMinSubstance;
cout << "\nGeben sie an um wieviel Prozent sich die Konzentration des Wirkstoffs monatlich verringert: ";
cin >> fDecreasePercent;
cout << endl;
}
void calculateTime()
{
float fOriginalSubstance, fMinSubstance, fDecreasePercent, fActualSubstance, fDecreaseMg;
int iMonth;
getData(fOriginalSubstance, fMinSubstance, fDecreasePercent);
fActualSubstance = fOriginalSubstance; //Set the start value for the actually substance amount
fDecreaseMg = fOriginalSubstance * fDecreasePercent / 100; //Calculate the amount of decrease from the percent input
// Loop: Decrease the amount of input percent and count how much the loop go through until the amount of the substance is lower than the minimum
for(iMonth = 0;fActualSubstance >= fMinSubstance;iMonth ++)
{
fActualSubstance -= fDecreaseMg;
}
cout << "\nDas Medikament ist nach " << iMonth << " Monaten abgelaufen";
}
int main()
{
calculateTime();
cout << "\n\n";
system("Pause");
return 0;
}
Lösung von: Andy Großhennig (Bundeswehr)
<HTML>
<HEAD>
<TITLE>Rechner</TITLE>
<meta charset="UTF-8">
<script type="text/javascript">
function berechne(){
var anfang = document.formular.anfang.value
var ende = document.formular.ende.value
var abnahme = document.formular.abnahme.value/100
var i=0;
if (abnahme<=1){
while (anfang>ende)
{
anfang=anfang*(1-abnahme);
i++;
}
alert("Das Medikament ist " +i+ " Monate haltbar.")
}
}
</script>
</HEAD>
<BODY style="background-color: dimgrey; color: white">
<H1>Rechner</H1>
<form name="formular">
<input type="text" name="anfang" placeholder="Anfangswert in mg">
<input type="text" name="ende" placeholder="Minimaler Wert in mg">
<input type="text" name="abnahme" placeholder="Monatliche Abnahme in %">
<input type="button" value="Berechne" onclick="berechne()">
</form>
</BODY>
</HTML>
Lösung von: Dennis Müller ()
import java.util.Scanner;
public class medikamente {
// gibt die Anzahl an Monaten wieder, die das Medikament wirkend ist
private int berechneMonate(float startwert, float ablaufwert, float ablauf) {
// Anzahl der Monate
int monat = 0;
/*
* rechnet die % so lange runter bis die Startkonzentration kleiner als
* die Mindestkonzentration ist
*/
while (startwert > ablaufwert) {
startwert = startwert - (startwert / 100 * ablauf);
monat++;
}
return monat;
}
// Hauptmethode
public static void main(String[] args) {
// Klassenobjekt um Methode aufrufen zu können
medikamente tue = new medikamente();
// Scanner um die Werte einzulesen
Scanner scan = new Scanner(System.in);
System.out.println("Geben Sie die Anfangskonzentration in mg an: ");
float startwert = scan.nextFloat();
System.out.println("Geben Sie die Mindestkonzentration in mg an: ");
float ablaufwert = scan.nextFloat();
System.out
.println("Geben Sie die monatliche prozentuale Abnahme an (ohne %): ");
float ablauf = scan.nextFloat();
scan.close();
// berechnet und gibt die Zeit in Monaten
System.out.println("Nach dem "
+ tue.berechneMonate(startwert, ablaufwert, ablauf)
+ " Monat ist das Medikament abgelaufen");
}
}
Lösung von: Sebastian Littel ()
import math
def flinput(prompt=''):
return float(input(prompt))
def ablaufdatum(wirkstoff, minwirkstoff, abnahme):
if wirkstoff < minwirkstoff: return 0
else: return math.ceil(math.log(minwirkstoff/wirkstoff, (1-abnahme)))
w = flinput("Gib die Anfangsmenge des Wirkstoffs ein: ")
m = flinput("Gib die Mindestmenge des Wirkstoffs ein: ")
a = flinput("Gib die monatliche Abnahme der Konzentration in Prozent ein: ")/100
print(ablaufdatum(w, m, a))
Lösung von: Karl Welzel ()
Update: es war ein Fehler in der Formel. Der Code berücksichtigt, dass die Verringerung der Wirksamkeit immer gleich dem erstmalig festgestellten Prozentsatz ist.
# -*- coding: utf-8 -*-
anfangsk = input("Anfangskonzentration in mg: ")
minimalk = input("Minimalkonzentration in mg: ") # darf nicht höher als Anfangskonzentration sein
pabnahme = input("Monatliche prozentuale Abnahme: ") # darf nicht höher als 100 sein
prozent = anfangsk / 100.0 * pabnahme
ergebn = (anfangsk - minimalk) / prozent
print "\nDas Medikament ist {0:2.0f}".format(ergebn)," Monate haltbar."
Lösung von: J. Reppe ()
HTML:
<html>
<body>
Bitte geben Sie alle Zahlen ein:
<form action="ablaufdatum.php" method="post">
<input title="ak" type="number" min="0" id="ak" name="ak">Anfangskonzentration (in mg)<br>
<input title="kmk" type="number" min="0" id="kmk" name="kmk">kritische Minimalkonzentration (in mg)<br>
<input title="pa" type="number" min="0" step="0.01" id="pa" name="pa">Prozentuale Abnahme (in Prozent)<br>
<input type="submit" value="Abschicken"><input type="reset" value="Zurücksetzen">
</form>
</body>
</html>
PHP:
<?php
$ak = $_POST["ak"];
$fk = $ak;
$kmk = $_POST["kmk"];
$pa = $_POST["pa"];
$monate = 0;
echo "Die Anfangzkonzentration beträgt: " . $_POST["ak"] . "mg";
echo "<br>";
echo "Kritische Minimalkonzentration: " . $_POST["kmk"] . "mg";
echo "<br>";
echo "Monatliche prozentuale Abnahme: " . $_POST["pa"] . "%";
echo "<br>";
while ($fk > $kmk)
{
$fk = $fk - ($fk * ($pa/100));
$monate = $monate + 1;
}
echo $monate;
?>
Lösung von: Maik Scheiermann (Powercloud GmbH)
//eingabemaske
document.write(
'<input type="number" onchange="calculate()" id="start" value="80">' +
'Anfangskonzentration (mg) <br>' +
'<input type="number" onchange="calculate()" id="end" value="70">' +
'Kritische Minimalkonzentration (mg) <br>' +
'<input type="number" onchange="calculate()" id="prc" value="0.25"' +
'step="0.01" max="100" min="0">Monatliche prozentuale Abnahme (%) <br>' +
'<input id="result" readonly>' +
'Haltbarkeit (Monate)'
);
function expirationMonth(start, minimum, percentage) {
for (var i = 0; start >= minimum; start *= 1 - percentage / 100) i++;
return i;
}
// ausgabe
function calculate() {
document.getElementById("result").value =
expirationMonth(
document.getElementById("start").value,
document.getElementById("end").value,
document.getElementById("prc").value
);
}
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
REPORT ZABLAUFDATUM.
PARAMETERS: pa_ist TYPE p DECIMALS 2, " Startwert
pa_min TYPE p DECIMALS 2, " Minimalwert
pa_neg TYPE p DECIMALS 2. " Abnahme in %
DATA: lv_prozent TYPE p DECIMALS 2,
lv_monate TYPE i.
WHILE pa_ist >= pa_min.
lv_prozent = pa_ist / 100 * pa_neg.
pa_ist = pa_ist - lv_prozent.
add 1 to lv_monate.
ENDWHILE.
WRITE: / 'Das Medikament läuft nach',
lv_monate,
' Monaten ab.'.
Lösung von: Alexander S. (msg systems)
anfangsKonzentration = float(input("Anfangskonzentration in mg: "))
minimalKonzentration = float(input("Minimalkonzentration in mg: "))
monatlicheAbnahme = float(input("Monatliche Abnahme in Prozent: "))
monat = 0
konzentration = anfangsKonzentration
while konzentration > minimalKonzentration:
konzentration *= (100 - monatlicheAbnahme) / 100
monat += 1
print("Minimalkonzentration (" + str(round(minimalKonzentration, 2)) + " mg) nach", monat, "Monaten unterschritten (" + str(round(konzentration, 2)), "mg).
Lösung von: Peter Pan (Home Office)
// C++20 | VS-2022
// MSVC std:c++20 only!
#include <iostream>
#include <chrono>
using namespace std::chrono;
using u = unsigned int;
struct medicine {
std::string name; /* Bezeichnung */
year_month_day date; /* Herstellungsdatum */
double sub; /* Wirkstoff in mg */
double min; /* Minimum Wirkstoff in mg */
double decr; /* Verlust pro Monat in % */
};
const auto get_expiration_date(const medicine& med_) {
const auto mon{ static_cast<u>(
ceil(log(med_.min / med_.sub) /
log(1.0 - med_.decr/100))) };
return std::make_tuple(med_.date + std::chrono::months{ mon }, mon);
}
const auto& operator<<(std::ostream& os_, const medicine& med_) {
const auto& [date, mon]{ get_expiration_date(med_) };
return os_
<< std::format("Bezeichnung: {}\n", med_.name)
<< std::format("Herstellung: {:02}/{}\n", u(med_.date.month()), med_.date.year())
<< std::format("Haltbarkeit: {} Monat(e)\n", mon)
<< std::format("Ablauf: {:02}/{}\n", u(date.month()), date.year());
}
int main() {
medicine med{ "med_a1", { 2022y / February / 2d }, 80, 70, 0.25 };
std::cout << med;
/*
Ausgabe:
Bezeichnung: med_a1
Herstellung: 02/2022
Haltbarkeit: 54 Monat(e)
Ablauf: 08/2026
*/
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Anfang 80 mg, muss (min.) 70mg, Abnahme 0.25% → 54 Monate
Anfang 2mg, muss (min.) 1.8mg, Abnahme 1% →11 Monate
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 0.5 |
Schwierigkeit: | Mittel |
Webcode: | ytso-8p8h |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |
Kommentare (4)
@Mishi: Anstelle von PuerBasic habe ich VisualBasic angegeben. Dies ist zwar nicht ganz korrekt, stellt die Syntax aber nahezu identisch dar.
Richtig, die Checksumme (Verifikation) war falsch. Das Programm hingegen rechnet richtig. Bei 80mg nach 70mg und einer Abnahme von 0.25% dauert es 54 Monate.
Leider gabs die Sprache nicht im Auswahlmenü...