LINUX.ORG.RU

[C++][быдлокод] Помаленьку учу плюсы.

 ,


0

2

Собственно сабж. Потихоньку изучаю плюсы.
Кое что рабочее уже написал (на 150 строк :D)
Хотелось бы чтобы те, кто плюсы знают хорошо указали на какие-то ошибки и прочее. Как вообще правильнее всего написать что-то подобное.
В данный момент используется толко то, что доступно в рамках STL.

Собствено быдлокод: http://paste.pocoo.org/show/239314/

Ответ на: комментарий от legolegs

С ассертами понятно. Надо будет в дальнейшем их использовать. Тут они ни к чему тогда - нужно проверять пользователя.

На сколько вот такая проверка вводимого пользователем значения правильна?

do
  {

...
	do
	{
	  cout << "Do you want to analyse another project? [Y/N]" << endl;
	  cin >> again;
	  switch (again) {
		case 'Y' :
		  error = false;
		  break;
		case 'N' :
		  error = false;
		  break;
		default :
		  error = true;
		  cout << "Sorry, i didn't understand the answer, please answer Y or N" << endl;
		  break;
	  }
	}
	while ( error == true );
  }
  while ( again == 'Y' );

CyberTribe ★★
() автор топика
Ответ на: комментарий от Zhbert

Пока вводится Y он будет выполнять некоторые функции, которые я заменил на "..."
Там два «do while», из одного выход по error != true, из другого по again != Y

CyberTribe ★★
() автор топика
Ответ на: комментарий от CyberTribe

>Там два «do while», из одного выход по error != true, из другого по again != Y

Вижу =) Ну тащемта правильно, я бы примерно так же сделал.

Zhbert ★★★★★
()

стоит начать с чтения SICP

korvin_ ★★★★★
()

Сейчас уже лучше, но надо учиться писать комментарии. Например:

// global vestors for now
// TODO:need to replace with iterators later, and make them private.
vector<long double> invest, revenue, d_invest, d_revenue, d_float, d_total, k_discont, k_infl;

лучше заменить на

// global vestors for now
// TODO:need to replace with iterators later, and make them private.

vector<long double> invest,  // description?
                    revenue, // desciprion?
...

// This function is used for data input, also it initializes the global vectors. Arguments are self descriptive.
void data_input ( int &length, long double &discont )

заменить на

/* This function is used for data input, also it initializes the global vectors.
parameters: none
output:
  <list of global variables, which will be changed by the function>
returns:
  length - description,
  discont - description
*/ 
void data_input ( int &length, long double &discont )

Инициализацию глобальных переменных (нужно ли их использовать - другой вопрос) лучше вынести в отдельную функцию, что-нибудь типа init_globals. В твоем случае их можно инициализировать на месте:

vector<long double> invest(1, 0.0)...
По возможности не нужно вносить в функцию действия, которые в ней не должны быть. Если она называется data_input, то пусть занимается получением входных данных. Вообще, избегай всего неявного. И делай проще настолько, насколько это возможно не в ущерб прочему.

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

Для c и тем более для c++ существует множество нюансов, со временем изучишь. Главное - выработать хороший стиль (это справедливо для любого языка).

SilentBob
()

Нормально все, но зачем тебе плюсы если ты пишешь на них как на обычном си? Если взял С++, надо учиться мыслить объектами, классами.

hibou ★★★★★
()
Ответ на: комментарий от hibou

>Если взял С++, надо...

Не надо.

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

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Меньше надо мыслить всякими «true way». Вместо слепой религии лучше четко понимать что ты делаешь и почему именно так надо делать.

pathfinder ★★★★
()
Ответ на: комментарий от CyberTribe

> Ругайте. А то как иначе научится писать правильно?

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

без классов этот код так и останется быдлокодом (примерно: сделать класс на каждую итерацию, внеся туда все, что зависит только от i, а что зависит еще от i-1 вынести в отдельный массив)

по комментариям: они одновременно избыточны и недостаточны; названия переменных надо сделать длинными, чтобы не повторять их в комментариях, и т.д.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от pathfinder

> Вместо слепой религии лучше четко понимать что ты делаешь и почему именно так надо делать.

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

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Про классы я уже понял.
Как раз читаю про то, как их делать. Так что через несколько дней будет снова что ругать, но уже с выносом большей части кода в класс.
Касательно задачи - проще будет скучно.
Я скорее думаю, что ещё тут добавить в вычисления, чтобы было интересно.

По хорошему оно должно уметь читать и сохранять данные в файл (возможно xml-ка какая-нибудь для этого подойдёт. Выбирать из нескольких проектов, ещё и графики строить. Но это уже точно после выноса расчётного функционала в класс.

CyberTribe ★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

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

CyberTribe ★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

>у тебя есть предложения, как структурировать этот взрыв на макаронной фабрике, иначе чем через классы?

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

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

тут он прав. класс действительно будет нужен в будущем, ибо есть планы по усложнению функционала.
ну и потом (когда сами плюсы будут более менее понятны) можно будет к этому и gui приделать.

CyberTribe ★★
() автор топика
Ответ на: комментарий от CyberTribe

> касательно названий переменных - для знающего терминологию они в основном достаточны

ЕСЛИ они достаточны,

ТО ТОГДА комментарии вида

// calculating the discounted cash flow without investment
d_float[i]=d_revenue[i] - d_invest[i];

являются мусором.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от CyberTribe

> класс действительно будет нужен в будущем, ибо есть планы по усложнению функционала

я говорю о текущей функциональности

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

В случае с векторами я думаю что префиксы d перед названием, указывающие на то что это вектор данных после дисконтирования лучше вообще заменить на слово discount. По названиям векторов уже переделал чтобы были комментарии к каждому при объявлении.


Касательно класса - не всё сразу, я ещё только неделю как начал изучать плюсы.

CyberTribe ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.