0

学校のプロジェクトで Turbo C++ を使用しています。非常に古いもので、コード ブロックまたは MVC++ を使用する必要があることはわかっていますが、学校用の単純なプログラムに使用しているだけです。さて、私の問題は、char配列を出力できないことです。これが私の簡単なコードです

#include <iostream.h>
#include <conio.h>

class abc
{
    private:
            int rno,m1,m2,tot;
            char sname[10],grade;
    public:
            void getinput()
            {
                cout<<"Enter roll no:"<<endl;
                cin>>rno;
                cout<<"\nEnter mark 1:"<<endl;
                cin>>m1;
                cout<<"\nEnter mark 2:"<<endl;
                cin>>m2;
                cout<<"\nEnter student name:"<<endl;
                cin>>sname;
                cout<<endl;
                // Getting the returns.
                //tot = gettotal();
                //grade = getgrade();
            }

            void gettotal()
            {
                tot = m1+m2;
                // Returning the total to getinput's "tot" part.
                //return (tot);
            }

            void getgrade()
            {
                if(tot >= 150)
                {
                    grade = 'A';
                }
                else if(tot >= 100)
                {
                    grade = 'B';
                }
                else
                {
                    grade = 'C';
                }
                // Returning the total to getinput's "grade" part.
                //return (grade);
            }

            void display()
            {
                cout<<sname<<"'s total grade ranks: "<<grade;
            }
 };


 void main()
 {
    abc a;
    a.getinput();
    a.gettotal();
    a.getgrade();
    a.display();
 }

As you can see, it asks for marks 1 and marks 2 and then calculate it and prints 'A','B' and 'C' depending on marks.

Okay so what I want is to print 'First','Second' and 'Third' instead of A,B,C.

Can someone help me on this please.

Thanks.

4

3 に答える 3

1

物事をさらに明確にするために、何かを追加できるかもしれません。char 配列とポインターの違いを理解する必要があります。ポインタは、メモリ内のある領域を指す単なる変数です。mallocアドレスを記憶して格納することができますchar*- これは char 配列と同様に動作します。しかし、それは同じではありません。

char 配列 (および C/C++ の任意の配列) は、コンパイル時に既知のサイズである必要があります。mallocコンパイラは、実行時にまたはを介して割り当てるのではなく、このメモリを静的に「割り当て」ますnew。この配列は、暗黙的に に変換できるようになりましたchar*。これは、たとえば、印刷するときに発生します。次のコードを見てください。

char* foo = "Hello world";

これが実際に行うことは、次のようなものです。

// Compiler generated "global constant",
// somewhere in your executable
const char fooString[] = "Hello world";

char* foo = fooString;

コードで使用する文字列リテラルごとに、コンパイラはそのような「グローバル定数」を生成します。char ポインターに代入することにより、ポインターはその定数のメモリ アドレスを指すようになるため、印刷、インデックス付け ( foo[2])、コピーなどを行うことができます。

char 配列を使用している場合、コンパイラはコンパイル時にスペースも割り当てます。char sname[10]たとえば、クラスのすべてのオブジェクトに(abc他のメンバーなどに加えて)10文字のメモリが含まれるようsnameになります。コードで参照すると、タイプは になりますがchar[10]、(暗黙的に)achar*`に変換できます配列の最初の文字を指しています。それでは、次のコードを見てみましょう。

grade = "First";
grade = "Second";
grade = "Third";

文字列リテラルがグローバル定数に変換されることを思い出すと、実際には次のようになります。

const char[] str1 = "First";
const char[] str2 = "Second";
const char[] str3 = "Third";

grade = str1;
grade = str2;
grade = str3;

ご想像のとおり、これは が char ポインターの場合にうまく機能gradeします。定数文字列リテラルの 1 つを指すだけで、それを出力するなどに使用できます。しかし、gradeが配列の場合、コンパイラーはchar*char[]- これは不可能です。しかし、使用することは可能strcpyです-なぜですか?strcpy引数として char ポインターを取るためです。したがって、コンパイラは暗黙的に char 配列gradeをその最初の要素へのポインタに変換し、これを に渡しstrcpyます。

于 2013-01-14T10:55:15.323 に答える
1

このアプローチを試してください:

enum Grade{
    A,
    B,
    C,
};

const char * GetGradeStr(Grade grade){
    switch(grade){
    case A:return "First";
    case B:return "Second";
    case C:return "Third";
    }
}

char sname[10];
Grade grade;

...
    grade = A;

...
    cout<<sname<<"'s total grade ranks: "<<GetGradeStr(grade);

これはグレードを列挙型にします。つまり、3 つの値のみが有効な値であり、正しい文字列を「文字列リテラル」として返します。

于 2013-01-14T10:26:39.230 に答える
0

gradechar *ではなくcharに定義しました。それをchar *になるように更新してください。その後、「First」などの値を割り当てることができます

編集

#include <iostream.h>
#include <conio.h>

class abc
{
    private:
            int rno,m1,m2,tot;
            char sname[10];
            char * grade;
    public:
            void getinput()
            {
                cout<<"Enter roll no:"<<endl;
                cin>>rno;
                cout<<"\nEnter mark 1:"<<endl;
                cin>>m1;
                cout<<"\nEnter mark 2:"<<endl;
                cin>>m2;
                cout<<"\nEnter student name:"<<endl;
                cin>>sname;
                cout<<endl;
                // Getting the returns.
                //tot = gettotal();
                //grade = getgrade();
            }

            void gettotal()
            {
                tot = m1+m2;
                // Returning the total to getinput's "tot" part.
                //return (tot);
            }

            void getgrade()
            {
                if(tot >= 150)
                {
                    grade = "First";
                }
                else if(tot >= 100)
                {
                    grade = "Second";
                }
                else
                {
                    grade = "Third";
                }
                // Returning the total to getinput's "grade" part.
                //return (grade);
            }

            void display()
            {
                cout<<sname<<"'s total grade ranks: "<<grade;
            }
 };


 int main()
 {
    abc a;
    a.getinput();
    a.gettotal();
    a.getgrade();
    a.display();
 }
于 2013-01-14T10:04:35.290 に答える