Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #124


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 124.  12 ноября 2011 г.

Здравствуйте, уважаемые читатели!


Начало: часть 1, часть 2.

Оглавление



Модуль Application


В предыдущей статье мы остановились на том, что решили вынести функции инициализации и главного цикла приложения в отдельный модуль. Этим сейчас и займемся.


Автоматизируем создание поддиректории модуля


Сначала нужно подготовить поддиректорию для этого модуля, а в ней создать поддиректории для интерфейса, исходных текстов, объектных модулей, тестов... Впрочем, я уже повторяюсь.

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


Код: (CreateModule.bat)
:: директория для модуля
mkdir %1

:: поддиректория для интерфейса
mkdir %1\include

:: поддиректория для исходных текстов
mkdir %1\src

:: поддиректория для объектных файлов инструментальной системы
mkdir %1\obj\PC

:: поддиректория для тестов
mkdir %1\test

Разместим его в поддиректории Software, из которой «растут» все модули проекта. Теперь достаточно набрать в командной строке:


> CreateModule.bat Application

, и мы получим желаемое:

E:\Projects\Shelek\Blinker\Software>mkdir Application

E:\Projects\Shelek\Blinker\Software>mkdir Application\include

E:\Projects\Shelek\Blinker\Software>mkdir Application\src

E:\Projects\Shelek\Blinker\Software>mkdir Application\obj\PC

E:\Projects\Shelek\Blinker\Software>mkdir Application\test

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


Автоматизируем создание заготовки модуля


Прежде всего в поддиректорию vendor скопируем нашу старую знакомую Unity. Читатели, ознакомившиеся с предыдущими статьями, уже знают, где ее взять (а возможно, уже и успели обзавестись).

Затем пишем скрипт:


Код: (GenMod.bat)
ruby vendor\unity\auto\generate_module.rb -i"%1/include" -s"%1/src" -t"%1/test" %2 %3

Выполняем:


GenMod.bat Application Application[/console]

Результат:


E:\Projects\Shelek\Blinker\Software>ruby vendor\unity\auto\generate_module.rb -i"Application/include" -s"Application/src" -t"Application/test" Application  
File Application/src/Application.c created
File Application/include/Application.h created
File Application/test/TestApplication.c created
Generate Complete

Посмотрим, что создал генератор модулей.


Код: (Application.h)
#ifndef _APPLICATION_H
#define _APPLICATION_H

#endif // _APPLICATION_H

Код: (Application.c)
#include "Application.h"

Код: (TestApplication.c)
#include "unity.h"
#include "Application.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test_Application_NeedToImplement(void)
{
    TEST_IGNORE();
}

Пока что ничего неожиданного, нечто подобное мы уже видели при знакомстве с Unity. Теперь мы можем наконец реализовать свои намерения по переносу функций инициализации и главного цикла приложения в модуль Application:


Рефакторинг



...


Полностью прочитать статью можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».

  • Программирование :: Общий
  • Имеется скрипт установки, который в зависимости от платформы должен копировать бинарники в ProgramFiles.

    Код: (xml)
    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="53cee088-54b8-483d-92ee-b9e8bbaf4c5a" Name="Project" Language="1033" Version="1.0.0.0" Manufacturer="Me" UpgradeCode="776190bb-a78f-4cd5-91ea-39903aac20e2">
    <Package InstallerVersion="200" Compressed="yes" Description="Pro" Manufacturer="Me" Comments="blabla" Platform="x64"/>

    <Media Id="1" Cabinet="data.cab" EmbedCab="yes" />

    <!-- Virtual directory-->
    <Directory Id="TARGETDIR" Name="SourceDir">
    <!-- Subdir Program Files\Myproj for x86-->
    <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLLOCATION" Name="Myproj" />
    </Directory>
    <!-- Subdir Program Files\Myproj for x64-->
    <Directory Id="ProgramFiles64Folder">
    <Directory Id="INSTALLLOCATION64" Name="Myproj" />
    </Directory>
    <!-- Subdir Start\Programs\Myproj -->
    <Directory Id="ProgramMenuFolder" Name="Programs">
    <Directory Id="ProgramMenuDir" Name="Myproj" />
    </Directory>
    <!-- Desktop -->
    <Directory Id="DesktopFolder" Name="Desktop" />
    </Directory>

    <!-- Elements in folder with program x86-->
    <DirectoryRef Id="INSTALLLOCATION">
    <Component Id="MainExecutible86" Guid="C57C4CDD-3923-48e3-8532-B8383B97DC6F">
    <File Id="MyprojExe86" Name="Myproj.exe" Source="D:\Projects\Me\bin\Debug\Win32\Myproj.exe" DiskId="1" KeyPath="yes">
    <!-- Shortcuts for launch program-->
    <Shortcut Id="DesktopShortcut86" Name="Myproj" Description="Desctop Shortcut" WorkingDirectory="INSTALLLOCATION" Directory="DesktopFolder" Advertise="yes" Icon="MyprojIcon.exe"></Shortcut>
    <Shortcut Id="ProgramsMenuShortcut86" Name="Myproj" Description="The best" WorkingDirectory="INSTALLLOCATION" Directory="ProgramMenuDir" Advertise="yes" Icon="MyprojIcon.exe"></Shortcut>
    </File>
    </Component>
    </DirectoryRef>

    <!-- Elements in folder with program x64-->
    <DirectoryRef Id="INSTALLLOCATION64">
    <Component Id="MainExecutible64" Guid="7F4365BE-C98E-473c-A299-2D5F9EAADE79">
    <Condition>VersionNT64</Condition>
    <File Id="MyprojExe64" Name="Myproj.exe" Source="D:\Projects\Me\bin\Debug\Win32\Myproj.exe" DiskId="1" KeyPath="yes">
    <!-- Shortcuts for launch program-->
    <Shortcut Id="DesktopShortcut64" Name="Myproj" Description="Desctop Shortcut" WorkingDirectory="INSTALLLOCATION64" Directory="DesktopFolder" Advertise="yes" Icon="Myproj.exe"></Shortcut>
    <Shortcut Id="ProgramsMenuShortcut64" Name="Myproj" Description="The best" WorkingDirectory="INSTALLLOCATION64" Directory="ProgramMenuDir" Advertise="yes" Icon="MyprojIcon.exe"></Shortcut>
    </File>
    </Component>
    </DirectoryRef>

    <DirectoryRef Id="ProgramMenuDir">
    <Component Id="ProgramMenuDir" Guid="5DBA90BB-4E2D-404b-B334-92FA721E7BFC">
    <Shortcut Id="UninstallMyproj" Name="Uninstall the Myproj" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]" Description="Uninstall Myproj"></Shortcut>
    <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
    <RegistryValue Root="HKCU" Key="Sofware\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />
    </Component>
    </DirectoryRef>

    <!--Features x86-->
    <Feature Id="ProductFeature86" Title="Myproj Installer" Description="Install Myproj" Display="expand" Level="1" ConfigurableDirectory="INSTALLLOCATION" AllowAdvertise="no" Absent="disallow" InstallDefault="local">
    <Condition Level="0"><![CDATA[Not VersionNT64]]></Condition>
    <Feature Id="RequiredComponents86" Title="Required Components" Description="This components need for correctly program work" Level="1" AllowAdvertise="no" Absent="disallow" InstallDefault="local">
    <ComponentRef Id="MainExecutible86" />
    <ComponentRef Id="ProgramMenuDir" />
    </Feature>
    </Feature>

    <!--Features x64-->
    <Feature Id="ProductFeature64" Title="Myproj Installer" Description="Install Myproj" Display="expand" Level="1" ConfigurableDirectory="INSTALLLOCATION64" AllowAdvertise="no" Absent="disallow" InstallDefault="local">
    <Condition Level="0"><![CDATA[VersionNT64]]></Condition>
    <Feature Id="RequiredComponents64" Title="Required Components" Description="This components need for correctly program work" Level="1" AllowAdvertise="no" Absent="disallow" InstallDefault="local">
    <ComponentRef Id="MainExecutible64" />
    <ComponentRef Id="ProgramMenuDir" />
    </Feature>
    </Feature>

    Вся проблема в том, что если не указывать параметр Platform="x64", не будут работать фичи для х64 ОС, а если указывать, то получается, что на х32 не поставить. Как выйти из положения?

    P.S. Знаю - делать две инсталляции, но для меня это не вариант. 
  • С ресурсами стакливаюсь впервые, нужно как-то засунуть в них exe и потом сохранить его на диск, запустить новый процесс с ним, подождать пока выполнится и удалить.
    Но не пойму, как обратиться к экзешнику который в ресурсах.
    Вопрос конечно чайниковский, но гугл от меня уже устал.
    Буду рад не только прямому ответу, но и линку на толковый туториал по работе с ресурсами.
  • Программирование :: Общий :: Алгоритмы и математические задачи.
  • Подскажите люди добрые - где искать-читать.
    Задача разделить оптимально отрезок длиной LL на N отрезков заданных длин (L1*N1), (L2*N2), ....
    С учетом дополнительных ограничений для N1, N2 .... (например, N1>=3, 0<=N1,<=2 )
    ---
    Вопрос возник не из-за неумения пользования wiki или googl, а по причине огромного объема инф-ии
    (а выбрать нужное, требуется достаточно хорошо знать математику)
    Исходные.
    1. Задача как для оптимизационной должна даваться в кач-ве примера. Мнеб достаточно ссылки.
    2. Разделы математики - линейное программирование, матем. прогр-ие, дискретная математика.
    (давно сталкивался с транспортной задачей)
    3. В математ. теории я разбираюсь слабо. Задача-решение нужно для прикладного использования.
    4. Нужен алгоритм в матем. описании или C.
  • Программирование :: .NET технология от и до
  • Нужно привязать к таблице коллекцию, элементы которой являются массивами. Т.е. каждый столбец таблицы соответствует позиции в массиве.
    WPF только осваиваю, поэтому пока решение в лоб:

    Код: (csharp)
    class Data
        {
            public string[] S { get; set; }
        }

    //////////////////

        List<Data> list = new List<Data>(2);

        Data d = new Data { S = new string[] { "aaa1", "bbb1", "ccc1" } };
        list.Add(d);

        d = new Data { S = new string[] { "aaa2", "bbb2", "ccc2" } };
        list.Add(d);

        DataGridTextColumn c;
        Binding b;

        for (int i = 0; i < 3; i++)
        {
            c = new DataGridTextColumn();
            c.Header = i.ToString();
            b = new Binding("S");
            b.Converter = new MyConverter(i);
            c.Binding = b;
            dataGrid1.Columns.Add(c);
        }

        dataGrid1.ItemsSource = list;

    //////////////////

        class MyConverter : IValueConverter
        {
            private int column;
            public MyConverter(int column)
            {
                this.column = column;
            }
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {            
                return ((string[])value)[column];
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException();          
            }
        }        

    И для поддержки редактирования нужно ещё в конверторе хранить ссылку на DataGrid.
  • Программирование :: Delphi
  • Задача по запуску Explorer'а из своей программы (прописанной в параметре Shell реестра).


    Имеем:
    Код: (delphi)
    procedure TFormRunExplorer.btRunExplorerClick(Sender: TObject);
    var
      FileName : String;
      SUInfo : TStartUpInfo;
      ProcInfo : TProcessInformation;
    begin
      //ShellExecute(Handle, 'open', 'explorer.exe', 'C:\Windows\system32', '', SW_SHOW);
      //WinExec(PANsiChar('TASKKILL /F /IM explorer.exe'), SW_HIDE);
      //sleep(5000);
      //ShellExecute(Handle,'open','C:\WINDOWS\Explorer.EXE',nil,nil,SW_ShowNormal);

      ZeroMemory(@SUInfo, SizeOf(TStartUpInfo));
      with SUInfo do
      begin
       cb := SizeOf(TStartUpInfo);
       dwFlags := STARTF_USESHOWWINDOW;
       wShowWindow := SW_SHOWNORMAL;
      end;

      FileName := 'Explorer.exe';
      CreateProcess(PChar('C:\\Windows\\' + FileName), nil, nil, nil, False, 0, nil, nil, SUInfo, ProcInfo);
    end;

    Почему в результате имеем проводник, а не истинный рабочий стол с Панелью задач/Треем и прочим?

    P.S. Обзор по Explorer'у:
    1. Запуск explorer.exe
    2. EXPLORER.EXE - Строковые параметры
    3. Блокировка виндовс (Windows) с помощью Delphi

    Windows XP SP3 / Win7 Ultimate
  • Зарегистрировал в ODBC источник данных. прописал root'a с паролем 123456 и IP удаленного компа. Запустил программу:



    Но если коннектится к серваку MySQL через консоль - то данные без проблем получаю:



    Из-за чего такое?

    WinXP на обоих машинах / mysql-connector-odbc-5.1.8-win32.msi / mysql-5.5.17-win32.msi
  • При создании динамических комбобоксов есть присвоение:
    combobox.OnChange := ComboboxChange;
    Она объявлена так:
    procedure ComboboxChange(Sender:TObject);

    На этом куске кода:
    Код: (delphi)
    procedure TRegistrationForm.SetStateButton();
    var
      i : Word;
      combo : TCombobox;
    begin

      for i := 1 to QuantityQuestion do
      begin
        combo := arrCombobox[i].pCombobox;

        if (combo.Enabled) then
          combo.OnChange(combo);

      end;

    end;
    на строчке
    combo.OnChange(combo);
    наблюдается ексэпшен:


    Где закралась ошибка ?
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Здравствуйте, что-то на строке
     Dim MSComm1 As MSComm
     Set MSComm1 = New MSComm 'стал получать ошибку ошибка 429 ACtiveX component can't create object

     В то же время библиотека Microsoft Comm Control 6.0 подключена, как лечить??
     Раньше вроде было гладко
    пробовал разрегистрировать ActiveX, а потом снова зарегистрировать
     Спасибо

    чтобы проверить ActiveX жив или мёртв, то есть чтобы можно выяснить сам факт работоспособности механизма регистрации ActiveX на компьютере, где не удается зарегистрировать определённый ActiveX пробую
    Код:
    Declare Function RegMSCOMM32OCX Lib "MSCOMM32.OCX" Alias OCXRegisterServer() As Long
     
    Sub тест()
    Const ERROR_SUCCESS = 0&
    Dim retCode As Long
    On Error Resume Next  ' включаем программную обработку ошибок
    ChDrive "C:"        ' Устанавливаем нужный
    ChDir "C:\WINDOWS\system32"    ' каталог текущим
    regCode = RegMSCOMM32.OCX()  ' регистрация MSCOMM32.OCX
    ' анализ возможных ошибок
    If Err <> 0 Then
      MsgBox "Файл MSCOMM32.OCX не найден"
    Else
      If regCode <> ERROR_SUCCES Then
        MsgBox "Операция регистрации не выполнена"
    End If
    End If
    End Sub

    Но пока выделяет на первой строке часть строки - "OCXRegisterServer"
    мне на ум приходит, только то, что в скобках () должны быть всевозможные ByVal, так??
    Но я не знаю какие, подскажите пжл как правильно
  • Программирование :: Программирование 1С
  • Столкнулся с проблемой в 1С 8.1.. Требуется получить объект формы Активного окна. В 8.2 можно без проблем получить его методом АктивноеОкно() но в 8.1 такого чудометода нету... Есть ли способ получить список всех открытых окон или активного? Существует вариант с Документы.ДОКУМЕНТ.ПолучитьФорму("НУЖНАЯФОРМА", ЭтаФорма, [КлючУникальности]) и затем по этому ключу получать форму. Но контора не соглашается разрешать редактировать любой из их родных методов... Подскажите как мне быть... Если пригодится то имеется точное имя этой формы и ссылка типа "Форма" на экземпляр Главного Окна. Может быть как то можно завязаться имея только эту информцию об окне. Пока что вариант с копированием метода не рассматривается...
  • Программирование :: Программирование 1С :: 1С 8.x
  • Как можно проверить открыт ли определенный документ или нет.
    Код:
    Форма = Документы.НазваниеД.ПолучитьФорму("ФормаДокумента");
    Если Форма.Открыта() тогда
    -*-*-*-*
    КонецЕсли;
    не работает
  • Направления программирования :: Drivers
  • Здравствуйте, почитал книгу Уолтера Они, основы вроде освоил, теперь я думаю можно подступить поближе непосредственно к теме моего курсача. Тема - драйвер для видеопроектора. Я должен написать драйвер, который определяет любой проектор подключенный к видеокарте по разъему D-Sub ну и в конечном итоге по PCI-Express к материнке. Он должен знать общие функции видепроекторов (я думаю они не сильно отличаются). Подскажите пожалуйста где взять информацию по этому вопросу?

    Это должен быть функциональный драйвер.
    В рунете кажись нет информации  по этому вопросу.
  • Microsoft предлагает try {...} except {...}
    http://msdn.microsoft.com/ru-ru/library/zazxh1a9.aspx
    Цитата
    try-except-statement:

        __try compound-statement

        __except ( expression ) compound-statement

    The compound statement after the __try clause is the guarded section. The compound statement after the __except clause is the exception handler. The handler specifies a set of actions to be taken if an exception is raised during execution of the guarded section. Execution proceeds as follows:

        The guarded section is executed.

        If no exception occurs during execution of the guarded section, execution continues at the statement after the __except clause.

        If an exception occurs during execution of the guarded section or in any routine the guarded section calls, the__except expression is evaluated and the value returned determines how the exception is handled. There are three values:

        EXCEPTION_CONTINUE_SEARCH   Exception is not recognized. Continue to search up the stack for a handler, first for containing try-except statements, then for handlers with the next highest precedence.

        EXCEPTION_CONTINUE_EXECUTION   Exception is recognized but dismissed. Continue execution at the point where the exception occurred.

        EXCEPTION_EXECUTE_HANDLER   Exception is recognized. Transfer control to the exception handler by executing the __except compound statement, then continue execution at the point the exception occurred.

    Но except, как я понял, не ловит все исключения а только
    Цитата
    The try-except statement is a Microsoft extension to the C language that enables applications to gain control of a program when events that normally terminate execution occur. Such events are called exceptions, and the mechanism that deals with exceptions is called structured exception handling.
    потому как в блоке "защищенном" try\except у меня вылетает БСОД, хотя доолжен переходить к except, где исключение обрабатывается.
    или я не прав?
    Пробовал try {...} catch {...}, который по идее должен ловить все что можно.WDK ругается на catch
    Код:
    error C2061 : syntax error : identifier 'catch'
  • Что я делаю не так? :-/ZwCreateFile возвращает ошибку.

    Код: (c)
    	HANDLE				logFileh;
    OBJECT_ATTRIBUTES fileAtr;
    IO_STATUS_BLOCK ioStatBlock;
    UNICODE_STRING fileName;
    NTSTATUS erCode;

    RtlInitUnicodeString(&fileName, L"C:\\TestDriver.log");//конвертим название лог-файла
    InitializeObjectAttributes(&fileAtr, &fileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);//инициализируем атрибуты
    //создаем лог-файл
    erCode = ZwCreateFile(
    &logFileh, //хэндл файла, который возвращает эта ф-я
    FILE_WRITE_DATA| SYNCHRONIZE, //access to the object
    &fileAtr, //сведения о файле
    &ioStatBlock, //буфер для инфы
    NULL, //LARGE_INTEGER AllocationSize
    FILE_ATTRIBUTE_NORMAL, //флаги для файла
    0, //делиться ли файлом?
    FILE_OVERWRITE_IF, //что делать если файл существует\не существует
    FILE_NON_DIRECTORY_FILE, //у нас не директория
    NULL, //для драйверов должно быть NULL
    0 //для драйверов должно быть 0
    );
  • Практические разделы :: Базы данных
  • Суть проблемы:
    делаю БД в Access 2010 для одной фирмочки (учет заказов) в многопользовательском варианте. Одна база - таблицы (играет роль сервера), остальные базы - как бы клиенты, связанные с таблицами. Использую ADO для соединения с таблицами, вроде всё ничего, но бывает, что Access неожиданно прекращает работу с предложением сообщить разработчикам, если я найду способ решения этой проблемы. Насколько вообще надежен Аксесс для нелокального использования (число записей в главной таблице порядка 3-4 тыс)?
  • Практические разделы :: Программы
  • Есть bat-файл, внутри которого пара строчек:

    Цитата
    msiexec /i mysql-5.5.17-win32.msi /passive
    pause..
    1. Если я по нему кликаю, то начинает запускаться mysql-5.5.17-win32.msi.

    2. Если я на него встаю и выбираю "Запуск от имени администратора" , то будет так:



    Установка и не думает начинаться.

    Каковы причины?

    Windows 7 SP1 32-bit
  • Учимся программировать :: Начинающим
  • Необходимо сделать электронный учебник из doc файла с оболочкой, оглавлением, также нужно вставить 1 видео ролик. Посоветуйте при помощи какого программного обеспечения это будет проще всего сделать. Должно же быть специализированное ПО. Всем заранее спасибо за ответы.
  • добрый день.
    я недавно занимаюсь visual studio библ. mfc.
    необходимо рисовать в форме. я добавил пикчерс на форму. и что дальше?.

    как вообще создать и работать с изображением в форме?
     как нарисовать треугольник в форме?
  • Доброго времени суток! Опыт программирования на java у меня практически нулевой,но столкнулся с задачей,которую необходимо реализовать:


    Создать абстрактный класс Сотрудник. У него должны быть методы для задания ставки (з/п в месяц при 100% отработки), количества отработанных часов, а также методы для получения процента отработанного времени и зарплаты за месяц.
    Сотрудники могут быть двух типов: Программист и Менеджер. Программист получает зарплату в соответствии с количеством отработанных часов, а менеджер - 100% в случае переработки и соответствующий процент в случае недоработки.
    Класс Бухгалтер принимает множество сотрудников и считает их з/п. Для него должно быть прозрачным, какого типа является сотрудник. Ему важна только зарплата за текущий месяц.
    Создать нужно 4 класса: сотрудник,менеджер,программист,бухгалтер.


    класс сотрудник,менеджер и программист я создал,но не понимаю, нафиг нужен класс бухгалтер,если у меня зарплата считается в менеджере и программисте,но класс "бухгалтер" должен быть обязательно;класс бухгалтер должен наследовать сотрудника или не обязательно?как вообще подсчёт зарплаты в этом классе организовать?Заранее спасибо за советы.
    Вот собственно то,что я уже набросал:

    Код: (java)
    abstract class Employee
    {
    private int ID;
    public String name;
    public String role;
    public int FixedSalary;
    public int worckedHours;
    public Employee()
    {
    ID++;
    }
    public final int getID()
    {
    return ID;
    }
    public void setName(String name)
    {
    this.name=name;
    }
    public void setRole(String role)
    {
    this.role=role;
    }
    public int setFixedSalary(int FixedSalary)
    {
    return this.FixedSalary=FixedSalary;
    }
    public int setWorckedHours(int worckedHours)
    {
    return this.worckedHours=worckedHours;
    }
    public int getWorckedHours()
    {
    return worckedHours;
    }
    public int getFixedSalary()
    {
    return this.FixedSalary;
    }
    public String getName()
    {
    return name;
    }
    public String getRole()
    {
    return role;
    }
     
    public abstract int getPercent();
    public abstract int getFullSalary();

    }

    Код: (java)
    class Developer extends Employee
     {
    static private  final  int HOURS_FOR_MONTH = 160;
    static private  final  int MAX_SALARY=5000;
    public  int getPercent()
    {
    return getWorckedHours()*100/HOURS_FOR_MONTH;
    }
    public  int getFullSalary()
    {
    return getFixedSalary()*100/MAX_SALARY;
    }
     }

    Код: (java)
    class Manager extends Employee
     {
    static private  final  int HOURS_FOR_MONTH = 160;
    static private  final  int MAX_SALARY=4000;
    public  int getPercent()
    {
    if(getWorckedHours()>HOURS_FOR_MONTH)
    {
    return 100;
    }
    return getWorckedHours()*100/HOURS_FOR_MONTH;
    }
    public  int getFullSalary()
    {
    return getFixedSalary()*100/MAX_SALARY;
    }
     }
  • Не подскажите наиболее простой синхронный метод производить данное действие?
    Связка FindFirstFile, CopyFile, FindNextFile конечно хороша но может есть способ проще и быстрее?
    PS. С\С++.
  • Посоветуйте пожалуйста, библиотеку с реализацией хеширования файла (блока данных ) для С.
  • Подскажите нубу, с помощью какой функции можно считывать файл построчно? мне нужно написать программу которая будет находить файлы по маске. А в дальнейшем отбирать файлы с определенной строкой. С поиском по маске я разобрался, а вот как считывать построчно каждую строку не могу... было бы здорово если бы  кто-нибудь привел примеры. Может есть еще какой-нибудь способ реализовать данную задачу?

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное