In C: Celsius in Fahrenheit?
Moin,
ich habe ein Programm geschrieben, welches Celsius in Fahrenheit umrechnet. Jedoch bekomme ich nicht die richtigen Ergebnisse, da ich ja rein theoretisch die Ergebnisse der Rechnung (Formel für Umrechnung: Temp(in Celsius) * 9/5 + 32 in einer float-Variable speichern müsste, oder?
Hier meine Header:
#ifndef TEMPERATURE
#define TEMPERATURE
#define MAX_LENGTH 10
#define converter(c)((c * (9 / 5)) + 32)
double output_temperatures(double temp[]);
int string_length(double temp[]);
double widening(double temp2[]);
/* double appendix(double temp3[], temp4[]); */
#endif
Hier meine Funktionen:
#include "aufgabe2930b.h"
#include <stdio.h>
double output_temperatures(double temp[])
{
int i;
printf("Temperaturen in Fahrenheit: ");
for (i = 0; i < string_length(temp); ++i) {
if (temp[i] <= 100 && temp[i] >= -273.15) {
printf("%f ", converter(temp[i]));
}
else {
printf("Falsche Eingabe! ");
break;
}
}
printf("\n");
return 0;
}
int string_length(double temp[])
{
int i = 0;
int length = 0;
while (temp[i] != '\0') {
++length;
++i;
}
return length;
}
double widening(double temp[])
{
int i = 0;
while (i < MAX_LENGTH - 1) {
if (temp[i] == '\0') {
printf("Bitte anzuhängende Temperatur eingeben: ");
scanf("%lf", &temp[i]);
temp[i + 1] = '\0';
break;
}
else {
++i;
}
}
for (i = 0 ; i < string_length(temp); ++i) {
if (temp[i] <= 100 && temp[i] >= -273.15) {
printf("%f ", converter(temp[i]));
}
else {
printf("Falsche Eingabe! ");
break;
}
}
return 0;
}
Hier meine main:
#include <stdio.h>
#include "aufgabe2930b.h"
int main(void)
{
double temp[MAX_LENGTH] = { 1, 2 };
output_temperatures(temp);
widening(temp);
return 0;
}
1 Antwort
Werte wie 9 oder 5 werden als Ganzzahlen (Integer) interpretiert. Wenn du zwei Ganzzahlen miteinander dividierst, erhältst du auch eine Ganzzahl als Ergebnis. Verwende für mindestens einen beider Werte ein anderes Literal.
Zum Beispiel:
9.0 / 5
Wenn du eine Division mit Ganzzahlen
Zusätzlich noch ein paar weitere Anmerkungen:
1) Makronamen würde ich, damit man sie stets vom üblichen Code auseinanderhalten kann, in Großbuchstaben schreiben. Es ist eine übliche Konvention.
#define CONVERT_CELSIUS_TO_FAHRENHEIT(celsius)((celsius * (9.0 / 5)) + 32)
2) Arbeite besser mit eindeutigen, aussagekräftigen Bezeichnern. Im obigen Snippet siehst du schon, dass ich hinsichtlich der Namen zwei Änderungen vorgenommen habe.
Andere Beispiele in deinem Code wären:
- temperatures statt temp (temp ist üblicherweise die Abkürzung für temporary)
- array_length statt string_length (die Funktion berechnet doch die Länge deines double-Arrays und nicht die eines Strings)
3) Deine Funktion string_length hat ein Problem. Angenommen, dein Array sieht so aus:
double temperatures[MAX_LENGTH] = { 1, 2, 0, 3, 4 };
printf("%d", string_length(temperatures));
Dann wäre die Ausgabe 2, nicht wie erwartet 5. Dabei ist 0 doch eine valide Gradangabe.
Ich würde auf die string_length vollkommen verzichten. Setze entweder überall das Makro MAX_LENGTH ein, wo du die Länge des Arrays wissen musst und reduziere den Wert auf die tatsächliche Länge (im obigen Beispiel also 5) oder lege eine extra Variable an, die die besetzte Länge kennt und stets mitgereicht wird.
void calculate_something(double[], size_t);
int main(void)
{
size_t numberOfTemperatureValues = 5;
double temperatures[MAX_LENGTH] = { 1, 2, 0, 3, 4 };
calculate_something(temperatures, numberOfTemperatureValues);
return 0;
}
void calculate_something(double[] temperatures, size_t numberOfTemperatureValues)
{
// do something ...
}
Du könntest, um beide Angaben besser zusammenzuhalten, auch ein struct definieren.
#define MAX_LENGTH 5
struct temperatureDegrees {
double values[MAX_LENGTH];
size_t numberOfValues;
};
void calculate_something(struct temperatureDegrees);
int main(void)
{
struct temperatureDegrees degrees = {
{ 1, 2, 0, 3, 4 },
MAX_LENGTH
};
calculate_something(degrees);
return 0;
}
void calculate_something(struct temperatureDegrees degrees)
{
// do something ...
}
Auf die einzelnen Attribute des struct kannst du via Punktnotation zugreifen.
Beispiel:
size_t numberOfValues = degrees.numberOfValues;