Тестовый проект
От: Финченко Юрий  
Дата: 11.01.02 16:11
Оценка:
Подскажите пожалуйста, какой небольшой, но характерный проект создать для демонстрации моего знания C++ (Microsoft Visual C++). Я хотел бы разместить такое приложения на своей интернет страничке и сделать доступным вместе с исходными кодами (подобное я уже сделал для ASP, когда-то при устройстве в одну фирму меня попросили сделать небольшую программку и теперь я ее могу использовать для демонстрации). По адресу http://www25.brinkster.com/finchenko я разместил интернет страничку, которую использую для поиска работы. Я декларирую знание C++, а проекты, которые я создавал, представить не могу, т.к. они остались в собственности газпрома и забрать их (а тем более исходные коды я не имел права). Скорее всего нужно зделать ActiveX компонент с поддержкой COM+, но фантазия моя уже иссякла. Помогите советом, а может быть кто-то уже подобное делал.

С уважением
Юрий Финченко
finchenko@bezeqint.net
Re: Тестовый проект
От: ZORK Россия www.zorkaltsev.com
Дата: 11.01.02 16:36
Оценка:
Здравствуйте Финченко Юрий, Вы писали:

ФЮ>Подскажите пожалуйста, какой небольшой, но характерный проект создать для демонстрации моего знания C++ (Microsoft Visual C++). Я хотел бы разместить такое приложения на своей интернет страничке и сделать доступным вместе с исходными кодами (подобное я уже сделал для ASP, когда-то при устройстве в одну фирму меня попросили сделать небольшую программку и теперь я ее могу использовать для демонстрации). По адресу http://www25.brinkster.com/finchenko я разместил интернет страничку, которую использую для поиска работы. Я декларирую знание C++, а проекты, которые я создавал, представить не могу, т.к. они остались в собственности газпрома и забрать их (а тем более исходные коды я не имел права). Скорее всего нужно зделать ActiveX компонент с поддержкой COM+, но фантазия моя уже иссякла. Помогите советом, а может быть кто-то уже подобное делал.


ФЮ>С уважением

ФЮ>Юрий Финченко
ФЮ>finchenko@bezeqint.net

Если устроит маленькое, но умное, то посмотри на http://www.itasoftware.com/careers/programmers.php первый 2-е задачи. По крайней мере когда я 9-ть 9-ток писал, получился довольно таки сильный C++ код

-Zork
Думать надо ...головой :)
Re[2]: Тестовый проект
От: Snax Россия  
Дата: 02.03.02 08:18
Оценка:
Здравствуйте ZORK, Вы писали:

ZORK>Если устроит маленькое, но умное, то посмотри на http://www.itasoftware.com/careers/programmers.php первый 2-е задачи. По крайней мере когда я 9-ть 9-ток писал, получился довольно таки сильный C++ код


Сильный код? Может я чего не понимаю, но я бы решал так:
Пищется функция, которая принимает на входе массив чисел и
выдает другой массив, в котором находятся все возможные
варианты операций каждого из этих чисел с 9.

Изначально на входе у такой функции массив с 2-я элементами (+9 и -9).
на выходе, соответственно:

-9 * 9 = -81
-9 / 9 = -1
-9 + 9 = 0
-9 — 9 = -18

9 * 9 = 81
9 / 9 = 1
9 + 9 = 18
9 — 9 = 0

хм.. по-ходу унарный минус можно не учитывать. Итак, на выходе у нас
0,1,18,81
дальше подаем эти четыре числа снова на вход нашей
функции, получаем

0 * 9 = 0
1 * 9 = 9
18 * 9 = 162
81 * 9 = 729

0 / 9 = 0
1 / 9 = 1/9
18 / 9 = 2
81 / 9 = 9

0 + 9 = 9
1 + 9 = 10
18 + 9 = 27
81 + 9 = 90

0 — 9 = -9
1 — 9 = -8
18 — 9 = 9
81 — 9 = 72

1/9 смело выкидываем, потому как для получения целого числа ее нужно будет домножить,
как минимум, на 9, а симметричный такому вариант у нас гарантировано будет.

К 9-й девятке получится не более 4-в-восьмой степени, или 64к вариантов.
Если задача не для калькуляторов, то вполне приемлимый расход ресурсов.

Щас напишу на с++, вышлю результат.

Павел.
Re[3]: Тестовый проект
От: Snax Россия  
Дата: 02.03.02 08:51
Оценка:
using namespace __STD;
vector<int> SearchForMeaningOfLife(int nIteration, const vector<int>& vectIn)
{
    // Заводим выходной буффер
    vector<int> vectOut;
    // Выделяем сразу сколько нужно памяти
    vectOut.reserve(_Pow_int<int>(4, nIteration));

    for (int i = 0; i < vectIn.size(); i++)
    {
        vectOut.push_back(vectIn[i] * 9);
        if (vectIn[i] >= 9)
            vectOut.push_back(vectIn[i] / 9);
        vectOut.push_back(vectIn[i] + 9);
        vectOut.push_back(vectIn[i] - 9);
    }
    return vectOut;
}

int main(int argc, char* argv[])
{
    vector<int> vectIteration;
    // Инициализируем первой девяточкой
    vectIteration.push_back(9);

    // Восемь раз ищем смысл жизни
    for (int i = 1; i < 9; i++)
        vectIteration = SearchForMeaningOfLife(i, vectIteration);

    // Выкидываем все, что меньше 1
    vectIteration.erase(remove_if(WHOLE(vectIteration), bind2nd(less<int>(), 1)), vectIteration.end());
    // Сортируем :)
    sort(WHOLE(vectIteration), __STD::less<int>());
    // Ищем первую "дырку" в последовательности
    for (i = 1; i < vectIteration.size(); i++)
    {
        if (vectIteration[i] != vectIteration[i-1] &&
            vectIteration[i] != (vectIteration[i-1] + 1))
        {
            printf("number %d\n", vectIteration[i-1] + 1);
            break;
        }
    }

    // Вожможно, такого числа нет
    if (i == vectIteration.size())
        printf("number %d\n", 9*9*9*9*9*9*9*9*9 + 1);

    return 0;
}


Может я чего не понял, но задача решена, и никакого "сильного" кода я тут не вижу.
Или я не допер до чего-то очень важного?
Re[4]: Тестовый проект
От: Snax Россия  
Дата: 03.03.02 01:20
Оценка:
Поспешишь — людей насмешишь.

В самом деле, код совершенно
неправильный. Во-первых,
обрабатываются только скобки типа
(9+(9+(...)))
А нужно еще и
(9+9)+(...)
т.е. придется переписать функцию
чтобы та принимала две кучки
вариантов. Причем делить и вычитать
придется двойки из четверок и
четверки из двоек.
И дроби. Все-таки их нельзя их
выкидывать.
9/9/(9+9) дает-таки целый результат.
придется хранить и числитель и знаменатель.

Да... Хорошо, что я не устраиваюсь на работу
к Zorkу, а то он бы меня не взял.

Завтра напишу как следует.
Re[5]: Тестовый проект
От: ZORK Россия www.zorkaltsev.com
Дата: 03.03.02 04:10
Оценка: 5 (2)
Здравствуйте Snax, Вы писали:

S>Да... Хорошо, что я не устраиваюсь на работу

S>к Zorkу, а то он бы меня не взял.



Для сравнения, вариант который у меня получился, основаный на рекрурсивном вызове функций с сохранением состояния в объекте:

//  Author: Alexey Zorkaltsev (a.k.a. ZORK)
//  Date: Dec 1, 2001
//  Description:
//      It's a solution of Nine 9s task from 
//      http://www.itasoftware.com/careers/programmers.php.  
////////////////////////////////////////////////////////////

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <windows.h>

// Lets make it a little more general
const unsigned int N = 9; // number of numbers
const unsigned int V = 9; // what is the number

char sV[2] = "X";

class Braces {
public:
    Braces() :
        _n(0), _p(0), _s(0), _left(NULL), _right(NULL) {}

    ~Braces() {
        delete _left;
        delete _right;
    }

    void init(int n) {
        _n = n;
        _mid = (_n + 1) / 2;
        _s = -1;
    }

    bool next(double &val) {
        
        // Back to the point after last return
        switch (_s) {
        case 1:
            goto S1;
        case 2:
            goto S2;
        case 3:
            goto S3;
        case 4:
            goto S4;
        case 5:
            goto S5;
        case 6:
            goto S6;
        case 10:
            return false;
        }

        if (_n == 1) {
            _s = 10;
            val = V;
            return true;
        }

        // Beginning
        if (_left == NULL) {
            _left = new Braces();                        
            _right = new Braces();
        }

        // Before (including center) positions
        for (_p = 1; _p <= _mid; ++_p) {

            // All possible left values
            _left->init(_p);
            while (_left->next(_leftVal)) {

                // All possible right values
                _right->init(_n - _p);
                while (_right->next(_rightVal)) {

                    // All possible operations
                    
                    val = _leftVal + _rightVal;
                    _s = 1; return true; S1:;

                    val = _leftVal - _rightVal;
                    _s = 2; return true; S2:;

                    val = _leftVal * _rightVal;
                    _s = 3; return true; S3:;

                    if (fabs(_rightVal) > 1e-10) {
                        val = _leftVal / _rightVal;
                        _s = 4; return true; S4:;
                    }
                }
            }
        }

        // After center positions
        for (; _p < _n; ++_p) {

            // All possible left values
            _left->init(_p);
            while (_left->next(_leftVal)) {

                // All possible right values
                _right->init(_n - _p);
                while (_right->next(_rightVal)) {

                    // All possible operations
                    
                    val = _leftVal - _rightVal;
                    _s = 5; return true; S5:;

                    if (fabs(_rightVal) > 1e-10) {
                        val = _leftVal / _rightVal;
                        _s = 6; return true; S6:;
                    }
                }
            }
        }

        return false;
    }

    void show()
    {
        if (_s == 10)
            printf(sV);
        else {
            printf("(");
            _left->show();        
            switch (_s) {
            case 1:
                printf("+"); break;
            case 2:
            case 5:
                printf("-"); break;
            case 3:
                printf("*"); break;
            case 4:
            case 6:
                printf("/"); break;
            }
            _right->show();
            printf(")");
        }
    }

protected:
    int _n; // number of 9es in the braces
    int _mid; // middle
    int _p; // current position
    int _s;
    Braces* _left;
    double _leftVal;
    Braces* _right;
    double _rightVal;
};

int main()
{
    int t1 = GetTickCount();

    sV[0] = '0' + V;

    Braces b;
    for (int i = 0; i < 65000; ++i)
    {
        if (i % 1000 == 0)
            printf("i = %d\n", i);
        b.init(N);
        double val;
        while (b.next(val)) {
            if (val == i) {
                printf("%d - ", i); b.show(); printf("\n");
                goto NumberWasFound;
            }
        }
        break;
NumberWasFound:; // check next number
    }

    int t2 = GetTickCount();

    if (i < 65000)
        printf("Found %d\n", i);
    else 
        puts("Number wasn't found!");
    printf("Spent time: %f sec\n", double(t2 - t1) / 1000);

    puts("\nPress Any Key...");
    getch();

    return 0;
}


Правильный ответ — 195

На случай, если кто-нить захочет сказать что этот код недостаточно оптимизирован, скажу, что правильный ответ находится на машине 1GHz, 256M с Windows 2000, за 20 сек., так что дальнейшая оптимизация не требовалась.
Думать надо ...головой :)
Re[6]: Тестовый проект
От: Snax Россия  
Дата: 04.03.02 04:20
Оценка: 7 (2)
Здравствуйте ZORK, Вы писали:

S>>Да... Хорошо, что я не устраиваюсь на работу

S>>к Zorkу, а то он бы меня не взял.

ZORK>


Все-таки придется меня взять
Мой код быстрее. А если выкинуть описание Fraction в отдельный файл,
то и компактнее и, ИМХО, проще для понимания.
#include <stdio.h>

#include <algorithm>
#include <vector>
#define WHOLE(container) (container).begin(), (container).end()

using namespace __STD;

struct Fraction
{
    int m_nNumerator;
    int m_nDenominator;

    Fraction(int nNumerator, int nDenominator)
        : m_nNumerator(nNumerator), m_nDenominator(nDenominator) {}
    Fraction(const Fraction& fract)
        : m_nNumerator(fract.m_nNumerator), m_nDenominator(fract.m_nDenominator) {}

    Fraction operator + (const Fraction& fract) const
    {
        // A/B + C/D = (AD + BC)/BD
        if (m_nDenominator == fract.m_nDenominator)
            return Fraction(m_nNumerator + fract.m_nNumerator, m_nDenominator);

        return Fraction(m_nNumerator * fract.m_nDenominator
            + m_nDenominator * fract.m_nNumerator
            , fract.m_nDenominator * m_nDenominator);
    }
    Fraction operator - (const Fraction& fract) const
    {
        // A/B - C/D = (AD - BC)/BD
        if (m_nDenominator == fract.m_nDenominator)
            return Fraction(m_nNumerator - fract.m_nNumerator, m_nDenominator);

        return Fraction(m_nNumerator * fract.m_nDenominator
            - m_nDenominator * fract.m_nNumerator
            , fract.m_nDenominator * m_nDenominator);
    }
    Fraction operator * (const Fraction& fract) const
    {
        // A/B * C/D = AC/BD
        return Fraction(m_nNumerator * fract.m_nNumerator
             , m_nDenominator * fract.m_nDenominator);
    }
    Fraction operator / (const Fraction& fract) const
    {
        // A/B / C/D = AD/BC
        return Fraction(m_nNumerator * fract.m_nDenominator
             , m_nDenominator * fract.m_nNumerator);
    }

    // Not a "real" < for fractions!
    bool operator < (const Fraction& fract) const
    {
        // A/B < C/D
        if (m_nDenominator == fract.m_nDenominator)
            return m_nNumerator < fract.m_nNumerator;

        return m_nDenominator < fract.m_nDenominator;
    }

    bool operator == (const Fraction& fract) const
    {
        // A/B == C/D
        if (m_nDenominator == fract.m_nDenominator)
            return m_nNumerator == fract.m_nNumerator;

        return m_nNumerator * fract.m_nDenominator == fract.m_nNumerator * m_nDenominator;
    }
};

struct FractionNormalize : public unary_function<Fraction&, void>
{
    void operator() (argument_type x)
    {
        if (0 == x.m_nNumerator)
        {
            x.m_nDenominator = 1;
            return;
        }

        // Turn all negatives to positives
        if (x.m_nNumerator < 0)
            x.m_nNumerator = -x.m_nNumerator;
        if (x.m_nDenominator < 0)
            x.m_nDenominator = -x.m_nDenominator;

        if (x.m_nDenominator > x.m_nNumerator)
        {
            // A/AX
            if (1 != x.m_nNumerator && 0 == x.m_nDenominator % x.m_nNumerator)
            {
                x.m_nDenominator /= x.m_nNumerator;
                x.m_nNumerator = 1;
            }
        }
        else if (x.m_nNumerator > x.m_nDenominator)
        {
            // AX/A
            if (1 != x.m_nDenominator && 0 == x.m_nNumerator % x.m_nDenominator)
            {
                x.m_nNumerator /= x.m_nDenominator;
                x.m_nDenominator = 1;
            }
        }
        else if (1 != x.m_nNumerator)
        {
            // X/X
            x.m_nNumerator = x.m_nDenominator = 1;
        }
    }
};

Это код для работы с дробями. Обратите внимание, что operator < для данной задачки работает правильно,
на самом деле должно быть
        // A/B < C/D
        if (m_nDenominator == fract.m_nDenominator)
            return m_nNumerator < fract.m_nNumerator;

        return m_nNumerator * fract.m_nDenominator < fract.m_nNumerator * m_nDenominator;

А вот и само решение
typedef vector<Fraction> thetype_t;

void SearchForMeaningOfLife(thetype_t& vectOut, const thetype_t& vectLeft, const thetype_t& vectRight)
{
    for (int iLeft = 0; iLeft < vectLeft.size(); iLeft++)
    {
        for (int iRight = 0; iRight < vectRight.size(); iRight++)
        {
            vectOut.push_back(vectLeft[iLeft] * vectRight[iRight]);
            if (vectRight[iRight].m_nNumerator)
                vectOut.push_back(vectLeft[iLeft] / vectRight[iRight]);
            if (vectLeft[iLeft].m_nNumerator)
                vectOut.push_back(vectRight[iRight] / vectLeft[iLeft]);
            vectOut.push_back(vectLeft[iLeft] + vectRight[iRight]);
            vectOut.push_back(vectLeft[iLeft] - vectRight[iRight]);
        }
    }
    // Normalize fractions
    for_each(WHOLE(vectOut), FractionNormalize());
    // Sort entire vector
    sort(WHOLE(vectOut), less<Fraction>());
    // Remove dups
    vectOut.erase(unique(WHOLE(vectOut)), vectOut.end());
}

int main(int argc, char* argv[])
{
    thetype_t vectIterations[9];
    vectIterations[0].push_back(thetype_t::value_type(9, 1));

    for (int i = 1; i < 9; i++)
    {
        size_t nReserve = 0;
        for (int nPair = 0; nPair < (i + 1) / 2; nPair++)
            nReserve += vectIterations[nPair].size() * vectIterations[(i - 1) - nPair].size() * 5;

        vectIterations[i].reserve(nReserve);
        for (nPair = 0; nPair < (i + 1) / 2; nPair++)
            SearchForMeaningOfLife(vectIterations[i], vectIterations[nPair], vectIterations[(i - 1) - nPair]);

    }

    // Remove all fracts with m_nDenominator > 1
    thetype_t::iterator iEnd = find_if(WHOLE(vectIterations[8]),
        bind2nd(greater<Fraction>(), Fraction(0, 2)));

    for (thetype_t::iterator iFract = vectIterations[8].begin(); iFract < iEnd; iFract++)
    {
        if (iFract[1].m_nNumerator != iFract[0].m_nNumerator + 1)
        {
            printf("number %d\n", iFract[0].m_nNumerator + 1);
            break;
        }
    }

    return 0;
}


Павел.
P.S. Прошу прощения у Юрия, что вмешался.
И у Зорка. Код получился действительно интересный.
Re[7]: Тестовый проект
От: Snax Россия  
Дата: 04.03.02 04:24
Оценка:
Ну вот. Опять поторопился .
Если выкидывание повторов перетищить из SearchForMeaningOfLife
в main, то должно ускорится еще раза в два. Хотя и так
быстрее, чем у Алексея.
Re: Тестовый проект
От: flyker Россия  
Дата: 26.03.02 15:58
Оценка:
Здравствуйте Финченко Юрий, Вы писали:

ФЮ>Подскажите пожалуйста, какой небольшой, но характерный проект создать для демонстрации моего знания C++ (Microsoft Visual C++). Я хотел бы разместить такое приложения на своей интернет страничке и сделать доступным вместе с исходными кодами (подобное я уже сделал для ASP, когда-то при устройстве в одну фирму меня попросили сделать небольшую программку и теперь я ее могу использовать для демонстрации). По адресу http://www25.brinkster.com/finchenko я разместил интернет страничку, которую использую для поиска работы. Я декларирую знание C++, а проекты, которые я создавал, представить не могу, т.к. они остались в собственности газпрома и забрать их (а тем более исходные коды я не имел права). Скорее всего нужно зделать ActiveX компонент с поддержкой COM+, но фантазия моя уже иссякла. Помогите советом, а может быть кто-то уже подобное делал.


ФЮ>С уважением

ФЮ>Юрий Финченко
ФЮ>finchenko@bezeqint.net

Напиши почтового клиента (POP3 хотябы). Отправка, получение сообщений, аттачменты, кодировки и т.д. и т.п.
Я сам когда-то писал, в принципе ничего сложного, но гемор тот еще...
Все гениальное — просто
Re[2]: Тестовый проект
От: Аноним  
Дата: 19.11.03 22:19
Оценка:
Здравствуйте, flyker, Вы писали:

F>Здравствуйте Финченко Юрий, Вы писали:


ФЮ>>Подскажите пожалуйста, какой небольшой, но характерный проект создать для демонстрации моего знания C++ (Microsoft Visual C++). Я хотел бы разместить такое приложения на своей интернет страничке и сделать доступным вместе с исходными кодами (подобное я уже сделал для ASP, когда-то при устройстве в одну фирму меня попросили сделать небольшую программку и теперь я ее могу использовать для демонстрации). По адресу http://www25.brinkster.com/finchenko я разместил интернет страничку, которую использую для поиска работы. Я декларирую знание C++, а проекты, которые я создавал, представить не могу, т.к. они остались в собственности газпрома и забрать их (а тем более исходные коды я не имел права). Скорее всего нужно зделать ActiveX компонент с поддержкой COM+, но фантазия моя уже иссякла. Помогите советом, а может быть кто-то уже подобное делал.


ФЮ>>С уважением

ФЮ>>Юрий Финченко
ФЮ>>finchenko@bezeqint.net

F>Напиши почтового клиента (POP3 хотябы). Отправка, получение сообщений, аттачменты, кодировки и т.д. и т.п.

F>Я сам когда-то писал, в принципе ничего сложного, но гемор тот еще...

подскажи как ты кирилицу отображал?
Re: Тестовый проект
От: Аноним  
Дата: 20.11.03 07:17
Оценка:
Здравствуйте, Финченко Юрий,
Посмотри тестовые задачи в Аэлите,
но в свете предыдущего обсуждения,
наверное, слишком просто.
Re: Тестовый проект
От: Владислав Россия  
Дата: 20.11.03 09:16
Оценка:
Здравствуйте, Финченко Юрий, Вы писали:

ФЮ>Подскажите пожалуйста, какой небольшой, но характерный проект создать для демонстрации моего знания C++

ФЮ>Скорее всего нужно зделать ActiveX компонент с поддержкой COM+, но фантазия моя уже иссякла. Помогите советом, а может быть кто-то уже подобное делал.

Когда — то я хотел сделать проект для тех же целей, что и ты. Но времени всё нет. Да и лень.
Увидел это задание в форуме, но найти где не могу, то ли поиск глючит, то ли удалена ветка. Поэтому ссылку на сообщение не дам, а напишу прямо здесь.

Предлагается создать клиент-серверную систему со следующей архитектурой

Компоненты системы включают:

1. Log Server – COM сервер, реализующий интерфейс (ы) для получения трассировочных сообщений от произвольного числа клиентов.

§ Log Server должен быть реализован как in-proc COM server, но клиенты должны создавать Log Server как local COM server на машине клиента.

§ Log Server должен всегда работать в единственном экземпляре и обслуживать всех клиентов.

§ Log Server должен быть реализован с применением ATL, без испoльзования MFC.

§ Log Server должен быть Free Threaded.

§ Log Server должен работать в двух режимах. В каком режиме он запустится должно определяться каким-то ключом в Registry Кроме того, интерфейс реализуемый Log Server, должен предусматривать возможность перелючения между режимами работы в во время выполнения по запросу клиента с запоминанием нового установленного состояния Log сервера в реестре.

§ Silent mode – без UI. Все приходящие трассировочные сообщения записываются в простой текстовый файл с префиксом при каждом сообщении, позволяющим идентифицировать, от какого процесса оно пришло.

§ UI mode — Log Server запускается как обычное SDI приложение с возможностью просмотра и редактирования (добавление произвольных комментариев пользователем к тексту трассировки отображаемому в окне). Трассировка вместе с со всеми пользовательскими комментариями при этом должна сохраняться в файле автоматически без каких либо команд от пользователя.

При работе в UI mode все новые приходящие сообщения автоматически добавляются и могут быть сразу на лету просмотрены в конце лога в UI.

Клиенты могут быть написаны как на С/С++, так и на VB или любом другом scripting language
2. Простенькая OCX отображающая часы в числовом виде (ходящие естественно) и имеющая возможность менять по запросу с клиента вид этих часов (ну например – менять цвет или фонт – что именно роли не играет). При изменении размера часов, они должны масштабироваться.

3. Dialog Client – Диалоговое приложение использующее Clock OCX для показа часов в своем поле диалога. Имеет команды позволяющие поменять вид часов в соответствии с возможностями ОСХ. Желательно реализовать этот компонент на VB.

4. MDI Client – MDI приложение, отображающее в каждом из своих child окон часы с используя Clock OCX. Должны предоставлять команды функционально аналогичные с Dialog Client позволяющую поменять вид часов раздельно в каждом MDI Child окне. При изменении размера MDI Child окна размер часов должен пропорционально изменяться.



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

Суть Log Server в том, чтобы сохранять всю полученную на текущий момент информацию в файле даже в том случае, если все рухнуло.

Note: только не надо писать в лог трассировку о изменении времени каждые N секунд!



Требования к оформлению кода:

Должна быть венгерская нотация.
Все UI-строки должны браться из ресурсов.
Программа должна быть локализуема (компилироваться в ANSI/UNICODE, правильно работать с MBCS).
Числа не должны быть разбросаны по коду.
Должны быть комментарии (на английском).
:

Suum cuique (лат.)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.