1

Switchステートメントでif条件を適用する方法、平均を計算したい:しかし、問題を解決するために最善を尽くしましたが、まだSwitchステートメントから出力が得られません。私はC++の初心者ですが、

#include <iostream>

using namespace std;

int main()
{
    //declaration of variables.
    int sub1,sub2,sub3, sub4,sub5,total,avg;

    //accepting marks from user in each subject
    cout << " Enter Programming in C++ Marks: " << endl;
    cin >> sub1;
    cout << " Enter Software Engineering Marks : " << endl;
    cin >> sub2;
    cout << " Enter Personal Communication Marks : " << endl;
    cin >> sub3;
    cout << " Enter Database Application Marks: " << endl;
    cin >> sub4;
    cout << " Enter Computer Concept Marks: " << endl;
    cin >> sub5;

    //calculatin sum of marks obtained in each subject
    total = (sub1 + sub2 + sub3 + sub4 + sub5);

    //calculating the average marks
    avg = total / 5;

    // starting of if condition for finding out grades of total subjects.

    switch (avg){
      case 1:{
        if ((avg >= 80) && (avg <= 100))
        {
            cout << " Your Average is: " << avg << endl;
            cout << "You Grade is A+ " << endl;
        }
        break; 
      }
      case 2:{
        if ((avg >= 70) && (avg <= 79))
        {
            cout << " Your Average is: " << avg << endl;
            cout << " Your grade is A " << endl;
        }    
        break;
      } 
      case 3:{
        if ((avg >= 60) && (avg <= 69))
        { 
            cout << " Your Average is: " << avg << endl;
            cout << " Your Grade is B+  " << endl;
        }   
        break;  
      }
      case 4:{
        if ((avg >= 50) && (avg <= 59))
        {
            cout << " Your Average is: " << avg << endl;
            cout << " Your Grade is C+ " << endl;
        }
        break;
      }
      case 5: {
        if ((avg >= 40) && (avg <= 49))
        {
            cout << " Your Average is: " << avg << endl;
            cout << " Your Grade is  C- ! " << endl;
        }
        break;    
      }
      case 6: {
        if ((avg >= 30) && (avg <= 39))
        {
            cout << " Your Average is: " << avg << endl;
            cout << " Your Grade is  D ! " << endl;
        }
        break; 
      }

      default:{ 
        if ((avg >= 100) && (avg <= 29))
        {
            cout << " Your Average is: " << avg << endl;
            cout << " Your Grade is  F, So you are Fail in the class ! " << endl;
            break;
        }
      }
    }

    system("pause");
}
4

8 に答える 8

7

さて、sをあなたがそれを与えた変数switchと比較します。caseそれで、case 1それはそれと比較しようとavg1その後それはあなたのif声明に続くでしょう、それはもちろん決して当てはまりません。

あなたがそこで何をしようとしているのかよくわかりません。すべてから私はあなたがネストされた方が良いことがわかりますif

if ((avg >= 80) && (avg <= 100))
{
  cout << " Your Average is: " << avg << endl;
  cout << "You Grade is A+ " << endl;
} else if ((avg >= 70) && (avg <= 79))
{
  cout << " Your Average is: " << avg << endl;
  cout << " Your grade is A " << endl;
} else if ((avg >= 60) && (avg <= 69))
{ 
  cout << " Your Average is: " << avg << endl;
  cout << " Your Grade is B+  " << endl;
} ...

しかし、それでもあなたのスキルに応じて、よりエレガントに扱うことができます。たとえば、平均を10で除算してそれを使用switchし、整数除算が切り捨てられるという事実を利用して、同じバケット間50および59同じバケットにすべてを折りたたむことができ5ます。

switch (avg / 10) {
  case 10:
  case 9:
  case 8:
    cout << " Your Average is: " << avg << endl;
    cout << "You Grade is A+ " << endl;
    break;
  case 7:
    cout << " Your Average is: " << avg << endl;
    cout << "You Grade is A " << endl;
  ...
}

また、あなたはあなたが印刷することに気付くでしょう»あなたの平均は:... «毎回、あなたは条件の前にその行を動かすことができます:

cout << " Your Average is: " << avg << endl;
switch (avg / 10) {
  ...
}

if最後に、考えられる結果のリストは非常に少ないため、 /else ifまたはswitch:を必要とせずに、それらを配列に収集し、適切な配列要素を参照するだけで済みます。

char[][] grades = {
  "F", "F", "F", "D", "C-", "C+", "B+", "A", "A+", "A+", "A+"
};
char[] grade;
if (avg > 100)
  grade = "F";
else
  grade = grades[max(0, avg / 10)];

cout << " Your average is " << avg << endl;
cout << " Your grade is " << grade << endl;
于 2012-07-16T13:34:40.880 に答える
7

switch ステートメントは、特定の値に依存する 1 つのコード ブロックを実行するために使用されます。ある意味では、switch ステートメントは if ステートメントの形式と考えることができます。

switch (avg) {
   case 1 : { /* code block 1 */ } break;
   case 2 : { /* code block 2 */ } break;
   default : { /* code block default */ } break;
}

として読むことができます

if (1 == avg) { /* code block 1 */ }
else if (2 == avg) { /* code block 2 */ }
else { /*code block default */ }

あなたのスイッチステートメントは次のように読むことができます

if (1 == avg) 
{
   if ((avg >= 80) && (avg <= 100))
   {
      cout << " Your Average is: " << avg << endl;
      cout <<  "You Grade is A+ " << endl;
   }
} else if...

avg が == 1 で、80 より大きく 100 より小さいということはありません。そのため、出力が得られません。

C++ では、switch ステートメントは範囲のテストには適していません。if ステートメントを使用するだけです。

if ( (avg<=100) && (avg >=80))
{
   // you get an A
} else if ...

ただし、本当にスイッチを使用する必要がある場合は、いくつかの方法があります。

switch (avg) {
   case 100:
   case 99:
   case 98:
   ...
   case 80 : { /* you get an A+ */ break; }
   case 79 :
   case 78 : 
   ...
   case 70 : { /* you get a A */ break: }
etc.

これは醜いですが、switch ステートメントです。switch ステートメントを使用するよりクリーンな方法は、範囲の代わりに avg を個別の値に「強制」することです。

int percentile = avg / 10;  // integer division. 

avg が 0 から 100 の間であると仮定すると、範囲は 0 から 10 の間になります。これにより、切り替えが少しきれいになります。

switch (percentile) { 
   case 10 :
   case 9:
   case 8: /* You get an A+ */ break;
   case 7: /* You get an A */ break;
   case 6: /* You get a B+ */ break;

etc.

これが役に立てば幸いです。

于 2012-07-16T13:44:46.337 に答える
3

switch ステートメントは、提供された場合に備えて入力を取得しないため、コードは常にデフォルトのステートメントで実行されます。

于 2012-07-16T13:42:00.673 に答える
2

あなたは少し間違ってスイッチを使用しています、それはif問題ではありません。これ:

switch (avg){
    case 1:{
        if ((avg >= 80) && (avg <= 100))
        {
            cout << " Your Average is: " << avg << endl;
            cout << "You Grade is A+ " << endl;
        }
        break;

と同じ意味

if( avg == 1 )
{
    if ((avg >= 80) && (avg <= 100))
    {
        cout << " Your Average is: " << avg << endl;
        cout << "You Grade is A+ " << endl;
    }
}

したがって、明らかに条件が満たされることはありません。特定のケースでは、スイッチを取り外して、sだけを残すことができますif

于 2012-07-16T13:34:21.400 に答える
2

削除するSwitch- caseと、この場合は常にデフォルトで行われるため、目的の出力が得られます。

于 2012-07-17T14:04:59.663 に答える
1

あなたが言う時

Switch(avg)

{
   case 1:
   break;
}

と言うのと同じif(avg == 1)です。だからあなたのスイッチケースを取り外して、このように扱ってください

if ((avg >= 80) && (avg <= 100))
//do this
else if ((avg >= 70) && (avg <= 79))
//do that
于 2012-07-16T13:34:46.283 に答える
0

最善かつおそらく最も簡単な方法は、switch ステートメントを取り除き、"if" と "elseif" を使用することです。

于 2012-07-16T14:08:00.430 に答える
0

1、2、3 のような場合は、switch ステートメントによって avg の値として認識されます。

switch() コントロールは特定の値でのみ使用でき、間隔では使用できません。この場合、else if{} 構造を使用することをお勧めします。

または、複数のケースで 1 つのステートメントを実装できます (ただし、読み取りはできません)。

switch(avg){
   case 80: case 81: case 82:   //do this until 100

      cout << " Your Average is: " << avg << endl;
      cout << "You Grade is A+ " << endl;
      break;
}

また、ケースごとにスコープ (中括弧) を使用する必要はありません。

于 2012-07-16T13:44:26.290 に答える