【项目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;
}