2017-10-20 19 views
2

0から10までの数値を受け取り、それが有効かどうかを示すメッセージを表示するプログラムを作成したいと思います。そうでない場合は、有効な番号を要求し続ける必要があります。無効なcharのfloat型への変換、異なるコードおよび良い結果なし

私はすべてをコーディングすることができましたが、それはかなりいいようですが、正しく機能していません。

私は同様の問題で多くのトピックを見てきましたが、問題を解決できませんでした。私はいくつかの進歩を遂げましたが、私のコードはまだ動作していません。

私は何をしましたか: 挿入された値を格納するための変数を作成しました.ctypeライブラリを使用して数値を受け取り、マイチャーを浮動小数点に変換し、要件を満たしているかどうかを確認しました。

私はいくつかの異なるコードを試しましたが、私はそれをたくさん探していましたが、今は何をすべきか分かりません。

CODE 1:

#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 

main(){ 
    char grade; 
    float grade2; 

    printf("Please, insert a grade between 0 and 10.\n"); 
    printf("Grade: "); 
    scanf("%c",&grade); 

    while(isalpha(grade) || ispunct(grade) || isspace(grade) || iscntrl(grade)){ 
     printf("Please, insert a valid value.\n"); 
     fflush(stdin); 
     printf("Grade: "); 
     scanf("%c",&grade); 
    } 

    if(isdigit(grade)){ 
     grade2 = atof(grade); 
     while(grade2 < 0 || grade2 > 10){ 
      printf("\nPlease, insert a valid value.\n"); 
      fflush(stdin); 
      printf("grade: "); 
      scanf("%c",&grade2); 
     } 

     printf("Valid value.\n"); 
    } 

    else{ 
     printf("Restart the program and try again."); 
    } 

    system("PAUSE"); 
} 

コード1との大きな問題は、私はこれを取得することです:

[Error] invalid conversion from 'char' to 'const char*' [-fpermissive] 

私はちょうどそれを動作させることはできませんが、それはここで動作します(コードインターネット上に見つかりました):

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char a[10] = "3.14"; 
    float pi = atof(a); 
    printf("Value of pi = %f\n", pi); 
    return 0; 
} 

私はそれがscanf a ndの初期化を行いましたが、scanfで値を受け取っていました。

最後に、私はそれが配列であると考えました。私がやった:

CODE 2:

#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 

main(){ 
    char grade[50]; 
    float grade2; 

    printf("Please, insert a grade between 0 and 10.\n"); 
    printf("Grade: "); 
    scanf("%c",&grade[50]); 

    while(isalpha(grade[50]) || ispunct(grade[50]) || isspace(grade[50]) || iscntrl(grade[50])){ 
     printf("Please, insert a valid value.\n"); 
     fflush(stdin); 
     printf("Grade: "); 
     scanf("%c",&grade[50]); 
    } 

    if(isdigit(grade[50])){ 
     grade2 = atof(grade); 
     while(grade2 < 0 || grade2 > 10){ 
      printf("\nPlease, insert a valid value.\n"); 
      fflush(stdin); 
      printf("Grade: "); 
      scanf("%c",&grade2); 
     } 
     printf("The grade is: %f\n", grade2); 
     printf("Valid value.\n"); 
    } 

    else{ 
     printf("Restart the program and try again."); 
    } 

    system("PAUSE"); 
} 

それは常に印刷された、それは関係なく、私が書いたものの数、有効な値ません。だから、私はそれが比較された値を参照するコードを変更し、出力されました:私はそれをググ

Please, insert a grade between 0 and 10. 
Grade: 11 
The grade is: 0.000000 
Valid value. 

と私は何かが間違っている場合atofはゼロを返すことができました。だから、

、私はこのモデル使用した実行しようとしました最後のもの:(また、インターネット上で見つかった)最後に

double atof(const char *str) 

を、

CODE 3:

#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 

main(){ 
    char grade; 

    printf("Please, insert a grade between 0 and 10.\n"); 
    printf("Grade: "); 
    scanf("%c",&grade); 

    while(isalpha(grade) || ispunct(grade) || isspace(grade) || iscntrl(grade)){ 
     printf("Please, insert a valid value.\n"); 
     fflush(stdin); 
     printf("Grade: "); 
     scanf("%c",&grade); 
    } 

    if(isdigit(grade)){ 
     float atof(grade *grade); 
     while(grade < 0 || grade > 10){ 
      printf("\nPlease, insert a valid value.\n"); 
      fflush(stdin); 
      printf("Grade: "); 
      scanf("%c",&grade); 
     } 
     printf("The grade is: %f\n", grade); 
     printf("Valid value.\n"); 
    } 

    else{ 
     printf("Restart the program and try again."); 
    } 

    system("PAUSE"); 
} 

出力は:

Please, insert a grade between 0 and 10. 
Grade: 11 

Please, insert a valid value. 
Grade: 6 

Please, insert a valid value. 
Grade: 10 

Please, insert a valid value. 
Grade: 5 

Please, insert a valid value. 
Grade: 

私は中断できませんでした。

私はそれをデバッグして、それが第2の間につかまっていたことを発見しました。

もう一度値を印刷しようとしましたが、別の0.000があります...

私はインターネットで良い研究をしたので私はちょうどここに来ましたが、私はまだ私の問題を解決することはできません。

私は何か間違っている(申し訳ありませんが、ルール違反のようです)。もしそうなら、教えてください。私はそれを修正しようとします。

ご清聴ありがとうございました。

+0

あなたは 'scanf()'で半ダースの場所に入力しますが、scanfの戻り値を決してチェックせず、入力された値を決して印刷しません。デバッグする方法を学ぶ - あなたが期待しているものを手に入れていると仮定してはいけません。 –

答えて

0

のようなあなたの第二のアプローチを修正したコードの下にしてみてください。それは自明です。具体的な説明が必要な場合は、私に知らせてください。

#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 

int isnumeric_array(char *string) 
{ 
    while((char)(*string) != '\0') { 
     if(!isdigit((char)(*string))) { 
      return 0; 
     } 
     string++; 
    } 

    return 1; 
} 

int main(){ 
    char grade[128]; 
    float grade2; 

read_input: 
    memset(grade, 0x0, sizeof(grade)); 
    printf("Please, insert a grade between 0 and 10.\n"); 
    printf("Grade: "); 
    scanf("%s", grade); 

    if(isnumeric_array(grade) == 0) { 
     goto read_input; 
    } 

    grade2 = atof(grade); 
    if((grade2 < 0) || (grade2 > 10)) { 
     goto read_input; 
    } 
    else { 
     printf("You have entered right value\n"); 
    } 

    system("PAUSE"); 
} 
+0

あなたは試しましたか?それはあなたのために働いていますか? – Kamal

+0

申し訳ありませんが、回答に時間が必要でした。私は最近、他のことに集中する必要がありました。ご協力ありがとうございました。 今私は戻ってきました。 memsetに問題がありましたが宣言されていませんでしたが、いくつかの研究を行いました。#include これは完全に機能しましたが、修正を行うのに十分なプログラミングがわかりません。私はこのコードを勉強し、新しいことを学びました( "sizeof"の使用など)。本当に役に立ちました。あなたのコードはC++ですか?私が書いた人はどうですか?私はC言語を使ってやろうとしていましたが、これらの言語の間には小さな違いがあるようです。 – HansMiku

+0

そのCコード。先ほど書いたものはCのコードです。 – Kamal

0

この

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int main(void){ 
    char grade[50]; 
    float grade2;//int grade2; ? 
    int invalid;//flag 
    int i; 

    printf("Please, insert a grade between 0 and 10.\n"); 

    do { 
     invalid = 0;//false 
     printf("Grade: ");fflush(stdout); 
     fgets(grade, sizeof grade, stdin); 
     for(i = 0; grade[i] && grade[i] != '\n'; ++i){ 
      if(!isdigit((unsigned char)grade[i])){ 
       invalid = 1;//It contains illegal characters. 
       break; 
      } 
     } 
     if(!invalid){ 
      grade2 = atof(grade); 
      if(grade2 < 0 || grade2 > 10){ 
       printf("\nPlease, insert a valid value.\n"); 
       invalid = 1;//Invalid input range 
      } 
     } 
    } while(invalid); 
    printf("The grade is: %f\n", grade2); 
    printf("Valid value.\n"); 
    //printf("Restart the program and try again.");//never execute 

    system("PAUSE"); 
} 
関連する問題