Jump to content
  • 0
Melde dich an, um diesem Inhalt zu folgen  

Lernaufgabe: C Programmieren, Modulares Programmieren und Speichermanagement

Frage

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);
    }
}

Diesen Beitrag teilen


Link zum Beitrag
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.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

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? 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

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

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

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

Melde dich an, um diesem Inhalt zu folgen  

Fachinformatiker.de, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

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

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung