Gibt es einen logischen Fehler in diesem Code?

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Orioner
Beiträge: 77
Registriert: Mo Dez 10, 2012 10:52 am

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » Do Sep 10, 2020 8:52 pm

Wenn sich jemand da durchwurscheltn will, würde es mich freuen: https://pastebin.com/g1dfEPCu

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8615
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Xin » Fr Sep 11, 2020 12:11 am

Orioner hat geschrieben:
Do Sep 10, 2020 8:43 pm
Das müsste doch gehen:
int var = (int) (sellAmount * oilPrice[gameRound])
Das geht, aber das steht da nicht.
Hier wird das float-Ergebnis explizit in ein Int umgerechnet, bevor es übergeben wird.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Orioner
Beiträge: 77
Registriert: Mo Dez 10, 2012 10:52 am

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Orioner » Sa Sep 12, 2020 6:46 pm

Ich habe jetzt den Code noch einmal neu geschrieben und dabei einiges verändert. Jetzt funktioniert der Code wie gewünscht. Er sieht jetzt so aus:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h> // EXIT_SUCCESS
#include <math.h>
#include <string.h>
#include <time.h>

float oilPriceChange[34] = { 1.1f, 1.7f, 1.8f, 1.8f, 1.6f, 1.6f, 1.1f, 1.7f, 1.1f, 1.6f, 1.4f, 0.7f, 1.2f, 1.6f, 1.7f, 1.8f, 1.2f, 0.5f, 0.2f, 0.8f, 1.3f, 1.4f, 1.9f, 1.9f, 2.0f, 2.0f, 2.0f, 1.3f, 1.2f, 0.7f, 0.1f, 0.1f, 0.4f, 0.5f };

int main(void) {
	int i;
	int amountOfOilToSell, amountOfPumps, amountOfTankWagons;
	int amountOfSellableOil = 0;
	int amountOfTankWagonCapacity;
	int playerMoney = 0;
	float oilPrice = oilPriceChange[0];
	srand((unsigned) time(NULL));
	amountOfPumps = rand() % 10 + 1;
	amountOfTankWagons = rand() % 10 + 1;
	amountOfSellableOil += amountOfPumps * 8000;
	amountOfTankWagonCapacity = amountOfTankWagons * 7000;
	
	printf("Rafinerieabnahmepreis  $ %.1f\n", oilPrice);
	printf("%d\n", amountOfPumps);
	printf("%d\n", amountOfSellableOil);
	printf("%d\n", amountOfTankWagons);
	printf("%d\n", amountOfTankWagonCapacity);
	printf("%d\n", playerMoney);
	
	scanf("%d", &amountOfOilToSell);
	if (amountOfOilToSell < 0)
		amountOfOilToSell = 0;
	if (amountOfOilToSell > amountOfSellableOil)
		amountOfOilToSell = amountOfSellableOil;
	if (amountOfOilToSell > amountOfTankWagonCapacity)
		amountOfOilToSell = amountOfTankWagonCapacity;
	
	amountOfSellableOil -= amountOfOilToSell;
	playerMoney += amountOfOilToSell * oilPrice;
	printf("%d\n", playerMoney);
	return EXIT_SUCCESS;
}
Das ist jetzt nur ein Entwurf auf den ich zurückgreifen will, wenn ich alle Spielbestandteile zusammensetze.

Eine Alternative dazu, oilPrice und oilPriceChange[] als float zu behandeln, wäre, die Werte mit 10 zu multiplizieren, als int zu speichern, damit zu rechnen und da, wo es nötig ist, den Wert wieder durch 10 zu dividieren und ggf. als float zu speichern. Was ist besser? Was meint ihr?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8615
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Gibt es einen logischen Fehler in diesem Code?

Beitrag von Xin » So Sep 13, 2020 12:17 pm

Orioner hat geschrieben:
Sa Sep 12, 2020 6:46 pm
Eine Alternative dazu, oilPrice und oilPriceChange[] als float zu behandeln, wäre, die Werte mit 10 zu multiplizieren, als int zu speichern, damit zu rechnen und da, wo es nötig ist, den Wert wieder durch 10 zu dividieren und ggf. als float zu speichern. Was ist besser? Was meint ihr?
Es ist gute Tradition solche Werte als integer zu halten und die Einheit anzupassen. Statt Euro halt Cent. Die Ausgabe erfolgt dann über eine modifizierte Stringumwandlung, die einfach vor die letzten beiden Stellen einen Punkt einfügt. Intern 1000ct, die Ausgabe sagt 10.00 Euro.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten