梦龙_C语言作业11

一.填空题(共4题,20.0分)

1、插入法

5.5 下面程序使用插入法在输入的同时升序排序,请补充①②③三处空缺。

在这里插入图片描述

第一空:
break
第二空:
i+1
第三空:
i
源码
#include<stdio.h>
typedef int Intarry[10];

void insertx(Intarry a,int n,int x)
{
	int i;
	for(i=n-1;i>=0;i--)
		if(a[i]>x)	a[i+1] = a[i];
		else break; 
	a[i+1]=x;
}

void main()
{
	Intarry s;
	int i;
	scanf("%d",&s[0]);
	for(i=1;i<=9;i++)
	{
		scanf("%d",&s[i]);
		insertx(s,i,s[i]);
	}
	for(i=0;i<=9;i++)
		printf("%d ",s[i]);
}

2、冒泡法

5.17 阅读下面程序并填空:

在这里插入图片描述

第一空:
0
第二空:
冒泡
第三空:
源码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
	int a[10];
	int i,j,n,t;
	n=10;
	
	srand((unsigned)time(NULL));
	
	for(i=0;i<n;i++)	a[i] = rand()%101;

	for(i=0;i<n-1;i++)
		for(j=0;j<n-1-i;j++)
			if(a[j]>a[j+1])
			{ t=a[j];a[j]=a[j+1];a[j+1]=t;}
		
	for(i=0;i<n;i++)	printf("%d ",a[i]);
}

3、插入法

5.18 阅读下面程序并填空:

在这里插入图片描述

第一空:
j>=0
第二空:
插入
第三空:
源码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
	int a[10];
	int i,j,n,t;
	n=10;
	
	srand((unsigned)time(NULL));
	
	for(i=0;i<n;i++)	a[i] = rand()%101;

	for(i=0;i<n-1;i++)
	{
		t=a[i+1];
		for(j=i; j>=0&&t>a[j];j--)
			a[j+1]=a[j];
		a[j+1]=t;
	}
	
	for(i=0;i<n;i++)	printf("%d ",a[i]);
}

4、冒泡法

5.19 阅读下面程序并填空:

在这里插入图片描述

第一空:
i+1
第二空:
冒泡
第三空:
源码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
	int a[10];
	int i,j,n,t;
	n=10;
	
	srand((unsigned)time(NULL));
	
	for(i=0;i<n;i++)	a[i] = rand()%101;

	for(i=0;i<n-1;i++)
	{
		for(j=i+1; j<=n-1;j++)
			if(a[i]>a[j])
			{ t=a[i];a[i]=a[j];a[j]=t;}
	}
	
	for(i=0;i<n;i++)	printf("%d ",a[i]);
}

二.简答题(共1题,5.0分)

1、互异随机数

11-1 请产生10个互不相同的[0,100]之间的随机数存放到数组中并显示,显示时每个数后跟1个空格。(不要有任何提示文字,结果后面不要回车)

(5.0分)

参考答案
/*
时间:2021-5-20
作者:童话
环境:Win 10 、 VC++ 6
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
	int a[10];
	int i,j,t;
	int flag;
	
	srand((unsigned)time(NULL));
		
	i=0;
	while(i<10)
	{
		t = rand()%101;
		flag = 1;
		for(j=0;j<=i;j++)
		{
			if(t==a[j])
				flag = 0;
		}
		if(flag)
		{
			a[i] = t;
			i++;
		}
	}

	for(i=0;i<10;i++)
		printf("%d ",a[i]);
}

三.程序题(共2题,10.0分)

1、排序、二分法查找元素

5.7 请编程:输入10个整数到一数组,按升序排序,再输入一整数,然后使用二分查找法查找该数是否存在于数组中,若存在返回查找时比较的次数,若不存在返回0。例如,输入1 2 3 4 5 6 7 8 9 10,再输入10,显示结果4。若输入3 2 7 8 9 6 1 5 4 10,再输入5,返回结果1。(不显示任何提示文字,显示最后的结果不回车)

参考答案

×

/*
时间:2021-5-20
作者:童话
环境:Win 10 、 VC++ 6
*/
#include<stdio.h>
int dichotomy(int* i,int j,int k)
{	
	int a=0,b=j-1,c,d=0;
	while(a<=b)
	{
		d++;
		c = (a+b)/2;
		if(k == i[c]) return d;
		else if(k < i[c]) b=c-1;
		else a = c + 1;
	}
	return 0;
}

void main()
{
	int a[10],i,j,k,t,n=10;
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=0;i<n-1;i++)
		for(j=0;j<n-1-i;j++)
			if(a[j]>a[j+1])	{t=a[j];a[j]=a[j+1];a[j+1]=t;}
	scanf("%d",&t);
	if(dichotomy(a,n,t))	printf("%d",dichotomy(a,n,t));
}

/*
时间:2021-5-20
作者:童话
环境:Win 10 、 VC++ 6
*/
#include<stdio.h>

int dichotomy(int* array,int n,int num)
{	
	int left  = 0;
	int right = n-1;
	int count = 0;
	int midde;

	while(left<=right)
	{
		count++;
		midde = (left+right)/2;

		if(num == array[midde])
		{
			return count;
		}
		else if(num < array[midde])
		{
			right = midde-1;
		}
		else
		{
			left = midde + 1;
		}
	}
	return 0;
}

void main()
{
	int a[10];
	int i,j,t;
	int n=10;

	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}

	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(a[j]>a[j+1])
			{ 
				t      = a[j];
				a[j]   = a[j+1];
				a[j+1] = t;
			}
		}
	}

	scanf("%d",&t);

	if(dichotomy(a,n,t))
	{
		printf("%d",dichotomy(a,n,t));
	}
}

2、月份

5.16 定义12个成员的整型数组a和b,a的成员按顺序保存了1到12月每个月的天数,b的成员按顺序保存1到12月的以前各个月的累计天数,下标为0的成员中保存了1月之前的天数0,下标为11的成员中保存了12月之前的11个月的累计天数。请编程,输入1个年份,根据年份修改a的2月份的天数,然后根据a计算出数组b并显示b,每个数据显示时后跟1个空格。(不要有任何提示文字,结果最后不用回车)

参考答案
/*
时间:2021-5-20
作者:童话
环境:Win 10 、 VC++ 6
*/
#include<stdio.h>

void main()
{
	int a[12] =   {31,28,31,30,  31,30,  31,  31,  30,  31,  30,  31};
	int b[12];
	int year;
	int i;

	scanf("%d",&year);

	if((year%400==0) || (year%4==0&&year%100!=0))
		a[1] = 29;

	b[0] = 0;
	printf("%d ",b[0]);
	for(i=1;i<12;i++)
	{
		b[i] = b[i-1] + a[i-1];
		printf("%d ",b[i]);
	}
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

童话与云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值