贺利坚练习(3)

来源:互联网 发布:java项目开发全程实录 编辑:程序博客网 时间:2024/06/07 14:45

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

这里写图片描述

void printstars(int m) //定义能输出一行m个星号的函数  {    for (int j = 1; j <= m; ++j)        cout << '*';}int _tmain(int argc, _TCHAR* argv[]){    int n = 6; //n代表要输出的行数     for (int i = 1; i <= n; ++i)    {        //请在下面写上调用printstars函数的语句,使程序输出右图          printstars(i);        cout << endl;    }    return 0;}

(2)根据main函数中对printchs函数的调用,以及printchs的功能要求,编写printchs函数。、
这里写图片描述

//在下面写printchs函数的定义,功能是输出一行若干个指定字符void printchs(int m,char a)  {    for (int j = 1; j <= m; ++j)        cout << a;}int _tmain(int argc, _TCHAR* argv[]){    int n = 6; //n代表要输出的行数      int i;    //通过在下面的循环里调用printchs函数,输出右面的图      for (i = 1; i <= n; ++i)    {        printchs(n - i, ' ');        printchs(2 * i - 1, '*');        cout << endl;    }    return 0;}

(3)在上面的程序中,只改动一处,输出下面的图形:
这里写图片描述

void printchs(int m,char a) //定义能输出一行m个星号的函数  {    for (int j = 1; j <= m; ++j)        cout << a;}int _tmain(int argc, _TCHAR* argv[]){    int n = 6; //n代表要输出的行数      int i;    //通过在下面的循环里调用printchs函数,输出右面的图      for (i = 1; i <= n; ++i)    {        printchs(n - i, ' ');        printchs(2 * i - 1, 'A'+i-1);    //修改处        cout << endl;    }    return 0;}

【项目2-求最大公约数】
(1)输入两个数,并求出其最大公约数
笨方法:

int gcd(int x, int y) //定义用于求两数的最大公约数的函数,函数只管求值,不管输出。输出由main完成  {    int z;    if (x%y == 0)    {        z = y;    }    else if (y%x == 0)    {        z = x;    }    else    {        if (x < y)        {            for (int i = 1; i < x; ++i)            {                if ((x%i == 0) && (y%i == 0))                    z = i;            }        }        else        {            for (int i = 1; i < y; ++i)            {                if ((x%i == 0) && (y%i == 0))                    z = i;            }        }    }    return z;}int _tmain(int argc, _TCHAR* argv[]){    int a, b, g;    cin >> a >> b;    g = gcd(a, b);    cout << "最大公约数是: " << g;    return 0;}

用辗转相除法:

int gcd(int x, int y) //定义用于求两数的最大公约数的函数,函数只管求值,不管输出。输出由main完成  {    int r;      while(y>0)      {          r=x%y;          x=y;          y=r;      }      return x;  }int _tmain(int argc, _TCHAR* argv[]){    int a, b, g;    cin >> a >> b;    g = gcd(a, b);    cout << "最大公约数是: " << g;    return 0;}

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

int gcd(int x, int y) //定义用于求两数的最大公约数的函数,函数只管求值,不管输出。输出由main完成  {    int r;      while(y>0)      {          r=x%y;          x=y;          y=r;      }      return x;  }int gcds(int x, int y, int z, int w)   //调用gcd()求四数的最大公约数  {     int r1 = gcd(x, y);    int r2 = gcd(z, w);    int r3 = gcd(r1, r2);    return r3;}int _tmain(int argc, _TCHAR* argv[]){    int a, b,c,d, g;    cin >> a >> b>>c>>d;    g = gcds(a, b,c,d);    cout << "最大公约数是: " << g;    return 0;}

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

long fac(int n){    long result = 1;    for (n; n > 0; --n)        result *= n;    return result;}int _tmain(int argc, _TCHAR* argv[]){    int a, b, c;    for (int i = 100; i <= 999; ++i)    {        a = i / 100;        b = i % 100 / 10;        c = i % 10;        if ((fac(a) + fac(b) + fac(c)) == i)            cout << i << endl;    }    return 0;}

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

int days(int y, int m, int d){    int Cnt;    if (year%4==0&&year%100!=0||year%400==0)     {        switch (m)        {        case 1:            Cnt = d;            break;        case 2:            Cnt = d + 31;            break;        case 3:            Cnt = d + 60;            break;        case 4:            Cnt = d + 91;            break;        case 5:            Cnt = d + 121;            break;        case 6:            Cnt = d + 152;            break;        case 7:            Cnt = d + 182;            break;        case 8:            Cnt = d + 213;            break;        case 9:            Cnt = d + 244;            break;        case 10:            Cnt = d + 274;            break;        case 11:            Cnt = d + 305;            break;        case 12:            Cnt = d + 335;            break;        }    }    else    {        switch (m)        {        case 1:            Cnt = d;            break;        case 2:            Cnt = d + 31;            break;        case 3:            Cnt = d + 59;            break;        case 4:            Cnt = d + 90;            break;        case 5:            Cnt = d + 120;            break;        case 6:            Cnt = d + 151;            break;        case 7:            Cnt = d + 181;            break;        case 8:            Cnt = d + 212;            break;        case 9:            Cnt = d + 243;            break;        case 10:            Cnt = d + 273;            break;        case 11:            Cnt = d + 304;            break;        case 12:            Cnt = d + 334;            break;        }    }    return Cnt;}int _tmain(int argc, _TCHAR* argv[]){    int year, month, day;    cout << "输入年 月 日" << endl;    cin >> year >> month >> day;    cout << "这是该年的第" << days(year, month, day) << "天" << endl;    return 0;}

简单方法1:

    #include<iostream>      using namespace std;      int days(int y, int m, int d);      int main()      {          int year, month, day;          cout<<"输入年 月 日"<<endl;          cin>>year>>month>>day;          cout<<"这是该年的第"<<days(year, month, day)<<"天"<<endl;          return 0;      }      int days(int y, int m, int d)      {          int sum=d;          //加上前m-1月的天数          for(int i=1;i<m;i++)          {              switch(i)              {              case 2:                  sum+=((y%4==0&&y%100!=0)||y%400==0)?29:28;                  break;              case 4:              case 6:              case 9:              case 11:                  sum+=30;                  break;              default:                  sum+=31;                  break;              }          }          return sum;      }  

简单方法2:

    #include<iostream>      using namespace std;      int days(int y, int m, int d);      int main()      {          int year, month, day;          cout<<"输入年 月 日"<<endl;          cin>>year>>month>>day;          cout<<"这是该年的第"<<days(year, month, day)<<"天"<<endl;          return 0;      }      int days(int y, int m, int d)      {          int sum=d;          //加上前m-1月的天数          for(int i=1; i<m; i++)          {              if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)                  sum+=31;              else if (i==4||i==6||i==9||i==11)                  sum+=30;              else                  sum+=((y%4==0&&y%100!=0)||y%400==0)?29:28;          }          return sum;      }  

简单方法3:

#include<iostream>  using namespace std;  int days(int y, int m, int d);  int main()  {      int year, month, day;      cout<<"输入年 月 日"<<endl;      cin>>year>>month>>day;      cout<<"这是该年的第"<<days(year, month, day)<<"天"<<endl;      return 0;  }  int days(int y, int m, int d)  {      int sum=d;      int a[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};      for(int i=1; i<m; i++)      {          sum+=a[i];      }      if(m>2&&((y%4==0&&y%100!=0)||y%400==0)) //若闰年,且晚于2月,加一天          sum++;      return sum;  } 

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

int reverse(int x)   //函数只管求值,不管输出。输出由main函数完成  {    int y,z=0;    while (x > 0)    {        y = x % 10;        x = x / 10;        z = z * 10 + y;    }    return z;}int _tmain(int argc, _TCHAR* argv[]){    int m, n;    cin >> m;    n = reverse(m);    cout << n << endl;    return 0;}

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

bool isPalindrome(int x){    int save = x;    int y, z = 0;    while (x > 0)    {        y = x % 10;        x = x / 10;        z = z * 10 + y;    }    if (z == save)        return 1;    else        return 0;}int _tmain(int argc, _TCHAR* argv[]){    int m;    cin >> m;    if (isPalindrome(m))        cout << m << "是回文数,噢耶!" << endl;    else        cout << m << "不是回文数。回文有什么好!" << endl;    return 0;}

(3)编制一个返回值为bool型的函数isPrimer(),用于判断参数是否为素数(是素数返回true,否则false),自编main函数用于测试;

bool isPrimer(int n)  //在这个函数中只管判断,不能出现cout语句!  {    for (int i = 3; i < n; ++i)    {        if (n%i == 0)            return false;        else if((i == n-1)&&(n%i != 0))            return true;    }}int _tmain(int argc, _TCHAR* argv[]){    int num;    cin >> num;    if (isPrimer(num))        cout << "是质数 " << endl;    else        cout << "不是质数" << endl;    return 0;}
0 0