目录
2.3 实现单词的逆置 “hello my student”
3.1.4 字符串比较非函数实现,返回差int MyStrcmp(char str[],char str1[])
3.2.4 n的k次幂2^4=2* 2^3 =2*2*2^2=2*2*2*2^1=2*2*2*2*2^0
一、思维导图(函数)(函数调用+返回、递归函数)
二、作业
2.1 计算数组中完数的个数
【完数:除本身约数和等于本身。例如:1+2+3=6 1+2+4+7+14=28】
在该函数【void PerfectFun(int arr[],int n) 】循环数组每一个值
在该函数【int Perfect(int num) 】 判断完数,返回约数的和
方法一:
#include <stdio.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,9,28,232,962};
int n=sizeof(arr)/sizeof(int);
PerfectFun(arr,n);
return 0;
}
方法二:
#include <stdio.h>
#include <string.h>
Perfect(int num)//函数为int时,可以省略不写int
{
int i,sum=0;
for(i=1;i<num;i++)
{
if(num%i==0)
sum+=i;
}
return sum;
}
void PerfectFun(int arr[],int n)
{
int i;
for(i=0;i<n;i++)
{
int sum=Perfect(arr[i]);
if(sum==arr[i])
{
printf("%d是完数\n",arr[i]);
}
}
}
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.3 实现单词的逆置 “hello my student”
在该函数【void StrFun( char str[]) 】 循环字符串的
在该函数【void StrRev(char str[]) 】 主要是实现逆置的
输入:hello my student
输出:student my hello
方法一(直接计算):
#include <stdio.h>
void StrFun(char str[])//循环字符串的
{
int i=0,j=strlen(str)-1,t=0;
while(i<j)
{
t=str[i];str[i]=str[j];str[j]=t;
i++;j--;
}
printf("%s\n",str);
}
void StrRev(char str[])//主要是实现逆置的
{
int i=0,j=0;
char t=0;
while(str[i]!='\0')
{
while(str[j]!=' '&&str[j]!='\0')
{
j++;
}
int k=j-1;
while(i<k)
{
t=str[i];str[i]=str[k];str[k]=t;
i++;k--;
}
while(str[j]==' ')
{
j++;
}
i=j;
}
printf("%s\n",str);
}
int main(int argc, const char *argv[])
{
//2 实现单词的逆置 “hello my student”
char str[]="hello my student";
StrFun(str);
StrRev(str);
return 0;
}
方法二(使用递归函数):
三、今日知识回顾
3.1 函数调用+返回
3.1.1 使用有返回值实现计算器
使用4个函数:
float div(int a,int b);
int add(int a,int b);
int mul(int a,int b);
int sub(int a,int b);
#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);
}
3.1.2 返回一维数组任意两个数之间最大的差值
#include <stdio.h>
#include <string.h>
float MaxSub(float arr[],int n)
{
int i=0,t=0;
float max,min;
for(i=0;i<n;i++)
{
if(i==0)
{
max=arr[i];
min=arr[i];
}
if(max<arr[i])
max=arr[i];
if(min>arr[i])
min=arr[i];
}
return max-min;
//printf("该一维数组最大的差值为:%f\n",max-min);
}
int main(int argc, const char *argv[])
{
//返回一维数组最大的差值
float arr[]={23,42,156,2};
int n=sizeof(arr)/sizeof(float);
int sub=MaxSub(arr,n);
printf("该一维数组最大的差值为:%d\n",sub);
return 0;
}
3.1.3 返回一维数组任意两个数之间最大的和
3.1.4 字符串比较非函数实现,返回差
封装函数:int MyStrcmp(char str[],char str1[])
#include <stdio.h>
#include <string.h>
int MyStrcmp(char str[],char str1[])
{
int i=0,j=0,cha=0;
while(str[i]==str1[j])
{
if(str[j]=='\0')
{
break;
}
else
{
i++;j++;
}
}
cha=str[i]-str1[j];
return cha;
}
int main(int argc, const char *argv[])
{
//使用非函数实现字符串比较
int cha;
char str[]="afg",str1[]="afgc";
cha=MyStrcmp(str,str1);
if(cha>0)
{
printf("str>str1\n");
}
if(cha==0)
printf("str=str1\n");
if(cha<0)
printf("str<str1\n");
return 0;
}
3.2 递归函数
3.2.1 利用递归完成n!
#include <stdio.h>
int rec(int n)
{
if(n==0)
return 1;
else
return n*rec(n-1);
}
int main(int argc, const char *argv[])
{
//利用递归完成n!
int n;
printf("请输入n的值:");
scanf("%d",&n);
rec(n);
printf("%d\n",rec(n));
return 0;
}
3.2.2 递归计算阶乘
3.2.3 递归实现斐波那契
#include <stdio.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[])
{
//输出第n个斐波那契数列
int n;
printf("请输入要输出第几个斐波那契数:");
scanf("%d",&n);
rec(n);
printf("%d\n",rec(n));
return 0;
}
3.2.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[])
{
//n的k次幂
int n,k;
printf("请输入n和k:");
scanf("%d%d",&n,&k);
rec(n,k);
printf("%d的%d次幂为:%d\n",n,k,rec(n,k));
return 0;
}
3.2.5 1!+2!+3!+4!+5!...n!
函数:int rec(int 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[])
{
//1!+2!+3!+4!+5!...+n!
int n,i,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=rec(i);
}
printf("%d的阶乘为:%d\n",n,sum);
return 0;
}
3.2.6 n=4 k=3
计算1^3+2^3+3^3+4^3
计算4^0+4^1+4^2+4^3
3.2.7 使用递归实现数字逆序
函数:void rec(int n)
#include <stdio.h>
void rec(int n)
{
printf("%d",n%10);
if(n/10>0)
rec(n/10);
}
int main(int argc, const char *argv[])
{
//使用递归实现数字逆序
int n;
printf("请输入一个数字:");
scanf("%d",&n);
rec(n);
printf("\n");
return 0;
}
3.2.8 计算各个位之和
函数:int rec(int n)
#include <stdio.h>
#include <string.h>
int sum=0;
int rec(int n)
{
if(n==0)
return sum;
else
{
sum=sum+n%10;
return rec(n/10);
}
}
int main(int argc, const char *argv[])
{
//计算各个位之和
int n;
printf("请输入一个数字:");
scanf("%d",&n);
printf("%d\n",rec(n));
return 0;
}
3.2.9 递归实现字符串逆序
void StrRev(char str[],int len)
#include <stdio.h>
#include <string.h>
void rec(char a[],int len)
{
if(len==1)
printf("%c",a[len-1]);
else
{
printf("%c",a[len-1]);
rec(a,len-1);
}
}
int main(int argc, const char *argv[])
{
//递归实现字符串逆序;
char a[]="asdfg";
rec(a,strlen(a));
printf("\n");
return 0;
}