如何从复合中停止这些if else语句?

时间:2017-06-20 04:31:27

标签: c++ if-statement

我正在尝试编写一个c ++程序,该程序从文本文件中读取输入,并使用十点分级比例分配成绩,然后在屏幕上打印结果。 我认为我的问题可能在于函数deriveGrade中的if else语句,而不是递增枚举,它们似乎在总结增量。任何帮助将不胜感激,谢谢。

#include <iostream>
#include <string>
#include <iomanip>
#include <cmath>
#include <fstream>

using namespace std;
int deriveGrade(double avarage);
enum letter_grade { A, B, C, D, F };

namespace tenPoint
{
    letter_grade deriveGrade(double avarage);
    char grade;
}

using namespace tenPoint;

int main()
{
    string name;
    double average;

    ifstream inData;    // Is the variable for input data from the file.

    inData.open("student_status.txt", ios::in);

    while (!inData.eof())
    {

        getline(inData, name);
        inData >> average;
        inData.ignore();
        grade = ::deriveGrade(average);

        cout << name << " " << average << " " << char(grade) << endl;

    }

    inData.close();

    return 0;
}


int deriveGrade(double average)
{


    if (average >= 90)
    {
        grade = static_cast<letter_grade>(grade + 65);
    }
    else if (average >= 80 && average < 90)
    {
        grade = static_cast<letter_grade>(grade + 1);
    }
    else if (average >= 70 && average < 80)
    {
        grade = static_cast<letter_grade>(grade + 2);
    }
    else if (average >= 60 && average < 70)
    {
        grade = static_cast<letter_grade>(grade + 3);
    }
    else if (average <= 50)
    {
        grade = static_cast<letter_grade>(grade + 4);
    }
    else
    {
        cout << "Invalid entry." << endl;
    }

    return grade;
}

从文件输入:

  

Doe,John K。

     

93.2

     

Andrews,Susan S。

     

84.7

     

梦露,玛丽琳

     

75.1

     

加斯顿,亚瑟C.

     

62.8

     

Harpo,Joanie Y。

     

42.7

     

Ginger,Fred T。

     

95.8

节目输出:

   Doe,John K. 93.2 A

     

Andrews,Susan S. 84.7 B

     

Monroe,Marylin 75.1 D

     

Gaston,Arthur C. 62.8 G

     

Harpo,Joanie Y. 42.7 K

     

Ginger,Fred T. 95.8“

     

按任意键继续。 。

2 个答案:

答案 0 :(得分:2)

你的程序的逻辑很奇怪,但是可以在不深入你的任务的情况下给出一些常见的评论。

请注意,虽然您逐个使用if... else语句,如

if (average >= 90)
{
    grade = static_cast<letter_grade>(grade + 65);
}
else if (average >= 80 && average < 90)
{
    grade = static_cast<letter_grade>(grade + 1);
}
...

average < 90发现错误后,无需检查else分支中的average >= 90。所以至少代码可以更短:

int deriveGrade(double average)
{
    if (average >= 90)
    {
        grade = static_cast<letter_grade>(grade + 65);
    }
    else if (average >= 80)
    {
        grade = static_cast<letter_grade>(grade + 1);
    }
    else if (average >= 70)
    {
        grade = static_cast<letter_grade>(grade + 2);
    }
    else if (average >= 60)
    {
        grade = static_cast<letter_grade>(grade + 3);
    }
    else if (average <= 50)
    {
        grade = static_cast<letter_grade>(grade + 4);
    }
    else // check here! Invalid interval is for values between 50 and 60?
    {
        cout << "Invalid entry." << endl;
    }

    return grade;
}

但这并不是一个显着的改进......更好的制作公式并使用单一陈述并赋值给grade = ...

<强>更新

还有一条评论。如果您知道不可接受的值的间隔,请先检查它(在所有其他计算之前):

int deriveGrade(double average)
{
    // check the correctness of argument first
    if (average > 50 && average < 60)
    {
        cout << "Invalid entry." << endl; // notification
        return  grade; // previous value
                       // also consider returning special value for error case
    }
    // calculate value for grade
    grade = ...
    // return updated value
    return grade;
}

部分“计算成绩价值”是适合您的,在编写这部分代码时请记住:

  • 三元操作操作对于一种特殊情况是有用的,例如grade = (average >= 90)? 65 : floor(100 - average) / 10;

  • 在函数中使用全局值(如grade)是不好的做法,并且基于全局变量的初始值正确的假设来制作逻辑

答案 1 :(得分:0)

原因是您要在不清除grade变量的情况下添加deriveGrade变量,因此先前操作的结果将在char grade;中继承。 我的建议是删除命名空间中的全局deriveGrade,在main中使用局部变量,在grade中使用其他局部变量。

如果你查看你的功能代码,如果你的成绩高于90,char deriveGrade( double average ) if( average > 90.0 ) { return 'A'; } else if( average > 80.0 ) { return 'B'; } ... 只会添加65(要制作一个ASCII'A')。然而,每次后续添加都会假装这个添加已经发生。如果您改为确保其他每个不依赖于之前的if或else if代码,那么您的代码应该更正确。

grade

此解决方案甚至无需在deriveGrade中使用enum letter_grade : char { A = 'A', B = 'B', C = 'C', D = 'D', F = 'F' }; 变量 使用你很好创建的枚举的更好的替代方案是:

(char)letter_grade

允许您通过deriveGrade在枚举表示和字符之间进行切换(而您的letter_grade会返回<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlways" app:titleEnabled="false"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar_productdetail" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview_home_categoryfooter" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="?attr/actionBarSize" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="1.0"/> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/search_background_list" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <ProgressBar android:id="@+id/progressbar_home_loading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> <TextView android:id="@+id/textview_home_status" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/search_background_list" android:gravity="center" android:text="No Results Found" android:visibility="invisible"/> <experttag.nurserylive.util.ui.widget.CustomViewPager android:id="@+id/viewpager_home" android:layout_width="match_parent" android:layout_height="match_parent"/> <fragment android:id="@+id/fragment_search" android:name="experttag.nurserylive.fragment.SearchFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout> </android.support.design.widget.CoordinatorLayout>