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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2010, 09:00   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию шифрование текста

Доброе утро. Необходимо используя WinApi:семафоры и мьютексы, решить следующую задачу:В текстовом файле находится текст произвольной длины на английском языке. Необходимо выполнить шифрование этого текста по следующему алгоритму:
- все буквы в тексте преобразуются в заглавные;
- каждая буква заменяется на следующую по алфавиту, т.е. А заменяется на В, В – на С, и т.д. Буква Z должна быть заменена на A.
Зашифрованный текст должен быть помещен в новый текстовый файл.
Выборку текста из файла выполняет один поток, который считывает символы последовательно в буфер, длиной m символов. Каждый новый символ записывается в первую свободную ячейку с конца буфера.
Шифрование текста осуществляют n потоков-шифровщиков, которые модифицируют буквы в буфере по указанным правилам.
Запись шифрованного текста выполняет третий поток, который вычитывает символы из буфера от начала к концу и освобождает ячейки для записи новых символов.

Решила не использую средства синронизации, начала переделывать прогу под Win Api, но не могу разобраться с семафорами и мьютексами, помогите пожалуйста, вот мой код:
Код:
#include "stdafx.h"
#include "iostream"
#include "windows.h"
#include "time.h"
	
//=============================================================================================================
//				описание данных
//=============================================================================================================
	FILE *file_in;	//файловая переменная
	FILE *file_out;	//файловая переменная
	char* file_in_name = "input.txt";	//имя файла
	char* file_out_name = "output.txt";	//имя файла
	const int n=10;
	char str[n];	//буфер
	int count=0;
	int start=0;
	int col_num[n];
//=============================================================================================================
//			функции и процедуры
//=============================================================================================================
DWORD WINAPI reader(LPVOID data)	//чтение данных в буфер
{
	int i=n-1;
	while(!feof(file_in))
	{
		fscanf(file_in,"%c",&str[i]);
		count++;
		i--;
	}
	return 0;
}

DWORD WINAPI shifr(void * data)	//шифрование данных
{
	int *pnum = (int*)data;
	int num=*pnum;

	str[num]=toupper(str[num]);	//преобразование в загланую
	if (str[num]=='Z')
		str[num]='A';
	else
		str[num]=str[num]+1;
	return 0;
}

DWORD WINAPI writer(LPVOID data)	//запись данных в файл
{

	for(int i=start;i<n;i++)
		fwrite(&str[i], 1, 1, file_out);
	return 0;
}

		
//=============================================================================================================
//				главная программа
//=============================================================================================================
void main()
{
//=============================================================================================================
//			описание данных
//=============================================================================================================
	file_in = fopen(file_in_name,"r");	//открытие файла для чтения 
	file_out = fopen(file_out_name,"w");	//открытие файла на запись
	//скорее всего будет 2 мьютекса для синхронизации поток чтения и записи
	// один семафор для шифорвания отдельных букв

//=============================================================================================================
//			создание потока на чтение данных
//=============================================================================================================
	HANDLE hThread_read;
	hThread_read=CreateThread(NULL,0,reader,NULL,0,NULL);
	if (hThread_read==NULL)
	{	
		std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
	}

	start=n-count+1;	//индекс с которого начнется шифрование

//=============================================================================================================
//			создание потоков на шифрование символов
//=============================================================================================================
	for(int i=0;i<n;i++)
		col_num[i]=i;

	HANDLE hThread_shifr[n];
	DWORD id[n];
	for(int i=0;i<n;i++)
	{
		hThread_shifr[i]=CreateThread(NULL,0,shifr,&col_num[i],0,&id[i]);
		if (hThread_shifr==NULL)
		{	
			std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
		}
	}

//=============================================================================================================
//			создание потока на запись
//=============================================================================================================
	HANDLE hThread_write;
	hThread_write=CreateThread(NULL,0,writer,NULL,0,NULL);
	if (hThread_write==NULL)
	{	
		std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
	}

}
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 01.06.2010, 18:20   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

добавила объекты синхронизации:
Код:
#include "stdafx.h"
#include "iostream"
#include "windows.h"
#include "time.h"
	
//=============================================================================================================
//				описание данных
//=============================================================================================================
	FILE *file_in;	//файловая переменная
	FILE *file_out;	//файловая переменная
	char* file_in_name = "input.txt";	//имя файла
	char* file_out_name = "output.txt";	//имя файла
	const int n=10;
	char str[n];	//буфер
	int count=0;
	int start=0;
	int col_num[n];
	HANDLE hMutexRead;	//Мьютекс "информация считана"
	HANDLE hMutexWrite;	//мьютекс "ифномация записана"
	HANDLE hSem;	//семафор для шифрования
	


//=============================================================================================================
//			функции и процедуры
//=============================================================================================================
DWORD WINAPI reader(void * data)	//чтение данных в буфер
{
	int i=n-1;
	while(!feof(file_in))
	{
		fscanf(file_in,"%c",&str[i]);
		count++;
		i--;
	}
	return 0;
}

DWORD WINAPI shifr(void * data)	//шифрование данных
{
	int *pnum = (int*)data;
	int num=*pnum;
	str[num]=toupper(str[num]);	//преобразование в загланую
	if (str[num]=='Z')
		str[num]='A';
	else
		str[num]=str[num]+1;
	return 0;
}

DWORD WINAPI writer(void* data)	//запись данных в файл
{

	for(int i=start;i<n;i++)
		fwrite(&str[i], 1, 1, file_out);
	return 0;
}

		
//=============================================================================================================
//				главная программа
//=============================================================================================================
void main()
{
//=============================================================================================================
//			описание данных
//=============================================================================================================
	file_in = fopen(file_in_name,"r");	//открытие файла для чтения 
	file_out = fopen(file_out_name,"w");	//открытие файла на запись

	hSem=CreateSemaphore(NULL,0,n,NULL);	//создание семафора в закрытом виде
	hMutexRead=CreateMutex(NULL,false,NULL);	//создание мьютекса информация считана
	hMutexWrite=CreateMutex(NULL,true,NULL);	//создание мьютекса информация записана

//=============================================================================================================
//			создание потока на чтение данных
//=============================================================================================================
	HANDLE hThread_read;
	hThread_read=CreateThread(NULL,0,reader,NULL,0,NULL);
	if (hThread_read==NULL)
	{	
		std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
	}

	WaitForSingleObject(hThread_read,INFINITE);

//=============================================================================================================
//			создание потоков на шифрование символов
//=============================================================================================================
	for(int i=0;i<n;i++)
		col_num[i]=i;

	HANDLE hThread_shifr[n];
	DWORD id[n];
	for(int i=0;i<n;i++)
	{
		hThread_shifr[i]=CreateThread(NULL,0,shifr,&col_num[i],0,&id[i]);
		if (hThread_shifr==NULL)
		{	
			std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
		}
	}
	WaitForMultipleObjects(n,hThread_shifr,true,INFINITE);
	
//=============================================================================================================
//			создание потока на запись
//=============================================================================================================
	HANDLE hThread_write;
	start=n-count+1;	//индекс с которого начнется шифрование
	hThread_write=CreateThread(NULL,0,writer,NULL,0,NULL);
	if (hThread_write==NULL)
	{	
		std::cout<<"Поток № не был создан"<<"error"<<GetLastError();	
	}
	WaitForSingleObject(hThread_read,INFINITE);
	getchar();
}
Но вот пока не разобралась как синхронизировать
Помогите
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 01.06.2010, 18:24   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

тема закрыта
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Побуквенное шифрование текста! Gauss Общие вопросы Delphi 11 23.08.2013 19:14
Шифрование текста(Assembler) Anutka2611 Помощь студентам 0 25.04.2010 21:41
Шифрование текста XOR'ом nec117 Общие вопросы .NET 8 22.12.2009 17:53
Шифрование текста XOR'ом nec117 Общие вопросы C/C++ 6 05.12.2009 15:21
Шифрование текста SoundMan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 15.08.2008 22:39