歆沣 歆沣
关注数: 332 粉丝数: 78 发帖数: 409 关注贴吧数: 78
要改变对剩女的看法 本人现在22岁,男,软件开发专业大专生,现今大三,在公司实习。 经过深思熟虑,权衡各种利弊,最终决定逍遥一世,终身不娶。 我不认为高龄未嫁的女生应该被称为剩女,"剩女"这个词给人的意思,感觉是一心想把自己嫁出去,就是没人要,这实在是一种偏见。在这种偏见的压力下,可能有些女生就凑合着随便找一个人嫁了。 每个人都有自己的活法,就算年纪大一点,也应该努力追求自己想要的,按照自己的意愿去活。 无忧即乐.其一 作者:歆沣 官袍处处生寒气,帅印时时可累人。 寄意山中窥日月,寻幽水上度乾坤。 乘风驾鹤割云破,踏浪凌波斩月分。 若许从今随意梦,只手了却世间尘。 (淡观权势) 无忧即乐-其二 作者:歆沣 暮雨荒郊垂碧柳,春风古道立斜阳。 得失壁上观天静,荣辱池中会草香。 梦冷常餐风雨露,愁深独眺海河江。 樽前莫把功名论,醉饮千杯又何妨? (淡观荣辱得失) 无忧即乐-其三 作者:歆沣 卧雪燃薪尝冷暖,背笛舞带看直曲。 车压稚子身为径,水漫京城路作渠。 把盏离人笺上字,持竿钓客眼中鱼。 由来岁乱伤国步,何意桌前象马车? (淡观人间冷暖) 《无忧即乐.其四》 作者:歆沣 频寻燕子未及春,又见谁家扣冢门? 百日凭鐏花似酒,十年面壁影如人。 霜结始晓天无泪,梦破方知月有痕。 卧侧双形恩爱浅,池旁一木雪花深。 (淡观爱恨) 《无忧即乐-其五》 静倚危楼性自空,情疏笔墨意难穷。 缺伊院落花携雨,失水池塘柳带风。 闲著诗词优雅处,忙敲代码快然中。 天涯过客形相似,世上行人趣不同。
windows程序开发,从这里开始 #include<windows.h>#include //回调函数声明LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){WNDCLASS wndclass;//定义一个窗体类wndclass.style=CS_HREDRAW | CS_VREDRAW;// 窗口类型,水平重画和垂直重画wndclass.lpfnWndProc=WndProc;//定义窗口处理函数wndclass.cbClsExtra=0;//窗口类无扩展wndclass.cbWndExtra=0;//窗口实例无扩展wndclass.hInstance=hInstance;//当前实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口最小化图标为缺省图标wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//采用带箭头光标wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));//设置窗体背景为白色wndclass.lpszMenuName=NULL;//设置窗体无菜单wndclass.lpszClassName="傲世孤尘";//设置窗口类名/************************************************************************//* 注册窗口类,如果注册失败,则发出警告,并返回false*//************************************************************************/if(!RegisterClass(&wndclass)){MessageBeep(0);return false;}/*************************************************************************************************************************************************//* 创建窗口(窗口类名、窗口标题名、窗口的风格、窗口左上角坐标值、窗口的高和宽、父窗口、子菜单、创建此窗口的应用程序句柄、最后一个参数不使用(传NULL)*//**************************************************************************************************************************************************/HWND hwnd=CreateWindow(wndclass.lpszClassName,"我的第一个窗口",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);/************************************************************************//* 显示窗口 *//************************************************************************/ShowWindow(hwnd,nCmdShow);/************************************************************************//* 绘制用户区 *//************************************************************************/UpdateWindow(hwnd);/*HKEY hKey; if(ERROR_SUCCESS==RegDeleteKey(HKEY_CURRENT_USER,"Control Panel\\Desktop\\AutoEndTask")) { } RegCloseKey(hKey);*//************************************************************************//* 创建消息循环 *//************************************************************************/MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}//消息循环结束,将消息返回系统return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_CHAR:char szChar[20];sprintf(szChar,"char is %d",wParam);MessageBox(hwnd,szChar,"weixin",0);break;case WM_LBUTTONDOWN:MessageBox(hwnd,"mouse clicked","傲世孤尘",0);HDC hdc;hdc=GetDC(hwnd);TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));ReleaseDC(hwnd,hdc);break;case WM_PAINT:HDC hDC;PAINTSTRUCT ps;hDC=BeginPaint(hwnd,&ps);TextOut(hDC,0,0,"傲世孤尘",strlen("傲世孤尘"));char chHwnd[30];sprintf(chHwnd,"hwnd is: %d",hwnd);printf("%d\n",hwnd);TextOut(hDC,100,0,chHwnd,strlen(chHwnd));EndPaint(hwnd,&ps);break;case WM_CLOSE:if(IDYES==MessageBox(hwnd,"是否真的结束?","傲世孤尘",MB_YESNO)){DestroyWindow(hwnd);}break;case WM_DESTROY:PostQuitMessage(0);break;case WM_QUERYENDSESSION://MessageBox(hwnd,"未经本程序许可,你不能关机!","禁止关机",MB_OK|MB_SYSTEMMODAL); return 0;//此处返回0则不能关机,返回1就能关机。default:return DefWindowProc(hwnd,uMsg,wParam,lParam);}return 0;}
VB中使用WinSock控件编写网络程序 WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器并进行数据交换。这两种协议都能用来创建客户端和服务端应用程序。就像定时器控件一样,WinSock控件运行时没有一个可视的界面。  可能的用途  创建客户端应用程序,它能在信息到达中央服务器之前把用户的信息收集起来。  创建服务端应用程序,它能作为来自多个用户的数据一个集中处理点。  创建“聊天”程序。  协议的选择  当我们使用WinSock控件时,首先要确定的是使用TCP还是UDP协议。它们之间主要的区别在于连接状态:  TCP协议控件是一个基于连接的协议,就像电话机一样,用户必须在通话之前建立连接;  UDP是一个无连接的协议,两台计算机之间的事务处理就像传纸条一样:一台计算机向另一台计算机发送消息,但是它们之间并没有一个明确的连接路径。另外,发送的单个信息量的大小取决于网络。  通常,你要创建的应用程序的类别就决定了你要选择的协议。以下是几个能够帮助你选择合适的协议的问题:  当发送或接收数据时,该应用程序需要从服务端或客户端获得认证吗?如果要的话,那么TCP协议就正好需要在发送或接受数据前建立明确的连接。  要发送的数据量大吗?(就像图片、声音文件之类)一旦建立了连接,TCP协议就会保持连接并保证数据的完整性。但是,这种连接会占用的更多的处理器资源,成本也会更高一些。  数据是陆续传输的,还是一次全部传完呢?比如,如果你要创建的应用程序在某些任务完成时会告知具体的计算机,那么选择UDP协议会更合适一些。UDP协议也更适合于发送小量数据。  协议的配置  配置你的应用程序所用到的协议:在设计阶段,单击工具窗口里的协议,选择sckTCPProtocol或sckUDPProtocol。你也可以在代码里配置协议,就像下面这样:Winsock1.Protocol=sckTCPProtocol  确定你的计算机名  要连接到远程的计算机,你必须知道它的IP地址或别名。IP地址是一串用句点分隔的3位数字。通常,计算机的别名更容易让人记住。  按下面的步骤可以找到你的计算机名:  在“任务栏”里单击“开始”  在“设置”选项里单击“控制面板”;  双击“网络”图标;  单击“网络标识”  在“计算机名”中显示的就是你的计算机名。  一旦你找到你的计算名,它就可以作为远程主机的属性来用了。
TCP双人聊天的实现 /////////////////////服务端 package TCP;import java.awt.BorderLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket;import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.text.BadLocationException;public class Server1 extends JFrame implements Runnable{ private JTextArea jta=new JTextArea(); private JScrollPane jsp=new JScrollPane(jta); private JTextField jtf=new JTextField(); private Thread t; private boolean tb=true; private ServerSocket server; private Socket socket; private BufferedReader br; private BufferedWriter bw; public static void main(String[] args) { new Server1().setVisible(true); } public Server1(){ super("Server1"); this.setSize(400, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(jsp,BorderLayout.CENTER); this.add(jtf,BorderLayout.SOUTH); jta.setFocusable(false); t=new Thread(this); t.start(); jtf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER){ jta.append("我说:"+jtf.getText()+"\n"); try { bw.write(jtf.getText()+"\n"); bw.flush(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } jtf.setText(""); } } }); } public void run() { try { server=new ServerSocket(6666); socket=server.accept(); br=new BufferedReader(new InputStreamReader(socket.getInputStream())); bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); jta.append("连接成功\n"); while(tb){ jta.append("对方说:"+br.readLine()+"\n"); } bw.close(); br.close(); } catch (IOException e) { e.printStackTrace(); } } } /////////////////////////////客户端 package TCP;import java.awt.BorderLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket;import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField;public class Client1 extends JFrame implements Runnable{ private JTextArea jta=new JTextArea(); private JScrollPane jsp=new JScrollPane(jta); private JTextField jtf=new JTextField(); private Thread t; private boolean tb=true; private Socket socket; private BufferedReader br; private BufferedWriter bw; public static void main(String[] args) { new Client1().setVisible(true); } public Client1(){ super("Client1"); this.setSize(400, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(jsp,BorderLayout.CENTER); this.add(jtf,BorderLayout.SOUTH); jta.setFocusable(false); t=new Thread(this); t.start(); jtf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER){ jta.append("我说:"+jtf.getText()+"\n"); try { bw.write(jtf.getText()+"\n"); bw.flush(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } jtf.setText(""); } } }); } public void run() { try { socket=new Socket("127.0.0.1",6666); br=new BufferedReader(new InputStreamReader(socket.getInputStream())); bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); while(tb){ jta.append("对方说:"+br.readLine()+"\n"); } bw.close(); br.close(); } catch (IOException e) { e.printStackTrace(); } } } 傲世孤尘
UDP聊天的实现 /////////////////////////服务端,非严格意义上的服务端 package UDP;import java.awt.BorderLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException;import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField;public class Server1 extends JFrame implements Runnable{ private JTextArea jta=new JTextArea(); private JScrollPane jsp=new JScrollPane(jta); private JTextField jtf=new JTextField(); private Thread t; private boolean tb=true; private DatagramSocket ds; private DatagramPacket indp; private DatagramPacket outdp; public static void main(String[] args) { new Server1().setVisible(true); } public Server1(){ super("Server1"); this.setSize(400, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(jsp,BorderLayout.CENTER); this.add(jtf,BorderLayout.SOUTH); jta.setFocusable(false); t=new Thread(this); t.start(); jtf.addKeyListener(new KeyAdapter() { public void keyReleased (KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER){ try { byte[] buf=jtf.getText().getBytes(); outdp=new DatagramPacket(buf,buf.length, new InetSocketAddress("127.0.0.1", 8888)); ds.send(outdp); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } jta.append("我说:"+jtf.getText()+"\n"); jtf.setText(""); } } }); } public void run() { try { ds=new DatagramSocket(7777); byte[] buf=new byte[1024]; indp=new DatagramPacket(buf, buf.length); while(tb){ ds.receive(indp); jta.append("对方说:"+new String(buf,0,indp.getLength())+"\n"); } } catch (Exception e) { e.printStackTrace(); } } } //////////////////////////////////客户端 package UDP;import java.awt.BorderLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException;import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField;public class Client1 extends JFrame implements Runnable{ private JTextArea jta=new JTextArea(); private JScrollPane jsp=new JScrollPane(jta); private JTextField jtf=new JTextField(); private Thread t; private boolean tb=true; private DatagramSocket ds; private DatagramPacket indp; private DatagramPacket outdp; public static void main(String[] args) { new Client1().setVisible(true); } public Client1(){ super("Client1"); this.setSize(400, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(jsp,BorderLayout.CENTER); this.add(jtf,BorderLayout.SOUTH); jta.setFocusable(false); t=new Thread(this); t.start(); jtf.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER){ try { byte[] buf=jtf.getText().getBytes(); outdp=new DatagramPacket(buf,buf.length, new InetSocketAddress("127.0.0.1", 7777)); ds.send(outdp); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } jta.append("我说:"+jtf.getText()+"\n"); jtf.setText(""); } } }); } public void run() { try { ds=new DatagramSocket(8888); byte[] buf=new byte[1024]; indp=new DatagramPacket(buf, buf.length); while(tb){ ds.receive(indp); jta.append("对方说:"+new String(buf,0,indp.getLength())+"\n"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 傲世孤尘
回溯法求解-最小覆盖问题(最少的点控制所有的边,java) import java.awt.Point; import java.util.ArrayList; import java.util.List; import java.util.Scanner;/** * 先根据用户输入的邻接矩阵,求出对应的关联矩阵,然后应用回溯法解题 * @author Administrator * */ public class Test1_回溯法 { static int num;//点的个数 static int[][] array1;//邻接矩阵 static List<Point> line=new ArrayList<Point>();//存放每一条边,其中x和y分别代表一个顶点 static int[][] array2;//关联矩阵 static int min=Integer.MAX_VALUE;//最优解 static int[] x;//试探集合 static int[] mx;//最优集合 public static void main(String[] args) { //初始化数据 input(); //回溯法 method(0,0,new int[line.size()]); for(int i=0;i<num;i++){ for(int j=0;j<array2[0].length;j++){ System.out.print(array2[i][j]+" "); } System.out.println(); } //输出结果 System.out.println(min); for(int i=0;i<num;i++){ System.out.print(mx[i]+" "); } } /** * 回溯法 * @param nd当前处理的顶点 * @param vd当前已经选择的顶点数目 * @param pd保存当前已经控制了的边的情况 */ public static void method(int nd,int vd,int[] pd){ if(nd==num){ //如果至少有一条边没有被控制,则回到上一层 for(int i=0;i<pd.length;i++){ if(pd[i]!=1){ return; } } //更新最优解 if(vd<min){ min=vd; for(int i=0;i<mx.length;i++){ mx[i]=x[i]; } } }else{ x[nd]=0; method(nd+1,vd,pd); x[nd]=1; int[] temp=new int[line.size()]; for(int i=0;i<temp.length;i++){ if(pd[i]==1||array2[nd][i]==1){ temp[i]=1; } } method(nd+1,vd+1,temp); } } //数据初始化 public static void input(){ //接受用户输入,数组输入,感觉用nextLine()再分割有点麻烦,而且输入只涉及整数,应该不会有问题 Scanner in=new Scanner(System.in); num=in.nextInt(); x=new int[num]; mx=new int[num]; array1=new int[num][num]; for(int i=0;i<num;i++){ for(int j=0;j<num;j++){ array1[i][j]=in.nextInt(); if(j<i&&array1[i][j]==1){ line.add(new Point(i,j)); } } } //根据输入的邻接矩阵,求出其对应的关联矩阵 array2=new int[num][line.size()]; for(int i=0;i<line.size();i++){ Point p=line.get(i); array2[p.x][i]=1; array2[p.y][i]=1; } } } 测试数据: 输入: 5 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 输出: 3 0 1 0 1 1
运算符重载-c++ #include<iostream> #include<math.h> using namespace std; //复数类 class Complex{ private: double shi; double xu; public: Complex(double shi=0,double xu=0){ this->shi=shi; this->xu=xu; } void display();//输出复数 double getMod();//获取复数的模 operator int();//隐式转换 Complex operator +(Complex);//复数相加 Complex operator -(Complex);//复数相减 Complex operator *(Complex);//复数相乘 Complex operator /(Complex);//复数相除 void operator +=(Complex);//复数简加运算 void operator -=(Complex);//复数简减运算 void operator *=(Complex);//复数简乘运算 void operator /=(Complex);//复数简除运算 friend Complex operator +(double,Complex);// 实数加复数 friend Complex operator -(double,Complex);// 实数减复数 friend Complex operator *(double,Complex);// 实数乘复数 friend Complex operator /(double,Complex);// 实数除复数 friend ostream &operator <<(ostream&,Complex&);//流插入运算 friend istream &operator >>(istream&,Complex&);//流提取运算 //复数间比较大小,依据馍的大小 bool operator <(Complex); bool operator ==(Complex); bool operator >(Complex); bool operator !=(Complex); //比较两个复数的大小,大于返回正数,等于返回0,小于返回负数 double compareTo(Complex); //比较两个复数是否相等 bool equals(Complex); }; //输出复数 void Complex::display(){ if(shi){ cout<<shi; if(xu>0){ if(xu!=1)cout<<"+"<<xu<<"i"<<endl; else cout<<"+"<<"i"<<endl; } if(xu<0){ if(xu!=-1)cout<<xu<<"i"<<endl; else cout<<"-i"<<endl; } if(xu==0)cout<<endl; }else{ if(xu==0)cout<<shi<<endl; else if(xu!=1) cout<<xu<<"i"<<endl; else cout<<"i"<<endl; } } //隐式转换 Complex::operator int(){ return shi; } //获取复数的模 double Complex::getMod(){ return sqrt(shi*shi+xu*xu); } //复数相加 Complex Complex::operator+(Complex c){ return Complex(this->shi+c.shi,this->xu+c.xu); } //复数相减 Complex Complex::operator-(Complex c){ return Complex(this->shi-c.shi,this->xu-c.xu);; } //复数相乘 Complex Complex::operator*(Complex c){ return Complex(this->shi*c.shi-this->xu*c.xu,this->shi*c.xu+this->xu*c.shi); } //复数相除 Complex Complex::operator/(Complex c){ double fenmu=c.shi*c.shi+c.xu*c.xu; Complex c1((this->shi*c.shi+this->xu*c.xu)/fenmu,(this->xu*c.shi-this->shi*c.xu)/fenmu); return c1; }//复数简加 void Complex::operator+=(Complex c){ *this=*this+c; } //复数简减 void Complex::operator-=(Complex c){ *this=*this-c; } //复数简乘 void Complex::operator*=(Complex c){ *this=*this*c; } //复数简除 void Complex::operator/=(Complex c){ *this=*this/c; } //实数加复数 Complex operator +(double x,Complex c){ return Complex(x,0)+c; } //实数减复数 Complex operator -(double x,Complex c){ return Complex(x,0)-c; } //实数乘复数 Complex operator *(double x,Complex c){ return Complex(x,0)*c; } //实数除复数 Complex operator /(double x,Complex c){ return Complex(x,0)/c; }//流插入运算 ostream & operator <<(ostream &output,Complex &c){ if(c.shi){ output<<c.shi; if(c.xu>0){ if(c.xu!=1)output<<"+"<<c.xu<<"i"; else output<<"+"<<"i"; } if(c.xu<0){ if(c.xu!=-1)output<<c.xu<<"i"; else output<<"-i"; } if(c.xu==0)output<<endl; }else{ if(c.xu==0)output<<c.shi; else if(c.xu!=1) output<<c.xu<<"i"; else output<<"i"; } return output; } //流提取运算 istream & operator >>(istream &input,Complex &c){ input>>c.shi>>c.xu; return input; } //复数间比较大小,依据模 bool Complex::operator<(Complex c){ return getMod()<c.getMod(); } bool Complex::operator==(Complex c){ return getMod()==c.getMod(); } bool Complex::operator>(Complex c){ return getMod()>c.getMod(); } //比较两个复数是否不相等 bool Complex::operator!=(Complex c){ return getMod()!=c.getMod(); } //比较两个复数间的大小 double Complex::compareTo(Complex c){ return getMod()-c.getMod(); } //比较两个复数是否相等 bool Complex::equals(Complex c){ return *this==c; } int main(){ /* //输出复数 Complex c1(2,6),c2(12,-8),c3; cout<<"输出复数测试"<<endl; cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); cout<<endl; //测试复数间的运算 cout<<"测试复数间的运算" <<endl; cout<<"c1+c2="; c3=c1+c2; c3.display(); cout<<"c1-c2="; c3=c1-c2; c3.display(); cout<<"c1*c2="; c3=c1*c2; c3.display(); cout<<"c1/c2="; c3=c1/c2; c3.display(); cout<<endl; //测试实数与复数间的运算 cout<<"测试实数与复数间的运算"<<endl; cout<<"2+c1="; c3=2+c1; c3.display(); cout<<"c2+4="; c3=c2+4; c3.display(); cout<<"15-c1="; c3=15-c1; c3.display(); cout<<"c2-4="; c3=c2-4; c3.display(); cout<<"2*c1="; c3=2*c1; c3.display(); cout<<"c2*3="; c3=c2*3; c3.display(); cout<<"8/c1="; c3=8/c1; c3.display(); cout<<"c2/5="; c3=c2/5; c3.display(); cout<<endl; //测试复数的流运算 cout<<"测试复数的流运算"<<endl; cin>>c3; cout<<c3<<endl; c3=c1+1.5; cout<<c3<<endl; //测试复数的模运算 Complex c4(3,4); cout<<c4<<":"<<c4.getMod()<<endl; Complex c5(3,4),c6(2,9); cout<<c5<<":"<<c5.getMod()<<endl; cout<<c6<<":"<<c6.getMod()<<endl; cout<<endl; cout<<"测试小于号:"<<endl; cout<<"c5<c6:"<<(c5<c6)<<endl; cout<<"c6<c5:"<<(c6<c5)<<endl; cout<<endl; cout<<"测试等于号:"<<endl; cout<<"c5==c6:"<<(c5==c6)<<endl; cout<<"c6==c5:"<<(c6==c5)<<endl; cout<<endl; cout<<"测试大于号:"<<endl; cout<<"c5>c6:"<<(c5>c6)<<endl; cout<<"c6>c5:"<<(c6>c5)<<endl; cout<<endl; //测试compareTo方法 cout<<"测试compareTo方法:"<<endl; Complex c7(5,8),c8(4,9); cout<<c7<<":"<<c7.getMod()<<endl; cout<<c8<<":"<<c8.getMod()<<endl; cout<<"c7.compareTo(c8):"<<c7.compareTo(c8)<<endl; cout<<"c8.compareTo(c7):"<<c8.compareTo(c7)<<endl; cout<<endl; //测试equals方法 Complex c9(2,3),c10(3,4),c11(3,4); cout<<"测试equals方法"<<endl; cout<<c9<<":"<<c9.getMod()<<endl; cout<<c10<<":"<<c10.getMod()<<endl; cout<<c11<<":"<<c11.getMod()<<endl; cout<<"c9.equals(c10):"<<c9.equals(c10)<<endl; cout<<"c10.equals(c11):"<<c10.equals(c11)<<endl; cout<<endl; //测试简加运算符 Complex c12(1,2); cout<<"测试简加运算符"<<endl; cout<<c12<<endl; c12+=Complex(2,3); cout<<c12<<endl; c12+=3; cout<<c12<<endl; cout<<endl; //测试复数简减运算符 Complex c13(10,12); cout<<"测试简减运算符"<<endl; cout<<c13<<endl; c13-=Complex(2,4); cout<<c13<<endl; c13-=6; cout<<c13<<endl; cout<<endl; //测试复数的简乘运算符 Complex c14(1,2); cout<<"测试简乘运算符"<<endl; cout<<c14<<endl; c14*=Complex(1,-1); cout<<c14<<endl; c14*=2; cout<<c14<<endl; cout<<endl; //测试复数的简除运算符 Complex c15(6,8); cout<<"测试复数的简除运算符"<<endl; cout<<c15<<endl; c15/=2; cout<<c15<<endl; c15/=Complex(2,3); cout<<c15<<endl; cout<<endl; //测试隐式转换 int a=(int)Complex(1,2); cout<<"测试隐式转换"<<endl; cout<<a<<endl; cout<<endl; //测试不等于 Complex c16(2,3),c17(4,7); cout<<c16<<endl; cout<<c17<<endl; cout<<(c16!=c17)<<endl; cout<<endl; */ } 傲世孤尘 最后于2013-05-29 更新
汉诺塔问题非递归算法-C /* 网上看到别人发的关于汉诺塔问题非递归算法,每次都看得有点晕,今天又看了一次,终于明白了其实现原理 传统的递归方法效率极其低下,时间和空间复杂度均呈几何级数增长,当问题规模达到20时,计算时间很漫长,更不用谈30以后的了, 所以,寻找一种非递归方法就很有必要了。 下面是笔者刚刚完成的c++算法 */ #include<iostream> #include<math.h> using namespace std; char pan[3]={'A','B','C'};//三根柱子 int zhuzi[3];//三根柱子的状态 int num;//盘子数 int bu;//总步数 //接受用户输入,并初始化数据 void input(){ cout<<"请输入盘子的个数:"; cin>>num; bu=zhuzi[0]=(int)pow(2,num)-1; if(num%2==1){ pan[1]='C'; pan[2]='B'; } }//输出结果 void output(char x,char y){ cout<<x<<"--->"<<y<<" "; }//移动盘子 void move(bool x){ //x=1则将第一个盘子移动到下一根柱子上,否则把另外两根柱子上可以移动的圆盘移动到新的柱子上。 //先计算出第一个盘子的位置 int one; int m,n,t,a,b; for(int i=0;i<3;i++){ if(zhuzi[i]%2==1){ one=i; break; } } if(x){ if(one!=2){ zhuzi[one+1]+=1; output(pan[one],pan[one+1]); }else{ zhuzi[0]+=1; output(pan[one],pan[0]); } zhuzi[one]-=1; }else{ switch(one){ case 0: a=zhuzi[1]; b=zhuzi[2]; t=0; while(1){ a/=2; b/=2; t++; if(a%2==1){ m=1; break; } if(b%2==1){ m=2; break; } } n=(int)pow(2,t); zhuzi[m]-=n; zhuzi[3-m]+=n; output(pan[m],pan[3-m]); break; case 1: a=zhuzi[0]; b=zhuzi[2]; t=0; while(1){ a/=2; b/=2; t++; if(a%2==1){ m=0; break; } if(b%2==1){ m=2; break; } } n=(int)pow(2,t); zhuzi[m]-=n; zhuzi[2-m]+=n; output(pan[m],pan[2-m]); break; case 2: a=zhuzi[0]; b=zhuzi[1]; t=0; while(1){ a/=2; b/=2; t++; if(a%2==1){ m=0; break; } if(b%2==1){ m=1; break; } } n=(int)pow(2,t); zhuzi[m]-=n; zhuzi[1-m]+=n; output(pan[m],pan[1-m]); break; } } }void fun(){ int t=0; while(1){ if(t<bu){ move(1); t++; }else{ break; } if(t<bu){ move(0); t++; }else{ break; } } cout<<endl; } int main(){ input(); fun(); }/* 理论上这种算法的时间效率相对于传统算法会大幅度提升,然而运行上面的程序,会发现并非如此,? 为什么呢?本程序中有大量的算术运算,这个是制约本程序时间效率的主要因素 ,如何减少运算时间,是接下来需要解决的问题。 解决了这个问题,才真正可以说它的时间效率比传统算法高很多 */ 傲世孤尘 2013-05-25
01背包问题--回溯法(递归形式)--动态规划-c语言 //回溯法-递归形式-01背包-c++语言 #include<iostream> using namespace std;#define MAX_SIZE 100int mv;//背包最大容量 int mp=-1; //背包最大价值 int mx[MAX_SIZE];//背包取得最大价值的物品集合 int x[MAX_SIZE];//试探集合 int size;//物品数量 int w[MAX_SIZE];//物品重量 int p[MAX_SIZE];//物品价值 void input(){ cout<<"请输入背包的容量:"; cin>>mv; cout<<"请输入物品的数量:"; cin>>size; cout<<"请分别输入各物品的重量和价值:"<<endl; for(int i=0;i<size;i++) cin>>w[i]>>p[i]; }void output(){ if(mp==-1)cout<<"无解!"<<endl; else{ cout<<"背包的最大价值为:"<<mp<<endl; cout<<"达到最大价值时背包的物品集合为:"<<endl; for(int i=0;i<size;i++) cout<<mx[i]<<" "; cout<<endl; } }//nd:当前处理的物品,pd:当前已获得的价值,vd:当前的已使用的容量 void advance(int nd,int pd,int vd){ if(nd==size){ if(pd>mp){ mp=pd; for(int i=0;i<size;i++)mx[i]=x[i]; } }else{ for(int i=0;i<=1;i++){ x[nd]=i; if(vd+x[nd]*w[nd]<=mv){ advance(nd+1,pd+x[nd]*p[nd],vd+x[nd]*w[nd]); } } } }int main(){ input(); advance(0,0,0); output(); }/* 这个问题的解空间是一棵完全二叉树,算法的时间复杂度为:O(2^n) */ /* 近期看到动态规划,终于稍有眉目,现就01背包问题进行分析,并贴出c语言源码 。设第n件物品的重量为:w(n),价值为:p(n). 用d(n,v)来表示前n件物品放入容量为v的背包中所能获得的最大价值, 显然,如果我们知道前n-1件物品放入容量为v-c(n)的背包中所能获得的最大价值, 那么:d(n,v)=max{d(n-1,v),p(n)+d(n-1,v-c(n))} 第n件物品放还是不放,取决于它的前一个字问题的解,这是一个多阶段决策过程, 各个子问题都是相对于当前状态的最优解,整个问题的最优解是由各个子问题的最优解 构成,所以01背包问题满足最优性原理,满足最优性原理的问题可以用动态规划来完成, 将各个子问题的最优解填到一张表中,避免了大量重复的计算,最终问题只需通过查表 进行少量的运算即可得到解决,其时间效率大幅度提升,虽然其时间效率是以牺牲空间效率 为代价,但对于大部分问题而言,我们关注的更多的是时间效率。 */ #include<iostream> using namespace std;#define MAX_SIZE 500int mv;//背包最大容量 int mp=-1; //背包最大价值 int mx[MAX_SIZE];//背包取得最大价值的物品集合 int size;//物品数量 int w[MAX_SIZE];//物品重量 int p[MAX_SIZE];//物品价值 int k[MAX_SIZE][MAX_SIZE];//前i件物品放入容量为j的背包所能取得的最大价值void input(){ cout<<"请输入背包的容量:"; cin>>mv; cout<<"请输入物品的数量:"; cin>>size; cout<<"请分别输入各物品的重量和价值:"<<endl; for(int i=0;i<size;i++) cin>>w[i]>>p[i]; }void output(){ if(mp==-1)cout<<"无解!"<<endl; else{ cout<<"背包的最大价值为:"<<mp<<endl; cout<<"达到最大价值时背包的物品集合为:"<<endl; for(int i=0;i<size;i++) cout<<mx[i]<<" "; cout<<endl; } }int max(int x,int y){ return (x>y)?x:y; }//填表 void fun(){ for(int i=1;i<=size;i++){ for(int j=1;j<=mv;j++){ if(j<w[i-1]){ k[i][j]=k[i-1][j]; }else{ k[i][j]=max(k[i-1][j],p[i-1]+k[i-1][j-w[i-1]]); } } } mp=k[size][mv]; int t=mv; for(int i=size;i>0;i--){ if(k[i][t]>k[i-1][t]){ mx[i-1]=1; t-=w[i-1]; } } }int main(){ input(); fun(); output(); } 傲世孤尘 2013-05-24
c语言练习之路(素数筛选) #include<stdio.h> #include<math.h> void main() { void yhsr(long *x,long *y),sssx(long x,long y); long a,b; long *a1=&a, *b1=&b; for(;;) { yhsr(a1,b1); sssx(a,b); } } void yhsr(long *x,long *y)//接受用户输入 { lon***; printf("求a与b之间的所有素数,请分别输入a、b (a、b均为正整数,且a<=b)\na="); scanf("%ld",&c); printf("b="); scanf("%ld",&d); *x=c; *y=d; } void sssx(long x,long y)//1.4优化算法 { void sssxzcx1(long * x,long y,long z,long * k),sssxzcx2(long * x,long y,long z,long * k); long sushu[95]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499}; long * shuzu=sushu;//shuzu=&sushu[0] long geshu=0,* k=&geshu; if(x<=500) { if(y<=500) { //直接输出结果 sssxzcx1(shuzu,x,y,k); } else { //输出部分结果,计算部分结果 sssxzcx1(shuzu,x,sushu[94],k); sssxzcx2(shuzu,sushu[94]+2,y,k); } } else { //计算全部结果 sssxzcx2(shuzu,x,y,k); } printf("\n共计%ld个。\n\n",geshu); } void sssxzcx1(long * x,long y,long z,long * k)//素数筛选1.4的子程序1,直接输出 { long i,a,b,* dizhi=x; for(i=0;i<=94;i++,x++) { if(*x>=y) { a=i; break; } } x=dizhi+94; for(i=94;i>=0;i--,x--) { if(*x<=z) { b=i; break; } } x=dizhi; for(i=a;i<=b;i++) { printf("%16ld",*(x+i)); ++(*k); } } void sssxzcx2(long * x,long y,long z,long * k){ long i,j,a,b,c,* dizhi=x; //将边界值奇化 if(y%2==0) { a=y+1; } else { a=y; } if(z%2==0) { b=z-1; } else { b=z; } for(i=a;i<=b;i=i+2) { if((long)(sqrt(i))%2==0) { c=(long)(sqrt(i))-1; } else { c=(long)(sqrt(i)); } if(c<=*(dizhi+94)) { x=dizhi; for(j=*(++x);j<=c;j=*(++x)) { if(i%j==0) break; } } else { x=dizhi; for(j=*(++x);j<=*(dizhi+94);j=*(++x)) { if(i%j==0) break; } if(i%j!=0) { for(j=*(dizhi+94)+2;j<=c;j=j+2) { if(i%j==0) break; } } } if(i%j!=0) { printf("%16ld",i); ++(*k); } } } (c语言交流群:251975693,欢迎所有学习c语言的同道们的加入,有了你们,我们更加精彩!)
1 下一页