C语言中如何用3D数组存储输入并结合rand()实现流体粘度计算器
流体粘度计算器的3D数组实现方案
问题分析
你需要实现一个流体粘度计算器,核心需求是:
- 存储3种流体、3种物体的名称
- 为每个物体在每种流体中生成3次随机粘度测量值,存入
[流体][物体][测量值]结构的3D数组 - 后续可基于测量值计算平均粘度
现有代码存在几个关键问题:
- 使用
char类型的3D数组同时存储名称(字符串)和测量值(数值),类型不匹配,无法正确存储字符串 - C语言数组下标从0开始,代码中从1循环到3会导致数组越界
- 用
scanf("%c")只能读取单个字符,无法获取完整的流体/物体名称 - 错误的数组复制操作
arr[i+1][j][0]=arr[i][j][0]会直接越界访问数组
修正实现方案
我们需要分开存储名称和数值数据:用字符串数组存储流体、物体名称,用3D数值数组存储测量值,同时遵循C语言的数组规范。
完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> // 定义常量,方便后续修改数量 #define FLUID_COUNT 3 #define OBJECT_COUNT 3 #define MEASURE_COUNT 3 // 定义测量值的范围(可根据实际需求调整) #define MIN_VISCOSITY 10 #define MAX_VISCOSITY 100 int main(){ // 存储流体名称(每个名称最多20个字符) char fluids[FLUID_COUNT][20]; // 存储物体名称 char objects[OBJECT_COUNT][20]; // 存储测量值:[流体索引][物体索引][测量次数] int viscosity[FLUID_COUNT][OBJECT_COUNT][MEASURE_COUNT]; // 初始化随机种子 srand((unsigned int)time(NULL)); // 读取3种流体的名称 printf("请输入%d种流体的名称:\n", FLUID_COUNT); for (int i = 0; i < FLUID_COUNT; i++) { printf("流体%d:", i+1); scanf("%s", fluids[i]); // 如果需要支持带空格的名称,替换为: // fgets(fluids[i], sizeof(fluids[i]), stdin); // 注意要处理fgets读取的换行符 } // 读取3种物体的名称 printf("\n请输入%d种物体的名称:\n", OBJECT_COUNT); for (int j = 0; j < OBJECT_COUNT; j++) { printf("物体%d:", j+1); scanf("%s", objects[j]); } // 生成随机测量值 for (int i = 0; i < FLUID_COUNT; i++) { for (int j = 0; j < OBJECT_COUNT; j++) { for (int k = 0; k < MEASURE_COUNT; k++) { // 生成[MIN_VISCOSITY, MAX_VISCOSITY]范围内的随机整数 viscosity[i][j][k] = rand() % (MAX_VISCOSITY - MIN_VISCOSITY + 1) + MIN_VISCOSITY; } } } // 输出验证数据(模拟目标结构) printf("\n===== 测量数据 =====\n"); // 打印表头 for (int i = 0; i < FLUID_COUNT; i++) { printf("%20s", fluids[i]); } printf("\n"); // 打印每个物体的测量数据 for (int j = 0; j < OBJECT_COUNT; j++) { for (int i = 0; i < FLUID_COUNT; i++) { printf("%-8s ", objects[j]); for (int k = 0; k < MEASURE_COUNT; k++) { printf("%3d ", viscosity[i][j][k]); } printf(" "); } printf("\n"); } // 计算并输出平均粘度 printf("\n===== 平均粘度 =====\n"); for (int i = 0; i < FLUID_COUNT; i++) { printf("%20s", fluids[i]); } printf("\n"); for (int j = 0; j < OBJECT_COUNT; j++) { for (int i = 0; i < FLUID_COUNT; i++) { int sum = 0; for (int k = 0; k < MEASURE_COUNT; k++) { sum += viscosity[i][j][k]; } float avg = (float)sum / MEASURE_COUNT; printf("%-8s %6.1f ", objects[j], avg); } printf("\n"); } return 0; }
关键说明
- 数据分离存储:用两个独立的字符串数组存储流体和物体名称,避免和数值类型冲突
- 数组下标规范:全部使用0起始下标,符合C语言数组的访问规则,避免越界
- 随机值范围控制:通过
rand() % (最大值-最小值+1) + 最小值生成指定范围内的合理测量值,避免rand()生成过大的无意义数值 - 可扩展性:通过定义常量
FLUID_COUNT等,后续修改流体/物体/测量次数只需修改常量值 - 输入处理:用
scanf("%s")读取无空格的名称,如果需要支持带空格的名称,可替换为fgets并处理换行符
内容的提问来源于stack exchange,提问作者annazxc
相关产品推荐
相关产品推荐

