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);
}
希望小白可以好好学习函数及之后的知识,也希望大佬们指正