第七章 用函数实现模块化程序设计
例子
递归求年龄
#include<stdio.h>
// int age(int a);
// int main(){
// int xue1=10;
// int xue2=age(xue1);
// int xue3=age(xue2);
// int xue4=age(xue3);
// int xue5=age(xue4);
// printf("%d\n",xue5);
//
// return 0;
// }
// int age(int a){
// return a+2;
// }int age(int a);int main(){int xue5=age(5);printf("%d",xue5);}int age(int a){if(a==1)return 10;else if(a>=2)return age(a-1)+2;}
递归求n!
#include<stdio.h>int resort(int n); int main(){int n=0;scanf("%d",&n);printf("%d!=%d",n,resort(n));return 0;}int resort(int n){if(n==0||n==1)return 1;else if(n>=2)return resort(n-1)*n; }
汉诺塔
#include<stdio.h>int main(){void hanoi(int n,char one,char two,char three);int m;printf("input the number:");scanf("%d",&m);printf("move %d\n",m);hanoi(m,'A','B','C');return 0;}void hanoi(int n,char one,char two,char three){//将n个盘从one借助two转移到threevoid move(char x,char y);if(n==1)move(one,three);else{hanoi(n-1,one,three,two);//通过三将1的东西移到2 move(one,three);//将一的最后一块移到三 hanoi(n-1,two,one,three);//继续移动 } }void move(char x,char y){printf("%c->%c\n",x,y);}
求十个人的平均成绩
#include<stdio.h>int main(){//100 56 78 98 67.5 99 54 88.5 76 58float average(float arr[10]);//函数声明float score[10],aver;int i=0;printf("input 10 scores:\n");for(i=0;i<10;i++){scanf("%f",&score[i]);} printf("\n");aver=average(score);printf("average score is %5.2f\n",aver);return 0;}float average(float arr[10]){int i=0;float sum=0;for(i=0;i<10;i++){sum+=arr[i];}return sum/10;}
选择法排序
#include<stdio.h>
//45 2 9 0 -3 54 12 5 66 33int main(){void sort(int arr[],int size);int arr[10],i,size;printf("enter array:\n");size=sizeof(arr)/sizeof(arr[0]);for(i=0;i<10;i++){scanf("%d",&arr[i]);}sort(arr,size);printf("排序后的数组:\n");for(i=0;i<10;i++){printf("%d ",arr[i]); }printf("\n");return 0;
}void sort(int arr[],int size){int min=arr[0];int i,j,flag;for(i=0;i<size;i++){min=arr[i];flag=i;//标记一下最小值的位置 for(j=i+1;j<size;j++){if(min>arr[j]){min=arr[j];flag=j;}}arr[flag]=arr[i];arr[i]=min;}}
二维数组找最大值
#include<stdio.h>int main(){int max_value(int arr[][4]);int arr[3][4]={1,3,5,7,2,4,6,8,15,17,34,12};printf("Max value is %d\n",max_value(arr));return 0; }int max_value(int arr[3][4]){int i,j,max;max=arr[0][0];for(i=0;i<3;i++){for(j=0;j<4;j++){if(arr[i][j]>max)max=arr[i][j];}}return max;}
作用域 总结
习题
最大公约数和最小公倍数
#include<stdio.h>int main(){int gcd(int x,int y);int m,n;scanf("%d %d",&n,&m);int num1=gcd(n,m);int num2=n*m/num1;printf("%d,%d的最大公约数为:%d\n",n,m,num1);printf("%d,%d的最小公倍数为:%d\n",n,m,num2);return 0;
}int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
求解一元二次方程
#include<stdio.h>
#include<math.h>double x1,x2,p,q;int main(){void dayu_zero(double b,double disk,double a);void xiaoyu_zero(double b,double disk,double a);void dengyu_zero(double b,double disk,double a);double a,b,c;scanf("%lf,%lf,%lf",&a,&b,&c);double disk=b*b-4*a*c;if(disk>0){dayu_zero(b,disk,a);printf("实数解x1=%lf\n",x1);printf("实数解x2=%lf\n",x2);} else if(disk==0){//两个相等实数解dengyu_zero(b,disk,a); printf("实数解x1=%lf\n",x1);printf("实数解x2=%lf\n",x2);}else{xiaoyu_zero(b,disk,a); printf("虚数解x1=%lf+%lfi",p,q);printf("虚数解x2=%lf-%lfi",p,q);} return 0;}void dayu_zero(double b,double disk,double a){//两个实数解x1=(-b+sqrt(disk))/(2*a);x2=(-b-sqrt(disk))/(2*a);}void xiaoyu_zero(double b,double disk,double a){p=-b/(2*a);q=sqrt(-disk)/(2*a);}void dengyu_zero(double b,double disk,double a){//两个相等实数解x1=(-b+sqrt(disk))/(2*a);x2=x1;}
判断素数
#include<stdio.h>
#include<math.h>int main(){int panduan(int a);int a=0;scanf("%d",&a);if(panduan(a)){printf("%d为素数\n",a);}else{printf("%d不是素数\n",a); }return 0;}
int panduan(int a){int i=0; if(a<=3){return a!=1;}for(i=2;i<=sqrt(a);i++){if(a%i==0)return 0;}return 1;
}
行列互换
#include<stdio.h>
//1 2 3
//4 5 6
//7 8 9int main(){void fanzhuan(int arr[3][3]);int arr[3][3],i,j;for(i=0;i<3;i++){for(j=0;j<3;j++){scanf("%d",&arr[i][j]);} }printf("翻转前的数组\n");for(i=0;i<3;i++){for(j=0;j<3;j++){printf("%d ",arr[i][j]);} printf("\n");} fanzhuan(arr); printf("翻转后的数组\n");for(i=0;i<3;i++){for(j=0;j<3;j++){printf("%d ",arr[i][j]);} printf("\n");} }void fanzhuan(int arr[3][3]){int i,j,t;for(i=0;i<3;i++){for(j=i+1;j<3;j++){t=arr[i][j];arr[i][j]=arr[j][i];arr[j][i]=t;} } }
逆序字符串
#include<stdio.h>
#include<string.h>int main(){void reverse(int left,int right,char arr[]);char arr[100];scanf("%s",arr);printf("顺序->%s\n",arr); int right=strlen(arr)-1;//减一是因为数组索引到不了 reverse(0,right,arr);printf("逆序->%s\n",arr);return 0;
}void reverse(int left,int right,char arr[]){char temp;if(left<right){temp=arr[left];arr[left]=arr[right];arr[right]=temp;reverse(left+1,right-1,arr);}}
连接字符串
#include<stdio.h>int main(){void lianjie(char* str1,char* str2);char str1[100],str2[100];printf("输入字符串str1:");scanf("%s",str1);printf("输入字符串str2:");scanf("%s",str2);lianjie(str1,str2); printf("%s\n",str1);return 0;} void lianjie(char* str1,char* str2){while(*str1!='\0') str1++;while(*str2!='\0')*str1++=*str2++;*str1=*str2;}
复制元音字母带另一个字符串
#include<stdio.h>int main(){void panduan(char* str1,char* str2);char str1[100];char str2[100];scanf("%s",str1);panduan(str1,str2);printf("%s\n",str2);return 0;}void panduan(char* str1,char* str2){while(*str1!='\0'){if(*str1=='a'||*str1=='e'||*str1=='i'||*str1=='o'||*str1=='u'||*str1=='A'||*str1=='E'||*str1=='I'||*str1=='O'||*str1=='U'){*str2++=*str1; }str1++;} *str2=*str1;}
数字空格
#include<stdio.h>int main(){char arr[8];int i=0;for(i=0;i<=7;i++){if(i%2==0)scanf("%c",&arr[i]);elsearr[i]=' ';}printf("%s\n",arr);return 0;}
#include<stdio.h>
#include<string.h>int main(){void add_space(char arr[],int sz);char arr[8];scanf("%s",arr);int sz=strlen(arr)-1;add_space(arr,sz); printf("%s\n",arr);return 0;}void add_space(char arr[],int sz){int i=0;for(i=sz;i>=0;i--){arr[i+i]=arr[i];arr[i+i+1]=' ';}}
输出最长单词
#include<stdio.h>
#include<string.h>int main(){int alpha(char);int longest(char[]);int i;char line[100];printf("input one line:\n");gets(line);printf("The longest word is:");for(i=longest(line);alpha(line[i]);i++)printf("%c",line[i]);printf("\n");return 0; } int alpha(char c){if((c>='a'&&c<='z')||(c>='A'&&c<='z')){return 1;}else{return 0;}} int longest(char string[]){int len=0,i,length=0,flag=1,place=0,point;for(i=0;i<=strlen(string);i++){if(alpha(string[i])){if(flag){point=i;//标记单词起始位置flag=0; }elselen++;}else{flag=1;if(len>=length){length=len;place=point;len=0; }}}return place;}
#include<stdio.h>
#include<string.h>int main(){int panduan(char);char str[100];gets(str);int place=0,point;//标记最长单词起始位置int maxlen=0;//最长的长度int len=0,i,flag=1;for(i=0;i<=strlen(str);i++){if(panduan(str[i])){if(flag){point=i;flag=0;} len++;}else{flag=1;if(maxlen<len){place=point;maxlen=len;}//判断结束 len=0; }} for(i=place;i<place+maxlen;i++)printf("%c",str[i]);printf("\n");}int panduan(char c){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){return 1; }elsereturn 0;}
冒泡排序字符
#include<stdio.h>int main(){void sort(char arr[]);char arr[10];scanf("%s",arr);printf("%s\n",arr);sort(arr);printf("%s\n",arr);return 0;}void sort(char arr[]){int i,j; char cc;for(i=1;i<10;i++){for(j=0;j<10-i&&arr[j]!='\0';j++){if(arr[j]>arr[j+1]){cc=arr[j];arr[j]=arr[j+1];arr[j+1]=cc;}}}}
有问题的题
#include<stdio.h>int main(){int x,n;double p(int n,int x);printf("input x&n :");scanf("%d %d",&n,&x);printf("%.2lf\n",p(n,x));return 0;
}double p(int n,int x){if(n==0)return 1;else if(n==1)return x;else if(n>1){return (2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x)/n;}}
递归 数字转换为字符串
#include<stdio.h>int main(){void panduan(int n);int n=0;scanf("%d",&n);if(n<0){putchar('-');putchar(' ');n=-n;}panduan(n); return 0;}void panduan(int n){int i;if((i=n/10)!=0){panduan(i);}putchar(n%10+'0'); //强转 3+'0'putchar(' '); }
累加月份
#include<stdio.h>int main(){int year,month,day,sum=0;scanf("%d %d %d",&year,&month,&day);sum=day;int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};if(year%400==0||(year%4==0&&year%100!=0))month_day[2]=29; int i=1;for(i=1;i<month;i++)sum+=month_day[i];printf("%d",sum);return 0;}