第七章 用函数实现模块化程序设计

发布于:2024-09-05 ⋅ 阅读:(65) ⋅ 点赞:(0)
例子
递归求年龄
#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转移到three
		void 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 58
		float 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 33
	int 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 9
	int 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]);
			else
			arr[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; 
				}else
				len++;
			}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; 
		}else
		    return 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;
	}