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

C语言新手求助:悬臂梁挠度计算程序的距离增量问题

悬臂梁挠度计算程序问题修复

我是C语言初学者,正在完成一项悬臂梁挠度计算作业:需要从beam.txt读取每根梁的参数,以1英尺为增量计算载荷距固定端不同位置的挠度,当挠度达到梁长度的2%时停止该梁的计算;若始终未达到则输出提示,结果需同时输出到屏幕和deflection.txt。目前计算逻辑正确,但无法实现载荷与固定端距离的正确增量,尝试过while循环和if语句均未解决。当前代码存在输出异常:要么梁下方无内容,要么增量错误(如梁1显示1.00、2.00,梁2显示2.00、3.00)。

作业要求

  • 编写C程序从beam.txt逐根读取梁的信息,生成挠度报告(同时输出到屏幕和deflection.txt)
  • 载荷从固定端1英尺处开始,以1英尺为增量移动
  • 仅打印挠度小于梁长度2%的结果,挠度≥2%时停止该梁计算;未达到则输出提示

预期输出格式

********************************************
             BEAM DEFLECTION                 

BEAM NO. X   Total length = xx.xx ft
             2% of length = xx.xx ft

   DISTANCE FROM FIXED END       DEFLECTION
            1.00                       xxx.xx
            2.00                   xxx.xx
             .                        .
             .                        .
             .                        .

BEAM NO. X   Total length = xx.xx ft
             2% of length = xx.xx ft

   DISTANCE FROM FIXED END       DEFLECTION
            1.00                   xxx.xx
            2.00                   xxx.xx
             .                        .
             .                        .
             .                        .
     Deflection of 2% of length not reached
********************************************

错误代码

/* Preprocessor directives */
#include <stdio.h>
#include <math.h>
#define infile "C:\Users\tommc\OneDrive\Documents\ENGR 200\beam.txt"
#define outfile "C:\Users\tommc\OneDrive\Documents\ENGR 200\deflection.txt"

/* Main function */
int main(void)
{
   /* Declare variables */
   double load, load_len=1, elast, inert, beam_len, beam_base, deflection, perc_len;
   int i, ndata;
   FILE *beam=NULL, *deflect=NULL;
   
   /* open files */
   
   beam=fopen(infile, "r");
   deflect=fopen(outfile, "w");
   
   /* Print headings */
   
   printf("********************************************");
   printf("\n             BEAM DEFLECTION");
   fprintf(deflect,"********************************************");
   fprintf(deflect,"\n             BEAM DEFLECTION");
   
   /* Verify input file */
   
   if(beam==NULL)
   {
    printf("\n\n\n\n ERROR OPENING INPUT FILE.");
    printf("\n\n PROGRAM TERMINATED.\n\n\n");
    return 1;
   }
   
   /* Read control number */
   
   fscanf(beam, "%i", &ndata);

   /* Compute beam deflection and print results */
   
   for(i=1; i<=ndata; i++)
   {
   /* read in data */
    fscanf(beam, "%lf %lf %lf %lf", &beam_len, &beam_base, &elast, &load);
    inert=(beam_base*pow(beam_len,3.0))/12.0;
    deflection=(load*pow(load_len,2.0))/(2.0*elast*inert)*(beam_len-(load_len/3.0));
    perc_len=(0.02*beam_len);
    printf("\nBEAM NO %d   Total length = %5.2lf ft", i, beam_len);
    printf("\n            2%% of length = %5.2lf ft", perc_len);
    printf("\n   DISTANCE FROM FIXED END      DEFLECTION ");
    printf("\n            %4.2lf                  %6.2lf", load_len, deflection);
    fprintf(deflect, "\nBEAM NO %d   Total length = %5.2lf ft", i, beam_len);
    fprintf(deflect, "\n            2%% of length = %5.2lf ft", beam_len*0.02);
    fprintf(deflect, "\n   DISTANCE FROM FIXED END      DEFLECTION ");
    load_len++;
   if(deflection < perc_len)
   {
    printf("\n            %4.2lf                  %6.2lf", load_len, deflection);
   }
   
   if(deflection>=perc_len)
   {
    printf("\nDeflection of 2%% of length not reached");
   }
   }
       
   printf("\n********************************************\n\n\n");
   fprintf(deflect,"\n********************************************\n\n\n");
   
   /* Close the files */
   
   fclose(beam);
   fclose(deflect);
   
   /* Exit the program */
   return 0;
}

问题分析与修复方案

核心问题点

  1. load_len未重置:load_len定义在main函数开头,第一根梁计算后会持续递增,后续梁直接使用递增后的值,导致起始位置错误。
  2. 缺失增量循环:当前代码仅计算一次挠度,未通过循环实现从1英尺开始的逐次增量计算,无法遍历所有符合条件的位置。
  3. 挠度计算逻辑错误:每次增量后未重新计算挠度,直接复用第一次的计算结果,输出数据不符合实际。
  4. 文件路径转义错误:Windows系统路径中的\需转义为\\,否则会被解析为转义字符,导致文件无法打开。

修复后的代码

/* Preprocessor directives */
#include <stdio.h>
#include <math.h>
// 修复路径转义问题
#define infile "C:\\Users\\tommc\\OneDrive\\Documents\\ENGR 200\\beam.txt"
#define outfile "C:\\Users\\tommc\\OneDrive\\Documents\\ENGR 200\\deflection.txt"

/* Main function */
int main(void)
{
   /* Declare variables */
   double load, elast, inert, beam_len, beam_base, deflection, perc_len;
   int i, ndata;
   FILE *beam=NULL, *deflect=NULL;
   
   /* open files */
   beam=fopen(infile, "r");
   deflect=fopen(outfile, "w");
   
   /* Print headings */
   printf("********************************************\n");
   printf("             BEAM DEFLECTION\n\n");
   fprintf(deflect,"********************************************\n");
   fprintf(deflect,"             BEAM DEFLECTION\n\n");
   
   /* Verify input file */
   if(beam==NULL)
   {
    printf("\n\n\n\n ERROR OPENING INPUT FILE.");
    printf("\n\n PROGRAM TERMINATED.\n\n\n");
    return 1;
   }
   
   /* Read control number */
   fscanf(beam, "%i", &ndata);

   /* Compute beam deflection and print results */
   for(i=1; i<=ndata; i++)
   {
    /* read in data */
    fscanf(beam, "%lf %lf %lf %lf", &beam_len, &beam_base, &elast, &load);
    inert=(beam_base*pow(beam_len,3.0))/12.0;
    perc_len=0.02*beam_len;
    
    // 打印当前梁的基本信息
    printf("BEAM NO %d   Total length = %5.2lf ft\n", i, beam_len);
    printf("            2%% of length = %5.2lf ft\n\n", perc_len);
    printf("   DISTANCE FROM FIXED END      DEFLECTION \n");
    fprintf(deflect, "BEAM NO %d   Total length = %5.2lf ft\n", i, beam_len);
    fprintf(deflect, "            2%% of length = %5.2lf ft\n\n", perc_len);
    fprintf(deflect, "   DISTANCE FROM FIXED END      DEFLECTION \n");
    
    // 每根梁开始时重置load_len为1英尺
    double load_len = 1.0;
    int reached_limit = 0;
    
    // 循环计算每个位置的挠度,直到达到限制或超出梁长
    while(load_len <= beam_len)
    {
        // 重新计算当前位置的挠度
        deflection=(load*pow(load_len,2.0))/(2.0*elast*inert)*(beam_len-(load_len/3.0));
        
        if(deflection >= perc_len)
        {
            reached_limit = 1;
            break; // 达到挠度限制,停止计算
        }
        
        // 输出当前位置的结果
        printf("            %4.2lf                  %6.2lf\n", load_len, deflection);
        fprintf(deflect, "            %4.2lf                  %6.2lf\n", load_len, deflection);
        
        load_len += 1.0; // 增量1英尺
    }
    
    // 若未达到挠度限制,输出提示
    if(!reached_limit)
    {
        printf("\n     Deflection of 2%% of length not reached\n\n");
        fprintf(deflect, "\n     Deflection of 2%% of length not reached\n\n");
    }
    else
    {
        printf("\n");
        fprintf(deflect, "\n");
    }
   }
       
   printf("********************************************\n\n\n");
   fprintf(deflect,"********************************************\n\n\n");
   
   /* Close the files */
   fclose(beam);
   fclose(deflect);
   
   /* Exit the program */
   return 0;
}

修复说明

  1. 重置load_len:将load_len的声明移到每根梁的循环内部,确保每根梁都从1英尺开始计算。
  2. 添加增量循环:使用while循环遍历从1英尺到梁长的所有位置,每次增量后重新计算挠度。
  3. 修正挠度计算逻辑:在每次循环中重新计算当前load_len对应的挠度,确保数据准确。
  4. 修复文件路径:将路径中的\替换为\\,避免转义字符解析错误。
  5. 优化输出格式:调整打印的换行和空格,使其更贴近预期输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:55:03