Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
#1

Подсчёт даты и winapi - C++

09.01.2013, 08:22. Просмотров 1014. Ответов 23
Метки нет (Все метки)

Всем доброго времени суток!
Встал в ступор на таком задании:
1. Написать программу SLAVE , которая выводит день недели по дате, переданной в качестве параметра. Если параметр не передан, вывести об этом сообщение и закончить программу. Если программа запущена из приложения MASTER, вывести на экран уникальный идентификатор приложения MASTER Если программа запущена сама по себе, вывести об этом информацию.

2. Написать приложение MASTER которое:
генерирует дату (день, месяц, год – 2000...2010), запускает приложение SLAVE и передает в качестве параметров сгенерированную дату и уникальный идентификатор процесса (MASTER). При завершении программы SLAVE завершается MASTER
Как написать генератор даты что бы slave выводил день недели? И как собственно считать дни недели?
В ступоре полнейшем, даже не знаю с чего начинать.

Пишу не с пустыми руками, но всё равно не работает)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
char GenerateDate(char *date[])
{
    char days[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", 
                    "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",
                    "25", "26", "27", "28", "29", "30", "31", "\0"};
    char moths[] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "\0"};
    char years[] = {"2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009",
                      "2010", "2011", "2012", "2013", "\0"};
    srand((unsigned)time(NULL));
    *date[0] = days[rand()%12+1];
        // и так далее
}
 
int main(int argc, char *argv[])
{
    char *date[9];
    GenerateDate(date);
 
    _getch();
}
 
 
 
Error   1   error C2078: too many initializers  9   1
Error   2   error C2078: too many initializers  12  1
Error   3   error C2078: too many initializers  13  1
Error   4   IntelliSense: expected a '}'        9   23
Error   5   IntelliSense: expected a '}'        12  24
Error   6   IntelliSense: expected a '}'        13  26
Ругается на char days, months, years. Вроде всё правильно делаю, но всё равно не так?

Я тут подумал, а можно сделать так: передавать приложению параметры в виде "C:\program.exe -date 01 -month 01 -year 2001" - такое же можно реализовать? Если да, то как?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2013, 08:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчёт даты и winapi (C++):

Подсчёт слов в строке. Подсчёт символов в словах строки - C++
Начал изучение строк в С++. Решая задачу по поиску количества строк и количеству указанных символов упёрся лбом в стену. Теорию понял:...

На основе введенной даты рождения и текущей даты сообщить пользователю, сколько он прожил дней - C++
3. Написать программу, которая на основе введенной даты рождения и текущей даты сообщает пользователю, сколько он прожил дней. Принять во...

Дан файл, содержащий различные даты. Каждая дата – это число, месяц и год. Найти все весенние даты - C++
Дан файл, содержащий различные даты. Каждая дата – это число, месяц и год. Найти все весенние даты.

Подсчёт символов - C++
Здравствуйте. У меня такая проблема: мне нужно подсчитать количество слов, начинающихся с одинакового символа. Написал программу, которая...

Подсчёт символов - C++
Люди вот я написал мини прогу в консоле: #include <conio.h> #include <string.h> using namespace std; int main() { ...

Подсчёт функций - C++
Добрый вечер всем :) Есть идея сделать подсчёт значений функции(Который в алгебре), но проблема в том, что там может быть как и x^2...

23
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
10.01.2013, 16:01  [ТС] #16
Цитата Сообщение от kravam Посмотреть сообщение
И не брал ты в руки даже Kернигана и Ритчи, не ври. Там специальная глава есть "аргументы командной строки"
Извиняюсь, теперь нашёл. Слишком быстро бегло глазами по содержанию прошёлся.

Цитата Сообщение от kravam Посмотреть сообщение
Короче ты пытаешься написать программу абсолютно не умея программировать. Начни с "Hello, word!" мой тебе совет.
Недавно писал приложение на чистом винапи+си, не думаю что меня можно назвать ничего не знающим в этой области человеком. Просто я не со всем знаком, ещё не всё знаю. Поэтому обратился за помощью сюда. Прошу помочь с запихиванием целочисленных чисел в конец массива char, прилагаю исходник того что есть ещй раз, если кто то не увидел:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
#include "windows.h"
#include <conio.h>
#include <time.h>
 
int main(int argc, char *argv[])
{
    srand((unsigned)time(NULL));
    int day = rand()%31;
    int month = rand()%12;
    int year = rand()%13+2000;
    HANDLE hProcess = GetModuleHandle(NULL);
    cout << "Generated date: " << day << "." << month << "." << year << endl;
    cout << "Process handle: " << hProcess << endl;
    cout << "Press any key o continue..." << endl;
    _getch();
}
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
10.01.2013, 16:52 #17
Цитата Сообщение от hvz- Посмотреть сообщение
Прошу помочь с запихиванием целочисленных чисел в конец массива char
cмысл? А впрочем, вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
int main () {
 
 int x= 23;
 int y= 56;
 int z= 100;
 
 char array [20];
 
 char* temp= &array [sizeof(array)- sizeof(int)* 3];
 
 memcpy (temp, (char*)&x, sizeof(int));
 temp+=sizeof(int);
 memcpy (temp, (char*)&y, sizeof(int));
 temp+=sizeof(int);
 memcpy (temp, (char*)&y, sizeof(int));
 
 for (int i= 0; i< 20; i++ ) {
  printf ("%x ", (unsigned char)array [i]);
 }
 
 getchar ();
 return 0;
}
ещё что спросишь?
0
Agent Smith
40 / 40 / 9
Регистрация: 24.11.2012
Сообщений: 200
10.01.2013, 17:01 #18
Цитата Сообщение от kravam Посмотреть сообщение
Это что такое, объясни мне?
'00'
может чтобы первое число было на первом месте, а не на нулевом? ну и все остальные тоже чтобы были на своих местах
0
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
12.01.2013, 20:26  [ТС] #19
Цитата Сообщение от kravam Посмотреть сообщение
cмысл? А впрочем, вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
int main () {
 
 int x= 23;
 int y= 56;
 int z= 100;
 
 char array [20];
 
 char* temp= &array [sizeof(array)- sizeof(int)* 3];
 
 memcpy (temp, (char*)&x, sizeof(int));
 temp+=sizeof(int);
 memcpy (temp, (char*)&y, sizeof(int));
 temp+=sizeof(int);
 memcpy (temp, (char*)&y, sizeof(int));
 
 for (int i= 0; i< 20; i++ ) {
  printf ("%x ", (unsigned char)array [i]);
 }
 
 getchar ();
 return 0;
}
ещё что спросишь?
Не спрошу, ибо с sprintf() намного легче + ваш вариант не рабочий, выводил не то что нужно. (VS2010)

Цитата Сообщение от Agent Smith Посмотреть сообщение
может чтобы первое число было на первом месте, а не на нулевом? ну и все остальные тоже чтобы были на своих местах
Совершенно верно!

Но теперь возникла другая проблема - почему то не хочет принимать параметры. Прилагаю исходники:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// MASTER
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include "windows.h"
 
void printColor(char* text, int color)
{
    HANDLE hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
    printf("%s",text);
    SetConsoleTextAttribute(hConsole, 7);
}
 
int main(int argc, char *argv[])
{
    // генерация даты: числа, месяца и года
    int day, month, year;
    srand((unsigned)time(NULL));
    day = rand()%31+1;
    month = rand()%12+1;
    year = rand()%13+2000;
 
    // выводим сгенерированную дату
    char master[] = "Master: ";
    char date[15];
    printColor(master, 5);
    printf("Generated date: ");
    sprintf(date, "%d %d %d \n", day, month, year);
    printColor(date, 9);
 
    // получаем идентификатор процесса master.exe
    unsigned short int procID = GetCurrentProcessId();
    char procID_c[15];
    printColor(master, 5);
    printf("master.exe Process ");
    sprintf(procID_c, "ID = %d \n", procID);
    printColor(procID_c, 9);
 
    // переменная пути с параметрами для запуска
    char path[50]; 
    
    // переводим целые числа в символы
    char day_c[3];
    _itoa(day, day_c, 10);
    char month_c[3];
    _itoa(month, month_c, 10);
    char year_c[5];
    _itoa(year, year_c, 10);
 
    // создаём строку для запуска slave.exe с параметрами
    sprintf(path, "slave.exe by_master %s %s %s %d", &day_c, &month_c, &year_c, procID); 
    
    printColor(master, 5);
    printf("Start slave.exe with this params: %s\n", path);
 
    // запускаем процесс slave.exe
    DWORD dwExitCode;
    STARTUPINFO cif;
    ZeroMemory(&cif,sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi;
    if (CreateProcess(TEXT("slave.exe"), (LPWSTR)path, NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==TRUE) // если получилось, ждём пока не завершится процесс slave.exe
    {
        printColor(master, 5);
        printf("Process slave.exe ");
        printColor("created!\n", 2);
        if (WaitForSingleObject(pi.hProcess,INFINITE)!=WAIT_FAILED) // если процесс slave.exe не отвечает, завершаем процесс и выходим из программы
        {
            TerminateProcess(pi.hProcess, GetExitCodeProcess(pi.hProcess,&dwExitCode));
            printColor(master, 5);
            printf("Process slave.exe terminated. Press any key to exit...");
            _getch();
            return 0;
        }
    }
    else // если не получилось запустить процесс slave.exe, выходим из программы
    {
        printColor(master, 5);
        printf("Process slave.exe ");
        printColor("not created\n", 4);
        printColor(master, 5);
        printf("Press any key to exit...");
        _getch();
        return 0;
    }
}


Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// SLAVE
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include "windows.h"
 
void printColor(char* text, int color)
{
    HANDLE hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
    printf("%s",text);
    SetConsoleTextAttribute(hConsole, 7);
}
 
 
int main(int argc, char *argv[])
{
    char slave[] = "Slave: ";
    unsigned short int day=0, month=0, year=0, procID=0;
    long int years_passed = 730500; // колличество дней с рождества христова по состоянию на 2000ый год
 
    // определяем, есть ли аргументы
    if(argc == 1)
    {
        printColor(slave, 11);
        printf("No input arguments! Press any key to exit...\n");
        _getch();
        return 0;
    }
    else if(argc > 1)
    {
        // определяем кем была запущена программа
        if(strcmp(argv[1], "by_master"))
        {
            printColor(slave, 11);
            printf("Slave launched by master.\n");
        }
        else
        {
            printColor(slave, 11);
            printf("Slave launched by itslef.\n");
        }
 
        // принимаем параметры
        day = atoi(argv[2]);
        month = atoi(argv[3]);
        year = atoi(argv[4]);
        procID = atoi(argv[5]);
    }
 
    printColor(slave, 11);
    printf("%d %d %d %d \n", day, month, year, procID);
    _getch();
    return 0;
}

Не могу понять в чём может быть проблема.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
13.01.2013, 04:26 #20
Цитата Сообщение от hvz- Посмотреть сообщение
Не спрошу, ибо с sprintf() намного легче + ваш вариант не рабочий, выводил не то что нужно. (VS2010)
что именно?

Добавлено через 6 минут
Цитата Сообщение от Agent Smith Посмотреть сообщение
может чтобы первое число было на первом месте, а не на нулевом? ну и все остальные тоже чтобы были на своих местах
Тогда напиши первое на первое, второе на второе, а третье на третье. Предположим, нам нужны числа 23, 45, 67. Тогда пишем так:
C++
1
int x []= {123, 23, 45, 67};
вот и всё, все на свои местах. А вместо 123 ты можешь написать что угодно, поскольку это число стоит на нулевом месте, а нулевое тебе не нужно. А так писать и предполагать в этом здравый смысл:
C++
1
'00'
это неграмотность свою показывать.
0
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
13.01.2013, 05:56  [ТС] #21
Цитата Сообщение от kravam Посмотреть сообщение
что именно?

Добавлено через 6 минут
Тогда напиши первое на первое, второе на второе, а третье на третье. Предположим, нам нужны числа 23, 45, 67. Тогда пишем так:
C++
1
int x []= {123, 23, 45, 67};
вот и всё, все на свои местах. А вместо 123 ты можешь написать что угодно, поскольку это число стоит на нулевом месте, а нулевое тебе не нужно. А так писать и предполагать в этом здравый смысл:
C++
1
'00'
это неграмотность свою показывать.
Спасибо за советы!
В вашем примере показывало не те числа которые вы присвоили переменным целого типа.
Не подскажете где может быть ошибка с параметрами? Наотрез не хочет их принимать, всё перепроверил, вроде всё верно.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
13.01.2013, 06:36 #22
Цитата Сообщение от hvz- Посмотреть сообщение
Не подскажете где может быть ошибка с параметрами? Наотрез не хочет их принимать, всё перепроверил, вроде всё верно.
я всё могу и подсказать и показать и всё. Но зачем? Я тебе скажу ты скажешь "не то". А что именно "не то" будешь молчать как партизан.

...Я привык работать последовательно. Прежде всего дай сюда якобы неправильный вывод, вот этот:
Цитата Сообщение от hvz- Посмотреть сообщение
В вашем примере показывало не те числа которые вы присвоили переменным целого типа.
второй раз тебе говорю уже.
А потом дальше будем разбираться. Если будем.
0
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
13.01.2013, 16:44  [ТС] #23
Цитата Сообщение от kravam Посмотреть сообщение
я всё могу и подсказать и показать и всё. Но зачем? Я тебе скажу ты скажешь "не то". А что именно "не то" будешь молчать как партизан.
Формулирую данную задачу: заставить работать slave.exe, а именно - что бы принимал параметры. Исходники приложены сообщением выше.
0
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
14.01.2013, 20:32  [ТС] #24
решил проблему с параметрами, осталось понять как вычислять день недели по принимаемым аргументам. Вот что у меня пока что получилось но не правильно работает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int days_passed = 730500; // колличество дней с 0001 нашей эры по состоянию на 2000ый год
// считаем колличество дней прошедших с 2000 года
        int days_from_date=0;
        // считаем дни из аргумента года
        for(int i=0; i<=year-2000; i++)
        {
            if(i==0)
                continue;
            else
            {
                if(year%4 == 0)
                    days_from_date += 366;
                else
                    days_from_date += 365;
            }
        }
        // считаем дни из аргумента месяца
        for(int i=0; i<=month; i++)
        {
            if(i == 0)
                break;
            else
            {
                if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)
                    days_from_date += 31;
                else if(i==4 || i==6 || i==9 || i==11)
                    days_from_date += 30;
                if(i==2)
                {
                    if(year%4 == 0)
                        days_from_date += 29;
                    else
                        days_from_date += 28;
                }
            }
        }
        printColor(slave, 11);
        printf("Days passed after 2000 year: %d , all: %d \n", days_from_date, days_passed+days_from_date);
        float today = ((float)days_passed + (float)days_from_date) / 7;
        printColor(slave, 11);
        printf("Today is %.4f \n", today);
        return 0;
0
14.01.2013, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 20:32
Привет! Вот еще темы с ответами:

Неправильный подсчёт результата - C++
Добрый день) Написал программу на плюсах, что представлена ниже. Параллельно также на Делфи и синхронизирую их. Проверил в Excel и...

Подсчёт зарплаты содрудников - C++
Программа должна считать общую зарплату сотрудников, и выводить имена тех кому её не зачислили #include &lt;iostream&gt; int eMoney; ...

Подсчёт повторяющихся цифр - C++
Здравствуйте, мне нужно написать программу, которая считает количество повторяющихся цифр в строке, т.е. сколько едениц, двоек и т.д....

Подсчёт контрольной суммы - C++
Приветствую! Необходимо подсчитать 32-битную сумму для файла checksum = word1 + word2 + ... + wordN. Я недавно читал про little-...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru