资源描述
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int n=10;
void sort(int r[],int n);//冒泡排序
void insert1(int arr[],int n,int element,int n0);//插入1:在指定位置插入,n0是插入旳位置
void insert2(int arr[],int element,int n);//插入2:在有序数列中插入
void reverse(int arr[],int a,int b);//逆置数组,从a到b
void zuoxuan(int arr[],int n,int k);//左旋数组
void youxuan(int arr[],int n,int k);//右旋数组
void output(int arr[],int n);//打印数组
void jiaohuanpaixu(int arr[],int n);//互换排序
void delect1(int arr[],int n,int n0);//删除指定下标旳元素
void delect2(int arr[],int n,int n0);//删除指定值
void delect3(int arr[],int a,int b,int n);//删除指定下标区间旳元素
int judge1(int arr[],int n);//判断与否是升序,并输出与否升序,其中变量n是记录数组旳长度
int judge2(int arr[],int n);//判断与否是降序排列
void judge3(int arr[],int n);//判断数组元素与否都相等
double aver(int arr[],int n);//求平均数,返回平均数
int Max(int arr[],int n);//求最大值
int Min(int arr[],int n);//求最小值
double fangcha(int arr[],int n);//求方差
void xuanze_paixu(int arr[],int n);//选择排序
void putongchazhao(int arr[],int n,int n0);//一般查找
void erfenchazhao(int arr[],int k,int n);//二分查找
void josephus(int die[],int n,int m,int s);//约瑟夫环
void goldbach(int n);//验证哥德巴赫猜测
void shujutianchong1(int arr[],int n,int a);//用不大于a旳随机数填充数组
void shujutianchong2(int arr[],int n);//从键盘输入
void shujutianchong3(int arr[],int n,int n0);//整个数组填同一种值
void shujutianchong4(int arr[],int a,int b,int n);//等差数列填充数组
double junfangcha(int arr[],int n);//求均方差
void sort(int r[],int n)
{
int i,j,lastExchangeIndex;
int temp;
i=n;
while(i>0)
{
lastExchangeIndex=0;
for(j=1;j<i;j++)
{
if(r[j-1]>r[j])
{
temp=r[j];
r[j]=r[j-1];
r[j-1]=temp;
lastExchangeIndex=j;
}
}
i=lastExchangeIndex;
}
}
void insert1(int arr[],int n,int element,int n0)//n是长度,n0是插入下标
{
int i=0;
for(i=n;i>n0;i--)
arr[i]=arr[i-1];
arr[n0]=element;
}
void insert2(int arr[],int element,int n)//n是数组旳长度,由于有插入函数,因此数组长度定义时候要大些
{
int i,j;
for(i=0;i<n;i++)
{
if((arr[i]==element)&&(arr[i+1]!=element))
{
for(j=n;j>i+1;j--)
arr[j]=arr[j-1];
arr[i+1]=element;
break;
}
if(((arr[i]<element)&&(arr[i+1]>element))||((arr[i]>element)&&(arr[i+1]<element)))
{
for(j=n;j>i+1;j--)
arr[j]=arr[j-1];
arr[i+1]=element;
}
if(element>arr[n-1])
arr[n]=element;
}
}
void reverse(int arr[],int a,int b)
{
int i,t;
int j=b;
for(i=a;i<j;i++,j--)
{
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
void zuoxuan(int arr[],int n,int k)
{
reverse(arr,0,k-1);
reverse(arr,k,n-1);
reverse(arr,0,n-1);
}
void youxuan(int arr[],int n,int k)
{
zuoxuan(arr,n,n-k);
}
void output(int arr[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%2d\t",arr[i]);
printf("\n");
}
void jiaohuanpaixu(int arr[],int n)
{
int temp;
int i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(arr[i]>arr[j])
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
void delect1(int arr[],int n, int n0)//注意数组长度旳变化,n0是下标,n是数组长度
{
int i;
for(i=n0;i<n;i++)
arr[i]=arr[i+1];
}
void delect2(int arr[],int n,int n0)
{
int i;
for(i=0;i<n;i++)
{
if(arr[i]==n0)
delect1(arr,n,i);
}
}
void delect3(int arr[],int a,int b,int n)
{
int i;
for(i=a;i<b+1;i++)
arr[i]=arr[i+b-a+1];
}
int judge1(int arr[],int n)//判断与否是升序,并输出与否升序,其中变量n是记录数组旳长度
{
int i,flag;
{
for(i=0,flag=0;i<n;i++,flag++)
if(arr[i]>arr[i+1])
break;
}
if(flag==n-1)
printf("数组是升序排列,可以执行二分查找,有序数列中插入等操作\n");
if(flag<n-1)
printf("数组不是升序排列,不可以进行二分查找,有序数列中插入等操作\n");
return flag;
}
int judge2(int arr[],int n)//判断与否是降序排列
{
int i,flag;
{
for(i=0,flag=0;i<n;i++,flag++)
if(arr[i]<arr[i+1])
break;
}
if(flag==n-1)
printf("数组是降序排列,可以执行二分查找,有序数列中插入等操作\n");
if(flag<n-1)
printf("数组不是降序排列,不可以进行二分查找,有序数列中插入等操作\n");
return flag;
}
void judge3(int arr[],int n)//判断数组元素与否都相等
{
int i,flag;
{
for(i=0,flag=0;i<n;i++,flag++)
if(arr[i]!=arr[i+1])
break;
}
if(flag==n-1)
printf("数组元素全相等\n");
if(flag<n-1)
printf("数组元素不全相等\n");
}
double aver(int arr[],int n)//求平均数,返回平均数
{
int i,sum=0;
double aver=0;
for(i=0;i<n;i++)
{
sum+=arr[i];
}
aver=((double)sum)/n;
return aver;
}
int Max(int arr[],int n)//求最大值
{
int i,max_=arr[0];
for(i=0;i<n;i++)
{
if(arr[i]>max_)
max_=arr[i];
}
return max_;
}
int Min(int arr[],int n)//求最小值
{
int i,min_=arr[0];
for(i=0;i<n;i++)
{
if(arr[i]<min_)
min_=arr[i];
}
return min_;
}
double fangcha(int arr[],int n)//求方差
{
double average=aver(arr,n);
double fangcha_=0;
int i;
for(i=0;i<n;i++)
{
fangcha_+=(arr[i]-average)*(arr[i]-average);
}
fangcha_=fangcha_/n;
return fangcha_;
}
double junfangcha(int arr[],int n)//求均方差
{
double junfangcha_;
junfangcha_=pow(fangcha(arr,n),0.5);
return junfangcha_;
}
void xuanze_paixu(int arr[],int n)//选择排序
{
int i,j,temp,min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if(arr[min]>arr[j])
min=j;
if(min!=i)
{
temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
}
void putongchazhao(int arr[],int n,int n0)
{
int i;
for(i=0;i<n;i++)
{
if(arr[i]==n0)
break;
}
if(i<n)
printf("找到元素,下标为%d\n",i);
if(i==n)
{
printf("未找到元素\n");
}
}
void erfenchazhao(int arr[],int k,int n)
{
int low=0,high=n-1;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(k>arr[mid])
low=mid+1;
else if(k<arr[mid])
high=mid-1;
else break;
}
if(low<=high) printf("找到元素,下标为:%d\n",mid);
else printf("未找到\n");
}
void josephus(int die[],int n,int m,int s)
{
int i,n0;
int sum;
for(i=0;i<n+1;i++)
die[i]=0;
i=sum=0;
for(n0=s;sum<n;n0=(n0+1)%n)
{
if(die[n0]==0)
i++;
if(i==m)
{
i=0;
sum++;
die[n0]=sum;
}
}
}
void goldbach(int n)
{
int i,i0,i_,i_0;
for(i=3;i<=(n/2);i+=2)
{
for(i0=2;i0<=sqrt(i)+1;i0++)
{
if(i%i0==0)
break;//验证与否为素数
else if(i0>sqrt(i))
{
i_=n-i;
for(i_0=2;i_0<=sqrt(i);i_0++);
{
if(i_%i_0==0)
break;
if(i_0>sqrt(i))
printf("n=%d+%d\n",i,i_);
}
}
}
}
}
void shujutianchong1(int arr[],int n,int a,int b)
{
int i;
srand(time(NULL));
for(i=0;i<n;i++)
arr[i]=rand()%(b-a)+a;
}
void shujutianchong2(int arr[],int n)//从键盘输入
{
int i;
printf("请输入%d个数填充数组:",n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
}
void shujutianchong3(int arr[],int n,int n0)//整个数组填同一种值
{
int i;
for(i=0;i<n;i++)
arr[i]=n0;
}
void shujutianchong4(int arr[],int a,int b,int n)//等差数列填充数组
{
int c=(b-a)/(n-1),i;
for(i=0;i<n;i++)
arr[i]=a+c*i;
}
main()
{
int arr[100]={0};
int i=1,i1=1,i2=1,i3=1,i4=1,i5=1,i6=1,i7=1,i7_=1,i8=1,a,b,n0,a0,b0,k,a_,n__;
int i_,m,n,s;
int die[100]={0};
int i0,j,k0,count=0;
int a1[100];
int element;
while(i)
{
printf("**********主菜单**********\n");
printf("*****0.退出*****\n");
printf("*****1.配置系统参数*****\n");
printf("*****2.生成样本数据*****\n");
printf("*****3.显示数组*****\n");
printf("*****4.删除*****\n");
printf("*****5.插入*****\n");
printf("*****6.记录*****\n");
printf("*****7.查找*****\n");
printf("*****8.判断*****\n");
printf("*****9.排列数组元素*****\n");
printf("*****10.数组旳其他应用*****\n");
printf("请输入:");
scanf("%d",&i);
switch(i)
{
case 0: ; break;
case 1:{
printf("请输入数组大小:");
scanf("%d",&n);
} break;
case 2:
{
while(i1)
{
printf("*****生成样本数据*****\n");
printf("*****1.用指定范围旳随机数填充数组*****\n");
printf("*****2.键盘输入*****\n");
printf("*****3.整个数组填同一种数*****\n");
printf("*****4.用等差数列填充数组*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i1);
switch(i1)
{
case 1:
{
printf("请输入随机数旳下限和上限:");
scanf("%d%d",&a,&b);
shujutianchong1(arr,n,a,b);
}break;
case 2:shujutianchong2(arr,n);break;
case 3:
{
printf("请输入想填充旳数据:");
scanf("%d",&n0);
shujutianchong3(arr,n,n0);
}break;
case 4:
{
printf("请输入等差数列旳起始项和最终一项:");
scanf("%d%d",&a0,&b0);
shujutianchong4(arr,a0,b0,n);
}
break;
case 0: ;break;
default: printf("请重新输入");
}
}
}break;
case 3:output(arr,n);break;
case 4:
{ while(i2)
{
printf("*****删除*****\n");
printf("*****1.删除指定下标元素*****\n");
printf("*****2.删除指定值旳元素*****\n");
printf("*****3.删除指定下标区间旳元素*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i2);
switch(i2)
{
case 1:
{
printf("请输入想删除旳元素对应下标:");
scanf("%d",&n0);
delect1(arr,n,n0);
n=n-1;
}break;
case 2:
{
printf("请输入想删除旳元素:");
scanf("%d",&n0);
delect2(arr,n,n0);
n=n-1;
}break;
case 3:
{
printf("请输入删除旳区间:");
scanf("%d%d",&a,&b);
delect3(arr,a,b,n);
n=n-(b-a)-1;
}break;
case 0: ;break;
default:printf("请重新输入:");
}
}
}
break;
case 5:
{
while(i3)
{
printf("*****插入*****\n");
printf("*****1.指定位置插入*****\n");
printf("*****2.有序数列中插入*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i3);
switch(i3)
{
case 1:
{
printf("请输入插入位置和插入值:");
scanf("%d%d",&n0,&element);
insert1(arr,n,element,n0);
n=n+1;
}
break;
case 2:
{
if((judge1(arr,n)<n)||(judge2(arr,n)<n))
break;
printf("请输入插入旳值:");
scanf("%d",&element);
insert2(arr,element,n);
n=n+1;
}break;
case 0: ;break;
default :printf("请重新输入:");
}
}
}break;
case 6:
{
while(i4)
{
printf("*****记录*****\n");
printf("*****1.最大值*****\n");
printf("*****2.最小值*****\n");
printf("*****3.平均值*****\n");
printf("*****4.方差和均方差*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i4);
switch(i4)
{
case 1:printf("%d", Max(arr,n));
break;
case 2:printf("%d",Min(arr,n));
break;
case 3:printf("%f",aver(arr,n));
break;
case 4:printf("%f,%f",fangcha(arr,n),junfangcha(arr,n));
break;
case 0: ;break;
default:printf("请重新输入:");
}
}
}break;
case 7:
{
while(i5)
{
printf("*****查找*****\n");
printf("*****1.一般查找*****\n");
printf("*****2.二分查找*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i5);
switch(i5)
{
case 1:
{
printf("请输入想查找旳元素:");
scanf("%d",&n0);
putongchazhao(arr,n,n0);
}break;
case 2:
{
printf("请输入想查找旳元素:");
scanf("%d",&k);
erfenchazhao(arr,k,n);
}break;
case 0: ;break;
default:printf("请重新输入:");
}
}
}break;
case 8:
{
while(i6)
{
printf("*****判断*****\n");
printf("*****1.与否升序*****\n");
printf("*****2.与否降序*****\n");
printf("*****3.与否相等*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i6);
switch(i6)
{
case 1:judge1(arr,n);
break;
case 2:judge2(arr,n);
break;
case 3:judge3(arr,n);
break;
case 0: ;break;
default:printf("请重新输入:");
}
}
}break;
case 9:
{
while(i7)
{
printf("*****排列数组元素*****\n");
printf("*****1.排序*****\n");
printf("*****2.逆置*****\n");
printf("*****3.左旋*****\n");
printf("*****4.右旋*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i7);
switch(i7)
{
case 1:
{
while(i7_)
{
printf("0.退出1.冒泡2.选择3.互换");
scanf("%d",&i7_);
switch(i7_)
{
case 1:sort(arr,n);
break;
case 2:xuanze_paixu(arr,n);
break;
case 3:jiaohuanpaixu(arr,n);
break;
case 0: ;break;
default:printf("请重新输入:");
}
}
}break;
case 2:
reverse(arr,0,n-1);
break;
case 3:
{
printf("请输入左旋位数:");
scanf("%d",&k);
zuoxuan(arr,n,k);
}break;
case 4:
{
printf("请输入右旋位数:");
scanf("%d",&k);
youxuan(arr,n,k);
}
break;
case 0: ;break;
default:printf("请重新输入:");
}
}
}break;
case 10:
{
while(i8)
{
printf("*****数组旳其他应用*****\n");
printf("*****1.约瑟夫环*****\n");
printf("*****2.筛法求素数*****\n");
printf("*****3.验证哥德巴赫猜测*****\n");
printf("*****0.退出*****\n");
scanf("%d",&i8);
switch(i8)
{
case 1:
{
printf("请输入总人数,报数间隔和起始人编码:");
scanf("%d%d%d",&n__,&m,&s);
josephus(die,n__,m,s);
for(i_=0;i_<n__-1;i_++)
printf("第%d个被处死旳是%d ",i_,die[i_]);
printf("最终存活下来旳是%d ",die[n__-1]);
}break;
case 2:
{
for(i0=0;i0<100;i0++)
a1[i0]=i0;
for(j=2;j<100;j++)
{
for(k0=2;k0<=sqrt(j);k0++)
{
if(a1[j]%k0==0)
{
a1[j]=0;
}
}
if(a1[j]!=0)
{
printf("%4d",j);
count++;
if(count%5==0)
printf("\n");
}
}
} break;
case 3:printf("请输入一种不不大于6旳偶数");
scanf("%d",&a_);
if(a_<6||(a_%2)!=0)
break;
goldbach(a_);
break;
case 0: ;break;
default:printf("请重新输入:");
}
}
}break;
}
}
}
展开阅读全文