⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signal.cpp

📁 C实现模拟与或非门的逻辑电路
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"

LinkList * ReadInputSignal(char * inputfile,int & inputnum)
{
	char  temp[255];
	string  str,lastTimeBuf;
	bool signal[255];
	int signal_Num,i,lastTime[255];
	LinkList *input;
	input=new LinkList[255];
	inputnum = 0;
	
	ifstream inputFile_Value;
	
	inputFile_Value.open(inputfile,ios_base::binary);
	
	while(inputFile_Value.good())
	{
		inputFile_Value.getline(temp,255,'\n');                              //用temp保存其中的一行
		
		if (temp[0] == '#'||temp[0] == 13)                                   //除去无用信息
		{
			temp[0] = '\0';
		}
		
		else
		{
			str = temp;
			if (!str.find("system"))                                         //找到有输入信息的一行
			{
				inputnum++;
				signal_Num = 0;
				int j = 0;
				for(i = 0;temp[i] != '\0';i++)
				{
					if(temp[0] == ',')
						i = 0;
					if(temp[i] == ':'||temp[i] == ',')
					{
						signal_Num++;
						for (int k = str.find('(')+1;k<str.find(')');k++)      //找到括号中的持续时间
						{
							lastTimeBuf+=temp[k];
						}
						if(temp[i+1] == '1')
							signal[j] = true;
						else if(temp[i+1] == '0')
							signal[j] = false;
						else
						{
							cout<<"INPUT SIGNAL ERROR!"<<endl<<"Press any button to exit."<<endl;
							getche();
							exit(1);
						}
						lastTime[j] = atoi(lastTimeBuf.c_str());
						j++;
						lastTimeBuf.resize(0);                                   //清空持续时间
						str.assign(str,str.find_first_of(')')+1,str.length());
						strcpy(temp,str.c_str());
					}      //end of if
				}      //end of for
				
				input[inputnum-1] = ListCreate(signal,lastTime,signal_Num);      //每一行建一个链表
				
				continue;
				
			}      //end of if
			
		}      //end of else
		
	}      //end of while
	return input;
}


/*---------------------------------查找Map文件中的有用信息----------------------------*/

LinkList * DealInputSignal(char * mapfile,LinkList * inputsignal,int & outputnum)
{
	
	string device[6] = {"AND","OR","NOT","NAND","XOR","NXOR"};
	string  str;
	char  temp[255];
	int pin;//是哪个管脚
	int isfind;
	int i;
	outputnum = 0;
	ifstream inputfile_Map;

/*-------------------------------------Element-------------------------------------*/

	int device_no;//记录器件种类

	DeviceAND and[20]; DeviceOR or[20]; DeviceNOT not[20];
	DeviceNAND nand[20]; DeviceXOR xor[20]; DeviceNXOR nxor[20];
	string devicename;
	int devicenumber = 0; //记录器件的总个数
	int devicenum[6]={0,0,0,0,0,0};
//	int n = 0;

	inputfile_Map.open(mapfile,ios_base::in);
	while (inputfile_Map.good())
	{
		inputfile_Map.getline(temp,255,'\n');      //用temp保存其中的一行
		str = temp;
		isfind = str.find("EndElement");
		if (temp[0] == '#'||str.length()==0||(str.find("Element")==0))         //除去无用信息
		{
			temp[0] = '\0';
		}
		else if(isfind!=string::npos)
		{
			inputfile_Map.close();
			break;
		}
		else
		{
			devicenumber++;
		}
	}
//	cout<<devicenumber<<endl;

	if(inputfile_Map.is_open())
		inputfile_Map.close();

	inputfile_Map.clear();

	inputfile_Map.open(mapfile,ios_base::in);

	while (inputfile_Map.good())
	{
		inputfile_Map.getline(temp,255,'\n');      //用temp保存其中的一行
		str = temp;
		isfind = str.find("EndElement");

		if (temp[0] == '#'||str.length()==0||(str.find("Element"))==0)         //除去无用信息
		{
			
			temp[0] = '\0';
		}
		else if(isfind!=string::npos)
		{
			inputfile_Map.close();
			break;
		}
		else
		{
			device_no = 0;
			i = str.find(":");
			devicename.resize(0);
			if(i!=string::npos)
			{
				for (i=str.find(":")+1;temp[i]!='\0';i++)
				{
					devicename+=temp[i];
				}
			}
//			cout<<n<<devicename[n]<<endl;
//			n++;
			str.resize(0);    //str清空
			for (i=0;temp[i]!='\0';i++)//寻找冒号
			{
				if(temp[i]==':')
					break;
			}
			if(temp[i]!='\0')
			{
				for(int j=0;j<i;j++)
					str += temp[j];//str存储器件名
//				cout<<str<<endl;            
			}

			for(i=0;i<6;i++)
			{
				if(str == device[i])         //具体为什么器件
				{
					device_no = i+1;
					break;
				}
			}
			switch (device_no)              //确定器件类型
			{
			case 1:
//				cout<<devicename.c_str()<<endl;
				strcpy(and[devicenum[0]].name, devicename.c_str());
//				cout<<devicenum[0]<<endl<<and[devicenum[0]].name<<endl;
				devicenum[0]++;
//				cout<<devicenum[0]<<endl;
				break;
			case 2:
				strcpy(or[devicenum[1]].name, devicename.c_str());
//								cout<<devicenum[1]<<endl<<or[devicenum[1]].name<<endl<<and[0].name<<endl;
				devicenum[1]++;
//				cout<<devicenum[1]<<endl;
				break;
			case 3:
				strcpy(not[devicenum[2]].name, devicename.c_str());
				devicenum[2]++;
//				cout<<devicenum[3]<<endl;
				break;
			case 4:
				strcpy(nand[devicenum[3]].name, devicename.c_str());
				devicenum[3]++;
//				cout<<devicenum[4]<<endl;
				break;
			case 5:
				strcpy(xor[devicenum[4]].name, devicename.c_str());
				devicenum[4]++;
//				cout<<devicenum[4]<<endl;
				break;
			case 6:
				strcpy(nxor[devicenum[5]].name, devicename.c_str());
				devicenum[5]++;

				break;
			default:
				break;
			}

			for (i = 0; i < 6; i++)
			{
				if (devicenum[i]>19)
				{
					cout<<"每种器件最多19个,按任意键退出\n"<<endl;
					getch();
					exit(1);
				}
			}
		}
	}	


/*---------------------------------Element END-----------------------------------*/

/*------------------------------------Input--------------------------------------*/

	string devicetemp;
	int signalstep;

	if(inputfile_Map.is_open())
		inputfile_Map.close();
	inputfile_Map.clear();
	inputfile_Map.open(mapfile,ios_base::in);

	while (inputfile_Map.good())
	{
		inputfile_Map.getline(temp,255,'\n');      //用temp保存其中的一行
		str = temp;
		if(!str.find("EndMap"))
		{
			inputfile_Map.close();
			break;
		}
		isfind = str.find("Input");
		if (isfind!=string::npos)
		{
			devicetemp.resize(0);
			signalstep = (int)temp[str.find(",")-1]-49;//判断是第几个输入
	//		cout<<"signalstep"<<signalstep<<endl;

			for (i=str.find(",")+1;i<str.find_last_of(".");i++)//判断接受输入信号的器件
			{
				if(temp[i]!=' ')
					devicetemp+=temp[i];
			}

			for (i=i+1;temp[i]!='\0';i++) ;//判断器件的管脚
			if(temp[i-1]=='1')
				pin = 1;
			else if(temp[i-1]=='2')
				pin = 2;
			else
			{
				cout<<"器件管脚有误,请检查"<<endl<<"按任意键退出";
				getch();
				exit(1);
			}


			for (i=0;i<6;i++)
			{
				for (int j=0;j<devicenum[i];j++)
				{
					switch (i)
					{
					case 0:

	//					cout<<j<<endl<<and[j].name<<endl<<devicetemp.c_str()<<endl;

						if(strcmp(and[j].name, devicetemp.c_str()) == 0)
						{
							if (pin == 1)
							{
								and[j].SetInput1(inputsignal[signalstep]);
								and[j].SetInputTag1();
							}
							else
							{
								and[j].SetInput2(inputsignal[signalstep]);
								and[j].SetInputTag2();
							}
						}
						break;
					case 1 :
						if(strcmp(or[j].name, devicetemp.c_str()) == 0)
						{
							if (pin == 1)
							{
								or[j].SetInput1(inputsignal[signalstep]);
								or[j].SetInputTag1();
							}
							else
							{
								or[j].SetInput2(inputsignal[signalstep]);
								or[j].SetInputTag2();
							}
						}
						break;
					case 2:
						if(strcmp(not[j].name, devicetemp.c_str()) == 0)
						{
							if(pin == 1)
							{
								not[j].SetInput(inputsignal[signalstep]);
								not[j].SetInputTag();
							}
							else
							{
								cout<<"非门有误,请更正\n按任意键退出";
								getch();
								exit(1);
							}
						}
						break;
					case 3:
						if(strcmp(nand[j].name, devicetemp.c_str()) == 0)
						{
							if(pin == 1)
							{
								nand[j].SetInput1(inputsignal[signalstep]);
								nand[j].SetInputTag1();
							}
							else
							{
								nand[j].SetInput2(inputsignal[signalstep]);
								nand[j].SetInputTag2();
							}
						}
						break;
					case 4:
						if(strcmp(xor[j].name, devicetemp.c_str()) == 0)
						{
							if(pin ==1)
							{
								xor[j].SetInput1(inputsignal[signalstep]);
								xor[j].SetInputTag1();
							}
							else
							{
								xor[j].SetInput2(inputsignal[signalstep]);
								xor[j].SetInputTag2();
							}
						}
						break;
					case 5:
						if(strcmp(nxor[j].name, devicetemp.c_str()) == 0)
						{
							if(pin == 1)
							{
								nxor[j].SetInput1(inputsignal[signalstep]);
								nxor[j].SetInputTag1();
							}
							else
							{
								nxor[j].SetInput2(inputsignal[signalstep]);
								nxor[j].SetInputTag2();
							}
						}
						break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -