常用算法源程序
- 格式:doc
- 大小:131.50 KB
- 文档页数:12
100个python算法实例Python算法是指用Python编写的解决问题或处理数据的方法和步骤。
Python是一种通用的、高级的编程语言,具有简单易学、可读性强、代码简洁等特点,非常适合用于编写各种算法。
下面将给出100个Python算法实例的相关参考内容,不包含任何链接。
1. 阶乘算法阶乘算法用于计算一个正整数的阶乘,即n! = n * (n-1) * ... * 2 * 1。
可以使用递归或循环的方式实现,以下是一个示例代码:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n-1)```2. 斐波那契数列算法斐波那契数列由0和1开始,后面的每一项都是前两项的和。
可以使用递归或循环的方式实现,以下是一个示例代码:```pythondef fibonacci(n):if n <= 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)```3. 冒泡排序算法冒泡排序是一种简单的排序算法,通过不断比较相邻的两个元素并交换位置,使得最大(或最小)的元素逐渐“冒泡”到最后(或最前)。
以下是一个示例代码:```pythondef bubble_sort(lst):n = len(lst)for i in range(n - 1):for j in range(n - 1 - i):if lst[j] > lst[j + 1]:lst[j], lst[j + 1] = lst[j + 1], lst[j]return lst```4. 快速排序算法快速排序是一种高效的排序算法,通过选择一个基准元素,将小于该基准的元素移到左侧,大于该基准的元素移到右侧,然后递归地对左右两个部分进行排序。
以下是一个示例代码:```pythondef quick_sort(lst):if len(lst) <= 1:return lstelse:pivot = lst[0]less = [x for x in lst[1:] if x <= pivot]greater = [x for x in lst[1:] if x > pivot]return quick_sort(less) + [pivot] + quick_sort(greater)```5. 二分查找算法二分查找算法是一种快速查找有序列表中特定元素位置的算法,通过不断将待查找范围缩小一半的方式进行查找。
#include<math.h>#include<stdio.h>#define N 3static double aa[N][N]={{3,1,6},{2,1,3},{1,1,1}};static double bb[N]={2,7,4};int LU(double a[][N+1])//返回:-1存在a[k,k]=0,1正常结束{int i,r,k;double add1,add2;for(i=1;i<=N;i++)//{//第一行U[1][i]a[1][i]=a[1][i];//printf("%12lf",a[1][i]);}for(i=2;i<=N;i++)//第一列L[i][1]{if(a[1][1]==0)return -1;a[i][1]=a[i][1]/a[1][1];//printf("%12lf",a[i][1]);}for(r=2;r<=N;r++)//第r行,第r列{for(i=r;i<=N;i++)//行U[][]{add1=0;for(k=1;k<=r-1;k++){add1=add1+a[r][k]*a[k][i];}a[r][i]=a[r][i]-add1;//printf("%12lf",a[r][i]);}for(i=r+1;i<=N;i++)//列L[][]{add2=0;for(k=1;k<=r-1;k++){add2=add2+a[i][k]*a[k][r];}if(a[r][r]==0)return -1;a[i][r]=(a[i][r]-add2)/a[r][r];//printf("%12lf",a[i][r]);}}return 1;}//对N阶矩阵A进行LU分解,结果L、U存放在A的相应位置void solve(double a[][N+1],double b[N+1])//利用分解的LU求x,,,LUx=b{int i,k;double add3,add4;/*for(i=1;i<=N;i++)printf("%12lf",b[i]);*/b[1]=b[1];//printf("%12lf",b[1]);for(i=2;i<=N;i++)//第一次回代求y[i];;;Ly=b{add3=0;for(k=1;k<i;k++)add3=add3+a[i][k]*b[k];b[i]=b[i]-add3;//printf("%12lf",b[i]);}/*if(a[N][N]==0)return -1;*/b[N]=b[N]/a[N][N];//printf("%12lf",b[N]);for(i=N-1;i>0;i--)//第二次回代求x[i];;;Ux=y{add4=0;/*if(a[i][i]==0)return -1;*/for(k=i+1;k<=N;k++)add4=add4+a[i][k]*b[k];b[i]=(b[i]-add4)/a[i][i];//printf("%12lf",b[i]);}}//回代求解,L与U元素均在A矩阵相应位置;b存放常数列,返回时存放方程组的解void main(){int d,i,j;double a[N+1][N+1],b[N+1];for(i=1;i<=N;i++)//初始化{for(j=1;j<=N;j++)a[i][j]=aa[i-1][j-1];b[i]=bb[i-1];}d=LU(a);if(d==1){printf("矩阵L如下\n");for(i=1;i<=N;i++){for(j=1;j<=i;j++)if(i==j)printf("%12d ",1);elseprintf("%12lf",a[i][j]);printf("\n");}printf("\n矩阵U如下\n");for(i=1;i<=N;i++){for(j=1;j<=N;j++)if(i<=j)printf("%12lf",a[i][j]);elseprintf("%12s","");printf("\n");}solve(a,b);for(i=1;i<=N;i++)printf(" x[%d]=%lf ",i,b[i]);printf("\n");}}。
C语言常用算法程序汇总C语言是一门广泛应用于计算机编程的语言,具有较高的效率和灵活性。
在C语言中,常见的算法程序包括排序算法、查找算法、递归算法等等。
以下是一些常用的C语言算法程序的汇总:1.排序算法:-冒泡排序:通过多次迭代比较相邻元素并交换位置,将最大的元素逐渐移动到正确的位置。
-插入排序:将待排序的元素与已排序的部分依次比较并插入到正确的位置。
-选择排序:每次从待排序的元素中选择最小的元素并与已排序的部分交换位置。
-快速排序:通过选择一个基准元素,将数组划分为两个子数组进行递归排序。
2.查找算法:-顺序查找:逐个比较数组中的元素,直到找到目标元素或到数组末尾。
-二分查找:通过比较目标元素与数组中间元素的大小,逐步缩小范围,直到找到目标元素。
-哈希查找:通过散列函数将目标元素映射到哈希表的索引位置进行查找。
3.递归算法:-阶乘:通过递归调用自身计算一个正整数的阶乘。
-斐波那契数列:通过递归调用自身计算斐波那契数列的第n个数。
-二叉树遍历:通过递归调用自身遍历二叉树的各个节点。
4.图算法:- 最短路径算法:如Dijkstra算法和Floyd算法,用于计算图中两个节点之间的最短路径。
-拓扑排序:通过对有向无环图进行排序,使得所有的边从排在前面的节点指向排在后面的节点。
- 最小生成树:如Prim算法和Kruskal算法,用于找到图中连接所有节点的最小子树。
5.动态规划:-最长公共子序列:通过寻找两个字符串中的最长公共子序列,解决字符串匹配问题。
-背包问题:通过动态规划解决在给定容量下选取物品使得总价值最大的问题。
-最大子序列和:通过动态规划解决一个数组中选取连续子序列使得和最大的问题。
以上只是一些C语言中常用的算法程序的汇总,实际上,还有很多其他的算法,如逆波兰表达式、霍夫曼编码、最小割等等。
通过学习这些算法,可以更好地理解C语言的应用和开发。
第一章求根公式法:#include<stdio.h>#include<math.h>main(){int a,b,c;double x1,x2,d=0.0;printf("请输入a,b,c的值:\n");scanf("%d,%d,%d",&a,&b,&c);d=b*b-4*a*c;if(d>=0){if(d>0){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}else{ x1=-b/(2*a);x2=x1;printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}}else{printf("方程无实根\n");}return 0;}二分法:#include<stdio.h>#include<math.h>double f(double x){double y;y=x*x*x-2*x-5;return y;}main(){double a=2.0,b=3.0,x;if(f(a)*f(b)<0.0){do{x=(a+b)/2.0;if(f(a)*f(x)<0.0){b=x;continue;}if(f(x)*f(b)<0.0)a=x;}while(fabs(a-b)>0.01);}else printf("没有实根");printf("实根为%f",x);return 0;}第二章拉格朗日插值:#include <iostream>#include <iomanip>#include <stdlib.h>using namespace std;#define N 100void lagrange(){int n,k,m,q=1;float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;cout<<"请输入X的个数:";cin>>n;for(k=0;k<=n-1;k++){cout<<"请输入X"<<k<<"的值:";cin>>x[k];cout<<"请输入Y"<<k<<"的值:";cin>>y[k];}system("cls");cout<<"则Xi与Yi表格如下:"<<endl;cout<<"Xi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<x[k]; cout<<endl;cout<<"Yi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<y[k]; cout<<endl;while(q){cout<<"请输入所求x的值:";cin>>xx;while(xx>x[k-1]||xx<x[0]){cout<<"输入错误,请重新输入:";cin>>xx;}for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m] ));cout<<"则拉格朗日分段线性插值为:"<<yyy1<<endl;for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}if((xx-x[m])>(x[m+1]-xx))m=m+1;else m=m;yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1])); yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1])); yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m])); yyy2=yy1+yy2+yy3;cout<<"则拉格朗日分段二次插值为:"<<yyy2<<endl;cout<<"是否输入其余要求x的值[是(1),否(0)]:";cin>>q;}system("cls");}void main(){lagrange();}牛顿插值:#include<stdio.h>#include<math.h>main(){float a[]={0,1,2,3,4},b[]={3,6,11,18,27};float f[5],x,t,m,n,s=0;int i,j,k,l;printf("请输入x的值:");scanf("%f",&x);f[0]=b[0];for(i=1;i<5;i++){m=0;for(j=0;j<=i;j++){t=1;for(k=0;k<=i;k++){if(k!=j) t=t/(a[j]-a[k]);}m=m+b[j]*t;}n=1;for(l=0;l<i;l++) n=n*(x-a[l]);s=s+m*n;}s=s+f[0];printf("s=%f",s);return 0;}线性和二次插值法:#include<stdio.h>#include<math.h>main(){floata[]={0.4,0.5,0.6,0.7,0.8,0.9},b[]={-0.916291,-0.693147,-0.510826,-0.3566 75,-0.223144,-0.105361};float x,t,m,p1=0.0,p2=0.0,p3=0.0;int i,j;printf("请输入x的值");scanf("%f",&x);for(i=0;i<2;i++){t=0.0;for(j=0;j<2;j++){if(j!=i) t=t+((x-a[j])/(a[i]-a[j]))*b[i];}p1=p1+t;}printf("线性插值的结果为:%f",p1);for(i=0;i<3;i++){m=1.0;for(j=0;j<3;j++){if(j!=i) m=m*((x-a[j])/(a[i]-a[j]));}p2=p2+m*b[i];}printf("取0.4,0.5,0.7,的二次插值的结果为:%f",p2); for(i=1;i<4;i++){m=1.0;for(j=1;j<4;j++){if(j!=i) m=m*((x-a[i])/(a[i]-a[j]));}p3=p3+m*b[i];}printf("取0.5,0.6,0.7的二次插值的结果为:%f",p3);return 0;}直线拟合法:#include<stdio.h>#include<math.h>main(){float X[5]={-2,-1,0,1,2},Y[5]={0,0.2,0.5,0.8,1.0}; float a=0,b=0,c=0,d=0,m,n;int i;for(i=0;i<5;i++){a=a+X[i];b=b+Y[i];c=c+X[i]*X[i];d=d+X[i]*Y[i];};m=(b*c-a*d)/(5*c-a*a);n=(5*d-c*a)/(5*c-a*a);float x,y;printf("请输入X的值");scanf("%f",&x);y=m+n*x;printf("拟合后代入x的值得出的结果为:%f",y); return 0;}第三章复化辛甫生算法:#include<stdio.h>#include<math.h>float f(float x){float y;y=3*x*x+2*x;return y;}main(){float a,b,h,s;int k=1,n;printf("请输入a,b,n");scanf("%f,%f,%d",&a,&b,&n);h=(b-a)/n;s=f(b)-f(a);for(float x=a;k<n;k++){x=x+h/2;s=s+4*f(x);x=x+h/2;s=s+2*f(x);}s=(h/6)*s;printf("s=%f",s);}龙贝格算法:#include<stdio.h>#include<string.h>#include<math.h>#include<conio.h>#include<stdlib.h>float f(float x){return (2*x);}float r(float a,float b){int k=1;float s,x,t1,t2,s1,s2,c1,c2,r1,r2,h=b-a,p;t1=h*(f(a)+f(b))/2;while(1){s=0;x=a+h/2;do{s+=f(x);x+=h;}while(x<b);t2=(t1+h*s)/2.0;if(fabs(t2-t1)<p)return(t2);s2=t2+(t2-t1)/3.0;if(k==1){t1=t2;s1=s2;h/=2;k+=1;continue;}c2=s2+(s2-s1)/15.0;if(k==2){c1=c2;t1=t2;s1=s2;h/=2.0;k+=1;continue;}r2=c2+(c2-c1)/63;if(k==3){r1=r2;c1=c2;t1=t2;s1=s2;h/=2;k+=1;continue;};if(fabs(s1-s2)<p)return(s2);r1=r2;c1=c2;t1=t2;s1=s2;h/2;k+=1;return(r1);}}main(){int i;float a,b,p,s,clrsca();printf("\n input integrate f(x) the begin:");scanf("%f",&a);printf("\n input integrate f(x) the end:"); scanf("%f",&b);printf("\n input p:");scanf("%f",&p);s=r(a,b);printf("the result is:%f",s);getch();return(s);}变步长积分法:#include<stdio.h>#include<math.h>void main(){double k,a,b;int kk,n;double sum[100],t[100];printf("方程为f(x)=x/(4+x^2),积分区间为[0,1]\n");printf("请输入预定精度a的值\n");scanf("%lf",&a);t[0]=0.1;t[1]=0.1088;for(k=1.0,kk=1;fabs(t[kk]-t[kk-1])>=a;k++,kk++){for(n=1,sum[kk+1]=0;n<=pow(2.0,k);n++){b=(2*n-1)/pow(2.0,k+1);sum[kk+1]+=b/(4+b*b);}t[kk+1]=0.5*t[kk]+(1/pow(2.0,k+1))*sum[kk+1];}printf("\n方程利用变步长梯形法积分后的积分值为%f\n",t[kk]);}第四章:欧拉法:#include<stdio.h>#include<math.h>#include<string.h> #include<stdlib.h> float f(float x,float y){ float f;f=x+y;return f;};main(){float x[6],y[6],h;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;y[n]=y[0]+h*f(x[0],y[0]);printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}改进欧拉法:#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>float f(float x,float y){float f;f=x+y;return f;};main(){float x[6],y[6],h,yp,ye;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;yp=y[0]+h*f(x[0],y[0]);ye=y[0]+h*f(x[n],yp);y[n]=(yp+ye)/2;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}四阶龙格库塔法:#include<stdio.h>#include<math.h>#include<string.h>float f(float x,float y){float f;f=x+y;return f;}main(){float x[11],y[11],h,k1,k2,k3,k4;printf("请分别输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(int n=1;n<11;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;k1=f(x[0],y[0]);k2=f(x[0]+h/2,y[0]+h*k1/2);k3=f(x[0]+h/2,y[0]+h*k2/2);k4=f(x[n],y[0]+h*k3);y[n]=y[0]+h*(k1+2*k2+2*k3+k4)/6;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}第六章迭代法:#include<stdio.h>#include<math.h>#include<string.h>double F1(double x);double Newton(double x0, double e); int main(){double x0 = 0.5;double e = 10E-6;printf("x = %f\n", Newton(x0, e));getchar();return 0;}double F1(double x){return log(x+2)/log(10);}double Newton(double x0, double e) {double x1;do{x1 = x0;x0 =F1(x1);} while (fabs(x0 - x1) > e);return x0;}埃特金加速法:#include<stdio.h>#include<conio.h>#include<math.h>#define h 1.E-10 double f(double x0) {x0=exp(-x0);return x0;}double sub(double x) {if(x>=0)return x;else return -x;}main(){double x0=0.5,x,s=0.0; do{x=f(x0);s=sub(x-x0);x0=x;}while(s>h); printf("x=%f",x); getch();return 0;}快速弦截法:#include<stdio.h>#include <math.h>float f(float x){float y;y=x*exp(x)-1;return (y);}float xpoint(float x1,float x2){float y;y=(x1*f(x2)-x2*f(x1)) / (f(x2) - f(x1));return (y) ;}float root(float x1, float x2) {int i;float x,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0000001); return (x);}main(){float x1,x2,f1,f2,x;do{printf("input x1,x2:\n");scanf("%f,%f",&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf("A root of equation is %8.4f\n",x); }第七章高斯消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],m[10][10],x[10],sum; int i,j,k,n;printf("the top exp:");scanf("%d",&n);printf("\n");for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%f",&a[i][j]);}for(i=0;i<n;i++){scanf("%f",&b[i]);}for(k=0;k<n-1;k++){if(a[k][k]==0)printf("error");else {for(i=k+1;i<n;i++){m[i][k]=a[i][k]/a[k][k];} };a[i][k]=m[i][k];b[i]=b[i]-m[i][k]*b[k];for(j=k+1;j<n;j++)a[i][j]=a[i][j]-m[i][k]*a[k][j];};if(a[n-1][n-1]==0)printf("error");else x[n-1]=b[n-1]/a[n-1][n-1];b[n-1]=x[n-1];for(i=n-2;i>=0;i--){sum=0;for(j=i+1;j<n;j++){sum+=a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];b[i]=x[i];}for(i=0;i<n;i++)printf("%f\n",x[i]);}return 0;}选主元消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],s,t,e,sum; int i,j,k,n,m;printf("The top exp is "); scanf("%d",&n);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);for(i=0;i<n;i++)scanf("%f",&b[i]);scanf("%f",&e);k=0;do{t=a[k][k];for(i=k;i<n;i++){if(fabs(t)<fabs(a[i][k])){t=a[i][k];m=i;}else m=k;}if(fabs(t)<e)printf("det A = 0\n");else {if(m!=k){for(j=0;j<n;j++){s=a[m][j];a[m][j]=a[k][j];a[k][j]=s;}s=b[m];b[m]=b[k];b[k]=s;}for(i=k+1;i<n;i++)for(j=k+1;j<n;j++){a[i][k]=a[i][k]/a[k][k];a[i][j]=a[i][j]-a[i][k]*a[k][j];b[i]=b[i]-a[i][k]*b[k];}}k++;}while(k<n-2);if(fabs(a[n-1][n-1])<e)printf("det A = 0\n");else {b[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){sum=0;for(k=i+1;k<n;k++){sum+=a[k][j]*b[j];}b[i]=(b[i]-sum)/a[i][i];}}for(i=0;i<n;i++)printf("%f\n",b[i]);}追赶法:#include<stdio.h>#include<math.h>main(){int i,j,k,n;float d[10][10],g[10],a[10],b[10],c[10],x[10],y[10],f[10];printf("the top exp is ");scanf("%d",&n);scanf("%f,%f,%f,%f",&d[0][0],&d[0][1],&d[n-1][n-2],&d[n-1][n-1]); for(i=1;i<n-1;i++)for(j=i-1;j<=i+1;j++)scanf("%f",&d[i][j]);for(i=0;i<n;i++)scanf("%f",&g[i]);for(i=1;i<n-1;i++)a[i]=d[i][i-1];for(i=0;i<n;i++)b[i]=d[i][i];for(i=0;i<n-1;i++)c[i]=d[i][i+1];f[0]=c[0]/b[0];for(k=1;k<n-1;k++)f[k]=c[k]/(b[k]-a[k]*f[k-1]);y[0]=g[0]/b[0];for(i=1;i<n;i++)y[i]=(g[i]-a[i]*y[i-1])/(b[i]-a[i]*f[i-1]); x[n-1]=y[n-1];for(i=n-2;i>=0;i--)x[i]=y[i]-f[i]*x[i+1];for(i=0;i<n;i++)printf("%f\n",x[i]);}。
一些软件滤波算法的原理和程序源代码滤波算法是信号处理中常用的技术,用于去除信号中的噪声或抽取感兴趣的信号特征。
在本文中,我将介绍几种常见的软件滤波算法的原理和程序源代码,包括均值滤波、中值滤波和高斯滤波。
1.均值滤波均值滤波是一种简单直观的滤波算法。
其原理是通过计算像素周围邻近像素的平均值,来替换掉原始图像像素的值。
均值滤波的算法步骤如下:-创建一个大小为n的窗口(n通常为奇数),以当前像素为中心。
-计算窗口中所有像素的平均值。
-将当前像素的值替换为计算得到的平均值。
-按顺序处理所有像素。
以下是均值滤波的C++程序源代码示例:```cppvoid meanFilter(const cv::Mat& src, cv::Mat& dst, int kernelSize)int kernelHalfSize = kernelSize / 2;dst.create(src.size(, src.type();for (int y = 0; y < src.rows; y++)for (int x = 0; x < src.cols; x++)cv::Vec3f sum = cv::Vec3f(0, 0, 0);int numPixels = 0;for (int ky = -kernelHalfSize; ky <= kernelHalfSize; ky++) for (int kx = -kernelHalfSize; kx <= kernelHalfSize; kx++) int px = x + kx;int py = y + ky;if (px >= 0 && py >= 0 && px < src.cols && py < src.rows) sum += src.at<cv::Vec3b>(py, px);numPixels++;}}}cv::Vec3f average = sum / numPixels;dst.at<cv::Vec3b>(y, x) = average;}}```2.中值滤波中值滤波是一种非线性滤波算法,主要用于去除图片中的椒盐噪声。
源代码如下:/*ant.c*/#define SPACE 0x20#define ESC 0x1b#define ANT_CHAR_EMPTY '+' #define ANT_CHAR_FOOD 153#define HOME_CHAR 'H'#define FOOD_CHAR 'F'#define FOOD_CHAR2 'f'#define FOOD_HOME_COLOR 12 #define BLOCK_CHAR 177#define MAX_ANT 50#define INI_SPEED 3#define MAXX 80#define MAXY 23#define MAX_FOOD 10000#define TARGET_FOOD 200#define MAX_SMELL 5000#define SMELL_DROP_RATE 0.05 #define ANT_ERROR_RATE 0.02 #define ANT_EYESHOT 3#define SMELL_GONE_SPEED 50 #define SMELL_GONE_RATE 0.05 #define TRACE_REMEMBER 50#define MAX_BLOCK 100#define NULL 0#define UP 1#define DOWN 2#define LEFT 3#define RIGHT 4#define SMELL_TYPE_FOOD 0#define SMELL_TYPE_HOME 1#include "stdio.h"#include "conio.h"#include "dos.h"#include "stdlib.h"#include "dos.h"#include "process.h"#include "ctype.h"#include "math.h"void WorldInitial(void);void BlockInitial(void);void CreatBlock(void);void SaveBlock(void);void LoadBlock(void);void HomeFoodInitial(void);void AntInitial(void);void WorldChange(void);void AntMove(void);void AntOneStep(void);void DealKey(char key);void ClearSmellDisp(void);void DispSmell(int type);int AntNextDir(int xxx,int yyy,int ddir);int GetMaxSmell(int type,int xxx,int yyy,int ddir); int IsTrace(int xxx,int yyy);int MaxLocation(int num1,int num2,int num3);int CanGo(int xxx,int yyy,int ddir);int JudgeCanGo(int xxx,int yyy);int TurnLeft(int ddir);int TurnRight(int ddir);int TurnBack(int ddir);int MainTimer(void);char WaitForKey(int secnum);void DispPlayTime(void);int TimeUse(void);void HideCur(void);void ResetCur(void);/* --------------- */struct HomeStruct{int xxx,yyy;int amount;int TargetFood;}home;struct FoodStruct{int xxx,yyy;int amount;}food;struct AntStruct{int xxx,yyy;int dir;int speed;int SpeedTimer;int food;int SmellAmount[2];int tracex[TRACE_REMEMBER];int tracey[TRACE_REMEMBER];int TracePtr;int IQ;}ant[MAX_ANT];int AntNow;int timer10ms;struct time starttime,endtime;int Smell[2][MAXX+1][MAXY+1];int block[MAXX+1][MAXY+1];int SmellGoneTimer;int SmellDispFlag;int CanFindFood;int HardtoFindPath;/* ----- Main -------- */void main(void){char KeyPress;int tu;clrscr();HideCur();WorldInitial();do{timer10ms = MainTimer();if(timer10ms) AntMove();if(timer10ms) WorldChange();tu = TimeUse();if(tu>=60&&!CanFindFood){gotoxy(1,MAXY+1);printf("Can not find food, maybe a block world.");WaitForKey(10);WorldInitial();}if(tu>=180&&home.amount<100&&!HardtoFindPath){gotoxy(1,MAXY+1);printf("God! it is so difficult to find a path.");if(WaitForKey(10)==0x0d) WorldInitial();else{HardtoFindPath = 1;gotoxy(1,MAXY+1);printf(" ");}}if(home.amount>=home.TargetFood){gettime(&endtime);KeyPress = WaitForKey(60);DispPlayTime();WaitForKey(10);WorldInitial();}else if(kbhit()){KeyPress = getch();DealKey(KeyPress);}else KeyPress = NULL;}while(KeyPress!=ESC);gettime(&endtime);DispPlayTime();WaitForKey(10);clrscr();ResetCur();}/* ------ general sub process ----------- */int MainTimer(void)/* output: how much 10ms have pass from last time call this process */ {static int oldhund,oldsec;struct time t;int timeuse;gettime(&t);timeuse = 0;if(t.ti_hund!=oldhund){if(t.ti_sec!=oldsec){timeuse+=100;oldsec = t.ti_sec;}timeuse+=t.ti_hund-oldhund;oldhund = t.ti_hund;}else timeuse = 0;return (timeuse);}char WaitForKey(int secnum)/* funtion: if have key in, exit immediately, else wait 'secnum' senconds then exitinput: secnum -- wait this senconds, must < 3600 (1 hour)output: key char, if no key in(exit when timeout), return NULL */ {int secin,secnow;int minin,minnow;int hourin,hournow;int secuse;struct time t;gettime(&t);secin = t.ti_sec;minin = t.ti_min;hourin = t.ti_hour;do{if(kbhit()) return(getch());gettime(&t);secnow = t.ti_sec;minnow = t.ti_min;hournow = t.ti_hour;if(hournow!=hourin) minnow+=60;if(minnow>minin) secuse = (minnow-1-minin) + (secnow+60-secin); else secuse = secnow - secin;/* counting error check */if(secuse<0){gotoxy(1,MAXY+1);printf("Time conuting error, any keyto exit...");getch();exit(3);}}while(secuse<=secnum);return (NULL);}void DispPlayTime(void){int ph,pm,ps;ph = endtime.ti_hour - starttime.ti_hour;pm = endtime.ti_min - starttime.ti_min;ps = endtime.ti_sec - starttime.ti_sec;if(ph<0) ph+=24;if(pm<0) { ph--; pm+=60; }if(ps<0) { pm--; ps+=60; }gotoxy(1,MAXY+1);printf("Time use: %d hour- %d min- %d sec ",ph,pm,ps);}int TimeUse(void){int ph,pm,ps;gettime(&endtime);ph = endtime.ti_hour - starttime.ti_hour;pm = endtime.ti_min - starttime.ti_min;ps = endtime.ti_sec - starttime.ti_sec;if(ph<0) ph+=24;if(pm<0) { ph--; pm+=60; }if(ps<0) { pm--; ps+=60; }return(ps+(60*(pm+60*ph)));}void HideCur(void){union REGS regs0;regs0.h.ah=1;regs0.h.ch=0x30;regs0.h.cl=0x31;int86(0x10,®s0,®s0);}void ResetCur(void){union REGS regs0;regs0.h.ah=1;regs0.h.ch=0x06;regs0.h.cl=0x07;int86(0x10,®s0,®s0);}/* ------------ main ANT programe ------------- */ void WorldInitial(void){int k,i,j;randomize();clrscr();HomeFoodInitial();for(AntNow=0;AntNow<MAX_ANT;AntNow++){AntInitial();} /* of for AntNow */;BlockInitial();for(k=0;k<=1;k++)/* SMELL TYPE FOOD and HOME */for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++)Smell[k][i][j] = 0;SmellGoneTimer = 0;gettime(&starttime);SmellDispFlag = 0;CanFindFood = 0;HardtoFindPath = 0;}void BlockInitial(void){int i,j;int bn;for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++)block[i][j] = 0;bn = 1+ MAX_BLOCK/2 + random(MAX_BLOCK/2);for(i=0;i<=bn;i++) CreatBlock();}void CreatBlock(void){int x1,y1,x2,y2;int dx,dy;int i,j;x1 = random(MAXX)+1;y1 = random(MAXY)+1;dx = random(MAXX/10)+1;dy = random(MAXY/10)+1;x2 = x1+dx;y2 = y1+dy;if(x2>MAXX) x2 = MAXX;if(y2>MAXY) y2 = MAXY;if(food.xxx>=x1&&food.xxx<=x2&&food.yyy>=y1&&food.yyy<=y2) return; if(home.xxx>=x1&&home.xxx<=x2&&home.yyy>=y1&&home.yyy<=y2) return;for(i=x1;i<=x2;i++)for(j=y1;j<=y2;j++){block[i][j] = 1;gotoxy(i,j);putch(BLOCK_CHAR);}}void SaveBlock(void){FILE *fp_block;char FileNameBlock[20];int i,j;gotoxy(1,MAXY+1);printf(" ");gotoxy(1,MAXY+1);printf("Save to file...",FileNameBlock);gets(FileNameBlock);if(FileNameBlock[0]==0) strcpy(FileNameBlock,"Ant.ant"); else strcat(FileNameBlock,".ant");if ((fp_block = fopen(FileNameBlock, "wb")) == NULL){ gotoxy(1,MAXY+1);printf("Creat file %s fail...",FileNameBlock);getch();exit(2);}gotoxy(1,MAXY+1);printf(" ");fputc(home.xxx,fp_block);fputc(home.yyy,fp_block);fputc(food.xxx,fp_block);fputc(food.yyy,fp_block);for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++)fputc(block[i][j],fp_block);fclose(fp_block);}void LoadBlock(void){FILE *fp_block;char FileNameBlock[20];int i,j,k;gotoxy(1,MAXY+1);printf(" ");gotoxy(1,MAXY+1);printf("Load file...",FileNameBlock);gets(FileNameBlock);if(FileNameBlock[0]==0) strcpy(FileNameBlock,"Ant.ant"); else strcat(FileNameBlock,".ant");if ((fp_block = fopen(FileNameBlock, "rb")) == NULL){ gotoxy(1,MAXY+1);printf("Open file %s fail...",FileNameBlock);getch();exit(2);}clrscr();home.xxx = fgetc(fp_block);home.yyy = fgetc(fp_block);food.xxx = fgetc(fp_block);food.yyy = fgetc(fp_block);gotoxy(home.xxx,home.yyy); putch(HOME_CHAR);gotoxy(food.xxx,food.yyy); putch(FOOD_CHAR);food.amount = random(MAX_FOOD/3)+2*MAX_FOOD/3+1;/* food.amount = MAX_FOOD; */home.amount = 0;home.TargetFood =(food.amount<TARGET_FOOD)?food.amount:TARGET_FOOD;for(AntNow=0;AntNow<MAX_ANT;AntNow++){AntInitial();} /* of for AntNow */;for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++){block[i][j] = fgetc(fp_block);if(block[i][j]){gotoxy(i,j);putch(BLOCK_CHAR);}}for(k=0;k<=1;k++)/* SMELL TYPE FOOD and HOME */for(i=0;i<=MAXX;i++)for(j=0;j<=MAXY;j++)Smell[k][i][j] = 0;SmellGoneTimer = 0;gettime(&starttime);SmellDispFlag = 0;CanFindFood = 0;HardtoFindPath = 0;fclose(fp_block);}void HomeFoodInitial(void){int randnum;int homeplace;/* 1 -- home at left-up, food at right-down2 -- home at left-down, food at right-up3 -- home at right-up, food at left-down4 -- home at right-down, food at left-up */randnum = random(100);if(randnum<25) homeplace = 1;else if (randnum>=25&&randnum<50) homeplace = 2; else if (randnum>=50&&randnum<75) homeplace = 3; else homeplace = 4;switch(homeplace){case 1: home.xxx = random(MAXX/3)+1;home.yyy = random(MAXY/3)+1;food.xxx = random(MAXX/3)+2*MAXX/3+1;food.yyy = random(MAXY/3)+2*MAXY/3+1;break;case 2: home.xxx = random(MAXX/3)+1;home.yyy = random(MAXY/3)+2*MAXY/3+1;food.xxx = random(MAXX/3)+2*MAXX/3+1;food.yyy = random(MAXY/3)+1;break;case 3: home.xxx = random(MAXX/3)+2*MAXX/3+1; home.yyy = random(MAXY/3)+1;food.xxx = random(MAXX/3)+1;food.yyy = random(MAXY/3)+2*MAXY/3+1;break;case 4: home.xxx = random(MAXX/3)+2*MAXX/3+1;home.yyy = random(MAXY/3)+2*MAXY/3+1;food.xxx = random(MAXX/3)+1;food.yyy = random(MAXY/3)+1;break;}food.amount = random(MAX_FOOD/3)+2*MAX_FOOD/3+1;/* food.amount = MAX_FOOD; */home.amount = 0;home.TargetFood = (food.amount<TARGET_FOOD)?food.amount:TARGET_FOOD;/* data correctness check */if(home.xxx<=0||home.xxx>MAXX||home.yyy<=0||home.yyy>MAXY||food.xxx<=0||food.xxx>MAXX||food.yyy<=0||food.yyy>MAXY||food.amount<=0){gotoxy(1,MAXY+1);printf("World initial fail, any key to exit...");getch();exit(2);}gotoxy(home.xxx,home.yyy); putch(HOME_CHAR);gotoxy(food.xxx,food.yyy); putch(FOOD_CHAR);}void AntInitial(void)/* initial ant[AntNow] */{int randnum;int i;ant[AntNow].xxx = home.xxx;ant[AntNow].yyy = home.yyy;randnum = random(100);if(randnum<25) ant[AntNow].dir = UP;else if (randnum>=25&&randnum<50) ant[AntNow].dir = DOWN;else if (randnum>=50&&randnum<75) ant[AntNow].dir = LEFT;else ant[AntNow].dir = RIGHT;ant[AntNow].speed = 2*(random(INI_SPEED/2)+1);ant[AntNow].SpeedTimer = 0;ant[AntNow].food = 0;ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = 0;ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = MAX_SMELL;ant[AntNow].IQ = 1;for(i=0;i<TRACE_REMEMBER;i++){ant[AntNow].tracex[i] = 0;ant[AntNow].tracey[i] = 0;}ant[AntNow].TracePtr = 0;/* a sepecail ant */if(AntNow==0) ant[AntNow].speed = INI_SPEED;}void WorldChange(void){int k,i,j;int smelldisp;SmellGoneTimer+=timer10ms;if(SmellGoneTimer>=SMELL_GONE_SPEED){SmellGoneTimer = 0;for(k=0;k<=1;k++)/* SMELL TYPE FOOD and HOME */for(i=1;i<=MAXX;i++)for(j=1;j<=MAXY;j++){if(Smell[k][i][j]){smelldisp =1+((10*Smell[k][i][j])/(MAX_SMELL*SMELL_DROP_RATE));if(smelldisp>=30000||smelldisp<0) smelldisp = 30000; if(SmellDispFlag){gotoxy(i,j);if((i==food.xxx&&j==food.yyy)||(i==home.xxx&&j==home.yyy))/* don't over write Food and Home */;else{if(smelldisp>9) putch('#');else putch(smelldisp+'0');}}Smell[k][i][j]-= 1+(Smell[k][i][j]*SMELL_GONE_RATE); if(Smell[k][i][j]<0) Smell[k][i][j] = 0;if(SmellDispFlag){if(Smell[k][i][j]<=2){gotoxy(i,j);putch(SPACE);}}}} /* of one location */} /* of time to change the world */} /* of world change */void AntMove(void){int antx,anty;int smelltodrop,smellnow;for(AntNow=0;AntNow<MAX_ANT;AntNow++){ant[AntNow].SpeedTimer+=timer10ms;if(ant[AntNow].SpeedTimer>=ant[AntNow].speed){ant[AntNow].SpeedTimer = 0;gotoxy(ant[AntNow].xxx,ant[AntNow].yyy);putch(SPACE);AntOneStep();gotoxy(ant[AntNow].xxx,ant[AntNow].yyy);/* ant0 is a sepecail ant, use different color */if(AntNow==0) textcolor(0xd);if(ant[AntNow].food) putch(ANT_CHAR_FOOD);else putch(ANT_CHAR_EMPTY);if(AntNow==0) textcolor(0x7);/* remember trace */ant[AntNow].tracex[ant[AntNow].TracePtr] = ant[AntNow].xxx; ant[AntNow].tracey[ant[AntNow].TracePtr] = ant[AntNow].yyy; if(++(ant[AntNow].TracePtr)>=TRACE_REMEMBER)ant[AntNow].TracePtr = 0;/* drop smell */antx = ant[AntNow].xxx;anty = ant[AntNow].yyy;if(ant[AntNow].food)/* have food, looking for home */{if(ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]){smellnow = Smell[SMELL_TYPE_FOOD][antx][anty];smelltodrop =ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]*SMELL_DROP_RATE;if(smelltodrop>smellnow) Smell[SMELL_TYPE_FOOD][antx][anty] = smelltodrop;/* else Smell[...] = smellnow */ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]-= smelltodrop;if(ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]<0)ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = 0;} /* of have smell to drop */} /* of have food */else/* no food, looking for food */{if(ant[AntNow].SmellAmount[SMELL_TYPE_HOME]){smellnow = Smell[SMELL_TYPE_HOME][antx][anty];smelltodrop =ant[AntNow].SmellAmount[SMELL_TYPE_HOME]*SMELL_DROP_RATE;if(smelltodrop>smellnow) Smell[SMELL_TYPE_HOME][antx][anty] = smelltodrop;/* else Smell[...] = smellnow */ant[AntNow].SmellAmount[SMELL_TYPE_HOME]-= smelltodrop;if(ant[AntNow].SmellAmount[SMELL_TYPE_HOME]<0)ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = 0;} /* of have smell to drop */}} /* of time to go *//* else not go */} /* of for AntNow */textcolor(FOOD_HOME_COLOR);gotoxy(home.xxx,home.yyy); putch(HOME_CHAR);gotoxy(food.xxx,food.yyy);if(food.amount>0) putch(FOOD_CHAR);else putch(FOOD_CHAR2);textcolor(7);gotoxy(1,MAXY+1);printf("Food %d, Home %d ",food.amount,home.amount); }void AntOneStep(void){int ddir,tttx,ttty;int i;ddir = ant[AntNow].dir;tttx = ant[AntNow].xxx;ttty = ant[AntNow].yyy;ddir = AntNextDir(tttx,ttty,ddir);switch(ddir){case UP: ttty--;break;case DOWN: ttty++;break;case LEFT: tttx--;break;case RIGHT: tttx++;break;default: break;} /* of switch dir */ant[AntNow].dir = ddir;ant[AntNow].xxx = tttx;ant[AntNow].yyy = ttty;if(ant[AntNow].food)/* this ant carry with food, search for home */{if(tttx==home.xxx&&ttty==home.yyy){home.amount++;AntInitial();}if(tttx==food.xxx&&ttty==food.yyy)ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = MAX_SMELL; } /* of search for home */else/* this ant is empty, search for food */{if(tttx==food.xxx&&ttty==food.yyy){if(food.amount>0){ant[AntNow].food = 1;food.amount--;ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = MAX_SMELL; ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = 0;ant[AntNow].dir = TurnBack(ant[AntNow].dir);for(i=0;i<TRACE_REMEMBER;i++){ant[AntNow].tracex[i] = 0;ant[AntNow].tracey[i] = 0;}ant[AntNow].TracePtr = 0;CanFindFood = 1;} /* of still have food */}if(tttx==home.xxx&&ttty==home.yyy)ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = MAX_SMELL; } /* of search for food */}void DealKey(char key){int i;switch(key){case 'p': gettime(&endtime);DispPlayTime();getch();gotoxy(1,MAXY+1);for(i=1;i<=MAXX-1;i++) putch(SPACE);break;case 't': if(SmellDispFlag){SmellDispFlag=0;ClearSmellDisp();}else SmellDispFlag = 1;break;case '1': DispSmell(SMELL_TYPE_FOOD);getch();ClearSmellDisp();break;case '2': DispSmell(SMELL_TYPE_HOME);getch();ClearSmellDisp();break;case '3': DispSmell(2);getch();ClearSmellDisp();break;case 's': SaveBlock();break;case 'l': LoadBlock();break;default: gotoxy(1,MAXY+1);for(i=1;i<=MAXX-1;i++) putch(SPACE); } /* of switch */}void ClearSmellDisp(void){int k,i,j;for(k=0;k<=1;k++)/* SMELL TYPE FOOD and HOME */for(i=1;i<=MAXX;i++)for(j=1;j<=MAXY;j++){if(Smell[k][i][j]){gotoxy(i,j);putch(SPACE);}} /* of one location */}void DispSmell(int type)/* input: 0 -- Only display food smell1 -- Only display home smell2 -- Display both food and home smell*/{int k,i,j;int fromk,tok;int smelldisp;switch(type){case 0: fromk = 0;tok = 0;break;case 1: fromk = 1;tok = 1;break;case 2: fromk = 0;tok = 1;break;default:fromk = 0;tok = 1;break;}SmellGoneTimer = 0;for(k=fromk;k<=tok;k++)/* SMELL TYPE FOOD and HOME */for(i=1;i<=MAXX;i++)for(j=1;j<=MAXY;j++){if(Smell[k][i][j]){smelldisp =1+((10*Smell[k][i][j])/(MAX_SMELL*SMELL_DROP_RATE));if(smelldisp>=30000||smelldisp<0) smelldisp = 30000; gotoxy(i,j);if(i!=food.xxx||j!=food.yyy){if((i==food.xxx&&j==food.yyy)||(i==home.xxx&&j==home.yyy))/* don't over write Food and Home */;else{if(smelldisp>9) putch('#');else putch(smelldisp+'0');}}}} /* of one location */}int AntNextDir(int xxx,int yyy,int ddir){int randnum;int testdir;int CanGoState;int cangof,cangol,cangor;int msf,msl,msr,maxms;int type;CanGoState = CanGo(xxx,yyy,ddir);if(CanGoState==0||CanGoState==2||CanGoState==3||CanGoState==6) cangof = 1;else cangof = 0;if(CanGoState==0||CanGoState==1||CanGoState==3||CanGoState==5) cangol = 1;else cangol = 0;if(CanGoState==0||CanGoState==1||CanGoState==2||CanGoState==4) cangor = 1;else cangor = 0;if(ant[AntNow].food) type = SMELL_TYPE_HOME;else type = SMELL_TYPE_FOOD;msf = GetMaxSmell(type,xxx,yyy,ddir);msl = GetMaxSmell(type,xxx,yyy,TurnLeft(ddir));msr= GetMaxSmell(type,xxx,yyy,TurnRight(ddir));maxms = MaxLocation(msf,msl,msr);/* maxms - 1 - msf is MAX2 - msl is MAX3 - msr is MAX0 - all 3 number is 0 */testdir = NULL;switch(maxms){case 0: /* all is 0, keep testdir = NULL, random select dir */ break;case 1: if(cangof)testdir = ddir;elseif(msl>msr) if(cangol) testdir = TurnLeft(ddir);else if(cangor) testdir = TurnRight(ddir);break;case 2: if(cangol)testdir = TurnLeft(ddir);elseif(msf>msr) if(cangof) testdir = ddir;else if(cangor) testdir = TurnRight(ddir);break;case 3: if(cangor)testdir = TurnRight(ddir);elseif(msf>msl) if(cangof) testdir =ddir;else if(cangol) testdir = TurnLeft(ddir);break;default:break;} /* of maxms */randnum = random(1000);if(randnum<SMELL_DROP_RATE*1000||testdir==NULL)/* 1. if testdir = NULL, means can not find the max smell or the dir to max smell can not gothen random select dir2. if ant error, don't follow the smell, random select dir*/{randnum = random(100);switch(CanGoState){case 0: if(randnum<90) testdir = ddir;else if (randnum>=90&&randnum<95) testdir = TurnLeft(ddir); else testdir = TurnRight(ddir);break;case 1: if(randnum<50) testdir = TurnLeft(ddir);else testdir = TurnRight(ddir);break;case 2: if(randnum<90) testdir = ddir;else testdir = TurnRight(ddir);break;case 3: if(randnum<90) testdir = ddir;else testdir = TurnLeft(ddir);break;case 4: testdir = TurnRight(ddir);case 5: testdir = TurnLeft(ddir);break;case 6: testdir = ddir;break;case 7: testdir = TurnBack(ddir);break;default:testdir = TurnBack(ddir);} /* of can go state */}return(testdir);}int GetMaxSmell(int type,int xxx,int yyy,int ddir){int i,j;int ms; /* MAX smell */ms = 0;switch(ddir){case UP: for(i=xxx-ANT_EYESHOT;i<=xxx+ANT_EYESHOT;i++) for(j=yyy-ANT_EYESHOT;j<yyy;j++){if(!JudgeCanGo(i,j)) continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)||(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms = MAX_SMELL;break;}if(IsTrace(i,j)) continue;if(Smell[type][i][j]>ms) ms =Smell[type][i][j];}break;case DOWN:for(i=xxx-ANT_EYESHOT;i<=xxx+ANT_EYESHOT;i++)for(j=yyy+1;j<=yyy+ANT_EYESHOT;j++){if(!JudgeCanGo(i,j)) continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)||(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms = MAX_SMELL;break;}if(IsTrace(i,j)) continue;if(Smell[type][i][j]>ms) ms =Smell[type][i][j];}break;case LEFT: for(i=xxx-ANT_EYESHOT;i<xxx;i++)for(j=yyy-ANT_EYESHOT;j<=yyy+ANT_EYESHOT;j++) {if(!JudgeCanGo(i,j)) continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)||(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms = MAX_SMELL;break;}if(IsTrace(i,j)) continue;if(Smell[type][i][j]>ms) ms =Smell[type][i][j];}break;case RIGHT: for(i=xxx+1;i<=xxx+ANT_EYESHOT;i++)for(j=yyy-ANT_EYESHOT;j<=yyy+ANT_EYESHOT;j++) {if(!JudgeCanGo(i,j)) continue;if((i==food.xxx&&j==food.yyy&&type==SMELL_TYPE_FOOD)||(i==home.xxx&&j==home.yyy&&type==SMELL_TYPE_HOME)){ms = MAX_SMELL;break;}if(IsTrace(i,j)) continue;if(Smell[type][i][j]>ms) ms =Smell[type][i][j];}default: break;}return(ms);}int IsTrace(int xxx,int yyy){int i;for(i=0;i<TRACE_REMEMBER;i++)if(ant[AntNow].tracex[i]==xxx&&ant[AntNow].tracey[i]==yyy) return(1);return(0);}int MaxLocation(int num1,int num2,int num3){int maxnum;if(num1==0&&num2==0&&num3==0) return(0);maxnum = num1;if(num2>maxnum) maxnum = num2;if(num3>maxnum) maxnum = num3;if(maxnum==num1) return(1);if(maxnum==num2) return(2);if(maxnum==num3) return(3);}int CanGo(int xxx,int yyy,int ddir)/* input: xxx,yyy - location of antddir - now diroutput: 0 - forward and left and right can go1 - forward can not go2 - left can not go3 - right can not go4 - forward and left can not go5 - forward and right can not go6 - left and right can not go7 - forward and left and right all can not go*/{int tx,ty,tdir;int okf,okl,okr;/* forward can go ? */tdir = ddir;tx = xxx;ty = yyy;switch(tdir){case UP: ty--;break;case DOWN: ty++;break;case LEFT: tx--;break;case RIGHT: tx++;break;default: break;} /* of switch dir */if(JudgeCanGo(tx,ty)) okf = 1; else okf = 0;/* turn left can go ? */tdir = TurnLeft(ddir);tx = xxx;ty = yyy;switch(tdir){case UP: ty--;break;case DOWN: ty++;break;case LEFT: tx--;break;case RIGHT: tx++;break;default: break;} /* of switch dir */if(JudgeCanGo(tx,ty)) okl = 1; else okl = 0;/* turn right can go ? */tdir = TurnRight(ddir);tx = xxx;ty = yyy;switch(tdir){case UP: ty--;break;case DOWN: ty++;break;case LEFT: tx--;break;case RIGHT: tx++;break;default: break;} /* of switch dir */if(JudgeCanGo(tx,ty)) okr = 1; else okr = 0;if(okf&&okl&&okr) return(0);if(!okf&&okl&&okr) return(1);if(okf&&!okl&&okr) return(2);if(okf&&okl&&!okr) return(3);if(!okf&&!okl&&okr) return(4); if(!okf&&okl&&!okr) return(5); if(okf&&!okl&&!okr) return(6); if(!okf&&!okl&&!okr) return(7); return(7);}int JudgeCanGo(int xxx,int yyy) /* input: location to judegoutput: 0 -- can not go1 -- can go*/{int i,j;if(xxx<=0||xxx>MAXX) return(0); if(yyy<=0||yyy>MAXY) return(0); if(block[xxx][yyy]) return(0); return(1);}int TurnLeft(int ddir){switch(ddir){case UP: return(LEFT);case DOWN: return(RIGHT);case LEFT: return(DOWN);case RIGHT: return(UP);default: break;} /* of switch dir */}int TurnRight(int ddir){switch(ddir){case UP: return(RIGHT);case DOWN: return(LEFT);case LEFT: return(UP);case RIGHT: return(DOWN);default: break;} /* of switch dir */}int TurnBack(int ddir){switch(ddir){case UP: return(DOWN);case DOWN: return(UP);case LEFT: return(RIGHT);case RIGHT: return(LEFT);default: break;} /* of switch dir */}小小的蚂蚁总是能够找到食物,他们具有什么样的智能呢?设想,如果我们要为蚂蚁设计一个人工智能的程序,那么这个程序要多么复杂呢?首先,你要让蚂蚁能够避开障碍物,就必须根据适当的地形给它编进指令让他们能够巧妙的避开障碍物,其次,要让蚂蚁找到食物,就需要让他们遍历空间上的所有点;再次,如果要让蚂蚁找到最短的路径,那么需要计算所有可能的路径并且比较它们的大小,而且更重要的是,你要小心翼翼的编程,因为程序的错误也许会让你前功尽弃。
1.高斯函数GAUSSJSub GAUSSJ(A(), N, B())Dim IPIV(50), INDXR(50), INDXC(50)For J = 1 To NIPIV(J) = 0Next JFor I = 1 To NBIG = 0#For J = 1 To NIf IPIV(J) <> 1 ThenFor K = 1 To NIf IPIV(K) = 0 ThenIf Abs(A(J, K)) >= BIG ThenBIG = Abs(A(J, K))IROW = JICOL = KEnd IfElseIf IPIV(K) > 1 ThenPrint "Singular matrix"End IfNext KEnd IfNext JIPIV(ICOL) = IPIV(ICOL) + 1If IROW <> ICOL ThenFor L = 1 To NDUM = A(IROW, L)A(IROW, L) = A(ICOL, L)A(ICOL, L) = DUMNext LDUM = B(IROW)B(IROW) = B(ICOL)B(ICOL) = DUMEnd IfINDXR(I) = IROWINDXC(I) = ICOLIf A(ICOL, ICOL) = 0# Then Print "Singular matrix."PIVINV = 1# / A(ICOL, ICOL)A(ICOL, ICOL) = 1#For L = 1 To NA(ICOL, L) = A(ICOL, L) * PIVINVNext LB(ICOL) = B(ICOL) * PIVINVFor LL = 1 To NIf LL <> ICOL ThenDUM = A(LL, ICOL)A(LL, ICOL) = 0#For L = 1 To NA(LL, L) = A(LL, L) - A(ICOL, L) * DUMNext LB(LL) = B(LL) - B(ICOL) * DUMEnd IfNext LLNext IFor L = N To 1 Step -1If INDXR(L) <> INDXC(L) ThenFor K = 1 To NDUM = A(K, INDXR(L))A(K, INDXR(L)) = A(K, INDXC(L))A(K, INDXC(L)) = DUMNext KEnd IfNext LEnd Sub2.松弛迭代Sub SSOR(A(), N, B(), X(), EPS, OM, II)IMAX = 200For I = 1 To NR = 1# / A(I, I)B(I) = B(I) * RFor J = 1 To NA(I, J) = A(I, J) * RNext JNext IFor II = 1 To IMAXRX = 0#For I = 1 To NR = B(I)For J = 1 To NR = R - A(I, J) * X(J)Next JIf Abs(R) > RX Then RX = Abs(R)X(I) = X(I) + OM * RNext IIf OM * RX <= EPS Then Exit SubNext IIPrint " Too many iterations"End Sub3.SVDCMPSub SVDCMP(A(), M, N, W(), V())Dim RV1(100)If M < N Then Print "You must augment A with extra zero rows."G = 0#SCALE1 = 0#ANORM = 0#For I = 1 To NL = I + 1RV1(I) = SCALE1 * GG = 0#S = 0#SCALE1 = 0#If I <= M ThenFor K = I To MSCALE1 = SCALE1 + Abs(A(K, I))Next KIf SCALE1 <> 0# ThenFor K = I To MA(K, I) = A(K, I) / SCALE1S = S + A(K, I) * A(K, I)Next KF = A(I, I)G = -Sqr(S) * Sgn(F)H = F * G - SA(I, I) = F - GIf I <> N ThenFor J = L To NS = 0#For K = I To MS = S + A(K, I) * A(K, J)Next KF = S / HFor K = I To MA(K, J) = A(K, J) + F * A(K, I)Next KNext JEnd IfFor K = I To MA(K, I) = SCALE1 * A(K, I)Next KEnd IfEnd IfW(I) = SCALE1 * GG = 0#S = 0#SCALE1 = 0#If I <= M And I <> N ThenFor K = L To NSCALE1 = SCALE1 + Abs(A(I, K))Next KIf SCALE1 <> 0# ThenFor K = L To NA(I, K) = A(I, K) / SCALE1S = S + A(I, K) * A(I, K)Next KF = A(I, L)G = -Sqr(S) * Sgn(F)H = F * G - SA(I, L) = F - GFor K = L To NRV1(K) = A(I, K) / HNext KIf I <> M ThenFor J = L To MS = 0#For K = L To NS = S + A(J, K) * A(I, K)Next KFor K = L To NA(J, K) = A(J, K) + S * RV1(K)Next KNext JEnd IfFor K = L To NA(I, K) = SCALE1 * A(I, K)Next KEnd IfEnd IfIf ANORM > Abs(W(I)) + Abs(RV1(I)) ThenANORM = ANORMElseANORM = Abs(W(I)) + Abs(RV1(I))End IfNext IFor I = N To 1 Step -1If I < N ThenIf G <> 0# ThenFor J = L To NV(J, I) = (A(I, J) / A(I, L)) / GNext JFor J = L To NS = 0#For K = L To NS = S + A(I, K) * V(K, J)Next KFor K = L To NV(K, J) = V(K, J) + S * V(K, I)Next KNext JEnd IfFor J = L To NV(I, J) = 0#V(J, I) = 0#Next JEnd IfV(I, I) = 1#G = RV1(I)L = INext IFor I = N To 1 Step -1L = I + 1G = W(I)If I < N ThenFor J = L To NA(I, J) = 0#Next JEnd IfIf G <> 0# ThenG = 1# / GIf I <> N ThenFor J = L To NS = 0#For K = L To MS = S + A(K, I) * A(K, J)Next KF = (S / A(I, I)) * GFor K = I To MA(K, J) = A(K, J) + F * A(K, I)Next KNext JEnd IfFor J = I To MA(J, I) = A(J, I) * GNext JElseFor J = I To MA(J, I) = 0#Next JEnd IfA(I, I) = A(I, I) + 1#Next IFor K = N To 1 Step -1For ITS = 1 To 30For L = K To 1 Step -1NM = L - 1If Abs(RV1(L)) + ANORM = ANORM Then GoTo 2If Abs(W(NM)) + ANORM = ANORM Then GoTo 1 Next L1 C = 0#S = 1#For I = L To KF = S * RV1(I)If Abs(F) + ANORM <> ANORM ThenG = W(I)H = Sqr(F * F + G * G)W(I) = HH = 1# / HC = (G * H)S = -(F * H)For J = 1 To MY = A(J, NM)Z = A(J, I)A(J, NM) = (Y * C) + (Z * S)A(J, I) = -(Y * S) + (Z * C)Next JEnd IfNext I2 Z = W(K)If L = K ThenIf Z < 0# ThenW(K) = -ZFor J = 1 To NV(J, K) = -V(J, K)Next JEnd IfGoTo 3End IfIf ITS = 30 Then Print "No convergence in 30 iterations"X = W(L)NM = K - 1Y = W(NM)G = RV1(NM)H = RV1(K)F = ((Y - Z) * (Y + Z) + (G - H) * (G + H)) / (2# *H * Y)G = Sqr(F * F + 1#)F = ((X - Z) * (X + Z) + H * ((Y / (F + Abs(G) * Sgn(F))) - H)) / X C = 1#S = 1#For J = L To NMI = J + 1G = RV1(I)Y = W(I)H = S * GG = G * CZ = Sqr(F * F + H * H)RV1(J) = ZC = F / ZS = H / ZF = (X * C) + (G * S)G = -(X * S) + (G * C)H = Y * SY = Y * CFor NM = 1 To NX = V(NM, J)Z = V(NM, I)V(NM, J) = (X * C) + (Z * S)V(NM, I) = -(X * S) + (Z * C)Next NMZ = Sqr(F * F + H * H)W(J) = ZIf Z <> 0# ThenZ = 1# / ZC = F * ZS = H * ZEnd IfF = (C * G) + (S * Y)X = -(S * G) + (C * Y)For NM = 1 To MY = A(NM, J)Z = A(NM, I)A(NM, J) = (Y * C) + (Z * S)A(NM, I) = -(Y * S) + (Z * C)Next NMNext JRV1(L) = 0#RV1(K) = FW(K) = XNext ITS3 AAAAA = 1Next KEnd Sub。
C语言经典算法100例(1)(2007-08-15 15:09:22)C 语言编程经典 100 例【程序1】题目:有1、2、3、4个数字,能组成多少个互不一样且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){int i,j,k;printf(“\n“);for(i=1;i〈5;i++) /*以下为三重循环*/for(j=1;j〈5;j++)for (k=1;k〈5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不一样*/printf(“%d,%d,%d\n“,i,j,k);}}【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的局部按10%提成,高于10万元的局部,可可提成7.5%;20万到40万之间时,高于20万元的局部,可提成5%;40万到60万之间时高于40万元的局部,可提成3%;60万到100万之间时,高于60万元的局部,可提成1.5%,高于100万元时,超过100万元的局部按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf(“%ld“,&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i〈=100000)bonus=i*0.1;else if(i〈=200000)bonus=bonus1+(i-100000)*0.075;else if(i〈=400000)bonus=bonus2+(i-200000)*0.05;else if(i〈=600000)bonus=bonus4+(i-400000)*0.03;else if(i〈=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf(“bonus=%d“,bonus);}【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
24点游戏的算法与源程序高一7 高雅Jan 5th. 2002一、任务说明24点游戏是一个大众化的益智游戏。
任意给四张扑克牌(不包括大小王),只能够用加、减、乘、除以及适当的括号连接这四张牌,无论顺序,使计算结果为24,或者宣布根本就是无解的。
需要注意的是,每张牌必须运算,并且只能运算一次,J、Q、K可设置为11、12、13。
本程序目的就是算出一组牌的所有解(不同形式的式子算不同解),如没有则输出无解。
二、算法说明首先解决图形扑克牌的显示问题。
我选择了Qcard.dll。
运用其中的DrawCard 过程可轻松实现扑克的显示问题,在源程序中会有具体用法。
接下来是24点算法的讨论。
首先想到的是用穷举表达式的方法,然后求值。
然而,由于括号的存在,使穷举表达式并非易事。
实际上,括号的作用仅仅是提高运算的优先级而已,如果我们规定符号的优先级,一样可以达到要求。
具体来说,设四张牌为a、b、c、d,运算符为①、②、③,表达式为a ① b ② c ③。
如果强制规定①、②、③的优先顺序,就不必考虑括号问题了。
而这3个运算符的运算顺序有3!=6种,分别是:1.①②③ 2.①③② 3.②①③ 4.②③① 5.③①② 6.③②①等价的表达式分别是:1.((a①b②)c③)2.(a①b)②(c③d)3.(a①(b②c))③d4.a①((b②c)③d)5.(a①b)②(c③d)6. a①(b②(c③d))显然,2和5是相同的,因此只考虑5种情况。
这样,括号的问题就解决了。
接下来,就是生成a、b、c、d的全排列,注意去掉其中的相同排列。
去除的方法很多,比如字典排序等,我用的是另一种方法。
用循环的嵌套生成a、b、c、d的24种全排列,记录在数组中。
把每一组数当作一个四位的14进制数,把这24个数全部转化为十进制(如(6529)=6*143+5*142+2*14+9)。
这样,如果两个排列完全相同,则得到的十进制数是14相等的。
这样,通过对这些十进制的比较,就可以比较这些排列的相同情况。
常用算法源程序1、常用算法:(1)求一个数各个位上的数值程序:Option ExplicitDim x As IntegerPrivate Sub Command1_Click() '输入数据x = InputBox("请输入一个整数:")Picture1.Print "输入的数据为:"; xEnd SubPrivate Sub Command2_Click() '用除以10取余数的方法Dim y%Picture1.Print "各位中的数是:"Do While x <> 0y = x Mod 10x = x \ 10Picture1.Print yLoopEnd SubPrivate Sub Command3_Click()Dim i%Dim y As Stringy = Trim(Str(x))For i = 1 To Len(y)Picture1.Print Mid(y, Len(y) - i + 1, 1)Next iEnd Sub(2)进制转换程序:Function TranDec$(ByVal m%, ByVal r%)Dim StrDtoR$Dim iB%, mr%StrDtoR = ""Do While m <> 0mr = m Mod rm = m \ rIf mr >= 10 ThenStrDtoR = Chr(mr - 10 + 65) & StrDtoR '余数>=10 转换为A~F,最先求出的余数位数最低ElseStrDtoR = mr & StrDtoR '余数<10 直接连接,最先求出的余数位数最低End IfLoopTranDec = StrDtoREnd FunctionPrivate Sub Command1_click()Dim m0%, r0%, i%m0 = Val(Text1.Text)r0 = Val(Text2.Text)If r0 < 2 Or r0 > 16 Theni = MsgBox("输入的R进制数超出范围", vbRetryCancel)If i = vbRetry ThenText2.Text = ""Text2.SetFocusElseEndEnd IfEnd IfLabel3.Caption = "转换成" & r0 & "进制数"Text3.Text = TranDec(m0, r0)End Sub(3)n!和1--n累加程序:Option ExplicitPrivate Sub Command1_Click()Dim x%, i%, m%m = 1x = Val(InputBox("请输入一个小于等于7的整数"))For i = 1 To xm = m * iNext iText1 = Str(m)End SubPrivate Sub Command2_Click()Dim x%, i%, sum%sum = 0x = Val(InputBox("请输入一个小于等于255的整数"))For i = 1 To xsum = sum + iNext iText1 = Str(sum)End Sub(4)最大公约数最小公倍数程序:Option ExplicitPrivate Sub Command1_Click()Dim n%, n1%, m%, m1%, r%n1 = InputBox("输入n")m1 = InputBox("输入m")If m1 > n1 Then ' m>nm = m1: n = n1Elsem = n1: n = m1End IfDor = m Mod nIf r = 0 Then Exit Dom = nn = rLoopPrint m1; ","; n1; "的最大公约数为"; nPrint "最小公倍数= ", m1 * n1 / nEnd Sub(5)递归算法:求n!和最大公约数程序Option ExplicitPublic Function fac(n As Integer) As IntegerIf n = 1 Thenfac = 1Elsefac = n * fac(n - 1)End IfEnd FunctionPrivate Sub Command1_Click() ' 调用递归函数,显示出fac(4)=24 Dim n%n = Val(InputBox("请输入一个小于等于7的整数:"))Print "fac("; n; ")="; fac(n)End SubPublic Function gcd(m As Integer, n As Integer) As IntegerIf (m Mod n) = 0 Thengcd = nElsegcd = gcd(n, m Mod n)End IfEnd FunctionPrivate Sub Command2_Click()Dim n%, m%n = InputBox("输入n")m = InputBox("输入m")Print gcd(m, n)End Sub(6)水仙花数程序:Option ExplicitPrivate Sub Command1_Click()Dim i%For i = 100 To 999If (i \ 100) ^ 3 + ((i - (i \ 100) * 100) \ 10) ^ 3 + (i Mod 10) ^ 3 = i Then Print iNext iEnd Sub(7)加密解密程序:Dim strInput$, Code$, Record$, c As String * 1Dim i%, length%, iAsc%Private Sub cmdcls_Click() '清屏txtCode.Text = ""txtRecode.Text = ""txtInput.Text = ""End SubPrivate Sub cmdcode_Click() '加密Dim strInput$, Code$, Record$, c As String * 1Dim i%, length%, iAsc%strInput = txtInput.Textlength = Len(RTrim(strInput)) '去掉字符串右边的空格,求真正的长度Code = ""For i = 1 To lengthc = Mid$(strInput, i, 1) '取第i个字符Select Case cCase "A" To "Z" '大写字母加序数5加密iAsc = Asc(c) + 5If iAsc > Asc("Z") Then iAsc = iAsc - 26 '加密后字母超过ZCode = Code + Chr$(iAsc)Case "a" To "z"iAsc = Asc(c) + 5 '小写字母加序数5加密If iAsc > Asc("z") Then iAsc = iAsc - 26Code = Code + Chr$(iAsc)Case Else ‘第i个字符为其它字符时不加密,与加密字符串的前i-1个字符连接Code = Code + cEnd SelectNext itxtCode.Text = Code '显示加密后的字符串End SubPrivate Sub cmdrecode_Click() '解密与加密正好逆处理Code = txtCode.Texti = 1recode = ""length = Len(RTrim(Code)) '若还未加密,不能解密,出错If length = 0 Then J = MsgBox("先加密再解密", 48, "解密出错")Do While (i <= length)c = Mid$(Code, i, 1)If (c >= "A" And c <= "Z") TheniAsc = Asc(c) - 5If iAsc < Asc("A") Then iAsc = iAsc + 26recode = Left$(recode, i - 1) + Chr$(iAsc)ElseIf (c >= "a" And c <= "z") TheniAsc = Asc(c) - 5If iAsc < Asc("a") Then iAsc = iAsc + 26recode = Left$(recode, i - 1) + Chr$(iAsc)Elserecode = Left$(recode, i - 1) + cEnd Ifi = i + 1LooptxtRecode.Text = recodeEnd Sub2、数组的常用算法:排序查找增加删除:(1)求元素最大值最小值及其下标程序:Option ExplicitPrivate Sub Command1_Click()Dim Max As Integer, iMax As Integer, i As IntegerDim ia(1 To 10) As IntegerFor i = 1 To 10ia(i) = Int(Rnd * 100)Print ia(i);Next iMax = ia(1): iMax = 1For i = 2 To 10If ia(i) > Max ThenMax = ia(i)iMax = iEnd IfNext iPrintPrint "最大元素是"; Max; "下标是"; iMaxEnd SubPrivate Sub Command2_Click()Dim Min As Integer, iMin As Integer, i As IntegerDim ia(1 To 10) As IntegerFor i = 1 To 10ia(i) = Int(Rnd * 100)Print ia(i);Next iMin = ia(1): iMin = 1For i = 2 To 10If ia(i) < Min ThenMin = ia(i)iMin = iEnd IfNext iPrintPrint "最大元素是"; Min; "下标是"; iMinEnd Sub(2)选择法排序程序:Option Base 1Private Sub Command1_Click()Dim iA(1 To 10)n = 6iA(1) = 8: iA(2) = 6: iA(3) = 9: iA(4) = 3: iA(5) = 2: iA(6) = 7For i = 1 To n - 1 ' 进行n-1遍比较iMin = i ' 对第i遍比较时,初始假定第i个元素最小For j = i + 1 To n ' 在数组i~n个元素中选最小元素的下标If iA(j) < iA(iMin) Then iMin = jNext jt = iA(i) 'i~n个元素中选出的最小元素与第i个元素交换iA(i) = iA(iMin)iA(iMin) = tFor k = 1 To nPrint iA(k);Next kPrintNext iEnd Sub(3)冒泡法排序程序:Option Base 1Private Sub Command1_Click()Dim iA(1 To 10)n = 6iA(1) = 8: iA(2) = 6: iA(3) = 9: iA(4) = 3: iA(5) = 2: iA(6) = 7Print "冒泡法排序数据变化过程"Print " 8, 6, 9, 3, 2, 7"Print "-----------------------------"For i = 1 To n - 1 ' 进行n-1遍比较' 对第i遍比较时,初始假定第i个元素最小For j = n To i + 1 Step -1 ' 在数组i~n个元素中选最小元素的下标If iA(j) < iA(j - 1) Thent = iA(j)iA(j) = iA(j - 1)iA(j - 1) = tEnd IfNext jPrint "i="; i; Spc(i * 3 - 3);For k = i To nPrint iA(k);Next kPrintNext iEnd Sub(4)数组元素交换位置程序:Option ExplicitPrivate Sub Command1_Click()Dim i As Integer, t As IntegerDim a(1 To 10) As IntegerFor i = 1 To 10a(i) = Int(Rnd * 100)Print " a("; i; ")="; a(i);Next iPrintFor i = 1 To 10 \ 2t = a(i)a(i) = a(10 - i + 1)a(10 - i + 1) = tNext iFor i = 1 To 10Print " a("; i; ")="; a(i);Next iPrintEnd Sub(5)二分法查找程序:Sub birsearch(a(), ByVal low%, ByVal high%, ByVal key, index%)Dim mid As Integermid = (low + high) \ 2 ' 取查找区间的中点If a(mid) = key Thenindex = mid ' 查找到,返回查找到的下标Exit SubElseIf low > high Then ' 二分法查找区间无元素,查找不到index = -1Exit SubEnd IfIf key < a(mid) Then ' 查找区间在上半部Elselow = mid + 1 ' 查找区间在下半部End IfCall birsearch(a, low, high, key, index) ' 递归调用查找函数End Sub'主调程序调用:Private Sub Command1_Click()Dim b() As Variantb = Array(5, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92)Call birsearch(b, LBound(b), UBound(b), 21, n%)Print nEnd Sub(6)顺序查找程序:Dim b() As VariantPublic Sub Search(a(), ByVal key, index%)Dim i%For i = LBound(a) To UBound(a)If key = a(i) Thenindex = iExit SubEnd IfNext iindex = -1End SubPrivate Sub Command1_Click()b = Array(1, 3, 5, 7, 9, 2, 4)k = Val(InputBox("指定数据1-5,7,9"))Call Search(b, k, n%)Print nEnd Sub(7)数组元素的插入和删除程序:Option Base 1Dim a%(1 To 10)Private Sub Command1_Click()Dim i%, k%For i = 1 To 9 ' 通过程序自动形成有规律的数组a(i) = (i - 1) * 3 + 1Print a(i);Next iFor k = 1 To 9 ' 查找欲插入数14在数组中的位置If 14 < a(k) Then Exit For ' 找到插入的位置下标为kNext kFor i = 9 To k Step -1 ' 从最后元素开始往后移,腾出位置Next ia(k) = 14 ' 数插入PrintFor i = 1 To 10If a(i) = 14 Then Form1.FontBold = True Else Form1.FontBold = FalsePrint a(i);Next iEnd SubPrivate Sub Command2_Click()For k = 1 To 9 ' 查找欲删除数14在数组中的位置If 14 = a(k) Then Exit For ' 找到插入的位置下标为kNext kFor i = k To 9 ' 从最后元素开始往前移,删除元素14a(i) = a(i + 1)Next ia(i) = 0PrintFor i = 1 To 9If a(i) = 14 Then Form1.FontBold = True Else Form1.FontBold = FalsePrint a(i);Next iPrintEnd Sub(8)统计字母在文本中出现的次数程序:Private Sub Command1_Click()Dim a(1 To 26) As Integer, c As String * 1le = Len(Text1) '求字符串的长度For I = 1 To lec = UCase(Mid(Text1, I, 1)) '取一个字符,转换成大写If c >= "A" And c <= "Z" Thenj = Asc(c) - 65 + 1 '将A~Z大写字母转换成1~26的下标a(j) = a(j) + 1 '对应数组元素加1End IfNext IFor j = 1 To 26 '输出字母及其出现的次数If a(j) > 0 Then Picture1.Print " "; Chr$(j + 64); "="; a(j);Next jEnd Sub(9)求矩阵的转置程序:Option ExplicitDim a(5, 5) As IntegerPrivate Sub Command1_Click()Dim i%, j%For i = 0 To 5For j = 0 To 5a(i, j) = Int(Rnd * 90 + 10)Picture1.Print a(i, j);Next jPicture1.PrintNext iEnd SubPrivate Sub Command2_Click()Dim t%, i%, j%For i = 0 To 5For j = 0 To it = a(i, j): a(i, j) = a(j, i): a(j, i) = tNext jNext iFor i = 0 To 5For j = 0 To 5Picture2.Print a(i, j);Next jPicture2.PrintNext iEnd Sub(10)求矩阵的对角线元素之和程序:Option ExplicitDim a(5, 5) As IntegerPrivate Sub Command1_Click()Dim i%, j%RandomizeFor i = 0 To 5For j = 0 To 5a(i, j) = Int(Rnd * 90 + 10)Print a(i, j);Next jPrintNext iEnd SubPrivate Sub Command2_Click()Dim i%, j%, sum1%, sum2%For i = 0 To 5sum1 = sum1 + a(i, i)sum2 = sum2 + a(i, 5 - i)Next iPrint "对角线元素和="; sum1Print "副对角线元素和="; sum2End Sub(11)求素数程序:Private Sub Command2_Click() '单击命令按钮运行该事件函数'使用状态变量Dim i As Integer, m As Integer, tag As Booleanj = 0For m = 2 To 100 ' 对100以内的每个数判断其是否为素数tag = TrueFor i = 2 To m - 1If (m Mod i) = 0 Then tag = False 'm能被i整除,该m不是素数Next iIf tag ThenPrint m; " "; 'm不能被i=2~m-1整除,m是素数,显示j = j + 1If j = 10 Then j = 0: PrintEnd IfNext mEnd SubPrivate Sub Command1_Click()'使用GoTo语句j = 0For m = 2 To 100For i = 2 To m - 1If (m Mod i) = 0 Then GoTo NotNextMNext iPrint m; " ";j = j + 1If j = 10 Then j = 0: PrintNotNextM:Next mEnd Sub(12)裴波那切数列程序:Option ExplicitPrivate Sub Command1_Click()Dim a(1 To 30) As Long, i As Integera(1) = 1: a(2) = 1Print Tab(1); a(1); Tab(10); a(2);For i = 3 To 30a(i) = a(i - 1) + a(i - 2)If i Mod 5 = 0 ThenPrint Tab(41); a(i)ElsePrint Tab(((i Mod 5) - 1) * 10); a(i);End IfNext iEnd Sub(13)杨辉三角形程序:Option ExplicitOption Base 1Private Sub Command1_Click()Dim a(8, 8) As Integer, i As Integer, j As IntegerFor i = 1 To 8a(i, 1) = 1: a(i, i) = 1Next iFor i = 3 To 8For j = 2 To i - 1a(i, j) = a(i - 1, j - 1) + a(i - 1, j)Next jNext iFor i = 1 To 8For j = 1 To iPrint Tab(j * 8); a(i, j);Next jPrintNext iEnd Sub。