学习笔记11:程序设计基础(C)实验(指针)

【描述】
定义和调用swap函数,实现两个整数的交换。函数参数是指针。
在main函数中输入交换前和输出交换后的值。
【输入】
输入的第一行是一个正整数n(1≤n≤100),表示测试数据的总数。
接下来的n行,每行为测试数据,包含交换前的两个整数。
【输出】
输出包括n行,每行为测试结果,包含交换后的两个整数。
【输入示例】
2
12345 67890
213879 7892
【输出示例】
67890 12345
7892 213879

#include <stdio.h>
void swap(int *i1, int *i2);
int main(void) {
    int i, n;
    int i1, i2;
    scanf("%d", &n);
    for(i = 1; i <= n; ++i) {		
	scanf("%d%d", &i1, &i2);	
	swap(&i1, &i2);
	printf("%d %d\n", i1, i2);
    }
    return 0;
}
/* 请在下面编写swap函数 */
void swap(int *i1, int *i2)
{
    int t;
    t=*i1;
    *i1=*i2;
    *i2=t;

}


【描述】
定义和调用函数:int sum(int (*fp)(int), int start, int end)和int f(int x),f函数的功能是求x的平方;sum函数的功能是求f(start)+…+f(end)的值。
输入两个整数num1和num2,要求num1 <= num2;调用函数sum(f, num1, num2),求出f(num1)+…+f(num2)的值。例如,假设num1为1,num2为5,则f(1)为1、f(2)为4、f(3)为9、f(4)为16、f(5)为25、f(1)+…+f(5)的值为55(1+4+9+16+25)。
【输入】
输入两个整数num1和num2,两个正整数以空格间隔。
【输出】
输出f(num1)+…+f(num2)的值
【输入示例】
1 5
【输出示例】
55
【来源】
《程序设计基础——以C为例》第5章上机实验题1。

#include <stdio.h>
int f(int);
int sum(int (*fp)(int), int, int);
int main(void) {
    int num1, num2;
    scanf("%d%d", &num1, &num2);
    int result = sum(f, num1, num2);
    printf("%d\n", result);
    return 0;
}
/* 请在下面分别编写f函数和sum函数 */
int sum(int (*fp)(int), int start, int end){
    int sum=0;
    int i;
    for(i=start;i<=end;i++){
        sum+=fp(i);
    }
    return sum;
}
int f(int x){
	return x*x;
}

【描述】
定义和调用如下函数:
double add(double x, double y);
double sub(double x, double y);
double mul(double x, double y);
double div(double x, double y);
求两个浮点数的和、差、积、商。
要求通过函数指针调用函数。
【输入】
输入两个浮点数num1和num2,两个浮点数以空格间隔。
【输出】
分行输出两个浮点数num1和num2的和、差、积、商。
【输入示例】
10.0 5.0
【输出示例】
15.000000
5.000000
50.000000
2.000000
【来源】
《程序设计基础——以C为例》第5章上机实验题2。

#include <stdio.h>
double add(double, double);
double sub(double, double);
double mul(double, double);
double div(double, double);
int main(void) {
    double num1, num2, result;
    double (*pf)(double, double);
    scanf("%lf%lf", &num1, &num2);
    pf = add;
    result = pf(num1, num2);
    printf("%lf\n", result);
    pf = sub;
    result = pf(num1, num2);
    printf("%lf\n", result);
    pf = mul;
    result = pf(num1, num2);
    printf("%lf\n", result);
    pf = div;
    result = pf(num1, num2);
    printf("%lf\n", result);
    return 0;
}
/* 请在下面分别编写add、sub、mul和div函数 */
double add(double x, double y){
    return x+y;
}
double sub(double x, double y){
    return x-y;
}
double mul(double x, double y){
    return x*y;
}
double div(double x, double y){
    return x/y;
}

【描述】
编写函数重置两个变量的值,该函数的原型为:
void reset(int *a,int *b);
函数内部将两个值重置为两个变量原值的平均数(出现小数则四舍五入)。
【输入】
两个待重置的值
【输出】
重置后的两个值
【输入示例】
7 14
【输出示例】
11 11

#include <stdio.h>
void reset(int *a, int *b);
int main(void) {
    int a, b;
    scanf("%d%d", &a, &b);
    reset(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}
/* 请在下面编写reset函数 */
void reset(int *a, int *b){
    int m,n;
    m=*a;
    n=*b;
    *a=(m+n)/2.0+0.5;
    *b=(m+n)/2.0+0.5;
}

【描述】
编写求数学函数区间平均值的通用函数,可以计算出在指定区间内函数的平均值(取整即可)。
待求区间平均值的两个函数的原型为:
int func1(int x);
int func2(int x);
只考虑参数为整数的情况即可。
func1的数学表达式为:
y=ax^2+bx+c
x^2表示x的平方,a,b,c由用户输入。
func2的数学表达式为:
y=x^m
x^m表示x的m次方,m由用户输入。
通用函数原型可设为:int avg(int (f)(int), int x1, intx2);
通用函数的参数为待求区间平均值函数的指针,以及给出的区间下界与上界。
例如: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(直接取整不四舍五入)
【输入】
用户依次输入:
func1的参数:a,b,c
func2的参数:m
给出的区间下界与上界
【输出】
func1的区间内平均值
func2的区间内平均值
【输入示例】
3 2 1
1
0 3
【输出示例】
14
1
【提示】
由于函数原型的限制,a,b,c和m参数可以使用全局变量传递。

#include <stdio.h>
#include <math.h>
int a, b, c, m;
int func1(int x);
int func2(int x);
int avg(int (*f)(int), int x1, int x2);
int main(void) {
    scanf("%d%d%d", &a, &b, &c);
    scanf("%d", &m);
    int lower, upper;
    scanf("%d%d", &lower, &upper);
    printf("%d\n", avg(func1, lower, upper));
    printf("%d\n", avg(func2, lower, upper));
    return 0;
}
/* 请在下面分别编写func1、func2和avg函数 */
int func1(int x){
	return a*pow(x,2)+b*x+c;
}

int func2(int x){
	return pow(x,m);
}
int avg(int (*f)(int), int x1, int x2){
	int sum=0;
	int i;
	for(i=x1;i<=x2;i++){
		sum+=(*f)(i);	
	}
	return sum/(x2-x1+1);
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值