为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
讨论题

浪潮君 的学生作业:

#include #include // ============================== // 结构体定义:单向链表节点结构 // ============================== typedef struct Node { int id; // 当前人的编号 struct Node* next; // 指向下一个人的指针 } Node; // ===================================================== // 函数:创建一个长度为 n 的单向循环链表(不带头结点) // 返回值:指向第一个节点(编号为 1)的指针 // ===================================================== Node* create_circle(int n) { Node *head = NULL, *prev = NULL; for (int i = 1; i id = i; // 设置编号 node->next = NULL; // 初始化 next if (!head) { head = node; // 第一个节点作为头指针 } else { prev->next = node; // 前一个节点指向当前节点 } prev = node; // 更新 prev 指针 } prev->next = head; // 构成循环链表(最后一个节点指向头节点) return head; } // ===================================================== // 函数:实现约瑟夫问题出列逻辑 // 参数: // n - 总人数 // k - 从第几个人开始数 // m - 每次报数到第几个人出列 // ===================================================== void josephus(int n, int k, int m) { Node* head = create_circle(n); // 创建循环链表 Node* prev = head; // 找到起始编号为 k 的节点:prev->next->id == k while (prev->next->id != k) { prev = prev->next; } Node* curr = prev->next; // curr 指向编号为 k 的节点 printf("出列顺序: "); while (n--) { // 从 curr 开始数 m-1 个,找到第 m 个出列者 for (int i = 1; i < m; i++) { prev = curr; curr = curr->next; } // 打印出列编号 printf("%d ", curr->id); // 删除 curr 节点(即出列的人) prev->next = curr->next; // 断开当前节点 free(curr); // 释放内存 curr = prev->next; // 继续从下一个人开始数 } printf("\n"); } // ================ // 程序主函数入口 // ================ int main() { int n = 8; // 总人数 int k = 3; // 从编号 3 开始数 int m = 4; // 数到第 4 个出列 josephus(n, k, m); // 执行约瑟夫出列过程 return 0; }

得分 100
学习任务

浪潮君 的学生作业:

#include // 标准输入输出 #include // exit、malloc 等函数 #include // 字符串处理 #include // close、read、write 等系统调用 #include // socket 地址结构与转换函数 #include // 文件控制(未用到可选) #include // socket 编程核心头文件 #define PORT 8080 // 服务器监听端口号 #define BUFFER_SIZE 4096 // 缓冲区大小 int main() { int server_fd, client_fd; struct sockaddr_in addr; // 服务器地址结构 socklen_t addrlen = sizeof(addr); char buffer[BUFFER_SIZE]; // 用于接收请求、读取文件的缓冲区 // 1. 创建 TCP socket,AF_INET: IPv4,SOCK_STREAM: 面向连接 server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { perror("socket 创建失败"); exit(1); } // 2. 设置地址端口复用(防止端口 TIME_WAIT 占用) int opt = 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 3. 设置服务器地址信息 memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; // IPv4 addr.sin_addr.s_addr = INADDR_ANY; // 本地任意地址 0.0.0.0 addr.sin_port = htons(PORT); // 端口转为网络字节序 // 4. 绑定 socket 到地址和端口 if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind 失败"); close(server_fd); exit(1); } // 5. 开始监听端口,最大连接队列长度为 10 if (listen(server_fd, 10) < 0) { perror("listen 失败"); close(server_fd); exit(1); } printf("服务器启动成功,监听端口 %d...\n", PORT); // 6. 主循环:不断接收客户端连接 while (1) { client_fd = accept(server_fd, (struct sockaddr*)&addr, &addrlen); if (client_fd < 0) { perror("accept 失败"); continue; } // 7. 接收客户端发送的 HTTP 请求 ssize_t len = recv(client_fd, buffer, BUFFER_SIZE - 1, 0); if (len 0) { send(client_fd, buffer, len, 0); // 按块发送文件内容 } // 11. 清理资源 fclose(fp); close(client_fd); } // 12. 关闭服务器 socket close(server_fd); return 0; }

得分 100
学习任务

浪潮君 的学生作业:

#include #include #include #include #include #include #include void print_pixel_format(__u32 pixelformat) { char fmt[5] = {0}; fmt[0] = pixelformat & 0xff; fmt[1] = (pixelformat >> 8) & 0xff; fmt[2] = (pixelformat >> 16) & 0xff; fmt[3] = (pixelformat >> 24) & 0xff; printf("像素格式: %s\n", fmt); } int main() { const char *device = "/dev/video0"; int fd = open(device, O_RDWR); if (fd < 0) { perror("打开摄像头失败"); return 1; } // 查询摄像头能力集 struct v4l2_capability cap; if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) { perror("查询摄像头能力失败"); close(fd); return 1; } printf("摄像头名称: %s\n", cap.card); printf("驱动名称: %s\n", cap.driver); printf("总线信息: %s\n", cap.bus_info); if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { printf("该设备不支持视频采集。\n"); close(fd); return 1; } // 查询支持的像素格式 printf("\n支持的像素格式与分辨率:\n"); struct v4l2_fmtdesc fmt; memset(&fmt, 0, sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while (ioctl(fd, VIDIOC_ENUM_FMT, &fmt) == 0) { print_pixel_format(fmt.pixelformat); printf("说明: %s\n", fmt.description); // 查询该像素格式下支持的分辨率 struct v4l2_frmsizeenum frmsize; memset(&frmsize, 0, sizeof(frmsize)); frmsize.pixel_format = fmt.pixelformat; while (ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) == 0) { if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE) { printf(" %ux%u\n", frmsize.discrete.width, frmsize.discrete.height); } frmsize.index++; } fmt.index++; printf("-------------------------\n"); } close(fd); return 0; }

得分 100
学习任务

浪潮君 的学生作业:

服务端 #include // 标准输入输出 #include // malloc、exit 等 #include // memset、strlen #include // close、read、write 等系统调用 #include // IP 地址转换函数 #include // 套接字编程相关结构和函数 #define SERVER_PORT 8890 // 服务器监听端口号 #define BACKLOG 5 // 最大连接等待队列长度 #define BUFFER_SIZE 1024 // 文件传输缓冲区大小 // 处理客户端发送的文件并将其保存到本地磁盘 void receive_file(int conn_fd) { int name_len; // 用于接收文件名的长度 char filename[256]; // 保存接收到的文件名 long filesize; // 文件大小(单位:字节) // 1. 接收文件名长度(int 类型,4 字节) recv(conn_fd, &name_len, sizeof(int), 0); // 2. 接收文件名(不含路径) recv(conn_fd, filename, name_len, 0); filename[name_len] = '\0'; // 添加字符串结束符 printf("接收文件名:%s\n", filename); // 3. 接收文件大小(long 类型,8 字节) recv(conn_fd, &filesize, sizeof(long), 0); printf("文件大小:%ld 字节\n", filesize); // 4. 打开目标文件,准备写入内容 FILE *fp = fopen(filename, "wb"); if (!fp) { perror("无法创建文件"); return; } // 5. 接收文件内容并写入文件 char buffer[BUFFER_SIZE]; long received = 0; while (received < filesize) { ssize_t len = recv(conn_fd, buffer, sizeof(buffer), 0); if (len 0) { send(sockfd, buffer, read_bytes, 0); // 每次发送一段 } fclose(fp); // 关闭文件 printf("文件发送完成。\n"); } int main() { // 创建客户端 socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket 创建失败"); return 1; } // 设置服务器地址结构体 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); // 清空结构体 server_addr.sin_family = AF_INET; // IPv4 server_addr.sin_port = htons(SERVER_PORT); // 设置端口 // 转换 IP 地址为网络格式 if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)

得分 100
学习任务

浪潮君 的学生作业:

服务端 #include // 标准输入输出 #include // malloc、exit 等 #include // memset、strlen #include // close、read、write 等系统调用 #include // IP 地址转换函数 #include // 套接字编程相关结构和函数 #define SERVER_PORT 8890 // 服务器监听端口号 #define BACKLOG 5 // 最大连接等待队列长度 #define BUFFER_SIZE 1024 // 文件传输缓冲区大小 // 处理客户端发送的文件并将其保存到本地磁盘 void receive_file(int conn_fd) { int name_len; // 用于接收文件名的长度 char filename[256]; // 保存接收到的文件名 long filesize; // 文件大小(单位:字节) // 1. 接收文件名长度(int 类型,4 字节) recv(conn_fd, &name_len, sizeof(int), 0); // 2. 接收文件名(不含路径) recv(conn_fd, filename, name_len, 0); filename[name_len] = '\0'; // 添加字符串结束符 printf("接收文件名:%s\n", filename); // 3. 接收文件大小(long 类型,8 字节) recv(conn_fd, &filesize, sizeof(long), 0); printf("文件大小:%ld 字节\n", filesize); // 4. 打开目标文件,准备写入内容 FILE *fp = fopen(filename, "wb"); if (!fp) { perror("无法创建文件"); return; } // 5. 接收文件内容并写入文件 char buffer[BUFFER_SIZE]; long received = 0; while (received < filesize) { ssize_t len = recv(conn_fd, buffer, sizeof(buffer), 0); if (len 0) { send(sockfd, buffer, read_bytes, 0); // 每次发送一段 } fclose(fp); // 关闭文件 printf("文件发送完成。\n"); } int main() { // 创建客户端 socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket 创建失败"); return 1; } // 设置服务器地址结构体 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); // 清空结构体 server_addr.sin_family = AF_INET; // IPv4 server_addr.sin_port = htons(SERVER_PORT); // 设置端口 // 转换 IP 地址为网络格式 if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)

得分 100
学习任务

浪潮君 的学生作业:

服务端 #include // 标准输入输出 #include // malloc、exit 等 #include // memset、strlen #include // close、read、write 等系统调用 #include // IP 地址转换函数 #include // 套接字编程相关结构和函数 #define SERVER_PORT 8890 // 服务器监听端口号 #define BACKLOG 5 // 最大连接等待队列长度 #define BUFFER_SIZE 1024 // 文件传输缓冲区大小 // 处理客户端发送的文件并将其保存到本地磁盘 void receive_file(int conn_fd) { int name_len; // 用于接收文件名的长度 char filename[256]; // 保存接收到的文件名 long filesize; // 文件大小(单位:字节) // 1. 接收文件名长度(int 类型,4 字节) recv(conn_fd, &name_len, sizeof(int), 0); // 2. 接收文件名(不含路径) recv(conn_fd, filename, name_len, 0); filename[name_len] = '\0'; // 添加字符串结束符 printf("接收文件名:%s\n", filename); // 3. 接收文件大小(long 类型,8 字节) recv(conn_fd, &filesize, sizeof(long), 0); printf("文件大小:%ld 字节\n", filesize); // 4. 打开目标文件,准备写入内容 FILE *fp = fopen(filename, "wb"); if (!fp) { perror("无法创建文件"); return; } // 5. 接收文件内容并写入文件 char buffer[BUFFER_SIZE]; long received = 0; while (received < filesize) { ssize_t len = recv(conn_fd, buffer, sizeof(buffer), 0); if (len 0) { send(sockfd, buffer, read_bytes, 0); // 每次发送一段 } fclose(fp); // 关闭文件 printf("文件发送完成。\n"); } int main() { // 创建客户端 socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket 创建失败"); return 1; } // 设置服务器地址结构体 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); // 清空结构体 server_addr.sin_family = AF_INET; // IPv4 server_addr.sin_port = htons(SERVER_PORT); // 设置端口 // 转换 IP 地址为网络格式 if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)

得分 100
学习任务

浪潮君 的学生作业:

服务端 #include // 标准输入输出 #include // malloc、exit 等 #include // memset、strlen #include // close、read、write 等系统调用 #include // IP 地址转换函数 #include // 套接字编程相关结构和函数 #define SERVER_PORT 8890 // 服务器监听端口号 #define BACKLOG 5 // 最大连接等待队列长度 #define BUFFER_SIZE 1024 // 文件传输缓冲区大小 // 处理客户端发送的文件并将其保存到本地磁盘 void receive_file(int conn_fd) { int name_len; // 用于接收文件名的长度 char filename[256]; // 保存接收到的文件名 long filesize; // 文件大小(单位:字节) // 1. 接收文件名长度(int 类型,4 字节) recv(conn_fd, &name_len, sizeof(int), 0); // 2. 接收文件名(不含路径) recv(conn_fd, filename, name_len, 0); filename[name_len] = '\0'; // 添加字符串结束符 printf("接收文件名:%s\n", filename); // 3. 接收文件大小(long 类型,8 字节) recv(conn_fd, &filesize, sizeof(long), 0); printf("文件大小:%ld 字节\n", filesize); // 4. 打开目标文件,准备写入内容 FILE *fp = fopen(filename, "wb"); if (!fp) { perror("无法创建文件"); return; } // 5. 接收文件内容并写入文件 char buffer[BUFFER_SIZE]; long received = 0; while (received < filesize) { ssize_t len = recv(conn_fd, buffer, sizeof(buffer), 0); if (len 0) { send(sockfd, buffer, read_bytes, 0); // 每次发送一段 } fclose(fp); // 关闭文件 printf("文件发送完成。\n"); } int main() { // 创建客户端 socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket 创建失败"); return 1; } // 设置服务器地址结构体 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); // 清空结构体 server_addr.sin_family = AF_INET; // IPv4 server_addr.sin_port = htons(SERVER_PORT); // 设置端口 // 转换 IP 地址为网络格式 if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)

得分 100
学习任务

浪潮君 的学生作业:

接收端 #include // 标准输入输出函数(如 printf、perror) #include // 包含 exit、malloc 等函数 #include // 包含 memset、strlen 等字符串处理函数 #include // 提供 close 等系统调用函数 #include // 提供 htons、inet_ntop 等 IP 转换函数 #include // 提供 socket 编程相关结构与函数 #define SERVER_PORT 8890 // 服务器监听端口 #define BACKLOG 5 // 最大排队连接数 #define BUFFER_SIZE 1024 // 每次读写的缓冲区大小 // 接收客户端发来的文件并保存到本地 void receive_file(int conn_fd) { int name_len; // 文件名长度(int 类型) char filename[256]; // 文件名缓冲区 long filesize; // 文件大小(long 类型) // 1. 读取文件名长度(占 4 字节) recv(conn_fd, &name_len, sizeof(int), 0); // 2. 读取文件名字符串(不含路径) recv(conn_fd, filename, name_len, 0); filename[name_len] = '\0'; // 添加字符串结束符 printf("接收文件名:%s\n", filename); // 3. 接收文件大小(占 8 字节) recv(conn_fd, &filesize, sizeof(long), 0); printf("文件大小:%ld 字节\n", filesize); // 4. 打开本地文件,准备写入内容 FILE *fp = fopen(filename, "wb"); if (!fp) { perror("无法创建文件"); return; } // 5. 循环接收文件内容 char buffer[BUFFER_SIZE]; long received = 0; while (received < filesize) { ssize_t len = recv(conn_fd, buffer, sizeof(buffer), 0); if (len 0) { send(sockfd, buffer, read_bytes, 0); // 分片发送 } fclose(fp); // 关闭文件 printf("文件发送完成。\n"); } int main() { // 创建客户端 socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket 创建失败"); return 1; } // 设置服务端地址信息 struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); // 清零 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); // 设置端口 // 转换 IP 地址为网络格式 if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号