2013-11-10 2 views
2

Я преподаю C++ и делаю проблему из учебника. До сих пор я освещал основы, такие как типы данных, декларации, отображения, назначение, интерактивный ввод, выбор (if-else) и повторение (для циклов/while), функции и массивы. Я ничего не сделал с указателями, но я знаю, что они есть ...Возвращающийся массив из функции C++

Я наткнулся на эту проблему:

Ответы на истинное-ложное испытание следующим образом: TTFF T. Учитывая двухмерный массив ответов, в котором каждая строка соответствует ответам, предоставленным в одном тесте, напишите функцию, которая принимает двумерный массив и количество тестов в качестве параметров и возвращает одномерный массив, содержащий оценки для каждого теста. (Каждый вопрос стоит 5 очков, так что максимально возможная оценка 25.) Проверьте свою функцию со следующими данными:

enter image description here

Я понимаю, что функции C++ не могут возвращать массивы - По крайней мере, это то, что я читал на других сообщениях на этом форуме. Это верно? Если да, то как они ожидают, что вы сделаете эти проблемы, потому что я еще не накрыл указатели. Единственный другой способ, который, как я думал, МОЖЕТ быть возможным, - это передать массив по ссылке ... но вопрос только говорит, что есть 2 аргумента функции, поэтому я подумал, что, возможно, этот метод был исключен. Для этого метода потребуется третий аргумент, который является массивом, который вы изменяете, чтобы он неявно возвращался.

У меня есть код, но его не правильно (только моя функция calcgrade нуждается в работе), и я не уверен, как двигаться вперед. Может кто-нибудь проконсультироваться? Спасибо!!

#include<iostream> 

// Globals 
const int NROW = 6, NCOL = 5; 
bool answers[NCOL] = {1, 1, 0, 0, 1}; 
bool tests[][NCOL] = {1, 0, 1, 1, 1, 
         1, 1, 1, 1, 1, 
         1, 1, 0, 0, 1, 
         0, 1, 0, 0, 0, 
         0, 0, 0, 0, 0, 
         1, 1, 0, 1, 0}; 
int grade[NROW] = {0}; 

// Function Proto-Types 
void display1(bool []); 
void display2(bool [][NCOL]); 
int calcgrade(bool [][NCOL], int NROW); 


int main() 
{ 


    calcgrade(tests, NROW); 
    display2(tests); 

    return 0; 
} 

// Prints a 1D array 
void display1(bool answers[]) 
{ 
    // Display array of NCOL 
    for(int i = 0; i < NCOL; i++) 
     std::cout << std::boolalpha << answers[i] << std::endl; 
    return; 
} 

// Print 2d Array 
void display2(bool answers[][NCOL]) 
{ 
    // Display matrix: 6x5 
    for(int i = 0; i < NROW; i++) 
    { 
     for(int j= 0; j < NCOL; j++) 
     { 
      std::cout << std::boolalpha << answers[i][j] << std::endl; 
     } 
     std::cout << std::endl; 
    } 

    return; 
} 

int calcgrade(bool tests[][NCOL], int NROW) 
{ 

    for(int i = 0; i < NROW; i++) 
    { 
     for(int j = 0; j < NROW; j++) 
     { 
      if(tests[i][j]==answers[j]) 
       grade[i] += 5; 
     } 
     printf("grade[%i] = %i", i, grade[i]); 
    } 

    return grade; 
} 
+2

Правильный ответ должен возвращать 'VECTOR'. Если ваш учебник учит вас массивам вместо 'vector', автору не разрешается писать снова. –

+0

Моя книга даже не говорит о векторах .... :( – user1527227

+0

Если у вас есть книга на C++, в которой нет разделов, охватывающих стандартную библиотеку C++, а в случае 'std :: vector <>', возможно самый используемый тип внутри этой библиотеки во всех современных программах на C++, вам нужна другая книга (и этот автор нуждается в другой карьере). – WhozCraig

ответ

1

Попробуйте использовать std::vector.

Векторы представляют собой контейнеры последовательностей, представляющие массивы, которые могут меняться по размеру.

Вы можете сделать так:

vector<bool> function() 
{ 
    vector<bool> vec; 

    vec.push_back(true); 
    vec.push_back(false); 
    vec.push_back(true); 

    return vec; 
} 
0

Вы можете:

  • как вы сказали, возвращают указатель на динамически распределяемой массив,
  • вы можете сделать тип структуры со словом struct, который включает в себя статический массив, далее на C++ Reference и возвращения/возьмите в качестве структуры аргумента вашего типа.
+0

Спасибо. Мне было интересно, есть ли какой-либо альтернативный метод для тех, которые вы упомянули, поскольку я еще не затронул ни одну из этих тем. Я просто хотел узнать, не пропал ли я что-нибудь в чем прочитали до сих пор ... – user1527227

1

Если вы передаете количество тестов в качестве второго параметра, это означает, что вы на самом деле знаете количество тестов, так что вам не нужно используйте vector. Вы можете вернуть динамически выделенный массив (либо используя new, либо malloc).

код будет выглядеть следующим образом:

int* calcgrade(bool tests[][NCOL], int NROW){ 
    int* array = new int[NROW]; 
    for(int i=0;i<NROW;i++) 
    array[i] = calculatedGrade; 
    return array; 
} 
0

Другой способ сделать это было бы создать массив ответов в основной функции, а затем передать его вместе с массивом T/F к вашей функции сортировки. Затем ваша функция оценки может работать с массивом ответов и даже не должна возвращать что-либо.

По существу, когда вы передаете массивы в функциях, вы фактически передаете указатели на массивы, и, таким образом, вы можете работать с ними, как если бы они были переданы по ссылке (что они были).

полу псевдокод например:

void getGrades(const int answerVector, int gradeVector) { 
    // code that computes grades and stores them in gradeVector 
} 
Смежные вопросы