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

📄 signal.cpp

📁 C实现模拟与或非门的逻辑电路
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					default :
						break;
					}
				}
			}

		}
	}
/*-------------------------------Input END ---------------------------*/ 

/*--------------------------------Connect----------------------------*/

	int connum = 0,flag = 0;                  //connum记录Connect个数,flag记录已经运行了的Connect语句

	bool isconnect[6][20]={true};             //记录本器件是否已经计算过了
	for (i = 0; i < 6; i++)
		for (int j = 0; j < 20; j++)
		{
			isconnect[i][j] = true;
		}

	string con_out,con_in;
	LinkList outtemp;

	if(inputfile_Map.is_open())
		inputfile_Map.close();
	inputfile_Map.clear();
	inputfile_Map.open(mapfile,ios_base::binary);
	//判断共有多少个输出
	while (inputfile_Map.good())
	{
		str.resize(0);
		inputfile_Map.getline(temp,255,'\n');
		str = temp;
		isfind = str.find("Connect");
		if (isfind!=string::npos)
			connum++;
	}
//	cout<<"connum="<<connum<<endl;
	//建立连接
	if(inputfile_Map.is_open())
		inputfile_Map.close();
	inputfile_Map.clear();
	inputfile_Map.open(mapfile,ios_base::binary);
	while(flag < connum)
	{
		str.resize(0);
		inputfile_Map.getline(temp,255,'\n');
		str = temp;
		isfind = str.find("Connect");
		if (isfind!=string::npos)//本行包含"Connect"
		{
			con_out.resize(0); con_in.resize(0);
			for (i=str.find(":")+1;i<str.find(".");i++)//con_out记录输出信号的器件名字
				con_out+=temp[i];

			for(i=str.find(",")+1;i<str.find_last_of(".");i++)//con_in记录接收信号的器件名字
				con_in+=temp[i];

//			cout<<"输入名字"<<con_in<<endl;
			for (i=i+1;temp[i]!='\0';i++);//判断接收信号器件的管脚
			if(temp[i-2]=='1')
				pin = 1;
			else if(temp[i-2]=='2')
				pin = 2;
			else
			{
				cout<<"器件管脚有误,请检查"<<endl<<"按任意键退出";
				getch();
				exit(1);
			}
			outtemp = NULL;//临时输出缓冲计算前为空

			//--------------------读取输出--------------------

			for (i=0;i<6;i++) 
			{
				for (int j=0;j<devicenum[i];j++)
				{
					switch (i)
					{
					case 0:
						if(strcmp(and[j].name, con_out.c_str()) == 0)
							if(and[j].Ifinput()&&isconnect[0][j])
							{
								and[j].GetResponse();
								outtemp = and[j].GetOutput();
								flag++;	isconnect[0][j]=false;
							}
							break;
					case 1 :
						if(strcmp(or[j].name, con_out.c_str()) == 0)
							if(or[j].Ifinput()&&isconnect[1][j])
							{
								or[j].GetResponse();
								outtemp = or[j].GetOutput();
								flag++;	isconnect[1][j]=false;
							}
						break;
					case 2:
						if(strcmp(not[j].name, con_out.c_str()) == 0)
							if (not[j].Ifinput()&&isconnect[2][j])
							{
								not[j].GetResponse();
								outtemp = not[j].GetOutput();
								flag++;	isconnect[2][j]=false;
							}
						break;
					case 3:
						if(strcmp(nand[j].name, con_out.c_str()) == 0)
							if (nand[j].Ifinput()&&isconnect[3][j])
							{
								nand[j].GetResponse();
								outtemp = nand[j].GetOutput();
								flag++;	isconnect[3][j]=false;
							}
							
						break;
					case 4:
						if(strcmp(xor[j].name, con_out.c_str()) == 0)
							if (not[j].Ifinput()&&isconnect[4][j])
							{
								xor[j].GetResponse();
								outtemp = xor[j].GetOutput();
								flag++;	isconnect[4][j]=false;
							}
							
						break;
					case 5:
						if(strcmp(nxor[j].name, con_out.c_str()) == 0)
							if (not[j].Ifinput()&&isconnect[5][j])
							{
								nxor[j].GetResponse();
								outtemp = nxor[j].GetOutput();
								flag++;	isconnect[5][j]=false;
							}
						break;
					default :
						break;
					}//end of switch(i)

				}//end of for(j)

			}//end of for(i)

			//-----------------------将输出赋给相应的器件-------------

			if (outtemp!=NULL)//本行已经计算输出
			{
				for (i=0;i<6;i++)
				{
					for (int j=0;j<devicenum[i];j++)
					{
						switch (i)
						{
						case 0:
							if(strcmp(and[j].name, con_in.c_str()) == 0)
							{
								if (pin == 1)
								{
									and[j].SetInput1(outtemp);
									and[j].SetInputTag1();
								}
								else
								{
									and[j].SetInput2(outtemp);
									and[j].SetInputTag2();
								}
							}
							break;
						case 1 :
							if(strcmp(or[j].name, con_in.c_str()) == 0)
							{
								if (pin == 1)
								{
									or[j].SetInput1(outtemp);
									or[j].SetInputTag1();
								}
								else
								{
									or[j].SetInput2(outtemp);
									or[j].SetInputTag2();
								}
							}
							break;
						case 2:
							if(strcmp(not[j].name, con_in.c_str()) == 0)
							{
								if(pin == 1)
								{
									not[j].SetInput(outtemp);
									not[j].SetInputTag();
								}
								else
								{
									cout<<"非门有误,请更正\n按任意键退出……";
									getch();
									exit(1);
								}
							}
							break;
						case 3:
							if(strcmp(nand[j].name, con_in.c_str()) == 0)
							{
								if(pin == 1)
								{
									nand[j].SetInput1(outtemp);
									nand[j].SetInputTag1();
								}
								else
								{
									nand[j].SetInput2(outtemp);
									nand[j].SetInputTag2();
								}
							}
							break;
						case 4:
							if(strcmp(xor[j].name, con_in.c_str()) == 0)
							{
								if(pin ==1)
								{
									xor[j].SetInput1(outtemp);
									xor[j].SetInputTag1();
								}
								else
								{
									xor[j].SetInput2(outtemp);
									xor[j].SetInputTag2();
								}
							}
							break;
						case 5:
							if(strcmp(nxor[j].name, con_in.c_str()) == 0)
							{
								if(pin == 1)
								{
									nxor[j].SetInput1(outtemp);
									nxor[j].SetInputTag1();
								}
								else
								{
									nxor[j].SetInput2(outtemp);
									nxor[j].SetInputTag2();
								}
							}
							break;
						default :
							break;
						}//end of switch(i)

					}//end of for(j)

				}//end of for(i)

			}//end of if(outtemp!=NULL)

		}//end of if(isfind!=string::npos)


		if (str.find("EndMap")!=string::npos)//文件到了最后一行但Connecet未完成
		{
			if (flag < connum)
			{
				inputfile_Map.close();//关闭输入流
				inputfile_Map.clear();//清空
				inputfile_Map.open(mapfile,ios_base::binary);//重新打开,在扫描一遍
			}
		}
	}//end of while(flag<connum)

/*------------------------------Connect END-------------------------------------*/


/*----------------------------------Output----------------------------------------*/

	LinkList * output;
	string deviceout;//记录输出器件名称

	if(inputfile_Map.is_open())
		inputfile_Map.close();
	inputfile_Map.clear();
	inputfile_Map.open(mapfile,ios_base::binary);
	
	while (inputfile_Map.good())//查看有多少个输出信号
	{
		str.resize(0);
		inputfile_Map.getline(temp,255,'\n');
		str = temp;
		isfind = str.find("Output");
		if (isfind!=string::npos)
			outputnum++;
	}

	output = new LinkList[outputnum];

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


	while (inputfile_Map.good())
	{
		str.resize(0);
		inputfile_Map.getline(temp,255,'\n');
		str = temp;
		isfind = str.find("Output");
		if (isfind!=string::npos)
		{
			deviceout.resize(0);
			for (i=str.find(":")+1;i<str.find_first_of(".");i++)
			{
				deviceout+=temp[i];//deviceout记录输出信号的器件的名字
			}

			for(i=0;temp[i]!='\0';i++);
			int m = (int)temp[i-2]-49;//本行的输出是第几个输出信号

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

					switch (i)
					{
					case 0:
						if(strcmp(and[j].name, deviceout.c_str()) == 0)
						{
							and[j].GetResponse();
							*(output+m) = and[j].GetOutput();
						}
						break;
					case 1:
						if(strcmp(or[j].name, deviceout.c_str()) == 0)
						{
							or[j].GetResponse();
							*(output+m) = or[j].GetOutput();
						}
						break;
					case 2:
						if(strcmp(not[j].name, deviceout.c_str()) == 0)
						{
							not[j].GetResponse();
							*(output+m) = not[j].GetOutput();
						}
						break;
					case 3:
						if(strcmp(nand[j].name, deviceout.c_str()) == 0)
						{
							nand[j].GetResponse();
							*(output+m) = nand[j].GetOutput();
						}
						break;
					case 4:
						if(strcmp(xor[j].name, deviceout.c_str()) == 0)
						{
							xor[j].GetResponse();
							*(output+m) = xor[j].GetOutput();
						}
						break;
					case 5:
						if(strcmp(nxor[j].name, deviceout.c_str()) == 0)
						{
							nxor[j].GetResponse();
							*(output+m) = nxor[j].GetOutput();
						}
						break;
					default:
						break;
					}
				}//end of for(j)
			}//end of for(i)
		}//end of if (isfind!=string::npos)
	}

/*----------------------------Output END----------------------------*/

	return output;
}

⌨️ 快捷键说明

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