操作系统实验——磁盘调度算法

article/2025/10/29 3:33:49

文章目录

  • 前言
  • 一、实验目的
  • 二、实验内容和要求
  • 三、实验程序
  • 四、运行结果
    • 运行结果截图
  • 五、思考和分析
    • 程序实现(思路):
    • 分析几种算法:


前言

提示:本次实验在Linux(Ubuntu)中运行,程序中读取的文件需放在与c文件同一个文件夹中,或者自行在代码中修改路径。

一、实验目的

掌握几种基本的磁盘调度算法。

  1. 先来先服务法
  2. 最短寻道时间优先法
  3. 电梯法

二、实验内容和要求

  1. 采用模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯法三种磁盘调度算法,对一组请求访问磁道序列输出为每种调度算法的磁头移动轨迹和移动的总磁道数。
  2. 请求访问磁道序列的数据放在文件里,数据间以空格间隔。

三、实验程序

c语言代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>typedef int bool;
#define true 1
#define false 0int curTrack;    //当前磁道号
int trackNum;    //待调度磁道的数量
int *track;      //磁道号序列//快速排序
int position(int *a, int low, int high) {int key = a[low];while(low < high) {while(low < high && a[high] >= key) high--;a[low] = a[high];while(low < high && a[low] <= key) low++;a[high] = a[low];}a[low] = key;return low;
}
void quickSort(int *a, int low, int high) {if(low < high) {int pos = position(a, low, high);quickSort(a, low, pos - 1);quickSort(a, pos + 1, high);}
}//二分查找(只能查找有序序列)
int binaryFind(int *a, int flag, int target) {int left = 0;int right = flag - 1;while(left <= right) {int middle = (right + left) / 2;if(a[middle] < target) {left = middle + 1;} else if(a[middle] > target) {right = middle - 1;} else {return middle;}}return -1;  //查找失败
}void init(FILE *fp) {rewind(fp);		//fp回到开始位置//printf("请输入当前磁道号:");fscanf(fp, "%d", &curTrack);//printf("请输入待调度磁道的数量:");fscanf(fp, "%d", &trackNum);//printf("请输入磁道号序列:");track = (int*)malloc(trackNum  * sizeof(int));for(int i = 0; i < trackNum; i++) {fscanf(fp, "%d", &track[i]);}
}//判断数字是几位数,使得打印的轨迹好看
int digits(int num) {int result = 1;while(num / 10) {result++;num = num / 10;}return result;
}//打印磁头移动轨迹
void showTrack(int j, int cur, int *sortTrack) {for(int i = 0; i < digits(sortTrack[0]); i++) {printf(" ");}if(j < cur) {for(int i = 0; i < j; i++) {printf("    ");for(int k = 0; k < digits(sortTrack[i]); k++) {printf(" ");}}printf("\b<");for(int i = j; i < cur; i++) {printf("----");for(int k = 0; k < digits(sortTrack[i]); k++) {printf("-");}}}else {for(int i = 0; i < cur; i++) {printf("    ");for(int k = 0; k < digits(sortTrack[i]); k++) {printf(" ");}}printf("\b");for(int i = cur; i < j; i++) {printf("----");for(int k = 0; k < digits(sortTrack[i]); k++) {printf("-");}}printf("\b>");}printf("\n");
}//先来先服务算法(FCFS)
void FCFS() {printf("先来先服务算法(FCFS)\n");//对磁盘序列track进行排序int *sortTrack = (int*)malloc((trackNum + 1) * sizeof(int));for(int i = 0; i < trackNum; i++) {sortTrack[i] = track[i];}sortTrack[trackNum] = curTrack;quickSort(sortTrack, 0, trackNum);int curIndex = binaryFind(sortTrack, trackNum + 1, curTrack);printf("  磁盘序列:   丨");for(int i = 0; i < trackNum + 1; i++) {if(i == curIndex)printf("\033[1;32m%d    ", sortTrack[i]);    //给当前磁盘号的输出添加眼颜色//printf("%d    ", sortTrack[i]);elseprintf("\033[0m%d    ", sortTrack[i]);//printf("%d    ", sortTrack[i]);}printf("\n");printf("磁头移动轨迹: 丨");int temp = 0;int cur = curIndex;while(temp < trackNum) {if(temp != 0) {printf("              丨");}int j = binaryFind(sortTrack, trackNum + 1, track[temp]);showTrack(j, cur, sortTrack);cur = j;temp++;}printf("\n");int sum = 0;        //记录磁盘移动的磁道数double average = 0;    //平均寻找长度printf("依次访问的磁盘序列为:");for(int i = 0; i < trackNum; i++) {printf("%d  ", track[i]);sum += abs(curTrack - track[i]);curTrack = track[i];}printf("\n");printf("磁头移动的总磁道数为:%d\n", sum);average = (double)sum / trackNum;printf("平均寻找长度为:%f\n", average);free(sortTrack);
}//在当前磁道的左右两个方向中寻找距离最近的磁道,返回对应下标
int nearFind(int **markTrack, int curIndex) {//拷贝一份markTrackint **markTrack2 = (int**)malloc(2 * sizeof(int*));for(int i = 0; i < 2; i++) {markTrack2[i] = (int*)malloc((trackNum + 1) * sizeof(int));}for(int i = 0; i <= trackNum; i++) {markTrack2[0][i] = markTrack[0][i];markTrack2[1][i] = markTrack[1][i];}int leftIndex = -1;int rightIndex = trackNum + 1;int left = 0;   //在左边找第一个没访问过的磁道的距离int right = 0;  //在右边找第一个没访问过的磁道的距离for(int i = curIndex - 1; i >= 0; i--) {left += markTrack2[0][curIndex] - markTrack2[0][i];if(markTrack2[1][i] == 0) {leftIndex = i;markTrack2[1][i] = 1;    //修改访问位break;}}for(int i = curIndex + 1; i <= trackNum; i++) {right += markTrack2[0][i] - markTrack2[0][curIndex];if(markTrack2[1][i] == 0) {rightIndex = i;markTrack2[1][i] = 1;break;}}//printf("leftIndex = %d, rightIndex = %d\n", leftIndex, rightIndex);if(rightIndex == trackNum + 1) {markTrack[1][leftIndex] = 1;return leftIndex;}else if(leftIndex == -1) {markTrack[1][rightIndex] = 1;return rightIndex;}else {if(left <= right) {markTrack[1][leftIndex] = 1;return leftIndex;}else {markTrack[1][rightIndex] = 1;return rightIndex;}}free(markTrack2);
}//最短寻道时间优先法(SSTF)
void SSTF() {printf("最短寻道时间优先法(SSTF)\n");int sum = 0;        //记录磁盘移动的磁道数double average = 0;    //平均寻找长度int *temp = (int*)malloc(trackNum * sizeof(int));track[trackNum] = curTrack;quickSort(track, 0, trackNum);  //对磁盘track序列排序//建立二维数组,大小为 2 * trackNum,第一行元素存放排序后的sortTrack,第二行设置标记位,访问过的置为1,未访问过的置为0int **markTrack = (int**)malloc(2 * sizeof(int*));for(int i = 0; i < 2; i++) {markTrack[i] = (int*)malloc((trackNum + 1) * sizeof(int));}for(int i = 0; i <= trackNum; i++) {markTrack[0][i] = track[i];markTrack[1][i] = 0;}int curIndex = binaryFind(track, trackNum + 1, curTrack);markTrack[1][curIndex] = 1; //当前磁盘号被访问过printf("  磁盘序列:   丨");for(int i = 0; i < trackNum + 1; i++) {if(i == curIndex)printf("\033[1;32m%d    ", track[i]);    //给当前磁盘号的输出添加眼颜色//printf("%d    ", track[i]);elseprintf("\033[0m%d    ", track[i]);//printf("%d    ", track[i]);}printf("\n");printf("磁头移动轨迹: 丨");int cur = curIndex;for(int i = 0; i < trackNum; i++) {if(i != 0) {printf("              丨");}int j = nearFind(markTrack, cur);showTrack(j, cur, track);sum += abs(track[j] - track[cur]);cur = j;temp[i] = track[cur];}printf("依次访问的磁盘序列为:");for(int i = 0; i < trackNum; i++) {printf("%d  ", temp[i]);}printf("\n");printf("磁头移动的总磁道数为:%d\n", sum);average = (double)sum / trackNum;printf("平均寻找长度为:%f\n", average);free(temp);free(markTrack);
}//电梯算法(LOOK)
void LOOK() {printf("电梯算法(LOOK)\n");int sum = 0;        //记录磁盘移动的磁道数double average = 0;    //平均寻找长度track[trackNum] = curTrack;quickSort(track, 0, trackNum);  //对磁盘track序列排序//若此时磁头正在往磁道号增大的方向移动printf(" === ①  若初始时磁头正在往磁道号增大的方向移动\n");int curIndex = binaryFind(track, trackNum + 1, curTrack);int cur = curIndex;printf("  磁盘序列:   丨");for(int i = 0; i < trackNum + 1; i++) {if(i == curIndex)printf("\033[1;32m%d    ", track[i]);    //给当前磁盘号的输出添加眼颜色//printf("%d    ", track[i]);elseprintf("\033[0m%d    ", track[i]);//printf("%d    ", track[i]);}printf("\n");printf("磁头移动轨迹: 丨");for(int i = curIndex + 1; i <= trackNum; i++) {if(i != curIndex + 1)printf("              丨");showTrack(i, cur, track);sum += abs(track[i] - track[cur]);cur = i;}for(int i = curIndex - 1; i >= 0; i--) {printf("              丨");showTrack(i, cur, track);sum += abs(track[i] - track[cur]);cur = i;}printf("依次访问的磁盘序列为:");for(int i = curIndex + 1; i <= trackNum; i++) {printf("%d  ", track[i]);}for(int i = curIndex - 1; i >= 0; i--) {printf("%d  ", track[i]);}printf("\n磁头移动的总磁道数为:%d\n", sum);average = (double)sum / trackNum;printf("平均寻找长度为:%f\n", average);printf("\n\n");//若此时磁头正在往磁道号减小的方向移动printf(" === ②  若初始时磁头正在往磁道号减小的方向移动\n");sum = 0;average = 0.0;curIndex = binaryFind(track, trackNum + 1, curTrack);cur = curIndex;printf("  磁盘序列:   丨");for(int i = 0; i < trackNum + 1; i++) {if(i == curIndex)printf("\033[1;32m%d    ", track[i]);    //给当前磁盘号的输出添加眼颜色//printf("%d    ", track[i]);elseprintf("\033[0m%d    ", track[i]);//printf("%d    ", track[i]);}printf("\n");printf("磁头移动轨迹: 丨");for(int i = curIndex - 1; i >= 0; i--) {if(i != curIndex - 1)printf("              丨");showTrack(i, cur, track);sum += abs(track[i] - track[cur]);cur = i;}for(int i = curIndex + 1; i <= trackNum; i++) {printf("              丨");showTrack(i, cur, track);sum += abs(track[i] - track[cur]);cur = i;}printf("依次访问的磁盘序列为:");for(int i = curIndex - 1; i >= 0; i--) {printf("%d  ", track[i]);}for(int i = curIndex + 1; i <= trackNum; i++) {printf("%d  ", track[i]);}printf("\n磁头移动的总磁道数为:%d\n", sum);average = (double)sum / trackNum;printf("平均寻找长度为:%f\n", average);
}int main(int argc, char* argv[])
{FILE *fp = fopen(argv[1], "r");if(fp == NULL) {printf("读取文件失败!\n");return 0;}init(fp); //初始化printf("当前磁道号(curTrack):%d\n", curTrack);printf("要访问的磁盘个数(trackNum):%d\n", trackNum);printf("磁道号序列(track):{ ");for(int i = 0; i < trackNum; i++) {printf("%d ", track[i]);}printf("}\n\n");FCFS();printf("\n\n");init(fp); //初始化SSTF();printf("\n\n");init(fp); //初始化LOOK();free(track);fclose(fp);return 0;
}

``

四、运行结果

运行结果截图

提示:此文件需与源文件放同一文件夹
在这里插入图片描述
带颜色的磁盘序列号表示初始磁道号
在这里插入图片描述
在这里插入图片描述

五、思考和分析

程序实现(思路):

本次实验对磁盘号序列进行排序时我用了快排,查找指定序列的下标采用了折半查找。
执行三个算法之前分别先进行初始化操作。

1)先来先服务算法(FCFS)
轨迹的打印:先将磁盘序列数组track拷贝一份到新建的数组sortTrack中,将初始磁盘号放入其中,然后对sortTrack进行排序,找到初始磁道号在排序后track中的下标curIndex,然后依次访问track中的元素,找到他们在sortTrack中的下标,用cur记录当前磁头所在磁盘号的下标,根据这两个下标绘制出相应的轨迹,然后更新cur,重复执行,将所有轨迹绘制完毕。
因为先来的磁盘先访问,因此磁头依次访问的磁盘序列就是一开始的磁盘序列数组中的元素。
其余计算:用sum记录磁头移动的磁道数,遍历一遍track数组,将当前磁盘号与访问的磁盘号距离之差的绝对值加到sum中,然后更新当前磁盘号,遍历完后sum的值就是磁头移动的总磁道数,磁头平均查找长度average = sum / 磁道数量。

2)最短寻道时间优先法(SSTF)
轨迹的打印:直接将初始磁盘号curTrack放入磁盘序列数组track中并排序,找到初始磁道号在排序后track中的下标curIndex,然后建立一个带标记的磁道序列二维数组markTrack,第一行元素存放排序后的sortTrack,第二行设置标记位,访问过的置为1,未访问过的置为0,然后在当前磁道的左右两个方向中寻找距离最近的磁道,得到其下标,用cur记录当前磁头所在磁盘号的下标,根据这两个下标绘制出相应的轨迹,然后更新cur,重复执行,将所有轨迹绘制完毕。
建立一个临时数组temp,存放磁头依次访问的磁道号,在打印轨迹的时候将对应的磁道号插入到该数组中,最后打印这个数组的元素,就是磁头依次访问的磁道号。
其余计算:用sum记录磁头移动的磁道数,在打印轨迹的时候将移动的距离加到sum中,最终sum值就是磁头移动的总磁道数,磁头平均查找长度average = sum / 磁道数量。

3)电梯算法(LOOK)
因为初始状态磁头可能正在向磁道号增大的方向移动,也有可能正在向磁道号减小的方向移动,我将两种情况都做了相应的处理,这里的思路以向磁道号增大的方向移动为例。
轨迹的打印:将初始磁盘号curTrack放入磁盘序列数组track中并排序,找到初始磁道号在排序后track中的下标curIndex,用cur记录curIndex,然后从curIndex + 1开始遍历,根据当前遍历到的下标和cur下标绘制出相应的轨迹,更新cur为遍历到的下标,遍历完后,向磁道号增大方向的轨迹打印完毕,然后再从curIndex – 1开始从后往前遍历,根据当前遍历到的下标和cur下标绘制出相应的轨迹,更新cur为遍历到的下标,遍历完后,向磁道号减小方向的轨迹也打印完毕,即所有轨迹绘制完毕。
从curIndex + 1遍历到最后,在从curIndex – 1遍历到最前,遍历的磁道号就是磁头依次访问的磁道号。
若初始时以磁道号减小的方向移动,就反过来,先从curIndex – 1遍历到最前,再从curIndex + 1遍历到最后即可。
其余计算:用sum记录磁头移动的磁道数,在打印轨迹的时候将移动的距离加到sum中,最终sum值就是磁头移动的总磁道数,磁头平均查找长度average = sum / 磁道数量。

分析几种算法:

1)先来先服务算法(FCFS):
优点:公平;如果请求访问的磁道比较集中的话,算法性能还算过的去
缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。

2)最短寻道时间优先法(SSTF):
优点:性能较好,平均寻道时间短
缺点:可能产生“饥饿”现象,在附录给的测试文件中,假设在处理18号磁道的访问请求时又来了一个38号磁道的访问请求,处理38号磁道的访问请求时又来了一个18号磁道的访问请求。如果有源源不断的18号、38号磁道的访问请求到来的话,150、160、184号磁道的访问请求就永远得不到满足,从而产生“饥饿”现象。

3)电梯算法(LOOK):
LOOK算法可以说是扫描算法(SCAN)的优化版,扫描算法中,只有磁头到达最边上的磁道时才能改变磁头移动方向,在测试例子中,184号磁道后还存在一些磁道,只是我们不需要访问,若使用扫描算法,磁头还需要访问这些额外的磁道,事实上处理了184号磁道的访问请求之后就不需要再往右移动磁头了,而LOOK算法就是为了解决这个问题,如果在移动方向上已经没有别的请求了,就可以立即改变磁头移动的方向。
优点:性能较好,平均寻道时间较短,不会产生饥饿现象。
缺点:对于各个位置磁道的响应频率不平均(如:假设此时磁头正在往右移动,且刚处理过90号磁道,那么下次处理90号磁道的请求就需要等磁头移动很长一段距离;而响应了184号磁道的请求之后,很快又可以再次响应184号磁道的请求了)。

建立以下的测试文件:
//disk_data
100
9
55 58 39 18 90 160 150 38 184

测试文件的第一行代表当前磁道号;
第二行代表待调度磁道的数量;
第三行是磁道号序列。
测试命令:./Experiment5 ./disk_data,即可利用命令行将disk_data作为参数调用。


http://chatgpt.dhexx.cn/article/l5vuUfcQ.shtml

相关文章

北航操作系统实验入门

有北航操作系统实验平台账号的部分读者反映不会操作。为了让读者尽快了解实验平台的操作&#xff0c;下面介绍lab0的实验步骤&#xff0c;希望读者能尽快掌握实验平台的使用方法。 1. 用学生账号登录 2. 点击【操作系统实验】进入实验界面 3. lab0实验环境介绍&#xff0c;仔细…

操作系统实验三进程间通信

文末也可直接获取实验文档 实验三 进程间通信 目录 1实验目的2 实验内容3实验详细操作步骤及程序清单&#xff1a;4相关问题及思考5总结6背景知识 1实验目的 1、了解linux系统中进程通信的基本原理。 2、分析进程竞争资源现象&#xff0c;学习解决进程互斥的方法。 2 实验内…

操作系统实验——进程控制

操作系统实验——进程控制 预习内容&#xff1a; 1.进程的概念 ⑴程序的并发执行 ⑵进程的定义 2.进程的描述 ⑴进程控制块 ⑵进程上下文 ⑶进程上下文切换 ⑷进程空间与大小 3. 进程状态及其转换 ⑴进程状态 ⑵进程状态转换 4.进程控制 ⑴进程创建与撤销 ⑵进程的阻塞与唤醒…

操作系统实验一

操作系统实验一 进程调度算法 一、实验目的 1.理解操作系统进程管理中进行进程调度的过程和调度算法的思想原理&#xff1b; 创建进程控制块PCB&#xff0c;并合理组织就绪队列。 2.理解进程的状态及变化&#xff0c;动态显示每个进程的当前状态及进程的调度情况。 掌握几…

操作系统实验一·创建进程

创建进程 1实验目的2实验内容&#xff1a;2.1Windows实现2.2Linux实现 3实验环境3.1Windows3.2Linux虚拟机 4程序设计和实现4.1Windows实现4.1.1函数解释4.1.2程序代码4.1.3运行结果 4.2Linux实现4.2.1函数解释4.2.2程序代码4.2.3运行结果 Use system calls to implement a “m…

操作系统实验

实验一 命令解释程序 实验内容 利用C语言编写一个微型命令解释程序minishell.c&#xff0c;该程序可接收并解释以下命令&#xff1a; (1) dir 列出当前目录 (2) cop file1 file2 拷贝文件 (3) era filename 删除文件 (4) disp string 显示字符串 (5) end 结束&#xff0c;退出…

操作系统实验报告

操作系统 一、实验一 通过 VMware 虚拟机软件安装 Linux二、实验目的三、实验内容&#xff08;实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码&#xff09;四、实验结果与分析五、小结与心得体会 一、实验二 Windows 进程管理二、实验目的三、实验内容&…

操作系统实验——银行家算法

文章目录 一、实验目的二、实验内容和要求三、实验原理算法实现 四、实验程序代码如下&#xff1a; 五、验证数据和运行结果运行结果截图 六、思考与分析附 一、实验目的 掌握银行家算法思想&#xff0c;并能编程实现。 二、实验内容和要求 1、在Linux环境下编译运行程序&am…

操作系统实验(进程调度)

操作系统实验&#xff08;进程调度&#xff09; 一、实验目的二、实验内容三、实验准备3.1优先权算法3.2时间片轮转调度算法 四、实验 一、实验目的 1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。 二、实验内容 2.1…

【MFC】CCriticalSection类在Release编译下调用Lock函数会报0xC0000008错误

【MFC】CCriticalSection类在Release编译下调用Lock函数会报错0xC0000008 问题描述方法一 CRITICAL_SECTION代替CCriticalSection方法二 使用WaitForSingleObject和ReleaseMutex()结语 问题描述 通过以下伪代码方式描述问题&#xff1a; 主对话框类内创建成员变量及结构体变量…

联合使用类CCriticalSection和类CSingleLock同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest2&#xff0c;并在向导的“应用程序设置”中勾选“MFC”。 &#xff08;2&#xff09;打开SellTicketTest2.cpp&#xff0c;在开头中引入头文件。 #include "afxmt.h"&#xff08;3&#xff09;添加变量&…

单独使用CCriticalSection对象来同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest&#xff0c;并在向导的“应用程序设置”中勾选“MFC”&#xff0c;因为CCriticalSection属于MFC类&#xff0c;如图所示。 &#xff08;2&#xff09;在SellTicketTest.cpp开头中引入头文件。 #include "afx…

linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

qq_407283393122018-12-10 一个很蠢的造成死锁的问题 wanglt3113172018-12-12 什么是死锁&#xff0c;死锁的原因&#xff0c;如何避免 apanying902019-01-09 c3p0连接死锁 Cain_1507662016-09-20 notify产生死锁的场景(备忘) liuchuanyangyan9132017-02-23 C3P0配置错误导致的…

MFC线程同步—— CCriticalSection类使用

多个线程访问临界区时&#xff0c;可以使用临界区对象。临界区对象是一个独占性共享资源&#xff0c;任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段&#xff0c;其他希望进入临界区的线程将被挂起等待&#xff0c;直到拥有临界区的线…

CCriticalSection与CSingleLock

CCriticalSection An object of class CCriticalSection represents a “critical section” — a synchronization object that allows one thread at a time to access a resource or section of code. Critical sections are useful when only one thread at a time can be …

关键部分CCriticalSection使用

类CCriticalSection的对象表示一个“临界区”&#xff0c;它是一个用于同步的对象&#xff0c;同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如&#xff0c;在链表中添加一个结点就仅仅同意一次一个线程进行…

模拟售票大厅实例——多线程时访问共享变量时的安全(CMutex或CCriticalSection的应用)

当程序运行时&#xff0c;可以通过多线程来提高程序运行的效率和拥有更好的体验。但多线程&#xff08;或多进程&#xff09;同时也带来很多的问题&#xff1a;最严重的莫过于对同一个对象或变量访问时&#xff0c;由于线程运行异步的原因&#xff0c;会造成程序运行出现无法控…

在MFC下面实际演示CCriticalSection 的使用

Q&#xff1a;CCriticalSection是什么&#xff1f; A&#xff1a;CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思。。。。 参考资料&#xff1a; http://blog.csdn.net/akof1314/article/details/5773076 http://www.cnblogs.com/hlxs/archi…

Android对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)

个人推荐: &#x1f4e2;&#x1f4e2;&#x1f4e2; 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。点击跳转到教程。 一:AlterDialog对话框 二:普通对话框 运行效果…

Android对话框显示输入框

在弹出的对话框显示输入框有两种方法&#xff1a; 法一&#xff1a;新建一个布局&#xff0c;并在对话框中引用它。 法二&#xff1a;直接在Activity中定义Edit并在对话框中用getText方法得到输入信息。