函数作业:
1.计算数组中完数的个数
【完数:除本身约数和等于本身。例如6:1 23 1+2+3=6 例如28:1+2+4+7+14=28】
在该函数【void PerfectFun(int arr[],int n) 】循环数组每一个值
在该函数【int Perfect(int num)】 判断完数,返回约数的和
#include<stdio.h>
#include<string.h>
int Perfect(int num)
{
int sum=0;
for(int i=1;i<num;i++)
{
if(num%i==0)
sum+=i;
}
return sum;
}
void PerfectFun(int arr[],int n)
{
for(int i=0;i<n;i++)
{
if(Perfect(arr[i])==arr[i])
printf("%d是完数\n",arr[i]);
}
}
int main(int argc, const char *argv[])
{
int arr[]={1,6,33,654,28,87,25,99};
int n=sizeof(arr)/sizeof(int);
PerfectFun(arr,n);
return 0;
}
订正:
#include<stdio.h>
#include<string.h>
int Perfect(int num)
{
int sum=0,i;
for(i=1;i<num;i++)
{
if(num%i==0)
sum+=i;
}
return sum;
}
void PerfectFun(int arr[],int n)
{
int i,count=0;
for(i=0;i<n;i++)
{
int sum=Perfect(arr[i]);
if (sum==arr[i])
{
printf("%d是完数\n",arr[i]);
count++;
}
}
printf("有%d个完数",count);
}
int main(int argc, const char *argv[])
{
int n;
int arr[20];
printf("请输入数组的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
PerfectFun(arr,n);
return 0;
}
2.实现单词的逆置“hello my student”
最终结果是”student my hello”
在该函数【void StrFun( char str[]) 】 循环字符串的
在该函数【void StrRev(char str[]) 】 主要是实现逆置的
#include<stdio.h>
#include<string.h>
void StrRev(char str[],int i,int j)
{
while(i<j)
{
char t=str[i];
str[i]=str[j];
str[j]=t;
i++;j--;
}
}
void StrFun( char str[])
{
int i=0,j=0;
while(str[i]!='\0')
{
while(str[j]!=' '&&str[j]!='\0')
{
j++;
}
int k=j-1;
StrRev(str,i,k);
while(str[j]==' ')
{
j++;
}
i=j;
}
}
int main(int argc, const char *argv[])
{
char str[] = "hello my student";
StrRev(str,0,strlen(str)-1);
StrFun(str);
puts(str);
return 0;
}
函数调用+返回练习:
1.使用有返回值实现计算器,在主调函数中打印
#include<stdio.h>
float div(int a,int b);
int add(int a,int b);
int mul(int a,int b);
int sub(int a,int b);
int main(int argc, const char *argv[])
{
int num1,num2;
char ch;
printf("请输入一个表达式:");
scanf("%d%c%d",&num1,&ch,&num2);
switch(ch)
{
case '+':printf("%d+%d=%d\n",num1,num2,add(num1,num2)); break;
case '-':printf("%d-%d=%d\n",num1,num2,sub(num1,num2)); break;
case '*':printf("%d*%d=%d\n",num1,num2,mul(num1,num2)); break;
case '/':{
if(num2==0)
printf("除数不能为0\n");
else
printf("%d/%d=%.2f\n",num1,num2,div(num1,num2));
} break;
}
return 0;
}
int add(int a,int b)
{
return(a+b);
}
int sub(int a,int b)
{
return(a-b);
}
int mul(int a,int b)
{
return(a*b);
}
float div(int a,int b)
{
return(1.0*a/b);
}
2.返回一维数组任意两个数之间最大的差值,返回一维数组任意两个数之间最大的和
float MaxSub(int arr[],int n)
int MaxAdd(int arr[],int n)
#include<stdio.h>
#include<string.h>
void Bubble(int arr[],int n)
{
int i,j;
int t;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(arr[j]>arr[j+1])
{
t=arr[j];arr[j]=arr[j+1];arr[j+1]=t;
}
}
}
}
int MaxSub(int arr[],int n)
{
return arr[n-1]-arr[0];
}
float MaxAdd(int arr[],int n)
{
return arr[n-1]+arr[n-2];
}
int main(int argc, const char *argv[])
{
int arr[]={13,45,21,49,12};
int n=sizeof(arr)/sizeof(arr[0]);
Bubble(arr,n);
int sub=MaxSub(arr,n);
float add=MaxAdd(arr,n);
printf("最大差:%d 最大和是:%.0f\n",sub,add);
return 0;
}
3.字符串比较非函数实现,返回差int MyStrcmp(char str[],char str1[])
#include<stdio.h>
#include<string.h>
int MyStrcmp(char str[],char str1[])
{
int i=0,j=0;
int cha=0;
while(str[i]==str1[j])
{
if(str[i]=='\0'&&str1[i]=='\0')
{
break;
}
else
{
i++;j++;
}
}
cha =str[i]-str1[j];
return cha;
}
int main(int argc, const char *argv[])
{
char str[]="aab";
char str1[]="abc";
int n=MyStrcmp(str,str1);
if(n==0)
printf("str=str1\n");
else if(n>0)
printf("str>str1\n");
else
printf("str<str1\n");
return 0;
}
递归函数练习:
1.递归求和
#include<stdio.h>
#include<string.h>
int rec(int n)
{
if(n==0)
{
return 0;
}
else
{
return n+rec(n-1);
}
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
rec(n);
printf("和为%d\n",rec(n));
return 0;
}
2.递归计算阶乘
#include<stdio.h>
#include<string.h>
int rec(int n)
{
if(n==1||n==0)
{
return 1;
}
else
{
return n*rec(n-1);
}
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
rec(n);
printf("阶乘值为%d\n",rec(n));
return 0;
}
3.递归实现斐波那契
#include<stdio.h>
#include<string.h>
int rec(int n)
{
if(n==1||n==2)
return 1;
else
return rec(n-1)+rec(n-2);
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
rec(i);
printf("%d\t",rec(i));
}
return 0;
}
4.n的k次幂2^4=2* 2^3 =2*2*2^2=2*2*2*2^1=2*2*2*2*2^0
#include<stdio.h>
#include<string.h>
int rec(int n,int k)
{
if(k==0)
return 1;
else
return n*rec(n,k-1);
}
int main(int argc, const char *argv[])
{
int n,k;
scanf("%d %d",&n,&k);
rec(n,k);
printf("%d的%d次幂为:%d\n",n,k,rec(n,k));
return 0;
}
5.1!+2!+3!+4!+5!...n!
#include<stdio.h>
#include<string.h>
int rec(int n)
{
if(n==0)
return 1;
else
return n*rec(n-1);
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
int i,sum=0;
for(i=1;i<=n;i++)
{
sum+=rec(i);
}
printf("和是:%d\n",sum);
return 0;
}
6.n=4 k=3
计算1^3+2^3+3^3+4^3
计算4^0+4^1+4^2+4^3
#include<stdio.h>
#include<string.h>
int rec(int n,int k)
{
if(k==0)
{
return 1;
}
else
{
return n*rec(n,k-1);
}
}
int main(int argc, const char *argv[])
{
int n,k,num,sum=0;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
printf("%d的%d次幂是%d\n",i,k,num=rec(i,k));
sum+=num;
}
printf("sum=%d\n",sum);
sum=0;
for(int i=0;i<=k;i++)
{
printf("%d的%d次幂是%d\n",n,i,num=rec(n,i));
sum+=num;
}
printf("sum=%d\n",sum);
return 0;
}
7.使用递归实现数字逆序
#include<stdio.h>
#include<string.h>
int sum=0;
void Rev(int n)
{
sum=sum*10+n%10;
if(n/10==0)
return;
else
Rev(n/10);
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
Rev(n);
printf("%d\n",sum);
return 0;
}
8.计算各个位之和
#include<stdio.h>
#include<string.h>
int Rev(int n)
{
if(n<10)
{
return n;
}
else
{
return n%10+Rev(n/10);
}
}
int main(int argc, const char *argv[])
{
int n;
scanf("%d",&n);
int sum=Rev(n);
printf("sum=%d\n",sum);
return 0;
}
9.递归实现字符串逆序void StrRev(char str[],int len)
#include<stdio.h>
#include<string.h>
void StrRev(char str[],int len)
{
if(len==1)
{
printf("%c",str[len-1]);
}
else
{
printf("%c",str[len-1]);
StrRev(str,len-1);
}
}
int main(int argc, const char *argv[])
{
char str[]="hello";
StrRev(str,strlen(str));
return 0;
}