C语言函数与程序结构实验:改错与优化

需积分: 0 0 下载量 194 浏览量 更新于2024-08-04 收藏 237KB DOCX 举报
"实验3函数与程序结构实验" 在这个实验中,学生将深入理解并实践C语言中的关键概念,包括函数的使用、不同存储类型的变量以及多文件编译技术。实验分为两个部分:改错题和修改替换题,旨在增强学生的编程调试能力和优化代码的能力。 首先,实验的目的在于: 1. 函数的掌握:学生需要了解如何定义和声明函数,理解函数调用过程以及参数传递的方式。函数在程序设计中起着模块化的作用,允许将复杂问题分解为可管理的小任务。 2. 存储类型变量的理解:在C语言中,变量有不同的存储类型,如自动(auto)、静态(static)、寄存器(register)和外部(extern)等。理解它们的区别和应用场景是编写高效代码的关键,例如静态变量在函数调用间的持久性,以及何时使用寄存器变量来优化性能。 3. 多文件编译技术:在大型项目中,代码通常分布在多个文件中。理解如何正确地组织和链接这些文件是必要的,这涉及到头文件(.h)的使用,它们用于函数和数据结构的声明,以及源文件(.c)的编译和链接。 在改错题中,学生会遇到一个计算阶乘之和的程序,其中包含语法和逻辑错误。错误包括未声明函数、主函数原型错误、变量未定义以及循环逻辑不正确。通过修复这些问题,学生可以巩固对函数调用、变量作用域和循环控制的理解。 修改替换题进一步挑战了学生的编程技能。第一部分要求优化sum_fac函数,使其计算量最小。原始版本在每次迭代中都重新计算整个阶乘,而优化后的版本只需累加新的阶乘值到总和上,显著减少了计算量。 第二部分则要求将函数的返回值类型从`long`改为`double`,以便计算更精确的结果。同时,由于涉及浮点数运算,变量`s`和`fac`也应相应地更改为`double`类型。这样,学生将了解到不同类型的数据精度差异以及如何适当地进行浮点运算。 这个实验提供了一个实践和巩固C语言核心概念的平台,对于提升编程技能和理解程序结构至关重要。通过解决这些问题,学生不仅能够熟练掌握函数的运用,还能深化对变量存储类型和多文件项目组织的认识。

void CS5532_INITIAL(void) { uchar CS5532_i; EX1=0; //IE=0x00; CS5532_A0=0; CS5532_A1=0; CS5532_SDO=1; CS5532_SDI=0; CS5532_SCLK=0; CS5532_CS=0; CS5532_SDI=1; _nop_(); for(CS5532_i=0;CS5532_i<135;CS5532_i++) //sending the 16 bytes sync1 and 1 byte sync0 { CS5532_SCLK=1; _nop_(); CS5532_SCLK=0; _nop_(); } CS5532_SDI=0; _nop_(); CS5532_SCLK=1; _nop_(); CS5532_SCLK=0; _nop_(); CS5532_CS=1; CS5532_WRITE_ONE_BYTE(0x03); //reset the cs5532 namely set RS=1 CS5532_WRITE_ONE_BYTE(0x22); CS5532_WRITE_ONE_BYTE(0x40); CS5532_WRITE_ONE_BYTE(0x00); CS5532_WRITE_ONE_BYTE(0x00); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0x0B); //read the RV bit and set RV=0 CS5532_READ_ONE_BYTE(); CS5532_READ_ONE_BYTE(); CS5532_READ_ONE_BYTE(); CS5532_READ_ONE_BYTE(); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0x03); //set the cs5532 system configuration register CS5532_WRITE_ONE_BYTE(0x02); CS5532_WRITE_ONE_BYTE(0x40); CS5532_WRITE_ONE_BYTE(0x00); CS5532_WRITE_ONE_BYTE(0x00); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0x05); //set the cs5532 channel setup register CS5532_WRITE_ONE_BYTE(0x32); CS5532_WRITE_ONE_BYTE(0x40); //0x00 for bipolar preforming CS5532_WRITE_ONE_BYTE(0x32); //speed 7.5sps CS5532_WRITE_ONE_BYTE(0x40); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0xC0); //cs5532 performing successive conversion CS5532_CS=0; CS5532_SDO=1; DELAY_TIMES(0xFF); DELAY_TIMES(0xFF); //DELAY_TIMES(0xFF); //PX1=1; //set the external interrupt 1 highest prior IT1=1; //set the external interrupt 1 edge trigger mode EX1=1; EA=1; //IE=0x84; //external interrupt 1 turn on }

2023-07-13 上传