操作系统课程设计用多线程同步方法解决睡眠理发师问题

合集下载

操作系统实验五理发师问题.docx

操作系统实验五理发师问题.docx

实验题目:理发师问问题学号:201000130133 班级:2010 级计算机4 班姓名:郑思雨Email :1412561943@实验目的:1、进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法。

2、加深对于非对称性互斥问题有关概念的理解。

观察和体验非对称性互斥问题的并发控制方法。

3、进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。

硬件环境:微机(多核,4GB以上内存,320GB以上硬盘)软件环境:Ubuntu-Linux 操作系统Gnome桌面gcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1、了解实验的目的,了解并掌握与进程间通信IPC中的3个对象:共享内存、信号灯数组、消息队列到呢个有关的系统调用,并能熟练的掌握。

2 、阅读实验题目并分析实验的需求。

理发店问题:假设理发店的理发室中有3 个理发椅子和3 个理发师,有一个可容纳4 个顾客坐等理发的沙发。

此外还有一间等候室,可容纳13 位顾客等候进入理发室。

顾客如果发现理发店中顾客已满(超过20 人),就不进入理发店。

在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。

顾客理完发后,可向任何一位理发师付款。

但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。

理发师在没有顾客的时候就坐在理发椅子上睡眠。

理发师的时间就用在理发、收款、睡眠上。

(1)首先创建ipc.h 文件,在里面定义生产者/ 消费者共用的IPC函数的原型和变量。

(2)然后创建ipc.c 文件,在里面定义生产者/ 消费者共用的IPC 的具体的相应函数。

(3)创建sofa_control 文件,在里面声明两个消息队列,当沙发空闲时则会将空闲的消息放入相应的队列中,让顾客可以进入沙发中,当理发师空闲时,也会将相应的消息放入队列中,从而可以让顾客到理发椅上进行理发。

操作系统原理课件-第十一讲睡眠理发师问题

操作系统原理课件-第十一讲睡眠理发师问题
死锁问题:原因,条件,解决方法;银行家算法
线程:引入原因,与进程比较
处理机调度:分为几个层次(作业调度、中级调度、进程调度); 评价调度算法的指标;调度算法各自的特点;采用不同的算法 计算进城的周转时间、调度顺序等;实时调度概念、常见算法
V(seat);
Get_haircut(); }
Process barber {
While(1)
{
P(customers); //接收顾客信号
V(barbers);//向顾客发信号
Cut_hair();
}
}
睡眠理发师问题 方法3
#define CHIRS=5
Var customers,barbers,mutex: Semaphore:=0,0,1
{
P(customers); //接收顾客信号
Cut_hair();
V(seat);
}
}
睡眠理发师问题 方法2
Var customers,barbers,seat: Semaphore:=0,0,5
Process customer
{
P(seat) ;
V(customers); //向理发师发信号
P(barbers); //接收理发师信号
P(customers );//接收顾客信号
Get_haircut();
P(mutex);}Fra bibliotekwaiting=waiting-1;
else
V(barbers);//向顾客发信号
{
V(mutex);
V(mutex);
Cut hair();
}
}
}
}
练习
吸烟者问题(1971,Patil):在一个房间内有三位吸烟者、一位材 料供应者。其中: a) 吸烟者: 需要拥有三种材料“烟草(Tobacco)、卷烟纸 (Cigarette-paper)、火柴(Match)”才能吸烟: 第一位吸烟者有丰富的烟草; 第二位吸烟者有丰富的卷烟纸; 第三位吸烟者有丰富的火柴; ; 当吸烟者拿到所需要的材料后,唤醒供应者进行下一次投放; b) 材料供应者:不吸烟,且有丰富的Tobacco、Cigarette-paper、 Match三种材料; 每次随机地将三种材料中的两种投放到桌子上; 允许拥有另一种材料的吸烟者吸烟。 【要求】编写算法用信号量和P、V操作实现它们之间的同步关系。

用多线程同步方法解决睡眠理发师问题

用多线程同步方法解决睡眠理发师问题

difine n 5; //为顾客准备的椅子数为5
semaphore mutex=1; //用于互斥
semaphore customers=0;//等候理发的顾客数
semaphore barbers=1;//正在等候顾客的理发师数
int waiting=0; //等候理发的顾客数
//理发师线程
void barber()
{
while(true) //判断有无顾客
{
wait(customers); //若无顾客,理发师睡眠
wait(mutex); //互斥
waiting--; //等候顾客数少一个
signal(mutex); //释放临界资源
signal(barber); //理发师去为一个顾客理发
cut_hair; //正在理发
}
}
//顾客线程
void customer()
{
wait(mutex); //互斥
if (waiting<n) //如果有空椅子,则等待
{
waiting++; //等候顾客数加1
signal(mutex); //释放临界资源
signal(customers); //如果理发师睡觉,唤醒理发师
操作系统课程设计----Sleeping-Barber Problem
wait(barber); //理发师在理发, 顾客等候
get_haircut; //顾客坐下等理发师
}
else
signal(mutex); //店里人满了,顾客离开
}
}
2。

华工操作系统实验

华工操作系统实验

一、实验步骤:1. 在linux下编写一个应用程序,命名为an_ch2_1b。

这个程序不断地输出如下行:Those output come from child,[系统时间]另外写一个应用程序,命名为an_ch2_1a。

这个程序创建一个子进程,执行an_ch2_1b。

这个程序不断地输出如下行:Those output come from child,[系统时间]观察程序运行的结果,并对你看到的现象进行解释。

2. 在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。

新创建的线程与主线程均不断地循环,并输出shared_var的值。

主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1。

观察程序运行的结果,并对你看到的现象进行解释。

二、实验数据:an_ch2_1b.cpp文件:#include<iostream>#include<string>#include<stdlib.h>#include<unistd.h>#include<time.h>using namespace std;string getTime() //获取系统时间{time_t timep;time(&timep);char tmp[64];strftime(tmp,sizeof(tmp),"%Y-%m-%d%H:%M:%S",localtime(&ti mep));return tmp;}int main(){while (true){string tmn = getTime();cout <<"Those output come from child,"<< tmn << endl;sleep(1); //为了便于截屏使用sleep()函数延迟输出}return 0;}an_ch2_1a.cpp文件:#include<iostream>#include<sys/types.h>#include<unistd.h>#include<cstdio>#include<stdlib.h>using namespace std;int main(){pid_t pid;pid = fork();if (pid == -1) cout <<"fail to create"<< endl;else if (pid == 0) system("./an_ch2_1b");return 0;}Consoleapp.c文件:#include<sys/types.h>#include<stdio.h>#include<unistd.h>#include<pthread.h>int shared_var = 0;void * thread(void * arg){while (1){printf("in the thread shared_var:%d\n", --shared_var);}}int main(){pthread_t pt;int ret = pthread_create(&pt, NULL, (void*)thread, NULL);if (ret != 0) printf("fail to create thread\n");while (1){printf("in the main shared_var:%d\n", ++shared_var);}pthread_join(pt, NULL);return 0;}1.生产者消费者问题(信号量)参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。

理发师问题

理发师问题

Linux系统分析实验报告用信号量解决理发师问题061261008 蒋炎岩(一班)1 实验要求理发师问题:理发店理有一位理发师、一把理发椅和5把供等候理发的顾客坐的椅子。

如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。

用Linux线程机制和信号量机制解决这个问题,并且:(1)每个顾客进入理发室后,即时显示“Entered”及其线程标识,还同时显示理发室共有几名顾客及其所坐的位置(2)至少有10个顾客,每人理发至少3秒钟。

(3)多个顾客须共享操作函数代码。

2 背景知识2.1 POSIX线程在一个程序中的多个执行路线称之为线程。

Linux在1996年第一次获得线程支持,现在已经有一套完整的与线程有关的函数库调用,大多数以pthread_开头,编译时需要用-lpthread选项进行连接。

我们用函数pthread_create创建一个新线程:#include <pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);thread参数表示新线程的标识符;attr用于设置线程属性,如不需要设置,可设置为NULL;start_routine标识了线程启动程序的入口,arg为传入的参数。

调用pthread_create 就可以立即创建一个新的执行路线,与原有线程共享所有的主存空间,但拥有独立的堆栈。

2.2 信号量信号量通过一个计数器控制对共享资源的访问。

如果计数器大于0,则访问被允许,如果为0,则访问被禁止。

计数器计算的结果是允许访问共享资源的通行证。

因此,为了访问共享资源,线程必须从信号量得到通行证(P操作),如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。

操作系统--理发师问题

操作系统--理发师问题

设计思想的说明:打瞌睡的理发师问题是一种同步问题的抽象描述。

计算机系统中的每个进程都可以消费或生产某类资源,当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。

而当某个进程释放资源时,则它就相当一个生产者。

因此此题可看作是n个生产者和1个消费者问题。

顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。

并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得),所以可以通过一个有界缓冲区把理发师和顾客联系起来通过对信号进行P、V操作来实现有关问题和相关描述。

源程序文件:#include<windows.h>#include<stdio.h>#include<iostream>#include<process.h>#include<conio.h>#include<ctime>using namespace std;#define CHAIRS 3 //椅子的个数#define BARBERS 1 //理发师的个数#define CUSTOMESTOCOME 7 //将要来的顾客的数目typedef HANDLE semaphore;static int count=0; //记录理发店顾客的总数,初始化为0int leaved=0; //记录理发店顾客的总数,初始化为0int waiting=0;time_t endtime; //关闭营业的时间//coustomers初始化为0,最大顾客数为3semaphore customers=CreateSemaphore(NULL,0,CHAIRS,TEXT("customers")); //barbers的数量初始化为1,假设一共有1个barbersemaphorebarbers=CreateSemaphore(NULL,BARBERS,BARBERS,TEXT("barbers"));//建立互斥变量,用于保护共享资源HANDLE mutex=CreateMutex(NULL,FALSE,TEXT("mutex"));DWORD WINAPI barber(LPVOID lparameter);DWORD WINAPI customer(LPVOID lparameter);//理发师理发void cutHair();//顾客坐到椅子上等待void getChair();//等待顾客到来void wait();//顾客离开void customerLeave();//顾客进入void customerEnter();void up(HANDLE hHandle){//对指定信号量增加指定的值ReleaseSemaphore(hHandle,1,NULL);//恢复线程ResumeThread(hHandle);}void upMutex(HANDLE hMutex){//释放线程拥有的互斥体ReleaseMutex(hMutex);}void down(HANDLE hHandle){ //DOWN operation//线程挂起,等待信号WaitForSingleObject(hHandle,INFINITE);}int main(){//结束时间endtime=time(0)+20000;//创建理发师线程HANDLE barberThread=CreateThread(NULL,0,barber,NULL,0,NULL);HANDLE customerThread;//产生10个客户进程,每两个进程之间间隔一个随见时间1000~1050 while(count<CUSTOMESTOCOME){//创建客户进程customerThread=CreateThread(NULL,0,customer,NULL,0,NULL);srand(unsigned(time(0)));int time=rand()%1000+50;Sleep(time);}//释放资源CloseHandle(barberThread);CloseHandle(customerThread);CloseHandle(barbers);CloseHandle(customers);CloseHandle(mutex);cout<<"离开的顾客总数为:"<<leaved<<endl;return 0;}DWORD WINAPI barber(LPVOID lparameter) {while(time(0)<endtime){//没有客户,则进入睡眠状态down(customers);//临界区操作down(mutex);waiting=waiting-1;upMutex(mutex);//开始理发cutHair();//理发结束,理发师信号量加1up(barbers);}return 0;}DWORD WINAPI customer(LPVOID lparameter){ //客户到来customerEnter();//临界区操作down(mutex);cout<<"等̨¨待äy的Ì?顾?客¨ª数ºy: "<<waiting<<endl;cout<<"空?椅°?子Á¨®数ºy: "<<CHAIRS-waiting<<endl;if(waiting<CHAIRS){ //如果有空椅子,客户等待,否则离开if(waiting!=0){//等待顾客到来wait();}waiting=waiting+1;//客户信号量加1up(customers);upMutex(mutex);//离开临界区//理发师进程等待唤醒down(barbers);//顾客坐下来等待getChair();}else{//释放互斥锁upMutex(mutex);//顾客离开customerLeave();}return 0;}void cutHair(){static int served=0;served++;cout<<理发师帮第"<<served<<"位被服务的顾客理发"<<endl;Sleep(1000);cout<<"第"<<served<<"位被服务的顾客理完发"<<endl;}void getChair(){Sleep(1050);}void customerEnter(){count++;SYSTEMTIME sys;GetLocalTime( &sys );cout<<endl<<"第"<<count<<"位顾客进来"<<endl;}void wait(){cout<<"有空位,第"<<count<<"位顾客就坐"<<endl;}void customerLeave(){cout<<"没有空椅子,第"<<count<<"位顾客离开 ."<<endl;leaved++;}输出截图:PS:由于我对c++中处理进程、信号的函数不熟,所以有许多参考了网上的代码。

系统调用中的信号量PV操作 理发师问题

系统调用中的信号量PV操作 理发师问题

⏹理发师问题:一个理发店由一间等候室W和一间工作室B组成。

顾客可以从外面大街上进入W等候理发。

两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。

顾客在工作室内理完发,可由B 的旁门出去。

W中有N把椅子,顾客必须坐着等候。

理发师可由门上小窗查看W中无人就睡觉,否则开门,并叫一位顾客入内理发。

顾客每进入一位,都拉铃通知理发师。

若把顾客和理发师都视为进程,请用P、V操作写出进程的同步算法。

⏹要求打印:题目中要求描述理发师和顾客的行为,因此需要两类线程barber()和customer ()分别描述理发师和顾客的行为。

其中,理发师有活动有理发和睡觉两个事件;等待和理发二个事件。

店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个事件时,需判断有没有空闲的椅子,理发师决定要理发或睡觉时,也要判断椅子上有没有顾客。

所以,顾客和理发师之间的关系表现为:(1)理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉。

(2)理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。

(3)故引入3个信号量和一个控制变量:ⅰ控制变量waiting用来记录等候理发的顾客数,初值为0;ⅱ信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;ⅲ信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1;ⅳ信号量mutex用于互斥,初值为1using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace理发师问题2{internal class Program{// Fieldsprivate static Semaphore barbers = new Semaphore(1, 10);private static int chairs;private static int count = 0;private static Semaphore customers = new Semaphore(0, 10);private static int finish = 0;private static Semaphore mtx = new Semaphore(1, 10);private static int waiting = 0;// Methodspublic static void barber(){while (true){customers.WaitOne();mtx.WaitOne();waiting--;barbers.Release();mtx.Release();cuthair();finish++;}}public static void customer(){mtx.WaitOne();count++;Console.WriteLine("叮咚!第{0}个顾客来了", count);if (waiting < chairs){if (waiting > 0){Console.WriteLine("此时有{0}个人在等待理发", waiting);}else{Console.WriteLine("没有人在等待");}waiting++;Console.WriteLine("还有{0}个座位,顾客留下", (chairs - waiting) + 1);mtx.Release();customers.Release();barbers.WaitOne();gethaircut();}else{Console.WriteLine("座位已满,第{0}个顾客离开", count); mtx.Release();}}public static void cuthair(){Console.WriteLine("开始理发!这是理发师的第{0}个顾客.", finish + 1);Thread.Sleep(0x2328);Console.WriteLine("理发完成 !");}public static void gethaircut(){Thread.Sleep(0x238c);Console.WriteLine("第{0}个顾客理发完毕,离开.", finish);}private static void Main(string[] args){string str = string.Empty;Console.WriteLine("请输入椅子的总数目:");chairs = Convert.ToInt32(Console.ReadLine());Console.WriteLine("理发店共有{0}把椅子", chairs);Console.WriteLine("开门接待顾客吗?Y/N");for(string str2 = Console.ReadLine(); (str2 != "Y") && (str2 != "y"); str2 = Console.ReadLine()){Console.WriteLine("********对不起,尚未开门!********");Console.WriteLine("开门接待顾客吗?Y/N");}Console.WriteLine("********营业中,欢迎光临!********");new Thread(new ThreadStart(Program.barber)).Start();while ((str != "y") && (str != "Y")){Random random = new Random(lisecond);Thread.Sleep(random.Next(1, 0x2710));Console.WriteLine("*******************************");new Thread(new ThreadStart(Program.customer)).Start();if ((finish >= 10) && (waiting == 0)){Console.WriteLine("已经为{0}个顾客理发了,要关门下班吗?(Y/N)", finish);str = Console.ReadLine();}if ((str == "Y") || (str == "y")){Console.WriteLine("************暂停营业!**********");break;}}}}}题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。

操作系统课程设计__用多线程同步方法解决生产者

操作系统课程设计__用多线程同步方法解决生产者

操作系统课程设计__用多线程同步方法解决生产者第一篇:操作系统课程设计__用多线程同步方法解决生产者临界区管理实现本组组员:周琪皓,董泉伟,钟佳锋,张倬慎0 引言随着多处理机体系结构的演变和分布式与并行系统的发展,并发多任务的程序设计技术已愈来愈显得重要,多线程设计模式在这些技术的发展中起着重要作用。

在现代操作系统中,利用进(线)程间的并发性实现程序中并发成分的并行执行,可大大提高系统的处理能力和效率,但也可能带来诸如执行结果的不确定性等不良现象,因此并发系统中处理好进(线)程间的互斥与同步就显得至关重要。

C++语言中的多线程机制是解决线程间的互斥与同步问题的重要工具,其应用(如网络多媒体应用、工业自动化控制等)很广泛,很复杂且常易出错。

因此在应用程序设计过程中,要考虑多个线程如何同步使用进程的共享资源,如何让一个线程与另一个线程协调合作,以免产生线程间的访问冲突。

语言提供的多线程机制能有避免同一共享互斥资源被多个线程同时访问,维护数据的一致性、安全性。

生产者/消费者问题可作为并发进程的同步和互斥问题的一个抽象模型,广泛应用于通信和控制系统中。

本文基于C++语言中的多线程机制,实现操作系统中生产者/消费者问题,以助人们更好地透解同步概念及其实现方法。

1 课程设计目的通过模拟操作者生产者经典问题的实现,以及关于信号量和互斥锁对于多线程的运用,深入理解操作系统中多线程同步法的理论知识, 加深对教材中的重要算法的理解。

同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。

2 课程设计题目和要求 2.1 课程设计题目题目: 临界区管理实现.2.2课程设计目的与要求初始条件:1.操作系统:Windows2.程序设计语言:C++语言3.有界缓冲区内设有20个存储单元,其初值为0。

放入/取出的数据项按增序设定为1-20这20个整型数。

技术要求:1、生产者和消费者各有两个以上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

XXXXXXXXXXXXXXX课程设计题目用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)学院计算机科学与技术学院专业软件工程班级姓名指导教师2010 年 6 月28 日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)初始条件:1.操作系统:Linux2.程序设计语言:C语言3. 设有一个理发师,5把椅子(另外还有一把理发椅),几把椅子可用连续存储单元。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.技术要求:1)为每个理发师/顾客产生一个线程,设计正确的同步算法2)每个顾客进入理发室后,即时显示“Entered”及其线程自定义标识,还同时显示理发室共有几名顾客及其所坐的位置。

3)至少有10个顾客,每人理发至少3秒钟。

4)多个顾客须共享操作函数代码。

2.设计说明书内容要求:1)设计题目与要求2)总的设计思想及系统平台、语言、工具等。

3)数据结构与模块说明(功能与流程图)4)给出用户名、源程序名、目标程序名和源程序及其运行结果。

(要注明存储各个程序及其运行结果的主机IP地址和目录。

)5)运行结果与运行情况(提示: (1)连续存储区可用数组实现。

(2)编译命令可用:cc -lpthread -o 目标文件名源文件名(3)多线程编程方法参见附件。

)3. 调试报告:1) 调试记录2)自我评析和总结上机时间安排:18周一~ 五08:0 -12:00指导教师签名:年月日系主任(或责任教师)签名:年月日目录1设计题目与要求 ..................................................................................................................... 错误!未定义书签。

1.1 设计题目 .................................................................................................................... 错误!未定义书签。

1.2 设计要求 .................................................................................................................... 错误!未定义书签。

1.2.1 初始条件 ........................................................................................................ 错误!未定义书签。

1.2.2 技术要求 ........................................................................................................ 错误!未定义书签。

2 总体设计思想及开发环境与工具 ........................................................................................ 错误!未定义书签。

2.1 总体设计思想 ............................................................................................................ 错误!未定义书签。

2.2 多线程编程原理 ........................................................................................................ 错误!未定义书签。

2.2.1 创建一个线程 ................................................................................................ 错误!未定义书签。

2.2.2 等待一个线程结束 ........................................................................................ 错误!未定义书签。

2.2.3 信号量 ............................................................................................................ 错误!未定义书签。

2.3 伪码实现 .................................................................................................................... 错误!未定义书签。

2.4 开发环境与工具 ........................................................................................................ 错误!未定义书签。

3数据结构与模块说明 ............................................................................................................. 错误!未定义书签。

3.1 数据结构 .................................................................................................................... 错误!未定义书签。

3.2程序模块说明 ............................................................................................................. 错误!未定义书签。

.................................................................................................................................... 错误!未定义书签。

3.2.2 理发师模块 .................................................................................................... 错误!未定义书签。

3.2.3 顾客模块 ........................................................................................................ 错误!未定义书签。

4源程序 ..................................................................................................................................... 错误!未定义书签。

4.1用户名、源程序名和目标程序名 ............................................................................. 错误!未定义书签。

4.2源程序代码 ................................................................................................................. 错误!未定义书签。

5运行结果 ................................................................................................................................. 错误!未定义书签。

5.1运行步骤 ..................................................................................................................... 错误!未定义书签。

5.2运行结果 ..................................................................................................................... 错误!未定义书签。

5.2.1 编辑,编译和运行的过程图 .......................................................................... 错误!未定义书签。

5.2.2 错误部分截图 .................................................................................................. 错误!未定义书签。

5.2.3 正确运行结果图 .............................................................................................. 错误!未定义书签。

6调试记录 ................................................................................................................................. 错误!未定义书签。

相关文档
最新文档