Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Текст програми ⇐ ПредыдущаяСтр 3 из 3
#include " StdAfx.h" #include " Disc.h"
CDisc:: CDisc(void): m_hFile(NULL) { } CDisc:: ~CDisc(void) { } void CDisc:: GetDevice()//функція для отримання системної інформації про носії { m_DeviseList.empty(); //очистка списку пристроїв DWORD dw = GetLogicalDriveStrings(0, NULL); // визначаємо тип зміної функції TCHAR *str; // визначаємо типу зміної str = new TCHAR[dw]; GetLogicalDriveStrings(dw, str); //отримаємо характеристики пристрою bool bSave = true; //задання зміної для перевірки for(DWORD i=0; i< dw; i++) //цикл на перревірку значення дескриптору { if((str[i] == '\0')& & (str[i+1] == '\0')) //якщо значення дескриптору пусте break; //преривання if(bSave) //якщо значення відрізняється від \0 { CString strD(& str[i]); if(GetDriveType(strD)==DRIVE_FIXED) //отримання типу пристрою m_DeviseList.push_back(strD); //отримання значення списку пристрою bSave = false; //якщо умога виконалася } if(str[i] == '\0') //перевірка значення дескриптору bSave = true; } delete[] str; //очищення пам’яті } int CDisc:: CheckDisc(CString strDisc, LONG lBegin, LONG lEnd, CTestInterface* pInterface) { if(strDisc[strDisc.GetLength()-1]=='\\') //перевірка на назву strDisc.Delete(strDisc.GetLength()-1); //пристрою CString str; //перенастроювання типу зміної str.Format(_T(" \\\\.\\%s"), strDisc); //формат визначення диску m_hFile=CreateFile(str, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, //виконуємо відкриття пристрою NULL, OPEN_EXISTING, 0, NULL); CAutoVectorPtr< BYTE> pArray; //визначення типу масиву pArray.Allocate(512); //задання розрядності DWORD dwRead; //задаємо тип змінної if(! ReadFile(m_hFile, pArray, 512, & dwRead, NULL)) //перевірка значення отримане від функції { return 1; //повертає помилку } SYSTEMTIME tBegin; // визначаємо змінну для визначення початку тестування GetSystemTime(& tBegin); // визначаємо значення часу початку текстування SetFilePointer(m_hFile, 1*18*80*512, NULL, FILE_BEGIN); //встановлюємо показчик файлу на задану позицію if(! ReadFile(m_hFile, pArray, 512, & dwRead, NULL)) //якщо неможливо звернутися до пристрою(прочитати файл) { return 1; //повертає помилку } SYSTEMTIME tEnd; // опис змінної для зберіганя часу закінчення тестування GetSystemTime(& tEnd); // визначаємо час кінця тестуваняя m_dwTime = (tEnd.wHour - tBegin.wHour)*60*60*1000+(tEnd.wMinute - tBegin.wMinute)*60*1000+(tEnd.wSecond - tBegin.wSecond)*1000+(tEnd.wMilliseconds - tBegin.wMilliseconds); // визначаємо загальний час тестування // опис змінних m_pInterface = pInterface; m_lBegin = lBegin; m_lEnd = lEnd; _beginthread(RunThread, 0, this); //вказівник на створення нитки return 0; } void CDisc:: Test() { SetFilePointer(m_hFile, m_lBegin*512, NULL, FILE_BEGIN); //встановлюємо показчик файлу на задану позицію LONG lPoint = m_lBegin; //визначаємо тип зміної, та передаємо значення
int ind_st=lPoint; // визначаємо лівий індекс int ind_end=m_lEnd; // визначаємо правий індекс для визначення адреси сектора методом «butterfly» int sec_count=m_lEnd-lPoint; // визначаємо кількість секторів, що підлягають тестуванню for(int ii=0; ii< sec_count; ii++) // цикл по всім секторам, які необхідно протестувати { if(ii % 2 == 0) // якщо індекс парний { if(ii == 0){ // якщо перший елемент lPoint = ind_st; // задаємо початковий індекс без прирощення } else{ ind_st=ind_st+1; // прирощення на 1 індекса зліва lPoint = ind_st; // задаємо новий індекс } } else { if(ii == 1){ lPoint = ind_end; // якщо 2 елемент, індекс без прирощення } else{ ind_end=ind_end-1; // прирощення на -1 індекса lPoint = ind_end; // задаємо новий індекс } } BYTE pArray[512]; // створення масиву розміром сектора DWORD dwRead; // опис змінної ReadFile(m_hFile, pArray, 512, & dwRead, NULL); // читаємо сектор SetFilePointer(m_hFile, lPoint*512, NULL, FILE_BEGIN); // встановлюємо вказівник на необхідний сектор BYTE pK1[512]; memset(pK1, 0xFFFF, sizeof pK1); WriteFile(m_hFile, pK1, 512, & dwRead, NULL); //запис у сектор BYTE pRead[512]; SetFilePointer(m_hFile, lPoint*512, NULL, FILE_BEGIN); // встановлюємо вказівник на необхідний сектор ReadFile(m_hFile, pRead, 512, & dwRead, NULL); //Читаємо сектор SetFilePointer(m_hFile, lPoint*512, NULL, FILE_BEGIN); // встановлюємо вказівник на необхідний сектор WriteFile(m_hFile, pArray, 512, & dwRead, NULL); // відновлюємо сектор // перевірка зп/читання int nStatus = 0; if(memcmp(pK1, pRead, sizeof pK1)! =0)//якщо масиви не співпадають { // MessageBox(NULL, _T(" Битый сектор"), 0, 0); nStatus = 1; // встановлюємо флаг помилик }
m_pInterface-> CallBack(m_lBegin, m_lEnd, lPoint, nStatus); //підключаємо значення к інтерфейсу } m_pInterface-> CallBack(m_lBegin, m_lEnd, lPoint, 0); //усе гаразд, сектори прочитані без помилок } void CDisc:: RunThread(void*pThis) //функція запуску нитки { CDisc *pDisc = static_cast< CDisc*> (pThis); //втановлюємо показчик pDisc-> Test(); } //підключаємо функцію отримання системної інформації про носій void CDisc:: GetDiskSpace(CString strDisc, DWORD& dwSectorsPerCluster, DWORD& dwBytesPerSector, DWORD& dwNumberOfFreeClusters, DWORD& dwTotalNumberOfClusters) { GetDiskFreeSpace(strDisc, & dwSectorsPerCluster, & dwBytesPerSector, & dwNumberOfFreeClusters, & dwTotalNumberOfClusters); } void CDisc:: GetDiscInformation(CString strDisk, CString& strName, DWORD& dwSerialNumber, DWORD& dwMaxCompName, CString& strFileSystem) { DWORD dwFileSistem; GetVolumeInformation(strDisk, strName.GetBufferSetLength(MAX_PATH+1), MAX_PATH+1, & dwSerialNumber, & dwMaxCompName, & dwFileSistem, strFileSystem.GetBufferSetLength(MAX_PATH+1), MAX_PATH+1); strName.ReleaseBuffer(); strFileSystem.ReleaseBuffer(); } 3.2 Отримані результати Рисунок 1 – Вибір накопичувача та ввід даних.
Рисунок 2 – Процес тестування. Рисунок 3 – Тестування закінчено.
|