Система сад спринклерной


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

Задания:

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

Примечание: входы и выходы для ниже указанных данных. Когда я проверить программы вам будет предложено ввести различные значения в ходе выполнение программы.

  • Есть 3 региона в саду: Ф-цветы В-Овощные Б-Ягод. Отчет неверный выбор сад, если F, V или B является не вошли по выбору сад.
  • Если температура выше 40 затем степени основано на осаждении его можно поливать. Цветок Сад следует поливать, когда количество осадков меньше, чем 0.15 дюймов. Огород надо поливать, когда менее 0.375 дюймов и ягод следует поливать, когда там меньше, чем 0.425 дюймов. В ней должно быть что огород поливают или нет.

Пример программы мероприятий

Garden Sprinkler System

What is the temperature in degrees(F)? 78                             
How much precipitation today(in inches)?.1                            
The Garden Divisions are F-Flowers  V-Vegetable B-Berries             
Which do you choose (FVB)? B

Given the temperature is 78 degrees and 0.100 inches of precipitation
today.  The Berries in the Garden will be watered.       

Или

Garden Sprinkler System

What is the temperature in degrees(F) ?32                             
How much precipitation today(in inches)?0.2                           
The Garden Divisions are F-Flowers  V-Vegetable B-Berries             
Which do you choose (FVB)? V                                          

Given the temperature is 32 degrees and 0.200 inches of precipitation
today.  The Vegetables in the Garden will NOT be watered.

Мой ответ код

# include <iostream>
# include <stdio.h>
# include <iomanip>

using namespace std;

int main()
{
    char Typ;
    string Bry = "berries";
    string Veg = "vegetables";
    string Flr = "flowers";
    string  AllStr;
    float Tmp1, Precip;
    int Tmp, FlrW, VegW, BryW, x, Selct;
    bool Cont = true;
    AllStr = Flr + ", " +   Bry + ", " + "and " + Veg;
    Selct = 0;
    x = 0;
    cout << setprecision(3)<<fixed;
    cout<< "Garden Sprinkler System\n\n\n\n";
    cout<< "What is the temperature in degrees(F) ? ";
    cin>>Tmp1;
    cout<<"How much precipitation today (in inches)? ";
    cin>>Precip;
    cout<< "The Garden Divisions are F-Flowers  V-Vegetable B-Berries";
    cout<<"\nWhich do you choose (FVB)? ";
    cin>> Typ;
    Tmp = static_cast<int>(Tmp1);
    for (x  = 1; x <= 4; x++){
        if(x == 4 ){
            cout<<"\nToo many failed attempts.... exiting program";                cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n(loser)";
            Cont = false;                break;
        }
        if (Typ == 'B' || Typ == 'b'){
            Selct =  100;
            break;
        }
        else if  (Typ == 'F' || Typ == 'f'){
            Selct =  10;
            break;
        }
        else if  (Typ == 'V' || Typ == 'v'){
            Selct =  1;
            break;
        }
        else {
            cout<< "\nThe value entered was an INVALID value!";
            cout<< "\nThe Garden Divisions are F-Flowers  V-Vegetable B-Berries";
            cout<<"\nWhich do you choose (FVB)? ";                cin>> Typ;
        }        }
    if (Cont == true){
        if (Tmp > 40){

            switch(Selct){
                case 100:
                    if (Precip < 0.425){
                        cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<<               Precip<<" inches ";
                        cout<< "of precipitation today.";
                        cout<< "\nThe "<< Bry<<" in the Garden will be watered.";
                        break;
                    }
                    else{
                        cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip <<" inches of";
                        cout<<" precipitation today.\nThe "<< Bry <<" in the Garden will NOT be watered.";
                        break;
                    }
                case 10:
                    if (Precip < 0.375){
                        cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip<<" inches ";
                        cout<< "of precipitation today.";
                        cout<< "\nThe "<< Flr <<" in the Garden will be watered.";
                        break;
                    }
                    else{
                        cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip <<" inches of";
                        cout<<" precipitation today.\nThe "<< Flr <<" in the Garden will NOT be watered.";
                        break;
                    }
                case 1:
                    if (Precip < 0.15){
                        cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip<<" inches ";
                        cout<< "of precipitation today.";
                        cout<< "\nThe "<< Veg<<" in the Garden will be watered.";
                        break;
                    }
                    else{
                        cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip <<" inches of";
                        cout<<" precipitation today.\nThe "<< Veg<< " in the Garden will NOT be watered.";
                        break;
                    }
                default:
                    cout<< "\n\n\n\nThough the temperature is "<< Tmp <<" degrees and "<< Precip <<" inches of";
                    cout<<" precipitation today.\nThe garden type selection was invalid and the "<< AllStr<<endl;
                    cout<<"in the Garden will NOT be watered.";
            }
        }
        else{
            cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip <<" inches of";
            cout<<" precipitation.\nThe "<< AllStr<< " in the Garden will NOT be watered today.";
            cout<<"\nBecause it is too cold.";
        }
    }
    getchar();
    getchar();

    return 0;
}


1041
6
задан 15 октября 2011 в 12:10 Источник Поделиться
Комментарии
2 ответа

Мои мысли:


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

  2. Ваши имена переменных сбивают с толку и дают мало признаков того, что они предназначены для

  3. Вы используете магические числа 100, 10, 1 для обозначения различных видов растений, которые трудно отслеживать

  4. У вас точно такие же строки кода снова и снова (это, наверное, то, что учитель имел в виду слишком много строк)

  5. Ваш код не имеет последовательного вдавливания, что делает его трудно читать.

Давайте рассмотрим небольшой кусок кода:

 if (Precip < 0.375){
cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip<<" inches ";
cout<< "of precipitation today.";
cout<< "\nThe "<< Flr <<" in the Garden will be watered.";
break;
}
else{
cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip <<" inches of";
cout<<" precipitation today.\nThe "<< Flr <<" in the Garden will NOT be watered.";
break;
}

Первая строка кода одинаков в обоих случаях, мы не должны повторять их, вместо этого мы можем сделать:

 cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip<<" inches ";
if (Precip < 0.375){

cout<< "of precipitation today.";
cout<< "\nThe "<< Flr <<" in the Garden will be watered.";
break;
}
else{
cout<<" precipitation today.\nThe "<< Flr <<" in the Garden will NOT be watered.";
break;
}

Видеть, что этот код проще и меньше повторов, но делает то же самое? Мы можем продолжить. Большая часть текста внутри кода

 cout<< "\n\n\n\nGiven the temperature is "<< Tmp <<" degrees and "<< Precip<<" inches ";
cout<< "of precipitation today.";
cout<< "\nThe "<< Flr <<" in the Garden will be watered.";
if (Precip >= 0.375){
cout << "NOT"
}

cout << "be watered.";
break;

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

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

#include <iostream>
#include <stdio.h>
#include <iomanip>

using namespace std;

enum GardenDivision
{
BERRIES,
VEGETABLES,
FLOWERS
};

struct Garden
{
GardenDivision division;
int temperature;
float percipitation;
};

bool read_user_input(Garden & garden)
{
cout << setprecision(3) << fixed;
cout << "Garden Sprinkler System\n\n\n\n";
cout << "What is the temperature in degrees(F) ? ";
cin >> garden.temperature;
cout << "How much precipitation today (in inches)? ";
cin >> garden.percipitation;
cout << "The Garden Divisions are F-Flowers V-Vegetable B-Berries";
cout << "\nWhich do you choose (FVB)? ";

for(int counter = 0; counter < 4;counter++)
{
char division_code;
cin >> division_code;
switch(division_code)
{
case 'F':
case 'f':
garden.division = FLOWERS;
return true;
case 'V':
case 'v':
garden.division = VEGETABLES;
return true;
case 'B':
case 'b':
garden.division = BERRIES;
return true;
}

cout << "\nThe value entered was an INVALID value!";
cout << "\nThe Garden Divisions are F-Flowers V-Vegetable B-Berries";
cout << "\nWhich do you choose (FVB)? ";
}

cout << "\nToo many failed attempts.... exiting program";
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n(loser)";
return false;
}

void display_weather(Garden & garden)
{
cout << "\n\n\n\nGiven the temperature is "<< garden.temperature <<
" degrees and " << garden.percipitation
<< " inches of precipitation today.\n";

}

void water_section(Garden & garden, string name, float max_perciptiation)
{
if(garden.percipitation < max_perciptiation)
{
cout << "\nThe "<< name << " in the Garden will be watered.";
}
else
{
cout << "\nThe "<< name << " in the Garden will NOT be watered.";
}
}

void water_by_section(Garden & garden)
{
switch(garden.division)
{
case FLOWERS:
water_section(garden, "Flowers", 0.375);
break;
case VEGETABLES:
water_section(garden, "Vegetables", 0.15);
break;
case BERRIES:
water_section(garden, "Berries", 0.425);
break;
}
}

int main()
{
Garden garden;
if(read_user_input(garden))
{
display_weather(garden);
if(garden.temperature > 40)
{
water_by_section(garden);
}
else
{
cout << "The berries, vegetables, and flowers in the Garden will NOT be watered today.";
cout << "\nBecause it is too cold.";
}
}

getchar();
getchar();

return 0;
}

Удачи!

11
ответ дан 15 октября 2011 в 02:10 Источник Поделиться

@Уинстон уже дал некоторые хорошие предложения, но я думаю, что я пойду немного в другом направлении. Я бы начал со структурой данных что-то вроде этого:

struct plant {
char short_name;
std::string name;
float min_water;
};

и конечно же инициализировать его основные данные:

plant plants[] = {
{'b', "berries", 0.425},
{'f', "flowers", 0.375},
{'v', "vegatables", 0.15}
};

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

11
ответ дан 15 октября 2011 в 05:10 Источник Поделиться