Exercise 43:基本的面向对象的分析和设计

原文链接:http://learnpythonthehardway.org/book/ex43.html

        我打算向你描述一个用Python,特别是用到其面向对象编程思想来创建一些东西的过程。我所说的”过程“就是告诉你一系列你可以按照顺序执行的步骤,但是并不是意味着让你解决什么问题都按照这个步骤来,要懂的灵活变通。这些步骤只是针对很多编程问题是一个很好的开始而不应该把它作为解决各种问题唯一的一种方法。这个只是一个你可以遵循的流程。

流程如下:

1、写出或者画出关于问题的描述。

2、提取步骤1中的关键词搜索这些关键词。

3、创建一个层次结构的类和对象的映射关系。

4、编写该类测试运行。

5、重复上述操作并且逐步改善程序。

        这个流程看起来是一个”自上而下“的过程,意思就是说它是从一个非常抽象模糊的状态然后慢慢改善直到明确具体某样东西并且可以编码的过程。

        开始的时候我先写下关于问题的描述试着联想关于它的任何事情。我甚至可能去画一张或者两张示意图来描述,也可能是某种地图的样子,或者甚至写一系列的邮件来描述这些问题。这些操作可以给我一种表达这些问题中的关键词的方法同时也可以测试自己已经学到了什么。

        然后我可以通过这些笔记,示意图,以及描述来弄明白这些关键擦概念。做这个有一个很简单的技巧:只要简单的将你写下的和画下的名词和动词创建一个列表,然后写出它们之间的关系。这可以很好的为我们下一步中命名类、对象和函数提供一个很好的参考。如果需要的话,我也可以针对这一列概念查找任何我不理解的地方这样我就可以更进一步的改善它们。

        一旦我有了这些概念我就饿可以创建一个关于类的简单大纲。你也可以拿出列表中个名词问“这个名词和其他名词概念是否相同呢?那是不是意味着他们可以有一个共同的父类,那这个父类应该被称作什么呢?”。像这样做直到你创建了一个只有简单的树列或者示意图的类层次结构。然后把你有的作为每一个类中的函数名称的动词都放进这个树列中。

(未完待续....)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现的程序,实现了Exercise 1至6的要求: ```c #include <stdio.h> #include <stdlib.h> #define MAX_PROCESS_NUM 5 // 最大进程数 #define MAX_TIME_SLICE 5 // 最大运行时间片 // 进程控制块 typedef struct PCB { int pid; // 进程ID int priority; // 优先数 int time_required; // 要求运行时间 int dynamic_priority; // 动态优先数 struct PCB *next; // 指向下一个进程控制块的指针 } PCB; // 初始化进程控制块 void init_pcb(PCB *pcb, int pid, int priority, int time_required) { pcb->pid = pid; pcb->priority = priority; pcb->time_required = time_required; pcb->dynamic_priority = priority; pcb->next = NULL; } // 将进程插入就绪队列 void insert_ready_queue(PCB **head, PCB *pcb) { PCB *p, *q; if (*head == NULL || pcb->dynamic_priority > (*head)->dynamic_priority) { pcb->next = *head; *head = pcb; } else { p = *head; q = p->next; while (q != NULL && pcb->dynamic_priority <= q->dynamic_priority) { p = q; q = q->next; } pcb->next = q; p->next = pcb; } } // 从就绪队列中删除进程 PCB *remove_ready_queue(PCB **head) { PCB *pcb = *head; if (*head != NULL) { *head = (*head)->next; } return pcb; } // 动态地调整进程的优先级和要求运行时间 void adjust_priority_and_time(PCB *pcb) { pcb->dynamic_priority--; pcb->time_required--; if (pcb->dynamic_priority < 0) { pcb->dynamic_priority = 0; } } // 显示就绪队列中的进程 void display_ready_queue(PCB *head) { if (head == NULL) { printf("Ready queue is empty.\n"); return; } printf("Ready queue:"); while (head != NULL) { printf(" P%d(%d,%d,%d) ->", head->pid, head->priority, head->dynamic_priority, head->time_required); head = head->next; } printf(" NULL\n"); } int main() { int i; PCB *pcb[MAX_PROCESS_NUM]; PCB *ready_queue = NULL; char process_name[MAX_PROCESS_NUM][3] = {"P0", "P1", "P2", "P3", "P4"}; // 输入每个进程的优先数和要求运行时间 for (i = 0; i < MAX_PROCESS_NUM; i++) { int priority, time_required; printf("%s:\n", process_name[i]); printf("Priority: "); scanf("%d", &priority); printf("Time required: "); scanf("%d", &time_required); pcb[i] = (PCB *)malloc(sizeof(PCB)); init_pcb(pcb[i], i, priority, time_required); } // 将五个进程按给定的优先数从大到小连成就绪队列 for (i = 0; i < MAX_PROCESS_NUM; i++) { insert_ready_queue(&ready_queue, pcb[i]); } // 处理机调度总是选队首进程运行 while (ready_queue != NULL) { PCB *running_process = remove_ready_queue(&ready_queue); printf("Running process: %s\n", process_name[running_process->pid]); adjust_priority_and_time(running_process); if (running_process->time_required > 0) { insert_ready_queue(&ready_queue, running_process); } else { printf("Process %s is finished.\n", process_name[running_process->pid]); free(running_process); } display_ready_queue(ready_queue); } return 0; } ``` 运行程序后,依次输入五个进程的优先数和要求运行时间,程序会将它们按照优先数从大到小的顺序连成就绪队列,并开始动态优先数算法的调度。程序会输出每次运行的进程名,以及进程控制块的动态变化过程。当某个进程的运行时间为零时,程序会将其状态置为“结束”,且从就绪队列中删除。最后程序结束时,会释放所有进程控制块的内存空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值