简述:中国大学MOOC-西安交通大学-计算机程序设计(C++)-第7周编程作业
1、编写函数重置两个变量的值(20分)
题目内容:
编写函数重置两个变量的值,该函数的原型为 void reset(int *a, int *b);
函数内部将两个值重置为两个变量原值的平均数(出现小数则四舍五入)。
输入格式:
两个待重置的值
输出格式:
重置后的两个值
输入样例:
7 14
输出样例:
11 11
时间限制:500ms内存限制:32000kb
#include<iostream>
using namespace std;
void reset(int *a, int *b)
{
//增加判断,如果有余数,由于int会向下取整,而题目要求是向上取整,则直接增加1,因为除2,始终都会有小数点0.5
if((*a+*b)%2 !=0)
*a=*b=(*a+*b)/2+1;
//整除则直接等于平均数
else
*a=*b=(*a+*b)/2;
}
int main()
{
int x,y;
cin>>x>>y;
reset(&x,&y);
cout<<x<<" "<<y<<endl;
return 0;
}
2、编写函数对数组中的元素求和(20分)
题目内容:
编写函数 add_array 对数组中的元素求和,函数原型为:
void add_array(int a, int *sum);
该函数可以重复调用多次,每次只使用参数a传入数组中的一个元素,函数内部可以累计历次传入的值进行求和,每次执行后均把当前的和通过参数sum写入主函数中的某个变量中。
提示:使用静态变量。
输入格式:
一个最多100个元素的整型数组,以-1为结尾(表示结束,不是数据)。
输出格式:
该数组所有元素的和
输入样例:
3 9 27 4 5 -1
输出样例:
48
时间限制:500ms内存限制:32000kb
#include<iostream>
using namespace std;
int add_array(int a);
int main()
{
//申明一个长度为100的数组
double arrayName[100];
int len = 0,num;
//用while循环依次接收输入的数字,并存在到数字中,判断输入是否为-1,为-1则退出循环
while(cin>>num&&num!=-1)
{
arrayName[len++] = num;
}
int sum;
for(int i=0;i<len;i++)
{
sum = add_array(arrayName[i]);
}
cout<<sum<<endl;
return 0;
}
int add_array(int a)
{
static int ssum = 0;
ssum+=a;
return ssum;
}
3、数组清零(20分)
题目内容:
编写一个函数,用于将一个int类型的数组清零(即将指定前n项元素全部置为0)数组以-1结尾,且-1不包括在此数组中。要求数组使用地址传递(传指针)。
提示:本题只要在形参中使用整型指针,对应的实参是数组名(因为数组名是数组的首地址),函数中仍使用下标访问数组元素。
例如 int a[100],*p=a; //a是数组a的首地址。
则p[i]相当于a[i]。
输入格式:
第一行数是数组元素,第二行的数是需清零的元素个数n
输出格式:
清零后的数组元素,注意最后一个元素后不要带空格。
输入样例:
503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 -1
5
输出样例:
0 0 0 0 0 170 897 275 653 426 154 509 612 677 765 703
时间限制:500ms内存限制:32000kb
#include<iostream>
using namespace std;
void emptyList(int *p,int empty);
int main()
{
int array[100],*plist=array,empty_num;
int num,len=0;
while(cin>>num&&num!=-1)
{
array[len++] = num;
}
cin>>empty_num;
//处理函数调用
emptyList(plist,empty_num);
//打印处理后数组
for(int i=0;i<len;i++)
{
if(i!=(len-1))
{
cout<<array[i]<<" ";
}
else
{
cout<<array[i];
}
}
cout<<endl;
return 0;
}
void emptyList(int *p,int empty)
{
for(int j=0;j<empty;j++)
{
p[j] = 0;
}
}
4、使用函数指针切换加密方法(20分)
题目内容:
编写两个加密函数,第一个函数使用凯撒加密法,即将将原来的小写字母用字母表中其后面的第3个字母的大写形式来替换,大写字母按同样规则用小写字母替换,可将字母表看成是首末衔接的。例如"AMDxyzXYZ" 加密为 "dpgABCabc"。第二个函数使用单双号加密法,即将字符串"abcde",根据单双号区分为两个字符串"ace"和"bd",再连接在一起成为密文"acebd"。
用户输入一个字符串作为明文,再输入数字1或2,输入1使用第一个函数加密并输出密文,输入2使用第二个函数加密并输出密文。要求使用函数指针来切换加密函数。
提示:三个函数的原型可设为:
void caesar(char s[]);
void oddeven(char s[]);
void cipher(void (*f)(char s[]),char s[]);//形参为指向函数的指针,对应实参可为相应格式的函数名。
输入格式:
一个字符串作为明文,再输入数字1或2,输入1使用第一个函数加密并输出密文,输入2使用第二个函数加密并输出密文。
输出格式:
加密后的密文
输入样例:
jacky
2
输出样例:
jcyak
时间限制:500ms内存限制:32000kb
#include<iostream>
using namespace std;
void caesar(char s[]);
void oddeven(char s[]);
int main()
{
char ch[100];
int chose;
cin>>ch; //输入任意字符串
cin>>chose; //输入加密方式
void (*fp)(char str[]);
//根据用户选择返回加密后的字符串
if (chose == 1)
{
fp = caesar;
}
else if (chose == 2)
{
fp = oddeven;
}
(*fp)(ch);
cout<<ch<<endl;
return 0;
}
//凯撒加密
void caesar(char s[])
{
char *p = s;
while(*p)
{
if(*p>=97 && *p<=122)
{
*p += 3; //先向后移动到第3位
cout<<"从小写转大写,要减"<<endl;
if (*p > 122)
{
cout<<"小写超过最后一位"<<endl;
*p -= 58; //例如输入的是z=122,26+32=58,125-58=67
}
else
{
*p = *p - 32;
}
}
else if(*p>=65 && *p<=90)
{
cout<<"从大写转小写,要加"<<endl;
*p += 3; //先向后移动到第3位
cout<<"大写超过最后一位"<<endl;
if (*p > 90)
{
*p += 6;
}
else
{
*p = *p + 32;
}
}
p++;
}
}
//奇偶加密
void oddeven(char s[])
{
char *p = s;//思路是交换,把奇数位的字母与偶数位的依次交换
while(*p) //第三位的奇数交换一次,第五位的奇数交换两次,类推
{
if((p-s+1)%2==1)
{
int swapNum = (p-s+1)/2;
char *q = p;
while(swapNum--)
{
char ch = *q;
*q = *(q-1);
*(q-1) = ch;
q--;
}
}
p++;
}
}
5、编写求函数区间平均值的通用函数(20分)
题目内容:
编写求数学函数区间平均值的通用函数,可以计算出在指定区间内函数的平均值(取整即可)。
待求区间平均值的两个函数的原型为:
int func1(int x);
int func2(int x)
只考虑参数为整数的情况即可。
func1的数学表达式为:y=a*x^2+b*x+c,a,b,c由用户输入;
func2的数学表达式为:y=x^m,m由用户输入;
通用函数的参数为待求区间平均值函数的指针,以及给出的区间下界与上界。
比如 func1 = 3*x^2+2*x+1, 区间下界与上界分别为0和3,则
func1(0)=1
func1(1)=6
func1(2)=17
func1(3)=34
则平均值为:(1+6+17+34)/4=14 (直接取整不四舍五入)
提示:
(1)由于函数原型的限制,a,b,c和m参数可以使用全局变量传递。
(2)通用函数原型可设为:int avg( int (*f)(int),int x1,int x2);
输入格式:
用户依次输入:
func1的参数 a,b,c
func2的参数 m
给出的区间下界与上界
输出格式:
func1的区间内平均值
func2的区间内平均值
输入样例:
3 2 1
1
0 3
输出样例:
14
1
时间限制:500ms内存限制:32000kb
#include <iostream>
#include <cmath>
using namespace std;
int a, b, c, m;
int fun1(int x);
int fun2(int x);
int avg(int (*fp)(int), int x1, int x2);
int main()
{
cin>>a>>b>>c;
cin>>m;
int x1, x2;
cin>>x1>>x2;
int s1 = avg(fun1, x1, x2);
int s2 = avg(fun2, x1, x2);
cout<<s1<<endl;
cout<<s2<<endl;
return 0;
}
int fun1(int x)
{
return a*x*x+b*x+c;
}
int fun2(int x)
{
return pow(x,m);
}
int avg(int (*fp)(int), int x1, int x2)
{
int s=0;
for(int i=x1; i<=x2; i++)
s += (*fp)(i);
return s/(x2-x1+1);
}