当前位置:编程学习 > C/C++ >>

急求学C语言,帮忙看一个程序!!QQ 1012442345

追问:#include "stdafx.h"
   #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))/*用getpcb(type)给type类型的变量申请一个空间*/
struct pcb {         /*定义进程控制块PCB */
char name[10];      /*进程名*/
char state;          /*进程状态*/
int ntime;           /*进程需要运行时间*/
int rtime;           /*进程已经运行的时间*/
struct pcb *link;      /*定义了一个指向pcb结构类型的指针link作为自己的成员函数*/
}*ready=NULL,*p;  /*定义了两个指向pcb结构类型的指针ready和p ,ready的初值为空*/

typedef struct pcb PCB;         /*定义PCB为struct pcb的别名*/
void inunization()             /*初始化界面函数*/
{
  printf("\n\n\t\t********************************************\t\t\n");
  printf("\t\t\t\t jihchengdiaodu\n");
  printf("\t\t*********************************************\t\t\n");
  printf("\n\n\n\t\t\t07wuzhuang\n");
  printf("\t\t\tname:lixueyan\n");
  printf("\t\t\txuehao:08030043\n");
  printf("\t\t\tfinished time:2011.10.28\n\n\n\n");
  printf("\t\t\t\tenter any button to operate\n");
  getch();
}

void sort1()          /*对进程进行轮转调度排列函数 */
{
    PCB *first;
    if(ready==NULL) /*如果就绪队列为空*/
    {
        ready=p;    /*将新建进程放入就绪队列中,将ready指向队首进程 */
    }
    else             /*就绪队列中有进程在等待,将新建进程插入到队尾 */
    {
        first=ready;              /*first指针指向队首进程 */
        while(first->link!=NULL) first=first->link; /*当first指针没有指向队尾时,指针后移 */
        first->link=p;/*将P指向的进程插入队尾*/
    }
}
void input(flag)        /*建立进程控制块函数*/
{
    int i;
    system("cls");                         /*清屏*/
    printf("\nenter the information of six process\n");
for(i=0;i<6;i++)
    {
        printf("\n process number No.%d:\n",i + 1);
        p=getpch(PCB);   /*给进程申请一个空间,并用指针p指向这个空间*/
        printf("\n process name:");
        scanf("%s",p->name);             /*输入进程的名字 */

        printf("\n runtime:");
        scanf("%d",&p->ntime);          /* 输入进程的运行时间*/
        printf("\n");
        p->rtime=0;                     /*进程已运行的时间的初值为0*/
        p->state='w';
        p->link=NULL;                   /*新建进程的指针域为空*/
        if(flag==1)/*如果标志变量flag等于1,则属于最先优先数优先算法*/

            sort1();                    /*调用sort1函数*/
    }
    }

int space()        /*计算进程控制块个数的函数 */
{
    int l=0; PCB* pr=ready;              /* pr指向队首进程*/
    while(pr!=NULL)                   /*pr为空,则说明计数完成*/
    {
        l++;
        pr=pr->link;                    /* pr向下以一个进程*/
    }
    return(l);
}      

void disp1(PCB * pr)/*建立进程显示函数,用于显示使用FCFS算法的当前进程*/
{
    printf("\n qname \t state \t ndtime   runtime \n");
    printf("  |%s\t",pr->name);            /* 显示当前进程的进程名*/
    printf("  |%c\t",pr->state);           /*显示当前进程的状态 */
    printf("  |%d\t",pr->ntime);          /*显示当前进程的运行时间 */
    printf("  |%d\t",pr->rtime);          /* 显示当前进程的已运行时间 */
    printf("\n");
}
void check(flag)             /*进程查看函数*/
{
    PCB* pr;
    printf("\n ***running process is:",p->name);/*显示当前运行进程 */
    if(flag==1)                             
        disp1(p);                       /*标志变量不为1,调用disp1()函数*/
    pr=ready;                               /*pr指向等待队列的队首进程*/
    printf("\n ****wait queue is:\n");     /*显示就绪队列状态*/
    while(pr!=NULL)                         /*就绪队列不为空时*/
    {                       /*根据标识符值显示不同算法下的就绪队列状态*/
        if(flag==1)

        disp1(pr);
        pr=pr->link;
    }
}
void destroy()              /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
    printf("\n process [%s] finished.\n",p->name);
    free(p);
}
void running()              /*建立进程就绪函数(进程运行时间到,置就绪状态)*/        
{
    (p->rtime)++;            /* 进程的运行时间加1 */
    if(p->rtime==p->ntime) /* 如果已运行时间等于进程运行所需的时间,则将进程释放 */
    destroy();                /*调用destroy函数 */

}
void running1()       /*建立进程就绪函数(进程运行时间到,置就绪状态) */       
{
    (p->rtime)++;            /*进程的运行时间加1 */


        p->state='w';         /* 将状态置为等待 */
        sort1();              /*调用sort1函数  */

}

void RoundRobin()                       /*轮转法模块,FCFS算法的程序入口*/
{
    int len, h=0;                           /* len用来存放进程的个数*/
    char ch;
    system("cls");                    
    input(0);                           /*调用input1函数,输入进程信息*/
    len=space();                            /*进程个数赋给len*/
    while((len!=0)&&(ready!=NULL))
    {
        ch=getchar();
        h++;
        printf("\n The execute number:%d \n",h);
        p=ready;                            /*将队首指针赋给p*/
        ready=ready->link;          /*ready指向原ready的下一个进程*/
        p->link=NULL;                       /*p的link赋空*/
        p->state='R';                       /*p的运行状态置为运行*/
        check(0);                           /*调用check函数,运用值传递*/
        running1();                         /*调用running1函数*/
        printf("\n press any button......");
    }
    printf("\n\n process is finished.\n");

}
/*****************************模块结束************************************/
void menu()    /*菜单*/
{
    int m;
    system("cls");
    printf("\n\n\t\t*********************************************\t\t\n");
    printf("\t\t\t\t进程调度演示\n");
    printf("\t\t*********************************************\t\t\n");

    printf("\n\t\t\t1.yian shi lunzhuangfa.");
    printf("\n\t\t\t0.exit.");
    printf("\n\n\t\t\t\tenter choice:");
    scanf("%d",&m);
    switch(m)
    {
        case 1:

            RoundRobin();       /*轮转法演示进程的程序入口*/
            system("cls");          /*清屏*/
            menu();             /*调用菜单函数*/
            break;
        case 0:
            system("cls");
            break;
        default:
            system("cls");
            menu();
    }
}
main()          
    {
        inunization();
        menu();
  getch();
    }

 

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,