第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 main()
{
	int a, b;
	cin>>a>>b;
	reset(&a, &b);
	cout<<a<<" "<<b<<endl;
	return 0;
}
void reset(int *a, int *b)
{
	double average = 1.0*(*a+*b)/2;//不要忘记乘1.0
	*a = int(average+0.5);
	*b = int(average+0.5);//加0.5取整
}

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;
void add_array(int a, int *sum);
int main()
{
	int array[100];
	int len=0, num;
	while(cin>>num&&num!=-1)//读入数组的方法,最后len刚好是数组的长度
		array[len++] = num;
	int s;
	for(int i=0; i<len; i++)
		add_array(array[i],&s);
	cout<<s<<endl;
	return 0;
}
void add_array(int a, int *sum)
{
	static int s = 0;//相当于在做循环
	s += a;
	*sum = s;
}

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 clearArray(int *p, int n);
int main()
{
	int array[110];
	int num, len=0;
	while(cin>>num&&num!=-1)
		array[len++] = num;
	int n;
	cin>>n;
	clearArray(array,n);
	cout<<array[0];//注意输出格式
	for(int i=1; i<len; i++)
		cout<<" "<<array[i];
	cout<<endl;
	return 0;
}
void clearArray(int *p, int n)
{
	for(int i=0; i<n; i++)
		p[i] = 0;
}
//题目的要求说明数组的名字是数组的首地址
//实际上,数组元素a[i]在编译的时候变成了*(a+i)

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 s[100];
	cin>>s;
	int n;
	cin>>n;
	void (*fp)(char s[]);
	switch(n)
	{
		case 1: fp = caesar; break;
		case 2: fp = oddeven; break;
	}
	(*fp)(s);
	cout<<s<<endl;
	return 0;
}
void caesar(char s[])
{
	char *p = s;
	while(*p)
	{
		if(*p>='a'&&*p<='z')
		{
			*p += 3;
			if(*p<'a')
				*p += 26;
			if(*p>'z')
				*p -= 26;
			*p = *p - 'a'+'A';
		}else if(*p>='A'&&*p<='Z')
		{
			*p += 3;
			if(*p<'A')
				*p += 26;
			if(*p>'Z')
				*p -= 26;
			*p = *p - 'A'+'a';
		}
		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=ax^2+bx+c,a,b,c由用户输入;
func2的数学表达式为:y=x^m,m由用户输入;

通用函数的参数为待求区间平均值函数的指针,以及给出的区间下界与上界。

比如 func1 = 3x^2+2x+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);
}
//正确使用函数指针即可
发布了28 篇原创文章 · 获赞 38 · 访问量 7181

猜你喜欢

转载自blog.csdn.net/weixin_45543556/article/details/105070981
今日推荐