You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键说明

  1. 数据分离存储:用两个独立的字符串数组存储流体和物体名称,避免和数值类型冲突
  2. 数组下标规范:全部使用0起始下标,符合C语言数组的访问规则,避免越界
  3. 随机值范围控制:通过rand() % (最大值-最小值+1) + 最小值生成指定范围内的合理测量值,避免rand()生成过大的无意义数值
  4. 可扩展性:通过定义常量FLUID_COUNT等,后续修改流体/物体/测量次数只需修改常量值
  5. 输入处理:用scanf("%s")读取无空格的名称,如果需要支持带空格的名称,可替换为fgets并处理换行符

内容的提问来源于stack exchange,提问作者annazxc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:21:10