當前位置:首頁 » 操作系統 » vb經典演算法

vb經典演算法

發布時間: 2023-09-06 16:01:22

『壹』 怎樣用vb實現約瑟夫環演算法

用面向過程的編程方式(C),對某個給定的n=8與m=3,給出被淘汰出列的旅客編號,以及最終的倖存者。
用面向對象的編程風格(C++),重新處理該約瑟夫問題。
談談這兩種編程風格的優點。
二、用C語言解約瑟夫問題
1、單鏈表的創建與輸出
#include<stdio.h>
#include<malloc.h>
#define NULL 0
struct node{ /*定義結構體*/
int data;
struct node *next;
};
typedef struct node NODE;/*將該結構體設置成自定義類型*/
NODE *head;/*定義一個指向該結構體的頭指針*/
NODE *create(int n)/*創建具有n個結點的單鏈表*/
{
NODE *p;
int i=1;
head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
while(i<=n)
{
p=(NODE *)malloc(sizeof(NODE));
p->data=n+1-i;
p->next=head->next;
head->next=p;
i++;
}
return(head);
}
void output(NODE *point)/*輸出該鏈表數據域內的值*/
{
NODE *p;
p=point->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
如果我們寫一段main()函數
void main()
{
head=create(8);
output(head);
}
便可以完成創建和輸出單鏈表的工作。
如果將上述創建單鏈表與輸出單鏈表的工作保存為頭文件link1.h,那麼在今後需要創建輸出類似的單鏈表時,只需寫以下主函數即可。
#inlucde 「link1.h」
void main()
{
head=create(8);
output(head);
}
2、循環單向鏈表的創建與輸出
明白了帶頭指針的單向鏈表的創建與輸出,只需作簡單修改便可處理循環單向鏈表的相關問題。這里我們建立一個新的頭文件link2.h,它包含以下幾段代碼。
#include<stdio.h>
#include<malloc.h>
struct node{
int data;
struct node *next;
};
typedef struct node NODE;
NODE *head;
NODE *create(int n)
{
NODE *p;
int i=1;
p=head=(NODE *)malloc(sizeof(NODE));
head->next=head;/*造循環鏈表時頭指針的指針域設置*/
while(i<=n)
{
p->data=n+1-i;
p->next=head->next;
head->next=p;
i++;
p=(NODE *)malloc(sizeof(NODE));
}
return(head);
}
void output(NODE *point,int n) /*n表示欲輸出多少個結點,由於該鏈表是循環的,可輸出無窮項*/
{
NODE *p;
int i=1;
p=point->next;
while(i<=n)
{
printf("%d ",p->data);
p=p->next;
i++;
}
printf("\n");
}
3、在循環鏈表中刪除結點並輸出被刪結點的相關信息
在頭文件link2.h中增添新函數del(int n,int m),這里的形參n代表起始結點,m代表報數值。
void del(int n,int m)
{
int i;
NODE *p,*q;
p=head;
/*將指針移到起始結點,即第n個結點*/
i=0;
while(i<n)
{
p=p->next;
i++;
}
/*刪除滿足報數值的結點*/
while(p->next!=p)
{
i=1;
while(i<m)/*找到符合報數值結點的前一個結點,即第m-1個結點*/
{
p=p->next;
i++;
}
/*先輸出,後刪除*/
q=p->next;
printf("%d ",q->data);
p->next=q->next;
free(q);
}
printf("\nonly one %d",p->data);/*輸出僅剩的結點*/
}
4、解決約瑟夫問題的主函數
#include <link2.h>
void main()
{
/*number結點個數,item輸出結點的個數,location報數的起始位置,callnum報數值*/
int number,item,location,callnum;
printf("\ninput nose number=");
scanf("%d",&number);
printf("\noutput item=");
scanf("%d",&item);
head=create(number);
output(head,item);
printf("\ninput location=");
scanf("%d",&location);
printf("\ninput callnum=");
scanf("%d",&callnum);
del(location,callnum);
}
三、以類作為結點來處理約瑟夫問題(准C++編程風格)
1、以類作結點的鏈表建立
#include <iostream.h>
class Node
{
private:
int data;
Node *next;
public:
Node(){data=0;next=NULL;}
void SetData(int new_data){data=new_data;}
void SetNext(Node *new_next){next=new_next;}
int GetData(){return data;}
Node *GetNext(){return next;}
};
void main()
{
Node *head=NULL,*p,*q;
for(int i=1;i<9;i++)
{
p=new Node;
p->SetData(i);
if(head==NULL)
head=p;
else
q->SetNext(p);
q=p;
}
q=head;
do
{
cout<<"該遊客編號為:"<<q->GetData()<<endl;
q=q->GetNext();
}while(q!=NULL);
q=head;
do
{
q=q->GetNext();
delete head;
head=q;
}while(q!=NULL);
}
2、以類作結點的循環鏈表的建立
#include <iostream.h>
class Node
{
private:
int data;
Node *next;
public:
Node(){data=0;next=NULL;}
void SetData(int new_data){data=new_data;}
void SetNext(Node *new_next){next=new_next;}
int GetData(){return data;}
Node *GetNext(){return next;}
};
void main()
{
Node *head,*p,*q;
head=new Node;
q=p=head;
for(int i=1;i<=8;i++)
{
p->SetData(i);
p->SetNext(head);
q->SetNext(p);
q=p;
p=new Node;
}
q=head;
i=1;
do
{
cout<<"該遊客編號為:"<<q->GetData()<<endl;
q=q->GetNext();
i++;
}while(i<=10);
}
3、解決約瑟夫問題
#include <iostream.h>
class Node
{
private:
int data;
Node *next;
public:
Node(){data=0;next=NULL;}
void SetData(int new_data){data=new_data;}
void SetNext(Node *new_next){next=new_next;}
int GetData(){return data;}
Node *GetNext(){return next;}
};
void main()
{
Node *head,*p,*q;
head=new Node;
q=p=head;
for(int i=1;i<=8;i++)
{
p->SetData(i);
p->SetNext(head);
q->SetNext(p);
q=p;
p=new Node;
}//
p=head;
i=1;
while(i<=8)
{
cout<<p->GetData()<<" "<<endl;
p=p->GetNext();
i++;
}//輸出
cout<<endl;
p=head;
while(p->GetNext()!=p)
{
i=1;
while(i<2)
{
p=p->GetNext();//將欲刪除點的前一個結點
i++;
}
q=p->GetNext();
cout<<q->GetData()<<endl;//刪除循環鏈表上的結點
p->SetNext(q->GetNext());//將q指針域所指結點的地址賦給p的指針域
p=p->GetNext();
delete q;
}//做循環數數出局游戲
cout<<"\nLast One "<<p->GetData()<<endl;
}
四、用標準的面向對象編程風格處理約瑟夫問題(C++編程風格)
//#include "stdafx.h"
#include "iostream.h"
//#define NULL 0
class Node
{
private:
int data;
Node *next;
public:
Node(){data=0;next=NULL;}
Node *Create(int n);//創建含n個結點的循環鏈表
void Output(Node *p,int n);//輸出循環鏈表頭結點為p的後n個結點的信息
Node *Move(Node *p,int n);//將頭結點指針前移到n
//從頭結點為p的循環鏈開始,所用的計數為n進行約瑟夫實驗
void Josephus(Node *p,int n);
};
Node *Node::Create(int n)
{
Node *head,*p,*q;
head=new Node;
q=p=head;
for(int i=1;i<=n;i++)
{
p->data=i;
p->next=head;
q->next=p;
q=p;
p=new Node;
}
return head;
};
void Node::Output(Node *p,int n)
{
int i=1;
while(i<=n)
{
cout<<p->data<<" ";
p=p->next;
i++;
}
};
Node *Node::Move(Node *p,int n)
{
if(n>1)
{
int i=1;
while(i<n)
{
p=p->next;
i++;
}
}
return p;
};
void Node::Josephus(Node *p,int n)
{
Node *q;
while(p->next!=p)
{
p=Move(p,n-1);
q=p->next;
cout<<q->data<<" ";
p->next=q->next;
p=p->next;
delete q;
}
cout<<"\nLast One "<<p->data<<endl;
};
void main()
{ Node A,*head;
head=A.Create(8);
cout<<"\nCirclist is ";
A.Output(head,10);
head=A.Move(head,1);
cout<<"\nJosephus result is "<<endl;
A.Josephus(head,3);
}
五、對兩種編程風格的評述
在進行面向過程的程序設計時,一般首先考慮程序所要實現的功能,然後設計為實現這些功能所必須採取的步驟,這些步驟就是過程。如果一個過程比較復雜而不能直接使用已有的抽象進行實現,則對這個過程進行分解,使分解之後的每一步(更低級的過程)能夠直接對應著一條語句。通過將分解之後的一系列過程封裝在一個函數抽象中,程序員在特定的時刻只關心有限的細節,這個新的函數抽象比其較低級的抽象更接近問題求解的過程,因而,能夠很好地映射問題求解中的過程。如果這個過程出現在許多問題求解中,那麼,這個函數抽象就可能被重復利用。
函數是面向過程程序設計的基礎,按照結構化程序設計的思想,又可將完成某一復雜工作的函數放在一個頭文件,便於我們多次復用。
面向過程的程序設計方法與面向對象的程序設計方法的根本區別在於對待數據和函數的關繫上。
在面向過程的程序設計中,數據只被看作是一種靜態的結構,它只有等待調用函數來對它進行處理。
在面向對象的程序設計中,將數據和對該數據進行合法操作的函數封裝在一起作為一個類的定義。另外,封裝還提供了一種對數據訪問嚴格控制的機制。因此,數據將被隱藏在封裝體中,該封裝體通過操作介面與外界交換信息。
面向對象的思想需要在實踐中不斷摸索和體會,在以後的程序設計中,可主動運用這種思想去實踐。

『貳』 VB選擇法排序

PrivateSub Command1_Click()

Dim a(1 To 10) As Integer

For i = 1 To 10

a(i) = Int(Rnd * 10)

Print a(i);

Next i

Print

'以上十隨機得出10個數

For i = 1 To 9 '這里開始是雙重循環

For j = i + 1 To 10

If a(i) > a(j) Then '如果前一個數大於後一個數則交換位置

t = a(i): a(i) = a(j): a(j) = t

End If

Next j

Print a(i);

Next i

Print a(i);

End Sub

I等於1時 就是拿第一位和第二位比較 比較大的的數排後面 然後比較第一位和第三位 For j = i + 1

To 10 直到比較到最後一位

i=2 時也是如此 循環9次就完成排序

5 3 2 7

i=1 時

J=2時 3 5 2 7

J=3時 2 5 3 7

j=4時 2 5 3 7

I=2時

j=3時 2 3 5 7


(2)vb經典演算法擴展閱讀

PrivateSubCommand1_Click()

Dima(10)AsInteger

DimbAsInteger

DimiAsInteger

DimjAsInteger

DimkAsInteger

Fori=1To10

a(i)=Int(Rnd*90+10)

Printa(i);

Nexti

Print

Fori=1To9

k=i

Forj=k+1To10

Ifa(j)<a(k)Thenk=j

Nextj

Ifa(i)>a(k)Then

b=a(i)

a(i)=a(k)

a(k)=b

EndIf

Nexti

Fori=1To10

Printa(i);

Nexti

Print

EndSub

『叄』 VB演算法問題,一個堆數字中湊出指定數字

數據20-30個,這個高效與低效,運行時間應該差不了多少吧!
我給個簡單的演算法:
1,將這些數據讀入一個數組a()
2,對數組內的數據進行升序排序
3,依次從數組中取一個數與其他數進行求和
1)先算兩個數之和100的。從a(0)開始,當a(i)>50時,即可跳出循環,開始進行三個數之和是100的計算
2)當a(i)>34時,跳出循環,進行四個數之和是100的計算
3)當a(i)>25時,跳出循環,進行五個數之和是100的計算
依次類推

『肆』 vb三種基本排序演算法

三種基本排序演算法(與哪種編程語言無關):
冒泡排序演算法、選擇排序演算法、插入排序演算法

熱點內容
創建資料庫並設置編碼 發布:2025-01-31 11:11:52 瀏覽:781
搭建數據中心需要的伺服器配置 發布:2025-01-31 11:11:44 瀏覽:590
c語言小數點後四捨五入 發布:2025-01-31 11:10:10 瀏覽:496
httpslinux 發布:2025-01-31 11:10:09 瀏覽:828
java4 發布:2025-01-31 11:08:42 瀏覽:355
什麼是密碼屏蔽 發布:2025-01-31 11:05:13 瀏覽:216
一個演算法的效率可分為 發布:2025-01-31 11:05:12 瀏覽:639
win7用戶名密碼是什麼 發布:2025-01-31 10:57:38 瀏覽:394
網址埠訪問 發布:2025-01-31 10:49:30 瀏覽:512
javaweb代碼 發布:2025-01-31 10:37:54 瀏覽:259