我正在尝试编写一个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“
按任意键继续。 。
答案 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>
。