Hallo Leute,
ich bin neu hier und habe mich erst angemeldet. Heiße Tobias und komme
aus dem Raum Stuttgart.
Ich studiere Elektrotechnik und wir müssen in Informatik C
programmieren.
Hierzu habe ich eine Aufgabe bekommen.
Ein Busunternehmen vermietet Busse mit 50 Stellplätzen. Ein Bus kostet
1000 Plätze.
Wenn ich jetzt wissen will wie viele Busse ich beötige und zum Beispiel
130 Reisende habe dann mache ich ja:
Busse = Reisende/50
Busse = 110/50
Hier kommt dann aber 2 raus da ich die Zahl Busse als Integer definiert
habe. Float bringt mir ja auch nichts weil ich ja keine halben Busse
machen kann. Könnt ihr mir also helfen wie ich von zum Beispiel 2,2 auf
3 Busse komme?
Hab schon das hier versucht:
Busse = (Reisende/50)+0.9
Doch das bringt irgendwie auch nix...
Hier vll noch mein aktuelles Programm. Hat weiter unten noch andere
Funktionen wie Unbenutze Plätze, Durchschnitt und Preis. Das tut aber
soweit schon.
1
#include"stdafx.h"
2
#include"stdio.h"
3
#include"stdlib.h"
4
5
intmain()
6
{
7
intR,B,U,P,D;
8
printf("Bitte geben Sie die Anzahl der Reisenden an\n");
9
scanf_s("%d",&R);
10
fflush(stdin);
11
12
B=0.9+(R/50);
13
U=(B*50)-R;
14
D=((B*50)/R)*100;
15
P=(B*1000)/R;
16
17
18
printf("Anzahl Busse:%d\n",B);
19
printf("Anzahl unbenutzte Plaetze:%d\n",U);
20
printf("Durchschnittliche Auslastung der Busse:%d\n",D);
Die Anzahl der Busse leitet sich exakt durch die Anzahl der belegten und
freien Plätze ab:
AnzahlBusse = (FreiePlätze + BelegtePlätze) / PlätzeProBus
Du hast jetzt BelegtePlätze und PlätzeProBus gegeben. FreiePlätze lässt
sich daraus ableiten. Danach kannst du die AnzahlBusse durch die obige
Gleichung ganz ohne Runden ausrechnen.
Anzahl Busse = (<Fahrgäste> modulo <Sitzpläte pro Bus>) + 1
Falls (<Fahrgäste> div <Sitzplätze pro Bus>) = 0: Ohne die +1 (der Fall,
dass es genau aufgeht)
chris schrieb:> #define DIV(x,y) (((x)+(y)-1)/(y))> B=DIV(R,50); // integer
Warum mit 49 aproximieren, wenn du weisst, dass der fehlende Anteil zu
zum vollen Bus ist?
Warum diese Lösung dennoch funktioniert und wo die Grenzen sind wird der
TO ohne Erklärung nicht verstehen und beim nächsten Mal noch mehr auf
dem Schlach stehen.
> B=(float)R/50.+.9; // float
Sei R = 1001.
R/50 + 0.9 = 20,92 ... Gerundet 20, Falsch!
Maxx schrieb:> chris schrieb:>> #define DIV(x,y) (((x)+(y)-1)/(y))>> B=DIV(R,50); // integer>> Warum mit 49 aproximieren, wenn du weisst, dass der fehlende Anteil zu> zum vollen Bus ist?> Warum diese Lösung dennoch funktioniert und wo die Grenzen sind wird der> TO ohne Erklärung nicht verstehen und beim nächsten Mal noch mehr auf> dem Schlach stehen.>>> B=(float)R/50.+.9; // float>> Sei R = 1001.> R/50 + 0.9 = 20,92 ... Gerundet 20, Falsch!
Stimmt, das funktioniert nicht. Kannst du dann deine Lösung mal genauer
schreiben. Ich vertsehe es ned genau?
Tobias Straub schrieb:> Kannst du das als Code kurz formulieren?
Ich glaubs ja nicht :-(
Dazu braucht man kein Float. Wie wäre es mit dem Modulo Operator, oder
hast du dafür nirgends Code zum kopieren gefunden.
Udo Schmitt schrieb:> Tobias Straub schrieb:>> Kannst du das als Code kurz formulieren?>> Ich glaubs ja nicht :-(>> Dazu braucht man kein Float. Wie wäre es mit dem Modulo Operator, oder> hast du dafür nirgends Code zum kopieren gefunden.
Modulo kenn ich, aber da nimmt er doch dann immmer den rest und gibt den
aus? Das will ich ja aber nicht? Ich will das er immer aufrundet...
Der Threadstarter schrieb:
> Ich studiere Elektrotechnik und wir müssen in Informatik C> programmieren.> Hierzu habe ich eine Aufgabe bekommen.
Na, als ET-Student sollte dir doch wenigstens EINE passable Lösung
einfallen.
> Stimmt, das funktioniert nicht.
Und? Bist du SELBER drauf gekommen?
> Kannst du dann deine Lösung mal genauer> schreiben. Ich vertsehe es ned genau?
Dann gehen die Punkte aber ans Forum!
:)
Bin seit 3 Wochen in der Theoriephase vom 1. Semester also nach ganz
frisch dabei.
Nee leider nicht. Hab davor schon ewig rumprobiert.
Haha Punkte gibts dafür eh nicht. Ist nur eine von vielen Hausaufgaben
über die Weihnachtszeit um in dei C-sprache reinzukommen.
Gruß
Tja, wenn die Busse sich bloss an die moderne Zeit halten würden und
eine Zweierpotenz an Plätzen hätten... Dann müsste man sie nur mit
negativen Reisenden füllen, diese anschliessend um den Zweierlogarithmus
der Buskapazität nach rechts schieben und schon hat man die negative
Anzahl benötigter Busse. Ok, 100% standardkonform wäre das nicht, aber
faktisch brauchbar.
Tobias Straub schrieb:> Modulo kenn ich, aber da nimmt er doch dann immmer den rest und gibt den> aus? Das will ich ja aber nicht? Ich will das er immer aufrundet...
Dann fang mal an. Kauf dir ein paar Päckchen Streichhölzer und rechne
das mal auf em Schreibtisch nach.
Und dann versuche mal zu denken wie man mit Teilen und Rest (Integer
Division und Modulo) dein Problem herausfinden könnte.
Tipp: Man braucht vieleicht noch ein if()
Ich glaubs ja nicht, das ist eine Logikaufgabe für Grundschüler oder 5.
Klasse.
Wie hast du dein Matheabi geschafft?
Noch ein Tipp: Die nächstgrößere ganze Zahl kann man mit +1 ausdrücken.
Tobias Straub schrieb:> lutz h. schrieb:>> B = Ceiling(R/50);>>>> wenn der Übersetzer es kann,>> Ne ceiling kennt visual studio mit meinen datenbanken nicht.
Versuchs mal mit #include <math.h> und schon hat das Studio die Funktion
gelernt :-)
Tobias Straub schrieb:> Maxx schrieb:>> chris schrieb:>>> #define DIV(x,y) (((x)+(y)-1)/(y))>>> B=DIV(R,50); // integer>>>> Warum mit 49 aproximieren, wenn du weisst, dass der fehlende Anteil zu>> zum vollen Bus ist?>> Warum diese Lösung dennoch funktioniert und wo die Grenzen sind wird der>> TO ohne Erklärung nicht verstehen und beim nächsten Mal noch mehr auf>> dem Schlach stehen.
Die Lösung funktioniert. Punkt.
Habe extra die #define Variante genommen, damit der TO nicht bei anderen
Zahlen auf dem Schlauch steht, die #define sollte doch einfach lesbar
sein.
Bei
B=(R+49)/50 könnte ich deinen Einwand verstehen, nicht aber bei der von
mir gewählten Form.
>>> B=(float)R/50.+.9; // float>>>> Sei R = 1001.>> R/50 + 0.9 = 20,92 ... Gerundet 20, Falsch!>> Stimmt, das funktioniert nicht. Kannst du dann deine Lösung mal genauer> schreiben. Ich vertsehe es ned genau?
Hier ging es mir, um die Lösung, welche er ausprobiert hatte, zu
berichtigen, und die 0.9 kamen vom TO der einfachheit halber.
Richtig wäre es +.999999
>B = Ceiling(R/50);
Das funktioniert nicht.
R/50 is immer eine Int Rechnung, und dann wuerde beim Beispiel von
101 Personen immer 2 rauskommen.
B = Ceiling(R/50.);
Was funktioniert (math lib muss verwendet werden, -lm)
B=ceil(R/50.+.5);
A. K. schrieb:> npn schrieb:>> Versuchs mal mit #include <math.h> und schon hat das Studio die Funktion>> gelernt :-)>> Nö.
Stimmt. Hatte ich übersehen. ceil() statt ceiling()
Sorry
Sodelle,
tut mir leid wenn ich hier bissle Blöd rüber komme. Mein Problem ist
aber einfach das ich noch nicht genau weiß wie ich es als Code schreibe
so das alles passt.
Habe mir das mit dem ceil jetzt nochmal angeschaut und ausprobiert.
So funktioniert es jetzt.
Vielen Dank für eure tatkräftige Unterstützung. Genial wie schnell man
hier viele verscheidenen Ansätze präsentiert bekommt.
Mein Programm:
1
#include"stdafx.h"
2
#include"stdio.h"
3
#include"stdlib.h"
4
#include"math.h"
5
6
intmain()
7
{
8
intR,B,U,D,Z;
9
floatP;
10
11
printf("Bitte geben Sie die Anzahl der Reisenden an\n");
12
scanf_s("%d",&R);
13
fflush(stdin);
14
15
B=ceil((float)R/50);
16
U=(B*50)-R;
17
D=((float)(R/B)/50)*100;
18
P=((float)B*1000)/R;
19
20
21
printf("Anzahl Busse:%d\n",B);
22
printf("Anzahl unbenutzte Plaetze:%d\n",U);
23
printf("Durchschnittliche Auslastung der Busse:%d\n",D);
Aber man kann gleich schreiben
B=(int)((float)R/(float)50+.999999);
und erspart sich so das ceil , sowie die math.h include, sowie die math
lib.
und wenn B ein int ist, kann man das (int)(...) streichen,
sowie wenn 50 eine Konstante ist, reduziert sich dies auf
B=R/50.+.999999;
aber die Integer Version ist richtig und hat keine Fehler, auch nicht
wenn
die Personen mehr als 1mio sind, welche von Bussen befördert werden
muss.
A. K. schrieb:> Lustigerweise geht das auch völlig ohne Modulo. Auch das war schon mal> da, ging aber wieder unter, weil nur halb richtig präsentiert.
Du meinst das Makro oben. Aber das wird der TO noch weniger verstehen.
Udo Schmitt schrieb:> Du meinst das Makro oben. Aber das wird der TO noch weniger verstehen.
Wenn er der Betreiber eines Busunternehmens wäre, dann wäre alles ok,
das im Rahmen üblichen Unternehmensgrössen egal wie zum richtigen
Ergebnis kommt.
Da er aber keine Busse besitzt, sondern studiert, ist der Weg und
insbesondere das Verständnis wichtiger. Dafür sind solchen Aufgaben
nämlich da. Wär also klüger, wenn er diesen Weg versteht.
chris schrieb:> Richtig wäre es +.999999
Noe, auch nicht. Das ist eine völlig sinnlos gewählte Komponente, die
zwar mit dem gewählen Beispiel passt, aber noch lange nicht bei allen
Eingaben. Es ist eine Krücke, so oder so.
Mathe ist eine exakte Wissenschaft. Diese Aufgabe im Speziellen ist
trivial und ohne so einen Schmuh lösbar.
Deine Lösung ist in etwa so sauber wie von einem wackelnden Stuhl
einfach immer vom längsten Bein einen cm abzuschneiden. 1000 mal gekürzt
und immer noch zu lang ...
AnzahlBusse = (FreiePlätze + BelegtePlätze) / PlätzeProBus ;
FreiePlätze = BelegtePlätze % PlätzeProBus ;
=>
AnzahlBusse = ((BelegtePlätze % PlätzeProBus) + BelegtePlätze) /
PlätzeProBus ;
Im Integer/bzw. SetN:
FreiePlätze = (BelegtePlätze / PlätzeProBus ) * PlätzeProBus
Daher ergibt sich mit reiner Integerarithmetik ohne Modulo:
AnzahlBusse = (((BelegtePlätze / PlätzeProBus ) * PlätzeProBus ) +
BelegtePlätze) / PlätzeProBus ;
Oder rekursiv:
BenötigteBusse(n,PlätzeProBus) :=
(n==0?0:((n<PlätzeProBus)?1:1+BenötigteBusse(n-50,PlätzeProBus))
Gerne auch ausgerollt:
BenötigteBusse=0;
while (BenötigtePlätze >= PlätzeProBus)
{
BenötigteBusse++
BenötigePlätze-=PlätzeProBus;
}
Und nicht so einen Schmuh mit Magic-Values und PiMalDaumen
Maxx schrieb:> FreiePlätze = (BelegtePlätze / PlätzeProBus ) * PlätzeProBus
Da hat sich der Fehlerteufel eingeschlichen und eine Subtraktion
weggeschmissen.
@ Maxx:
Schön, du hast nun bewiesen dass es sich immer noch lohnt seine Aufgaben
hier reinzustellen wenn man zu faul ist sie selbst zu machen, weil man
mindestens einen (zensiert) findet, der sie dann für einen löst.
Tobias Straub schrieb:> Modulo kenn ich, aber da nimmt er doch dann immmer den rest und gibt den> aus? Das will ich ja aber nicht? Ich will das er immer aufrundet...
Das willst du eigentlich nicht.
Wenn du einfach durchdividierst, dann erhältst du die Anzahl der Busse
die voll besetzt sind.
Bei 68 Leuten und 28 Leuten pro Bus, hast du erst mal
68 / 28 = 2
voll besetzte Busse und
68 % 28 = 12
zwölf Leute, die erst mal keinen Platz gefunden haben.
Diese 12 Leute müssen entweder zu Hause bleiben oder du orderst für die
einen zusätzlichen Bus, der dann eben nicht voll ist.
Welche der Varianten gewählt wird, entscheidet die Aufgabenstellung.
Aber programmiert ist das trivial.
Geh weg vom runden. Du willst nicht im eigentlichen Sinne runden,
sondern wissen ob alle Personen ganzzahlig in eine Anzahl x Busse
reinpasst, oder ob du als Unternehmer in den sauren Apfel beissen musst,
und x+1 Busse einsetzen musst. Der Rest bei der Division (vulgo Modulo)
erzählt dir alles, was du wissen musst. Ist dieser Rest 0, dann sind
offensichtlich alle untergekommen und es braucht keinen zusätzlichen
halb besetzten Bus.
Der ganz Ansatz mit Kommazahlen zu operieren ist schon mies.
Versuch nicht, auf Biegen und Brechen alles in eine einzige Formel zu
quetschen. In der Programmierung wirst du noch oft genug den Fall haben,
dass sich eine 'Berechnung' über mehrere Zeilen und mehrere Anweisungen
hinzieht.
Karl Heinz schrieb:> Geh weg vom runden
Es geht aber schon mit Abschneiden bzw truncate, wenn man vorher die
Anzahl der Plätze im Bus minus 1 dazuaddiert
1
(int)(49+(50-1))/50=1
2
(int)(50+(50-1))/50=1
3
(int)(51+(50-1))/50=2
Karl Heinz schrieb:> Bei 68 Leuten und 28 Leuten pro Bus, hast du erst mal> 68 / 28 = 2> voll besetzte Busse und> 68 % 28 = 12> zwölf Leute, die erst mal keinen Platz gefunden haben.
Klaus schrieb:> Karl Heinz schrieb:>> Geh weg vom runden>> Es geht aber schon mit Abschneiden bzw truncate, wenn man vorher die> Anzahl der Plätze im Bus minus 1 dazuaddiert>
1
>(int)(49+(50-1))/50=1
2
>(int)(50+(50-1))/50=1
3
>(int)(51+(50-1))/50=2
4
>
>> Karl Heinz schrieb:>> Bei 68 Leuten und 28 Leuten pro Bus, hast du erst mal>> 68 / 28 = 2>> voll besetzte Busse und>> 68 % 28 = 12>> zwölf Leute, die erst mal keinen Platz gefunden haben.>>
1
>(int)(68+(28-1))/28=3.392857143also3
2
>
Lach.
wenn er es seinem Lehrer so erklären kann.
Für
1
Anzahl=Leute/Plaetze;
2
if(Leute%Plaetze!=0)
3
Anzahl++;
würde ich volle Punktzahl vergeben. Einfach, durchschaubar, trivial auf
Korrektheit zu prüfen.
und was ist wie in der Schule?
130 Leuts / 50 Plätze gibt als INT 2
und 2 x 50 gibt 100 Leuts im Bus die merken wir uns!
ziehen wir die gemerkten 100 Leuts von den 130 Leuts die mitfahren
wollen ab bleiben 30 Leuts übrig ohne Mitfahrgelegenheit, aha wir
brauchen einen Bus mehr.
verstehe ich grad das Problem nicht oder wie war die Frage?
Tobias Straub schrieb:> Könnt ihr mir also helfen wie ich von zum Beispiel 2,2 auf> 3 Busse komme?
A. K. schrieb:> Max Mustermann schrieb:>> Anzahl_Busse = ((Anz_Personen-1)/Sitzplätze)+1>> Hatten wir schon, vor gut 2h.
Ab "float" "ceiling" und"floor" hab ich den ganzen Rest mal übersprungen
Und um 16:22 standen da noch Sachen wie
> B = Ceiling(R/50);
Tobias Straub schrieb:> ich bin neu hier und habe mich erst angemeldet.
Na, da hast Du ja schon gleich eine Kostprobe des rauhen Klimas hier
erhalten.
Tobias Straub schrieb:> Ich studiere Elektrotechnik und wir müssen in Informatik C> programmieren.
Du hast Glück, schon etwas mit dieser Sprache zu tun gehabt zu haben.
Als vollkommener Neuanfänger wärest Du jetzt schon von den "Experten"
zermalmt worden.
Ein Rat: Halte Dich an die Hinweise von Karl-Heinz, die sind sinnvoll
und
plausibel. Er ist im Gegensatz zu manch Anderem hier kein Blender und
Selbstdarsteller.
Händeringender Fachkräftemangler (Gast) schrieb:
> Ein Rat: Halte Dich an die Hinweise von Karl-Heinz, die sind sinnvoll> und> plausibel. Er ist im Gegensatz zu manch Anderem hier kein Blender und> Selbstdarsteller.
Vor allem hat Karl Heinz Buchegger dem Schützling nicht gleich
irgendeine Lösung in Programmcode vor den Latz geknallt, sondern das
Problem schlicht und nachvollziehbar auf eine einfache Rechenaufgabe
reduziert. Das lässt dann auch Raum für einen eigenen Lösungsansatz. So
sollte es sein. Was hat der TE denn davon, wenn er eure schöne
Einzeilen-Lösung abkupfert? Beim nächsten mal wird er wieder fragen und
das Forenfolk wird's ihm wieder lösen. In der Klausur fällt er später
durch und darf sich dann dafür auch noch Häme hier anhören.
Tobias Straub schrieb:> Ne ceiling kennt visual studio mit meinen datenbanken nicht.
Wenn Du C lernen willst (oder jede andere Sprache) dann fang erstmal mit
einem Texteditor und dem Compiler auf der Kommandozeile an.
So Sachen wie Visual-Studio sind erst dann erlaubt wenn man versteht
(und zur Not zu Fuß nachstellen kann) welche Art von Voodoo das Studio
(oder welche IDE auch immer) beim Herumklicken in der Toolbar
automatisch im Hintergrund vollführt. Und noch bevor Du diese Stufe
erreichst lernt Du bitte auch wie Makefiles funktionieren, dieses Wissen
wird Dir später auch sehr nützlich sein.
Sonst wirst Du ewig im Dunkeln tappen.
Und nochwas: Tu Dir einen Gefallen und nimm von vornherein lieber gcc
statt des Microsoft-Compilers und nutze lieber Linux statt Windows. Das
ist die natürliche Umgebung für solche Werkzeuge, da fühlen die sich am
wohlsten (und Du Dich dann ebenfalls).
Klaus schrieb:> Ist so ähnlich, wie das Addieren von 0,5 bei der Formel zum Runden>> MfG Klaus
Genau.
Wenn mann nicht mit float rechnen kann oder will
und das gerundete Ergebnis einer Ganzahldivision braucht,
dann addiert man vorher die Hälfte des Divisors zum Dividenden hinzu.
Für das "Aufrunden" addiert man vorher den Divisor -1
Hehe Danke. Ja da kriegt man schon das ein oder andere zu hören hier
Haha.
Naja unser Tutor hat gesagt das wir mit Visual Arbeiten sollen. Das wäre
am besten. ich werd mir morgen nochmal das Programm anschauen und gucken
ob ich es auch anders lösen kann.
Trotzdem Danke für die vielen Tipps.
Und ja in Zukunft halte ich mich an Karl Heinz
Grüße und schöne Weihnachten
Max Mustermann schrieb:> So eine triviale Aufgabe.>> Integeraritmetik ohne Rest.>> Anzahl_Busse = ((Anz_Personen-1)/Sitzplätze)+1
Braucht man so nicht auch dann einen Bus, wenn gar keiner mitfahren will
?
Volker SchK schrieb:> Braucht man so nicht auch dann einen Bus, wenn gar keiner mitfahren will
Ja natürlich -und einen Fahrer dafür, den sog. Bustreiber.
Easylife schrieb:> Reisende sind ja in der Regel auch ganzzahlig.
Naja, da bin ich nicht sicher, schließlich kommen pro Frau ja
auch 1,6 Kinder zu Welt...
;-)
MfG Paul