2016-03-21 8 views
-2

Ich habe eine Hausaufgabe, wo ich den Code ändern musste und eine zusätzliche Option hinzufügen, um eine ganze Zahl durch zwei zu teilen. Als ich jedoch meinen Abschnitt hinzugefügt habe, erhalte ich immer eine Fehlermeldung. HierErhalte Fehlermeldungen beim Erstellen einer neuen Funktion

ist der Code:

#include <stdio.h> 

int main() 

{ 

/* variable definition: */ 

int intValue, menuSelect,Results; 
float floatValue; 

intValue = 1; 

// While a positive number 

while (intValue > 0) 

{ 

printf ("Enter a positive Integer\n: "); 

scanf("%d", &intValue); 

if (intValue > 0) 

{ 

printf ("Enter 1 to calculate Square, 2 to Calculate Cube, 3 to divide by 2 \n: "); 

scanf("%d", &menuSelect); 

if (menuSelect == 1) 

{ 

    // Call the Square Function 

    Results = Square(intValue); 

    printf("Square of %d is %d\n",intValue,Results); 

} 

else if (menuSelect == 2) 

{ 

    // Call the Cube function 

    Results = Cube(intValue); 

    printf("Cube of %d is %d\n",intValue,Results); 

} 

else if (menuSelect == 3) 

{ 

    //Call the half function 

    Results = divide2(floatValue); 

    printf("Half of %d is %f\n", intValue,Results); 

} 

else 

    printf("Invalid menu item, only 1 or 2 is accepted\n"); 

}  

}  

return 0; 

} 

/* function returning the Square of a number */ 

int Square(int value) 

{ 

return value*value; 

} 

/* function returning the Cube of a number */ 

int Cube(int value) 

{ 
return value*value*value; 

} 

//Function returning the half of a number 

float divide2(float value) 

{ 
return value/2; 

} 

Und die Fehler, die ich bin immer sind:

prog.c: In function 'main': 
prog.c:38:18: warning: implicit declaration of function 'Square'  [-Wimplicit-function-declaration] 
    Results = Square(intValue); 
      ^
prog.c:50:18: warning: implicit declaration of function 'Cube' [-Wimplicit-function-declaration] 
    Results = Cube(intValue); 
      ^
prog.c:62:17: warning: implicit declaration of function 'divide2' [-Wimplicit-function-declaration] 
    Results = divide2(floatValue); 
      ^
prog.c:64:14: warning: format '%f' expects argument of type 'double', but argument 3 has type 'int' [-Wformat=] 
    printf("Half of %d is %f\n", intValue,Results); 
     ^
prog.c: At top level: 
prog.c:101:7: error: conflicting types for 'divide2' 
float divide2(float value) 
^
prog.c:62:17: note: previous implicit declaration of 'divide2' was here 
    Results = divide2(floatValue); 
      ^

Was ist falsch mit dem Code? Ich habe nicht die Nachrichten erhalten, wenn die Original-Code

+1

Wenn Sie C-Code schreiben, stellen Sie sich vor, dass Sie den Compiler anweisen, Ihren Code Stück für Stück zu verstehen. Sie müssen Funktionen einführen, die andere Teile des Codes verwenden, bevor diese Verwendung erfolgt.In Ihrem speziellen Beispiel steht 'main' vor' Square', sodass der Compiler nicht wirklich weiß, was zu tun ist, wenn er Ihren 'Square'-Aufruf zum ersten Mal sieht. Versuchen Sie, Ihre Funktionen nach diesem Prinzip zu ordnen und zu prüfen, ob sie Ihr Problem lösen. –

+0

Verwenden Sie nur Prototypen für alle Funktionen vor der Hauptfunktion und definieren Sie sie anschließend. – RastaJedi

+1

Fügen Sie Prototypen hinzu oder definieren Sie die Funktion, bevor Sie sie tatsächlich aufrufen. Wenn Sie von main() aus aufrufen, definieren Sie sie vor main(). –

Antwort

2
Lauf

Sie haben einen Prototyp einer Funktion hinzufügen, wenn Sie es nach dem Punkt definieren, wo Sie es

Beispiel genannt haben:

ABC(); 

void ABC(){ 
//do some stuff 
} 

Funktioniert nicht, wenn wir nicht vor dem Aufruf von ABC() void ABC(); hinzufügen;

Dies wird auch gut funktionieren:

void ABC(){ 
//do something 
} 

ABC(); 
+0

Ich konnte den Code zum Arbeiten bringen, indem ich die Funktionen vor der Hauptfunktion einführte. Danke für die Hilfe! –

+3

'ABC();' ist illegal, ein Prototyp wäre 'int ABC (void);' oder 'void ABC (void);' –

+0

Es ist nicht illegal, es wird nur nicht überprüft, ob ein Wert für die Funktion zur Verfügung gestellt wird. –

0

Hier ist der Code, der funktioniert (ich änderte einige Variablennamen, weil Sie nicht results für beide int verwenden können und schwimmen und ich änderte auch die Schleife überprüfen, ob die Zahl ist größer als ODER gleich 0, da 0 als positiv und Quadrat/Würfel/Hälfte als gut für 0 definiert). Ich werde eine Funktion oben definieren; Da sie klein sind, sind sie leicht einzeilig, und im Allgemeinen für Einzeiler definiere ich sie ganz oben, aber der Rest werde ich nur am oberen Ende modellieren und später definieren (nur damit du beide Stile sehen kannst).

#include <stdio.h> 

int square(int value); 
int cube(int value); 
/* Function returning the half of a number */ 
float divide2(float value) { return value/2; } 

int main() 
{ 
    int number, menu_select, int_result; 
    float float_result; 

    number = 1; 

    // While a positive number 
    while (number >= 0) 
    { 
      printf("Enter a positive Integer\n: "); 
      scanf("%d", &number); 

      if (number > 0) 
      { 
        printf("Enter 1 to calculate Square, 2 to Calculate Cube, 3 to divide by 2\n: "); 
        scanf("%d", &menu_select); 

        switch (menu_select) 
        { 
        case 1: 
          // Call the square Function 
          int_result = square(number); 
          printf("Square of %d is %d\n", number, int_result); 
          break; 
        case 2: 
          // Call the cube function 
          int_result = cube(number); 
          printf("cube of %d is %d\n", number, int_result); 
          break; 
        case 3: 
          // Call the half function 
          float_result = divide2(number); 
          printf("Half of %d is %f\n", number, float_result); 
          break; 
        default: 
          printf("Invalid menu item, only 1 or 2 is accepted\n"); 
        } 
      } 
    } 

    return 0; 
} 

/* Function returning the square of a number */ 
int square(int value) 
{ 
    return value * value; 
} 

/* Function returning the cube of a number */ 
int cube(int value) 
{ 
    return value * value * value; 
} 

Ich habe auch Ihre Reihe von if/else ‚s auf einem einzigen switch den Code übersichtlicher zu machen, und so können Sie die Leistung von switch sehen. Obwohl ich sie nie persönlich benutzt habe, scheinen diese Funktionen ideale Kandidaten für inline ing.

Sie könnten auch ein Feld mit Ihrem printf für Ihren Float-Wert angeben, so könnte es wie 0.50 aussehen, z. anstelle von 0.500000. Hier ist, wie Sie zwei Stellen nach dem Komma angeben würden:

printf("Here is a float value: %.2f\n", float_var); 

einfach ändern, um die „2“ in %.2f, was auch immer Sie mögen, wenn Sie die Genauigkeit angeben mögen.

1

sollten Sie Prototypen verwenden knapp unter die beinhaltet:

int Square(int value); 
int Cube(int value); 
float Divide2(float value); 

Wenn Sie keine Verwendung Prototypen wollen. Eine Option stellt alle Methoden auf die Hauptfunktion, das ist nicht zu empfehlen, aber es funktioniert.

Die Prototypen sind Verweise auf den Compiler und sie informieren im Voraus über Funktionen, wie sie geladen werden sollten.

Verwandte Themen