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; }
问题分析与修复方案
核心问题点
load_len未重置:load_len定义在main函数开头,第一根梁计算后会持续递增,后续梁直接使用递增后的值,导致起始位置错误。- 缺失增量循环:当前代码仅计算一次挠度,未通过循环实现从1英尺开始的逐次增量计算,无法遍历所有符合条件的位置。
- 挠度计算逻辑错误:每次增量后未重新计算挠度,直接复用第一次的计算结果,输出数据不符合实际。
- 文件路径转义错误: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; }
修复说明
- 重置
load_len:将load_len的声明移到每根梁的循环内部,确保每根梁都从1英尺开始计算。 - 添加增量循环:使用
while循环遍历从1英尺到梁长的所有位置,每次增量后重新计算挠度。 - 修正挠度计算逻辑:在每次循环中重新计算当前
load_len对应的挠度,确保数据准确。 - 修复文件路径:将路径中的
\替换为\\,避免转义字符解析错误。 - 优化输出格式:调整打印的换行和空格,使其更贴近预期输出格式。
内容的提问来源于stack exchange,提问作者TomMcgTX
相关产品推荐
相关产品推荐

