您的位置:首页 > 科技 > IT业 > 怎么做电子商务营销_怎样设计网站或网页_互联网营销师证书有用吗_搜索引擎最新排名

怎么做电子商务营销_怎样设计网站或网页_互联网营销师证书有用吗_搜索引擎最新排名

2025/5/23 9:46:38 来源:https://blog.csdn.net/weixin_74776798/article/details/147564346  浏览:    关键词:怎么做电子商务营销_怎样设计网站或网页_互联网营销师证书有用吗_搜索引擎最新排名
怎么做电子商务营销_怎样设计网站或网页_互联网营销师证书有用吗_搜索引擎最新排名

任务:获得了一个二进制数据文件,它代表了卫星影像的一个波段,具体来说是测量地表温度的热红外数据。数据以16位有符号整数 (short) 的网格形式存储。任务是分析局部的温度变化。

编写一个C程序,完成以下任务:

  1. 读取图像维度: 从名为 thermal_image.bin 的二进制文件的开头读取宽度和高度(均为 int 类型)。

  2. 读取图像数据: 读取随后的像素数据(short 类型的网格,逐行存储)到内存中。

  3. 定义二元函数: 实现一个函数 f(n, m),表示两个相邻像素之间的绝对温差:f(pixel_A, pixel_B) = abs(pixel_A - pixel_B)。

  4. 计算局部差异: 计算图像中所有水平相邻像素对的 f(pixel[r][c], pixel[r][c+1])(即,计算每个像素与其右侧邻居的差值)。

  5. 查找极值: 基于上述水平方向的比较,确定整个图像中找到的最大和最小绝对温差。

  6. 输出结果: 将计算出的最大和最小绝对差异打印到控制台。

输入文件格式 (thermal_image.bin):

  • 字节 0-3: width (int) - 图像宽度

  • 字节 4-7: height (int) - 图像高度

  • 字节 8 开始: width * height 个像素值 (short) - 逐行存储

代码:包括缔造可以使用的数据以及对此数据进行分析

//## 22年:计算能力测试,读取二进制文件,进行二元函数运算。
//- 比如:f(n,m), 然后求某个区域的最大值,最小值//假设您获得了一个二进制数据文件,它代表了卫星影像的一个波段,具体来说是测量地表温度的热红外数据。
//数据以16位有符号整数 (short) 的网格形式存储。您的任务是分析局部的温度变化。/* 自己分析问题:
1.我需要的变量:文件指针,用于遍历的两个变量,用于存储最大最小值的两个变量。
2.Main函数流程:读取文件,遍历文件内的数据(根据16位的特性读取),调用遍历的变量以及存储最大最小值的变量,不断更新
3.最后输出两个变量即可*/#include <stdio.h>
#include <stdlib.h> // 为了 abs(), malloc(), free(), EXIT_FAILURE, EXIT_SUCCESS
#include <limits.h> // 为了 INT_MAX// 定义输入文件名。全局变量,放在所有函数之前。
const char *FILENAME = "thermal_image.bin";// 辅助函数:创建一个用于测试的示例二进制文件。可以不看,直接看主函数
void create_sample_thermal_file() {const char *filename = FILENAME; // 使用之前定义的宏FILE *fp = fopen(filename, "wb"); // 以二进制写入模式打开if (!fp) {perror("创建示例文件时出错");return;}// --- 定义新的图像尺寸和数据 ---int width = 5;int height = 4;short data[] = {// Row 0250, 252, 255, 254, 250,// Row 1248, 250, 253, 253, 249, // 注意这里相邻有相同值,差值为0// Row 2260, 265, 270, 268, 265, // 温差较大区域// Row 3258, 262, 266, 265, 260};// --- 结束定义 ---long num_pixels = (long)width * height;// 确保数据数组的大小正确if (sizeof(data) / sizeof(short) != num_pixels) {fprintf(stderr, "错误:提供的示例数据大小 (%zu) 与维度 (%dx%d=%ld) 不匹配。\n",sizeof(data) / sizeof(short), width, height, num_pixels);fclose(fp);// 删除可能不完整的文件remove(filename);return;}// 写入维度 (width, height)printf("正在写入维度: Width=%d, Height=%d\n", width, height);if (fwrite(&width, sizeof(int), 1, fp) != 1) {perror("写入宽度时出错");fclose(fp); remove(filename); return;}if (fwrite(&height, sizeof(int), 1, fp) != 1) {perror("写入高度时出错");fclose(fp); remove(filename); return;}// 写入像素数据printf("正在写入 %ld 个像素值 (short类型)...\n", num_pixels);size_t written = fwrite(data, sizeof(short), num_pixels, fp);if (written != num_pixels) {fprintf(stderr, "写入像素数据时出错。预期写入 %ld,实际写入 %zu\n", num_pixels, written);perror("fwrite error");fclose(fp); remove(filename); return;}fclose(fp);printf("示例文件 '%s' 已成功创建。\n", filename);printf("预期分析结果: 最大水平差异=5, 最小水平差异=0\n"); // 基于上面的数据计算
}int main() {// --- 可选: 创建一个用于测试的示例文件 ---// create_sample_thermal_file();// printf("-------------------------------------------\n");// --- 结束可选部分 ---create_sample_thermal_file(); // <--- 确保这一行没有被注释掉FILE *fp = NULL;int width = 0;int height = 0;short *pixels = NULL; // 指向像素数据的指针long num_pixels = 0;  // 使用 long 以防图像过大size_t elements_read; // fread 返回值类型// 1. 打开二进制文件进行读取fp = fopen(FILENAME, "rb"); // "rb" 表示 Read Binary (二进制读取)if (!fp) {perror("打开文件时出错"); // perror 会打印错误信息,如 "No such file or directory"fprintf(stderr, "请确保 '%s' 文件存在于当前目录中。\n", FILENAME);fprintf(stderr, "您可能需要先取消注释 'create_sample_thermal_file();' 来生成它。\n");return EXIT_FAILURE; // 返回非零值表示错误}printf("成功打开文件 '%s'\n", FILENAME);// 2. 读取维度 (宽度和高度)elements_read = fread(&width, sizeof(int), 1, fp);if (elements_read != 1) {fprintf(stderr, "读取宽度时出错。\n");fclose(fp);return EXIT_FAILURE;}elements_read = fread(&height, sizeof(int), 1, fp);if (elements_read != 1) {fprintf(stderr, "读取高度时出错。\n");fclose(fp);return EXIT_FAILURE;}// 检查读取的维度是否有效if (width <= 0 || height <= 0) {fprintf(stderr, "错误:读取到无效的维度 (宽度=%d, 高度=%d)。\n", width, height);fclose(fp);return EXIT_FAILURE;}printf("图像维度: 宽度 = %d, 高度 = %d\n", width, height);// 3. 为像素数据分配内存// 注意类型转换,确保乘法不会溢出 int (虽然这里 short * short 通常没问题,但好习惯)num_pixels = (long)width * height;pixels = (short *)malloc(num_pixels * sizeof(short));if (!pixels) {fprintf(stderr, "为 %ld 个像素分配内存时出错。\n", num_pixels);fclose(fp);return EXIT_FAILURE;}printf("已为 %ld 个像素分配内存。\n", num_pixels);// 4. 读取像素数据elements_read = fread(pixels, sizeof(short), num_pixels, fp);// 检查是否读取了预期数量的元素if (elements_read != num_pixels) {fprintf(stderr, "读取像素数据时出错。预期读取 %ld 个元素,实际读取 %zu 个。\n",num_pixels, elements_read);free(pixels); // 释放已分配的内存fclose(fp);return EXIT_FAILURE;}printf("成功读取像素数据。\n");// 关闭文件,因为所有数据都已读入内存fclose(fp);// 5. 计算差异并找到最小值/最大值// 初始化 min_diff 为一个非常大的值,max_diff 为一个非常小的值 (或0,因为绝对差非负)int min_diff = INT_MAX; // 来自 limits.hint max_diff = 0;      // 绝对差异不能是负数int diff_count = 0;    // 计数计算了多少个差异值// 检查是否有水平相邻像素对可以比较 (宽度至少为2)if (width < 2) {printf("图像宽度小于2,无法计算水平差异。\n");// 根据需要处理此情况 - 也许输出 N/A 或 0/0?min_diff = 0; // 或标记为未计算max_diff = 0; // 或标记为未计算} else {// 遍历像素网格for (int r = 0; r < height; ++r) {for (int c = 0; c < width - 1; ++c) { // 列循环到倒数第二个元素// 计算在一维数组中的索引long current_idx = (long)r * width + c; // 当前像素索引long neighbor_idx = current_idx + 1;   // 右侧邻居索引// 获取像素值short pixel_A = pixels[current_idx];short pixel_B = pixels[neighbor_idx];// 计算绝对差值 f(n, m) = abs(n - m)// 使用 stdlib.h 中的 abs() 函数 (适用于 int)// 确保结果适合 'int' 类型 (short 的差通常可以)int diff = abs(pixel_A - pixel_B);diff_count++;// 更新最小和最大差值if (diff < min_diff) {min_diff = diff;}if (diff > max_diff) {max_diff = diff;}}}// 如果计算了差异,打印计数if (diff_count > 0) {printf("计算了 %d 个水平差异值。\n", diff_count);} else if (width >= 2) {// 理论上如果 width >= 2 且 height >= 1,这不应发生// 但考虑像 height=0 (已检查) 或 width=1 (已检查) 的边缘情况printf("警告:尽管宽度 >= 2,但没有计算差异值。\n");min_diff = 0; // 如果没有计算发生,设置默认值max_diff = 0;}}// 6. 输出结果printf("-------------------------------------------\n");if (width < 2 || diff_count == 0) {printf("最大水平差异: N/A (图像宽度 < 2 或未找到差异)\n");printf("最小水平差异: N/A (图像宽度 < 2 或未找到差异)\n");} else {printf("最大水平差异: %d\n", max_diff);printf("最小水平差异: %d\n", min_diff);}printf("-------------------------------------------\n");// 7. 清理分配的内存free(pixels);pixels = NULL; // 好习惯:将指针置为空,防止悬挂指针printf("内存已释放。\n");return EXIT_SUCCESS; // 返回 0 表示成功
}

代码解释:

  1. 头文件: 包含了标准输入输出 (stdio.h)、标准库(包括内存分配、abs 函数、退出状态 EXIT_SUCCESS/EXIT_FAILURE - stdlib.h)以及整数限制 (limits.h - 用于 INT_MAX)。

  2. create_sample_thermal_file: 一个辅助函数(可选),用于生成符合指定格式的测试二进制文件。如果您没有现成的数据文件,这对于测试至关重要。

  3. 文件打开 (fopen): 以二进制读取模式 ("rb") 打开二进制文件。包含错误检查。

  4. 读取维度 (fread): 从文件读取前两个 int 值(宽度和高度)。包含对 fread 返回值的检查,以确保数据确实被读取。同时检查维度是否为正数。

  5. 内存分配 (malloc): 计算总像素数,并分配一块足够大的连续内存来存储所有 short 类型的像素值。包含对内存分配失败的错误检查。

  6. 读取像素数据 (fread): 将文件的剩余部分(像素数据)读入分配的内存块。检查是否读取了正确数量的元素。

  7. 关闭文件 (fclose): 一旦数据读入内存,就关闭文件指针。

  8. 计算差异:

    • 将 min_diff 初始化为 INT_MAX(int 能表示的最大值),将 max_diff 初始化为 0(最小的非负差值)。

    • 处理 width < 2 的边缘情况,此时无法进行水平比较。

    • 使用嵌套循环遍历行 (r) 和列 (c)。内层列循环在 width - 1 处停止,以避免在访问 c + 1 时越界。

    • 计算当前像素 (r * width + c) 及其右侧邻居 (r * width + c + 1) 在一维数组中的索引。

    • 获取 short 类型的像素值。

    • 使用 stdlib.h 中的 abs() 函数计算绝对差。

    • 相应地更新 min_diff 和 max_diff。

  9. 输出 (printf): 打印最终计算出的最小和最大差异。如果无法计算差异,则输出特定信息。

  10. 内存清理 (free): 释放为像素数据分配的内存,防止内存泄漏。

  11. 错误处理: 包含对文件打开、读取、内存分配和无效维度的检查,向 stderr 输出信息性消息,并在失败时返回非零退出码。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com