Example #1
0
void main() {

	GOODS goods[MAX];
	int choice, sum;
	
	sum = read_file(goods);

	if (sum == 0) {

		printf ("Key in the goods information~********\n");
		getchar();
		sum = input (goods);

	}

	do {

		clrscr();

		printf ("\n\n		**********the managed system of supermarket***********");

		printf ("	1.Append the goods information	\n\n");
		printf ("	2.Modify the goods information	\n\n");
		printf ("	3.Delete the goods information	\n\n");
		printf ("	4.Print the informationof stock goods	\n\n");
		printf ("	5.Inquire the goods information	\n\n");
		printf ("	6.Count the goods information	\n\n");
		printf ("	7.Sort the goods information	\n\n");
		printf ("	0.Exit the system of goods information	\n\n");
		
		printf ("	Please choose that you want(0~7):");
		
		scanf ("%d", &choice);	

		switch (choice)	{

			case 1:append();
			       break;
			case 2:modify(goods, sum);
		       	       break;
			case 3:delete();
			       break;
			case 4:output(goods, sum);
			       break;
			case 5:inquire();
			       break;
			case 6:count();
			       break;
			case 7:sort(goods, sum);
			       break;
			case 0:break;

		}

	   }while (choice != 0);

	save_file(goods, sum);

}
Example #2
0
void Triangles::MakeQuadrangles(double costheta)
{
  if (verbosity>2) 
    cout << " -- MakeQuadrangles costheta = " << costheta << endl;
  if (verbosity>5)  
    cout << "    (in)  Nb of Quadrilaterals = " << NbOfQuad 
	 << " Nb Of Triangles = " << nbt-NbOutT- NbOfQuad*2 
         << " Nb of outside triangles = " << NbOutT << endl;

  if (costheta >1) {
    if (verbosity>5)
      cout << "     do nothing costheta >1 "<< endl;
    return;}

  
  Int4 nbqq = (nbt*3)/2;
  DoubleAndInt4  *qq = new DoubleAndInt4[nbqq];

  Int4 i,ij;
  int j;
  Int4 k=0;
  for (i=0;i<nbt;i++)
    for (j=0;j<3;j++)
      if ((qq[k].q=triangles[i].QualityQuad(j))>=costheta)
 	   qq[k++].i3j=i*3+j;
//  sort  qq
  HeapSort(qq,k);
  
  Int4 kk=0;
  for (ij=0;ij<k;ij++)
    { 
      //      cout << qq[ij].q << " " << endl;
      i=qq[ij].i3j/3;
      j=(int) (qq[ij].i3j%3);
      // optisamition no float computation  
      if (triangles[i].QualityQuad(j,0) >=costheta) 
        triangles[i].SetHidden(j),kk++;
    }
  NbOfQuad = kk;
  if (verbosity>2) 
    {
    cout << "    (out)  Nb of Quadrilaterals = " << NbOfQuad 
	 << " Nb Of Triangles = " << nbt-NbOutT- NbOfQuad*2 
         << " Nb of outside triangles = " << NbOutT << endl;
    }
  delete [] qq;
#ifdef DRAWING2 
  Draw();
  inquire();
#endif

}
Example #3
0
void QueryBook()   /*查询图书信息*/
{     
    char id[10];   /*结果集中的行数*/
    char *sql;
    char dest[100] ={"  "};
    
    if(!mysql_real_connect(&mysql,"127.0.0.1","root","111","db_books",0,NULL,0))
    {
        printf("\t 不能连接数据库!\n");
    }
    else
    {  
        printf("\t 请输入您想要查询的图书编号:");        
        scanf("%s",id);   /*输入图书编号*/
        sql = "select * from tb_book where id=";
        strcat(dest,sql);
        strcat(dest,id);    /*将图书编号追加到sql语句后面*/        
        
        if(mysql_query(&mysql,dest))
        {   //如果查询失败
            printf("\n 查询 tb_book 数据表失败!\n");
        }
        else
        {
            result=mysql_store_result(&mysql); //获得结果集
            if(mysql_num_rows(result)!=NULL)
            {  //有记录的情况,只有有记录取数据才有意义
                printf("\t ════════════════════════════ \n");
                printf("\t                          显示图书信息                      \n");
                printf("\t ════════════════════════════ \n");
                printf("\t图书编号       图书名         作者        出版社      \n");
                printf("\t -------------------------------------------------------- \n");
                while((row=mysql_fetch_row(result)))
                {   //取出结果集中记录
                    fprintf(stdout,"\t   %s             %s             %s          %s   \n",row[0],row[1],row[2],row[3]);  //输出这行记录
                }
                printf("\t ════════════════════════════ \n");                
            }
            else
            {
                printf("\t 没有发现要查询的信息!\n");
            }
            mysql_free_result(result);    //释放结果集
        }
        mysql_close(&mysql);          //释放连接
    }
    inquire();   /*询问是否显示主菜单*/
}
Example #4
0
void ShowAll()    /*调用显示所有图书数据的过程*/
{
    /*连接数据库*/
    if(!mysql_real_connect(&mysql,"127.0.0.1","root","111","db_books",0,NULL,0))
    { 
        printf("\n\t 不能连接数据库!\n");
    }
    else
    {
        /*数据库连接成功*/
        if(mysql_query(&mysql,"select * from tb_book"))
        {   //如果查询失败
            printf("\n\t 查询 tb_book 数据表失败!\n");
        }
        else
        {
            result=mysql_store_result(&mysql); //获得结果集
            if(mysql_num_rows(result)!=NULL)
            {  //有记录的情况,只有有记录取数据才有意义
                printf("\t ════════════════════════════ \n");
                printf("\t                 显 示 所 有 图 书 信 息                  \n");
                printf("\t ════════════════════════════ \n");
                printf("\t图书编号       图书名         作者        出版社      \n");
                printf("\t -------------------------------------------------------- \n");
                while((row=mysql_fetch_row(result)))
                {   //取出结果集中记录
                    fprintf(stdout,"\t   %s             %s             %s          %s   \n",row[0],row[1],row[2],row[3]);  //输出这行记录
                }
                printf("\t ════════════════════════════ \n");
            }
            else
            {
                printf("\n\t 没有记录信息 !\n");
            }
            mysql_free_result(result);    //释放结果集
        }
        mysql_close(&mysql);          //释放连接
    }
    inquire();   /*询问是否显示主菜单*/
}
Example #5
0
EinspurDynamikRealtime::~EinspurDynamikRealtime()
{
    if (coVRMSController::instance()->isMaster())
    {
        RT_TASK_INFO info;
        inquire(info);

        if (info.status & T_STARTED)
        {
            runTask = false;
            while (!taskFinished)
            {
                usleep(100000);
            }
        }

        delete steerWheel;
        delete steerCon;

        delete motPlat;
    }
}
void DeleteBook()
{
	char id[10];
	char *sql;
	char dest[100]={"       "};
	char dest1[100]={"       "};
	//only if the user is 'root' and password is right, you can access database
	if(!mysql_real_connect(&mysql,"127.0.0.1","root","1201","db_books",0,NULL,0))
	{
		printf("\n\t cannot connect database!\n");
	}
	else
	{
		printf("\t please input the id of the book you'd like to delete:\n");
		scanf("%s",id);
		sql="select * from tb_book where id=";
		strcat(dest,sql);
		strcat(dest,id);
		if(mysql_query(&mysql,dest))
		{
			printf("\n query tb_book failed!\n");
		}
		else
		{
			result=mysql_store_result(&mysql);
			if(mysql_num_rows(result)!='\0')
			{
				printf("\t find record information, show it?(y/n)\n");
				scanf("%s",ch);
				if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
				{

					printf("\t==============================================\n");
					printf("\t           Show Book's Information            \n");
					printf("\t==============================================\n");
					printf("\t  ID    Bookname       Author     Bookconcern \n");
					printf("\t==============================================\n");
					while(row=mysql_fetch_row(result))
					{
						fprintf(stdout,"\t  %s   %s      %s      %s      \n",row[0],row[1],row[2],row[3]);
					}
					printf("\t==============================================\n");
					printf("\tDelete?(y/n)\n");
					scanf("%s",ch);
					if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)
					{
						sql="delete from tb_book where ID= ";
						printf("%s",dest1);
						strcat(dest1,sql);
						strcat(dest1,id);
						printf("%s",dest1);
						if(mysql_query(&mysql,dest1)!=0)
							fprintf(stderr,"\t cannot delete record! Error: %s",mysql_error(&mysql));
						else
							printf("delete sucessfully\n");
					}
				}
			}
			else
				printf("No modifying info!\n");
		}
		mysql_free_result(result);
	}
	mysql_close(&mysql);
	inquire();
}
Example #7
0
/*
Triangles::BThBoundary(Edge e,Real 8) const 
{
  // pointeur of the background must be on 
  // 
  Edge be = e.on;
}
*/
int  Triangles::SplitElement(int choice)
{
  Direction NoDirOfSearch;
  const  int withBackground = &BTh != this && &BTh;
 if (verbosity>2) 
   cout << " -- SplitElement " << (choice? " Q->4Q and T->4T " : " Q->4Q or T->3Q " ) << endl;;
 if (verbosity>5)
   cout << endl << "    (in)  Nb of Quadrilaterals = " << NbOfQuad 
	<< " Nb Of Triangles = " << nbt-NbOutT- NbOfQuad*2 
	<< " Nb of outside triangles = " << NbOutT << endl;
 
 ReNumberingTheTriangleBySubDomain();
#ifdef DRAWING2 
  Draw();
 inquire();
#endif
 int nswap =0;
  const Int4 nfortria( choice ? 4 : 6);
    if(withBackground) 
    {
      BTh.SetVertexFieldOn();
      SetVertexFieldOnBTh();
    }
   else
     BTh.SetVertexFieldOn();
   
  Int4 newnbt=0,newnbv=0;
  Int4 * kedge = 0;
 Int4 newNbOfQuad=NbOfQuad;
  Int4 * ksplit= 0, * ksplitarray=0;
  Int4 kkk=0;
  int ret =0;
  if (nbvx<nbv+nbe) return 1;//   
  Triangles *  OCurrentTh= CurrentTh;
  CurrentTh = this;
  // 1) create  the new points by spliting the internal edges 
  // set the 
  Int4 nbvold = nbv;
  Int4 nbtold = nbt;
  Int4 NbOutTold  = NbOutT;
  Int4  NbEdgeOnGeom=0;
  Int4 i;
  
  nbt = nbt - NbOutT; // remove all the  the ouside triangles 
  Int4 nbtsave = nbt;
  Triangle * lastT = triangles + nbt;
  for (i=0;i<nbe;i++)
    if(edges[i].on) NbEdgeOnGeom++;
  Int4 newnbe=nbe+nbe;
  //  Int4 newNbVerticesOnGeomVertex=NbVerticesOnGeomVertex;
  Int4 newNbVerticesOnGeomEdge=NbVerticesOnGeomEdge+NbEdgeOnGeom;
  // Int4 newNbVertexOnBThVertex=NbVertexOnBThVertex;
  Int4 newNbVertexOnBThEdge=withBackground ? NbVertexOnBThEdge+NbEdgeOnGeom:0;

  // do allocation for pointeur to the geometry and background
  VertexOnGeom * newVerticesOnGeomEdge = new VertexOnGeom[newNbVerticesOnGeomEdge];
  VertexOnEdge *newVertexOnBThEdge = newNbVertexOnBThEdge ?  new VertexOnEdge[newNbVertexOnBThEdge]:0;
  if (NbVerticesOnGeomEdge)
    memcpy(newVerticesOnGeomEdge,VerticesOnGeomEdge,sizeof(VertexOnGeom)*NbVerticesOnGeomEdge);
  if (NbVertexOnBThEdge)
    memcpy(newVertexOnBThEdge,VertexOnBThEdge,sizeof(VertexOnEdge)*NbVertexOnBThEdge);
  Edge *newedges = new Edge [newnbe];
  //  memcpy(newedges,edges,sizeof(Edge)*nbe);
  SetOfEdges4 * edge4= new SetOfEdges4(nbe,nbv);
#ifdef DEBUG
  for (i=0;i<nbt;i++)
    triangles[i].check();
#endif
#ifdef DRAWING2  
  reffecran();
#endif  
  Int4 k=nbv;
  Int4 kk=0;
  Int4 kvb = NbVertexOnBThEdge;
  Int4 kvg = NbVerticesOnGeomEdge;
  Int4 ie =0;
  Edge ** edgesGtoB=0;
  if (withBackground)
   edgesGtoB= BTh.MakeGeometricalEdgeToEdge();
 Int4 kerr=0,ferr=0;
  for (i=0;i<nbe;i++)
     newedges[ie].on=0;

  for (i=0;i<nbe;i++)
    {
      GeometricalEdge *ong =  edges[i].on;

      newedges[ie]=edges[i];
      newedges[ie].adj[0]=newedges+(edges[i].adj[0]-edges) ;
      newedges[ie].adj[1]=newedges + ie +1;
      R2 A = edges[i][0],B = edges[i][1];
      // cout << " ie = " << ie <<"  v0 = " <<  Number(newedges[ie][0]) << endl;


      kk += (i == edge4->addtrie(Number(edges[i][0]),Number(edges[i][1])));
      if (ong) // a geometrical edges 
	{ 
	  if (withBackground)
	    {
	      // walk on back ground mesh 
	      //  newVertexOnBThEdge[ibe++] = VertexOnEdge(vertices[k],bedge,absicsseonBedge); 
	      // a faire -- difficile 
	      // the first PB is to now a background edge between the 2 vertices
	      assert(edgesGtoB); 
	      // cout << " ie = " << ie <<"  v0 = " <<  Number(newedges[ie][0]) << endl;
             ong= ProjectOnCurve(*edgesGtoB[Gh.Number(edges[i].on)],
			     edges[i][0],edges[i][1],0.5,vertices[k],
                             newVertexOnBThEdge[kvb],
                             newVerticesOnGeomEdge[kvg++]);
	     vertices[k].ReferenceNumber= edges[i].ref;
	     vertices[k].DirOfSearch =   NoDirOfSearch;        
;
	     // get the Info on background mesh 
	     Real8 s =        newVertexOnBThEdge[kvb];
	     Vertex &  bv0  = newVertexOnBThEdge[kvb][0];
	     Vertex &  bv1  = newVertexOnBThEdge[kvb][1];
	     // compute the metrix of the new points 
	     vertices[k].m =  Metric(1-s,bv0,s,bv1); 
	     kvb++;
	     // cout << " ie = " << ie <<"  v0 = " <<  Number(newedges[ie][0]) << endl;
	    }
	  else 
	    {
	      ong=Gh.ProjectOnCurve(edges[i],
				    0.5,vertices[k],newVerticesOnGeomEdge[kvg++]);
	      // vertices[k].i = toI2( vertices[k].r);
	      vertices[k].ReferenceNumber = edges[i].ref;
	      vertices[k].DirOfSearch = NoDirOfSearch;
	      vertices[k].m =  Metric(0.5,edges[i][0],0.5,edges[i][1]);	      
	    }  
	}
      else // straigth line edge ---
	{ 
	  vertices[k].r = ((R2) edges[i][0] + (R2)  edges[i][1] )*0.5;
	  vertices[k].m =  Metric(0.5,edges[i][0],0.5,edges[i][1]);
	  vertices[k].on = 0;
	}
      //vertices[k].i = toI2( vertices[k].r);
      R2 AB =  vertices[k].r;
      R2 AA = (A+AB)*0.5;
      R2 BB = (AB+B)*0.5;
      vertices[k].ReferenceNumber = edges[i].ref;
	    vertices[k].DirOfSearch = NoDirOfSearch;
	    
      newedges[ie].on = Gh.Contening(AA,ong);
      newedges[ie++].v[1]=vertices+k;

      newedges[ie]=edges[i];
      newedges[ie].adj[0]=newedges + ie -1;
      newedges[ie].adj[1]=newedges+(edges[i].adj[1]-edges) ;
      newedges[ie].on =  Gh.Contening(BB,ong);
      newedges[ie++].v[0]=vertices+k;
      // cout << " ie = " << ie-2 << " vm " << k << " v0 = " <<  Number(newedges[ie-2][0])
      //	   << " v1 = " << Number(newedges[ie-1][1])  
      //	   << " ong =" << ong-Gh.edges 
      //	   << " on 0 =" <<  newedges[ie-2].on -Gh.edges << AA
      //	   << " on 1 =" <<  newedges[ie-1].on -Gh.edges << BB 
      //	   << endl;
      k++;
    }
#ifdef DEBUG
  assert(kvb ==  newNbVertexOnBThEdge);
  // verif edge 
  { Vertex *v0 = vertices, *v1 = vertices+ k;
    for (Int4  i=0;i<ie;i++)
     {
       assert( &newedges[i][0] >= v0 &&  &newedges[i][0] < v1);
       assert( &newedges[i][1] >= v0 &&  &newedges[i][1] < v1);
     }
  }
#endif
  if (edgesGtoB) delete [] edgesGtoB;
  edgesGtoB=0;

  newnbv=k;
  newNbVerticesOnGeomEdge=kvg;
  if (newnbv> nbvx) goto Error;// bug 
    
  nbv = k;


  kedge = new Int4[3*nbt+1];
  ksplitarray = new Int4[nbt+1];
  ksplit = ksplitarray +1; // because ksplit[-1] == ksplitarray[0]
 
  for (i=0;i<3*nbt;i++)
    kedge[i]=-1;

  //  

 for (i=0;i<nbt;i++)
   {  

     Triangle & t = triangles[i];
     assert(t.link);
     for(int j=0;j<3;j++)
       {
	 const TriangleAdjacent ta = t.Adj(j);
	 const Triangle & tt = ta;
	 if (&tt >= lastT)
	   t.SetAdj2(j,0,0);// unset adj
	 const Vertex & v0 = t[VerticesOfTriangularEdge[j][0]];
	 const Vertex & v1 = t[VerticesOfTriangularEdge[j][1]];
	 Int4  ke =edge4->findtrie(Number(v0),Number(v1));
	 if (ke>0) 
	   {
	     Int4 ii = Number(tt);
	     int  jj = ta;
	     Int4 ks = ke + nbvold;
	     kedge[3*i+j] = ks;
	     if (ii<nbt) // good triangle
	       kedge[3*ii+jj] = ks;
	     Vertex &A=vertices[ks];
	     Real8 aa,bb,cc,dd;
	     if ((dd=Area2(v0.r,v1.r,A.r)) >=0)
	       { // warning PB roundoff error 
		 if (t.link && ( (aa=Area2( A.r    , t[1].r , t[2].r )) < 0.0 
				||   (bb=Area2( t[0].r , A.r    , t[2].r )) < 0.0  
				||   (cc=Area2( t[0].r , t[1].r , A.r    )) < 0.0))
		   ferr++, cerr << " Error : " <<  ke + nbvold << " not in triangle " 
				<< i << " In=" << !!t.link
				<< " " <<  aa  << " " << bb << " " << cc << " " << dd << endl;
		 
	       }
	     
	     else
	       {
		 if (tt.link && ( (aa=Area2( A.r     , tt[1].r , tt[2].r )) < 0 
				 ||   (bb=Area2( tt[0].r , A.r     , tt[2].r )) < 0 
				 ||   (cc=Area2( tt[0].r , tt[1].r , A.r     )) < 0)) 
		   ferr++, cerr << " Warning : " <<  ke + nbvold << " not in triangle " << ii 
				<< " In=" << !!tt.link 
				<< " " <<  aa  << " " << bb << " " << cc << " " << dd << endl;
				
	       } 
	     
	   }
       }
   }
  if(ferr)
    {
      cerr << " Number of triangles with P2 interpolation Probleme " << ferr << endl;;
      MeshError(9);
    }

  for (i=0;i<nbt;i++)
    {
      ksplit[i]=1; // no split by default
      const Triangle & t = triangles[ i];
      // cout << " Triangle " << i << " " << t  << !!t.link << ":: " ;
      int nbsplitedge =0;
      int nbinvisible =0;
      int invisibleedge=0;
      int kkk[3];      
      for (int j=0;j<3;j++)
	{
	  if (t.Hidden(j)) invisibleedge=j,nbinvisible++;
	  
	  const TriangleAdjacent ta = t.Adj(j);
	  const Triangle & tt = ta;

	  
	  const Vertex & v0 = t[VerticesOfTriangularEdge[j][0]];
	  const Vertex & v1 = t[VerticesOfTriangularEdge[j][1]];
	 //  cout << " ke = " << kedge[3*i+j]  << " " << Number(v0) << " " << Number(v1) << "/ ";
	  if ( kedge[3*i+j] < 0) 
	    {
	      Int4  ke =edge4->findtrie(Number(v0),Number(v1));
	      //  cout << ":" << ke << "," << !!t.link << " " <<  &tt ;
	      if (ke<0) // new 
		{
		  if (&tt) // internal triangles all the boundary 
		      { // new internal edges 
			Int4 ii = Number(tt);
			int  jj = ta;
	      
			kedge[3*i+j]=k;// save the vertex number 
			kedge[3*ii+jj]=k;
			if (k<nbvx) 
			  {
			    vertices[k].r = ((R2) v0+(R2) v1 )/2;
			    //vertices[k].i = toI2( vertices[k].r);
			    vertices[k].ReferenceNumber=0;
	        vertices[k].DirOfSearch =NoDirOfSearch;
			    vertices[k].m =  Metric(0.5,v0,0.5,v1);
			  }
			k++;
			kkk[nbsplitedge++]=j;		      
		    } // tt 
		  else
		    cerr <<endl <<  " Bug " <<i<< " " << j << " t=" << t << endl;
		  
		} // ke<0	       
	      else
		{ // ke >=0
		  kedge[3*i+j]=nbvold+ke;
		  kkk[nbsplitedge++]=j;// previously splited
		}
	    }
	  else 
	    kkk[nbsplitedge++]=j;// previously splited
	  
	} 
      assert (nbinvisible<2);
     // cout << " " <<  nbinvisible << " " <<  nbsplitedge << endl;
      switch (nbsplitedge) {
      case 0: ksplit[i]=10; newnbt++; break;   // nosplit
      case 1: ksplit[i]=20+kkk[0];newnbt += 2; break; // split in 2 
      case 2: ksplit[i]=30+3-kkk[0]-kkk[1];newnbt += 3; break; // split in 3 
      case 3:
	if (nbinvisible) ksplit[i]=40+invisibleedge,newnbt += 4;
	else   ksplit[i]=10*nfortria,newnbt+=nfortria;
	break;
      } 
    assert(ksplit[i]>=40);
    }
  //  now do the element split
  newNbOfQuad = 4*NbOfQuad;
  nbv = k;
#ifdef DRAWING2  
  inquire();
#endif  
//  cout << " Nbv = " << nbv << endl;
  kkk = nbt;
  ksplit[-1] = nbt;
  // look on  old true  triangles 

  for (i=0;i<nbtsave;i++)
    {
      //     cout << "Triangle " << i << " " << ksplit[i] << ":" << triangles[i]
      //	   << " ----------------------------------------------- " <<endl;
      Triangle * tc=0;
      int  nbmkadj=0;
      Int4 mkadj [100];
      mkadj[0]=i;
      Int4 kk=ksplit[i]/10;
      int  ke=(int) (ksplit[i]%10);
      assert(kk<7 && kk >0);
      
      // def the numbering   k (edge) i vertex 
      int k0 = ke;
      int k1 = NextEdge[k0];
      int k2 = PreviousEdge[k0];
      int i0 = OppositeVertex[k0];
      int i1 = OppositeVertex[k1];
      int i2 = OppositeVertex[k2];
       
       Triangle &t0=triangles[i];
       Vertex * v0=t0(i0);           
       Vertex * v1=t0(i1);           
       Vertex * v2=t0(i2);

       // cout << "nbmkadj " << nbmkadj << " it=" << i <<endl;
       assert(nbmkadj< 10);
       // --------------------------
       TriangleAdjacent ta0(t0.Adj(i0)),ta1(t0.Adj(i1)),ta2(t0.Adj(i2));
       // save the flag Hidden
       int hid[]={t0.Hidden(0),t0.Hidden(1),t0.Hidden(2)};
       // un set all adj -- save Hidden flag --
       t0.SetAdj2(0,0,hid[0]);
       t0.SetAdj2(1,0,hid[1]);
       t0.SetAdj2(2,0,hid[2]);
       // --  remake 
       switch  (kk) {
       case 1: break;// nothing 
       case 2: // 
	 {
	   Triangle &t1=triangles[kkk++];
	   t1=t0;
	   assert (kedge[3*i+i0]>=0);
	   Vertex * v3 = vertices + kedge[3*i+k0];
	   
	   t0(i2) = v3;
	   t1(i1) = v3;
	   t0.SetAllFlag(k2,0);
	   t1.SetAllFlag(k1,0);
	 } 
	 break; 
       case 3: //
	 {
	   Triangle &t1=triangles[kkk++];
            Triangle &t2=triangles[kkk++];
            t2=t1=t0;
            assert (kedge[3*i+k1]>=0);
            assert (kedge[3*i+k2]>=0);
            
            Vertex * v01 = vertices + kedge[3*i+k2];
            Vertex * v02 = vertices + kedge[3*i+k1]; 
            t0(i1) = v01; 
            t0(i2) = v02; 
            t1(i2) = v02;
            t1(i0) = v01; 
            t2(i0) = v02; 
	    t0.SetAllFlag(k0,0);
	    t1.SetAllFlag(k1,0);
	    t1.SetAllFlag(k0,0);
	    t2.SetAllFlag(k2,0);
	 } 
	 break;
       case 4: // 
       case 6: // split in 4 
	 {
	   Triangle &t1=triangles[kkk++];
	   Triangle &t2=triangles[kkk++];
	   Triangle &t3=triangles[kkk++];
	   t3=t2=t1=t0;
	   assert(kedge[3*i+k0] >=0 && kedge[3*i+k1] >=0 && kedge[3*i+k2] >=0);
	   Vertex * v12 = vertices + kedge[3*i+k0];
	   Vertex * v02 = vertices + kedge[3*i+k1]; 
	   Vertex * v01 = vertices + kedge[3*i+k2];
	   // cout << Number(t0(i0))  << " " << Number(t0(i1)) 
	   //     << " " <<  Number(t0(i2)) 
	   //     << " " <<  kedge[3*i+k0] 
	   //     << " " <<  kedge[3*i+k1] 
	   //     << " " <<  kedge[3*i+k2] << endl;
	   t0(i1) = v01;
	   t0(i2) = v02;
	   t0.SetAllFlag(k0,hid[k0]);

	   t1(i0) = v01;
	   t1(i2) = v12;
	   t0.SetAllFlag(k1,hid[k1]);
	   
	   t2(i0) = v02;
	   t2(i1) = v12;
	   t2.SetAllFlag(k2,hid[k2]);
	   
	   t3(i0) = v12;
	   t3(i1) = v02;
	   t3(i2) = v01;
	   	   
	   t3.SetAllFlag(0,hid[0]);	   
	   t3.SetAllFlag(1,hid[1]);	   
	   t3.SetAllFlag(2,hid[2]);

	   if ( kk == 6)
	     {
	       
	       Triangle &t4=triangles[kkk++];
	       Triangle &t5=triangles[kkk++];
	       
	       t4 = t3;
	       t5 = t3;

	       t0.SetHidden(k0);
	       t1.SetHidden(k1);
	       t2.SetHidden(k2);
	       t3.SetHidden(0);
	       t4.SetHidden(1);
	       t5.SetHidden(2);
	       
		if (nbv < nbvx ) 
		  {
		    vertices[nbv].r = ((R2) *v01 + (R2) *v12  + (R2) *v02 ) / 3.0;
		    vertices[nbv].ReferenceNumber =0;
	      vertices[nbv].DirOfSearch =NoDirOfSearch;
		    //vertices[nbv].i = toI2(vertices[nbv].r);
		    Real8 a3[]={1./3.,1./3.,1./3.};
		    vertices[nbv].m = Metric(a3,v0->m,v1->m,v2->m);
		    Vertex * vc =  vertices +nbv++;
		    t3(i0) = vc;
		    t4(i1) = vc;
		    t5(i2) = vc;

		  }
		else
		  goto Error; 
	     }
		    
	 } 
	 break;         
       }
 
       // cout << " -- " << i << " " << nbmkadj << " " << kkk << " " << tc << endl;
       //  t0.SetDetf();
       // save all the new triangles
       mkadj[nbmkadj++]=i;
       Int4 jj;
       if (t0.link) 
	 for (jj=nbt;jj<kkk;jj++)
	   {
	     triangles[jj].link=t0.link;
	     t0.link= triangles+jj;
	     mkadj[nbmkadj++]=jj;
	     // triangles[jj].SetDet();
	   }
       // cout << " -- " << i << " " << nbmkadj << endl;
       assert(nbmkadj<=13);// 13 = 6 + 4 + 3
  
       if (kk==6)  newNbOfQuad+=3;
	 //	 triangles[i].Draw();       

       for (jj=ksplit[i-1];jj<kkk;jj++)
	 // triangles[jj].SetDet();
       //	   triangles[jj].Draw();
	 


       nbt = kkk;
       ksplit[i]= nbt; // save last adresse of the new triangles
       kkk = nbt;
       
    }

//  cout << " nv = " << nbv << " nbt = " << nbt << endl;
  for (i=0;i<nbv;i++)
    vertices[i].m = vertices[i].m*2.;
  //
  if(withBackground)
    for (i=0;i<BTh.nbv;i++)
      BTh.vertices[i].m =  BTh.vertices[i].m*2.;
#ifdef DRAWING2
  Draw();
  inquire();
#endif
  
  
  ret = 2;
  if (nbt>= nbtx) goto Error; // bug 
  if (nbv>= nbvx) goto Error; // bug 
  // generation of the new triangles 

  SetIntCoor("In SplitElement"); 

  ReMakeTriangleContainingTheVertex();
  if(withBackground)
    BTh.ReMakeTriangleContainingTheVertex();

  delete [] edges;
  edges = newedges;
  nbe = newnbe;
  NbOfQuad = newNbOfQuad;

  for (i=0;i<NbSubDomains;i++)
    { 
      Int4 k = subdomains[i].edge- edges;
      subdomains[i].edge =  edges+2*k; // spilt all edge in 2 
    }
    
  if (ksplitarray) delete [] ksplitarray;
  if (kedge) delete [] kedge;
  if (edge4) delete edge4;
  if (VerticesOnGeomEdge) delete [] VerticesOnGeomEdge;
  VerticesOnGeomEdge= newVerticesOnGeomEdge;
  if(VertexOnBThEdge) delete []  VertexOnBThEdge;
  VertexOnBThEdge = newVertexOnBThEdge;
  NbVerticesOnGeomEdge = newNbVerticesOnGeomEdge;
  NbVertexOnBThEdge=newNbVertexOnBThEdge;
  //  ReMakeTriangleContainingTheVertex();

  FillHoleInMesh();

#ifdef DEBUG
  for (i=0;i<nbt;i++)
    triangles[i].check();
#endif
  
 if (verbosity>2)
   cout << "    (out) Nb of Quadrilaterals = " << NbOfQuad 
	<< " Nb Of Triangles = " << nbt-NbOutT- NbOfQuad*2 
	<< " Nb of outside triangles = " << NbOutT << endl;

 CurrentTh=OCurrentTh;
 return 0; //ok

 Error:
  nbv = nbvold;
  nbt = nbtold;
  NbOutT = NbOutTold;
  // cleaning memory ---
  delete newedges;
  if (ksplitarray) delete [] ksplitarray;
  if (kedge) delete [] kedge;
  if (newVerticesOnGeomEdge) delete [] newVerticesOnGeomEdge;
  if (edge4) delete edge4;
  if(newVertexOnBThEdge) delete []  newVertexOnBThEdge;
  

  CurrentTh= OCurrentTh;
  return ret; // ok 
}
Example #8
0
int main(int argc, char *argv[]){
	int procid = atoi(argv[2]);
	char *msg;
	char *recv_id;
	char *to;
	char msgSelected[255];
	int recvid = 0;
	char *recv_state;
	char *lamporttime;
	char *recv_msg;
	char send_msg[255];
	h = kh_init(16);
	void *context = zmq_ctx_new();
	void *publisher = zmq_socket(context, ZMQ_PUB);
	void *lamport_pub = zmq_socket(context, ZMQ_PUB);
	char routeraddr[30];
	int rc;
	int rc2;

	if(procid == 2){
		 rc = zmq_bind(publisher, "tcp://127.0.0.1:5555");
		 rc = zmq_bind(publisher, "tcp://127.0.0.1:5556");

		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5566");
		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5567");
		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5568");


	}

	if(procid == 3){
	 rc = zmq_bind(publisher, "tcp://127.0.0.1:5557");
	 rc = zmq_bind(publisher, "tcp://127.0.0.1:5558");

	 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5569");
	 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5570");
	 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5571");

	}

	if(procid == 4){
		 rc = zmq_bind(publisher, "tcp://127.0.0.1:5559");
		 rc = zmq_bind(publisher, "tcp://127.0.0.1:5560");

		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5572");
		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5573");
		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5574");

	}

	if(procid == 5){
		 rc = zmq_bind(publisher, "tcp://127.0.0.1:5561");
		 rc = zmq_bind(publisher, "tcp://127.0.0.1:5562");

		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5575");
		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5576");
		 rc2 = zmq_bind(lamport_pub, "tcp://127.0.0.1:5577");


	}
	assert(rc == 0);
	assert(rc2 == 0);

	void *subscriber = zmq_socket(context, ZMQ_SUB);
	void *lamport_sub = zmq_socket(context, ZMQ_SUB);
	char addr[30];
    char *filter = (argc > 1)? argv [1]: "10001 ";
    char *filter2 = (argc > 1)? argv[1]: "10001" ;
    rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, filter, strlen(filter));
    rc2 = zmq_setsockopt(lamport_sub, ZMQ_SUBSCRIBE, filter2, strlen(filter2));

    if(procid == 2){
     	 zmq_connect(subscriber, "tcp://127.0.0.1:5557");
      	 zmq_connect(subscriber, "tcp://127.0.0.1:5559");

      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5569");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5572");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5575");
    }

    if(procid == 3){
     	 zmq_connect(subscriber, "tcp://127.0.0.1:5555");
      	 zmq_connect(subscriber, "tcp://127.0.0.1:5561");

      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5566");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5573");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5576");

    }

    if(procid == 4){
     	 zmq_connect(subscriber, "tcp://127.0.0.1:5556");
      	 zmq_connect(subscriber, "tcp://127.0.0.1:5562");

      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5567");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5570");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5577");
    }

    if(procid == 5){
     	 zmq_connect(subscriber, "tcp://127.0.0.1:5560");
      	 zmq_connect(subscriber, "tcp://127.0.0.1:5558");

      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5568");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5571");
      	 zmq_connect(lamport_sub, "tcp://127.0.0.1:5574");
    }
    assert (rc == 0);

 int counter = 0;
 char *dummy;
 char *recv_lamport;
 char send_lamport[255];
 srand(time(NULL));

 while(1){
     recv_msg = s_recv_without_block(subscriber);
     recv_lamport = s_recv_without_block(lamport_sub);
     sleep(2);
     fprintf(stderr, "Received %s.\n", recv_msg);

     if(recv_lamport != NULL){
    	 myStamp = atoi(recv_lamport)+myStamp+1;
     }

     if(recv_msg != NULL){
      msg = strtok(recv_msg, ", ");
      dummy = msg;
      printf("Received %s \n", recv_msg);
      msg = strtok(NULL, ", ");
      lamporttime = msg;
      printf("lamporttime: %s \n", lamporttime);
      msg = strtok(NULL, ", ");
      recv_id = msg;
      printf("recv_id: %s \n", recv_id);
      msg = strtok(NULL, ", ");
      to = msg;
      printf("to: %s \n", to);
      msg = strtok(NULL, ".");
      recv_state = msg;
      printf("recv_state: %s \n", recv_state);

      if(strcmp(recv_state, " RELEASE") == 0 || strcmp(state, "RELEASED") == 0){
         sprintf(send_msg, "1, %s, %d, ", lamporttime, procid);
   	   strcat(send_msg, release(procid));
 			     printf ("\nPreparing to send data…\n");
 			     sleep(2);
 			     s_send(publisher, send_msg);
 	      printf("Data was send.\n");

       }

      if(strcmp(recv_state, " RELINGUISH") == 0 && atoi(to) == procid){
         sprintf(send_msg, "1, %s, %d, ", lamporttime, procid);
  	   strcat(send_msg, relinguished(procid));
	     printf ("\nPreparing to send data…\n");
	     sleep(2);
	  	     s_send(publisher, send_msg);
	     printf("Data was send.\n");
      }

      if(strcmp(recv_state, " LOCKED") == 0 && atoi(to) == procid ){
  	   votes++;
  	   if(votes == 3){
  		   state = "LOCKED";
  		   sprintf(send_msg, "1, %s, %d, all, ", lamporttime, procid);
  		   strcat(send_msg, enterCriticalPart(procid));

  		     printf ("\nPreparing to send data…\n");
  	  	     sleep(2);
  	  	  	     s_send(publisher, send_msg);
  	  	     printf("Data was send.\n");
  	   }

      }

      if(strcmp(recv_state, " REQUEST") == 0){
    	if(candidateLamport == 0){
         sprintf(send_msg, "1, %s, %d, %s, ", lamporttime, procid, recv_id);
    	}
    	else{
            sprintf(send_msg, "1, %d, %d, %s, ", candidateLamport, procid, recv_id);
    	}
  	   strcat(send_msg, request(procid, atoi(recv_id),
  		   atoi(lamporttime)));
	 	     printf ("\nPreparing to send data…\n");
	 	     sleep(2);
	 	     s_send(publisher, send_msg);
	     printf("Request was send.\n");
      }

      if(strcmp(recv_state, " INQUIRE") == 0 && atoi(to) == procid){
       sprintf(send_msg, "1, %s, %d, %s, ", lamporttime, procid, recv_id);
       char *inq = inquire(procid, atoi(recv_id), atoi(lamporttime) );
  	 strcat(send_msg, inq);
  	 if(strcmp(inq, "") == 0){
    	   votes++;
    	   if(votes == 3){
    		   state = "LOCKED";
    		   sprintf(send_msg, "1, %s, %d, all, ", lamporttime, procid);
    		   strcat(send_msg, enterCriticalPart(procid));
    		     printf ("\nPreparing to send data…\n");
    	  	     sleep(2);
    	  	  	     s_send(publisher, send_msg);
    	  	     printf("Data was send.\n");
    	   }
  	 }
  	 else{
	     printf ("\nPreparing to send data…\n");
	     sleep(2);
	     s_send(publisher, send_msg);
	     printf("Data was send.\n");
  	   }
      }
      if(strcmp(recv_state, " FAIL") == 0){
  	   voted--;
  	   state = "FAILED";
      }


     }
     fprintf(stderr, "%d\n", procid);
	   if(!selected && (rand()%20 == 0)){
		 voted = true;
		 votes++;
		 candidateLamport = myStamp;
		 candidateID = procid;
		 prepareEntry(procid);
		 int ret;
		 khiter_t k= kh_put(16, h, procid, &ret);
		 kh_value(h, k) = myStamp;
		 sprintf(send_lamport, "%i", myStamp);
		 sleep(2);
		 s_send(lamport_pub, send_lamport);
		 sprintf(send_msg, "1, %i, %i, all, ", myStamp, procid);
		 strcat(send_msg, "REQUEST.");
	     printf ("\nPreparing to send data…\n");
	     sleep(2);
         s_send(publisher, send_msg);
         printf("Data was send.\n");
	   }

  counter++;
 }
 return 0;

}
Example #9
0
void DeleteBook()   /*删除图书信息*/
{
    char id[10];   /*结果集中的行数*/
    char *sql;
    char dest[100] ={"  "};
    char dest1[100] ={"  "};
    if(!mysql_real_connect(&mysql,"127.0.0.1","root","111","db_books",0,NULL,0))
    {
        printf("\t 不能连接数据库!\n");
    }
    else
    {
        printf("\t 请输入您想要删除的图书编号. ");        
        scanf("%s",id);   /*输入图书编号*/
        sql = "select * from tb_book where id=";
        strcat(dest,sql);
        strcat(dest,id);    /*将图书编号追加到sql语句后面*/        
        //printf("%s\n",dest);
        
        /*查询该图书信息是否存在*/
        if(mysql_query(&mysql,dest))
        {   //如果查询失败
            printf("\n 查询 tb_book 数据表失败! \n");
        }
        else
        { 
            result=mysql_store_result(&mysql); //获得结果集
            if(mysql_num_rows(result)!=NULL)
            {  //有记录的情况,只有有记录取数据才有意义
                printf("\t 发现记录信息,是否显示?(y/n) ");
                scanf("%s",ch);
                if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要显示查找到的信息*/
                {
                    printf("\t ════════════════════════════ \n");
                    printf("\t               ***** 显示图书信息 *****                   \n");
                    printf("\t ════════════════════════════ \n");
                    printf("\t图书编号       图书名         作者        出版社      \n");
                    printf("\t -------------------------------------------------------- \n");
                    while((row=mysql_fetch_row(result)))
                    {   //取出结果集中记录
                        fprintf(stdout,"\t   %s             %s             %s          %s   \n",row[0],row[1],row[2],row[3]);  //输出这行记录
                    }
                    printf("\t ════════════════════════════ \n");
                }
                                    
                    printf("\t 是否删除?(y/n) ");
                    scanf("%s",ch);
                    if (strcmp(ch,"Y")==0||strcmp(ch,"y")==0)    /*判断是否需要录入*/
                    {
                        sql = "delete from tb_book where ID= ";
                        printf("%s",dest1);
                        strcat(dest1,sql);
                        strcat(dest1,id);
                       // printf("%s",dest1);
                        
                        if(mysql_query(&mysql,dest1)!=0)
                        {
                            fprintf(stderr,"\t 不能删除记录! \n",mysql_error(&mysql));
                        }
                        else
                        {
                            printf("\t 删除成功!\n");
                        }
                    }
            }
            else
            {
                printf("\t 没有发现要删除的信息!\n");
            }
        }
        mysql_free_result(result);    //释放结果集
    }
    mysql_close(&mysql);
    inquire();   /*询问是否显示主菜单*/
}
Example #10
0
void ModifyBook()   /*修改图书信息*/
{
    char id[10];   /*结果集中的行数*/
    char *sql;    
    char dest[500] ={"  "};
    char dest1[500] ={"  "};
    
    char *bookname;
    char *author;
    char *bookconcern;
    
    if (!mysql_real_connect(&mysql,"127.0.0.1","root","111","db_books",0,NULL,0))
    {
        printf("\t 不能连接数据库!\n");
    }
    else
    {
        /*数据库连接成功*/
        // printf("连接成功");
        printf("\t 请输入您想要修改的图书编号.");
        
        scanf("%s",id);   /*输入图书编号*/
        sql = "select * from tb_book where id=";
        strcat(dest,sql);
        strcat(dest,id);    /*将图书编号追加到sql语句后面*/
        
        //printf("%s\n",dest);
        
        /*查询该图书信息是否存在*/
        if(mysql_query(&mysql,dest))
        {   //如果查询失败
            printf("\n  查询 tb_book 数据表失败! \n");
        }
        else
        {
            result=mysql_store_result(&mysql); //获得结果集
            if(mysql_num_rows(result)!=NULL)
            {
                //有记录的情况,只有有记录取数据才有意义
                printf("\t 发现记录信息,是否显示?(y/n) ");
                scanf("%s",ch);
                if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要显示查找到的信息*/
                {
                    printf("\t ════════════════════════════ \n");
                    printf("\t               ***** 显示图书信息 *****                   \n");
                    printf("\t ════════════════════════════ \n");
                    printf("\t图书编号       图书名         作者        出版社      \n");
                    printf("\t -------------------------------------------------------- \n");
                    while((row=mysql_fetch_row(result)))
                    {   //取出结果集中记录
                        fprintf(stdout,"\t   %s             %s             %s          %s   \n",row[0],row[1],row[2],row[3]);  //输出这行记录
                    }
                    printf("\t ════════════════════════════ \n");
                }
                
                
                printf("\t Modify?(y/n)");
                scanf("%s",ch);
                if (strcmp(ch,"Y")==0||strcmp(ch,"y")==0)    /*判断是否需要录入*/
                {

 
                    sql = "update tb_book set bookname= '";
                    strcat(dest1,sql);
                    //   printf("%s",sql);
                    bookname = (char*)malloc(20);
                    author = (char*)malloc(20);
                    bookconcern = (char*)malloc(20);

                    printf("\t 图书名:");
                    scanf("%s",bookname);   /*输入图书名*/
                    
                    strcat(dest1,bookname); 
                    //  printf("%s",&bookname);

                    printf("\t 作者:");
                    scanf("%s",author);    /*输入作者*/
                    strcat(dest1,"', author= '");
                    strcat(dest1,author);    /*追加sql语句*/                        
                    
                    printf("\t 出版社:");
                    scanf("%s",bookconcern);    /*输入出版社*/
                    strcat(dest1,"', bookconcern = '");
                    strcat(dest1,bookconcern);    /*追加sql语句*/
                    
                    strcat(dest1,"' where id= ");
                    strcat(dest1,id);                        
                    
                    //printf("%s",dest1);

                    if(mysql_query(&mysql,dest1)!=0)
                    {   
                        fprintf(stderr,"\t 不能修改记录!\n",mysql_error(&mysql));                            
                    }
                    else
                    {
                        printf("\t 修改成功!\n");
                    }
                }
                
            }
            else
            {
                printf("\t 没有发现要修改的信息!\n");
            }
        }
        mysql_free_result(result);          //释放结果集
    }
    mysql_close(&mysql);     //释放连接
    inquire();   /*询问是否显示主菜单*/
}
Example #11
0
void AddBook()    /*添加图书信息*/
{
    int rowcount;   /*结果集中的行数*/
    
    char id[10];       /*编号*/
    char *bookname;
    char *author;
    char *bookconcern;
    
    char *sql;    
    char dest[500] ={"  "};    
    
    /*连接数据库*/
    if(!mysql_real_connect(&mysql,"127.0.0.1","root","111","db_books",0,NULL,0))
    { 
        printf("\n\t 不能连接数据库!\n");
    }
    else
    {
        /*数据库连接成功,插入数据*/   
        printf("\t ════════════════════════════ \n");
        printf("\t                     添 加 图 书 信 息                    \n");
        printf("\t ════════════════════════════ \n");
        if(mysql_query(&mysql,"select * from tb_book"))
        {   //如果查询失败
            printf("\n\t 查询 tb_book 数据表失败!\n");
        }
        else
        {
            result=mysql_store_result(&mysql); //获得结果集
            rowcount=mysql_num_rows(result) ;  //获得行数
            row=mysql_fetch_row(result);       //获取结果集的行  
            
            printf("\t 图书编号:");
            scanf("%s",id);   /*输入图书编号*/    
            
            sql="insert into tb_book (ID,bookname,author,bookconcern) values (";
            strcat(dest,sql);
            strcat(dest,"'");
            strcat(dest,id);
            strcat(dest,"', '");


            if(mysql_num_rows(result)!=NULL)
            {                
                /*判断输入的编号是否存在*/
                do
                {   //存在相同编号
                    if(!strcmp(id,row[0]))
                    {
                      //  printf("%s",row[0]);
                        printf("\n\t 记录存在,按任意键继续!\n");
                        getch();
                        mysql_free_result(result);   /*释放结果集*/ 
                        mysql_close(&mysql);         /*释放连接*/  
                        inquire();   /*询问是否显示主菜单*/
                        return;
                    }
                }while(row=mysql_fetch_row(result));  
            }
            
            bookname = (char*)malloc(50);
            author = (char*)malloc(50);
            bookconcern = (char*)malloc(50);

            
            //不存在相同的编号            
            printf("\t 图书名:");
            scanf("%s",bookname);   /*输入图书名*/
            strcat(dest,bookname);    /*将图书编号追加到sql语句后面*/
            
            printf("\t 作者:");
            scanf("%s",author);    /*输入作者*/
            strcat(dest,"', '");
            strcat(dest,author);
            
            printf("\t 出版社:");
            scanf("%s",bookconcern);    /*输入出版社*/
            strcat(dest,"', '");
            strcat(dest,bookconcern);
            strcat(dest,"')");
            //printf("%s",dest);
            
            if ( mysql_query(&mysql,dest)!=0)   
            {
                fprintf(stderr,"\t 不能插入记录!",mysql_error(&mysql));
            }
            else
            {
                printf("\t 插入成功!\n");                
            }
            mysql_free_result(result);    //释放结果集
        }
        mysql_close(&mysql);          //释放连接
    }
    inquire();   /*询问是否显示主菜单*/
}