作业七
1. 定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐)
#include<stdio.h> # include <stdlib.h> # include <math.h> int isprime(int n); int isprime(int n) { int i1,i2,x,flag; flag=0; x=sqrt(n); flag=0; for(i2=2;i2<=x;i2++) { if(n%i2==0) { flag=1; break; } } if(flag==1) { n=1; } return n; } int main() { int i,y,m=0; for(i=2;i<=1000;i++) { y=isprime(i); if(y!=1) { printf("%03d ",y); m++; if(m!=0&&m%10==0) { printf("\n"); } } } printf(" \n有%d个素数",m); 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 a1,b1,a2,b2; tt:printf("输入两个正整数,用逗号隔开\n"); scanf("%d,%d",&a2,&b2); if(a2<0||b2<0) { printf("输入错误\n"); goto tt; } a1=gcd(a2,b2); b1=lcm(a2,b2); printf("%d,%d的最大公约数是%d,最小公倍数是%d\n",a2,b2,a1,b1); return 0; } int gcd(int a,int b) { int i,c; if(a<b) { c=a; } else { c=b; } for(i=b;i>0;i--) { if(b%i==0&&a%i==0) { break; } } return i; } int lcm(int a,int b) { int i1; i1=a*b/gcd(a,b); return i1; }
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的值。
#include<stdio.h> #include<math.h> double fun(double x); double fun(double x) { double y; y=x*x-5*x+4; return y; } int main() { double x,y1,y2,y3; printf("函数为y=x*x-5*x+4\n 请输入x的值:\n"); scanf("%lf",&x); y1=fun(x); y2=fun(x+15); y3=fun(sin(x)); printf("%.4lf %.4lf %.4lf",y1,y2,y3); }
4.用函数实现:火柴棍等式问题。
#include<stdio.h> int mty(int a); int main() { int x,y,sum; for(x=0;x<=9;x++) for(y=0;y<=9;y++) { sum=x+y; if((mty(x)+mty(y)+mty(sum)==12)&&x<9&&y<9&&sum<9) { printf("%d+%d=%d\n",x,y,sum); } } return 0; } int mty(int z) { int gen3; switch(z) { case 0: gen3=6; break; case 1: gen3=2; break; case 2: gen3=5; break; case 3: gen3=5; break; case 4: gen3=4; break; case 5: gen3=5; break; case 6: gen3=6; break; case 7: gen3=3; break; case 8: gen3=7; break; case 9: gen3=6; break; } return gen3; }
附加题:
# include <stdio.h> # include <stdlib.h> # include <math.h> int isValidate(int year,int month); /*合法性*/ int isLeap(int year); /*判断闰年*/ int days(int year,int month); /*某年某月天数*/ int totalDays(int year,int month); /*总天数*/ void printCanlender(int year,int month);/*输出*/ int main() { int a,year,month; A:printf("请输入日期年月用逗号隔开:\n"); scanf("%d %d",&year,&month); a=isValidate(year,month);/*合法性*/ /*调用函数1*/ if(a==0) { printf("输入错误!!!"); goto A; } printCanlender(year,month); return 0; } void printCanlender(int year,int month) { int a,b,c,i,x1=0,f,x; a=totalDays(year,month) ; /*调用函数4*/ c=days(year,month); /*调用函数3*/ b=a%7; printf("%d年%d月\n",year,month); printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n"); for(i=0;i<b;i++) { printf("\t"); x1++; } for(i=1;i<=c;i++) { printf("%-2d\t",i); x1++; if(x1!=0&&x1%7==0) { printf("\n"); } } } int isValidate(int year,int month) /*函数1*/ { int a=1; if(year<1900||month<1||month>12) { a=0; } return a; } int isLeap(int year) /*判断闰年*/ /*函数2*/ { int a=1; if((year%4==0&&year%100!=0)||year%400==0) { a=0; } return a; } int days(int year,int month) /*某年某月的天数*/ /*函数3*/ { int a,b; a=isLeap(year); if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { b=31; } else if(month==4||month==6||month==9||month==11) { b=30; } else { if(a==0) { b=29; } else { b=28; } } return b; } int totalDays(int year,int month) /*总天数*/ /*函数4*/ { int day,i,j; day=0; for(i=1900;i<=year;i++) { for(j=1;j<month;j++) { day=day+days(i,j); } } return day; }
二、知识点总结:
1.注意函数的调用。
2.分清各个函数对应的关系。
3.函数也是一段程序,可以对多个数值进行计算,注意括号里的变量。
4.函数结束,要用return,使函数有出口。
5.最前边函数后边要加“;”,程序中后边不加“;”。
6.注意 # include <stdlib.h> 和# include <math.h>的使用。
三、实验总结:
1.不给变量初值的话可能造成结果错误。
2.火柴实验,注意区分数字和根数的加法运算和联系。
3.注意公约数和公倍数的求法。