C++ 函数编程题
目录
1、等差数列求和
2、判断数字位数
3、有规律的图形
4、简易计算器
5、素数对
6、用函数打印金字塔
7、用函数计算员工的平均工资
8、用函数计算斐波那契数列的指定项
(1)要求用非递归函数实现用函数计算斐波那契数列的指定项
(2)要求用递归函数实现用函数计算斐波那契数列的指定项
9、素数:要求将判断一个整数是否为素数用函数实现。
(1)判断一个整数是不是素数,并且将判断一个整数是否为素数用函数实现。
(2)输入一组整数,共为n个,输出其中素数的个数。要求将判断一个整数是否为素数用函数实现。
10、因数个数之和
11、计算小母牛数量
12、求x的n次幂,要求用递归函数,其中n为非负整数。
13、累加和
14、利用函数计算平均值
(1)编写一个函数f(x)判断整数为正整数、负整数、还是零。 利用该函数实现计算输入的n个整数中正整数的平均值。
(2)编写计算数组a中前n个元素的平均值的函数,计算平均值
1、等差数列求和
编写一个函数sum,计算等差数列中前n项数据的和。已知等差数列的起始项为2。
例如:等差数列2,5,8,11…,需要利用sum函数求出前3项的和为15。
【题目要求】
① 等差数列中数字之间的差值不固定,需要自行输入。
② 输入要求的数列项数n。
③ 输出前n项数据的和。【输入描述】
两个正整数;
第一个正整数为数列中数字之间的差值(1≤差值≤50);
第二个正整数为求和数列的项数n(1≤n≤100);
两项内容中间用空格分隔。【输出描述】
一个正整数,代表前n项数据的和。用例输入:
4 5
用例输出:
50
#include <iostream>
using namespace std;
// 等差数列前 n 项和 Sn=n*a1+n(n-1)d/2
int arithmeticProgressionSum(int d, int n) {
int a1 = 2, sum;
sum = n * a1 + n * (n - 1) * d / 2; // Sn=n*a1+n(n-1)d/2
return sum;
}
int main() {
// differenceValue:差值,numberOfTerms:=n项数据
int differenceValue = 1, numberOfTerms = 1;
cin >> differenceValue >> numberOfTerms;
int sum;
sum = arithmeticProgressionSum(differenceValue, numberOfTerms);
cout << sum << endl;
return 0;
}
2、判断数字位数
编写一个函数get_length,计算输入的正整数有多少位。输入的第一个数字不为 0。
【输入描述】
一个正整数(不超过10位)。
【输出描述】
一个正整数,代表数字的位数。
方法一:用while
#include <iostream>
using namespace std;
int get_length(int number) {
int length = 0; // length获取数字的位数
// 注意:5/10 = 0
while(number>0){
number=number/10;
length++;
}
return length;
}
int main() {
int number, count;
cin >> number;
count = get_length(number);
cout << count;
return 0;
}
方法二:用for
#include <iostream>
using namespace std;
int get_length(int number) {
int length;
// 注意:5/10 = 0
for (length = 0;number > 0;length++) {
number /= 10;
}
return length;
}
int main() {
int number, count;
cin >> number;
count = get_length(number);
cout << count;
return 0;
}
3、有规律的图形
编写一个函数graph,输出一个a行b列(1≤a,b≤10000)由任意符号组成的矩形。
【输入描述】
一行,两个整数a, b(分别代表行与列,1≤a,b≤10000),一个字符,中间用空格分隔。
【输出描述】
a行b列由指定字符组成的矩形。
【用例输入】
3 4 @
【用例输出】
@@@@
@@@@
@@@@
#include <iostream>
using namespace std;
//定义输出有规律的图形的函数
void graph(int row,int column, char c) {
for (int i = 1;i <= row;i++) {
for (int j = 1;j <= column;j++) {
cout << c;
}
cout << endl;
}
}
int main() {
int row, column;
char c;
cin >> row >> column >> c;
//调用函数graph
graph(row, column, c);
return 0;
}
4、简易计算器
编写一个函数calcu进行四则运算的计算器。输入两个数,和四则运算符号,即可返回计算的结果。
【输入描述】
一行,两个正整数(1≤数字≤10000),一个字符(‘+’、‘-’、‘*’、‘/’),内容之间用空格分隔。
【输出描述】
一个整数,代表计算结果。
#include <iostream>
using namespace std;
void calcu(int number1, char opt, int number2) {
switch (opt) {
case '+':
cout << number1 + number2;
break;
case '-':
cout << number1 - number2;
break;
case '*':
cout << number1 * number2;
break;
case '/':
cout << number1 / number2;
break;
default:
cout << "请输入正确的运算符" << endl;
break;
}
}
int main() {
int number1, number2;
char opt;
cin >> number1 >> opt >> number2;
calcu(number1, opt, number2);
return 0;
}
5、素数对
两个相差为 2 的素数成为素数对,5 和 7,17 和 19,求出不大于 n 的素数对,没有输出 “empty”。n≤1000。
【输入描述】
输入一个 n。
【输出描述】
n 以内的素数对。
【用例输入】
11
【用例输出】
3 5
5 7
#include <bits/stdc++.h>
using namespace std;
int primeNumber(int x) {
for (int i = 2;i <= sqrt(x);i++) { // sqrt()平方根函数
// 如果 x 能被其他数整除,那就不是素数
if (x % i == 0) {
return 0; //不是素数
}
}
return 1; //是素数
}
int main() {
int n,flag=0; // flag是用来判断有没有素数对
cin >> n;
// 从2开始,因为要素数
for (int i = 2;i <= n-2;i++) {
if ((primeNumber(i) == 1) && (primeNumber(i + 2) == 1)) {
printf("%d %d\n",i,i+2);
flag = 1;
}
}
if (flag == 0) { // 思路陷阱:因为最终要判断结果是不是,所以需要用到flag
cout << "empty";
}
return 0;
}
6、用函数打印金字塔
请输入金字塔层数:4
请输入金字塔符号:*
*
***
*****
******* 思路容易误解:星号之间没有空格,只是前面为空格,中间为星号
【分析】
若输入四层:外循环为4次
3空格 1星号
2空格 3星号
1空格 5星号
0空格 7星号
内层循环空格:
3空格:循环3次空格
2空格:循环2次空格
1空格:循环1次空格 循环次数=n-1-i(i=0开始)
内层循环星号:
方法一:
#include <iostream>
using namespace std;
// 定义一个函数pyramid,用于打印金字塔形状 思路陷阱:打印到中间的*结束之后的空格不用管
// 参数n表示金字塔的层数,ch表示金字塔的符号,默认为'*'
void pyramid(int n,char ch='*') {
for (int i = 0; i < n; i++) { // 外层循环,控制金字塔的层数
for (int j = 0; j < n - 1 - i ; j++) { // 内层循环,打印每行前面的空格,使金字塔居中
cout << " ";
}
for (int j = 0; j < 2 * i + 1; j++) { // 内层循环,打印每行的符号,形成金字塔的宽度
cout << ch;
}
cout << endl; // 每打印完一行后换行
}
}
int main() {
int n;
cout << "请输入金字塔层数:";
cin >> n;
char ch;
cout << "请输入金字塔符号:";
cin >> ch;
pyramid(n, ch);
return 0;
}
方法二:仅用了system("pause")
#include <iostream>
#include <Windows.h> // 调用Windows API,这里主要用于system("pause")
using namespace std;
// 定义一个函数pyramid,用于打印金字塔形状 思路陷阱:打印到中间的*结束之后的空格不用管
// 参数n表示金字塔的层数,ch表示金字塔的符号,默认为'*'
void pyramid(int n,char ch='*') {
for (int i = 0; i < n; i++) { // 外层循环,控制金字塔的层数
for (int j = 0; j < n - 1 - i ; j++) { // 内层循环,打印每行前面的空格,使金字塔居中
cout << " ";
}
for (int j = 0; j < 2 * i + 1; j++) { // 内层循环,打印每行的符号,形成金字塔的宽度
cout << ch;
}
cout << endl; // 每打印完一行后换行
}
}
int main(void) {
int n;
cout << "请输入金字塔层数:";
cin >> n;
char ch;
cout << "请输入金字塔符号:";
cin >> ch;
pyramid(n, ch); // 调用pyramid函数,根据用户输入的层数和符号打印金字塔
system("pause"); // 调用Windows API,使程序暂停,等待用户按键继续
return 0; // 程序正常结束,返回0
}
7、用函数计算员工的平均工资
意思为把计算员工的平均工资编写为函数,其中数组作为函数参数
#include <iostream>
using namespace std;
int AverageSalary(int data[], int n) { // 数组作为函数参数
int sum = 0;
for (int i = 0; i < n; i++) {
sum += data[i];
}
return sum / n;
}
int main() {
int salary[5] = { 12000,20000,30000,45000,9500 };
cout << AverageSalary(salary, 5) << endl;
return 0;
}
8、用函数计算斐波那契数列的指定项
(1)要求用非递归函数实现用函数计算斐波那契数列的指定项
#include <iostream>
using namespace std;
long long fib(int n) {
if (n < 0) {
cout << "参数错误" << endl;
return -1;
}
if (n == 1 || n == 2) {
return 1;
}
long long a1 = 1;
long long a2 = 1;
long long tmp;
for (int i = 3; i <= n; i++) {
tmp = a1 + a2;
a1 = a2;
a2 = tmp;
}
return a2;
}
int main() { // 注意:int main(void)=int main()
cout << fib(5) << endl; // 输出5
return 0;
}
(2)要求用递归函数实现用函数计算斐波那契数列的指定项
#include<stdio.h>
int fib(int n){
if (n == 1 || n == 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main(){
printf("%d\n", fib(8));//输出21
return 0;
}
9、素数:要求将判断一个整数是否为素数用函数实现。
(1)判断一个整数是不是素数,并且将判断一个整数是否为素数用函数实现。
#include <iostream>
#include <cmath>
using namespace std;
bool sushu(int num){
if(num<2)
return false;
else{
for(int i=2;i<=sqrt(num);i++){ // 注意:为<= ,不是<
if(num % i==0)
return false;
}
return true;
}
}
int main(){
int n;
bool result;
cin >> n;
result=sushu(n);
if(result)
cout << n << "是素数";
else
cout << n << "不是素数";
}
(2)输入一组整数,共为n个,输出其中素数的个数。要求将判断一个整数是否为素数用函数实现。
#include <iostream>
#include <cmath>
using namespace std;
bool sushu(int num){
if(num<2)
return false;
else{
// sqrt函数返回double类型,但在循环条件中应使用整数。可以直接使用整数来避免浮点数比较。i<=sqrt(num)
for(int i=2;i<=sqrt(num);i++){ // 修改为<=以确保检查sqrt(num)本身
if(num % i==0)
return false;
}
return true;
}
}
int main(){
int i,n,a[20],count=0;
bool result;
cin >> n;
for(i=0;i<n;i++)
cin >> a[i];
for(i=0;i<n;i++){
result=sushu(a[i]); //易错:sushu()返回值为bool类型,所以需要和true、flase比较,不要和1和0比较。
if(result){ // 注意:if(result==true) 等于 if(result)
cout << a[i] << "是素数" << endl;
count++;
}
else
cout << a[i] << "不是素数" << endl;
}
cout << "素数的个数为:" << count;
return 0;
}
10、因数个数之和
输入一组整数,共n个,计算这些整数的因数个数之和。要求计算一个整数的因数个数用函数实现。
#include <iostream>
using namespace std;
int yinshu(int num){
int count=0;
for(int i=1;i<=num;i++)
if(num%i==0)
count++;
return count;
}
int main(){
int i,n,a[20],sumCount=0;
cin >> n;
for(i=0;i<n;i++)
cin >> a[i];
for(i=0;i<n;i++)
sumCount+=yinshu(a[i]);
cout << sumCount;
return 0;
}
11、计算小母牛数量
若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛。(用递归函数方法求解)
第1年:1头母牛
第2年:1头母牛
第3年:1头母牛
第n年(n>3):四个年头开始每年生一头母牛
第n-1年的母牛数量+第n-3年的母牛数量(因为每头母牛从第四年n年开始生育,生育第n-3年个新母牛)
输入样例:7
输出样例:6
#include <iostream>
using namespace std;
// 递归函数,计算第n年的母牛数量
int cowCount(int n) {
// 基本情况:前3年每年只有1头母牛
if (n == 1 || n == 2 || n == 3) {
return 1;
}
// 递归情况:第n年的母牛数量等于第n-1年的数量加上第n-3年的数量所生的新母牛
return cowCount(n - 1) + cowCount(n - 3);
}
int main() {
int n;
cout << "请输入年份n: ";
cin >> n;
// 调用递归函数计算第n年的母牛数量,并输出结果
cout << "第" << n << "年的母牛数量为: " << cowCount(n) << endl;
return 0;
}
12、求x的n次幂,要求用递归函数,其中n为非负整数。
#include<iostream>
using namespace std;
double f(double x, int n)
{
if (n == 0)
return 1;
return x * f(x, n - 1);
}
int main()
{
double x;
int n;
cin >> x >> n;
cout << f(x, n) << endl;
return 0;
}
13、累加和
编写一个函数f(n)=1+2+…+n,利用该函数计算并输出f(m)+f(n)。
#include<iostream>
using namespace std;
int f(int n)
{
if (n == 1)
return 1;
return n + f(n - 1);
}
int main()
{
int m, n;
cin >> m >> n;
cout << f(m) + f(n) << endl; // f(3)+f(5)=21
return 0;
}
14、利用函数计算平均值
(1)编写一个函数f(x)判断整数为正整数、负整数、还是零。 利用该函数实现计算输入的n个整数中正整数的平均值。
#include<iostream>
using namespace std;
// 判断整数为正整数、负整数、还是零
int f(int x)
{
if (x > 0)
return 1;
else if (x < 0)
return -1;
else
return 0;
}
int main()
{
int n, x, count = 0;
double s = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> x;
if (f(x) == 1)
{
s += x;
count++;
}
}
cout << s / count << endl;
return 0;
}
(2)编写计算数组a中前n个元素的平均值的函数,计算平均值
#include<iostream>
using namespace std;
// 计算数组a中前n个元素的平均值
double avge(int a[20],int n) //double返回类型以支持小数结果
{
int sum=0;
for(int i=0;i<n;i++)
sum+=a[i];
//注意:static_cast<double>类型转换,其中cast为类型转换的意思
return static_cast<double>(sum)/n; // 强制转换sum为double进行除法
}
int main()
{
int n,a[20];
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
// 易错:不是avge(a[i],n),而是avge(a,n),因为a[i]为单个元素,但是要输入整个数组
cout <<avge(a,n) << endl;
return 0;
}