实验8函数二
实验8实验指导书具有纯滞后系统的大林控制

实验8实验指导书具有纯滞后系统的大林控制实验8具有纯滞后系统的大林控制系统一、实验目的1.了解算法的基本原理;2.掌握纯滞后对象的控制算法及其在控制系统中的应用。
2、实验设备1.thbcc-1型信号与系统?控制理论及计算机控制技术实验平台2.thbxd数据采集卡一块(含37芯通信线、16和usb电缆线各1根))三、实验内容1.纯滞后一阶惯性环节达林算法的实现。
2.采用纯滞后二阶惯性环节实现达林算法。
4、实验原理在生产过程中,大多数工业对象具有较大的纯滞后时间,对象的纯滞后时间?对控制系统的控制性能极为不利,它使系统的稳定性降低,过渡过程特性变坏。
当对象的纯滞后时间? 与对象的惯性时间常数相比,传统的比例积分微分(PID)控制难以获得良好的控制性能制性能。
长期以来,人们对纯滞后对象的控制作了大量的研究,比较有代表性的方法有大林算法和纯滞后补偿预估)控制。
本实验基于达林算法。
Dalin算法的综合目标不是最小拍频响应,而是具有纯滞后时间的一阶滞后响应。
其等效闭环传递函数为要求的等效环节的时间常数,t为采样周期。
通过对零阶holder方法进行离散,可以得到系统的闭环传递函数:v.实验步骤1、实验接线1.1根据图8-1,连接惯性链接的模拟电路;1.2用导线将该电路输出端与数据采集卡的输入端“ad1”相连,电路的输入端与数据采集卡的输入端“da1”相连;2.脚本程序运行2.1启动计算机,在桌面双击图标“thbcc-1”,运行实验软件;2.2顺序点击虚拟示波器界面上的开始钮和工具栏上的脚本编程器2.3点击脚本编辑器窗口文件菜单下的“打开”按钮,选择“计算机控制算法VBS\\basic algorithm of computer control technology”文件夹下的“Dalin algorithm”脚本程序并打开。
阅读并理解节目,2.4点击脚本编辑器窗口的调试菜单下“启动”;用虚拟示察图输出端的响应曲线;2.5点击脚本编辑器的调试菜单下“停止”,修改程序中n(可模拟对象的滞后时间,滞后时间为n*运行步长,单位为ms;当运行步长,n的取值范围为1~5)值以修改对象的滞后时间,再点击“启动”按钮。
实验8 无穷级数与数值计算

西安理工大学应用数学系
(2)相应的Matlab代码为 syms x taylor((1+x)^0.5, x, 7, 1)
运行结果为 ans =2^(1/2) + (2^(1/2)*(x - 1))/4 - (2^(1/2)*(x - 1)^2)/32 +
(2^(1/2)*(x - 1)^3)/128 - (5*2^(1/2)*(x - 1)^4)/2048 + (7*2^(1/2)*(x - 1)^5)/8192 - (21*2^(1/2)*(x 1)^6)/65536
(n
3
1)!
105,取
n8
即可。
西安理工大学应用数学系
同理取 x 1
2
,令误差
2n
1
3 (n
1)!
105
,取 n 6 即可。
计算e的Matlab代码为
syms x y y=taylor(exp(x),x,9)
a=subs(y,x,'1') %将符号表达式y中的变量x换成变量1 e=vpa(a,10) % 将符号表达式a转化成10位精度的近似解
1 x 1 1 x 1 x2 1 3 x3 (1)n1 1 35 (2n 3) xn (6.6)
2 24 246 取
2 46 2n
于是有
, 代入(6.6), 有
1 x 1 1 x 1 x2 13 x3 (1)n1 1 3 5 (2n 3) xn
西安理工大学应用数学系
hold on for i=1:length(x)
y(i)=x(i)-x(i)^3/6+x(i)^5/120; plot(x(i),y(i),'.'),pause(.005) end hold on for i=1:length(x) y(i)=x(i)-x(i)^3/6+x(i)^5/120-
实验 8-2 键盘中断驱动实验

实验8-2 键盘中断驱动实验【实验目的】掌握键盘原理。
熟悉驱动的中断机制。
【实验步骤】第一步:利用vi编辑器,编写一个Keypad.c驱动代码;1、增加驱动所需的头文件和变量#include<linux/module.h>#include<linux/kernel.h>#include<linux/init.h>#include<linux/delay.h>#include<linux/poll.h>#include<linux/spinlock.h>#include<asm/hardware.h>#include<asm/arch-pxa/pxa-regs.h>MODULE_LICENSE("GPL");#define DEVICE_NAME "emdoor_kbd"#define KEYVALUE_HAVE 1#define KEYVALUE_NO 0#define KPC_DIR 1<<5#define KPC_MAT 1<<22static int Emdoor_kbd_fasync(int, struct file* ,int); typedef unsigned char KBD_RET;struct fasync_struct * fasync;//键盘结构体定义typedef struct {KBD_RET kbd_buff; /* protect against overrun */ unsigned int kbd_status;wait_queue_head_t wq;spinlock_t lock;} KBD_DEV;2、实现键盘驱动读操作函数static ssize_t Emdoor_kbd_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){KBD_DEV * kbd=filp->private_data;KBD_RET kbd_ret;while(1){if(kbd->kbd_status==KEYVALUE_HAVE){kbd_ret = kbd->kbd_buff;copy_to_user(buffer, &kbd_ret, sizeof(KBD_RET));kbd->kbd_status=KEYVALUE_NO;return sizeof(KBD_RET);}else{if (filp->f_flags & O_NONBLOCK)return -EAGAIN;interruptible_sleep_on(&(kbd->wq));if (signal_pending(current))return -ERESTARTSYS;}}return sizeof(KBD_RET);}3、实现键盘驱动中断服务例程static void Emdoor_isr_kbd(int irq, void *dev_id, struct pt_regs *reg){printk(KERN_EMERG"Emdoor_isr_kbd,Interrupt\n");int kpc_value;KBD_DEV * kbd = (KBD_DEV *) dev_id;spin_lock_irq(&(kbd->lock));kpc_value=KPC;if(kpc_value&KPC_MAT) {kbd->kbd_buff=KPAS&0xFF;if(kbd->kbd_buff!=0xFF){switch(kbd->kbd_buff){case 0x0: kbd->kbd_buff=5; break;case 0x1: kbd->kbd_buff=6; break;case 0x2: kbd->kbd_buff=7; break;case 0x5: kbd->kbd_buff=8; break;case 0x10: kbd->kbd_buff=9; break;case 0x11: kbd->kbd_buff=10; break;case 0x12: kbd->kbd_buff=11; break;case 0x15: kbd->kbd_buff=12; break;case 0x20: kbd->kbd_buff=13; break;case 0x21: kbd->kbd_buff=14; break;case 0x22: kbd->kbd_buff=15; break;case 0x25: kbd->kbd_buff=16; break;default: break;}kbd->kbd_status=KEYVALUE_HAVE;}}else if(kpc_value&KPC_DIR){kbd->kbd_buff=KPDK&0xFF;if(kbd->kbd_buff!=0x0){switch(kbd->kbd_buff){case 0x40: kbd->kbd_buff=1; break;case 0x2: kbd->kbd_buff=2; break;case 0x4: kbd->kbd_buff=3; break;case 0x20: kbd->kbd_buff=4; break;default: break;}kbd->kbd_status=KEYVALUE_HAVE;}}if ( fasync )kill_fasync( &(fasync), SIGIO, POLL_IN );wake_up_interruptible(&(kbd->wq));spin_unlock_irq(&(kbd->lock));}4、实现键盘驱动设备打开操作函数static int Emdoor_kbd_open(struct inode *inode, struct file *filp) {int ret;printk(KERN_EMERG " Emdoor_kbd_open!\n");KBD_DEV * kbd;kbd =(KBD_DEV *) kmalloc(sizeof(KBD_DEV ), GFP_KERNEL);KPC=KPC_ASACT | (3<<26) | (7<<23 ) | KPC_IMKP | KPC_MS6 |KPC_MS5 |KPC_MS4 | KPC_MS3 | KPC_MS2 | KPC_MS1 | KPC_MS0 | KPC_ME |KPC_MIE | (7<<6) | KPC_DE | KPC_DIE;init_waitqueue_head(&(kbd->wq));pxa_gpio_mode(94 | GPIO_ALT_FN_1_IN);//KP_DKIN<1>pxa_gpio_mode(95 | GPIO_ALT_FN_1_IN);//KP_DKIN<2>pxa_gpio_mode(98 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(99 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(100 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(101 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(102 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(103 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<0>pxa_gpio_mode(104 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<1>pxa_gpio_mode(105 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<2>pxa_gpio_mode(108 | GPIO_ALT_FN_2_OUT);//KP_MKOUT<5>kbd->kbd_status=KEYVALUE_NO;filp->private_data=kbd;ret = request_irq(IRQ_KEYPAD, Emdoor_isr_kbd, SA_INTERRUPT, DEVICE_NAME, kbd);if (ret){printk(KERN_EMERG " Interrupt init=%x!!!!\n",ret);return ret;}return 0;}5、实现键盘驱动select和poll操作函数static unsigned int Emdoor_kbd_poll(struct file *filp,struct poll_table_struct *wait){printk(KERN_EMERG " Emdoor_kbd_poll!\n");KBD_DEV * kbd=filp->private_data;poll_wait(filp,&(kbd->wq),wait);return (kbd->kbd_status==KEYVALUE_HAVE) ? (POLLIN|POLLRDNORM): 0 ;}static int Emdoor_kbd_release(struct inode *inode, struct file *filp){printk(KERN_EMERG " Emdoor_kbd_release!\n");KBD_DEV * kbd = filp->private_data;KPC=0x0;Emdoor_kbd_fasync(-1, filp, 0);kfree(kbd );free_irq(IRQ_KEYPAD, kbd);return 0;}6、实现键盘驱动非阻塞访问操作函数static int Emdoor_kbd_fasync(int fd, struct file * file, int mode) {return fasync_helper(fd, file, mode, &(fasync) );}7、键盘驱动文件结构体定义static struct file_operations Keypad_fops = {open: Emdoor_kbd_open,read: Emdoor_kbd_read,release: Emdoor_kbd_release,poll: Emdoor_kbd_poll,fasync: Emdoor_kbd_fasync,owner: THIS_MODULE,};8、键盘驱动初始化函数定义static int __init Emdoor_kbd_init(void){printk(KERN_EMERG " Emdoor_kpd initialized\n");int ret;ret = register_chrdev(62, DEVICE_NAME, &Keypad_fops);if (ret < 0) {printk(DEVICE_NAME " can't get major number\n");return ret;}free_irq(IRQ_KEYPAD,NULL);udelay(10);return 0;}9、键盘驱动退出函数定义static void __exit Emdoor_kbd_exit(void){printk(KERN_EMERG " Emdoor_kpd exit\n");unregister_chrdev(62, DEVICE_NAME);}module_init(Emdoor_kbd_init);module_exit(Emdoor_kbd_exit);MODULE_AUTHOR("Ben.li@");MODULE_DESCRIPTION("This is a Keypad driver demo");第二步: 利用vi编辑器,编写一个用于编译Keypad驱动的Makefile# Makefile for the Keypad. #CFLAGS +=$(DEBFLAGS) -Wallifneq ($(KERNELRELEASE),)obj-m :=Keypad.oelseKERNELDIR ?=/root/work/linux-2.6.9PWD :=$(shell pwd)ALL:$(MAKE) $(CFLAGS) -C $(KERNELDIR) M=$(PWD) modulesendifclean:rm -fr *.o *.ko *~ core .depend .*.cmd *.mod.c .tmp_versions第三步:运行make编译命令,用ls命令查看编译后的结果,在该目录中应生成Keypad.ko模块文件,利用file命令查看Keypad.ko文件的格式,应为ARM 格式的ELF文件。
实验8RLC正弦稳态电路的研究

实验8RLC正弦稳态电路的研究实验⼋ RLC 正弦稳态电路的研究⼀、实验⽬的(1) 通过对RLC 串联电路频率特性的测量与分析,加深对频率特性曲线的理解。
(2) 进⼀步理解串联谐振的特点及改变频率特性的⽅法。
⼆、实验仪器(1) 函数信号发⽣器 (2) 双踪⽰波器 (3) 实验箱三、实验原理和电路含有电感、电容和电阻元件的有源⽹络,在电源的某些⼯作频率上,会出现元件两端电压和电流相位相同的情况,称电路发⽣谐振。
能发⽣谐振的电路,称为谐振电路。
(1) RLC 串联电路中幅频特性和相频特性在RLC 串联电路中,若施加正弦交流电压,则电路中的电流和各元件上的电压将随电源频率的不同⽽改变,电流和电源电压间、各元件上的电压和电源电压间的相位差也随电源频率的不同⽽变化。
前者的函数关系称为幅频特性,后者的函数关系称为相频特性,即RLC 电路的稳态特性。
电路图8-1:图8-1 RLC 串联谐振电路(2) RLC 串联电路的基本计算由基本计算公式:1(2)2R U R z U R j fL fCππ==+-串联谐振条件: 122fL fC ππ=,即f =LCf o π21= 。
0f 为谐振频率,且仅与C 、L 有关。
此时输出电压RU 值最⼤。
有: RMU U = 随着输⼊频率相对谐振频率0f 的增加或减⼩,输出电压U R 都会减⼩,但幅度下降到最⼤值的21(即:0.707U RM )时,会对应两个输⼊频率:H f 和L f ,我们分别称之为通频带的上限截⽌频率和下限截⽌频率。
122122H L R f L R f L ππ? = ?? =- ?通频带为 W H L B f f =-在谐振频率处的输⼊电压U 相位和电流相位(即电阻R 上的电压RU 相位)差为 11220o fL fCtg Rππφ--==在上下限截⽌频率处12()2fL R fCππ-=±,所以相位差为: 4545H L φφ=-?=+?这说明当频率⾼于0f 时,RLC 串联回路中电感的感抗起主导作⽤,所以相位滞后于输⼊电压相位;当频率低于0f 时,RLC 串联回路中电容的容抗起主导作⽤,所以相位超前于输⼊电压相位。
c语言函数实验报告

c语言函数实验报告C 语言函数实验报告一、实验目的1、深入理解 C 语言中函数的概念、定义和使用方法。
2、掌握函数的参数传递机制,包括值传递和地址传递。
3、学会使用函数来实现程序的模块化设计,提高代码的可读性、可维护性和可重用性。
4、通过实验,熟练掌握函数的调用、返回值的处理以及函数之间的相互协作。
二、实验环境1、操作系统:Windows 102、编译环境:Visual Studio 2019三、实验内容(一)函数的定义与声明1、定义一个名为`add` 的函数,用于计算两个整数的和,并返回结果。
```cint add(int a, int b) {return a + b;}```2、在主函数之前对`add` 函数进行声明。
```cint add(int, int);```(二)函数的调用1、在主函数中调用`add` 函数,计算 5 和 10 的和,并输出结果。
```cint main(){int result = add(5, 10);printf("5 + 10 =%d\n", result);return 0;}```(三)值传递与地址传递1、定义一个函数`swap`,通过值传递方式交换两个整数的值。
```cvoid swapValue(int a, int b) {int temp = a;a = b;b = temp;}```2、定义一个函数`swapPointer`,通过地址传递方式交换两个整数的值。
```cvoid swapPointer(int a, int b) {int temp = a;a = b;b = temp;}```3、在主函数中分别调用这两个函数,观察交换结果。
(四)函数的递归调用1、定义一个递归函数`factorial`,计算一个整数的阶乘。
```cint factorial(int n) {if (n == 0 || n == 1) {return 1;} else {return n factorial(n 1);}}```2、在主函数中调用`factorial` 函数,计算 5 的阶乘,并输出结果。
函数实验内容及要求实验报告

函数实验内容及要求实验报告引言函数是计算机编程中非常重要的概念之一,它能够将一系列的指令封装成一个独立的模块,使得代码的复用和维护更加简单和高效。
在本次实验中,我们将学习和掌握函数的定义、调用和返回值等基本概念,以及函数的参数传递的特点和使用方法。
实验目的通过本次实验,我们的目标是:1. 理解函数的概念和作用;2. 掌握函数的定义和调用方法;3. 掌握函数的参数传递和返回值的使用;4. 能够设计并实现简单的函数。
实验方法本次实验分为以下几个步骤:1. 了解函数的概念和作用;2. 学习函数的定义和调用方法;3. 理解函数的参数传递和返回值的概念;4. 设计并实现一个简单的函数;5. 运行并测试实现的函数。
实验过程1. 理解函数的概念和作用函数是一段封装了一系列指令的代码块,它可以被其他代码通过调用的方式来执行。
函数的作用主要有两个方面:- 提高代码的复用性:将一些常用的功能封装成函数,可以在多个地方进行调用,避免了重复编写相似的代码。
- 提高代码的可维护性:将复杂的逻辑拆分成多个函数,分工明确,易于理解和修改。
2. 学习函数的定义和调用方法函数的定义一般由以下几个部分组成:- 函数名:标识符,用于调用函数;- 参数列表:函数执行时需要接收的参数;- 返回值类型:函数执行完毕后返回的结果类型;- 函数体:包含了具体的代码实现。
函数的调用方法为直接使用函数名,后跟参数列表(如果有的话)。
3. 理解函数的参数传递和返回值的概念函数的参数传递可以通过值传递和引用传递两种方式进行。
值传递是指将参数的值复制一份传递给函数,而引用传递是指将参数的地址传递给函数。
函数可以通过返回值将计算结果返回给调用者。
返回值可以是单个值,也可以是一个列表或对象等复杂类型。
4. 设计并实现一个简单的函数我们将设计一个简单的函数,用于计算两个整数的和。
函数定义如下:pythondef add(a, b):return a + b5. 运行并测试实现的函数我们可以在程序中调用这个函数来计算两个整数的和。
实验八实验报告电工学
中山大学电工原理及其应用实验报告S U N Y A T-S E N U N I V E R S I T Y院(系):移动信息工程学号:审批专业:软件工程实验人:实验题目:实验九:BJT单管共射电压放大电路一、实验目的1. 掌握放大电路静态工作点的测试方法,分析静态工作点对放大器性能的影响。
2. 掌握放大电路动态性能(电压增益、输入电阻、输出电阻、最大不失真输出电压以及幅频特性等)的测试方法。
3. 进一步熟练常用电子仪器的使用二、预习思考题1.阅读教材中有关单管放大电路的内容并估算实验电路的性能指标。
假设:3DG6 的β=100,Rb2=20KΩ,Rb1=60KΩ,RC=2KΩ,RL=2KΩ。
估算放大电路的静态工作点,电压增益AV,输入电阻Ri和输出电阻RO2、阅读实验附录中有关示波器的使用、晶体管特性图示仪简介以及放大电路干扰和自激振荡消除的内容。
3、能否用直流电压表直接测量晶体管的VBE?为什么实验中要采用测VB、VE,再间接算出VBE的方法?答:一般的电压表直接测不准,会引起电路参数变化,因为电表直接接在输入端,形成额外的输入信号。
而测UB、UE时,电压表的一端是接地的,不容易形成额外输入。
4、怎样测量Rb1阻值?答:用万用表电阻档测量。
5、当调节偏置电阻Rb1,使放大电路输出波形出现饱和或截止失真时,晶体管的管压降VCE怎样变化?答:饱和失真时Uce减小Ic增大,截止失真时Uce增大Ic减小。
6、改变静态工作点对放大电路的输入电阻Ri有否影响?改变外接电阻RL对输出电阻RO有否影响?答:因为Ri≈Rbe‖Rb1‖Rb2;Ro≈Rc,所以对输入电阻有影响对输出电阻吴影响。
7、在测试AV,Ri和RO时怎样选择输入信号的大小和频率?为什么信号频率一般选1KHz,而不选100KHz 或更高?答:应该选Ui=10mv作用f=1KHZ左右,因为,试验电路为阻容耦合单管共射放大电路,阻容耦合单管放大电路的下限频率fL越小电路的低频响应越好,所以采用1KHZ而不用更高的8.单管共射级放大电路测试中,如果将函数信号发生器,交流毫伏表,示波器中任一仪器的二个测试端子接线换位,将会出现什么问题?答:对于函数信号发生器:如果有波形输出,例如正弦波,则在示波器端的显示是反相。
实验8 存储过程与存储函数
实验8 存储过程与存储函数实验目的:1.掌握存储过程及存储函数的创建和调用方法2.掌握MySQL的流程控制语句实验要求:掌握存储过程及存储函数的相关知识实验内容:1.存储过程2.存储函数实验步骤:说明:按实验步骤对数据库YGGL中的三个表进行操作,三个表结构如下(具体参看实验2):Departments (DepartmentID,DepartmentName,Note)Employees(EmployeeID,Name,Sex,Birthday,Education,WorkYear,Address,PhoneNumber,Department ID)Salary(SalaryID,InCome,OutCome,Time, EmployeeID)1.存储过程(1)创建存储过程,要求当一个员工的工作年头大于6年时将其转到经理办公室工作。
DELIMITER $$USE `yggl`$$CREATE PROCEDURE F1 (in ygh char(7),out jg int)BEGINDECLARE year CHAR(3);select year(now())-year(workyear) into year from employees whereemployeeid=ygh;if year>6 thenUPDATE employees SET DEPARTMENTid=3WHERE employeeid=ygh;set jg=1;else set jg=0;end if;END$$DELIMITER ;调用该存储过程并查看结果。
call f1 ('000001',@jg);select @jg;(2)创建存储过程,比较两个员工2012年11月份的实际收入,若前者比后者高就输出0,否则输出1。
DELIMITER $$USE `yggl`$$CREATE PROCEDURE f2 (in ygh1 char(6),in ygh2 char(6), out jg int)BEGINDECLARE SR1,SR2 FLOA T;SELECT InCome-OutCome INTO SR1 FROM SalaryWHERE EmployeeID=ygh1 and tim='2012-11';SELECT InCome-OutCome INTO SR2 FROM SalaryWHERE EmployeeID=ygh2 and tim='2012-11';IF SR1>SR2 THEN SET BJ=0;ELSE SET BJ=1;END IF;END$$DELIMITER ;调用该存储过程并查看结果。
八年级数学《函数的图象2》教学设计
《14.1.3 函数的图象2》教学设计(2) xy 6 (x >0)列表 x … 1 2 3 4 5 6 …y … 6 3 2 1.2 1.5 1 …描点连线函数的特征:由(1)的图象可以看出,直线从左到右成上升状态,即y 随x 的增大而增大;由(2)的图象可以看出,曲线从左到右成下降状态,即y 随x 的增大而减小。
描点法画函数图象的一般步骤:1、第一步:列表(表中给出一些自变量的值及其对应的函数值);列表时,自变量的取值不能超出自变量的取值范围,把自变量放在表格的第一行,并按从小大到大的顺序排列,相应的函数值放在第二行。
(3)通过前面实例引导学生总结出画函数图象的一般步骤,并利用课件展示。
(1)通过例题的解答及“想一想”的思考,培养学生主动参与和合作交流的意识。
(2)通过归纳用描点法画函数图象的一般步骤,提高学生的观察、分析、概括和抽象的能力。
2、第二步:描点(在直角坐标系中,以表中自变量的值作为横坐标,对应的函数值作为纵坐标,在平面直角坐标系中描出相应的各点);3、第三步:连线(按横坐标由小到大的顺序把所有描出的各点用平滑的曲线连接起来)。
想一想(1)图14.1-8是一种古代计时器——“漏壶”的示意图,在壶内盛一定量的水,水从壶下的小孔漏出,壶壁内画出刻度,人们根据壶中水面的位置计算时间。
用x 表示时间,y 表示壶底到水面的高度,下面的哪个图象适合表示一小段时间内y 与x 的函数关系(暂不考虑水量变化对压力的影响)?(2) a 是自变量x 取值范围内的任意一个值,过点(a ,0)画y 轴的平行线,与图中曲线相交。
下列哪个图中的曲线表示y 是x 的函数?为什么?(4)引导学生完成“想一想”的内容,根据学生的回答进行纠正并总结,给出正确的答案。
【学生活动】(1)配合教师完成例3,注意观察教师的描点和连线的过程与方法。
(2)在教师的引导下,总结出画函数图象的一般步骤。
(3)思考“想一想”的问题,结合前面学过的知识,尝试回答这个问题,并思考其他同学回答的是否正确。
C语言实验报告 实验八 参考答案
实验七八 函 数(一) 参考答案1.请编写程序sy8-1.cpp ,要求:(1)设计一个fun 函数用来计算并输出n (包括n )以内能被5 或9 整除的所有自然数的倒数之和。
(2)在主函数中输入数据,调用fun 函数,输出结果。
例如,若主函数从键盘给n 输入20后,则输出为s=0.583333。
【解题思路】用循环穷举1~n 之间各数,若余5等于0或余9等于0,则将其表示为倒数并累加即可。
注意分式若需要得到实数结果则必须至少有一个操作数是实数类型。
【参考答案】#include <stdio.h>double fun(int n){ double s=0;int i;for(i=1;i<=m;i++)if(i%5==0||i%9==0)s=s+1.0/i;return s;}main( ){ int n;double s;printf("\nInput n: ");scanf("%d",&n);s=fun(n);printf("s=%f\nlf",s);}2.请编写程序sy8-2.cpp ,要求:(1)设计一个fun 函数用来计算下列多项式的值。
(2)在主函数中输入数据,调用fun 函数,输出结果。
例如:若n 的值为11时,函数的值为1.83333【解题思路】根据多项式各项的变化规律可以看出各项的分子为常量1,分母是从1到n 累加和。
【参考答案】#include <stdio.h>float fun(int n){ float sum=0,s=0; //sum 存多项式的累加和,s 存分母的累加和int i;for(i=1;i<=n;i++){ s=s+i; //先求分母的累加sum=sum+1/s;}return sum;}main()n s ⋯++++⋯++++++=321132112111{int n; float s;printf("\nPlease enter n:");scanf("%d", &n);s = fun(n);printf("the result is: %f\n", s);}3.请编写程序sy8-3.cpp,要求:(1)设计一个fun函数,其功能是:将两个两位数的正整数a、b 合并形成一个整数放在c 中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
main() { char s[80]; int loc,num; printf("Enter a string \n"); gets(s); printf("Input loc&&num: "); scanf("%d,%d",&loc,&num); cut(s,loc,num); }
4) 试编程,定义宏MAX(a,b)的功能为输出 a,b中的最大值、PRINT(Y)的功能为输出 Y=Y的值。在主函数中用键盘输入两个 整型数,利用宏MAX和PRINT求出两个 整型数的最大值并输出。 #define MAX(a,b) (a)>(b)?(a):(b) #define PRINT(Y) printf("Y=%d\n",Y) main() {int m,n,t; scanf("%d %d",&m,&n); t=MAX(m,n); PRINT(t);
main() { int k; int a[N]={1,2,3,4,5,88,99,6,7,8,9,10}; for(k=0;k<N/2;k++) k<N/2 改为k<N/2move(a,N); 1或k<5或者k=0改 for(k=0;k<12;k++) 为k=1 printf("%4d",a[k]); }
for(i=0;i<N;i++) { max=a[i*N];maxj=0; for(j=1;j<N;j++) if(a[i*N+j]>max) { max=a[i*N+j];maxj=j; } /*maxj记录某 一行上的最大值所在的列号*/ for(k=0;flag=1;k<N&&flag;k++) k=0;flag=1改为k=0,flag=1 if(max<a[N*k+maxj] ) flag=0; max>a[N*k+maxj] if(flag) b[i][maxj]= 'T'; } }
int find(int k1,int k2,int a[ ][3]) { int n,j,m=0; for(n=k1;n<=k2;n++) { j=2; while(j<=sqrt(n)) if(n%j!=0) j++; else { if(prime(j)&&prime(n/j)) { a[m][0]=n; a[m][1]=j; a[m][2]=n/j; m++; } break; } } return m; }
编程
1、下面程序的功能是计算组合数 C(n,r)=n!/(r!*(n其中n,r为正整数, n,r为正整数 C(n,r)=n!/(r!*(n-r)!) 其中n,r为正整数, n>=r。函数fact实现求阶乘,函数com fact实现求阶乘 com实现求组 n>=r。函数fact实现求阶乘,函数com实现求组 合数,请将这两个函数填写完整。 合数,请将这两个函数填写完整。 #include <stdio.h> main() { int m,n; m&&n:\ printf("Enter m&&n:\n"); scanf("%d,%d",&m,&n); printf("C(%d,%d)=%d\ printf("C(%d,%d)=%d\n",m,n,com(m,n)); }
main() { int x[30][3],n,j,k1,k2; printf("Input k1&&k2:\n"); scanf("%d,%d",&k1,&k2); n=find(k1,k2,x); for(j=0;j<n;j++) printf("%5d:%5d%5d\n",x[j][0],x[j][1],x[j][2]); }
pr(c[1]+n) if(pr(c[0]+n)) { printf("\n success! "); for(i=1;i<=20;i++) printf("%4d",c[i]); } else printf("fail!\n"); }
3) 所谓鞍点是指在一个二维数组中,该位置上元素 的值在该行上最大,同时在该列上最小。函数 find的形参a存储输入矩阵,b存储输出矩阵,该 函数的功能是:找出a矩阵中所有的鞍点,若输 入矩阵某个位置上的元素为鞍点,则将输出矩阵 相 同 位 置 处 的 元 素 置 为 "T" , 否 则 置 为 "F" 。 #include<stdio.h> #define N 4 char b[ ][N] ) void find(int a[ ],char b[ ][ ] { int i,j,k,flag,max,maxj; for(i=0;i<N;i++) for(j=0;j<N;j++) b[i][j]='F' b[i][j]=F;
int pr(int n) /*pr(n)为判断n是 否为素数的函数*/ { int i,flag=1; for(i=2;i<=n/2;i++) if( n%i= =0 ) n%i=0 flag=0; return flag; }
ቤተ መጻሕፍቲ ባይዱ
int s(int x[ ],int m,int i) /*在x[1]至x[i]中找到一个 数与m之和为素数*/ { int f=1,n=0; while(f&&i) if(x[i]= =0) i--; else { n=x[i]; if(pr(n+m)) { x[i]=0; f=0; /*找到满足条件的数组元素后 将其置为0以避免c数组中出现重复数据*/ } else i--; } return n if(i>0) return i; else return 0;}
com(int n,int r) { int x; x=fact(n)/(fact(r)*fact(nx=fact(n)/(fact(r)*fact(n-r)); return(x); } fact(int n) { if (n= =1) return 1; (n*fact(nelse return (n*fact(n-1)); }
3、输入一行字符,从第location个位置开 始,截取number个字符并将其输出。如 果location的值超过输入字符串的长度, 则不做截取操作,输出"Fail!";若从 location位置起,其后的字符个数不足 number个,则截取到字符串结束字符为 止。截取操作由函数cut实现。 #include<stdio.h> char substring[80]; /*存放截取的number个 字符*/
void cut(char str[ ],int location,int number) int k; if(strlen(str)<location) { printf("Fail!\n"); return; } for(k=0;k<number;k++) if(str[location]!='\0') substring[k]=str[location++]; else break; substring[k]='\0'; printf("%s\n",substring); }
5) 定义一个带参数的宏,使两个参数的值 互换,并写出程序,输入两个数作为使 用宏时的实参,输出已交换后的两个值。 #define SWAP(a,b) t=b;b=a;a=t main() {int a,b,t; printf("Input two integers a,b:"); scanf("%d,%d",&a,&b); SWAP(a,b); printf("Now ,a=%d,b=%d\n",a,b); }
main() { int a[11],b[11],c[21],i,j,k,n,m; for(i=1;i<=10;i++) { a[i]=2*i-1;b[i]=2*i; } c[1]=a[1];m=c[1]; a[1]=0;k=2; /*将已被放入c数组中的元素a[1]置为0*/ while(k<=20) { if(m%2) n=s(b,m,10) n=s(a,m,10); else n=s(a,m,10) n=s(b,m,10); if(n>0) { c[k]=n;k++;m=n; } else { printf(“fail!\n”); exit(0); } } /*找不到满足条件的元素,退出程序*/
改错题 1) 下面的程序将一个数组从二分之一 处切开(元素个数为奇数时,正中 间元素不动,元素个数为偶数时, 无正中间元素),然后将中间的元 素向两头搬移,同时两头元素向中 间平移,直至两头的元素平移到中 间。例如对1 2 3 4 5 6搬移一次后 的格局为:3 1 2 5 6 4。
#include<stdio.h> #define N 12 int move(int p[ ],int m) { int k,x; k=m/2 k=m/2-1 ; x=p[k]; for(;k>0;k--) p[k]=p[k-1]; p[k]=x; k=m/2; == if(m%2= 1) k++; x=p[k]; for(;k<m-1;k++) p[k]= p[k+1] p[k]=x; p[k+1]=p[k]; }