实验二 总结

这次的实验,我觉得挺有难度的

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define getpch(type)(type*)malloc(sizeof(type))
#define NULL 0    

struct jcb{
    char name[10];        //work name
    int reachtime;
    int starttime;
    int needtime;
    int finishtime;
    float cycletime;        //周转时间
    float weightedtime;        //带权周转时间
    float response;            //响应比
    char state;                //状态
    struct jcb *next;        //结构体指针
}*ready=NULL,*p,*q;
typedef struct jcb JCB;

int n,time=0;        //how many? time first work;
float T1=0,T2=0;

void input(){
    int i;
    printf("输入作业个数(2-24)(输入1为默认值5): ");
    scanf("%d",&n);
    if(n==1){
    n=5;
    }
    for(i=0;i<n;i++){
        p=getpch(JCB);
        printf("\n\n");
        printf("输入作业名:");
        scanf("%s",p->name);
        printf("输入到达时间:");
        scanf("%d",&p->reachtime);
        printf("输入所需运行时间:");
        scanf("%d",&p->needtime);
    p->state=‘W‘;
    p->next=NULL;
    if(ready==NULL) ready=q=p;
    else{
        q->next=p;
        q=p;
    }
}

}
void disp(JCB *q,int m){      //显示作业运行后的周转时间及带权周转时间等
    if(m==3){                    //显示高响应比算法调度作业后的运行情况
        printf("\n作业%s正在运行,其运行情况为:\n",q->name);
        printf("开始运行时刻:%d\n",q->starttime);
        printf("完成时刻:%d\n",q->finishtime);
        printf("周转时间:%f\n",q->cycletime);
        printf("带权周转时间:%f\n",q->weightedtime);
        printf("响应比:%f\n",q->response);
        getch();
    }
    else{                         //显示先来先服务,最短作业优先算法调度后作业的运行情况
         printf("\n作业%s正在运行,其运行情况为:\n",q->name);
         printf("开始运行时刻:%d\n",q->starttime);
        printf("完成时刻:%d\n",q->finishtime);
        printf("周转时间:%f\n",q->cycletime);
        printf("带权周转时间:%f\n",q->weightedtime);
        getch();
    }
}
void running(JCB *p,int m){                //运行作业
    if(p==ready){                    //先将要运行的作业从队列中分离出来
        ready=p->next;
        p->next=NULL;
    }
    else{
        q=ready;
        while(q->next!=p){
            q=q->next;
        }
        q->next=p->next;
    }
    p->starttime=time;
    p->state=‘R‘;
    p->finishtime=p->starttime+p->needtime;
    p->cycletime=(float)(p->finishtime-p->reachtime);
    p->weightedtime=(float)(p->cycletime/p->needtime);
    T1=T1+p->cycletime;
    T2=T2+p->weightedtime;
    disp(p,m);
    time=p->needtime+time;
    p->state=‘F‘;
    printf("\n%s has been finished!\n press any key to continue...\n",p->name);
    free(p);
    getch();
}

void response(){            //计算队列中作业的高响应比
    JCB *padv;
    padv=ready;
    do{
        if(padv->state==‘W‘&&padv->reachtime<=time)
        padv->response=(float)(time-padv->reachtime+padv->needtime)/padv->needtime;
        padv=padv->next;
    }while(padv!=NULL);
}

void final(){                    //最后打印作业的平均周转时间,平均带权周转时间
    float s,t;
    t=T1/n;
    s=T2/n;
    getch();
    printf("\n\n作业已全部完成!");
    printf("\n%d个作业的平均周转时间是:%f",n,t);
    printf("\n%d个作业的平均带权周转时间是%f:\n\n\n",n,s);
}
void hrrn(int m){               //高响应比算法
    JCB *min;
    int i,iden;
    system("cls");
    input();
    for(i=0;i<n;i++){
        p=min=ready;
        iden=1;
        response();
        do{
            if(p->state==‘W‘&&p->reachtime<=time){
                if(iden){
                    min=p;
                    iden=0;
                }
                else if(p->response>min->response)
                {
                    min=p;
                }
                p=p->next;
            }
        }while(p!=NULL);

        if(iden){
            i--;
            time++;
            if(time>1000){
                printf("\n runtime is too long .. error..");
                getch();
            }
        }
        else{
            running(min,m);
        }
    }
        final();
}
void sjf(int m){                //最短作业优先
    JCB *min;
    int i,iden;
    system("cls");
    input();
    for(i=0;i<n;i++){
        p=min=ready;
        iden=1;
        response();
        do{
            if(p->state==‘W‘&&p->reachtime<=time)
                if(iden){
                    min=p;
                    iden=0;
                }
            else if(p->response>min->response){
                min=p;
            }
            p=p->next;
        }while(p!=NULL);
        if(iden){
            i--;
            time++;
            if(time>1000){
                printf("\n runtime is too long .. error..");
                getch();
            }
            else{
                running(min,m);
            }

        }
    }
    final();
}
void fcfs(int m){            //先来先服务
    int i,iden;
    system("cls");
    input();
    for(i=0;i<n;i++){
        p=ready;
        iden=1;
        do{
            if(p->state==‘W‘&&p->reachtime<=time) iden=0;
            if(iden) p=p->next;
        }while(p!=NULL&&iden);
        if(iden){
            i--;
            printf("\n没有满足要求的进程,需等待");
            time++;
            if(time>100){
                printf("\n时间过长");
                getch();
            }
            else{
                running(p,m);
            }
        }
    }
    final();
}
void output(){
    int m;
    system("cls");
    printf("\n\n\t\t**********************************\t\t\n");
    printf("\t\t\t\t作业调度演示\n");
    printf("\n\n\n\t\t\t1.先来先服务算法.");
    printf("\n\t\t\t2.最短作业优先算法.");
    printf("\n\t\t\t3.响应比高者优先算法.");
    printf("\n\t\t\t0.退出程序.");
    printf("\n\n\t\t\t\t选择所要操作:");
    scanf("%d",&m);
    switch(m){
        case 1:
            fcfs(m);
            getch();
            system("cls");
            output();
            break;
        case 2:
            sjf(m);
            getch();
            system("cls");
            output();
            break;
        case 3:
            hrrn(m);
            getch();
            system("cls");
            output();
            break;
        case 0:
            system("cls");
            break;
        default:
            printf("选择错误,重新选择.");
            getch();
            system("cls");
            output();
    }
}

main(){
    output();
}

目前这段代码还有点小问题,我会继续改进。这次的实验主要是调用函数和指针、栈的问题,之前数据结构学过的,不过。。我还给老师了。。所以这次的实验做起来很吃力,不过我会继续努力的

时间: 2024-11-05 13:26:30

实验二 总结的相关文章

MySQL数据库实验二:单表查询

实验二   单表查询 一.实验目的 理解SELECT语句的操作和基本使用方法. 二.实验环境 是MS SQL SERVER 2005的中文客户端. 三.实验示例 1.查询全体学生的姓名.学号.所在系. SELECT Sname,S#,Sdept FROM S: 2.查询全体学生的详细记录. SELECT  * FROM S: 3.查全体学生的姓名及其出生年份. SELECT Sname,2011-Sage    /*假定当年的年份为2011年*/ FROM S: 4.查询选修了课程的学生学号.

20145221高其&amp;20145326蔡馨熠《信息安全系统设计基础》实验二 固件设计

20145221高其&20145326蔡馨熠<信息安全系统设计基础>实验二 固件设计 实验目的与要求 了解多线程程序设计的基本原理,学习 pthread 库函数的使用. 了解在 linux 环境下串行程序设计的基本方法. 掌握终端的主要属性及设置方法,熟悉终端I /O 函数的使用.学习使用多线程来完成串口的收发处理. 熟悉linux开发环境,学会基于S3C2410的linux开发环境的配置和使用.使用linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的

实验二 作业调度模拟程序

实验二 作业调度模拟程序 一.        实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.        实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素.      作业调度算法: 1)      采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间

实验二

实验二.pcb进程 专业 网络工程   姓名 方俊晖 学号 201406114309 一.        实验目的 通过本实验可以加深对有关进程控制块.进程队列的概念的进一步理解. 二.        实验内容和要求 1.进程PCB的结构体定义 2.定义结构体 3.输入进程序列 4.排序(按到位时间) 5.输出进程运行的结果 三.        实验方法.步骤及结果测试 #include<stdio.h>typedef struct PCB{int time;int member;int he

信息安全系统设计基础实验二:固件设计

北京电子科技学院(BESTI) 实验报告 课程:信息安全系统设计基础 班级:1353 姓名:芦畅 傅冬菁 学号:20135308 20135311 成绩: 指导教师:娄家鹏 实验日期:2015.11.10 实验密级: 预习程度: 实验时间:15:30~18:00 仪器组次: 必修/选修: 实验序号:1 实验名称:实验一:Linux开发环境的配置和使用 实验目的与要求: 1.掌握程序的烧写方法; 2.能够实现Bootloader; 3.实现密码学中常见算法的固化. 实验仪器: 名称 型号 数量 嵌

实验二 实验报告

实验二 作业调度模拟程序 13物联网  陈梓帆  201306104108 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统

1111实验二 作业调度模拟实验

实验二.作业调度模拟实验 物联网工程 张怡 201306104149 一.实验目的  (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.实验内容和要求 1.至少用三种调度算法: 1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业. 3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高

实验二十四:SD卡模块

  驱动SD卡是件容易让人抓狂的事情,驱动SD卡好比SDRAM执行页读写,SD卡虽然不及SDRAM的麻烦要求(时序参数),但是驱动过程却有猥琐操作.除此此外,描述语言只要稍微比较一下C语言,描述语言一定会泪流满面,因为嵌套循环,嵌套判断,或者嵌套函数等都是它的痛.. 史莱姆模块是多模块建模的通病,意指结构能力非常脆弱的模块,暴力的嵌套行为往往会击垮模块的美丽身躯,好让脆弱结构更加脆弱还有惨不忍睹,最终搞垮模块的表达能力.描述语言预想驾驭SD卡,关键的地方就是如何提升模块的结构能力.简单而言,描述

实验二作业调度

实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素. 作业调度算法: 1)       采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度.总是首先调度在系统中等待时间最长的作业. 2)      

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十三:DS1302模块

实验二十三:DS1302模块 DS1302这只硬件虽然曾在<建模篇>介绍过,所以重复的内容请怒笔者懒惰唠叨了,笔者尽可以一笑带过,废话少说让我们进入正题吧.DS1302是执行事实时钟(Real Time Clock)的硬件,采用SPI传输. 表示23.1 访问(地址)字节. [7] [6] [5] [4] [3] [2] [1] [0] 1 A5 A4 A3 A2 A1 A0 R/W DS1302作为从机任由主机蹂躏 ... 啊,是任由主机访问才对.对此,访问便有方向之分.如表23.1所示,访