#include <iostream>
struct Sector
{
char name;
int total, counter, remainder;
bool allowNearby;
};
enum { N = 3 };
Sector secs[] { { 'A', 3 }, { 'B', 6 }, { 'C', 30 } };
int main()
{
int nTotal = 0;
for (int i = 0; i < N; ++i) {
Sector& sec = secs[i];
nTotal += sec.total;
}
for (int i = 0; i < N; ++i) {
Sector& sec = secs[i];
sec.counter = sec.total;
sec.remainder = sec.total;
sec.allowNearby = (sec.total * 2 > nTotal);
}
Sector* repeatS = nullptr;
for (int iSec = 0; iSec < nTotal; ++iSec) {
Sector* bestS = nullptr;
for (int i = 0; i < N; ++i) {
Sector& sec = secs[i];
if (sec.remainder != 0 && &sec != repeatS) {
if (!bestS) { // первый подходящий?
bestS = &sec;
} else { // лучше bestS?
if (sec.counter < bestS->counter
|| (sec.counter == bestS->counter && sec.total > bestS->total))
bestS = &sec;
}
}
}
if (!bestS) // так и не нашли, что брать — берём repeatS
bestS = repeatS;
// пересчитаем счётчик и остаток
bestS->counter += nTotal * 2;
--bestS->remainder;
for (int i = 0; i < N; ++i) {
Sector& sec = secs[i];
sec.counter -= sec.total * 2;
}
repeatS = bestS->allowNearby ? nullptr : bestS;
std::cout << bestS->name;
}
std::cout << std::endl;
}
procedure TMyThread.SyncCreateMemo;
begin
Memo:=TMemo.Create(Form6);
Memo.Parent:=Form6;
Memo.Left:=50;
Memo.Top:=50;
Memo.Width:=250;
Memo.Height:=100;
Memo.Text:='Мама я родился!';
end;
procedure TMyThread.Execute;
begin
Synchronize(SyncCreateMemo);
end;
procedure TForm6.WmCreateMemo; // message WM_CREATEMEMO = WM_USER + 1
begin
Memo:=TMemo.Create(Form6);
Memo.Parent:=Self;
Memo.Left:=50;
Memo.Top:=50;
Memo.Width:=250;
Memo.Height:=100;
Memo.Text:='Мама я родился!';
end;
procedure TMyThread.Execute;
begin
PostMessage(Form6.Handle, WM_CREATEMEMO, 0, 0);
end;
type A = B;
вели к одному «предку». Для этого существует оператор type
.const
FieldSize = 10;
MaxShips = 10;
type
TField = record
cells : array [1..FieldSize, 1..FieldSize] of integer;
nLive : array [1..MaxShips] of integer;
end;
TGame = class
Field : TField;
constructor Create(const Field : TField);
end;
var
x : Test;
....
x.Create(a, b); // неверно!
x := Test.Create(a, b); // верно!
type
DaInt = array of integer;
procedure DoSomething1(var x : array of integer);
procedure DoSomething2(var x : DaInt);
int N, K;
Mission missions[100];
int bestTime = std::numeric_limits<int>::max();
bool recurse(int firstMission, int currPoints, int currTime)
{
if (currTime >= bestTime)
return false;
if (currPoints >= K) {
bestTime = currTime;
return false;
}
if (firstMission >= N)
return true;
int remPoints = K - currPoints;
for (int i = firstMission; i <= N; ++i) {
bool isFirst = (i == firstMission);
const Mission& im = missions[i];
if (currPoints + im.tailPoints < K) // tailPoints = сумма очков по хвосту от missions[i] до конца
return isFirst;
float wantedTime = currTime + remPoints * im.ratio; // ratio = (float)m.time / m.points;
if (wantedTime >= bestTime)
return isFirst;
if (recurse(i + 1, currPoints + im.points, currTime + im.time))
return isFirst;
}
return false;
}
class Mutex {
public:
void enter();
void leave();
}
class Lock {
public:
Lock(Mutex& aMutex) : mutex(aMutex) { mutex.enter(); }
~Lock() { mutex.leave(); }
private:
Mutex& mutex;
}
…
Mutex mutex;
{ Lock lock(mutex);
// всё, что здесь, выполняется внутри мьютекса.
// Даже если выпадет авария, из мьютекса корректно выйдем.
}
char * a = "hello!";
3) Использование инициализации списком для структур (POD) с уже прединициализированными полями:
1) Разное содержимое одних и тех же хедеров
2) MSVC спокойно компилирует нечто вроде
но при этом не компилирует код, если не-void функция не возвращает значение