Многократная запись студента с использованием структуры и функций в cpp - PullRequest
0 голосов
/ 16 февраля 2020

Я использовал структуру для многократного въезда студентов. Но я получаю ошибку в следующем коде:

#include <iostream>
using namespace std;
struct Student{
   char stuName[30];
   int stuRollNo;
   int stuAge;
};

void printStudentInfo(struct Student s[]);

int main(){
    int i;
    for(i=0;i<3;i++){
   Student s[i];
   cout<<"Enter Student Name: ";
   cin.getline(s[i].stuName, 30);
   cout<<"Enter Student Roll No: ";
   cin>>s[i].stuRollNo;
   cout<<"Enter Student Age: ";
   cin>>s[i].stuAge;
   printStudentInfo(s[i]);}
   return 0;
}

void printStudentInfo(struct Student s[i]){
   cout<<"Student Record:"<<endl;
   cout<<"Name: "<<s[i].stuName<<endl;
   cout<<"Roll No: "<<s[i].stuRollNo<<endl;
   cout<<"Age: "<<s[i].stuAge;
}

ошибка:

main.cpp:29:25: error: cannot convert ‘Student’ to ‘Student*’ for argument ‘1’ to ‘void printStudentInfo(Student*)’
    printStudentInfo(s[i]);} 
                         ^
main.cpp: At global scope:
main.cpp:33:40: error: ‘i’ was not declared in this scope
 void printStudentInfo(struct Student s[i]){ 
                                        ^
main.cpp: In function ‘void printStudentInfo(...)’:
main.cpp:35:20: error: ‘s’ was not declared in this scope
    cout<<"Name: "<<s[i].stuName<<endl; 
                    ^
main.cpp:35:22: error: ‘i’ was not declared in this scope
    cout<<"Name: "<<s[i].stuName<<endl;

Я понимаю, что мне нужно определить i в функции, но как он будет принимать значения соответственно. Если я возьму для функции l oop, значения будут напечатаны больше, чем требуется. Если я не возьму массив, это вызовет ошибку сегментации.

Пожалуйста, помогите мне с этим кодом. Я новичок в C ++.

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Есть несколько неверных вещей. При использовании C ++, пожалуйста, рассмотрите возможность использования правильных объектов, таких как std::string для хранения имени ученика. Также, в отличие от C, нам не нужно указывать ключевое слово struct при передаче в качестве параметра функции.

Кроме того, способ передачи структуры функции printStudentInfo() был неправильным. Кроме того, я рекомендую против using namespace std, если это возможно.

Ниже приведено минимальное исправление вашего кода (обратите внимание, что его можно еще улучшить, я просто получил его едва работающим):

#include <iostream>
#include <string>

struct Student{
   std::string stuName;
   int stuRollNo;
   int stuAge;
};

void printStudentInfo(const Student& s);

int main()
{
    Student s[3];
    for(int i=0;i<3;i++)
    {
        std::cout<<"Enter Student Name: ";

        if (i) std::cin.ignore();
        std::getline(std::cin, s[i].stuName);

        std::cout<<"Enter Student Roll No: ";
        std::cin>>s[i].stuRollNo;

        std::cout<<"Enter Student Age: ";
        std::cin>>s[i].stuAge;

        printStudentInfo(s[i]);
   }
   return 0;
}

void printStudentInfo(const Student& s){
   std::cout<<"Student Record:"<<std::endl;
   std::cout<<"Name: "<<s.stuName<<std::endl;
   std::cout<<"Roll No: "<<s.stuRollNo<<std::endl;
   std::cout<<"Age: "<<s.stuAge<<std::endl;
}
0 голосов
/ 16 февраля 2020

Несколько баллов:

  • Прежде всего, код не имеет отступ. Используйте параметры кода вашего IDE, чтобы украсить ваш код. Пример: https://codebeautify.org/cpp-formatter-beautifier

  • Для целей обучения using namespace std; хорошо. Но старайтесь избегать этого в более серьезном коде. Прочитайте эту ветку для получения дополнительной информации: Почему "используется пространство имен std;" считается плохой практикой?

  • В типе Student члены имеют префикс stu, что является избыточным, поскольку они уже являются частью типа с правильным именем, т.е. Student и на него будут ссылаться в коде значимые именованные объекты. Подойдут простые и прямые имена членов, такие как name, rollno и age.

  • Член для имени студента представляет собой массив char с магией c число т.е. 30. Попробуйте выучить и использовать std :: string , что является более безопасным и простым. И всегда старайтесь избегать магических чисел c. Используйте собственные имена для магических чисел c, используя const, constexpr (если C ++ 11 или выше) или #define замены макросов в соответствии с вашими требованиями. Например, #define NAME_LENGTH 30.

  • В C ++ вам не нужно использовать префикс struct везде, где есть ссылка на тип, кроме определения или предварительного объявления. Таким образом, void printStudentInfo(struct Student s[]); будет void printStudentInfo(Student s[]);.

  • Функция printStudentInfo должна печатать только один объект типа Student, поэтому оператор индекса с аргументом s[] имеет вид лишний. Правильный тип для этого аргумента в этом контексте будет Student s, то есть void printStudentInfo(Stdudent s). Существует несколько способов передачи аргументов функции в C ++, таких как передача по значению и передача по ссылке. В вашем контексте передача по ссылке имеет больше смысла, например void printStudentInfo(const Student& s). Прочитайте эту соответствующую тему по теме: В чем разница между передачей по ссылке и передачей по значению?

  • Опять же, число волхвов c для размера массива , Используйте константу с собственным именем, таким как MAX_STUDENTS.

  • В C ++ объявите и определите управляющую переменную al oop внутри l oop: for ( int i = 0; ... )

  • Объявите Student s[i]; за пределами l oop. В l oop это означает, что он создается каждый раз, когда l oop повторяется с новым переменным размером, то есть 0, 1, 2. Это здесь не предназначено. Переместите его наружу, указав постоянный размер, например Student s[MAX_STUDENTS];. Соответствующий поток: Почему массивы переменной длины не являются частью стандарта C ++? . В будущем, когда вы будете знакомы с STL (Стандартная библиотека шаблонов), используйте std :: vector .

  • Разное (вы можете учиться, как вы go вместе): инициализация массива, std::endl против \n, unsigned против signed (для возраста, rollno, ...), std::size_t, et c.

Вот рабочий пример ( live ):

#include <iostream>
#include <string>

struct Student
{
    std::string name;
    int         rollno;
    int         age;
};

void printStudentInfo( const Student& s );

int main()
{
    const int MAX_STUDENTS = 3;
    Student s[MAX_STUDENTS];

    for ( int i = 0; i < MAX_STUDENTS; ++i )
    {
        std::cout << "Enter Student Name: ";
        std::getline( std::cin, s[i].name );

        std::cout << "Enter Student Roll No: ";
        std::cin >> s[i].rollno;

        std::cout << "Enter Student Age: ";
        std::cin >> s[i].age;

        printStudentInfo( s[i] );
    }

    return 0;
}

void printStudentInfo( const Student& s )
{
    std::cout << "Student Record:\n"
              << "Name    : " << s.name << '\n'
              << "Roll No : " << s.rollno << '\n'
              << "Age     : " << s.age << '\n';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...