grade() で、else は if (temp == 'D') にだけ対応しています。temp が 'A'
の場合、temp は 'D' でないので、"エラーです..." になるのは当然です。
2番目以降の if を全部 else if に変えてみてください。
grade2() で math は int です。cin >> math; で 'A' を入力すると、数値の
読み込みに失敗し、cin の内部の iostate の fail ビットが立ちます。
この状態を clear で初期化しない限り、以後の cin からの読み込みはすべて
エラーになります。
改善案
コード:
#include <iostream>
using namespace std;
void grade2()
{
int math;
cout << "成績(1~4)を入力してください" << endl;
while (1) {
cout << "math: ";
cin >> math;
if (!cin) { // 読み込み失敗か
cout << "エラーです。" << endl;
cin.clear(); // 正常状態に戻す
while (cin.get() != '\n') ; // 行末まで読み飛ばす
continue;
}
if (math >= 1 && math <= 4)
break;
cout << "エラーです。" << endl;
}
}
int main()
{
grade2();
}