2015-01-22 4 views
-1

это мой первый пост. Я работаю над лабораторией для своего класса CS II (это уже просрочено, поэтому на данный момент я не буду на это начислять очки, но мне все же хотелось бы понять, что я делаю неправильно, чтобы я может быть улучшена.Код нигде не близок к завершению, но я попал в зависание, которое мешает мне продолжать. Извиняюсь заранее, я очень ржавчу на этом, и до того, как я стал ржавым, я был очень новым. до 4 утра, пытаясь заставить это работать вчера вечером, поэтому мой код, вероятно, довольно гнусно выглядит на данный момент.Dynamically-Allocated Array Только сохранение первого из нескольких значений, генерируемых пользователем

Хорошо, так что моя проблема в том, что: при однократном выполнении кода, первая функция, getNoMonths, работает отлично. Она запрашивает у пользователя количество месяцев продаж, на которые они хотели бы обрабатывать данные, и сохраняет номер в no_Months еще в main. Валидация для значения, которое должно быть твин 3 и 6 также отлично работает.

Когда мы добираемся до getSales, возникает проблема. Функция запрашивает значения продаж в течение нескольких месяцев, определенных пользователем ранее. Кажется, что он отлично работает. Однако при ближайшем рассмотрении кажется, что только первое значение фактически хранится в sales, который должен быть массивом, размер которого динамически распределяется в зависимости от того, сколько месяцев пользователь определил в течение getNoMonths.

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

Я знаю, что мне нужно сделать здесь:

  • создать массив для хранения данных о продажах за каждый месяц
  • имеет размер этого массива соответствует числу месяцев, вводимой пользователь

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

TL; Мне нужна помощь в получении этого массива sales для хранения ВСЕХ значений, вводимых пользователем, а не только первым. Для этого мне, вероятно, понадобится помощь с настройкой указателя на динамическое выделение размера массива sales, и желательно объяснение того, как, черт возьми, все это на самом деле помогает мне и не просто путается и избыточно, lol.

Исходный код следующим образом:

//Jesse Holland 
//Lab1Out 
//Processes Sales Data, Displays as a Bar Graph presentation 

#include <iostream> 
#include "graph1.h" 

using namespace std; 

//FUNCTION PROTOTYPES 
int getNoMonths(int& no_months); //prompts for number of months of sales data to be processed 
void getSales(int* sales, int no_months); //prompts for sales data, stores corresponding data in "sales" 
int getMax(int* sales, int no_months, double & max); //maximum value for "sales" array 
int getMin(int* sales, int no_months, double & min); //minimum value for "sales" array 
double getAvg(int* sales, int no_months, double & avg); //computes avg of sales data stored in "sales" array 
void displayResults(int* sales, int no_months, int max, int min, double avg); //displays bar chart diagram 

//MAIN FUNCTION START 
int main() 
{ 
    double max = 0; 
    double min = 0; 
    double avg = 0; 
    int no_months = 0; 

    //prompt for number of months 
    getNoMonths(no_months); 

    //variable declaration 
    int * sales = new int[no_months]; 

    //prompt for sales data 
    getSales(sales, no_months); 

    //maximum value of "sales" array 
    getMax(sales, no_months, max); 

    //minimum value for "sales" array 
    getMin(sales, no_months, min); 

    //computes avg of sales data stored in "sales" array 
    getAvg(sales, no_months, avg); 

    //displays bar chart diagram in graphics window 
    displayResults(sales, no_months, max, min, avg); 

    return 0; 
} 

//FUNCTIONS IMPLEMENTATION START 
int getNoMonths(int& no_months) // int* months) 
{ 
    do 
    { 
     cout << "Please enter the number of months you'd like to process: <must be at least 3, but no more than 6>:"; 
     cin >> no_months; 
     //int* months = new int[no_months]; 
    }while ((no_months < 3) || (no_months > 6)); 

    return no_months; 
} 

void getSales(int* sales, int no_months) 
{ 
    int count = 0; 

    for (count = 0; count < no_months; count++) 
    { 
     cout << "Please enter sales for month #" << (count + 1) << ": "; 
      cin >> sales[count]; 
    } 
} 

int getMax(int* sales, int no_months, double & max) 
{ 
    //int max = 0; 

    for(int count = 0; count < no_months, count++;) 
    { 
     if (sales[count] > max) 
      max = sales[count]; 
    } 

    return max; 
} 

int getMin(int* sales, int no_months, double & min) 
{ 
    //int min = 0; 
    int count = 0; 

    for (count = 0; count < no_months; count++) 
    { 
     if (sales[count] < min) 
      min = sales[count]; 
    } 

    return min; 
} 

double getAvg(int* sales, int no_months, double & avg) 
{ 
    int sum = 0; 

    for(int count = 0; count < no_months; count++) 
     sum += sales[count]; 

    return avg = (sum/no_months); 
} 

void displayResults(int* sales, int no_months, int max, int min, double avg) 
{ 
    cout << "The maximum is " << max << ". \n"; 
    cout << "The minimum is " << min << ". \n"; 
    cout << "The average is " << avg << ". \n"; 
} 

Благодаря очень, очень много заранее для любых и всех помощь. Я очень, очень зеленый вообще, и хотя я очень стараюсь это получить, это кажется невозможным. Я полна решимости узнать, как все это работает и уметь ПОНИМАТЬ его, чтобы я мог воспроизвести его сам, но сейчас мне нужна небольшая помощь. Трудно не иметь друзей, что ничего подобного в этом материале и профессора, который не очень заинтересован в том, чтобы сесть со мной и помочь мне разобраться в этом. Во всяком случае, я с нетерпением ожидаю услышать от вас, ребята, и, надеюсь, изучать некоторые вещи. Может быть, однажды я смогу научиться достаточно, чтобы иметь возможность вернуть пользу новым людям, чем я.

ОБНОВЛЕНИЕ: Обновлен исходный код; среднее значение вычисляется и выводится в настоящее время, но по-прежнему не может заставить max и min делать то же самое. Благодарим за помощь до сих пор, конечно, любой дополнительный вход будет оценен.

+0

Существует два способа получить значение из функции. Верните его или выведите его через ссылочный (или указательный) параметр. В общем, не делайте одновременно оба. Выбери один. getMax не должен полагаться на правильное задание значения параметра max. max должна быть локальной переменной, равной 0. Ваша средняя функция не обновляет параметр avg по ссылке, но вы полагаетесь на это, чтобы вывести результат. Если вы не накладываете ни sum, ни no_months на тип с плавающей точкой, выполняется только целочисленное деление. –

+0

@NeilKirk Спасибо за ввод. Быстрый вопрос, по «локальной переменной», вы имеете в виду, что мне нужно поставить «int max = 0;» ВНУТРИ функции getMax и НЕ внутри основного? –

+0

@NeilKirk Также, как я могу обновить параметр avg по ссылке, как вы упомянули? Мне нужно было бы изменить «двойную avg» в прототипе функции и определении на «double & avg»? Наконец, вы могли бы немного подробнее рассказать о последнем фрагменте того, что вы сказали? Еще раз спасибо за ваш вклад и извините за все вопросы noob. –

ответ

0

Ваша главная проблема, кажется, int no_months = 0; следуют int * sales = new int [no_months];, которые в основном выделяет массив размера 0. Try вызывающего getNoMonths перед выделением массива и исправить возвращаемые типы.

+0

Спасибо, попробуем сегодня вечером и узнаем, работает ли это! –

+0

Что вы имели в виду под «исправить возвращаемые типы»? –