07.10C

来源:互联网 发布:拓普网络怎么样 编辑:程序博客网 时间:2024/06/17 22:43

【项目1-函数版星号图】
这一组的练习意在通过调用函数输出星号图,体会与理解函数的工作过程,并为其后编制自定义函数实现特定功能。

(1)补充完下面的程序,使程序输出星号下面的星号图:

解法:(1)

#include <stdio.h>#include <stdlib.h>void printch(char ch);int main(){    printch('*');    return 0;}void printch(char ch){    int i,j;    for(i=1;i<=6;++i)    {        for(j=1;j<=(2*i-1);++j)        {            printf("%c",ch);        }        printf("\n");    }}


(2)解法

#include <stdlib.h>void printch(char ch,int i);int main(){    int n=6;    int i;    for(i=1;i<=n;++i)    {      printch('*',i);    }    return 0;}void printch(char ch,int i){    int j;    for(j=1;j<=6-i;++j)    {        printf(" ");    }    for(j=1;j<=2*i-1;++j)    {        printf("%c",ch);    }    printf("\n");}


(3)解法

#include <stdio.h>#include <stdlib.h>void printch(char ch,int i);int main(){    int n=6;    int i;    for(i=1;i<=n;++i)    {      printch('A'+i-1,i);    }    return 0;}void printch(char ch,int i){    int j;    for(j=1;j<=6-i;++j)    {        printf(" ");    }    for(j=1;j<=2*i-1;++j)    {        printf("%c",ch);    }    printf("\n");}


项目2-求解分段函数的值】

提示:函数求解的结果要在main()中使用,要用return <表达式>得到返回值。
通过这个项目,体会函数利用返回值的方法。

解法:

#include <stdio.h>
#include <stdlib.h>
#define x1 0.3
#define x2 0.8
double piecewise_function(double);
int main()
{
    printf("please enter a number between 0 and 1:");
    double x;
    double y;
    scanf("%lf",&x);
    y = piecewise_function(x);
    printf("the result of this piecewise function is %lf",y);
    return 0;
}
double piecewise_function(double x)
{
    double result=0;
    if(x<x1)
    {
        result=0;
    }
    if(x>=x1&&x<=x2)
    {
        result=(x-0.3)/(0.8-0.3);
    }
    if(x>=x2)
    {
        result=1;
    }
    return(result);
}

【项目3-求最大公约数】
(1)输入两个数,并求出其最大公约数。请写出求最大公约数的函数

(2)在上面程序基础上,增加函数gcds函数的声明和定义,实现求4数最大公约数的功能

提示:①既然gcd函数已经实现了求两数最大公约数的功能,gcds可以调用gcd分别求出两对的最大公约数,再求最大公约数的最大公约数;②修改main函数,以完成对新新定义的函数的测试。

解法:

#include <stdio.h>#include <stdlib.h>#define n1 3int gcd(int,int);int main(){    printf("please input numbers:");    int a,b,c,c_gcd;    int i=0;    scanf("%d %d",&a,&b);    while(i<=n1)    {        scanf("%d",&c);        c_gcd=gcd(gcd(a,b),c);        ++i;    }    printf("the greatest common divisor of these two numbers is:%d",c_gcd);    return 0;}int gcd(int m,int n){    int r;    do    {        r=m%n;        m=n;        n=r;    }while(r!=0);    return(m);}


【项目4-求阶乘函数】
(1)请输出满足条件n=a!+b!+c!的所有三位数n,其中,a、b、c分别是n的百、十、个位数。要求用自定义函数实现求阶乘。

(2)求组合数:求组合数公式为:

编一程序,输入m和n的值,求组合数。要求分别定义求阶乘和求组合的函数,求组合数的函数调用求阶乘的函数来实现求解,在main()函数中,负责输入输出及调用求组合数的函数。

(1):解法

#include <stdio.h>#include <stdlib.h>int factorial(int);int main(){    printf("please enter a number between 1000 and 999:");    int n;    int m;    int iA_unit=0;    int iB_ten=0;    int iC_hundred=0;    int iFac_a=0,iFac_b=0,iFac_c=0;    scanf("%d",&n);    for(m=143;m<=999;++m)    {    iA_unit=m%10;    iB_ten=m/10%10;    iC_hundred=m/100;    iFac_a=factorial(iA_unit);    iFac_b=factorial(iB_ten);    iFac_c=factorial(iC_hundred);    if(m==(iFac_a+iFac_b+iFac_c))    {        printf("%d ",m);    }    }    return 0;}int factorial(int num){    int iFac_m=1;    int i;    for(i=1;i<=num;++i)    {        iFac_m *= i;    }    return(iFac_m);}(2):解法#include <stdio.h>#include <stdlib.h>int factorial(int);int main(){   printf("please input two values of m and n:");   int m,n;   int c;   scanf("%d%d",&m,&n);   c=factorial(m)/(factorial(n)*factorial(m-n));   printf("the result is:%f",c);    return 0;}int factorial(int num){    int iFac_m=1;    int i;    for(i=1;i<=num;++i)    {        iFac_m *= i;    }    return(iFac_m);}


【项目5-当年第几天】
定义一个函数,其参数为年、月、日的值,返回这一天为该年的第几天。要求在main函数中输入年月日,然后调用这个函数求值,并在main函数中输出结果。

#include <stdio.h>#include <stdlib.h>int dayth(int,int,int);int main(){    printf("please enter year month day successively:");    int iYear,iMonth,iDay;    int n=0;    scanf("%d%d%d",&iYear,&iMonth,&iDay);    n=dayth(iYear,iMonth,iDay);    printf("the date is the %d th day of the year:",n);    return 0;} int dayth(int year,int month,int day) {     int m;//第几天     int month_2;//2月天数     if(year%4==0&&year%400==0)       month_2=29;       else            month_2=28;     switch(month)     {         case 1:m=day;break;         case 2:m=31+day;break;         case 3:m=31+month_2+day;break;         case 4:m=31*2+month_2+day;break;         case 5:m=31*2+30+month_2+day;break;         case 6:m=31*3+30+month_2+day;break;         case 7:m=31*3+30*2+month_2+day;break;         case 8:m=31*4+30*2+month_2+day;break;         case 9:m=31*5+30*2+month_2+day;break;         case 10:m=31*5+30*3+month_2+day;break;         case 11:m=31*6+30*2+month_2+day;break;         case 12:m=31*6+30*3+month_2+day;break;     }   return(m); }


【项目6-回文、素数】
(1)编制一个函数reverse,返回给定数据的“反序数”,例如输入1234,输出4321。请编制reverse函数,在下面代码的基础上补充相关的部分,实现要求的功能。

(2)编制isPalindrome(),用于判断参数是否是回文数——回文数,即从前往后读和从后往前读都一样的数,如1221和121都是回文数,而1231、123都不是回文数。isPalindrome()函数的返回值是int型,是回文返回1(真),不是回文,返回0(假)。请编制isPalindrome(函数,在下面代码的基础上补充相关的部分,实现要求的功能。

(3)编制一个返回值为int型的函数isPrimer(),用于判断参数是否为素数(是素数返回1-真,不是回文,返回0-假),自编main函数用于测试。

(4)(4)编制main函数,调用上面定义的3个函数,完成

  • 输出1000以内的所有素数。
  • 输出1000以内的所有回文数。
  • 输出1000以内的所有回文素数。
  • 若一个素数的反序数仍为素数,则称它为可逆素数。求10000以内的所有可逆素数。
解法:

#include <stdio.h>#include <stdlib.h>int reverse(int);int isPalindrome(int);int isPrimer(int);int main(){    printf("please enter a multi-digit number:");    int n;    int n_reverse;    scanf("%d",&n);    n_reverse=reverse(n);    if(isPalindrome(n)==1)        printf("this number is a palindrome number and its value is:%d\n",n_reverse);    else        printf("this number is not a palindrome number\n");    if(isPrimer(n)==1)        printf("this number is a primer number\n");    else        printf("this number is a primer number\n");    return 0;}int reverse(int m){    int m_rev=0;    int k;    k=m;    while(k!=0)    {        m_rev=10*m_rev+k%10;        k=k/10;    }    return(m_rev);}int isPalindrome(int m){    int a;    if(m==reverse(m))        a=1;    else        a=0;    return(a);}int isPrimer(int m){    int i,a;    for(i=2;i<m;++i)    {        if(m/i==0)            a=0;        else            a=1;    }    return(a);}

【项目7-太乐了】
先听故事,再编程序。
故事是这样的:话说sin和cos是一对夫妇。一天,sin去听相声了,cos在家。过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数。cos问:你是谁啊?他说:我是你的老公sin啊。cos说:你不是去听相声了吗?怎么成这幅摸样了?sin说:是啊,太乐了!
故事讲完了。下面是sin函数的泰勒展式:
(注:x取弧度值,而非角度值)
用sin泰勒展式编写程序,求出sin(π/2)和sin(56°)的值,精度要求达到小数点后6位(即当最后一项的绝对值小于0.00001时,累加结束,求绝对值的函数也可以自定义函数myabs实现)。

说明:sin听相声“太乐”了,变成了多项式,连太太cos都不认识了。利用泰勒公式将任意函数展开为多项式进行计算,是计算机求解数值问题的一个重要手段。高等数学中的“泰勒定理”为我们解决这一大类问题提供了理论依据与方法指导。高等数学、线性代数等课程为我们提供解决各种问题的基础知识,是大学中最为实用的学科,学好,必须的。
实际上,C语言的数学库(#include<math.h>)中已经提供了sin和cos函数,以及求绝对值的函数fabs,一般解题中我们直接调用即可,而本题要求自定义函数实现,为区别起见,分别起名为mysin、mycos、myabs。

解法:

#include <stdio.h>#include <stdlib.h>#define a 0.00001double mysin(double);double myabs(double);int main(){    double r;    double sin_value;    printf("please enter a radian:");    scanf("%lf",&r);    sin_value=mysin(r);    printf("the value of sin(r) is :%lf",sin_value);    return 0;}double myabs(double x){    if(x<0)        x=(-x);    else        x=x;        return(x);}int factorial(int num){    int iFac_m=1;    int i;    for(i=1;i<=num;++i)    {        iFac_m *= i;    }    return(iFac_m);}double mysin(double dRad){  double dError;  double dSum;  double dPow;  int n;  int sign=-1;  int i=1;  double x=dRad;    dSum=x;    dPow=x;  do  {      n=2*i+1;      dError=(sign*(dPow*x*x))/factorial(n);      dSum += dError;      sign=-sign;      ++i;  }while(myabs(dError)>0.00001);  return(dSum);}



































































































































0 0
原创粉丝点击