簡體   English   中英

從函數返回 arrays (C++)

[英]Returning arrays from functions (C++)

我的程序應該為 10 名學生和 output 他們相應的平均分和成績分別取名字和 5 分。 我的函數avgmarksavg_grade應該計算並將這些作為 arrays 返回到主 function。 使用語句return avg[10]return gr[10]不起作用。 我知道指針變量可以在這里使用,但我不知道如何實現它們以使我的程序正常工作。

#include <iostream>
#include <string>
using namespace std;
void readnames(string p[]);
int readmarks(int p[10][5]);
int avgmarks(int p[10][5]);
char avg_grade(int p[10]);
void displayresults(string n[], int m[], char g[]);
int main()
{
    string names[10];
    readnames(names);
    int marks [10][5];
    readmarks(marks);
    int avg_marks[10];
    avg_marks[10]=avgmarks(marks);
    char grade[10];
    grade[10]=avg_grade(avg_marks);
    displayresults(names, avg_marks, grade);
}
void readnames(string p[])
{
    for (int i=0;i<10;i++)
    {
        cout<<"Enter student "<<i+1<<"'s name:\n";
        cin>>p[i];
    }
}
int readmarks(int p[10][5])
{
    for (int i=0;i<10;i++)
    {
        cout<<"Enter student "<<i+1<<"'s marks:\n";
        for (int j=0;j<5;j++)
        {
            cin>>p[i][j];
        }
    }
}
int avgmarks(int p[10][5])
{
    int avg[10];
    int sum;
    for (int i=0;i<10;i++)
    {
        sum=0;
        for (int j=0;j<5;j++)
        {
            sum=sum+p[i][j];
        }

        avg[i]=(sum/5);
    }

    return avg[10];
}
char avg_grade(int p[10])
{   
    char gr[10];
    for (int i=0;i<10;i++)
    {
        if (p[i]>=90)
        {
            gr[i]='A';
        }
        if ((p[i]>=80)&&(p[i]<90))
        {
            gr[i]='B';
        }
        if ((p[i]>=70)&&(p[i]<80))
        {
            gr[i]='C';
        }
        if ((p[i]>=60)&&(p[i]<70))
        {
            gr[i]='D';
        }
        if ((p[i]>=50)&&(p[i]<60))
        {
            gr[i]='E';
        }
        if ((p[i]>=40)&&(p[i]<50))
        {
            gr[i]='F';
        } 
    }   
    return gr[10];
}
void displayresults(string n[], int m[], char g[])
{
    float ct;
    float sum=0;
    cout<<endl;
    for (int i=0;i<10;i++)
    {
        cout<<"Name: "<<n[i]<<"    Average Marks: "<<m[i]<<"    Grade: "<<g[i];
        cout<<endl;
    }
    for (int i=0;i<10;i++)
    {
        sum=sum+m[i];
    }
    ct=sum/10;
    cout<<"The class average is "<<ct<<endl;
}

Arrays 不能從函數返回。 這是使用向量而不是 arrays 的一個很好的理由(還有更多)。

但是如果你想繼續使用 arrays,你應該使用指針來模擬從 function 返回一個數組。

在此示例中, avg是指向將接收返回值的數組的指針

void avgmarks(int p[10][5], int* avg)
{
    int sum;
    for (int i=0;i<10;i++)
    {
        sum=0;
        for (int j=0;j<5;j++)
        {
            sum=sum+p[i][j];
        }

        avg[i]=(sum/5);
    }
}

你像這樣使用它

int avg_marks[10];
avgmarks(marks, avg_marks);

PS。 你似乎有一個常見的(但對我來說很奇怪)新手誤解,如果你有一個大小為 10 的數組(比如說),那么array[10]可以用來指代整個數組。 請不要認為,如果你有一個大小為 10 的數組,那么array[10]只是一個錯誤,因為大小為 10 的數組的有效索引是 0 到 9。

此示例將每個 c 樣式數組更改為std::array 請記住,它與 arrays 的代碼相同,因此每個編程錯誤仍然存在。 arrays 也是按值返回的,意味着它們被復制了。 嘗試了解如何使用std::array ,你會得到一個更好的程序員。

#include <iostream>
#include <string>
#include <array>

using namespace std;

void readnames(std::array<string, 10>& p);
void readmarks(std::array<std::array<int,5>, 10>& p);
std::array<int,10> avgmarks(std::array<std::array<int,5>, 10>& p);
std::array<char,10> avg_grade(std::array<int,10>& p);
void displayresults(std::array<string, 10> n, std::array<int,10> m, std::array<char,10> g);

int main()
{
    std::array<string, 10> names;
    readnames(names);
    std::array<std::array<int,5>, 10> marks;
    readmarks(marks);
    std::array<int,10> avg_marks;
    avg_marks = avgmarks(marks);
    std::array<char,10> grade;
    grade = avg_grade(avg_marks);
    displayresults(names, avg_marks, grade);
}

void readnames(std::array<string, 10>& p)
{
    for (int i=0;i<10;i++)
    {
        cout<<"Enter student "<<i+1<<"'s name:\n";
        cin>>p[i];
    }
}

void readmarks(std::array<std::array<int,5>, 10>& p)
{
    for (int i=0;i<10;i++)
    {
        cout<<"Enter student "<<i+1<<"'s marks:\n";
        for (int j=0;j<5;j++)
        {
            cin>>p[i][j];
        }
    }
}

std::array<int,10> avgmarks(std::array<std::array<int,5>, 10>& p)
{
    std::array<int,10> avg;
    int sum;
    for (int i=0;i<10;i++)
    {
        sum=0;
        for (int j=0;j<5;j++)
        {
            sum=sum+p[i][j];
        }

        avg[i]=(sum/5);
    }

    return avg;
}

std::array<char,10> avg_grade(std::array<int,10>& p)
{   
    std::array<char,10> gr;
    for (int i=0;i<10;i++)
    {
        if (p[i]>=90)
        {
            gr[i]='A';
        }
        if ((p[i]>=80)&&(p[i]<90))
        {
            gr[i]='B';
        }
        if ((p[i]>=70)&&(p[i]<80))
        {
            gr[i]='C';
        }
        if ((p[i]>=60)&&(p[i]<70))
        {
            gr[i]='D';
        }
        if ((p[i]>=50)&&(p[i]<60))
        {
            gr[i]='E';
        }
        if ((p[i]>=40)&&(p[i]<50))
        {
            gr[i]='F';
        } 
    }   
    return gr;
}

void displayresults(std::array<string, 10> n, std::array<int,10> m, std::array<char,10> g)
{
    float ct;
    float sum=0;
    cout<<endl;
    for (int i=0;i<10;i++)
    {
        cout<<"Name: "<<n[i]<<"    Average Marks: "<<m[i]<<"    Grade: "<<g[i];
        cout<<endl;
    }
    for (int i=0;i<10;i++)
    {
        sum=sum+m[i];
    }
    ct=sum/10;
    cout<<"The class average is "<<ct<<endl;
}

我認為這會起作用:

#include <iostream>
#include <string>
using namespace std;
void readnames(string p[]);
void readmarks(int p[10][5]);
int* avgmarks(int p[10][5]);
char* avg_grade(int p[10]);
void displayresults(string n[], int m[], char g[]);
int main()
{
    string names[10];
    readnames(names);
    int marks [10][5];
    readmarks(marks);
    int *avg_marks;
    avg_marks=avgmarks(marks);
    char *grade;
    grade=avg_grade(avg_marks);
    displayresults(names, avg_marks, grade);
}
void readnames(string p[])
{
    for (int i=0;i<10;i++)
    {
        cout<<"Enter student "<<i+1<<"'s name:\n";
        cin>>p[i];
    }
}
void readmarks(int p[10][5])
{
    for (int i=0;i<10;i++)
    {
        cout<<"Enter student "<<i+1<<"'s marks:\n";
        for (int j=0;j<5;j++)
        {
            cin>>p[i][j];
        }
    }
}
int* avgmarks(int p[10][5])
{
    static int avg[10];
    int sum;
    for (int i=0;i<10;i++)
    {
        sum=0;
        for (int j=0;j<5;j++)
        {
            sum=sum+p[i][j];
        }

        avg[i]=(sum/5);
    }

    return avg;
}
char* avg_grade(int *p)
{   
    static char gr[10];
    for (int i=0;i<10;i++)
    {
        if (p[i]>=90)
        {
            gr[i]='A';
        }
        if ((p[i]>=80)&&(p[i]<90))
        {
            gr[i]='B';
        }
        if ((p[i]>=70)&&(p[i]<80))
        {
            gr[i]='C';
        }
        if ((p[i]>=60)&&(p[i]<70))
        {
            gr[i]='D';
        }
        if ((p[i]>=50)&&(p[i]<60))
        {
            gr[i]='E';
        }
        if ((p[i]>=40)&&(p[i]<50))
        {
            gr[i]='F';
        } 
    }   
    return gr;
}
void displayresults(string n[], int m[], char g[])
{
    float ct;
    float sum=0;
    cout<<endl;
    for (int i=0;i<10;i++)
    {
        cout<<"Name: "<<n[i]<<"    Average Marks: "<<m[i]<<"    Grade: "<<g[i];
        cout<<endl;
    }
    for (int i=0;i<10;i++)
    {
        sum=sum+m[i];
    }
    ct=sum/10;
    cout<<"The class average is "<<ct<<endl;
}

基本上,要從 C/C++ 中的 function 返回一個數組,您將其聲明為“靜態”,然后讓 function 返回指針。

編輯:正如許多其他人所指出的,這在多線程程序中不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM