《计算机程序设计(C++)》第7周编程作业

    科技2025-06-16  11


    《计算机程序设计(C++)》第7周编程作业


    1 编写函数重置两个变量的值(20分) 题目内容:

    编写函数重置两个变量的值,该函数的原型为 void reset(int *a, int *b);

    函数内部将两个值重置为两个变量原值的平均数(出现小数则四舍五入)。

    输入格式:

    两个待重置的值

    输出格式:

    重置后的两个值

    输入样例:

    7 14

    输出样例:

    11 11

    时间限制:500ms内存限制:32000kb

    #include<iostream> #include<string> using namespace std; void reset(int* a, int* b) { int s; s = (*a + *b + 1) / 2; *a = *b = s; } int main() { int a, b; cin >> a >> b; reset(&a, &b); cout << a << ' ' << b << 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> #include<string> using namespace std; void add_array(int a, int* sum) { *sum = *sum + a; } int main() { int a[100], b; int i = 0; cin >> a[i]; while (a[i] != -1) { i++; cin >> a[i]; } for (int n = 0; n < i; n++) { add_array(a[n], &b); } cout << b << endl; return 0; }

    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> #include<string> using namespace std; void change_array(int *a, int n) { for (int i = 0; i < n; i++) { a[i] = 0; } } int main() { int a[100], n; int i = 0, current, j; cin >> current; while (current != -1) { a[i] = current; i++; cin >> current; } cin >> n; change_array(a, n); for (j = 0; j < i - 1;j++) { cout << a[j] << ' '; } cout << a[j] << endl; return 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> #include<cstring> using namespace std; void caesar(char s[]) { int i = 0; while (s[i] != '\0') { if (s[i] >= 'a' && s[i] <= 'z') s[i] = (s[i] - 32 - 'A' + 3) % 26 + 'A'; else if (s[i] >= 'A' && s[i] <= 'Z') s[i] = (s[i] + 32 - 'a' + 3) % 26 + 'a'; i++; } cout << s << endl; } void oddeven(char s[]) { int length = strlen(s); int i = 0; char a[100]; int j = (length + 1) / 2; for (int k = 0; k < length; k++) { if (k % 2 == 0) { a[i] = s[k]; i++; } else { a[j] = s[k]; j++; } } for (int m = 0; m < length; m++) { s[m] = a[m]; } cout << s << endl; } void cipher(void (*f)(char s[]), char s[]) { (*f)(s); } int main() { char s[100]; int a; cin.getline(s, 100); cin >> a; if (a == 1) { cipher(caesar, s); } else if (a == 2) { cipher(oddeven, s); } return 0; }

    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 func1(int x); int func2(int x); int avg(int (*f)(int), int x1, int x2); int main(){ cin >> a >> b >> c >> m; int l, r; cin >> l >> r; int ans1, ans2; ans1 = avg(func1, l, r); ans2 = avg(func2, l, r); cout << ans1 << '\n' << ans2 << endl; } int avg(int (*f)(int), int x1, int x2) { int sum = 0; for (int i = x1; i <= x2; i++) { sum = sum + (*f)(i); } return sum / (x2 - x1 + 1); } int func1(int x) { return a * pow(x, 2) + b * x + c; } int func2(int x) { return pow(x, m); }
    Processed: 0.011, SQL: 8