我如何在 C++ 中打印动态数组我需要解释这个问题
how can I print dynamic array in c++ I need explanation to this question
这是老师给我的问题:
- 构造一个包含以下字段的结构
Employee
:
ID
、name
、degree
、age
- 创建对象(
Employee
类型的变量)的函数,从用户填充它,然后 returns 它。
- 接收对象(
Employee
类型的变量)并打印其字段的函数。
- 主要功能内部:
- 要求用户指定员工人数。
- 为员工创建一个用户指定大小的动态数组。
- 在循环内,通过调用第一个函数一次填充一个数组元素。
- 在另一个循环中,通过调用第二个函数一次打印一个数组元素。
虽然我不明白,但我试图解决它,这就是我所拥有的,请帮助:
struct Employee
{
int ID;
char name[10];
char degree;
int age;
};
int fillin()
{ Employee employee;
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
}
int print()
{
Employee employee;
cout<<"ID: "<< employee.ID<<" , ";
cout<<"NAME: "<< employee.name<<" , ";
cout<<"Degree: "<< employee.degree<<" , ";
cout<<"AGE: "<< employee.age<<".\n ";
}
int main()
{
int num;
cout<<"Enter number of employees: ";
cin>> num;
string *name= new string[num];
for(int i = 0; i < num;i++)
{
name[i]=fillin();
}
for(int j : name){
print();
}
return 0;
}
一个函数可以有 个参数 和 return 个值。所以在这里,fillin
应该 return 一个 Employee
对象,而 print
应该采用 Employee
(或者更好的 const 引用)参数:
Employee fillin()
{ Employee employee;
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
return employee; // return the local object
}
void print(const Employee& employee)
{
cout<<"ID: "<< employee.ID<<" , ";
cout<<"NAME: "<< employee.name<<" , ";
cout<<"Degree: "<< employee.degree<<" , ";
cout<<"AGE: "<< employee.age<<".\n ";
}
你的主要功能可以变成:
int main()
{
int num;
cout<<"Enter number of employees: ";
cin>> num;
Employee *name= new Employee[num];
for(int i = 0; i < num;i++)
{
name[i]=fillin();
}
for(int i=0; i<num; i++){
print(name[i]);
}
return 0;
}
当然,你应该检查输入法return有效值(每次阅读后检查cin
)
代码有几个问题,下面是工作示例。
- 函数应该以某种方式接收和 return 参数,代码中使用了引用
- 数组应该是合适的类型
- 使用了错误的迭代器
但是,请记住,代码还有更多问题,比如没有边界检查,最好使用 STL 库...考虑这只是一个起点。
#include <iostream>
using namespace std;
struct Employee
{
int ID;
char name[10];
char degree;
int age;
};
int fillin(Employee& employee)
{
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
}
int print(const Employee& employee)
{
cout<<"ID: "<< employee.ID<<" , ";
cout<<"NAME: "<< employee.name<<" , ";
cout<<"Degree: "<< employee.degree<<" , ";
cout<<"AGE: "<< employee.age<<".\n ";
}
int main()
{
int num;
cout<<"Enter number of employees: ";
cin>> num;
Employee *emp= new Employee[num];
for(int i = 0; i < num;i++)
{
fillin(emp[i]);
}
for(int j = 0; j< num; j++){
print(emp[j]);
}
return 0;
}
Employee fillin()
{
Employee employee;
cout << "Enter employee ID, NAME, DEGREE and AGE:\n";
cin >> employee.ID;
cin >> employee.name;
cin >> employee.degree;
cin >> employee.age;
return employee;
}
void print(Employee emp)
{
cout << "ID: " << emp.ID << " , ";
cout << "NAME: " << emp.name << " , ";
cout << "Degree: " << emp.degree << " , ";
cout << "AGE: " << emp.age << ".\n ";
}
这应该可以帮助您走上正轨。您只需要动态数组来接受 Employee 对象,然后在 main 中调用 print(someEmployeeObject) 时需要提供要打印的对象。
好的,我对你的代码有各种各样的意见。首先,不要使用字符数组。改为使用字符串:
#include <string>
struct Employee
{
int ID;
std::string name;
char degree;
int age;
};
String 允许使用动态长度的字符串,因此如果有人输入非常非常长的名称,您将不会超出 space。它会处理它。此外,还有许多其他优势。
接下来,让我们稍微改变一下这个方法:
Employee fillin() {
Employee employee;
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
return employee;
}
您根本没有 return 任何东西,但您需要 return 您正在创建的员工。所以这是一个小改动。
现在对打印方法做一个小改动:
#include <iostream>
std::ostream & operator<<(std::ostream &ostr, const Employee &employee) {
{
ostr <<"ID: "<< employee.ID<<" , ";
ostr <<"NAME: "<< employee.name<<" , ";
ostr <<"Degree: "<< employee.degree<<" , ";
ostr <<"AGE: "<< employee.age<<".\n ";
return ostr;
}
然后使用它:
std::cout << employee;
这是 C++ 的实现方式,如果您想将员工转储到其他地方(如文件),您可以使用完全相同的方法。
最后,对您的主程序进行一些小改动:
#include
主函数()
{
std::vector 员工;
整数;
cout<<"请输入员工人数:";
cin>> num;
for(int i = 0; i < num;i++)
{
employees.push_back(fillin());
}
for (const Employee &employee: employees) {
std::cout << employee;
}
return 0;
}
我们来谈谈这个。首先,我们没有使用固定长度的数组,而是使用了向量。这是一个动态长度数组,类似于字符串是动态长度字符串的方式。您可以 push_back() 将项目附加到数组。定义它时,您指定它包含的内容。所以在这种情况下,我有一个 Employee 对象向量。
我从你的 for 循环开始,但我调用了新版本的 fillin 来实际获取员工记录,然后将它们推入向量中。
然后是第二个for循环。你可能不熟悉这种风格。基本上这是一个 for 循环,它遍历员工的每个元素——我们刚刚对 push_back() 执行的那些元素。然后我使用我之前写的输出方法。
你很接近。您只是遗漏了一些关键的东西——基本上是将元素传递到您的方法中并 returning 元素。
这是老师给我的问题:
- 构造一个包含以下字段的结构
Employee
:ID
、name
、degree
、age
- 创建对象(
Employee
类型的变量)的函数,从用户填充它,然后 returns 它。 - 接收对象(
Employee
类型的变量)并打印其字段的函数。 - 主要功能内部:
- 要求用户指定员工人数。
- 为员工创建一个用户指定大小的动态数组。
- 在循环内,通过调用第一个函数一次填充一个数组元素。
- 在另一个循环中,通过调用第二个函数一次打印一个数组元素。
虽然我不明白,但我试图解决它,这就是我所拥有的,请帮助:
struct Employee
{
int ID;
char name[10];
char degree;
int age;
};
int fillin()
{ Employee employee;
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
}
int print()
{
Employee employee;
cout<<"ID: "<< employee.ID<<" , ";
cout<<"NAME: "<< employee.name<<" , ";
cout<<"Degree: "<< employee.degree<<" , ";
cout<<"AGE: "<< employee.age<<".\n ";
}
int main()
{
int num;
cout<<"Enter number of employees: ";
cin>> num;
string *name= new string[num];
for(int i = 0; i < num;i++)
{
name[i]=fillin();
}
for(int j : name){
print();
}
return 0;
}
一个函数可以有 个参数 和 return 个值。所以在这里,fillin
应该 return 一个 Employee
对象,而 print
应该采用 Employee
(或者更好的 const 引用)参数:
Employee fillin()
{ Employee employee;
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
return employee; // return the local object
}
void print(const Employee& employee)
{
cout<<"ID: "<< employee.ID<<" , ";
cout<<"NAME: "<< employee.name<<" , ";
cout<<"Degree: "<< employee.degree<<" , ";
cout<<"AGE: "<< employee.age<<".\n ";
}
你的主要功能可以变成:
int main()
{
int num;
cout<<"Enter number of employees: ";
cin>> num;
Employee *name= new Employee[num];
for(int i = 0; i < num;i++)
{
name[i]=fillin();
}
for(int i=0; i<num; i++){
print(name[i]);
}
return 0;
}
当然,你应该检查输入法return有效值(每次阅读后检查cin
)
代码有几个问题,下面是工作示例。
- 函数应该以某种方式接收和 return 参数,代码中使用了引用
- 数组应该是合适的类型
- 使用了错误的迭代器
但是,请记住,代码还有更多问题,比如没有边界检查,最好使用 STL 库...考虑这只是一个起点。
#include <iostream>
using namespace std;
struct Employee
{
int ID;
char name[10];
char degree;
int age;
};
int fillin(Employee& employee)
{
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
}
int print(const Employee& employee)
{
cout<<"ID: "<< employee.ID<<" , ";
cout<<"NAME: "<< employee.name<<" , ";
cout<<"Degree: "<< employee.degree<<" , ";
cout<<"AGE: "<< employee.age<<".\n ";
}
int main()
{
int num;
cout<<"Enter number of employees: ";
cin>> num;
Employee *emp= new Employee[num];
for(int i = 0; i < num;i++)
{
fillin(emp[i]);
}
for(int j = 0; j< num; j++){
print(emp[j]);
}
return 0;
}
Employee fillin()
{
Employee employee;
cout << "Enter employee ID, NAME, DEGREE and AGE:\n";
cin >> employee.ID;
cin >> employee.name;
cin >> employee.degree;
cin >> employee.age;
return employee;
}
void print(Employee emp)
{
cout << "ID: " << emp.ID << " , ";
cout << "NAME: " << emp.name << " , ";
cout << "Degree: " << emp.degree << " , ";
cout << "AGE: " << emp.age << ".\n ";
}
这应该可以帮助您走上正轨。您只需要动态数组来接受 Employee 对象,然后在 main 中调用 print(someEmployeeObject) 时需要提供要打印的对象。
好的,我对你的代码有各种各样的意见。首先,不要使用字符数组。改为使用字符串:
#include <string>
struct Employee
{
int ID;
std::string name;
char degree;
int age;
};
String 允许使用动态长度的字符串,因此如果有人输入非常非常长的名称,您将不会超出 space。它会处理它。此外,还有许多其他优势。
接下来,让我们稍微改变一下这个方法:
Employee fillin() {
Employee employee;
cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
cin>>employee.ID;
cin>>employee.name;
cin>>employee.degree;
cin>>employee.age;
return employee;
}
您根本没有 return 任何东西,但您需要 return 您正在创建的员工。所以这是一个小改动。
现在对打印方法做一个小改动:
#include <iostream>
std::ostream & operator<<(std::ostream &ostr, const Employee &employee) {
{
ostr <<"ID: "<< employee.ID<<" , ";
ostr <<"NAME: "<< employee.name<<" , ";
ostr <<"Degree: "<< employee.degree<<" , ";
ostr <<"AGE: "<< employee.age<<".\n ";
return ostr;
}
然后使用它:
std::cout << employee;
这是 C++ 的实现方式,如果您想将员工转储到其他地方(如文件),您可以使用完全相同的方法。
最后,对您的主程序进行一些小改动:
#include 主函数() { std::vector 员工; 整数; cout<<"请输入员工人数:"; cin>> num;
for(int i = 0; i < num;i++)
{
employees.push_back(fillin());
}
for (const Employee &employee: employees) {
std::cout << employee;
}
return 0;
}
我们来谈谈这个。首先,我们没有使用固定长度的数组,而是使用了向量。这是一个动态长度数组,类似于字符串是动态长度字符串的方式。您可以 push_back() 将项目附加到数组。定义它时,您指定它包含的内容。所以在这种情况下,我有一个 Employee 对象向量。
我从你的 for 循环开始,但我调用了新版本的 fillin 来实际获取员工记录,然后将它们推入向量中。
然后是第二个for循环。你可能不熟悉这种风格。基本上这是一个 for 循环,它遍历员工的每个元素——我们刚刚对 push_back() 执行的那些元素。然后我使用我之前写的输出方法。
你很接近。您只是遗漏了一些关键的东西——基本上是将元素传递到您的方法中并 returning 元素。