实验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)验证带进位运算及进位锁存功能
这里有两种情况:

  1. 进位标志已清零,即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,并且不产生进位。
  2. 原来有进位,即CY=1,进位灯亮。
    此时不考虑CN的状态,再来进行带进位算术运算。同样步骤(2)参与运算的两个数为55H和AAH,当S3、S2、S1、S0、M状态为10010,此时输出数据总线显示灯上显示的数据为DRl加DR2再加当前进位标志CY,相加的结果同样为ALU=00,并且产生进位,此时按动手动脉冲开关,则进位标志灯亮,表示有进位。
    (5)如果原来有进位,CY=1,进位灯亮,但需要清零进位标志时,具体操作方法如下:
  3. AR信号置为“0”电平,DRl寄存器中的数应小于FF。
  4. S3、S2、S1、S0、M的状态置为0 0 0 0 0。
  5. 按动手动脉冲发生开关,CY=0,即清进位标志。
    注:进位标志指示灯CY亮时,表示进位标志为“1”,有进位;
    进位标志指示灯CY灭时,表示进位位为“0”,无进位。

三、验证两种操作下带进位的运算功能的实验数据记录

在这里插入图片描述
在这里插入图片描述

四、实验结果分析及总结

通过实验验证了带进位的八位算数逻辑运算,本实验需要注意进位灯的数值,以及合理的操作。

五、思考题

1、如何在进位运算操作前对进位标志清零?
答:总清开关置为0即可使进位标为0。
2、在进行进位运算操作时,在何种情况下要对进位标志清零?
答:当前进位标数值为1,并且后面的实验操作要求进位标为0时,要进行标志清零。

以上是关于实验6的主要内容,如果未能解决你的问题,请参考以下文章

ARM实验6——ADC实验

实验6(2019.6.4)

实验&报告6

2019.6.6实验五

实验报告(2019年6月12日)

spark实验6