Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 14

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

19.09.2012, 01:28. Показов 2277. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне дали сделать задачку, чтобы проверить мои знания в ООП (я только 2 месяца назад начал изучать С++).
И так, задача:
Определить класс (или структуру данных при использовании процедурного подхода), описывающий покупку одного и того же штучного товара по одной и той же цене (в рублях) в течение одного месяца и содержащий сведения о дне покупки и количестве приобретенных единиц.
Допускаются еще три варианта покупок:
1. со скидкой, задаваемой процентом от стоимости;
2. со скидкой в цене (например, цена товара 5000 руб., скидка 300 руб.);
3. с надбавкой за транспортные расходы на доставку товара.
Создать консольное приложение, в котором последовательно выполнить следующие задания:
– определить набор покупок различного вида (не менее 10);
– вывести на консоль в табличном виде (можно без границ) набор покупок (полный состав атрибутов);
– вычислить и вывести стоимость всех покупок;
– отсортировать покупки по возрастанию дня покупки и вывести их на консоль;
– определить, была ли покупка в десятый день месяца.

Требования:
– Использовать объектно-ориентированный подход для описания покупок.
– Массив или коллекцию покупок инициализировать в коде с помощью конструктора или метода. Как следствие, не использовать внешние источники данных: консоль (т.е. ввод с клавиатуры), файлы, СУБД, XML и т.п.
– Приложение должно быть консольным. Не использовать графический интерфейс! Таким образом, приложение ничего не должно вводить, а только выводить результаты на консоль.

Предпочтения по выбору:
– языка программирования: 1) Java; 2) C++; 3) другой ООП язык.
– реализации сортировки и поиска: 1) интерфейс внешних библиотек; 2) собственный код.
Я написал программу, и теперь прошу Вас проверить ее на "идусость" и подсказать, где можно уменьшить код, где что поменять, чтобы программа выгладила красиво. И мне нужно добавить больше ООП.

собственно исходный код ниже:
Заголовочный файл "shopping_list.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef SHOPPING_LIST_H_
#define SHOPPING_LIST_H_
namespace SHOPLIST
{
    class ShoppingList
    {
    private:
        static const int price = 5000;                      //цена товара
        int dayOfMonth;                                     //день покупки
        int count;
        int discountPercent;                                //скидка задаваемая процентом от стоимости
        int discountPrice;                                  //скидка в цене
        int bonusAllowance;                                 //надбавка за транспортные расходы
    public:
        ShoppingList();                                     //конструктор по умолчанию
        ShoppingList(int day, int discPer, int discPr, int bonus, int cnt); //конструктор
        ~ShoppingList();                                    //диструктор
        int returnDay() const {return dayOfMonth;}          //возвращает значение дня покупки
        int returnPrice() const;                            //возвращает окончательную цену за вычетом процентов и тп
        friend void sortingShList(ShoppingList * t);        //сортировка по возрастанию
        friend void ShowDays(ShoppingList * t);
        friend std::ostream & operator<< (std::ostream & os, const ShoppingList & t);   
    };
    long int amountOfPurchases(ShoppingList * t);
    void Swap(ShoppingList * Arr, int i);
    void checkDate(ShoppingList * t, int day = 10);
    void ShowDays(ShoppingList * t);
    void exitTime(void);                                    //чтобы программа сама закрывалась
}
#endif
файл с функциями "shopping_list.cpp"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <algorithm>
#include <ctime>
#include "shopping_list.h"
namespace SHOPLIST
{
    ShoppingList::ShoppingList()
    {
        dayOfMonth = discountPercent = discountPrice = bonusAllowance = 0;
    }
    ShoppingList::ShoppingList(int day, int discPer, int discPr, int bonusAll, int cnt)
    {
        dayOfMonth = day;
        count = cnt;
        discountPercent = discPer;                              
        discountPrice = discPr;                             
        bonusAllowance = bonusAll;
    }
    ShoppingList::~ShoppingList()
    {
 
    }
    int ShoppingList::returnPrice() const
    {
        return (price * count) - (price * count * discountPercent / 100) - discountPrice + bonusAllowance;
    }
    std::ostream & operator<< (std::ostream & os, const ShoppingList & t)
    {
        os << t.dayOfMonth << "\t" << t.count << "\t" << t.discountPercent
            << "\t\t" << t.discountPrice << "\t\t" << t.bonusAllowance 
            << "\t\t" << t.returnPrice() << std::endl;
        return os;
    }
    void sortingShList(ShoppingList * Arr)
    {       
        int Start, Left;
        Start = Left = 0;
        int N = 15;
        int Right, Last;
        Last = Right = N-1;
        do
        {
            for (int i = Right; i >= Left; i--)         //Сдвигаем к концу массива "легкие элементы"
            {
                if (Arr[i-1].dayOfMonth > Arr[i].dayOfMonth)
                {
                    Swap(Arr, i);
                    Last = i;                           //Запомнить место пследней перестановки
                }
            }
            Left = Last + 1;
            for (int i = Left; i <= Right; i++)         //Сдвигаем к началу массива "тяжелые элементы"
            {
                if (Arr[i-1].dayOfMonth > Arr[i].dayOfMonth)
                {
                    Swap(Arr, i);
                    Last = i;                           //Запомнить место пследней перестановки
                }
            }
            Right = Last - 1;
        }
        while (Left <= Right);
    }
    void Swap(ShoppingList * Arr, int i)
    {
        ShoppingList TEMP;
        TEMP = Arr[i];
        Arr[i] = Arr[i-1];
        Arr[i-1] = TEMP;
    }
    void checkDate(ShoppingList * t, int day)
    {
        int qq = 0;
        std::cout << "\n\nПокупки совершенные в " << day << " день:\n";
        for (int i = 1; i < 15; i++)
            if (t[i].returnDay() == day)
            {
                ++qq;
                std::cout << t[i];
            }
        std::cout << "\nБыло совершено " << qq << " покупок.\n";
    }
    long int amountOfPurchases(ShoppingList * t)
    {
        int SUM = 0;
        for (int i = 0; i < 15; i++)
            SUM = SUM + t[i].returnPrice();
        return SUM;
    }
    void ShowDays(ShoppingList * t)
    {
        std::cout << "\nДень\tКол-во\tСкидка %\tСкидка R\tНадбавка\tЦена\n";
        for (int i = 0; i < 15; i++)
            std::cout << t[i];
    }
    void exitTime(void)
    {
        float secs = 10;
        clock_t delay = secs * CLOCKS_PER_SEC;
        clock_t start = clock();
        while (clock() - start < delay);
    }
}
ну и главный файл main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <ctime>
#include "shopping_list.h"
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    using SHOPLIST::ShoppingList;
    srand(time(0));
    const int NUM = 15;                     //определяется и отображается набор покупок                    
    ShoppingList purchase[NUM];
    int iday, idiscA, idiscB, ibon, icnt;
    for (int i = 0; i < NUM; i++)
    {
        iday = rand() % 30 + 1;
        idiscA = rand() % 80;
        idiscB = rand() % 1000;
        ibon = rand() % 1000;
        icnt = rand() % 10 + 1;
        purchase[i] = ShoppingList(iday, idiscA, idiscB, ibon, icnt);
    }
    ShowDays(purchase);
    std::cout << "\n\nСтоимость всех покупок\n"
              << " с учетом скидок и надбавок за транспортные расходы составило: " 
              << amountOfPurchases(purchase) << " рублей.\n\n";
    sortingShList(purchase);
    ShowDays(purchase);
    checkDate(purchase);
    std::cin.get();
    SHOPLIST::exitTime();
    return 0;
}
Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2012, 01:28
Ответы с готовыми решениями:

Не стыдно ли показать что-то такое потенциальному работодателю, чтобы претендовать на должность стажера/джуниора?
https://github.com/bikunororu/My-Way Не прошу вникать и пр., так как ценю ваше время. Какие есть общие рекомендации для развития?

Что нужно добавить чтобы так можно было писать код?
ниже кусок кода ' область связывания переменных с ячейками Сorrect = Worksheets(&quot;dde&quot;).Cells(8, 2) pips =...

Код готовый, нужно вынести условия из case. Чтобы в case осталась только проверка
var s:string; k,n1,n2:integer; begin repeat Writeln('Write number:'); Readln(k); s:=('Mi sobrali ')...

9
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
19.09.2012, 07:39
- почему класс называется "список" если это фактически одна единственная запись?
- необычно, что цена константное статическое поле. я понимаю, что цена в пределах месяца постоянная, но может в другом месяце она будет другая?
- в конструкторе использовать списки инициализации
C++
1
2
3
4
ShoppingList::ShoppingList(int day, int discPer, int discPr, int bonusAll, int cnt):
    dayOfMonth(day),
    ...
{}
- почему у функции проверки даты значение по умолчанию именно 10 ?
- в функции вычисления цены можно убрать скобки - приоритеты не дадут выражению вычисляться иначе
- в функции оперирующие с массивом нужно передавать его размер - указание волшебного числа 15 внутри - это плохо
- блок ожидания в конце программы можно заменить на system("pause") - во всяком случае если вы работаете под Windows и нажатие клавиши для выхода из программы не считается вводом... функция exitTime в любом случае тяжелая. там должно было быть Sleep, но я подозреваю, что она была сделана так как сделана, что бы быть переносимой на другие платформы. цикл в этой функции будет грузить систему.
- для хранения списка можно использовать не только массив. например, std::list.
- для сортировки списка можно использовать библиотечную функцию qsort. или, если список хранить в std::list определить свою функцию sort
- сделать имена единообразными - они то с большой буквы начинаются, то с малой. некоторые имена набраны большими - обычно это делают для макроопределений.
- осмыслить для себя, что означает имя каждой функции. например, sortingShList - я так понимаю сортированный список, то есть имя формируется по наименованию результата. однако в то же время имеем функцию ShowDays - имя сформировано по производимому действию.
- зачем ShowDays вызывается два раза?
- если используется std::endl, то как правило не используется \n
=
а так вообще нормально.

Добавлено через 10 минут
...больше ООП будет только наверное если вместо массива сунуть std::list и переопределить для него sort.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//res = true - x должен быть расположен перед y
static bool cmp
(
    const ShoppingList * const x, const ShoppingList * const y
)
{
    return x->dayOfMonth < y->dayOfMonth;
}
 
std::list<ShoppingList *> objs;
objs.push_back(new ShoppingList(...));
objs.sort(cmp);
 
//для прохода по списку
for
(
    std::list<ShoppingList *>::iterator i = objs->begin();
    i != objs->end();
    i++
)
{
    if ((*i)->dayOfMonth == ...) ...
}
ну и тогда сделать функцию освобождения памяти перед выходом
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 08:59
vxg, для сортировки списка можно использовать библиотечную функцию qsort. или, если список хранить в std::list определить свою функцию sort
Все же использовать std::sort, а для list-а написать всего лишь свой предикат, а не sort ( в сущности для std::sort тоже написать просто свой предикат).
0
 Аватар для defer
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
19.09.2012, 09:03
Цитата Сообщение от ForEveR Посмотреть сообщение
Все же использовать std::sort, а для list-а написать всего лишь свой предикат
Покажите пример предиката для list
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.09.2012, 09:04
defer, Дык выше на пост же есть + http://en.cppreference.com/w/c... /list/sort
0
19.09.2012, 09:24

Не по теме:

ForEveR, да, не так выразился, имелось ввиду определение cmp

0
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 14
19.09.2012, 10:21  [ТС]
vxd, спасибо, за такой большой ответ но ты задание не внимательно прочел.
на счет имен, передачи размера массива и тп - я учел, изменил в коде.
а на счет list(), я пока этого не изучил. Ты мог бы отправить меня где обьясняется для чайников, что это и с чем его едят дай ссылочку. А то я нашел пару ресурсов, но пока самому разобраться без примеров не могу.
http://ru.cppreference.com/w/cpp/container/list
http://www.rsdn.ru/forum/src/2261478.1

Можно пример на моем коде привести с использованием list?
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
19.09.2012, 13:20
пример для main

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    std::list<ShoppingList> purchase;
 
    for (int i = 0; i < NUM; i++)
    {
        iday = rand() % 30 + 1;
        idiscA = rand() % 80;
        idiscB = rand() % 1000;
        ibon = rand() % 1000;
        icnt = rand() % 10 + 1;
        purchase.push_back(ShoppingList(iday, idiscA, idiscB, ibon, icnt));
    }
 
    std::cout << "\n\nСтоимость всех покупок\n"
                  << " с учетом скидок и надбавок за транспортные расходы составило: " 
                  << amountOfPurchases(&purchase) << " рублей.\n\n";
пример для функции

C++
1
2
3
4
5
6
7
8
9
10
11
12
    long int amountOfPurchases(std::list<ShoppingList> *t)
    {
        int SUM = 0;
        for
        (
            std::list<ShoppingList>::iterator i = t->begin();
            i != t->end();
            i++
        )
            SUM += i->returnPrice();
        return SUM;
    }
сортировка

C++
1
2
3
4
5
6
7
8
9
10
11
12
//res = true - x должен быть расположен перед y
static bool cmp
(
    const ShoppingList &x, const ShoppingList &y
)
{
    return x.dayOfMonth < y.dayOfMonth;
}
 
...
purchase.sort(cmp);
...
Добавлено через 2 минуты
"изучал" по этому http://mirknig.com/2007/10/01/... mista.html
(качать по ссылке на депозитфайл)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.09.2012, 13:30
Цитата Сообщение от DraikoN Посмотреть сообщение
void sortingShList(ShoppingList * Arr)
* * { * * *
* * * * int Start, Left;
* * * * Start = Left = 0;
* * * * int N = 15;
* * * * int Right, Last;
* * * * Last = Right = N-1;
* * * * do
* * * * {
* * * * * * for (int i = Right; i >= Left; i--) * * * * //Сдвигаем к концу массива "легкие элементы"
* * * * * * {
* * * * * * * * if (Arr[i-1].dayOfMonth > Arr[i].dayOfMonth)
* * * * * * * * {
* * * * * * * * * * Swap(Arr, i);
* * * * * * * * * * Last = i; * * * * * * * * * * * * * //Запомнить место пследней перестановки
* * * * * * * * }
* * * * * * }
* * * * * * Left = Last + 1;
* * * * * * for (int i = Left; i <= Right; i++) * * * * //Сдвигаем к началу массива "тяжелые элементы"
* * * * * * {
* * * * * * * * if (Arr[i-1].dayOfMonth > Arr[i].dayOfMonth)
* * * * * * * * {
* * * * * * * * * * Swap(Arr, i);
* * * * * * * * * * Last = i; * * * * * * * * * * * * * //Запомнить место пследней перестановки
* * * * * * * * }
* * * * * * }
* * * * * * Right = Last - 1;
* * * * }
* * * * while (Left <= Right);
* * }
- я бы её написал 1-й строкй через std::sort и friend функцию сравнения для ShoppingList, мне кажется это глупо чтоли юзать продвинутые алгоритмы и до сих пор вот так сортировать, также для всех покупок я бы завёл вектор (в него и добавлять легко и сортировать). Было бы больше времени полностью перекроил бы весь код, он очень раздут, но за неимением такового(времени) могу лишь написать свои мысли...

Добавлено через 1 минуту
Упс, увидел посты 4,5 ну да именно, а для хранения покупок vector
0
0 / 0 / 0
Регистрация: 07.08.2012
Сообщений: 14
19.09.2012, 18:18  [ТС]
Друзья, всем спасибо
Узнал, что такое list()
И за справочник отдельное спасибо vxg
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2012, 18:18
Помогаю со студенческими работами здесь

Что нужно сделать, чтобы данную функцию можно было вызвать еще раз, не меняя ее код
Функцию add() из фрагмента кода вызвали 10 раз. Что нужно сделать, чтобы эту функцию можно было вызвать еще раз, при этом не меняя...

Как оптимизировать ListviewAdapter чтобы не было разрывов при скроллинге
Есть адаптер из него не удалось сделать плавный скроллин . Мой ListviewAdapter public class ListViewAdapter extends BaseAdapter...

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

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

Нужно оптимизировать код
Не могу понять как можно оптимизировать данную программу: var s: string; s1, s2, s3, i, n: integer; a: arrayof string; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru