C语言 DLUT 作业七

本文档展示了C语言编程中的多种算法实现,包括插入排序、二分查找(迭代与递归)、二进制转换、哥德巴赫猜想验证、找最大数、指数幂计算、完数判断、矩阵操作和日期计算器。通过这些实例,读者可以深入理解函数的运用和算法设计。
摘要由CSDN通过智能技术生成

C语言 DLUT 作业七

本次作业重点学会使用函数,以更好的设计代码结构

1、插入

/*编写函数实现插入与排序算法,在主函数中测试以下函数。
   函数功能:向有序数组中插入一个数据
参数说明:升序字符数组a:char[ ]
          数组长度n :int
          已存放数据数m: int
          待插入数据value: char
返回值: 插入位置:int,  -1无法插入
   
   int insert( char a[], int n, int m, char value);   

    函数功能:插入排序
参数说明:长度为n的字符数组c
   void insertSort( char c[], int n);*/
#include<stdio.h>
int main()
{
	int insert( char a[], int n, int m, char value);
	void insertSort( char a[], int i);
    char a[100],value;
	int n,i,k;
	printf("输入一个升序字符数组:\n");
	for(i=0;;i++)
	{
		scanf("%c",&a[i]);
		if(a[i]=='\n')
		{
			break;
		}
	}
	printf("输入要插入的数:\n");
	scanf("%c",&value);
	k=insert(a,100,i,value);
	if(k==-1)
	{
		printf("无法插入");
		return 0;
	}
	insertSort(a,i);
	printf("\n插入数组中位置为%d",k);
}
int insert( char a[], int n, int m, char value)
{
	int i,x;
	for(i=0;i<m;i++)
	{
		if(value<a[i])
		{
			x=i;
		    break;
		}
	}
	for(i=m-1;i>=x;i--)
	{
		a[i+1]=a[i];
		a[i]=value;
	}
	if(i+1>n)
	{
		return -1;
	}
	return x;
}
void insertSort( char a[], int i)
{
	int j;
	for(j=0;j<=i;j++)
	printf("%c",a[j]);
}

2、二分查找

/*设计二分查找函数,分别用迭代与递归的算法实现*/
#include<stdio.h>
#define M 10
int main()
{
//	void diedai(int a[],int i,int n);
	int digui(int a[],int n,int max,int min);
	int a[1000],i,n,k,j=0;
	printf("输入一个正序数组\n");
	for(i=0;i<M;i++)
	scanf("%d",&a[i]);
	printf("输入要查找的数\n");
	scanf("%d",&n);
//	diedai(a,i,n);
	k=digui(a,n,j,i);
	if(k==1)
	printf("找到值为%d的数了",n);
	if(k==0)
	printf("找不到此值");
}
/*void diedai(int a[],int i,int n)
{
	int min,mid,max,k=-1;
	max=a[i-1];
	min=a[0];
	while(min<=max)
	{
		mid=(max+min)/2;
		printf("max=%d,min=%d,mid=%d\n",max,min,mid);
		if(n==mid)
		{
			printf("找到值为%d的数了",i);
			k=1;
			break;
		}
		else if(n>mid)
			min=mid+1;
		else
			max=mid-1;
	}	
	if(k==0)
	printf("找不到此值");
}*/
int digui(int a[],int n,int j,int i)
{
	if(i<j)
	{
		return 0;
	}
    if(a[(i+j)/2]==n)
    {
    	return 1;
    }
    else if(a[(i+j)/2]>n)
    {
    	i=(i+j)/2-1;
        return digui(a,n,j,i);
	}
    else
    {
    	j=(i+j)/2+1;
        return digui(a,n,j,i);
	}
}

3、二进制

//编写函数将一个不大于1000的十进制整数转换成二进制数,并在主函数中输出该二进制字符串。
#include<stdio.h>
int main()
{
	int n;
	char ch[1000]; 
	printf("输入一个不大于1000的十进制整数:\n");
	scanf("%d",&n);
	printf("转换为二进制数为:\n");
	erjinzhi(n,ch);
	return 0;
}
int erjinzhi(int n,char ch[1000])
{
	int a[1000],i=0,j=0;
	while(n!=0)
	{
		a[i++]=n%2;
		n=n/2;
		j++;
	}
	for(i=j-1;i>=0;i--)
	{
		ch[i]=a[i]+'0';
		printf("%c",ch[i]);
	}	
//	return ch;
}

4、哥德巴赫

/* 编写程序验证歌德巴赫猜想: 
一个不小于6的偶数可以表示成两个素数之和。
如6=3+3,8=3+5,10=3+7,…… 在主函数中输入一个大于6的偶数n,例如34,输出如下形式:34=3+31。
输出不满足要求的数则重新输入*/
#include<stdio.h>
int sushu(int n)
{
	int i,j;
	for(i=2;i<n;i++)
	{
		if(n%i==0)
		{
		 return 0;
		 break;
		}
	}
	if(i>=n)
	return 1;
}
int main()
{
	int j,x;
	printf("请输入一个大于等于6的偶数\n");
	scanf("%d",&x);
	if(x<6||x%2!=0)
	{
		printf("输入错误,请重新输入\n");
		return 0;
	}
	else
	{
		for(j=2;j<=x;j++)
		{
			if(sushu(j)&&sushu(x-j))
			{
				printf("%d=%d+%d\n",x,j,x-j);
			    break;
			}
		}
	}
	return 0;
}

5、最大数

//设计函数查找一维数组中最大元素,在主函数中输出该数组中最大元素的值和位置(可能存在多个最大值)。
#include<stdio.h>
int zuida(int a[],int i)
{
	int m,max=a[0];
	for(m=1;m<i;m++)
	{
		if(a[m]>max)
		{
	    	max=a[m];
		}
	}
	return max;
}
int weizhi(int b[],int i,int max)
{
	int k;
	for(k=0;k<i;k++)
	{
		if(max==b[k])
		printf("\n位置为%d\t",k+2);
	}
}
int main()
{
	int zuida(int a[],int i);
	int i,max,k,a[10000];
    printf("输入整型一维数组:\n");
	for(i=0;getchar()!='\n';i++)
	{
		scanf("%d",&a[i]);
	}
	printf("最大值为:%d",zuida(a,i));
	max=zuida(a,i);
	weizhi(a,i,max);
}

6、指数幂

/*编写求指数幂的函数,设计并调用函数。不要用任何数学库函数。
1)??用迭代的算法实现函数,指数exponent可为正整数,负整数或零。
2)用递归算法实现函数,假设exponent是大于或等于1的整数值,底数base为整数。*/
#include<stdio.h>
int main()
{
    double diedai(double n,double m);
	double digui(double n,double m); 
	double result,n,m;
	printf("输入底数与指数\n");
	scanf("%lf%lf",&n,&m);
	printf("%lf",diedai(n,m));
	printf("\n"); 
	printf("%lf",digui(n,m)); 
}
double diedai(double n,double m)
{
	int i;
	double result=1;
	if(m>=0)
	{
		for(i=0;i<m;i++)
	    {
		    result*=n;
	    }
	    return result;
	}
	else
	{
		for(i=0;i<(-m);i++)
	    {
		    result*=(1/n);
	    }
	    return result;
	}
}
double digui(double n,double m)
{
	if(m==0)
	return 1;
	else if(m>=1)
	return n*digui(n,m-1);
	else
	return (1/n)*digui(n,m+1);
}


7、完数

/*一个整数的所有因子(包括1,但不包括本身)之和等于该数,则该数称为完数。
例如6是一个完数,因为6=1+2+3。 编写一个isPerfectnum函数,判断参数number是否为完数。
利用该函数判断并打印1到1000之间的所有完数。*/
#include<stdio.h>
int isPerfectnum(int i,int n)
{
	int sum=0;
	for(i=1;i<n;i++)
	{
		if(n%i==0)
		{
			sum+=i;
		}
	}
	if(sum==n)
	{
		printf("%d\n",n);
	}
}
int main()
{
	int j;
	for(j=1;j<=1000;j++)
	{
		isPerfectnum(1,j);
	}
}


8、矩阵

//设计相关函数,实现矩阵的基本操作:N*N的矩阵转置操作 ; 两个矩阵的加法运算 ;两个矩阵的乘法运算。
#include<stdio.h>
#define N 3
int main()
{
	int zhuanzhi(int d[N][N]);
	int jiafa(int d[N][N],int t[N][N]);
	int chengfa(int d[N][N],int t[N][N]);
	int d[N][N],i,j,t[N][N],a[N][N];
//矩阵转置 
/*	printf("输入需要转置的矩阵:\n");
	for(i=0;i<N;i++)
	  for(j=0;j<N;j++)
	  {
	  	scanf("%d",&d[i][j]);
	  }
	printf("转置后的矩阵:\n");
	zhuanzhi(d);
	  return 0;
}*/
//矩阵加法 
	printf("矩阵1:\n");
	for(i=0;i<N;i++)
	  for(j=0;j<N;j++)
	  {
	  	scanf("%d",&d[i][j]);
	  }
	printf("矩阵2:\n");
	for(i=0;i<N;i++)
	  for(j=0;j<N;j++)
	  {
	  	scanf("%d",&t[i][j]);
	  }
/*	printf("相加后的矩阵:\n"); 
	jiafa(d,t);
	return 0;
}*/
//矩阵乘法 
	printf("相乘后的矩阵:\n");
	chengfa(d,t);
	return 0; 
}
/*int zhuanzhi(int d[N][N])
{
	int i,j,t[N][N];
	for(i=0;i<N;i++)
	  for(j=0;j<N;j++)
	  {
	  	t[j][i]=d[i][j];
	  }
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)  
		{
	  	printf("%d",t[i][j]);
	  }
	  printf("\n");
	} 
}*/
/*int jiafa(int d[N][N],int t[N][N])
{
	int i,j,a[N][N];
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
		  a[i][j]=d[i][j]+t[i][j];
	  	  printf("%d\t",a[i][j]);
	    }
	   printf("\n");
	} 
}*/
int chengfa(int d[N][N],int t[N][N])
{
	int i,j,a[N][N],sum,k;
	for(i=0;i<N;i++)
		  {
		  	sum=0;
			  for(j=0;j<N;j++)
			  {
			    sum+=d[i][j]*t[j][i];	
			  }
			  for(k=0;k<N;k++)
			  a[i][k]=sum;
		  }
		  for(i=0;i<N;i++)
		    { 
			  for(k=0;k<N;k++)
			  {
			  	printf("%d\t",a[i][k]);
			  }
			  printf("\n");
		    }
}

9、日期计算器

//设计一个日期计算器,功能至少包括:判断日期的有效性;计算该日期为当年的第几天;计算两个日期的差。
#include<stdio.h>
//日期的有效性
int nianyueri(int year,int month,int day)
{
	if(year<=0)
	{
		printf("输入年错误\n");
		return 0;
	}
	else
	{
		printf("输入年有效");
		printf("%d\n",year);
	}
	if(month<=0||month>12)
	{
		printf("输入月错误\n");
		return 0;
	}
	else
	{
		printf("输入月有效");
		printf("%d\n",month);
	}
	if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
	{
		if(day<=0||day>31)
		{
		 	printf("输入日错误\n"); 
		 	return 0;
		}
		else
		{
			printf("输入日有效");
			printf("%d\n",day);
		}
	}
	else if(month==4||month==6||month==9||month==11)
	{
		if(day<=0||day>30)
		{ 
			printf("输入日错误\n");	
			return 0;		     
		}
		else
		{
			printf("输入日有效");
			printf("%d\n",day);
		}
	}
	else if(month==2)
	{
		if(year%4==0&&year%100!=0||year%400==0)
		{
			if(day<=0||day>29)
			{
				printf("输入日错误\n");	
				return 0;			 
			}
			else
		    {
			    printf("输入日有效",day);
			    printf("%d\n",day);
		    }
		}
	    else
	    {
			if(day<=0||day>28)
			{
				printf("输入日错误\n");
				return 0;				     
			}
			else
		    {
			    printf("输入日有效",day);
			    printf("%d\n",day);
		    }
		}
	}
}
//该日期是该年的第几天
int count(int a[12],int b[12],int year,int mounth,int day)//定义一个baicount函数,用来计算是哪一天,a[12],b[12],year,day,day 分别du是形参
{
int i,sum=0;
if(year%4==0&&year%100!=0||year%400==0)//判断是否是闰年,是就作如下语句
for(i=0;i<mounth-1;i++)
{
sum+=a[i];
}
else
for(i=0;i<mounth-1;i++)
{
sum+=b[i];
}
sum+=day;
return(sum);
}
int chongfu(int year,int month,int day)
{
	int k;
	int a[12]={31,29,31,30,31,30,31,31,30,31,30,31},b[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/*	printf("输入年月日:\n");
	scanf("%d%d%d",&year,&month,&day);*/
	k=nianyueri(year,month,day);
	if(k==0)
	{
		printf("日期错误");
	}
	else
	{printf("该日期是该年的第%d天",count(a,b,year,month,day));}
}
//两日期相差天数
int guodu(int year,int month,int day) 
{
	int y, m, d;
    m = (month+9)%12;
    y = year-m/10;
    d = 365*y+y/4-y/100+y/400+(m*306+5)/10+(day-1);
    return d;
}
int main()
{
	int year1,month1,day1;
	int year2,month2,day2;
	int i,j;
	printf("输入年月日:\n");
	scanf("%d%d%d",&year1,&month1,&day1);
	chongfu(year1,month1,day1);
	i=guodu(year1,month1,day1);
	printf("\n");
	printf("输入年月日:\n");
	scanf("%d%d%d",&year2,&month2,&day2);
	chongfu(year2,month2,day2);
	j=guodu(year2,month2,day2);
	printf("\n两日期相差%d天",i-j);
}

希望小白可以好好学习函数及之后的知识,也希望大佬们指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

残夜.寒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值