打印出意外的输出

时间:2014-04-21 16:45:00

标签: c++ function

我正在编写一个需要的C ++程序:
使用以下参数声明名为Student的结构:
- Student ID
- Lastname
- Student marks [学校科目k:1

我还需要编写函数来插入和显示每个学生。

但该程序不起作用。没有错误所以我认为语法是正确的,因为它编译。

你能帮我找一下代码中的错误吗?

#include <iostream>
using namespace std;

struct Student
{
    int FN;
    char Lastname[32];
    double marks[10];
};

//y = Number of school subjects;
void decStudent(Student x, int y)
{
    cout << "Insert student ID: ";
    cin >> x.FN;
    cout << "Insert student lastname: ";
    cin >> x.Lastname;
    cout << "Insert student marks: ";
    for ( int i=0; i < y; i++)
    {
        cin >> x.marks[y];
        cout << endl;
    }
    cout << "------------------------------------" << endl;
}

//v = Number of students;
//t = Number of school subjects;
void BookOut(Student x, int v, int t)
{
    double StudentAvarage = 0;

    cout << x.FN << "        " << x.Lastname << "        ";
    for (int j = 0; j < t; j++)
    {
        cout << x.marks[j] << "        ";
        StudentAvarage = StudentAvarage + x.marks[j];
    }
    StudentAvarage = StudentAvarage / t;
    cout << StudentAvarage;

}

int main()
{
    int num, k;
    Student book[100];

    cout << "Please insert the number of students: ";
    cin >> num;

    cout << "Please insert the amount of school subjects: ";
    cin >> k;

    for (int i = 0; i < num; i++)
    {
        decStudent(book[i], k);
    }

    for (int i = 0; i < num; i++)
    {
        cout << "   ID   " << "Lastname";

        for (int p = 0; p < k; p++)
        {
            cout << " Mark" << p << " ";
        }

        cout << " Avarage mark ";

        BookOut(book[i], num, k);
    }

    return 0;
}

4 个答案:

答案 0 :(得分:2)

您的问题与正确传递参数有关,而且与结构很少有关。

void decStudent(Student x, int y)

因此,当您传递学生时,该函数会生成local copy。当decStudent()函数返回时,该本地副本将被销毁。这与此无异:

void foo(int x)
{
   x = 10;
}

int main()
{
  int num = 0;
  foo(num);
}

同样的行为。调用foo后,“num”不会更改为10,因为int是按值传递的。

您需要通过引用传递,而不是通过值传递。

void decStudent(Student& x, int y)

答案 1 :(得分:0)

致电时

decStudent(book[i], k);

您正在传递学生结构的副本并修改(副本)函数内部,但原始书籍[i]不会被修改,您可能需要使用pass-by-reference或指针。

答案 2 :(得分:0)

我最好的猜测是你在调试自己时付出的努力,就是你在所有情况下都要通过值void函数。因此,一旦退出该功能,您所做的任何更改都不会保留。这与结构无关。

答案 3 :(得分:0)

更改您的功能原型。 而不是按值传递使用传递引用。 pass by value创建一个临时变量,如果你改变那个临时变量的值,那么值的变化就不会反映在你传递的值中。

使用void decStudent(Student&amp; x,int y) 而不是void decStudent(Student x,int y)