Форум программистов, компьютерный форум CyberForum.ru

Что Вы можете сказать о индусе по его коду - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
tramp13
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
20.07.2012, 08:17     Что Вы можете сказать о индусе по его коду #1
Не так давно взялся учить С++, будучи ещё школотой. Читаю книжку С.Прата "Язык программирования С++". Это дело вроде нравится, но вот интересно, что могут сказать здешние тёртые прогеры про мой быдлокод? По коду же наверно видно, что человеку стоит\не стоит свяязываться с программированием, как таковым. Заранее спасибо.
P.S. Я у вас здесь впервые, так что попрошу не пуляться какашками сразу.
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
//рассчет расходов на мобильную связь в месяц
#include <iostream>
using namespace std;
struct use {
    int call;                   //минуты в день
    float call_price;           //стоимость минуты
    int sms;                    //сообщения в день
    float sms_price;            //стоимость сообщения
    int subscr;                 //абонентская плата
};
struct lowc {
    int call_pa;                //pa- раск, пакет бесплатных минут
    float call_pa_co;           //co- cost, стоимость пакета бесплатных минут
    int call_dis;               //dis- disount, скидка на разговоры
    float call_dis_co;          //стоимость скидки      
    int sms_pa;                 //пакет бесплатных сообщений
    float sms_pa_co;            //стоимость пакета сообщений
    int sms_dis;                //скидка на сообщения
    float sms_dis_co;           //стоимость скидки на сообщения
};
void fill (use *, lowc *);      //заполнение данных
float calc (use *, lowc *);     //вычисление
int main () {
    use all;
    lowc free;
    fill (&all, &free);
    float total;
    total = calc (&all, &free);                                                                    //вычисление
    cout <<"For one month (31 day) of communication you will pay totally " << total <<".\n";         //вывод
    system ("pause");                                                                              //остановка
    return 0;
};
void fill (use *all, lowc *free) {
    cout <<"How much your subscription: ";                   //ввод абонентской платы
    cin >> all->subscr;
    cout <<"How many minutes a day you talk: ";             //количество проговариваемых минут в день
    cin >> all->call;
    cout <<"How many messages a day you send: ";         //количество отправляемых сообщений
    cin >> all->sms; 
    cout <<"Enter price for one minute: ";                                 //стоимость минуты
    cin >> all->call_price;
    cout <<"for message: ";                                     //стоимость сообщения
    cin >> all->sms_price;
    cout <<"How many free minutes a day you have: ";             //пакет бесплатных минут
    cin >> free->call_pa;
    if (free->call_pa != 0){
       cout <<"How  much does them cost (for month)?: ";        //стоимость пакета бесплатных минут
       cin >> free->call_pa_co;
    }
    else 
         free->call_pa_co =0;
    cout <<"How many free messages a day you have: ";            //пакет бесплатных сообщений       
    cin >> free->sms_pa;
    if (free->sms_pa != 0){
       cout <<"How  much does them cost (for month)?: ";           //стоимость пакета бесплатных минут
       cin >> free->sms_pa_co;
    }
    else 
         free->sms_pa_co =0;
    cout <<"Enter a disount for calls: ";                                        //скидка на разговоры
    cin >> free->call_dis;
    if (free->call_dis != 0){
        cout <<"How much does it cost: ";                               //стоимость скидки
        cin >> free->call_dis_co;
     }
     else 
          free->call_dis_co = 0;
    cout << "Enter a disount for messages: ";                                 //скидка на сообщения
    cin >> free->sms_dis;
    if (free->sms_dis != 0){
       cout <<"How much does it cost: ";                                  //стоимость скидки
       cin >> free->sms_dis_co;
     }
     else 
          free->sms_dis_co = 0;
};
float calc (use *all, lowc *free) {
    float total;
    if (all->call < free->call_pa)                                           //защита
        all->call = free->call_pa = 0;
    if (all->sms < free->sms_pa)
        all->sms = free->sms_pa = 0;
    total = free->call_pa_co + free->sms_pa_co + free->call_dis_co + free->sms_dis_co + all->subscr;    //регулярные платежи
    total += ((all->sms - free->sms_pa)*  all->sms_price* double((100-free->sms_dis)/100))*31;      //стоимость сообщений
    total += ((all->call - free->call_pa)* all->call_price* double((100-free->call_dis)/100))*31;   //стоимость разговоров
    return total;
};
Добавлено через 9 минут
чуть не забыл- для чистоты эксперимента код писал в блокноте)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2012, 08:17     Что Вы можете сказать о индусе по его коду
Посмотрите здесь:

C++ Функция вывода символа по коду его клавиши: есть ли такая?
Как сказать циклу C++
Долгожитель (возраст не менее 100 лет) обнаружил однажды, что если к сумме квадратов цифр его возраста прибавить число дня его рождения, то как раз п C++
Можете скомпилировать и сказать работает ли? C++
Что можно сказать об этом #include "stdafx.h" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
20.07.2012, 09:07     Что Вы можете сказать о индусе по его коду #2
Чем дальше тем больше,навярника прочел 100 строник,и решил проверить нормально ли всё ? знакомое чувство...забей на всё и продолжай дальше...пс код вечерком посмотрю,после ночи голова не сооброжает Да и мне кажеться для таких дел ООП саааамый сок
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
20.07.2012, 09:27     Что Вы можете сказать о индусе по его коду #3
Цитата Сообщение от tramp13 Посмотреть сообщение
Не так давно взялся учить С++, будучи ещё школотой. Читаю книжку С.Прата "Язык программирования С++". Это дело вроде нравится, но вот интересно, что могут сказать здешние тёртые прогеры про мой быдлокод? По коду же наверно видно, что человеку стоит\не стоит свяязываться с программированием, как таковым. Заранее спасибо.
P.S. Я у вас здесь впервые, так что попрошу не пуляться какашками сразу.
Ну как можно говорить по коду человека, который только начал изучать с++ - станет он программером или нет Я сам только начал изучать с++, и тоже по Прате Если бы я прошёл только что структуры и функции - я тоже примерно так написал код. Но сейчас уже приступил к объектам и классам, так что переписал бы уж этот код немного по-другому.
Вот аналог тебе: по маленькому ребенку, который только полгодика как разговаривает, трудно судить - станет он хорошим оратором или нет.
Всё всегда приходит с опытым либо с даром от Бога Если дара нету - набирайся опыта. Вот и весь секрет
tramp13
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
20.07.2012, 10:15  [ТС]     Что Вы можете сказать о индусе по его коду #4
нее, прочёл три сотни страниц) Спасибо, буду ждать)

Добавлено через 48 секунд
Цитата Сообщение от Fooly Посмотреть сообщение
Ну как можно говорить по коду человека, который только начал изучать с++ - станет он программером или нет Я сам только начал изучать с++, и тоже по Прате Если бы я прошёл только что структуры и функции - я тоже примерно так написал код. Но сейчас уже приступил к объектам и классам, так что переписал бы уж этот код немного по-другому.
Вот аналог тебе: по маленькому ребенку, который только полгодика как разговаривает, трудно судить - станет он хорошим оратором или нет.
Всё всегда приходит с опытым либо с даром от Бога Если дара нету - набирайся опыта. Вот и весь секрет
ценные слова, спасибо
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.07.2012, 11:00     Что Вы можете сказать о индусе по его коду #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
tramp13, несколько рекомендаций.
  1. Не используйте using namespace. Со временем сами поймете "почему", сейчас просто не используйте.
  2. Я совершенно не могу понять предназначение структуры по ее имени "use". Для сущностей рекомендуется все таки использовать существительные в названиях, а не глаголы. Глаголы больше подойдут для функций и методов.
  3. Тоже самое об именах членов структур. "call_pa" - вместо того, чтобы писать комментарий к названию, лучше сразу дать члену нормальное имя. Если пакет бесплатных минут, то можно было бы попробовать, например, "free_minutes".
  4. Некоторые имена лучше просто не использовать, например имя free - функция стандартной библиотеки, у Вас это имя используется (25 строка). Т.е. могут возникнуть конфликты и, как следствие, трудно-понимаемые ошибки.
  5. Указатели это, конечно, хорошо. Но в C++ лучше использовать ссылки.
  6. Не инициализированные переменные (27 строка) согласно стандарту C++ это Undefined Behaviour (Неопределенное поведение). Стандарт языка не гарантирует корректности выполнения программы в таких случаях.
  7. Форматирование кода в целом не очень радует глаз. Старайтесь разделять логические участки кода пустыми строками.
  8. Комментарии "Заполнение" и "Вычисление" полностью бесполезны. Это и так видно по названию функций. Комментарии не должны дублировать код.
  9. Опять же по стилю. Если Вы выделяете фигурными скобками блок "if", то лучше всего выделить скобками блок "else". И наоборот.
  10. Отсутствуют проверки указателей в функциях на валидность. Всегда сравнивайте указатели с NULL.
  11. Строки 83-85 трудны для восприятия. Лучше их выделить в отдельную функцию.
  12. В этих же строках присутствуют т.н. "магические числа" 100 и 31. Что они означают догадаться сложно.
  13. Опять же в этих строках стоят бесполезные комментарии. Если разбить эти три строки на функции и дать говорящие имена, то необходимость в этих комментариях отпадет. Вообще старайтесь писать код так, чтобы его можно было понять без каких-либо комментариев.

    И еще одно чисто мое субъективное мнение. Я не очень ценю С. Прата как автора книг по программированию, поэтому советую присмотреться к другой литературе.
canopen
411 / 410 / 12
Регистрация: 16.07.2012
Сообщений: 886
20.07.2012, 11:12     Что Вы можете сказать о индусе по его коду #6
Цитата Сообщение от fasked Посмотреть сообщение
tramp13, несколько рекомендаций.
  1. Не используйте using namespace. Со временем сами поймете "почему", сейчас просто не используйте.
У вас похоже большой опыт программирования на С++. Какие с вашей точки зрения есть аргументы против этого? Мне, честно, кажется чем-то сродни мазохизму засорение кода всеми этими std:: А вот человек вас послушает и честно будет их ставить, никогда так и не поняв, нужно ли это в действительности, а если нужно, то для чего.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.07.2012, 11:16     Что Вы можете сказать о индусе по его коду #7
Цитата Сообщение от canopen Посмотреть сообщение
У вас похоже большой опыт программирования на С++. Какие с вашей точки зрения есть аргументы против этого? Мне, честно, кажется чем-то сродни мазохизму засорение кода всеми этими std:: А вот человек вас послушает и честно будет их ставить, никогда так и не поняв, нужно ли это в действительности, а если нужно, то зачем.
Данный вопрос неоднократно поднимался на форуме. Можете воспользоваться поиском и почитать.

Однако, если Вы сможете ответить на вопрос "зачем нужны пространства имен", то сможете сразу найти отрицательные стороны использования "using namespace". Все просто: "using namespace" полностью убивает саму концепцию пространств имен.

Цитата Сообщение от canopen Посмотреть сообщение
А вот человек вас послушает и честно будет их ставить
И правильно сделает, даже если никогда так и не поймет
Fooly
20.07.2012, 11:16
  #8

Не по теме:

тут начали про Using namespace std. Вот интересная дискуссия по этому поводу в блоге http://www.cyberforum.ru/blogs/34326/blog275.html

canopen
411 / 410 / 12
Регистрация: 16.07.2012
Сообщений: 886
20.07.2012, 11:28     Что Вы можете сказать о индусе по его коду #9
Цитата Сообщение от Fooly Посмотреть сообщение

Не по теме:

Вот интересная дискуссия по этому поводу в блоге http://www.cyberforum.ru/blogs/34326/blog275.html

Спасибо, почитаю.
Catstail
Модератор
 Аватар для Catstail
21500 / 10253 / 1669
Регистрация: 12.02.2012
Сообщений: 17,139
20.07.2012, 12:21     Что Вы можете сказать о индусе по его коду #10
Не комплексуй! Код твой вполне хорош. Видно, что автору нравится программировать. Это самое главное. Не бывает так, чтобы нравилось то, к чему нет способностей. Удачи!
tramp13
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
20.07.2012, 12:57  [ТС]     Что Вы можете сказать о индусе по его коду #11
Цитата Сообщение от fasked Посмотреть сообщение
tramp13, несколько рекомендаций.
  1. Не используйте using namespace. Со временем сами поймете "почему", сейчас просто не используйте.
  2. Я совершенно не могу понять предназначение структуры по ее имени "use". Для сущностей рекомендуется все таки использовать существительные в названиях, а не глаголы. Глаголы больше подойдут для функций и методов.
  3. Тоже самое об именах членов структур. "call_pa" - вместо того, чтобы писать комментарий к названию, лучше сразу дать члену нормальное имя. Если пакет бесплатных минут, то можно было бы попробовать, например, "free_minutes".
  4. Некоторые имена лучше просто не использовать, например имя free - функция стандартной библиотеки, у Вас это имя используется (25 строка). Т.е. могут возникнуть конфликты и, как следствие, трудно-понимаемые ошибки.
  5. Указатели это, конечно, хорошо. Но в C++ лучше использовать ссылки.
  6. Не инициализированные переменные (27 строка) согласно стандарту C++ это Undefined Behaviour (Неопределенное поведение). Стандарт языка не гарантирует корректности выполнения программы в таких случаях.
  7. Форматирование кода в целом не очень радует глаз. Старайтесь разделять логические участки кода пустыми строками.
  8. Комментарии "Заполнение" и "Вычисление" полностью бесполезны. Это и так видно по названию функций. Комментарии не должны дублировать код.
  9. Опять же по стилю. Если Вы выделяете фигурными скобками блок "if", то лучше всего выделить скобками блок "else". И наоборот.
  10. Отсутствуют проверки указателей в функциях на валидность. Всегда сравнивайте указатели с NULL.
  11. Строки 83-85 трудны для восприятия. Лучше их выделить в отдельную функцию.
  12. В этих же строках присутствуют т.н. "магические числа" 100 и 31. Что они означают догадаться сложно.
  13. Опять же в этих строках стоят бесполезные комментарии. Если разбить эти три строки на функции и дать говорящие имена, то необходимость в этих комментариях отпадет. Вообще старайтесь писать код так, чтобы его можно было понять без каких-либо комментариев.

    И еще одно чисто мое субъективное мнение. Я не очень ценю С. Прата как автора книг по программированию, поэтому советую присмотреться к другой литературе.
1.принято, посмотрим
2.хотел написать что-то вроде "используемое".буду знать.
3.хотелось одновременно совместить и короткое имя понятность
4.буду знать, не был знаком с этой функцией
5.а чем лучше? я вроде пока не знаком с ссылками..
6.float total; не это ли инициализация?или я понятия путаю
7.писалось это в блокноте, исправлюсь
8.да, я сам старался комменить буквально всё, благодарю
9.это уже тонкости, буду знать)
10.вот это для меня пока тема нетронутая, пока не дошел до этого в книжке
11.спасибо, просто не знал, насколько нужно дробить программу на функции, старался создавать поменьше переменных
12.насколько я понял, их лучше инициализировать в виде констант в начале программы?
13.очень ценное замечание
В целом очень информативный ответ, благодарю душевно)
Другие книги посмотрю, просто уже прочитал 300 страниц, жаль бросать

Добавлено через 2 минуты
Цитата Сообщение от fasked Посмотреть сообщение
Данный вопрос неоднократно поднимался на форуме. Можете воспользоваться поиском и почитать.

Однако, если Вы сможете ответить на вопрос "зачем нужны пространства имен", то сможете сразу найти отрицательные стороны использования "using namespace". Все просто: "using namespace" полностью убивает саму концепцию пространств имен.


И правильно сделает, даже если никогда так и не поймет



using std::cout; а такой вариант пойдет?

Добавлено через 23 минуты
Цитата Сообщение от Catstail Посмотреть сообщение
Не комплексуй! Код твой вполне хорош. Видно, что автору нравится программировать. Это самое главное. Не бывает так, чтобы нравилось то, к чему нет способностей. Удачи!
Буду стараться, благодарю)
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
20.07.2012, 18:16     Что Вы можете сказать о индусе по его коду #12
Не используйте using namespace. Со временем сами поймете "почему", сейчас просто не используйте.
Эффективный совет, если хотите чтоб ваш код никто не читал.

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

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

Например здесь
C++
1
2
3
4
5
6
7
8
9
10
void fill (use *all, lowc *free) 
  {
    using namespace std; // Работает только внутри этой ф-ции
 
    cout <<"How much your subscription: ";    
    cin >> all->subscr;
    cout <<"How many minutes a day you talk: ";     
    cin >> all->call;
    //...
  }
Ну либо так
C++
1
2
using std::cout;
using std::cin;
tramp13
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
20.07.2012, 18:18  [ТС]     Что Вы можете сказать о индусе по его коду #13
Цитата Сообщение от Avazart Посмотреть сообщение
Эффективный совет, если хотите чтоб ваш код никто не читал.

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

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

Например здесь
C++
1
2
3
4
5
6
7
8
9
10
void fill (use *all, lowc *free) 
  {
    using namespace std; // Работает только внутри этой ф-ции
 
    cout <<"How much your subscription: ";    
    cin >> all->subscr;
    cout <<"How many minutes a day you talk: ";     
    cin >> all->call;
    //...
  }
Ну либо так
C++
1
2
using std::cout;
using std::cin;
Спасибо вам,совет ценый
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2012, 07:06     Что Вы можете сказать о индусе по его коду #14
Цитата Сообщение от tramp13 Посмотреть сообщение
6.float total; не это ли инициализация?или я понятия путаю
Это объявление. Инициализация - объявление с присвоением значения.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
23.07.2012, 12:49     Что Вы можете сказать о индусе по его коду #15
Цитата Сообщение от tramp13 Посмотреть сообщение
а чем лучше? я вроде пока не знаком с ссылками..
Как я уже говорил, указатель может быть невалидным, сделать невалидной ссылку сложнее. Ссылки не надо будет проверять.
Цитата Сообщение от tramp13 Посмотреть сообщение
float total; не это ли инициализация?или я понятия путаю
Выше уже объяснили, чем инициализация отличается от декларации. Добавлю только, что правильно будет так:
C++
1
float total = 0.0;
Цитата Сообщение от tramp13 Посмотреть сообщение
писалось это в блокноте, исправлюсь
Главное аккуратность и внимательность самого программиста, а инструмент лишь облегчает ему жизнь.
Цитата Сообщение от tramp13 Посмотреть сообщение
спасибо, просто не знал, насколько нужно дробить программу на функции, старался создавать поменьше переменных
Золотой середины не бывает. Надо полагаться на какое-то "чутье". Наверное, можно дать всего два простых совета:
  • Если код читается плохо, то надо выделять новый метод/функцию.
  • М. Фаулер в своей книге дает весьма дельный, на мой взгляд, совет. Точную цитату, к сожалению, вспомнить не могу, но смысл следующий - разбивать следует тогда, когда один метод оперирует разными уровнями абстракций.
Цитата Сообщение от tramp13 Посмотреть сообщение
using std::cout; а такой вариант пойдет?
Явное лучше неявного. В любом случае.
Deviaphan
23.07.2012, 14:22
  #16

Не по теме:

Я уже начал потирать ручки, но индусского кода не обнаружил. Печалько.(

tramp13
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
26.07.2012, 17:34  [ТС]     Что Вы можете сказать о индусе по его коду #17
Цитата Сообщение от Deviaphan Посмотреть сообщение

Не по теме:

Я уже начал потирать ручки, но индусского кода не обнаружил. Печалько.(

Это хорошо, спасибо за комплимент!)
И ещё прошу прощения за неоправданные ожидания)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.07.2012, 17:44     Что Вы можете сказать о индусе по его коду #18
Цитата Сообщение от tramp13 Посмотреть сообщение
прощения за неоправданные ожидания
Замени конструкции if-else на if-elseif-else с дополнительными проверками условия внутри ифов и немножко приблизишься к индусам. Тренируйся и не отчаивайся, всё в твоих руках! И указатели на нуль проверять следует не меньше двух раз подряд. А для надёжности, лучше три раза!
tramp13
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
01.08.2012, 09:03  [ТС]     Что Вы можете сказать о индусе по его коду #19
Цитата Сообщение от Deviaphan Посмотреть сообщение
Замени конструкции if-else на if-elseif-else с дополнительными проверками условия внутри ифов и немножко приблизишься к индусам. Тренируйся и не отчаивайся, всё в твоих руках! И указатели на нуль проверять следует не меньше двух раз подряд. А для надёжности, лучше три раза!
Ну вы бы поаккуратней, я ж всему на этом форуме верю, вдруг реально в индуса обратите =(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 10:14     Что Вы можете сказать о индусе по его коду
Еще ссылки по теме:

Можете сказать, я правильно понял задание? C++
Пишем рогалик: пояснения по коду и его критика C++
Как выводить символ по его коду? C++

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

Или воспользуйтесь поиском по форуму:
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
01.08.2012, 10:14     Что Вы можете сказать о индусе по его коду #20
...что за стереотипы об индуском коде. Вот товарищ индус Vinod.S заставил 8-битный микроконтроллер ATMega32 воспроизводить цветное видео со звуком:
Yandex
Объявления
01.08.2012, 10:14     Что Вы можете сказать о индусе по его коду
Ответ Создать тему
Опции темы

Текущее время: 03:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru