2017-10-20 12 views
2

0부터 10 사이의 숫자를 받고 유효 함을 나타내는 메시지를 표시하는 프로그램을 작성하고 싶습니다. 그렇지 않다면 유효한 번호를 계속 요구해야합니다.char가 부동, 부동 한 코드 및 부적합한 결과로 변환되지 않음

나는 모든 것을 코딩 할 수 있으며 나에게 꽤 괜찮은 것처럼 보이지만 제대로 작동하지 않습니다.

비슷한 문제가 많은 주제를 보았지만 문제를 해결할 수 없었습니다. 내 말은, 약간의 진전이 있었지만, 제 코드는 아직 작동하지 않습니다.

내가 한 일 : 삽입 된 값을 저장하기 위해 변수를 만들었고, ctype 라이브러리를 사용하여 숫자를 허용하고, char을 부동 상태로 변환하고, 요구 사항을 충족하는지 확인했습니다.

나는 여러 가지 코드를 시도했다. 나는 그 코드를 많이 봤는데, 지금 내가 뭘해야하는지 잘 모른다.

코드 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 nd 초기화를 수행했지만 scanf를 사용하여 값을받는 데에도 효과적이었습니다.

마지막으로 배열이 될 수 있다고 생각했습니다. 내가 그랬어 :

코드 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는 0을 반환 할 수 보았다. 그래서

, 나는이 모델을 사용하던하려고 노력 마지막 일 : (인터넷에서도 발견) 마지막으로

double atof(const char *str) 

코드 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: 

나는 벗어날 수 없었다.

나는 그것을 디버깅하여 두 번째로 붙어있는 것을 알았다.

값을 다시 인쇄하려고했는데 다른 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"); 
}