Возврат массивов из функций (C ++) - PullRequest
1 голос
/ 07 мая 2020

Моя программа должна брать имена и по 5 оценок для 10 студентов и выводить их соответствующие средние оценки и оценку. Мои функции avgmarks и avg_grade должны вычислять и возвращать их как массивы в основную функцию. Использование операторов 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;
}

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Массивы не могут быть возвращены из функций. Это одна из веских причин использовать векторы вместо массивов (их гораздо больше).

Но если вы хотите продолжить работу с массивами, вы должны использовать указатели для имитации возврата массива из вашей функции.

В этом примере 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. Кажется, у вас есть общее (но для меня странное) недоразумение newb ie, что если у вас есть массив размером 10 (скажем), то array[10] можно использовать для ссылки на весь массив. Не думайте, что если у вас есть массив размером 10, то array[10] - это просто ошибка, потому что допустимые индексы для массива размером 10 - от 0 до 9.

0 голосов
/ 07 мая 2020

В этом примере каждый массив в стиле c заменен на std::array. Имейте в виду, что это тот же код, что и ваш, с массивами, поэтому все ошибки программирования все еще присутствуют. А также массивы возвращаются по значению, значит, они копируются. Попытайтесь понять, как использовать 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;
}
0 голосов
/ 07 мая 2020

Я думаю, это сработает:

#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 ++, вы объявляете его как «stati c» и заставляете функцию возвращать указатель.

РЕДАКТИРОВАТЬ: как отмечали многие другие, это не будет работать в многопоточных программах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...