实验6
Posted nbb233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验6相关的知识,希望对你有一定的参考价值。
task4
#include <stdio.h> #include<string.h> #define N 100 typedef struct char num[10]; // 学号 int s1; // 期末成绩 int s2; // 平时成绩 double sum; // 总评 char level[10]; // 等级 STU; int fun(STU a[], int n, STU h[]); // 函数声明 int main() STU s[N]= "GA05", 85, 76, "GA03", 76, 90, "GA02", 69, 90, "GA04", 85, 56, "GA01", 91, 95, "GA07", 72, 80, "GA08", 64, 45, "GA06", 87, 98, "GA015", 85, 86, "GA013", 91, 97 ; // 原始学生成绩记录 STU h[N]; // 保存均分以上学生记录 int i, k, n = 10; // 调用fun对学生成绩记录进行处理 k = fun(s, n, h); // 输出均分以上学生记录 printf("There are :\\n"); for(i = 0; i < k; i++) printf("%s %d %d %.2f %s\\n", h[i].num, h[i].s1, h[i].s2, h[i].sum, h[i].level); return 0; // 函数定义 // 功能:对包含n条学生成绩记录的数组a进行处理: // 计算总评成绩,统计等级为"均分以上"的学生记录保存到数组h中,并返回其人数 int fun (STU a[], int n, STU h[]) int i, t = 0; double ave = 0, s = 0;; for(i = 0; i < n; i++) a[i].sum = a[i].s1 * 0.7 + a[i].s2 * 0.3; s += a[i].sum; ave = s / n; if(a[i].sum > ave) strcpy(a[i].level, "均分以上"); for(i = 0; i < n; i++) if(a[i].sum > ave) h[t++] = a[i]; return t;
#include <stdio.h> #include <string.h> #define N 5 typedef struct student char name[10]; int num; int maths; int computer; int english; int sum; char level[10]; STU; void fun(STU a[], int n); // 函数声明 int main() STU s[6*N]= "A001", 1, 34, 67, 80, "B003", 3, 78, 87, 90, "A002", 2, 90, 98, 99, "B002", 4, 56, 78, 98, "A005", 5, 35, 67, 79 ; int i; fun(s, N); for(i = 0; i < N; i++) printf("%s %d %d %d %d %d %s\\n", s[i].name, s[i].num, s[i].maths, s[i].computer, s[i].english, s[i].sum, s[i].level); return 0; // 函数定义 // 功能:对包含n条学生成绩记录的数组a进行处理: // 计算三门课程总分、总分最大值、总分最小值,并设置等级: // 总分与总分最大值相等的同学的等级设置为优秀 // 总分与总分最小值相等的同学的等级设置为不及格 // 其余同学的等级设置为合格 void fun(STU a[], int n) int i; for(i = 0; i < n; i++) a[i].sum = a[i].maths + a[i].computer + a[i].english; int max = a[0].sum; for(i = 0; i < n; i++) if(a[i].sum >= max) max = a[i].sum; int min = a[0].sum; for(i = 0; i < n; i++) if(a[i].sum <= min) min = a[i].sum; for(i = 0; i < n; i++) if(a[i].sum == max) strcpy(a[i].level, "优秀"); else if(a[i].sum == min) strcpy(a[i].level, "不及格"); else strcpy(a[i].level, "合格");
#include <stdio.h> #define N 5 // 定义结构体类型struct student, 并定义STU为其别名 typedef struct student long no; char name[20]; int score; STU; // 函数声明 void input(STU s[], int n); int find_min_list(STU s[], STU t[], int n); void output(STU s[], int n); int main() STU stu[N], min_list[N]; int count; printf("录入%d个学生信息\\n", N); input(stu, N); printf("\\n统计最低分人数和学生信息...\\n"); count = find_min_list(stu, min_list, N); printf("\\n一共有%d个最低分,信息如下:\\n", count); output(min_list, count); return 0; // 输入n个学生信息,存放在结构体数组s中 void input(STU s[], int n) // 补足函数实现 // ××× int i; for(i = 0; i < n; i++) scanf("%d %s %d", &s[i].no, s[i].name, &s[i].score); // 输出结构体s中n个元素信息 void output(STU s[], int n) // 补足函数实现 // ××× int i; for(i = 0; i < n; i++) printf("%d %s %d\\n", s[i].no, s[i].name, s[i].score); // 在结构体数组s中,查找最低分学生的记录,将其存入结构体数组t中 // 形参n是结构体数组s中元素个数 // 函数返回最低分的学生人数 int find_min_list(STU s[], STU t[], int n) // 补足函数实现 // ××× int i, k = 0, min = 100; for(i = 0; i < n; i++) if(min > s[i].score) min = s[i].score; for(i = 0; i < n; i++) if(s[i].score == min) t[k++] = s[i]; return k;
[计算机组成原理]——运算器实验
文章目录
8位算术逻辑运算实验
一、实验目的
1、掌握算术逻辑运算器单元ALU(74LS181)的工作原理。
2、掌握简单运算器的数据传送通路组成原理。
3、验证算术逻辑运算功能发生器74LSl8l的组合功能。
4、按给定数据,完成实验指导书中的算术/逻辑运算。
二、实验内容
1、实验原理
实验中所用的运算器数据通路如图1-1所示。其中运算器由两片74LS181以并/串形成8位字长的ALU构成。运算器的输出经过一个三态门74LS245(U33)到内部数据总线BUSD0~D7插座BUS1~2中的任一个(跳线器JA3为高阻时为不接通),内部数据总线通过LZD0~LZD7显示灯显示;运算器的两个数据输入端分别由二个锁存器74LS273(U29、U30)锁存,两个锁存器的输入并联后连至内部总线BUS,实验时通过8芯排线连至外部数据总线EXD0~D7插座EXJ1~EXJ3中的任一个;参与运算的数据来自于8位数据开并KD0~KD7,并经过一三态门74LS245(U51)直接连至外部数据总线EXD0~EXD7,通过数据开关输入的数据由LD0~LD7显示。
图1-1中算术逻辑运算功能发生器 74LS181(U31、U32)的功能控制信号S3、S2、S1、S0、CN、M并行相连后连至6位功能开关,以手动方式用二进制开关S3、S2、S1、S0、CN、M来模拟74LS181(U31、U32)的功能控制信号S3、S2、S1、S0、CN、M;其它电平控制信号LDDR1、LDDR2、ALUB、SWB以手动方式用二进制开关LDDR1、LDDR2、ALUB、SWB来模拟,这几个信号有自动和手动两种方式产生,通过跳线器切换,其中ALUB、SWB为低电平有效,LDDR1、LDDR2为高电平有效。
另有信号T4为脉冲信号,在手动方式下进行实验时,只需将跳线器J23上T4与手动脉冲发生开关的输出端SD相连,按动手动脉冲开关,即可获得实验所需的单脉冲。
2、实验接线
A.本实验用到4个主要模块:
(1)低8位运算器模块;(74LS181芯片2片 74LS273 芯片2个,分别存放数据A和B)
(2)数据输入并显示模块;(KD0~KD7)
(3)数据总线显示模块;(LD0~LD7)
(4)功能开关模块(借用微地址输入模块,S0~S3,M,CN)
B.控制方式:手动控制方式;
C.脉冲信号:T4,将跳线器J23上T4与手动脉冲发生开关的输出端SD相连,按动手动脉冲开关,即可获得实验所需的单脉冲信号。
D.控制信号:由跳线拨决定,跳线拨在上面为"1",拨在下面为"0",电平值由对应的显示灯显示。
高有效信号 运算器运算方式:S0~S3,M,CN;锁存器控制:LDDR1、LDDR2;
低有效信号 输入控制台:SWB
运算器输出控制:ALUB
E.根据实验原理详细接线如下:
(1)J20,J21,J22,接上短路片,
(2)J24,J25,J26接左边;
(3)J27,J28 右边;
(4)J23 置右边T4选“ SD”
(5)JA5 置“接通”;
(6)JA6 置“手动”;
(7)JA3 置“接通”;
(8)JA1,JA2,JA4置“高阻”;
(9)JA8 置上面“微地址”;
(10)EXJ1接BUS3;
(11)开关CE 、AR 置1;
说明:LDDR1、LDDR2、ALUB、SWB
四个信号电平由对应的开关LDDR1、LDDR2、ALUB、SWB给出, T4由手动脉冲开关给出。
AR为算术运算时是否影响进位及判零标志控制位,低电平有效。
F.实验原理图
3、实验预习
(1)用二进制数码开关KD0—KD7向DR1和DR2寄存器置数。
ALU输出三态门(ALUB置 1),目的是关闭输出三态门;
SW输入三态门(SWB置 0),目的是开启输入三态门;
令LDDR1= 1 ,LDDR2= 0 ,通过KD0-KD7开关输入数据35H,按动手动脉冲发生按钮,将数据35H置入DR1寄存;
令LDDR1= 0 ,LDDR2= 1 ,通过KD0-KD7开关输入数据48H,按动手动脉冲发生按钮,将数据48H置入DR2寄存。
(2) 检验DR1和DR2中存入的数据是否正确。
具体方法:利用算术逻辑运算功能发生器 74LS181的逻辑功能,即M=1 。通过正确的逻辑运算,能够依次读出DR1和DR2的数据。
实现过程为:关闭数据输入三态门SWB= 1 ,打开ALU输出三态门ALUB= 0 ,当置S3、S2、S1、S0、M为 1 1 1 1 1 时,总线指示灯显示 DR1 中的数,而置成 1 0 1 0 1 时,总线指示灯显示DR2中的数。
4、实验步骤
(1)连接线路,仔细查线无误后,接通电源。
(2)用二进制数码开关KD0~KD7向DRl和DR2寄存器置数。
方法:关闭ALU输出三态门(ALUB=1),开启输入三态门(SWB=0),输入脉冲T4按手动脉冲发生按钮产生。
说明:LDDRl、LDDR2、ALUB’、SWB’四个信号电平由对应的开关LDDRl、
LDDR2、ALUB、SWB给出,拨在上面为“1”,拨在下面为“0”,电平值由对应的显示灯显示,T4由手动脉冲开关给出。
(3)检验DRl和DR2中存入的数据是否正确,利用算术逻辑运算功能发生器74LSl 8l的逻辑功能进行验算,即M=1。具体操作如下:关闭数据输入三态门SWB’=1,打开ALU输出三态门ALUB’=0,当置S3、S2、S1、S0、M为11111时,总线指示灯显示DR1中的数,而置成10101时总线指示灯显示DR2中的数。
(4)验证74LSl81的算术运算和逻辑运算功能(采用正逻辑)
在给定DRl=35H、DR2=48H的情况下,改变算术逻辑运算功能发生器的功能设置,观察运算器的输出,填入实验报告表中,并和理论分析进行比较、验证。
(5)以本组同学的学号后两位作为两个输入数据完成第(4)部分要求。
三、74LS181功能表
实验中用到的运算器74LS181功能表如表1.1所示。
四、实验数据
五、实验结果分析及总结
本次实验较为简单,关键在于对实验逻辑的理解以及S0,S1,S2,S3,Cn以及M的操作。
六、思考题
1、在向DR1和DR2寄存器置数时S3、S2、S1、S0、M、Cn如何设置?
答:S3、S2、S1、S0、M设置为1、1、1、1、1时,数据总线显示灯显示DR1寄存器的内容,S3、S2、S1、S0、M、CN设置为1、0、1、0、1时数据总线显示灯显示DR2寄存器的内容。
2、DR1置数完成后,如果不关闭控制端,LDDR1会怎样?
答:若不关闭控制端,则数据可能会丢失
3、为什么在读取74LS181的输出结果时要打开输出三态门的控制端ALUB ?
答:只有打开了输出三态门数据才能在总线中显示
带进位控制8位算术逻辑运算实验
一、实验目的
1、验证带进位控制的算术逻辑运算发生器74LSl8l的功能。
2、按指定数据完成几种指定的算术运算。
二、实验内容
1、实验原理
带进位控制运算器的实验原理如图2.1所示,在实验1的基础上增加进位控制部分,其中高位74LS181(U31)的进位CN4通过门UN4E、UN2C、UN3B进入UN5B的输入端D,其写入脉冲由T4和AR信号控制,T4是脉冲信号,在手动方式下进行实验时,只需将跳线器J23上T4与手动脉冲发生开关的输出端SD相连,按动手动脉冲开关,即可获得实验所需的单脉冲。AR是电平控制信号(低电平有效),可用于实现带进位控制实验。从图中可以看出,AR必须为“0”电平,D型触发器74LS74(UN5B)的时钟端CLK才有脉冲信号输入。才可以将本次运算的进位结果CY锁存到进位锁存器74LS74(UN5B)中。
2、实验接线
实验连线详细如下:
(1)J20,J21,J22,接上短路片,
(2)J24,J25,J26接左边;
(3)J27,J28 右边;
(4)J23 置右边T4选“ SD”
(5)JA5 置“接通”;
(6)JA6 置“手动”;
(7)JA3 置“接通”;
(8)JA1,JA2,JA4置“高阻”;
(9)JA8 置上面“微地址”
(10)EXJ1接BUS3
(11)CE、299B 置“1”,AR置“0”;
(12)总清开关拨在“1”电平。若总清开关拨在“0”电平,Cy清零。
3、实验步骤
(1)仔细查线无误后,接通电源。
(2)用二进制数码开关KDO~KD7向DRl和DR2 寄存器置数。
方法:关闭ALU输出三态门ALUB=1,开启输入三态门SWB=0,输入脉冲T4按手动脉冲发生按钮产生。如果选择参与操作的两个数据分别为55H、AAH,将这两个数存入DR1和DR2。
(3)开关ALUB=0,开启输出三态门,开关SWB=1,关闭输入三态门,同时让LDDR1=0,LDDR2=0。
(4)验证带进位运算及进位锁存功能
这里有两种情况:
- 进位标志已清零,即CY=0,进位灯灭。使开关CN=0,再来进行带进位算术运算。例如步骤(2)参与运算的两个数为55H和AAH,当S3、S2、S1、S0、M状态为10010,此时输出数据总线显示灯上显示的数据为DRl加DR2再加初始进位位“1” (因CN=0),相加的结果应为ALU=00,并且产生进位,此时按动手动脉冲开关,则进位标志灯亮,表示有进位。使开关CN=1,当S3、S2、S1、S0、M状态为10010,则相加的结累ALU=FF,并且不产生进位。
- 原来有进位,即CY=1,进位灯亮。
此时不考虑CN的状态,再来进行带进位算术运算。同样步骤(2)参与运算的两个数为55H和AAH,当S3、S2、S1、S0、M状态为10010,此时输出数据总线显示灯上显示的数据为DRl加DR2再加当前进位标志CY,相加的结果同样为ALU=00,并且产生进位,此时按动手动脉冲开关,则进位标志灯亮,表示有进位。
(5)如果原来有进位,CY=1,进位灯亮,但需要清零进位标志时,具体操作方法如下: - AR信号置为“0”电平,DRl寄存器中的数应小于FF。
- S3、S2、S1、S0、M的状态置为0 0 0 0 0。
- 按动手动脉冲发生开关,CY=0,即清进位标志。
注:进位标志指示灯CY亮时,表示进位标志为“1”,有进位;
进位标志指示灯CY灭时,表示进位位为“0”,无进位。
三、验证两种操作下带进位的运算功能的实验数据记录
四、实验结果分析及总结
通过实验验证了带进位的八位算数逻辑运算,本实验需要注意进位灯的数值,以及合理的操作。
五、思考题
1、如何在进位运算操作前对进位标志清零?
答:总清开关置为0即可使进位标为0。
2、在进行进位运算操作时,在何种情况下要对进位标志清零?
答:当前进位标数值为1,并且后面的实验操作要求进位标为0时,要进行标志清零。
以上是关于实验6的主要内容,如果未能解决你的问题,请参考以下文章