C - 打印函数返回的char

时间:2016-11-12 23:33:05

标签: c

更新: 最后的if语句if(lettergrade <= 'A' && lettergrade >= 'F')不正确,因为F(70)的ascii值大于A(65)。

我试图打印C中函数返回的字符。

我的函数,assignletter,给出一个浮点数,并返回一个字符。

当我按原样运行程序时:

skirchbaum:~/workspace/HMWK/HMWK4 $ ./assignletter 
Enter pointsgrade
100
Pointsgrade: 100.00 Lettergrade: 

没有为lettergrade打印任何内容(我尝试了多个案例 - 100.1,1等)

我做错了什么?

CODE:

/* Input: a grade as points
   Functionality: converts point grade into letter grade
   Output: a char representing the letter grade, or -1 if error

   LETTER GRADE BREAKDOWN:
   A = 100 - 91
   B = 90 - 81
   C = 80 - 71
   D = 70 - 61
   F = 60 and below
*/


#include <stdio.h>
#include <stdlib.h>
#define DEBUG 1

char assignletter(float pointsgrade);

char lettergrade;
float pointsgrade;

int main(){
    //Input a pointsgrade for debugging
    #ifdef DEBUG
    printf("Enter pointsgrade\n");
    scanf("%f", &pointsgrade);
    lettergrade = assignletter(pointsgrade);
    printf("Pointsgrade: %.2f Lettergrade: %c\n", pointsgrade, lettergrade);
    #endif
}

char assignletter(float pointsgrade){

    char lettergrade;

    //Grade A
    if(pointsgrade <= 100 && pointsgrade >= 91){
        lettergrade = 'A';
    }

    //Grade B
    if(pointsgrade <= 90 && pointsgrade >= 81){
        lettergrade = 'B';
    }

    //Grade C
    if(pointsgrade <= 80 && pointsgrade >= 71){
        lettergrade = 'C';
    }

    //Grade D
    if(pointsgrade <= 70 && pointsgrade >= 61){
        lettergrade = 'D';
    }

    //Grade F
    if(pointsgrade <= 60){
        lettergrade = 'F';
    }

    //Return letter grade or -1 if error
    if(lettergrade <= 'A' && lettergrade >= 'F'){
        return lettergrade;
    }
    else{
        return -1;
    }
}

2 个答案:

答案 0 :(得分:1)

条件形成不良,{F}在ASCII中为70,而'A'为65,所以

if (lettergrade <= 'A' && lettergrade >= 'F') {
    return lettergrade;
}
由于lettergrade('A')小于70('F')并且不大于

不会评估为true

你宁愿这样做

if (lettergrade >= 'A' && lettergrade <= 'F') {
    return lettergrade;
}

通过翻转大于和小于标志

答案 1 :(得分:0)

您正在将lettergrade分配给A(65)和F(70)之间的ASCII值。

但是,在这种情况下,您正在检查值是否小于A(65)且大于F(70)。

当然,如果lettergrade介于A(65)和B(70)之间(它会),则return语句不会被评估。

替换

    if(lettergrade <= 'A' && lettergrade >= 'F'){
        return lettergrade;
    }
    else{
        return -1;
    }

使用

    if(lettergrade >= 'A' && lettergrade <= 'F'){
        return lettergrade;
    }
    return -1;

作为额外提示,我建议您也取消else声明。原因是只有在未执行其他return -1语句时控件才会达到return