简单c语言编程题?
查找数值 20 是否在数组中,若在,给出数组元素的下标;若不在,
则把 20 插入数组。
2.定义一个包含 15 个元素的整型数组,给 10 个数组元素赋值;
对数组元素按从小到大顺序排序,查找数值 20 是否在数组中,若在,
给出数组元素的下标;若不在,则把 20 插入数组相应位置。 展开
根据题意,程序分三个主要功能:1、从数组中查找一个整数。2、向数组插入一个整数。3、数组升序排列。
一、其中查找功能,数组无序或升序对应二种写法(直接遍历比较、二分法)。
对于升序数组用二分法查找更快(本案例只有10个数,如数字量大则效果更明显)。
二、数组插入功能,将插入位置及其往后的元素均后移一位(数组大小需多预留1位)。
另外:重复的代码段要写成独立函数,避免代码冗余。
下面是代码(数值我用的随机数填充,你想手动输入自添scanf函数):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 10//最大整数个数
void input(int nums[],int len);//输入
void showNum(int nums[],int len);// 打印数组
void px(int nums[],int len);//排序
int checkNum(int nums[],int len,int n);//检查n是否存在于无序数组num,是返回下标,否将n插入数组并返回-1。
int checkNumPX(int nums[],int len,int n);//检查n是否存在于升序数组num,是返回下标,否将n插入对应位置并返回-1。
void move1(int nums[],int len,int inx);//从下标inx开始的元素,全部往后移动1位(inx下标空出来给插入)
int main()
{
int nums[M+1],len=M+1,inx,n;//预留一位给插入
srand(time(NULL));
input(nums,len-1);
showNum(nums,len-1);
printf("请输入要查找的数n:"),scanf("%d",&n);
inx=checkNum(nums,len-1,n);
if(inx!=-1) printf("存在!下标是%d\n",inx);
if(inx==-1) printf("不存在!已在数组末尾插入,插入后的数组为:\n"),showNum(nums,len);
printf("\n-----------------------下面是问题2-------------------------------\n");
input(nums,len-1);
px(nums,len);
showNum(nums,len-1);
printf("请输入要查找的数n:"),scanf("%d",&n);
inx=checkNumPX(nums,len-1,n);
if(inx!=-1) printf("存在!下标是%d\n",inx);
if(inx==-1) printf("不存在!已在插入数组对应的位置\n"),showNum(nums,len);
return 0;
}
void input(int nums[],int len)
{
int i;
for(i=0,printf("生成%d个2位随机整数......\n",len);i<len;nums[i]=rand()%90+10,i++);//10~99随机数
}
void showNum(int nums[],int len)
{
int i;
for(i=0,printf("当前数组元素为:\n");i<len;printf("%d ",nums[i]),i++);
printf("\n");
}
void px(int nums[],int len)
{
int i,j;
for(i=0,printf("对数组进行升序排序......\n");i<len;i++)
for(j=i+1;j<len;j++)
if(nums[i]>nums[j]) nums[i]^=nums[j],nums[j]^=nums[i],nums[i]^=nums[j];
}
int checkNum(int nums[],int len,int n)
{
int i;
for(i=0,printf("数组中按元素顺序查找%d......\n",n);i<len;i++)
if(nums[i]==n) return i;
if(i==len) nums[len]=n;
return -1;
}
int checkNumPX(int nums[],int len,int n)
{
int bInx=0,eInx=len-1,mInx;
printf("对升序数组按二分法查找%d......\n",n);
while(eInx-bInx>1)//当序列区间元素大于2个时,取中间值
{
mInx=bInx+(eInx-bInx)/2;
if(nums[mInx]==n) return mInx;
if(n<nums[mInx]) eInx=mInx;//n比中间值小,取前半区间中间继续比较
if(n>nums[mInx]) bInx=mInx;//n比中间值大,取后半区间中间继续比较
}
if(nums[eInx]==n) return eInx;
if(nums[bInx]==n) return bInx;
if(n<nums[bInx]) move1(nums,len+1,bInx),nums[bInx]=n;
if(n>nums[bInx] && n<nums[eInx]) move1(nums,len+1,eInx),nums[eInx]=n;
if(n>nums[eInx]) move1(nums,len+1,eInx+1),nums[eInx+1]=n;
return -1;
}
void move1(int nums[],int len,int inx)
{
int i;
for(i=len-1;i>inx;nums[i]=nums[i-1],i--);
}