Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2013, 19:22   #1
hvz-
Форумчанин
 
Регистрация: 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.
hvz- вне форума Ответить с цитированием
Старый 14.01.2013, 20:36   #2
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Решил проблему с параметрами, осталось понять как вычислять день недели по принимаемым аргументам. Вот что у меня пока что получилось но не правильно работает:
Код:
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;
hvz- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аргументы командной строки в студии. the_deer_one Общие вопросы C/C++ 8 11.03.2012 22:43
Аргументы командной строки Sadist989 Общие вопросы C/C++ 9 22.06.2011 12:53
аргументы командной строки ololo-schoolboy Общие вопросы C/C++ 2 19.05.2011 22:50
Аргументы командной строки в Boost.test nazavrik Общие вопросы C/C++ 0 18.02.2010 17:23