2017-02-13 6 views
1

Существует несколько строк моего кода, которые я хотел бы определить как функцию, потому что я планирую использовать ее несколько раз. часть кода выглядит следующим образом:C++ beginner объявляет функцию с массивом структур

// loop within loop used to reorder with highest price at the top 
for(i=0;i<x;i++){ 
    for(t=i;t<x;t++){ 
     if(f[i].price < f[t].price) { 
      temp = f[i].price; 
      f[i].price = f[t].price; 
      f[t].price = temp; 
     } 

    } 
} 

Я надеюсь, чтобы иметь возможность ввести новые значения для х и е каждый раз, когда я вызываю функцию. Я включил весь мой код ниже. Если я не понимаю, в чем бы дело, не стесняйтесь спрашивать. Я заранее извиняюсь за неправильную терминологию, которую я новичок в этом. Спасибо

#include <iostream> 
using namespace std; 

struct List 
    { 
     char name[10]; 
     int price; 
     }; 

int main() 
{ 
    //x represents number of structures within array! 
    int x; 

    cout << "How many items would you like to list under the fruit menu?\n"; 
    cin >> x; 


    //array of structures fruit 
    struct List f[x]; 

    int i; 

    //input values into structure 
    for (i = 0; i < x; i++) { 
     cout << "\nEnter fruit name, and price.\n"; 
     cin >> f[i].name; 
     cin >> f[i].price; 
    }; 

    //variables for reordering 
    int temp; 
    int t; 


    // loop within loop used to reorder with highest price at the top 
    for(i=0;i<x;i++){ 
     for(t=i;t<x;t++){ 
      if(f[i].price < f[t].price) { 
       temp = f[i].price; 
       f[i].price = f[t].price; 
       f[t].price = temp; 
      } 

     } 
    } 


    //Output of menus 
    //fruit Menu 
    cout << "\n\nFruit Menu"; 
    for (i = 0; i < x; i++) { 
     cout << "\n" << f[i].name << " $" << f[i]. price; 
     }; 


    return 0; 
} 
+0

Так в чем ваш вопрос? – SingerOfTheFall

+1

Использование 'std :: sort()' будет намного лучше - Bubble Sort почти никогда не будет хорошей идеей! –

+0

Подсказка: следуйте довольно старому принципу, который гласит: «отдельный вход от процесса с выхода». Поэтому напишите функцию, которая собирает ввод, записывает функцию для переупорядочения, а затем функцию для печати результатов. Объедините их так, как вам нравится. –

ответ

0

Если вы просто хотите, чтобы передать массив в функцию вы можете сделать так, как это:

void sortArray(struct List list[]); 
void sortArray(struct List* list, int n); // n = size of array 

может быть лучше просто использовать зЬй :: вектор или какой-либо другой список контейнер вместо , :)

0

Похоже, вы хотите получить функцию, которая получает массив t и индекс x, и вы хотите мутировать массив в функции?

C++ - это «передать по значению», поэтому, чтобы мутировать массив, у вас должна быть ссылка на ссылку (или указатель) на массив, чтобы вы мутировали исходный массив, а не его копию, поэтому просто введите свою подпись функции следующим образом: func(T& t, int x) (предполагая, что T - тип массива t).

+0

Целью функции является сортировка структур в массиве по цене, которую она успешно выполняет. Однако я планирую несколько раз использовать эти несколько строк сортировки, поскольку я хочу сортировать другие меню по цене i.e Dairy, Beverage и т. Д. Извините, моя терминология не годится, но x - количество структур с массивом. t - это просто случайная величина, которую я использовал для кода сортировки, а f относится к массиву, который нужно отсортировать. Значения, которые я хотел бы изменить при вызове функции, - это f и x, чтобы функция могла сортировать другие массивы структур с разным количеством структур. –

+0

Не уверен, что это имело смысл, но я ценю ваши усилия. –

1

Я предполагаю, что это назначение, которое говорит: «Внесите свою собственную функцию сортировки для сортировки массива фруктов», поэтому я беру структуру данных «массив фруктов», как указано. Вы можете, конечно, изменить это на vector<struct Fruit>, но это другая тема.

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

Удачи!

#include <iostream> 
using namespace std; 

struct Fruit 
{ 
    char name[10]; 
    int price; 
}; 

// enter up to nrOfFruis; return number of fruits actually entered 
int enterFruits(struct Fruit *fruits, int maxNrOfFruits) { 
    int entered = 0; 
    while (entered < maxNrOfFruits) { 

     cin >> fruits[entered].name; 

     entered++; 
    } 
    return entered; 
} 

void sortFruits(struct Fruit* fruits, int nrOfFruits) { 

    // your sort code goes here 

    // example for swaping two elements: 
    Fruit temp = fruits[0]; 
    fruits[0] = fruits[1]; 
    fruits[1] = temp; 
} 

void printFruits(struct Fruit *fruits, int nrOfFruits) { 

    cout << "\n\nFruit Menu"; 
    for (int i = 0; i < nrOfFruits; i++) { 
     cout << "\n" << fruits[i].name << " $" << fruits[i]. price; 
    }; 
} 



int main() 
{ 
    // Your task: put a proper loop and exit condition arround the following lines... 

    int x; 
    cout << "How many items would you like to list under the fruit menu?\n"; 
    cin >> x; 

    struct Fruit fruits[x]; 
    int entered = enterFruits(fruits, x); 
    sortFruits(fruits, entered); 
    printFruits(fruits, entered); 

    return 0; 
} 
1

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

//x represents number of structures within array! 
int x; 

cout << "How many items would you like to list under the fruit menu?\n"; 
cin >> x; 


//array of structures fruit 
struct List * f = new List[x]; 

//... 

delete [] f; 

В качестве альтернативы, вы можете сделать это на сообщение ++ путь C, используя вектор, имеющий векторные элементы в стеке:

int x; 
std::cin>>x; 
std::vector<A> v(x); 

for(size_t i = 0; i < x; i++) 
{ 
    std::cin >> v[i].x; 
} 
+0

@ M.M Вы правы. Удалены –

Смежные вопросы