Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
显示乱七八糟和缺少的操作 P>我是C++初学者,我想制作一个包含数据获取功能的类,计算平均和,并用它们的分数来划分它们(5),最后的函数是显示关于学生的数据。 我很乐意得到你们的建议。 代码如下: class Students{ int br; char Name[30]; int fakn,i; float grades[5],sum; char spec[25]; public: void takingdata(); float avarage(); void displaydata(); }; void Students::takingdata(){ cout << "Enter name of the student: "; cin.getline(Name, 20); cout << "Enter his faculty number: "; cin >> fakn; cout << "specialty: "; cin.getline(spec, 10); cout << "Enter grades : "; for (i = 0; i < 5; i++){ cout << "Enter his grades(5 classes): "; cin >> grades[i]; } } float Students::avarage(){ sum = 0; br = 0; for (i = 0; i < 5; i++){ sum = sum + grades[i]; } return sum / 5; } void Students::displaydata(){ cout << "Name of student: " << Name; cout << "Student faculty number: " << fakn; cout << "Student specialty: " << spec; for (i = 0; i < 5; i++){ cout << "His " << i << " grade: " << grades[i]; } cout << "His avarage grade: " << avarage(); } void main(){ Students in,out; in.takingdata(); out.displaydata(); _getch(); } 班级学生{ int-br; 字符名[30]; int fakn,i; 浮动等级[5],总和; 字符规范[25]; 公众: void takingdata(); 浮动avarage(); void displaydata(); }; 无效学生::takingdata(){ cout fakn; 不能包含 #包括 使用名称空间std; 班级学生{ 私人: 静态常数int类=5; 静态常量int NAME=30; 静态常数int SPEC=15; 字符名称[名称],规格[规格]; int fakn; 浮动等级[类别],总和; 公众: 学生(); void takingdata(); void avarage(); void displaydata(); }; //建造师 学生::学生(){ takingdata(); avarage(); 显示数据(); } //用户输入 无效学生::takingdata(){ cout fakn; cin.ignore(); cout>grades[i]; } } //计算 无效学生::avarage(){ 总和=0; for(int i=0;i_C++_Class_Object - Fatal编程技术网 grades[i]; } } //计算 无效学生::avarage(){ 总和=0; for(int i=0;i,c++,class,object,C++,Class,Object" /> grades[i]; } } //计算 无效学生::avarage(){ 总和=0; for(int i=0;i,c++,class,object,C++,Class,Object" />

显示乱七八糟和缺少的操作 P>我是C++初学者,我想制作一个包含数据获取功能的类,计算平均和,并用它们的分数来划分它们(5),最后的函数是显示关于学生的数据。 我很乐意得到你们的建议。 代码如下: class Students{ int br; char Name[30]; int fakn,i; float grades[5],sum; char spec[25]; public: void takingdata(); float avarage(); void displaydata(); }; void Students::takingdata(){ cout << "Enter name of the student: "; cin.getline(Name, 20); cout << "Enter his faculty number: "; cin >> fakn; cout << "specialty: "; cin.getline(spec, 10); cout << "Enter grades : "; for (i = 0; i < 5; i++){ cout << "Enter his grades(5 classes): "; cin >> grades[i]; } } float Students::avarage(){ sum = 0; br = 0; for (i = 0; i < 5; i++){ sum = sum + grades[i]; } return sum / 5; } void Students::displaydata(){ cout << "Name of student: " << Name; cout << "Student faculty number: " << fakn; cout << "Student specialty: " << spec; for (i = 0; i < 5; i++){ cout << "His " << i << " grade: " << grades[i]; } cout << "His avarage grade: " << avarage(); } void main(){ Students in,out; in.takingdata(); out.displaydata(); _getch(); } 班级学生{ int-br; 字符名[30]; int fakn,i; 浮动等级[5],总和; 字符规范[25]; 公众: void takingdata(); 浮动avarage(); void displaydata(); }; 无效学生::takingdata(){ cout fakn; 不能包含 #包括 使用名称空间std; 班级学生{ 私人: 静态常数int类=5; 静态常量int NAME=30; 静态常数int SPEC=15; 字符名称[名称],规格[规格]; int fakn; 浮动等级[类别],总和; 公众: 学生(); void takingdata(); void avarage(); void displaydata(); }; //建造师 学生::学生(){ takingdata(); avarage(); 显示数据(); } //用户输入 无效学生::takingdata(){ cout fakn; cin.ignore(); cout>grades[i]; } } //计算 无效学生::avarage(){ 总和=0; for(int i=0;i

显示乱七八糟和缺少的操作 P>我是C++初学者,我想制作一个包含数据获取功能的类,计算平均和,并用它们的分数来划分它们(5),最后的函数是显示关于学生的数据。 我很乐意得到你们的建议。 代码如下: class Students{ int br; char Name[30]; int fakn,i; float grades[5],sum; char spec[25]; public: void takingdata(); float avarage(); void displaydata(); }; void Students::takingdata(){ cout << "Enter name of the student: "; cin.getline(Name, 20); cout << "Enter his faculty number: "; cin >> fakn; cout << "specialty: "; cin.getline(spec, 10); cout << "Enter grades : "; for (i = 0; i < 5; i++){ cout << "Enter his grades(5 classes): "; cin >> grades[i]; } } float Students::avarage(){ sum = 0; br = 0; for (i = 0; i < 5; i++){ sum = sum + grades[i]; } return sum / 5; } void Students::displaydata(){ cout << "Name of student: " << Name; cout << "Student faculty number: " << fakn; cout << "Student specialty: " << spec; for (i = 0; i < 5; i++){ cout << "His " << i << " grade: " << grades[i]; } cout << "His avarage grade: " << avarage(); } void main(){ Students in,out; in.takingdata(); out.displaydata(); _getch(); } 班级学生{ int-br; 字符名[30]; int fakn,i; 浮动等级[5],总和; 字符规范[25]; 公众: void takingdata(); 浮动avarage(); void displaydata(); }; 无效学生::takingdata(){ cout fakn; 不能包含 #包括 使用名称空间std; 班级学生{ 私人: 静态常数int类=5; 静态常量int NAME=30; 静态常数int SPEC=15; 字符名称[名称],规格[规格]; int fakn; 浮动等级[类别],总和; 公众: 学生(); void takingdata(); void avarage(); void displaydata(); }; //建造师 学生::学生(){ takingdata(); avarage(); 显示数据(); } //用户输入 无效学生::takingdata(){ cout fakn; cin.ignore(); cout>grades[i]; } } //计算 无效学生::avarage(){ 总和=0; for(int i=0;i,c++,class,object,C++,Class,Object,首先: 这是怎么回事?这里有两个对象,第一个写,第二个读 应该是这样的: Students students; students.takingdata(); students.displaydata(); 尽管如此,理解代码版本中真正发生的事情仍然很重要。正如我们刚刚建立的,您从std::cin读入in的所有内容稍后都将被丢弃。这就产生了一个问题:你到底从中读到了什么。让我们再看看类定义的相关部分: 所有这些成员变量都是所谓的基元类型。这意味着,除其他外,如果不明确地初始化它们,它们将保持未初

首先:

这是怎么回事?这里有两个对象,第一个写,第二个读

应该是这样的:

Students students;
students.takingdata();
students.displaydata();
尽管如此,理解代码版本中真正发生的事情仍然很重要。正如我们刚刚建立的,您从
std::cin
读入
in
的所有内容稍后都将被丢弃。这就产生了一个问题:你到底从
中读到了什么。让我们再看看类定义的相关部分:

所有这些成员变量都是所谓的基元类型。这意味着,除其他外,如果不明确地初始化它们,它们将保持未初始化状态。例如,
br
不是“从0开始”。严格地说,除非你给它分配了什么,否则它什么都不是

任何输出这些未初始化值的尝试都会产生未定义的行为。未定义行为意味着C++语言规范“放弃”而不说结果程序应该做什么。 在像您这样的情况下,在实践中经常发生的是,您的程序读取一个或多或少的随机值,该值恰好位于由变量表示的内存中的位置,并打印该值。危险的是,它可能会在很长一段时间内正常工作,因为内存位置恰好包含零值,诱使您认为您的程序没有bug,然后它突然崩溃或打印垃圾值

因此,我们应该应用于代码的第一个明显的修复方法是确保所有成员变量都已初始化。在我们这样做的同时,我还将:

  • 在顶部添加
    #包括
  • 在所有标准库功能前面添加
    std::
    (这是一个很好的做法)
  • 将非法的
    void main
    更改为
    int main
  • 删除不必要的
    \u getch
    调用
以下是修复程序第一次迭代后的结果:

#include <iostream>

class Students{
int br;
char Name[30];
int fakn,i;
float grades[5],sum;
char spec[25];
public:

Students() :
    br(0),
    Name(),
    fakn(0),
    i(0),
    grades(),
    sum(0.0),
    spec()
{}

void takingdata();
float avarage();
void displaydata();
};

void Students::takingdata(){
std::cout << "Enter name of the student: "; std::cin.getline(Name, 20);
std::cout << "Enter his faculty number: "; std::cin >> fakn;
std::cout << "specialty: "; std::cin.getline(spec, 10);
std::cout << "Enter grades : ";
for (i = 0; i < 5; i++){
    std::cout << "Enter his grades(5 classes): "; std::cin >> grades[i];

}


}

float Students::avarage(){
sum = 0;
br = 0;
for (i = 0; i < 5; i++){
    sum = sum + grades[i];


}
return sum / 5;
}


void Students::displaydata(){
std::cout << "Name of student: " << Name;
std::cout << "Student faculty number: " << fakn;
std::cout << "Student specialty: " << spec;
for (i = 0; i < 5; i++){
    std::cout << "His " << i << " grade: " << grades[i];
}
std::cout << "His avarage grade: " << avarage();

}

int main(){
Students students;
students.takingdata();
students.displaydata();

}
那不好
std::istream::getline
尝试将30个以上的字符写入30个元素的数组。这已经产生了未定义的行为。即使它在30个元素之后神奇地停止,您也会得到一个数组,而没有终止的
'\0'
,因此稍后输出的代码将再次离开数组的边界寻找它。除此之外,所有通过
std::cin
读取数字的尝试都会失败,因为第30个字符后的流内容不能解释为数字,从而使它应该写入的变量保持以前的状态

正如您所看到的,以这种方式读取固定大小的
char
数组几乎是一项毫无希望的任务。幸运的是,C++并没有强迫你跟上所有这些。它为动态大小的字符串提供了
std::string
,并提供了一个独立的
std::getline
函数来安全地读取字符串

下面是修复程序的第二次迭代。请注意,
std::string
不是基元类型,因此它知道如何正确初始化自身。我仍然将这两个变量添加到初始值设定项列表中,以与其他成员保持一致

#include <iostream>
#include <string>

class Students{
int br;
std::string Name;
int fakn,i;
float grades[5],sum;
std::string spec;
public:

Students() :
    br(0),
    Name(),
    fakn(0),
    i(0),
    grades(),
    sum(0.0),
    spec()
{}

void takingdata();
float avarage();
void displaydata();
};

void Students::takingdata(){
std::cout << "Enter name of the student: "; std::getline(std::cin, Name);
std::cout << "Enter his faculty number: "; std::cin >> fakn;
std::cout << "specialty: "; std::getline(std::cin, spec);
std::cout << "Enter grades : ";
for (i = 0; i < 5; i++){
    std::cout << "Enter his grades(5 classes): "; std::cin >> grades[i];

}


}

float Students::avarage(){
sum = 0;
br = 0;
for (i = 0; i < 5; i++){
    sum = sum + grades[i];


}
return sum / 5;
}


void Students::displaydata(){
std::cout << "Name of student: " << Name;
std::cout << "Student faculty number: " << fakn;
std::cout << "Student specialty: " << spec;
for (i = 0; i < 5; i++){
    std::cout << "His " << i << " grade: " << grades[i];
}
std::cout << "His avarage grade: " << avarage();

}

int main(){
Students students;
students.takingdata();
students.displaydata();

}
#包括
#包括
班级学生{
int-br;
std::字符串名;
int fakn,i;
浮动等级[5],总和;
字符串规范;
公众:
学生():
br(0),
名称(),
fakn(0),
i(0),,
职系(),
总和(0.0),
规格()
{}
void takingdata();
浮动avarage();
void displaydata();
};
无效学生::takingdata(){
std::cout fakn;

std::cout请在这里发布代码(但以最小的方式重现问题)并且解释一下期望输出与实际输出的关系。我希望显示关于学生的所有数据。@ Huntix,因为它是C++,你应该使用它的代码> STD::String ,而不是C风格的字符串。没有看过你的代码,我会说它是一个缺失的null终止符。我还不熟悉STD::和NoLeNetraseTo。两个对象,你读一个,写另一个。我从来没有看到过这样的答案!非常感谢!!!!!感谢所有的信息和解释!!!你真的帮了我的忙。我还有最后一个问题:既然每个人都在用cout、cin等字体的std::为什么不包括“使用名称空间std;”呢?w的区别是什么
int br;
char Name[30];
int fakn,i;
float grades[5],sum;
char spec[25];
#include <iostream>

class Students{
int br;
char Name[30];
int fakn,i;
float grades[5],sum;
char spec[25];
public:

Students() :
    br(0),
    Name(),
    fakn(0),
    i(0),
    grades(),
    sum(0.0),
    spec()
{}

void takingdata();
float avarage();
void displaydata();
};

void Students::takingdata(){
std::cout << "Enter name of the student: "; std::cin.getline(Name, 20);
std::cout << "Enter his faculty number: "; std::cin >> fakn;
std::cout << "specialty: "; std::cin.getline(spec, 10);
std::cout << "Enter grades : ";
for (i = 0; i < 5; i++){
    std::cout << "Enter his grades(5 classes): "; std::cin >> grades[i];

}


}

float Students::avarage(){
sum = 0;
br = 0;
for (i = 0; i < 5; i++){
    sum = sum + grades[i];


}
return sum / 5;
}


void Students::displaydata(){
std::cout << "Name of student: " << Name;
std::cout << "Student faculty number: " << fakn;
std::cout << "Student specialty: " << spec;
for (i = 0; i < 5; i++){
    std::cout << "His " << i << " grade: " << grades[i];
}
std::cout << "His avarage grade: " << avarage();

}

int main(){
Students students;
students.takingdata();
students.displaydata();

}
Enter name of the student: Long name that does not fit any more in 30 characters
Enter his faculty number: specialty: Enter grades : Enter his grades(5 classes): Enter his grades(5 classes): Enter his grades(5 classes): Enter his grades(5 cl
asses): Enter his grades(5 classes): Name of student: Long name that doesStudent faculty number: 0Student specialty: His 0 grade: 0His 1 grade: 0His 2 grade: 0H
is 3 grade: 0His 4 grade: 0His avarage grade: 0
#include <iostream>
#include <string>

class Students{
int br;
std::string Name;
int fakn,i;
float grades[5],sum;
std::string spec;
public:

Students() :
    br(0),
    Name(),
    fakn(0),
    i(0),
    grades(),
    sum(0.0),
    spec()
{}

void takingdata();
float avarage();
void displaydata();
};

void Students::takingdata(){
std::cout << "Enter name of the student: "; std::getline(std::cin, Name);
std::cout << "Enter his faculty number: "; std::cin >> fakn;
std::cout << "specialty: "; std::getline(std::cin, spec);
std::cout << "Enter grades : ";
for (i = 0; i < 5; i++){
    std::cout << "Enter his grades(5 classes): "; std::cin >> grades[i];

}


}

float Students::avarage(){
sum = 0;
br = 0;
for (i = 0; i < 5; i++){
    sum = sum + grades[i];


}
return sum / 5;
}


void Students::displaydata(){
std::cout << "Name of student: " << Name;
std::cout << "Student faculty number: " << fakn;
std::cout << "Student specialty: " << spec;
for (i = 0; i < 5; i++){
    std::cout << "His " << i << " grade: " << grades[i];
}
std::cout << "His avarage grade: " << avarage();

}

int main(){
Students students;
students.takingdata();
students.displaydata();

}