Home > Blockchain >  Is there any way to enter 10 students detail in parameterized constructor and print it using member
Is there any way to enter 10 students detail in parameterized constructor and print it using member

Time:11-14

I tried this code but when I am calling the member function inside the loop it is giving the garbage value of the details and when I am calling the member function outside the loop it is giving me error.

#include<iostream>
#include<string.h>

using namespace std;
class student
{   
  char name[10];
  int id,rollno;
  public:
  student(char name[10],int id,int rollno)
{
  strcpy(this->name,name);
  this->id=id;
  this->rollno=rollno;
    cout<<"the name of the student is:"<<name<<endl;
    cout<<"the id of the student is:"<<id<<endl;
    cout<<"the roll no of the student is:"<<rollno<<endl;
}

};

int main()
 {

 int id1,rollno1;
 char name1[10];
 for(int i=1;i<=2;i  )
{  
    cout<<"             enter the detail of the student "<<i<<"                       "<<endl;
    cout<<"enter the name of the student:";
    cin>>name1;
    cout<<"enter the id of the student:";
    cin>>id1;  
    cout<<"enter the roll no of the student:";
    cin>>rollno1;
    student d[]={student(name1,id1,rollno1)};
   d[i].print();
}

return 0;
}

CodePudding user response:

You do not have a print member function. You are initializing different arrays with one element inside the loop, if you want an array of n students, declare it outside the loop. Something like this (note the comments):

class student {
    std::string name;  // use string type
    int id, rollno;

   public:
    student(){}; // you need default contructor to declare the array

    student(std::string name, int id, int rollno)
        // propper way to initialize members
        : name(name), id(id), rollno(rollno) { }

    void print() { // create a print member
        std::cout << "Printing: " << name << " " << id << " " << rollno << "\n";
    }
};

int main() {

    student d[3]; // declare array (or 10, if you want 10 students)
                  // note that you can use std::array
                  // or std::vector for VLAs

    int id = 0;
    int rollno = 0;
    std::string name;

    for (auto& s : d) { // range based loop

        std::cin >> id >> name >> rollno; // not adding input validation, 
                                          // but you should do it
        s = {name, id, rollno};
        s.print();
    }
}

Live demo

I would also avoid using namespace std, it's pratical, I admit, but can cause all kinds of trouble, more info here.

CodePudding user response:

Here's your code review.

#include <iostream> 
#include <string.h>

using namespace std; // it is strongly suggested that you don't use the whole header unless your intent is speeding up coding
class Student // capitalize classes
{
    char _name[10];// it is ok, however, if you use the <string> header, why would you go back to char type?
    int _id, _rollno;
public:
    Student(char name[10] /* this is just the array's first item passed! */, int id, int rollno)
    {
        // Don't use this->, use an underscore for one of the names. 
        // I use underscores for the encapsulated data
        strncpy_s(_name, name, 9);// a safer version
        _id = id; 
        _rollno = rollno;
        cout << "\nCtor says: ";
        cout << "the name of the student is: " << _name << endl;
        cout << "the id of the student is: " << _id << endl;
        cout << "the roll no of the student is: " << _rollno << endl;
        cout << '\n';
    }
    const char* getName() { return _name; }
    const int getId() { return _id; }
    const int getRollNo() { return _rollno; }
    // unless you overload operator<< , you have to make getters for your info, or make it public
};

int main()
{
    int id, rollno;// why 1? they won't intersect with the function
    char name[10];
    Student *s[2];//you must make that on the heap; otherwise you need a default constructor

    for (int i{ 0 }; i < 2; i  )// start with 0 and make it just <
    {
        cout << "enter the details of the student " << i << endl;// Why so many spaces?
        cout << "enter the name of the student: "; // add space after the colon
        cin >> name;// remember, you're limited to 9 chars   \n !!!
        cout << "enter the id of the student: ";
        cin >> id;
        cout << "enter the roll no of the student: ";
        cin >> rollno;
        //student d[] = { student(name,id,rollno) }; // you can't do this. It's not flexible.
        // You either assign enough space for the intended number of students in the stack, statically, or 
        // you lett it find more space in the heap = dynamically

        //this goes to the heap
        s[i]= new Student( name,id,rollno );// parentheses are well
        //s[i] = new Student{ name,id,rollno };// initializer list may also do

        //d[i].print();// what's to print here? It's not POD, cout needs instructions
        cout << "Stored data -> Id: " << 
            s[i]->getId() << ", Name: "  // -> dereferences the pointer, and s is a pointer now
            << s[i]->getName() << ", Roll no: " 
            // or you can dereference it
            << (*s[i]).getRollNo() 
            << endl << endl; // make some extra space here
        
    }

    return 0;
}
  •  Tags:  
  • c
  • Related