#include <stdio.h>

#define NUM 40 // 数据个数 #define SECTOR 10 // 扇区个数 #define PIECE 4 // 每扇区工件个数

// 工件结构体 typedef struct { int id; // 工件编号 float diameter; // 直径 float height; // 高度 float volume; // 体积 } Piece;

// 扇区结构体 typedef struct { Piece pieces[PIECE]; // 工件数组 } Sector;

// 交换两个工件 void swap(Piece *a, Piece *b) { Piece temp = *a; *a = *b; *b = temp; }

// 冒泡排序,从小到大 void bubbleSort(Piece *pieces, int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (pieces[j].volume > pieces[j + 1].volume) { swap(&pieces[j], &pieces[j + 1]); } } } }

// 从文件读入数据 void readData(Piece *pieces) { FILE *fp = fopen('data.txt', 'r'); int i; for (i = 0; i < NUM; i++) { fscanf(fp, '%d%f%f', &pieces[i].id, &pieces[i].diameter, &pieces[i].height); pieces[i].volume = pieces[i].diameter * pieces[i].diameter * pieces[i].height * 0.25 * 3.1415926; // 体积公式:π * r^2 * h / 4 } fclose(fp); }

// 将工件按照编号从小到大排列 void sortById(Piece *pieces) { int i, j; for (i = 0; i < NUM - 1; i++) { for (j = 0; j < NUM - i - 1; j++) { if (pieces[j].id > pieces[j + 1].id) { swap(&pieces[j], &pieces[j + 1]); } } } }

// 将工件按照体积从小到大排列 void sortByVolume(Piece *pieces) { bubbleSort(pieces, NUM); }

// 打印每个工件的信息 void printPieces(Piece *pieces) { int i; for (i = 0; i < NUM; i++) { printf('%d %.2f %.2f %.2f\n', pieces[i].id, pieces[i].diameter, pieces[i].height, pieces[i].volume); } }

// 计算每个工件与左右工件的体积差 float calcVolumeDiff(Piece *pieces, int index) { float diff = 0; if (index > 0) { // 左边有工件 diff += pieces[index].volume - pieces[index - 1].volume; } if (index < NUM - 1) { // 右边有工件 diff += pieces[index + 1].volume - pieces[index].volume; } return diff; }

// 交换两个工件 void swapPieces(Piece *pieces, int i, int j) { Piece temp = pieces[i]; pieces[i] = pieces[j]; pieces[j] = temp; }

// 对一个扇区内的工件进行排序 void sortSector(Sector *sector) { int i, j; float minDiff = 3.5; // 最小体积差 for (i = 0; i < PIECE; i++) { // 外层循环,每次找到一个满足条件的工件 float minVolume = sector->pieces[i].volume; // 当前扇区中体积最小的工件 int minIndex = i; // 当前扇区中体积最小的工件的下标 for (j = i + 1; j < PIECE; j++) { // 内层循环,找到该扇区中体积最小的工件 if (sector->pieces[j].volume < minVolume) { minVolume = sector->pieces[j].volume; minIndex = j; } } float diff = calcVolumeDiff(sector->pieces, minIndex); // 计算该工件与左右工件的体积差 if (diff < minDiff) { // 如果体积差小于最小体积差,则进行交换 int leftIndex = minIndex - 1; // 左边工件的下标 int rightIndex = minIndex + 1; // 右边工件的下标 if (leftIndex >= i && sector->pieces[leftIndex].volume < sector->pieces[rightIndex].volume) { // 如果左边工件的体积比右边工件小,则与左边工件交换 swapPieces(sector->pieces, minIndex, leftIndex); minIndex = leftIndex; } swapPieces(sector->pieces, minIndex, i); // 与当前位置进行交换 } } }

// 输出每个扇区的4个工件组合 void printSectors(Sector *sectors) { int i, j; for (i = 0; i < SECTOR; i++) { printf('Sector %d:\n', i + 1); for (j = 0; j < PIECE; j++) { printf('%d ', sectors[i].pieces[j].id); } printf('\n'); } }

int main() { Piece pieces[NUM]; // 工件数组 Sector sectors[SECTOR]; // 扇区数组 readData(pieces); // 读入数据 sortById(pieces); // 按编号排序 sortByVolume(pieces); // 按体积排序 int i; for (i = 0; i < SECTOR; i++) { // 将工件分配到各个扇区 int j; for (j = 0; j < PIECE; j++) { sectors[i].pieces[j] = pieces[i * PIECE + j]; } sortSector(&sectors[i]); // 对该扇区内的工件进行排序 } printSectors(sectors); // 输出结果 return 0;


原文地址: https://www.cveoy.top/t/topic/n3Sc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录