Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
1

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

20.07.2012, 08:17. Показов 1506. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не так давно взялся учить С++, будучи ещё школотой. Читаю книжку С.Прата "Язык программирования С++". Это дело вроде нравится, но вот интересно, что могут сказать здешние тёртые прогеры про мой быдлокод? По коду же наверно видно, что человеку стоит\не стоит свяязываться с программированием, как таковым. Заранее спасибо.
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 минут
чуть не забыл- для чистоты эксперимента код писал в блокноте)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2012, 08:17
Ответы с готовыми решениями:

Можете сказать что в этом коде не так? он предназначен для вывода натуральных чисел по спирали
#include &lt;iostream&gt; using namespace std; int main() { int A,x=0,y=8; for(int...

Можете скомпилировать и сказать работает ли?
Не хочу качать компилятор для 4-5 заданий, точнее занимали бы они меньше места как, например,...

Можете сказать, я правильно понял задание?
Вычислить сумму чисел в каждой строке. N&lt;=10, M&lt;=10 #include&lt;conio.h&gt; #include&lt;stdio.h&gt;...

Можете сказать, на каком языке написан данный код
Здравствуйте. Можете сказать, на каком языке написан данный код. На какой программе запустить? ...

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

Добавлено через 48 секунд
Цитата Сообщение от Fooly Посмотреть сообщение
Ну как можно говорить по коду человека, который только начал изучать с++ - станет он программером или нет Я сам только начал изучать с++, и тоже по Прате Если бы я прошёл только что структуры и функции - я тоже примерно так написал код. Но сейчас уже приступил к объектам и классам, так что переписал бы уж этот код немного по-другому.
Вот аналог тебе: по маленькому ребенку, который только полгодика как разговаривает, трудно судить - станет он хорошим оратором или нет.
Всё всегда приходит с опытым либо с даром от Бога Если дара нету - набирайся опыта. Вот и весь секрет
ценные слова, спасибо
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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. Опять же в этих строках стоят бесполезные комментарии. Если разбить эти три строки на функции и дать говорящие имена, то необходимость в этих комментариях отпадет. Вообще старайтесь писать код так, чтобы его можно было понять без каких-либо комментариев.

    И еще одно чисто мое субъективное мнение. Я не очень ценю С. Прата как автора книг по программированию, поэтому советую присмотреться к другой литературе.
4
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
20.07.2012, 11:12 6
Цитата Сообщение от fasked Посмотреть сообщение
tramp13, несколько рекомендаций.
  1. Не используйте using namespace. Со временем сами поймете "почему", сейчас просто не используйте.
У вас похоже большой опыт программирования на С++. Какие с вашей точки зрения есть аргументы против этого? Мне, честно, кажется чем-то сродни мазохизму засорение кода всеми этими std:: А вот человек вас послушает и честно будет их ставить, никогда так и не поняв, нужно ли это в действительности, а если нужно, то для чего.
2
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
20.07.2012, 11:16 7
Цитата Сообщение от canopen Посмотреть сообщение
У вас похоже большой опыт программирования на С++. Какие с вашей точки зрения есть аргументы против этого? Мне, честно, кажется чем-то сродни мазохизму засорение кода всеми этими std:: А вот человек вас послушает и честно будет их ставить, никогда так и не поняв, нужно ли это в действительности, а если нужно, то зачем.
Данный вопрос неоднократно поднимался на форуме. Можете воспользоваться поиском и почитать.

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

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

Не по теме:

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

0
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
20.07.2012, 11:28 9
Цитата Сообщение от Fooly Посмотреть сообщение

Не по теме:

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

Спасибо, почитаю.
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36592 / 20322 / 4218
Регистрация: 12.02.2012
Сообщений: 33,625
Записей в блоге: 13
20.07.2012, 12:21 10
Не комплексуй! Код твой вполне хорош. Видно, что автору нравится программировать. Это самое главное. Не бывает так, чтобы нравилось то, к чему нет способностей. Удачи!
1
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 Посмотреть сообщение
Не комплексуй! Код твой вполне хорош. Видно, что автору нравится программировать. Это самое главное. Не бывает так, чтобы нравилось то, к чему нет способностей. Удачи!
Буду стараться, благодарю)
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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;
0
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;
Спасибо вам,совет ценый
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2012, 07:06 14
Цитата Сообщение от tramp13 Посмотреть сообщение
6.float total; не это ли инициализация?или я понятия путаю
Это объявление. Инициализация - объявление с присвоением значения.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
23.07.2012, 12:49 15
Цитата Сообщение от tramp13 Посмотреть сообщение
а чем лучше? я вроде пока не знаком с ссылками..
Как я уже говорил, указатель может быть невалидным, сделать невалидной ссылку сложнее. Ссылки не надо будет проверять.
Цитата Сообщение от tramp13 Посмотреть сообщение
float total; не это ли инициализация?или я понятия путаю
Выше уже объяснили, чем инициализация отличается от декларации. Добавлю только, что правильно будет так:
C++
1
float total = 0.0;
Цитата Сообщение от tramp13 Посмотреть сообщение
писалось это в блокноте, исправлюсь
Главное аккуратность и внимательность самого программиста, а инструмент лишь облегчает ему жизнь.
Цитата Сообщение от tramp13 Посмотреть сообщение
спасибо, просто не знал, насколько нужно дробить программу на функции, старался создавать поменьше переменных
Золотой середины не бывает. Надо полагаться на какое-то "чутье". Наверное, можно дать всего два простых совета:
  • Если код читается плохо, то надо выделять новый метод/функцию.
  • М. Фаулер в своей книге дает весьма дельный, на мой взгляд, совет. Точную цитату, к сожалению, вспомнить не могу, но смысл следующий - разбивать следует тогда, когда один метод оперирует разными уровнями абстракций.
Цитата Сообщение от tramp13 Посмотреть сообщение
using std::cout; а такой вариант пойдет?
Явное лучше неявного. В любом случае.
1
Deviaphan
23.07.2012, 14:22
  #16

Не по теме:

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

1
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
26.07.2012, 17:34  [ТС] 17
Цитата Сообщение от Deviaphan Посмотреть сообщение

Не по теме:

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

Это хорошо, спасибо за комплимент!)
И ещё прошу прощения за неоправданные ожидания)
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
26.07.2012, 17:44 18
Цитата Сообщение от tramp13 Посмотреть сообщение
прощения за неоправданные ожидания
Замени конструкции if-else на if-elseif-else с дополнительными проверками условия внутри ифов и немножко приблизишься к индусам. Тренируйся и не отчаивайся, всё в твоих руках! И указатели на нуль проверять следует не меньше двух раз подряд. А для надёжности, лучше три раза!
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 7
01.08.2012, 09:03  [ТС] 19
Цитата Сообщение от Deviaphan Посмотреть сообщение
Замени конструкции if-else на if-elseif-else с дополнительными проверками условия внутри ифов и немножко приблизишься к индусам. Тренируйся и не отчаивайся, всё в твоих руках! И указатели на нуль проверять следует не меньше двух раз подряд. А для надёжности, лучше три раза!
Ну вы бы поаккуратней, я ж всему на этом форуме верю, вдруг реально в индуса обратите =(
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
01.08.2012, 10:14 20
...что за стереотипы об индуском коде. Вот товарищ индус Vinod.S заставил 8-битный микроконтроллер ATMega32 воспроизводить цветное видео со звуком:
0
01.08.2012, 10:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2012, 10:14
Помогаю со студенческими работами здесь

Можете сказать есть в коде ошибки или какие-то советы?
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; bool...

Что можете сказать ?
У одной программулки в разделе импортируемых функций есть такие функции, как: ...

Что можете сказать о ноуте?
http://www.dns-shop.ru/product/c73167ae68ca8a5a/156-noutbuk-asus-k501uq-dm036t-cernyj/ Ноутбук...

Что можете сказать о этом пк
Доброго времени суток. Что можете сказать о Lenovo Z510 (59400199)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru