Body | Známka |
---|---|
> 80 | 1 |
> 65 | 2 |
> 50 | 3 |
≤ 50 | ☠ |
void HandleStuff( CORP_DATA & inputRec, int crntQtr,
EMP_DATA empRec, double & estimRevenue, double ytdRevenue,
int screenX, int screenY, COLOR_TYPE & newColor,
COLOR_TYPE & prevColor, StatusType & status, int expenseType )
{
int i;
for ( i = 0; i < 100; i++ ) {
inputRec.revenue[i] = 0;
inputRec.expense[i] = corpExpense[ crntQtr ][ i ];
}
UpdateCorpDatabase( empRec );
estimRevenue = ytdRevenue * 4.0 / (double) crntQtr;
newColor = prevColor;
status = SUCCESS;
if ( expenseType == 1 ) {
for ( i = 0; i < 12; i++ )
profit[i] = revenue[i] - expense.type1[i];
}
else if ( expenseType == 2 ) {
profit[i] = revenue[i] - expense.type2[i];
}
else if ( expenseType == 3 )
profit[i] = revenue[i] - expense.type3[i];
}
Co je na tomto kódu špatně? Podle Steve McConnella:
HandleStuff()
tells you
nothing about what the routine does.
expenseType == 2
and expenseType == 3
.
inputRec
, is changed.
If it's an input variable, its value should not be modified (and
in C++ it should be declared const
). If the value of
the variable is supposed to be modified, the variable should not
be called inputRec
.
corpExpense
and writes to profit
. It
should communicate with other routines more directly than by
reading and writing global variables.
crntQtr
equals 0
, the expression
ytdRevenue * 4.0 / (double) crntQtr
causes
a divide-by-zero error.
screenX
and screenY
are not referenced within the routine.
prevColor
is labeled as a reference parameter
(&
) even though it isn't assigned a value within
the routine.
A já dodávám:
_TYPE
× _DATA
) a kryptické.
int i
) by měla být
v cyklu samotném.
expenseType
by měly být
realizovány příkazem switch
.
Napište program, který vypíše kolik vám má vrátit obchodník, když kupujete rohlík za $1.10 a zaplatíte $2 bankovkou.
Pozor na čísla s plovoucí čárkou.
Napište program, který sečte 2 čísla. :-)
Vyhýbejte se konstrukcím, které nefungují, jak to na první pohled vypadá.
Napište program, který sečte 2 čísla v 16-tkové soustavě. ;-)
Dána kolekce všech zaměstnanců. Napište program, který určí počet vývojářů se mzdou vyšší než 20 000.
var count = 0;
foreach (var employee in employees)
{
if (employee.Position == PositionType.Developer
&& employee.Salary > 20_000)
{
count++;
}
}
var count = 0;
foreach (var employee in employees)
{
if (employee.Position == PositionType.Developer
&& employee.Salary > 20_000)
{
count++;
}
}
var count = 0;
foreach (var employee in employees)
{
if (employee.Position == PositionType.Developer
&& employee.Salary > 20_000)
{
count++;
}
}
employees
.Where(e => e.Position == PositionType.Developer && e.Salary > 20_000)
.Count();
var count = 0;
foreach (var employee in employees)
{
if (employee.Position == PositionType.Developer
&& employee.Salary > 20_000)
{
count++;
}
}
employees
.Where(e => e.Position == PositionType.Developer && e.Salary > 20_000)
.Count();
Napište program, který sečte čísla od 1 do 100.
Nějaký nebohý student napíše tento program na tabuli ve svém oblíbeném programovacím jazyce, který dozajista bude něco Java, C# nebo C/C++. Jiný nebohý student se následně pokusí vyznačit v kódu různé druhy složitosti.
Vtipné bude, pokud dotyčný student napíše vzoreček místo for-cyklu.
Zdroj inspirace: článek Reginalda Braithwaita, diskuze na Redditu
(1..100).inject(&:+)
inject
známá jako fold
nebo
reduce
.
(1..100).inject(&:+)
(1..100).inject(&:+)
sum [1..100]
(1..100).inject(&:+)
sum [1..100]
(1..100).inject(&:+)
sum [1..100]
(1..100).sum()
(1..100).inject(&:+)
sum [1..100]
(1..100).sum()
awfull
ukazuje fakt škaredý kód:
bad_class
- třída která dělá vše a nic, hodně nekomentovaných metod.bad_function
- obsahuje např. switch/for ... bad_globals
- obsahuje proměnné buffer1-4, které se používají náhodně v
celém zdrojáku.bad_whole_file
- vše špatně, na jaký antipattern si vzpomenete,
ten tam asi najdete :)bad_malloc
- malloc ze starého kalista.nice
ukazuje, jak má kód vypadat.
nice_malloc
je nová verze mallocu z kalista přepsaná od Petra Tůmy.nice_class
je pěkná třída od Luboše, plná komentářů a krátkých metod.Nulování matice pod diagonálou
void clear_below_diagonal(double matrix[][] ){ for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { if (j < i) { matrix[j][i] = 0; } } } }
Nulování matice pod diagonálou
void clear_below_diagonal(double matrix[][] ){ for (int row = 0; row < matrix.length; row++) { for (int column = 0; column < matrix[row].length; column++) { if (column < row) { matrix[row][column] = 0; } } } }
Násobení prvků pole
void multiply(int array[], int x) { for ( int i = 0; i < array.length; i++) { array[i] *= x; } }
i
je v tomto příkladě v pořádku = krátké + jasné + konvencne, x
je špatně.
Výpočet ceny nákupu včetně DPH
double calculate_total_price(double items_price[], int category[]) { double sum = 0; for (int i = 0; i < items_price.length; i++) { if (category[i] == 0) { sum += items_price[i]; } else if (category[i] == 1) { sum += items_price[i] * 1.14; } else if (category[i] == 2) { sum += items_price[i] * 1.2; } } return sum; }