1. 定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐)
#include<stdio.h> int isprime(int n); int main() { int i,d=0; for(i=2;i<=1000;i++) { if(isprime(i)) { printf("%3d ",i); d++; if(d%10==0) printf(" "); } } printf("总是为%d个。 ",d); } int isprime(int n) { int a,b=1; for(a=2;a<=n-1;a++) { if(n%a==0) { b=0; break; } } if(b==1) return 1; else return 0; }
2.求两个正整数的最大公约数和最小公倍数。用一个函数gcd(int a,int b)求最大公约数,另一个函数lcm(int a,int b)根据求出的最大公约数求最小公倍数。
#include<stdio.h> int gcd(int a,int b); int lcm(int a,int b); int main() { int num1,num2; printf("请输入两个正整数,用空格隔开。 "); scanf("%d%d",&num1,&num2); while(num1<=0||num2<=0) { printf("输入错误,请重新输入。 "); scanf("%d%d",&num1,&num2); } printf("最大公约数为%d,最小公倍数为%d。 ",gcd(num1,num2),lcm(num1,num2)); } int gcd(int a,int b) { int i,x,c; if(b>a) { x=b; b=a; a=x; } while(1) { c=a%b; if(c==0) { break; } a=b; b=c; } return b; } int lcm(int a,int b) { int d; d=a*b/gcd(a,b); }
3.编写一个函数fun(double x)求表达式x2-5x+4的值,x作为参数传给函数。在主函数中调用该函数求下列式子的值:
y1= 22-5*2+4
y2= (x+15)2-5*(x+15)+4
y3= sin2x-5*sinx+4
求y3用数学函数 sin(x) 头文件math.h
求解y2和y3时需要输入x的值。
样例:
y1=-2, x=0.5时,y2=166.75,y3=1.832721
#include<stdio.h> #include<math.h> double fun(double x); int main() { double x,y1,y2,y3; printf("x*x-5*x+4 请输入x的值。 "); scanf("%lf",&x); y1=fun(2); y2=fun(x+15); y3=fun(sin(x)); printf("%.3lf %.3lf %.3lf",y1,y2,y3); } double fun(double x) { double y; y=x*x-5*x+4; return y; }
4.用函数实现:火柴棍等式问题。
#include<stdio.h> int huochai(int a); int main() { int a,b,c; for(a=0;a<=9;a++) for(b=0;b<=9;b++) { c=a+b; if(c>9) break; if(huochai(a)+huochai(b)+huochai(c)==12) { printf("%d+%d=%d ",a,b,c); } } return 0; } int huochai(int a) { int A; switch(a) { case 0: case 6: case 9:A=6;break; case 1:A=2;break; case 2: case 3: case 5:A=5;break; case 4:A=4;break; case 7:A=3;break; case 8:A=7;break; } return A; }
4.用函数实现:火柴棍等式问题。
附加题
函数实现万年历,其中需定义以下函数
int isValidate(int year,int month) // 输入数据的合法性验证
int isLeap(int year) // 判断闰年
int days(int year,int month) // 计算某年某月的天数
int totalDays(int year,int month) // 计算某年某月到1900年1月1日的总天数
void printCanlender(int year,int month) // 输出万年历
#include<stdio.h> #include<stdlib.h> int isValidate(int year,int month);/*输入数据的合法性验证 */ int isLeap(int year);/* 判断闰年 */ int days(int year,int month);/*计算某年某月的天数 */ int totalDays(int year,int month);/* 计算某年某月到1900年1月1日的总天数 */ void printCanlender(int year,int month);/*输出万年历 */ int main() { int year,month; printf("请输入年份个月份,用空格分开。 "); scanf("%d%d",&year,&month); while(isValidate(year,month)) scanf("%d%d",&year,&month); system("cls"); printCanlender(year,month); return 0; } int isValidate(int year,int month)/*输入数据的合法性验证 */ { int flag=0; if(year<1900||month<1||month>12) { printf("数据错误,请重新输入。 "); flag=1; } return flag; } int isLeap(int year)/* 判断闰年 */ { int run=0; if(year%4==0&&year%100!=0||year%400==0) { run=1; } return run; } int days(int year,int month)/*计算某年某月的天数 */ { int day; if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { day=31; } else if(month==4||month==6||month==9||month==11) { day=30; } else if(month==2) { if(isLeap(year)) { day=29; } else { day=28; } } return day; } int totalDays(int year,int month)/* 计算某年某月到1900年1月1日的总天数 */ { int sum1=0,sum2=0,sum=0,i,year1; year1=year; for(year1=year1-1;year1>=1900;year1--) { if(isLeap(year1)) { sum1=sum1+366; } else { sum1=sum1+365; } } for(i=1;i<month;i++) { if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) { sum2=sum2+31; } else if(i==4||i==6||i==9||i==11) { sum2=sum2+30; } else if(i==2) { if(isLeap(year)) { sum2=sum2+29; } else { sum2=sum2+28; } } } sum=sum1+sum2; return sum; } void printCanlender(int year,int month)/*输出万年历 */ { int n,h; printf("%d年%d月 ",year,month); printf("星期日 星期一 星期二 星期三 星期四 星期五 星期六 "); switch(totalDays(year,month)%7) { /*1*/ case 0:printf(" ");h=2;break; case 1:printf(" ");h=3;break; case 2:printf(" ");h=4;break; case 3:printf(" ");h=5;break; case 4:printf(" ");h=6;break; case 5:printf(" ");h=7;break; case 6:h=1;break; } for(n=1;n<=days(year,month);n++,h++) { printf(" %2d ",n); if(h%7==0) { printf(" "); } } }
知识点总结:一个函数最多只能返回一个值。
函数只能单向传递,即实参传给形参,形参不会影响实参。
一般情况下自定义函数里不应该有输入输出语句。
函数原型采用复制粘贴函数首部加分号的方法。
好习惯:在程序开头声明说有函数;主函数放在前面。
自定义函数只是暂时储存数值,执行结束后便会清空。
如果不声明函数类型,默认是int。
函数无返回值,单独作为一个函数调用语句。
函数之前是平行的,不能嵌套。
自定义函数之前也可以相互调用。
实验总结:自定义函数体里,如果除了形参外需要用其他变量,一定在函数体前要在定义。
声明函数后面不要丢掉分号。
分清实参和形参。
自定义函数之前相互调用时考虑好同一个变量是否已经改变。
定义类型和输入输出类型保持一致。
辗转相除法:最小的除数就是最大公约数;