2013-09-24 4 views
0

나는이 코드를 실행하려고 애 쓰고 있습니다. 나는 내가 입력 한 float 값이 float와 동일한 데이터 유형인지 여부를 식별하려고합니다. 이것은 나의 코딩이다.데이터 형식 변환을 사용하여 플로팅 할 문자열

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    float x1, y1, x2, y2, x3, y3, percentage; 
    string sym1, sym2; 
    int count; 

    cout<<"Enter the first fraction : "; 

    do{ 
     cin>>x1>>sym1>>y1; 

     if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1)) 
     { 
      cout<<"Please enter the correct fraction : "; 
     } 
     else if(sym1 != "/") 
     { 
     cout<<"Sorry. This is not a fraction. Please enter again : "; 
     } 
     else 
     { 
      break; 
     } 
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1)); 

    cout<<"Enter the second fraction : "; 

    do{ 
     cin>>x2>>sym2>>y2; 

     if(x2 != float(x2) || sym2 != string(sym2) || y2 != float(y2)) 
     { 
      cout<<"Please enter the correct fraction : "; 
     } 
     else if(sym2 != "/") 
     { 
      cout<<"Sorry. This is not a fraction. Please enter again : "; 
     } 
     else 
     { 
      break; 
     } 
    }while(x2 == float(x2) || sym2 == string(sym2) || y2 == float(y2)); 

    x3 = x1 * x2; 
    y3 = y1 * y2; 

    percentage = (x3*100)/y3; 

    cout<<x1<<"/"<<y1<<" and "<<x2<<"/"<<y2<<" is "<<x3<<"/"<<y3<<"\n"; 
    cout<<x3<<"/"<<y3<<" is "<<percentage<<"%"; 

    return 0; 
} 

내가 변화하기 위해 노력하고있어 코드의 조각이

do{ 
     cin>>x1>>sym1>>y1; 

     if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1)) 
     { 
      cout<<"Please enter the correct fraction : "; 
     } 
     else if(sym1 != "/") 
     { 
     cout<<"Sorry. This is not a fraction. Please enter again : "; 
     } 
     else 
     { 
      break; 
     } 
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1)); 

는 내가 4/6 또는 기타 관련 부분 형식을 입력 할 때, 제대로 읽는 것입니다. 동일하게 4 * 6으로 가면 예상 출력이 인쇄됩니다. 하지만/6 또는 6/a를 입력하면 논리 오류가 발생하며 무한 루프가됩니다. if 문과 while 문에서 데이터 변환의 어딘가 에서처럼 잘못되었습니다. 또는 사용 된 데이터 유형이 잘못 되었기 때문입니까? 나는 그 문제가 무엇인지 추적 할 수 없었다. 이 작업을 수행하는 방법에 대한 해결책이 있습니까? 도와주세요. 형제 자매들에게 미리 감사드립니다.

+1

코드에 주석을 추가 할 수 있습니까? 무슨 일이 일어나고 있는지 전혀 모르겠다 : -/ – Swanand

+0

'cin >> sym1'은 문자열이기 때문에 어떤 문자든지 받아 들여질 것이기 때문에 cin에 남아있는 모든 것을 펌프 처리한다. 당신이 들여다보고 싶은 것은 렉서이다. . –

+0

Alexis Wilke 어때? 그것이 효과를 낼 것인가? –

답변

1

이러한 비교가 false를 반환 할 방법이 없습니다.

if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1)) 
{ 
    cout<<"Please enter the correct fraction : "; 
} 

x1y1는 수레, 그리고 그들이 어떤 식 으로든 자신의 값을 변경하지 않습니다 떠 캐스팅. std::string 비교 연산자도 문자열의 내용을 비교하므로이 비교도 항상 true를 반환합니다.

무한 루프로 연결되는 루프 조건과 동일한 문을 사용하고 있습니다. 두 조건 모두에 대해서만 if(sym1 != "/")을 사용해보십시오 (더 나은 결과 : 비교를 한 번만 평가하고 결과를 부울로 저장하십시오. 나중에 두 번 작업하면 나중에 뭔가를 변경하고 어디서나 변경하는 것을 잊어 버리는 버그가 발생합니다).

operator>>의 작동 방식에 대한 자세한 내용은 다음을 참조하십시오. cppreference

인용구 :

11 C++ 때까지

추출에 실패한 경우 (숫자가 예상되는 곳에 편지가 입력 된 예를 들면 경우) 값이 수정되지 않으므로 failbit가 설정된다.

11 C++ 버젼 :

추출에 실패하면 제로 값으로 기록되고 failbit 설정된다. 추출 값이 너무 크거나 작아서 값에 맞지 않으면 std :: numeric_limits :: max() 또는 std :: numeric_limits :: min() 값이 기록되고 failbit 플래그가 설정됩니다.

+0

값이 부동 소수점이 아닌 경우 x1과 y1의 수를 어떻게 비교해야합니까? 예를 들어, 나는 그것들을 'float x1, y1;'으로 선언했습니다. 어떻게 선언했는지 데이터 유형에 반드시 일치시켜야합니까? 그래서 변수 값이 float 데이터 유형에 없으면 false를 반환하도록 'x1! = float (x1)'로 만들었습니다. 그러나 여전히 아무 소용이 없습니다. –

+0

플로트에 비 플로트 데이터가있을 수 없습니다.이 비교가 false가되는 유일한 이유는 값이 NaN 인 경우이지만, 여기에서는 그럴 수 없습니다. – Hulk

+0

좋습니다. 나는 다시 시도하고 당신에게 돌아올 것입니다. 작동 할 때 코드 조각을 보여 드리겠습니다. 감사합니다 :) –

관련 문제