未分类题

读下列算法说明和图4-5,回答问题1至问题3。
【算法说明】
某旅馆共有N间客房。每间客房的房间号、房间等级、床位数及占用状态分别存放在数组 ROOM、RANK、NBED和STATUS中。房间等级值为1、2或3。房间的状态值为0(空闲)或1(占用)。客房是以房间(不是床位)为单位出租的。
本算法根据几个散客的要求预订一间空房。程序的输入为:人数M,房间等级要求R(R=0表示任意等级都可以)。程序的输出为:所有可供选择的房间号。
图4-5描述了该算法。
假设当前该旅馆各个房间的情况如表4-3所示。

当输入M=4,R=0时,该算法的输出是什么?

A.shangxueba.cn/images/ct_crmsdsj_crmsdsshot1_00015(20096).jpg'

【参考答案】

101301。
101,301。
热门 试题

未分类题
请阅读以下说明和Socket程序,填入(n)处。网络应用的基本模型是客户机 服务器模型,这是一个不对称的编程模型,通信的双方扮演不同的角色:客户机和服务器。本题中的程序,客户机接收用户在键盘上输入的文字内容,服务器将客户机发送来的文字内容直接返回给客户机。此程序中,用户自定义函数有:int read_all( int fd, void*buf, int nbyte );函数read all从参数fd指定的套接字描述符中读取nbytes字节数据至缓冲区buf中,成功返回实际读的字节数(可能小于nbyte),失败返回-1。int write_all( int fd, void*buf, int nbyte );函数write_all向参数fd指定的套接字描述符中写入缓冲区buf前nbyte字节的数据,成功返回实际写的字节数(始终等于nbyte),失败返回-1。write_requ函数为客户机发送请求的函数;read_requ函数为服务器获取请求的函数服务器主程序部分:define SERVER_PORT 8080 服务器监听端口号为8080define BACKLOG 5 连接请求队列长度int main( int argc, char*argv[]) {int listenfd, connfd 监听套接字、连接套接字描述符struct sockaddr_in servaddr; 服务器监听地址listenfd=(1); 创建用于监听的套接字if (listenfd<0) {fPrintf( stderr,'创建套接字错误!');exit(1);} 套接字创建失败时打印错误信息bzero(&servaddr.sizeof(servadd)); 将地址结构置空servaddr.sin_family=AF_INET; 设置地址结构遵循TCP IP协议servaddr.sin_addrs_addr=htonl.(2); 设置监听的IP地址为任意合法地址,并将该地址转换为网络字节顺序servaddr.sin_port=(3); 设置监听的端口,并转化为网络字节顺序if ( bind(4)<0 ) {fprintf( stderr,'绑定套接字与地址!');exit(1);} 将监听地址与用于监听的套接字绑定,绑定失败时打印错误信息if ( listen( listedfd, BACKLOG)<0) {fprintf( stderr,'转换套接字为监听套接字!');exit(1);} 将用于监听的套接字由普通套接字转化为监听套接字for(;){connfd=(5); 从监听套接字的连接队列中接收已经完成的连接,并创建新的连接套接字if(connfd<0){fprintf(stderr,'接收连接失败!');exit(1);} 接收失败打印错误信息serv_respon(connfd); 运行服务器的处理函数(6); 关闭连接套接字 }close(listenfd); 关闭监听套接字 }服务器通信部分:include<stdio.h>…… 引用头文件部分略>void serv_respon( int sockfd) {int nbytes; char buf[1024];for(;;) {nbytes=read_requ(sockfd, buf, 1024); 读出客户机发出的请求,并分析其中的协议结构,获知请求的内容部分的长度,并将内容复制到缓冲区buf中,if ( nbytes=0) return; 如客户机结束发送就退出else if ( bytes<0 ) {fprintf( siderr,'读错误情息:%s n', sterror( errno ));return;} 读请求错误打印错误信息if ( write_all ( sockfd, buf, nbytes)<0) 将请求中的内容部分反向发送回客户机fprintf( siderr,'写错误信息:%s n', strerror( errno ) );}}int read_requ( int sockfd, char*buf int size ) {char inbuf[256];int n; int i;i=read_line( sockfd, inbuf, 256 ); 从套接字接收缓冲区中读出一行数据,该数据为客户请求的首部if(1<O)return(1);else if ( i=0 ) return(0);if ( strncmp( inbuf,'',6 )=0)sscanf( (7),'%d', &n ); 从缓冲区buf中读出长度信息else{sprintf( buf,' ',14 );return(14);} 取出首部Length域中的数值,该数值为内容部分的长度return( read_all( sockfd, buf, n ) ); 从接收缓冲区中读出请求的内容部分}int get_char(int fd, char*ch) {static int ffset=0;static int size=0;static char buff[1024]; 声明静态变量,在get_char多次被调用期间,该变量的内存不释放for ( ;size<=0 ||(8);) {size=read(fd,buf,1024); 一次从套接字缓冲区中读出一个数据块if ( size<0 ) {if ( errno=EINTR ) {size=0;confine; EINTR表示本次读操作没有成功,但可以继续使用该套接字读出数i}elsereturn(-1);}ffset=0; 读出数据后,将偏址置为0}*ch=buf[(9)]; 将当前的字符取出,并将偏址移向下一字符return(1);}int read_line(int fd, char*buf, int maxlen) {int i,n;char ch;for ( i=0; i<maxlen;) {n = get_char( fd, &ch ); 取出一个字符if ( n==1 ){buff[i++]=ch; 将字符加入字符串中if ( (10) break;}else if ( n< ) return(-1);else break;}buf[i]=' 0';return(i);} 函数read_line的作用