Zum Inhalt springen
  • 0

Lernaufgabe: C Programmieren, Modulares Programmieren und Speichermanagement


Gast Schnuggenfuggler

Frage

Gast Schnuggenfuggler
Guten Tag liebes Forum,

ich möchte gerade folgende Aufgabe lösen: 

Your job is to write a program that shows, in human-readable form (see below for specifics), how much memory a set of variables of a certain type will use. Your program should read a character that identifies the data type ('i' for int, 's' for short, 'c' for char, 'd' for double). Your program should then calculate the amount of memory required to store the given variables.

  • Your program needs to be written in such a way that it would also perform correctly on other computers. In other words, rather than hard-coding specific sizes for the different variable types, your program needs to use the "sizeof()" function to determine how much memory an individual variable of a given type needs.
  • Finally, you need to output the amount of space required by your variables to the screen. You need to make sure you provide this output in a form that is easy to read for humans. The following examples illustrate what this means:

Examples

If the user input was:

i 36794

then the amount of space needed (if we assume that an integer uses 4 bytes in memory) would be 4*36794 = 147176 bytes. This corresponds to 147 kilobytes and 176 bytes, so the output should be:

147 KB and 176 B

Aber wenn ich meine Lösung kompiliere, dann bekomme ich komische Resultate, d.h. hinten hängt dort dann einfach noch einmal eine Zahl dran.
Ich weiß nicht woher die kommt:

i 36794
147 KB and 176 B 102

Vielleicht sieht hier jemand woher der Fehler kommt?

#include <stdio.h>

int SizeOfCall(char type, int input);
int SizeForHumans(int num);

int main(void) {
    int input;
    char type;

    scanf("%c %d",&type, &input);
    printf("%d",SizeOfCall(type, input));
    return 0;
}

int size;   
int SizeOfCall(char type, int input){
    if (type == 'i'){
        size = input*sizeof(int);
        printf("%d", SizeForHumans(size));
    }else if (type == 'c'){
        size = input*sizeof(char);
        printf("%d", SizeForHumans(size));
    }else if (type == 'd'){
        size = input*sizeof(double);
        printf("%d", SizeForHumans(size));
    }else{
        printf("Invalid Type");
    }
}

int size;
int GB, MB, KB, B = 0;
int SizeForHumans(int size){
    if (size<1000){
        B = size;
        printf("and %d B\n",B);
    }else if (size<1000000){
        KB = size/1000;
        printf("%d KB ",KB);
        return SizeForHumans(size%1000); 
    }else if (size<1000000000){
        MB = size/1000000; 
        printf("%d MB ",MB);
        return SizeForHumans(size%1000000); 
    }else if (size<1000000000000){
        GB = size/1000000000;
        printf("%d GB ",KB);
        return SizeForHumans(size%1000000000);
    }
}
Link zu diesem Kommentar
Auf anderen Seiten teilen

10 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

Und hat dennoch Optimierungspotenzial, da die Funktion SizeForHumans() zu viel macht. Sie ist für die Umrechnung und für die Ausgabe  auf der Konsole zuständig. Sie ist also per Unittest nicht testbar und auch nicht wiederverwendbar. Angenommen, du willst die Ausgabe nicht auf der Konsole machen, sondern auf der Webseite. Darüber hinaus hat sie ebenfalls einen unnötigen Rückgabewert.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
Gast Schnuggenfuggler
Danke, Whizzard, dass dachte ich mir eben auch und habe das mal geändert. 
So scheint es zu gehen. 
Ich müsste nur für long int noch ändern denke ich. 
Jedenfalls ist der Fehler jetzt weg. Danke.

#include <stdio.h>

int SizeOfCall(char type, int input);
int SizeForHumans(int size);

int main(void) {
    int input;
    char type;

    scanf("%c %d",&type, &input);
    return SizeOfCall(type, input);
}

int size;   
int SizeOfCall(char type, int input){
    if (type == 'i'){
        size = input*sizeof(int);
        return SizeForHumans(size);
    }else if (type == 'c'){
        size = input*sizeof(char);
        return SizeForHumans(size);
    }else if (type == 'd'){
        size = input*sizeof(double);
        return SizeForHumans(size);
    }else if (type == 'd'){
        size = input*sizeof(double);
        return SizeForHumans(size);
    }else if (type == 's'){
        size = input*sizeof(short);
        printf("%d", SizeForHumans(size));
    }else{
        return printf("Invalid Type");
    }
}

int size;
int GB, MB, KB, B = 0;
int SizeForHumans(int size){
    if (size<1000){
        B = size;
        return printf("and %d B\n",B);
    }else if (size<1000000){
        KB = size/1000;
        printf("%d KB ",KB);
        return SizeForHumans(size%1000); 
    }else if (size<1000000000){
        MB = size/1000000; 
        printf("%d MB and ",MB);
        return SizeForHumans(size%1000000); 
    }else if (size<1000000000000){
        GB = size/1000000000;
        printf("%d GB ",KB);
        return SizeForHumans(size%1000000000);
    }
}
Bearbeitet von Schnuggenfuggler
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
Gast Schnuggenfuggler

Die Ausgabe Strings habe ich bei mir jetzt so geändert, dass es passen müsste, danke Whizzard. Das sind Interessante Einwände. Unittest hört sich gut an, das schaue ich mir heute Abend mal genauer an. Ich weiß nicht was du mit "unnötiger Rückgabewert" meinst.

vor 1 Stunde schrieb Schnuggenfuggler:

return SizeOfCall(type, input);

das hier?

vor 1 Stunde schrieb Schnuggenfuggler:

return printf("and %d B\n",B);

oder die hier? oder noch andere? 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
Gast Schnuggenfuggler

Ahh... sehr cool. Danke. Der Rückgabewert für printf ist ein Integer für die Anzahl der ausgegebenen Buchstaben. So ist der Fehler also entstanden. Danke Whizzard!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...