第七次作业

  1. 定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐)

# include <stdio.h>
# include <stdlib.h>
# include <math.h>
int isprime(int n);
int main()
{
    int i,y,z=0;
    for(i=2;i<=1000;i++)
    {
        y=isprime(i);
        if(y!=1)
        {
            printf("%3d ",y);
            z++;
            if(z!=0&&z%10==0)
            {
                 printf("\n");
                }
        }
    }
    printf("\n一共有%d个素数",z);
return 0;    
}
int isprime(int n)
{
    int flag,ic,j;
    flag=0;
    ic=sqrt(n);
    for(j=2;j<=ic;j++)
    {
        if(n%j==0)
        {
            n=1;    
        }
    }
return n; }

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 c,d,e,f;
    printf("请输入两个正整数(用逗号隔开):\n");
    scanf("%d,%d",&e,&f);
    c=gcd(e,f);
    d=lcm(e,f);
    printf("%d和%d的最大公约数是%d,最小公倍数是%d\n",e,f,c,d);
return 0;    
}
int gcd(int a,int b)
{
    int i,x;
    if(a<b)
    {
        x=a;
    }
    else
    {
        x=b;
    }
    for(i=b;i>0;i--)
    {
        if(b%i==0&&a%i==0)
        {
            break;
        }
    }
return i;    
}
int lcm(int a,int b)
{
    int n;
    n=a*b/gcd(a,b);
return n;
}

 

 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()
{
    int y1;
    double y2,y3,x;
    scanf("%lf",&x);
    y1=fun(2);
    y2=fun(x+15);
    y3=fun(sin(x));
    printf("y1=%d,y2=%.2lf,y3=%.6lf\n",y1,y2,y3); 
return 0;    
}
double fun(double x)
{
    double y;
    y=x*x-5*x+4;
return y;
}

 4.用函数实现:火柴棍等式问题。

# include <stdio.h>
int change(int n);      
int main()
{
    int a,b,c,x,y,z,n;
    for(x=0;x<=9;x++)
    {
        a=change(x);
        for(y=0;y<=9;y++)
        {
            b=change(y);
            for(z=0;z<=9;z++)
            {
c
=change(z); if(a+b+c==12&&x+y==z) { printf("%d+%d=%d\n",x,y,z); }
} } } }
int change(int n) { int N; if(n==1) { N=2; } else if(n==2||n==3||n==5) { N=5; } else if(n==4) { N=4; } else if(n==6||n==9||n==0) { N=6; } else if(n==7) { N=3; } else { N=7; } return N; }

 

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>
# 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 c,year,month;
    tt:printf("请输入日期(年、月,用逗号隔开):\n");
    scanf("%d,%d",&year,&month);
    c=isValidate(year,month);
    if(c==0)
    {
        printf("输入错误!!!");
        goto tt;
    }
    printCanlender(year,month);
return 0;    
}
int isValidate(int year,int month)
{
    int a=1;
    if(year<1900||month<1||month>12)
    {
        a=0;
    }
return a;
}
int isLeap(int year)
{
    int a=1;
    if((year%4==0&&year%100!=0)||year%400==0)
    {
        a=0;
    }
return a;
}
int days(int year,int month)
{
    int a,b,i,e;
    a=isLeap(year);
    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
    {
        e=31;
    }
    else if(month==4||month==6||month==9||month==11)
    {
        e=30;
    }
    else
    {
        if(a==0)
        {
            e=29;
        }
        else
        {
            e=28;
        }        
    }
return e;    
}
int totalDays(int year,int month)
{
    int days1,i,j;
    days1=0;
    for(i=1900;i<=year;i++)
    {
        if(i<year)      
        {
           for(j=1;j<=12;j++)
           {
               days1=days1+days(i,j);
           }
        }
        else
        {
           for(j=1;j<month;j++)
           {
               days1=days1+days(i,j);
            }
        }
    }
return days1;    
}
void printCanlender(int year,int month)
{
    int a,b,c,d,i,g=0,f,x;
    a=totalDays(year,month)    ;
    c=days(year,month);
    b=a%7;
    printf("%d年%d月\n",year,month);
    printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
    if(b!=6)
    {
        for(i=0;i<=b;i++)
        {
             printf("\t");
            g++;
        }
    }
    
    for(i=1;i<=c;i++)
    {
        printf("%-2d\t",i);
        g++;
        if(g!=0&&g%7==0)
        {
            printf("\n");
        }
    }
    
}

知识点总结:

1.建立新函数int xxx(int x);

2.利用自己建立的新函数来解决一些格式相同但自变量不同的步骤;

3.自己建立的函数之间也可以互相调用;

4.要熟练运用不同函数之间的调用。

实验总结:

1返回值不一定是输入值,而是那个有用的值;

2.void 开头的函数最后不加return 0;

3.刚开始用这种方法也许不太会,多练习,熟了就会了。

posted @ 2016-11-15 19:22  王佳诺  阅读(281)  评论(3编辑  收藏  举报