C++学习笔记(4)--练习题
给出年、月、日 , 计算该日是该年的第几天?
//编写函数,将给定的字符串的大写字母转变成小写字母; 其它字符不变。
//ASCⅡ码表:大写字母[65-90]小写字母[97-122]
void exam8()
{
string s = "Hello World";
cout << s << endl;
for (size_t i = 0; i < s.length(); i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')s[i] = (char)((int)s[i] + 32);
}
cout << s << endl;
}
//给出年、月、日 , 计算该日是该年的第几天?
//“能被400整除,或者能被4整除但不能被100整除的都是闰年,其余的年份均为平年。能被400整除的为世纪闰年,如2000年就是世纪闰年。
bool isLeap(int y)//是否是闰年
{
return (y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0));
}
int getDays(int y, int m)//获取某个月的天数
{
//if (m < 1 || m>12||y<0)return 0;
switch (m)
{
case 2:
if (isLeap(y))return 29;
else return 28;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
default: return 30;
}
}
int getAllDays(int y, int m, int d)
{
int count = 0;
for (size_t i = 1; i <= m - 1; i++)//所有月份天数相加
{
count += getDays(y, i);
}
count += d;
return count;
}
void exam9()
{
int y = 2008, m = 3, d = 1;
int count = getAllDays(y, m, d);
cout << y << "年" << m << "月" << d << "日" << " 是本年中第" << count << "天" << endl;
y = 2022, m = 12, d = 31;
count = getAllDays(y, m, d);
cout << y << "年" << m << "月" << d << "日" << " 是本年中第" << count << "天" << endl;
}
编写函数,将给定的字符串的大写字母转变成小写字母; 其它字符不变。
//编写函数,将给定的字符串的大写字母转变成小写字母; 其它字符不变。
//ASCⅡ码表:大写字母[65-90]小写字母[97-122]
void exam8()
{
string s = "Hello World";
cout << s << endl;
for (size_t i = 0; i < s.length(); i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')s[i] = (char)((int)s[i] + 32);
}
cout << s << endl;
}
编写一个函数 converse ,将一维数组中的数逆序存放,不允许使用辅助数组。主函数输入原始数据,调用 converse ,实现逆置。并将原数组和逆置后的数组输出
//编写一个函数 converse ,将一维数组中的数逆序存放,不允许使用辅助数组。主函数输入原始数据,调用 converse ,实现逆置。并将原数组和逆置后的数组输出
void converse(int arr[],int len)
{
int half = len / 2;
int temp;
for (size_t i = 0; i < half; i++)
{
temp = arr[i];
arr[i] = arr[len - i - 1];
arr[len - i - 1] = temp;
}
}
void showArr(int arr[], int len)
{
for (size_t i = 0; i < len; i++)
{
cout << arr[i] << ",";
}
cout << endl;
}
void exam7()
{
int arr[] = { 1,2,3,4,5,6 };
int len = sizeof(arr) / sizeof(arr[0]);
showArr(arr,len);
converse(arr,len);
showArr(arr, len);
int arr2[] = { 10,20,30,40,50,80,90 };
len = sizeof(arr2) / sizeof(arr[0]);
showArr(arr2, len);
converse(arr2, len);
showArr(arr2, len);
}
编一个函数 GCD,求两个无符号整数的最大公约数。主函数输入两个正整数 m 和 n, 调用 GCD,求出 m和 n 的最大公约数和最小公倍数 . 并输出。
//编一个函数 GCD,求两个无符号整数的最大公约数。主函数输入两个正整数 m 和 n, 调用 GCD,求出 m和 n 的最大公约数和最小公倍数.并输出。
//两个数的乘积等于抄这两个数的最大公约数与最小公倍数的乘积。假设有两个数是a、b,它们的最大公约数是p,最小公倍数是q。那么有这样的关系:ab = pq
int GCD(int m, int n)
{
int min = m > n ? m : n;
int commonDivisor=1;
for (size_t i = 2; i <= min; i++)
{
if (m % i == 0 && n % i == 0)commonDivisor = i;
}
return commonDivisor;
}
void exam6()
{
int m = 12, n = 15;
cout << "m=" << m << " n=" << n << " 最大公约数=" << GCD(m,n) << " 最小公倍数=" << m * n / GCD(m, n) << endl;
m = 100, n = 75;
cout << "m=" << m << " n=" << n << " 最大公约数=" << GCD(m, n) << " 最小公倍数=" << m * n / GCD(m, n) << endl;
m = 66, n = 666;
cout << "m=" << m << " n=" << n << " 最大公约数=" << GCD(m, n) << " 最小公倍数=" << m * n / GCD(m, n) << endl;
}
//编程计算 : 1*2*3+3*4*5+ …+99*100*101 的值
void exam5()
{
int sum = 0;
for (size_t i = 1; i <= 99; i+=2)
{
sum += i * (i + 1) * (i + 2);
}
cout << "sum=" << sum << endl;
}
计算: 1+1/ (1+2) +1/ (1+2+3) +…+ 1/ (1+2+…+n) , n 由键盘输入
//计算: 1+1/ (1+2) +1/ (1+2+3) +…+ 1/ (1+2+…+n) , n 由键盘输入
void exam4()
{
string s; int n;
while (true)
{
cout << "请输入正整数..." << endl;
getline(cin, s);
try
{
n = stoi(s);
break;
}
catch (const std::exception&)
{
cout << "输入错误..." << endl;
continue;
}
}
float sum = 0, temp = 0;
for (size_t i = 1; i <= n; i++)
{
temp += i;
sum += 1 / temp;
}
cout << "n=" << n << " temp=" << temp << " sum=" << sum << endl;
}
求全部水仙花数。所谓水仙花数是指一个三位数,其各位数字立方的和等于该数。如: 153 = 1*1*1+ 5*5*5 + 3*3*3。
//求全部水仙花数。所谓水仙花数是指一个三位数,其各位数字立方的和等于该数。如: 153 = 13+ 5 3 + 3 3。
void exam3()
{
list<int> flower;
int a, b, c;//分别表示个位数,十位数,百位数
for (size_t i = 100; i < 1000; i++)
{
a = i % 10;
b = i / 10 % 10;
c = i / 100;
if (i == a * a * a + b * b * b + c * c * c)flower.push_back(i);
}
for (list<int>::iterator i = flower.begin(); i !=flower.end();i++)
{
cout <<"水仙花数:" << *i << endl;
}
}
由键盘输入的任意一组字符, 统计其中大写字母的个数 m和小写字母的个数 n
//由键盘输入的任意一组字符, 统计其中大写字母的个数 m和小写字母的个数 n
//ASCⅡ码表:大写字母[65-90]小写字母[97-122]
void exam2()
{
string s;
getline(cin,s);
int m = 0, n = 0, temp = 0;
for (size_t i = 0; i < s.length(); i++)
{
temp = (int)s[i];
if (temp >= 65 && temp <= 90)m++;
else if (temp >= 97 && temp <= 122)n++;
}
cout << "大写字母个数=" << m << " 小写字母个数=" << n << endl;
}
void exam2_2()
{
string s;
getline(cin, s);
int m = 0, n = 0;
for (size_t i = 0; i < s.length(); i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')m++;
else if (s[i] >= 'a' && s[i] <= 'z')n++;
}
cout << "大写字母个数=" << m << " 小写字母个数=" << n << endl;
}
编程计算: 1!+2!+3!+ …+20! ,并将结果输出
//编程计算: 1!+2!+3!+ …+20! ,并将结果输出
void exam1()
{
long long sum = 0;
long long fac = 1;
for (size_t i = 1; i <= 20; i++)
{
fac *= i;
sum += fac;
cout <<"i="<<i<< " fac=" << fac << " sum=" << sum << endl;
}
cout << "intMax=" << numeric_limits<int>::max << endl;
cout << "longMax=" << numeric_limits<long>::max << endl;
cout << "longlongMax=" << numeric_limits<long long>::max << endl;
}