2017-03-15 5 views
0

私は初心者のC練習に取り組んでいます。スコアが挿入されると正しいマークが出力されます。 しかし、私は実際にエクササイズの最後の部分で成功することはできません(プラスまたはマイナスを加えてください)。理由を理解できません。 line[1]が期待どおりに動作しない理由を本当に理解したいと思います。初心者Cの練習[sscanf - fgets - else else]

運動のテキスト:文字を印刷し、数値のグレードを考える

0–60 -> F 
61–70 -> D 
71–80 -> C 
81–90 -> B 
91–100 -> A 

: 教授は、次の表を使用して、文字の等級を生成します。 スコアの最後の桁に基づいて、文字グレードの後に​​+または - を印刷するように、前のプログラムを変更します。 最終桁の修飾

1–3 -> "–" 
4–7 -> <blank> 
8–0 -> "+" 
例えば

、81 = B-、94 = A、68 = D +。注:FはFのみです。F +またはF-はありません。誰にでも

#include <stdio.h> 

char line[20];    //prepare the input from keyboard 
int score; 
char plusminus; 

int main() { 
    printf("insert your score: ");  // ask for the score 
    fgets(line, sizeof(line), stdin); 
    sscanf(line, "%d", &score); 

// check for conditions 
    if (score <= 60) { 
     printf("F"); 
    } 
    if (score <= 70 && score >60) { 
     printf("D"); 
    } 
    if (score <= 80 && score >70) { 
     printf("C"); 
    } 
    if (score <= 90 && score >80) { 
     printf("B"); 
    } 
    if (score <= 100 && score >90) { 
     printf("A"); 
    } 

// plus and minus to the mark, but didn't succed :(
    plusminus = line[1]; 
    if (plusminus < "3") { 
     printf("-"); 
    } 
    if (plusminus > "8") { 
     printf("+"); 
    } 
} 

感謝を:私は何をやったか

+0

二重引用符 - ' "3"' - 意志'3 \ 0'を含む文字列を作成します(' \ 0'は終端文字で、Cは文字列の終わりをどのように知るか)。一重引用符 - '' 3'' - キャラクタの値をメモリに入れます - 51. – Attie

+1

一般的な提案:入力/出力とは別のロジックです。どうやってするか?入力として整数を持つtranslateScoreToGradeなどの新しい関数を作成し、構造体Gradeを出力(charグレード、char修飾子)として作成します。あなたの教授があなたにもっと高いスコアを与えるでしょう:) –

+0

また、これらのifsをswitch - >(100-score)/ 10、case 0 - > case 1-> B ... default-> F –

答えて

0

文字列と文字を比較しています。文字列リテラルは、メモリ内の実際の文字列配列へのポインタです。文字は小さな整数です。

代わりに文字リテラルを使用してください。のような引用符を使用してください。 '3'

0
plusminus = line[1]; 
if (plusminus < '3'&&plusminus!='0') { 
    printf("-"); 
} 
if (plusminus > '8'||plusminus=='0') { 
    printf("+"); 
} 

それは< 3であるが、それは出力がルールに従って「+」でなければなりませんので、あなたも「0」をチェックする必要があります。

1

すでにスコアがintであるため、モジュラス演算子%を使用して、残りのスコアを10で割った値を最後の桁と同じにすることができます。例えば

:あなたはベース10番号の最後の桁を取得したい場合は

if((score % 10) <= 3)&&((score % 10) >= 1)) 
    { 
    printf("-"); 
    } 
0

i % 10を使用しています。次に、文字ではなく整数を使ってこの数値と比較することができます。これはあなたがしていることです。

1

あなたはIFSの最初のチェーン簡素化することができます:

// check for conditions 
if (score <= 60) { 
    printf("F"); 
} else if (score <= 70) { 
    printf("D"); 
} else if (score <= 80) { 
    printf("C"); 
} else if (score <= 90) { 
    printf("B"); 
} else { 
    printf("A"); 
} 

をそして、このように+/-扱う:

if ((score - 1) % 10 < 2) { 
    printf("-"); 
} else if ((score - 1) % 10 > 7) { 
    printf("+"); 
} 
0
#include <stdio.h> 

int main(){ 
    int grade=0; 
    printf("Enter your grade\n"); 
    scanf("%d",&grade); 

    if (grade<=60) { 
     printf("F\n"); 
    } 
    if (grade>=61^grade>=70) { 
     printf("D\n"); 
    } 
    if (grade>=71^grade>=80) { 
     printf("C\n"); 
    } 
    if (grade>=81^grade>=90) { 
     printf("B\n"); 
    } 
    if (grade>=91^grade>=100) { 
     printf("A\n"); 
    } 
    return 0; 
} 
0
#include <stdlib.h> 

char * scoreToGrade(int); 

int main(){ 
    int score; 
    printf("Enter your score:"); 
    scanf("%d",&score); 

    char * grade = scoreToGrade(score); 

    printf("Grade: %s\n", grade); 
} 

char * scoreToGrade(int score){ 
    /* 
    * 1 character for the letter 
    * 1 character for the +/- (if it's there, otherwise a terminating 
    * character, and 1 last character if there was a +/- 
    */ 
    char * result = malloc(sizeof(char) * 3); 

    if(score <= 60){ 
     result[0] = 'F'; 
    } else if(score <= 70){ 
     result[0] = 'D'; 
    } else if(score <= 80){ 
     result[0] = 'C'; 
    } else if(score <= 90){ 
     result[0] = 'B'; 
    } else { 
     result[0] = 'A'; 
    } 

    /* Handle plusses and minuses if the grade is not an F */ 
    if(result[0] != 'F'){ 
     int subscore = (score - 1) % 10; 
     if(subscore >= 7){ 
      result[1] = '+'; 
     } else if(subscore <= 2){ 
      result[1] = '-'; 
     } else { 
      result[1] = '\0'; /* Add a string terminator, making the string one character long */ 
     } 
    } else { 
     result[1] = '\0'; /* Add a string terminator, making the string one character long. This is separate because the 'F' forces a one-character grade */ 
    } 
    /* This is stuck on so that if there is a '+' or '-', the string does not go un-terminated. */ 
    result[2] = '\0'; 

    return result; 
}