C - Variable und deren Grenzen < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 20:15 Sa 19.04.2008 | Autor: | StefanBS |
Aufgabe | Hier die Aufgabenstellung:
Schreiben Sie ein Programm, das eine Variable für die Datentypen char, unsigned char, int, unsigned int, short, long, float und double anlegt und jeweils ihre Ober- und Untergrenzen angibt. Verwenden Sie dafür die Konstanten in den header-Dateien <limits.h> und <float.h>. Des weiteren soll die Anzahl der jeweiligen verbrauchten Bytes unter Verwendung des sizeof()-Operators angegeben werden. Außerdem soll die Adresse jeder Variablen, ihr Name und der Variableninhalt ausgegeben werden.
Erzeugen Sie aus diesen Informationen eine formatierte Tabelle, die etwa folgendes Aussehen haben soll:
Datentyp | Name | Adresse | Inhalt | Bytes | Untergrenze | Obergrenze
----------------------------------------------------------------------------------------------
char | c1 | 689678 | 'a' | 1 | -128 | 127
----------------------------------------------------------------------------------------------
u.s.w.
Dies war ein Beispiel dafür wie eine Zeile für char aussehen würde. Komplettieren Sie die Tabelle für alle oben angegebenen Datentypen. Zu grosse Zahlen geben Sie dabei im e-Format mit zwei Nachkommastellen an. Den Ausdruck "unsigned" können Sie mit "u." abkürzen, damit die Zeilen nicht zu breit werden. |
Hallo,
ich habe vor kurzem mit der Programmiersprache C begonnen und folgende Hausaufgabe zu Freitag zu erledigen. Leider wurde die Aufgabenstellung im Unterricht nicht erklärt, vielmehr der Hinweis gegeben, dass wir uns das Wissen ja im Internet aneignen könnten. Das habe ich zumindest versucht und nachfolgenden Quelltext erzeugt. Entschuldigt bitte, den langen Text, aber sonnst wüsste ich auch nicht, wen ich diesbezüglich fragen könnte, da meine Mitschüler auch völlig verzweifelt sind.
Meine Frage dazu wäre folgende:
Wie erhalte ich für unsigned int bzw. unsigned char eine Untergrenze?
Allgemein möchte ich auch Fragen, ob ich die Aufgabe halbwegs richtig bearbeitet habe oder das Aufgabenziel möglicherweise verfehlt habe bzw. welche Fehler noch im Quelltext sind?
Vorab schon mal vielen Dank, auch schon dafür, das Ihr meine Frage bis hierhin gelesen habt.
----------------------------------------
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main(void) {
// Zeichen
char c1 = 'a';
unsigned char uc1 = [mm] '\x84';
[/mm]
// Ganzzahlen
short i1 = 5;
int i2 = 11;
unsigned int i3 = 100;
long i4 = -6;
// Gleitkommazahlen
float f1 = 3.4;
double d1 = 200.56;
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" Datentyp | Name | Adresse | Inhalt | Bytes | Untergrenze | [mm] Obergrenze\n");
[/mm]
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6c | %9i |%12i [mm] |%12i\n", [/mm] "char", "c1", &c1, c1, sizeof(char), CHAR_MIN, CHAR_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6c | %9i |%12i [mm] |%12i\n", [/mm] "u char", "uc1", &uc1, uc1, sizeof(unsigned char), CHAR_MAX, UCHAR_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6c | %9i |%12i [mm] |%12i\n", [/mm] "short", "i1", &i1, i1, sizeof(short), SHRT_MIN, SHRT_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6c | %9i |%12i [mm] |%12i\n", [/mm] "int", "i2", &i2, i2, sizeof(int), INT_MIN, INT_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6c | %9i |%12i [mm] |%12i\n", [/mm] "u int", "i3", &i3, i3, sizeof(unsigned int), INT_MIN, UINT_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6c | %9i |%12li [mm] |%12li\n", [/mm] "long", "i4", &i4, i4, sizeof(long), LONG_MIN, LONG_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6G | %9.2e |%12.2e [mm] |%12.2e\n", [/mm] "float", "f1", &f1, f1, sizeof(float), FLT_MIN, FLT_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
printf(" %-8s | %4s | %ld | %6G | %9.2e |%12.2e [mm] |%12.e\n", [/mm] "double", "d1", &d1, d1, sizeof(double), DBL_MIN, DBL_MAX);
[mm] printf("---------------------------------------------------------------------------\n");
[/mm]
return 0;
}
------------------------
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:54 Sa 19.04.2008 | Autor: | andihit |
> Meine Frage dazu wäre folgende:
> Wie erhalte ich für unsigned int bzw. unsigned char eine
> Untergrenze?
unsigned heißt, dass das Vorzeichen nicht gespeichert wird.
Daher ist die Untergrenze 0, und die Obergrenze wird entsprechend höher.
(steht als Kommentar auch in der limits.h: "/* Maximum value an 'unsigned char' can hold. (Minimum is 0.) */", bzw. "/* Maximum value an 'unsigned int' can hold. (Minimum is 0.) */")
> Allgemein möchte ich auch Fragen, ob ich die Aufgabe
> halbwegs richtig bearbeitet habe oder das Aufgabenziel
> möglicherweise verfehlt habe bzw. welche Fehler noch im
> Quelltext sind?
Ich sehe keinen Fehler. Man könnte den wiederkehrenden Code zwar in eine Funktion auslagern, aber das ist ja nicht Teil der Aufgabenstellung.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:15 So 20.04.2008 | Autor: | StefanBS |
Aufgabe | Kompilierung läuft...
h2_ss08.cpp
[mm] c:\programme\microsoft [/mm] visual [mm] studio\myprojects\h2_ss08\h2_ss08.cpp(29) [/mm] : warning C4305: 'initializing' : Verkuerzung von 'const double' in 'float'
Linker-Vorgang läuft...
h2_ss08.exe - 0 Fehler, 1 Warnung(en) |
Danke für die schnelle Antwort. Würde jetzt aber noch gerne wissen, was die oben angegebene Meldung zu bedeuten hat, bzw. was ich machen kann, damit diese nicht mehr erscheint.
Danke.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:14 Mo 21.04.2008 | Autor: | rainerS |
Hallo!
> Kompilierung läuft...
> h2_ss08.cpp
> c:\programme\microsoft visual studio\myprojects\h2_ss08\h2_ss08.cpp(29) : warning C4305: 'initializing' : Verkuerzung von 'const double' in 'float'
> Linker-Vorgang läuft...
>
> h2_ss08.exe - 0 Fehler, 1 Warnung(en)
> Danke für die schnelle Antwort. Würde jetzt aber noch
> gerne wissen, was die oben angegebene Meldung zu bedeuten
> hat, bzw. was ich machen kann, damit diese nicht mehr
> erscheint.
Du schreibst nicht, welche Zeile es ist, die der Compiler beklagt, aber ich vermute einfach mal, es handelt sich um diese:
float f1 = 3.4;
3.4 ist eine Konstante vom Typ double; wenn du sie einer Variablen vom Typ float zuweist, geht Genauigkeit verloren. Du solltest statt dessen
float f1 = 3.4f;
schreiben, denn 3.4f bedeutet 3.4 als Konstante vom Typ float.
Viele Grüße
Rainer
|
|
|
|