实验4-函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验4 函数
程序填空
1.普通参数
本题分值:4
题目描述:输入日期的年份和月份,求该月有多少天。

要求编写函数int daynum(int year,int month),求出以year为年份、以month为月份的某个月的天数。

以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。

代码:
//通过日期求某月的天数。

#include<iostream>
using namespace std;
int main()
{
int daynum(int year,int month);
int y,m,d;
cin>>y>>m;
if(y<1900 || y>=3000 || m<1 || m>12)
{
cout<<"输入错误!"<<endl;
return 0;
}
d=daynum(__(1)__); //以y、m作实参调用函数,求出该月的天数
cout<<"此月的天数为"<<d<<endl;
return 0;
}
int daynum(int year,int month)
{
int days;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: days=31; break;
case 4:
case 6:
case 9:
case 11: days=30; break;
case 2: if(year%4==0&&year%100!=0 || year%400==0)
days=29;
else
days=28;
break;
}
return __(2)__;
}
答案:
(1) y,m
(2) days
每空分值:2
参考答案:yx3-t1.cpp
2.字符数组参数
本题分值:4
题目描述:编写一个函数,用来求字符串s的任意子串。

函数原型为
void SubString ( char s[ ] , int start , int len , char d[ ] ) ;
其中s是原字符串,d用来存放s中从第start个字符开始(1≤start≤strlen(s) ),长度为len 的子串。

以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。

代码:
#include <iostream>
using namespace std;
int main( )
{
void SubString(char s[ ], int start, int len, char d[ ]);
char s[81],d[81];
int m,n;
gets(s); //输入一个字符串的值存放在字符数组s中,以回车结束
//cout<<"从第m个字符开始(m≥1)取n个字符构成的子串。

请依次输入m、n的值:"; cin>>m>>n;
if(m>strlen(s) || n>strlen(s) || m+n>strlen(s)+1)
{
cout<<"m、n值超过了范围!\n";
return 0;
}
SubString(__(1)__);
cout<<d<<endl;
return 0;
}
//从s中第start个字符开始取出长度为len的子串放入d中
void SubString(char s[ ], int start, int len, char d[ ])
{
int k,j;
for(j=0,k=start-1;j<=__(2)__;j++,k++)
d[j]=s[k];
d[len]='\0';
}
答案:
(1) s,m,n,d
(2) len-1
每空分值:2
参考答案:yx3-t2.cpp
3.嵌套调用
本题分值:6
题目描述:验证哥德巴赫猜想:对任意输入的正整数n,验证6~n以内的偶数都可分解为两个素数(质数)之和。

以下程序中,函数bool divide(int n)是用来将偶数n分解为两个质数的;若分解成功,则返回true;否则返回false。

函数bool IsPrime(int m)是用来判断m是否为质数的;若是,则函数返回true;否则返回false。

请在计算机上调试以下程序,补足其中的空格。

代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
bool divide(int n);
int i,n;
cin>>n;
if(n<6)
{
cout<<"输入数据出错\n";
return 0;
}
for(i=6;i<=n;i+=2)
if(divide(i)== __(1)__) //对i进行分解,并判断分解是否成功
{
cout<<"猜想错误\n";
return 0;
}
return 0;
bool divide(int n)
{
bool IsPrime(int n);
int i,m;
for(i=3;i<=n/2;i++)
{
if(!IsPrime(i)) continue;
m=n-i;
if(__(2)__) break; //若m是素数,则分解已成功,结束该循环}
if(i>n/2) return false;
cout<<n<<"="<<i<<"+"<<m<<endl;
return true;
}
bool IsPrime(int m)
{
int p,i;
p=sqrt(m);
for(i=2;i<=p;i++)
if(m%i==0) return false;
return __(3)__;
}
答案:
(1) false
(2) IsPrime(m)
(3)true
每空分值:2
参考答案:yx3-t3.cpp
4.全局变量
本题分值:4
题目描述:编写一函数addup,统计字符串s中字母、数字、空格和其它字符的个数,并且用几个全局变量记录上述统计结果。

以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。

代码:
#include <iostream>
using namespace std;
int letter, digit, space, other; //全局变量
int main()
void addup(char s[ ]);
char str[101];
//cout<<"输入字符串:\n";
gets(str);
addup(str);
cout<<"字母个数:"<<letter<<",数字个数:"<<digit<<",空格个数:"<<space<<",其他字符个数:"<<other<<endl;
return 0;
}
void addup(char s[ ])
{
int i;
letter=digit=space=other=__(1)__;
for(i=0;s[i]!='\0';i++)
if(s[i]>='a' && s[i]<='z' || s[i]>='A' && s[i]<='Z') letter++;
else if(s[i]>='0' && s[i]<='9') digit++;
else if(s[i]==32) space++;
else __(2)__;
}
答案:
(1) 0
(2) other++
每空分值:2
参考答案:yx3-t4.cpp
5. 递归调用
本题分值:4
题目描述:用递归方法求n的阶乘n!,递归公式为
1 (n等于0或1)
n!=
n×(n-1)! (n大于1)
要求编写递归函数int fact(int n); 以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。

代码:
#include <iostream>
using namespace std;
int main()
{
int fact(int n);
int n,f;
//cout<<"请输入整数n(n≥0):";
cin>>n;
f=fact(n);
cout<<n<<"!="<<f<<endl;
return 0;
}
//求阶乘
int fact(int n)
{
int f;
if(n==0 || n__(1)__) f=1;
else f=__(2)__;
return f;
}
答案:
(1) = =1
(2) n*fact(n-1)
每空分值:2
参考答案:yx3-t5.cpp
程序设计
1.普通参数
本题分值:12
题目标题:判断完数
时间限制:1000MS
内存限制:32768KB
题目描述:判断正整数n是否为完数。

已知一个数如果恰好等于除它本身外的所有因子之和,这个数就称为完数。

此程序要求编写函数bool wanshu(int n),判断n是否为完数,若n是,则函数返回true;否则返回false。

然后主函数通过该函数的返回值,在屏幕上输出判断结果。

输入描述:输入一个正整数n。

输出描述:若n是完数,则输出"yes";否则输出"no"。

样例输入:
28
样例输出:
yes
参考答案#include<iostream>
using namespace std;
bool wanshu(int n);
int main()
{ int m;
cin>>m;
if(wanshu(m))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
return 0; }
bool wanshu(int n)
{ int s=0;
for(int i=1;i<n;i++)
if (n%i==0) s=s+i;
if (s==n) return true;
else return false; }
yx3-1.cpp
2. 数组参数
本题分值:12
题目标题:统计一组数中的奇数之和
时间限制:1000MS
内存限制:32768KB
题目描述:统计输入的10个整数中所有奇数之和。

要求编写函数int oddsum(int array[ ],int num),求出数组array中前num个整数中的奇数之和,并将结果作为函数值返回。

要求主函数必须先输出这10个数,再输出求出的奇数之和。

输入描述:输入10个整数。

输出描述:输出其中奇数之和。

样例输入:97 48 23 17 45 59 90 75 49 92
样例输出:365
参考答案:#include <stdio.h>
long main(void)
{
long a[10] = {0};
long i, sum1, sum2;
printf("输入10个数以空格分隔:\n");
for (i=0,sum1=0,sum2=0; i<10; ++i)
{
scanf("%d", &a[i]);
if (a[i]%2 == 0)
sum1 += a[i];
else
sum2 += a[i];
}
printf("偶数和为: %d\n", sum1);
printf("奇数和为: %d\n", sum2);
return 0;
}
yx3-2.cpp
3. 嵌套调用
本题分值:12
题目标题:求两数的最大公约数和最小公倍数。

时间限制:1000MS
内存限制:32768KB
题目描述:求两个正整数的最大公约数和最小公倍数。

要求,写一个函数求最大公约数:int GCD(int a,int b),再写一个函数求最小公倍数:int LCM(int a,int b)。

其中最大公约数函数GCD的算法:可以参考《实验预习1》中程序填空题5中的算法,也可以使用辗转相除法。

最小公倍数函数LCM的算法:a、b的最小公倍数等于a*b/a、b的最大公约数。

要求:最小公倍数函数LCM中嵌套调用函数GCD,以求a、b的最大公约数。

输入描述:分别输入2个整数。

输出描述:当输入的数据不是正整数时,显示“ERROR!”;当输入的数据都是正整数时,依次输出最大公约数x和最小公倍数y,两个数据之间用一个空格隔开。

样例输入:
12 18
样例输出:
6 36
参考答案:#include<iostream>
using namespace std;
int greatest_c_divisor(int x,int y); //求最大公约数
int least_c_multiple(int x,int y,int gcd); //求最小公倍数
int main()
{
int x,y,gcd,lcm;
cout<<"请输入两个正整数"<<endl;
cin>>x>>y;
gcd=greatest_c_divisor(x,y);
lcm=least_c_multiple(x,y,gcd);
cout<<"这两个数的最大公约数是"<<gcd<<"\n这两个数的最小公倍数是"<<lcm<<endl;
}
int greatest_c_divisor(int x,int y)
{
int gcd;
x>y?gcd=y:gcd=x; //两个数中的最小值
for(;x%gcd!=0||y%gcd!=0;gcd--);
return gcd;
}
int least_c_multiple(int x,int y,int gcd)
{
int lcm;
lcm=x*y/gcd;
return lcm;
}
yx3-3.cpp
4.数组参数
本题分值:12
题目标题:字符串中小写字母转换成大写字母
时间限制:1000MS
内存限制:32768KB
题目描述:编写函数int f (char s[ ]),将字符串中所有的小写字母转换成对应的大写字母,其他字符不变,并统计被转换字母的个数,将其作为函数值返回。

要求主函数中输入该字符串,最后输出转换后的新字符串,和转换字母的个数。

输入描述:输入一个字符串。

输出描述:两行,第一行输出转换后的新字符串,第二行输出被转换的小写字母个数。

样例输入:
ser34GHj
样例输出:
SER34GHJ
4
参考答案:#include<stdio.h>
main()
{
char a[100];
char *p=a;
scanf("%s",a);
while(*p!='\0')
{
if(*p>='a' && *p<='z') *p=*p-32;
printf("%c",*p);
p++;
}
}
yx3-4.cpp
5.指针参数
本题分值:12
题目标题:统计字符串中某字符出现的次数
时间限制:1000MS
内存限制:32768KB
题目描述:输入一个字符串s和一个字符ch,统计并输出字符ch在字符串s中出现的总次数。

改写要求:编写一个函数,求字符指针p所指向的字符串中,字符ch出现的次数,并将该结果作为函数值返回。

函数原型为
int CountChar ( char* p, char ch ) ;
输入描述:输入一个字符串后按回车键,再输入一个字符后回车。

(提示:输入字符串用gets(s),s为存放字符串的字符数组)
输出描述:输出为一个正整数,表示字符ch出现的总次数。

样例输入:
bb
a
样例输出:
参考答案:#include<stdio.h>
void main()
{
char str[100],ch;
int n=0,t;
printf("请输入一个字符串: ");
gets(str);
printf("请输入一个字符: ");
scanf("%c", &ch);
for(t=0;str[t]!='\0';t++)
if(str[t]==ch)
n++;
printf("字符%c出现的次数:%d\n",ch,n);
}
yx3-5.cpp。

相关文档
最新文档