#include <iostream>
#include<time.h>
const unsigned short SIZE_OF_BUFFER = 1//缓冲区长度
int g_buffer[SIZE_OF_BUFFER]
bool g_continue = true//控制程序结束
HANDLE g_hMutex//用于线程间的互斥
DWORD WINAPI FatherProc(LPVOID)//父进程线程
DWORD WINAPI SonProc(LPVOID)//使用打印机的线程
int main()
{
//创建各个互斥信号
g_hMutex = CreateMutex(NULL,FALSE,NULL)
const unsigned short FATHERS_COUNTS = 1//父进侍塌程线程的个数
const unsigned short SONS_COUNT = 2//使用打印机的线程的个数
//总的线程数
const unsigned short THREADS_COUNT = FATHERS_COUNTS+SONS_COUNT
HANDLE hThreads[THREADS_COUNT]//各线程的handle
DWORD fatherID[FATHERS_COUNTS]//父进程线程的标识符
DWORD sonID[SONS_COUNT]/隐数/使用打印机的线程的标识符
//父进程线程
for (int i=0i<FATHERS_COUNTS++i){
hThreads[i]=CreateThread(NULL,0,FatherProc,NULL,0,&fatherID[i])
if (hThreads[i]==NULL) return -1
}
//使用打印机的线程
for (i=0i<SONS_COUNT++i){
hThreads[SONS_COUNT+i]=CreateThread(NULL,0,SonProc,NULL,0,&sonID[i])
if (hThreads[i]==NULL) return -1
}
while(g_continue){
if(getchar())
{ //按回车后终止程序运行
g_continue = false
}
}
return 0
}
//分配打印机
void Append()
{
srand((unsigned)time(0))
std::cerr <<"打印机空闲 ...\n"
if(rand()%2)
{
g_buffer[0]=1//给PA
}
else
{
g_buffer[0]=0//给灶谈首PB
}
}
//son使用打印机
void Take()
{
if(g_buffer[0]==1)
{
std::cerr <<"PA使用打印机 ... "
std::cerr <<"成功" <<std::endl<<std::endl
}
if(g_buffer[0]==0)
{
std::cerr <<"PB使用打印机 ... "
std::cerr <<"成功" <<std::endl<<std::endl
}
g_buffer[0]=-1
}
//父进程
DWORD WINAPI FatherProc(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hMutex,INFINITE)
Append()
Sleep(1500)
ReleaseMutex(g_hMutex)
}
return 0
}
//子进程
DWORD WINAPI SonProc(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hMutex,INFINITE)
Take()
Sleep(1500)
ReleaseMutex(g_hMutex)
}
return 0
} 最后的要求自己添加
有两种办法:
重载一个queue模板,把锁封装到重载的函数里
每次使用queue的函数的时亩誉候加迅粗段锁,使凳蔽用完毕后,解锁
// playFair 加密 你参考下 ...#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define x 50
char MiYao[x],PassWord[x],AddPass[x],Table[5][5],Map[25]
bool Visit[27]={false}
char English[27]="abcdefghijklmnopqrstuvwxyz"
void Input()
{
printf("请输入密蚂返钥:\t") scanf("%s",MiYao)
printf("请输入待加密密码:\t") scanf("%s"闷烂饥,PassWord)
}
void Fun_5x5()
{
int count = 0,V =0
/*标记密钥内字符为: true*/
for(int i=0MiYao[i]!='\0'i++)
if(strchr(English,MiYao[i])!=NULL)
Visit[strchr(English,MiYao[i])-English] = true
/*执行密钥矩阵 *** 作 并标记已使用字符:true*/
for(int i=0i<5i++)
for(int j=0j<5j++)
{
if(count<strlen(MiYao))
Table[i][j] = MiYao[count++]
else
{
while(Visit[V] != false) V++
Table[i][j] = English[V]
Visit[V++] = true
}
}
puts("∞∞∞密钥矩阵为∞∞∞")
for(int i=0i<5i++)
{ for(int j=0j<5j++)
printf("%3c",Table[i][j])
puts("")
}
puts("∞∞∞∞∞∞∞∞∞∞∞")
}
int IsVisited(char ch)
{
return Visit[strchr(English,ch)-English] //false 未出现过
}
void TabletoMap()
{ int count=0
for(int i=0i<5i++)
for(int j=0j<5j++)
Map[count++]=Table[i][j]
Map[count]='\0'
}
void Judge()
{
int len = strlen(PassWord),i,j,k
memset(AddPass,0,sizeof(char))
/*一历或对对去字母,剩下单个字母,则不变化,直接放入加密串中.*/
if(len%2){
AddPass[len-1] = PassWord[len-1]
len -=1
}
/*一对中 密钥矩阵中 存在矩阵 eg.ab 先输出a同行顶点在输出b同行顶点*/
int row1,low1,row2,low2,a1,a2
for(i=0i<leni+=2)
{
char c1,c2
c1 = PassWord[i]
c2 = PassWord[i+1]
/*一对中 两字母相同 无变化*/
/*一对中 有字母不在密钥矩阵中 无变化*/
if(c1 == c2 || ( !IsVisited(c1)||!IsVisited(c2)))
{ AddPass[i] = c1
AddPass[i+1]=c2
}else{
a1 = strchr(Map,c1)-Map
row1 = a1/5 low1 = a1%5
a2 = strchr(Map,c2)-Map
row2 = a2/5 low2 = a2%5
/*一对中 字符出现在同行或同列 简单swap字符*/
if(row1 == row2 || low1 == low2)
{
AddPass[i] = c2
AddPass[i+1] = c1
}else{
AddPass[i] = Table[row1][low2]
AddPass[i+1] = Table[row2][low1]
}
}
}AddPass[len+1]='\0'
puts("加密后字符串:")
puts(AddPass)
puts("原串是:")
puts(PassWord)
}
int main()
{
Input()
Fun_5x5()
TabletoMap()
Judge()
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)