2015-10-09 139 views
1

我正在编写一个GPA计算器程序,我想将char的值更改为不同的数字。在C++中将char转换为int

例如,如果用户输入字母aA,值将为4。这是我的程序的样子。如果我使用开关盒,我知道如何使它工作,但我想这样做。

 char userInput; 
     char A, a = 4; // i want to change the value of A, a to 4 
     char B, b = 3; // i want to change the value of B, b to 3 
     char C, c = 2; // i want to change the value of C, c to 2 
     char D, d = 1; // i want to change the value of D, d to 1 
     char F, f = 0; // i want to change the value of F, f to 0 
     int count2 = 0; 
     int count3 = 0; 
     double gpa; 

// the for loop is to make sure program will only run 3 times 
for (int i=1; i<4;i++) 
{ 
    cout << "Test #" << i << ":" << endl; 
    cout << endl; 

    // the do while loop is being used to ensure that the user gets to 
    // input at least once. 
    do 
    { 
    cout << "Enter a Letter Grade (enter 'X' to exit): "; 
    cin >> userInput; 
     // the while loop is only being used for input valiation. 
    while (userInput!='A' && userInput!='a' && userInput!='B' && 
      userInput!='b' && userInput!='C' && userInput!='c' && 
      userInput!='D' && userInput!='d' && userInput!='F' && 
      userInput!='f' && userInput !='X' && userInput !='x') 
      { 
      cout << "\n Invalid letter grade, please try again.\n"; 
      cout << "\n Enter Letter Grade (enter 'X' to exit):"; 
      cin >> userInput; 
      } 
    //line number 80 will add the values of the userInput together.  
    count2+=userInput; 

// line 83 is a counter that holds the number of times the loop 
// as excuted 
    count3++; 
     // line 88 will get a grade point average by dividing count3 
// by count2 
    cout << fixed << showpoint << setprecision(2); 
    gpa = count2/count3; 


     } while(userInput !='X' && userInput!='x'); 


    cout << "Total Grade Point: " << count2 << endl; 
    cout << "GPA: " << gpa << endl; 
    } 

如果我的问题太模糊,请让我知道,所以我可以澄清。

+1

为什么要避免'switch'语句?这是一个有效且直接的解决方案。 –

+0

请参阅'std :: tolower'和'std :: toupper',这样您只需进行一半的比较。 –

+0

原因是因为我们必须制作这个项目的流程图,我很困惑,试图制作流程图,所以我想让我能理解的东西而不是将不完整的想法放在一起。 – Onsketch

回答

0

谢谢各位的帮助。这就是我解决问题的方法。我打算过一段时间发布,但只是忘了。

char userInput; 

// the for loop is to make sure program will only run 3 times 
for (int i=1; i<4;i++) 
{ 
int count2 = 0; 
double count3 = 0.0; 
double gpa; 
cout << "Test #" << i << ":" << endl; 
cout << endl; 

    // the do while loop is being used to ensure that the user gets to 
    // input at least once. 
    do 
    { 
    cout << "Enter a Letter Grade (enter 'X' to exit): "; 
    cin >> userInput; 

     // the while loop is only being used for input validation. 
     while (userInput!='A' && userInput!='a' && userInput!='B' && 
      userInput!='b' && userInput!='C' && userInput!='c' && 
      userInput!='D' && userInput!='d' && userInput!='F' && 
    userInput!='f' && userInput !='X' && userInput !='x') 
    { 
cout << "\n Invalid letter grade, please try again.\n"; 
cout << "\n Enter Letter Grade (enter 'X' to exit):"; 
cin >> userInput; 
    } 

    if(userInput !='X' && userInput !='x') 
    { 
int grade=func(userInput); 

// count2 will add the values of the userInput together 
count2+=grade; 

// count3 is a counter that holds the number of times the loop 
// as execute. 
count3++; 
    } 
cout << fixed << showpoint << setprecision(2); 
// to get the grade point avarage you need to divide count3 by count2 
    gpa = count3/count2; 

} while(userInput !='X' && userInput!='x'); 

// the next few lines will display the information gathered 
cout << endl; 
cout << "Total Grade Points: " << count2 << endl; 
cout << "GPA: " << gpa << endl; 
cout << endl; 
cout << endl; 

} 

return 0; 
} 


int func(char userInput) 
{ 
// grade is being set to zero so there is a less chance of getting wrong 
// data   
int grade=0; 
// this will make the userInput into a capital letter 
userInput=toupper(userInput); 
// we are setting value to equal the ascii number of the chosen 
// letter 
int value=userInput; // if input='A' then value = 65 
// by subtracting 69 by the value it will help get us the point value 
// we need. 
grade=69-value; // gpa=4 
// if the number value of grade becomes negative it will assign grade 
// to store the number 0 
if(grade<0)grade=0; 
return grade; 
} 
2

如果你看看ASCII表格,你会发现字母只是数字。

http://www.asciitable.com/

可以计算使用简单的减法抵消:

'a' - 'a' == 0 
'b' - 'a' == 1 
'c' - 'a' == 2 

等。将其转换为GPA等级,你可以做一个简单的换算:

int deltaA = (int)('a' - 'a'); // explicit cast to int is not really needed 
int max = 4; 
int grade = max - deltaA; 

替代的解决方案是使用地图:

std::map<char, int> grades; 
grades['a'] = 4; 
grades['b'] = 3; 
grades['c'] = 2; 
... 
int score = grades['a']; // score == 4 

这将是一个好主意,坚持用大写或小写字母。您可以使用int std::tolower(int ch)int std::toupper(int ch)函数进行转换。把char转换成int就可以了 - 两者都是整数,int的范围更广,char也适合。

反过来 - 并不那么容易。 int的范围比char更宽,您应该检查在转换回来之前,您的int值是否在char范围内。

1

几件事...

char A,a = 4; 创建字符VARIABLES(存储位置)并将变量赋值为4.变量表示存储位置,用于存储信息的位置。这是该存储位置的人类可读表示。这不是一个翻译机制。字符'a'是可以存储在变量中的ASCII代码表示的值,十六进制值是61或十进制97.变量a与字符值'a'不同。并将一个小数点4存储到一个字符变量中将其设置为EOT字符。

最好的选择是使用开关。它工作正常。

在使用它们之前初始化变量是最佳实践。您的计数器可能会从零开始,但取决于编译器,它们可能包含随机值。在进入循环之前将它们设置为零。