Форумчанин
Регистрация: 14.11.2010
Сообщений: 138
|
[C] Аргументы командной строки. Вычисление дня недели.
Всем привет!
Есть задание:
Цитата:
1. Написать программу SLAVE , которая выводит день недели по дате, переданной в качестве параметра. Если параметр не передан, вывести об этом сообщение и закончить программу. Если программа запущена из приложения MASTER, вывести на экран уникальный идентификатор приложения MASTER Если программа запущена сама по себе, вывести об этом информацию.
2. Написать приложение MASTER которое:
а) генерирует дату (день, месяц, год – 2000...2010), запускает приложение SLAVE и передает в качестве параметров сгенерированную дату и уникальный идентификатор процесса (MASTER). При завершении программы SLAVE завершается MASTER
3. Продемонстрировать совместную работу двух приложений. Для этого на экран должна выводиться достаточно подробная информация о ходе выполнения каждого из процессов.
|
Интересует передача аргументов программе slave.exe - она почему то не хочеть их "кушать", хотя вроде всё верно.
Код:
// 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 завершился, выходим из программы
{
printColor(master, 5);
printf("Process slave.exe exited. 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;
}
}
Код:
// 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;
}
И ещё интересует вычисление дня недели по полученной дате, сначала думал считать все дни и делить на 7, а остаток принимать за соотв. день недели. Но потом понял что не правильно, а идей уже и нет. Помогите кто может!)
Последний раз редактировалось hvz-; 13.01.2013 в 19:47.
|