实验 1:程序编写与调试

一、C程序的编写过程

(一)开发环境

需借助编译环境将C语言(高级语言)翻译为机器语言,常用工具包括:

  • Visual C++
  • Vs2010
  • Code::Blocks

(二)核心步骤(编辑→编译→连接→执行)

步骤 核心操作 输出文件 文件后缀 关键说明
编辑程序 用编辑器编写代码,保存为源文件 源程序 .c 源文件是存放汇编或高级语言代码的文件,需遵循C语言基础语法框架
编译程序 编译器检查语法错误,将源程序翻译为机器指令 目标程序 .obj 若语法错误(如缺少分号、关键字错误),编译会失败并提示错误位置
连接程序 将目标文件与标准库函数(如printf所在库)打包组装 可执行程序 .exe 连接成功后生成计算机可直接运行的文件,连接失败可能因库函数引用错误
执行程序 运行可执行文件 运行结果 查看程序是否实现预期功能,若结果异常需排查逻辑或运行时错误

(三)示例任务

编写程序在屏幕输出两行内容:

  1. “我是中国人,我爱中国!”
  2. “I am Chinese. I love China!”

二、Hello World类程序编写(基础输出程序)

(一)核心代码框架

#include <stdio.h>  // 引用标准输入输出库,用于printf函数
int main(void)      // 主函数,程序入口
{
    // 输出指定内容,\n表示换行
    printf("我是中国人,我爱中国!\n");
    printf("I am Chinese. I love China!\n");
    return 0;       // 主函数返回0,标识程序正常结束
}

(二)提交要求

  • 主观题形式,需将编写的程序拍照上传,确保代码清晰、无语法错误

三、C程序的错误类型

(一)语法错误(编译阶段报错)

  • 定义:违反C语言语法规则,如缺少分号、括号不匹配、变量未声明等。
  • 示例代码
    #include <stdio.h>
    int main(void)
    {
        int a,b,sum; 
        a=123; 
        b=456 sum=a+b;  // 错误:b=456后缺少分号
        printf(sum);    // 错误:printf格式错误,缺少引号和格式符
        return 0;
    }
    
  • 特征:编译时会提示具体错误位置(如“error C2146: 语法错误: 缺少‘;’”),程序无法生成目标文件。

(二)逻辑错误(编译通过,结果异常)

  • 定义:语法无错,程序能正常执行,但结果不符合预期,多因算法或逻辑设计错误。
  • 示例代码
    #include <stdio.h>
    int main(void)
    {
        int a,b,c;
        scanf("%d%d",a,&b);  // 错误:scanf第一个参数应为&a(取地址)
        c=a/b;
        printf("sum is %d\n",c);  // 错误:变量c是除法结果,却标注为sum
        return 0;
    }
    
  • 特征:无报错信息,需通过对比预期结果与实际结果排查(如输入6和3,正确结果应为2,若因逻辑错误输出其他值)。

(三)运行时错误(编译通过,运行崩溃/异常)

  • 定义:语法和逻辑无明显错误,但运行时因资源问题或非法操作(如未初始化变量、数组越界)无法正常执行。
  • 示例代码
    #include <stdio.h>
    int main(void)
    {
        int a,b,c;
        a=3;
        c=b;  // 错误:变量b未初始化,值为随机数
        return 0;
    }
    
  • 特征:运行时弹出错误提示(如“Run-Time Check Failure #3: 变量b未初始化”),程序可能中止或闪退。

四、C语言调试工具

(一)基于断点的调试(传统调试方式)

1. 核心流程

  1. 设置断点:在代码关键位置(如分支、循环处)标记,使程序运行到此处中断,方便观察状态。
    • 示例:在if(x==y+z)行设置断点,查看x与y+z的比较逻辑。
  2. 运行程序:启动调试模式,程序执行到断点处暂停。
  3. 观察变量:通过调试工具查看变量实时值(如局部变量x、y、z的当前数值),判断是否符合预期。
  4. 修改代码:若发现错误(如将x=y+z(赋值)误写为x==y+z(判断)),暂停调试并修正代码,重新运行验证。

2. 常用操作

  • 单步执行:逐行运行代码,观察每一步变量变化,定位错误位置。
  • 查看内存:复杂程序可查看内存地址中的数据,排查指针或数组相关错误。

(二)基于大模型的调试(辅助调试方式)

1. 工具示例

  • 讯飞星火大模型(https://xinghuo.xfyun.cn/botweb/2081730)
  • 功能定位:智能识别代码错误(如语法错误、逻辑漏洞),提供修正建议和解释。

2. 调试示例

  • 原错误代码(缺少分号):
    #include <stdio.h>
    int main(void)
    {
        int a,b,sum;
        a=123;
        b=456 sum=a+b;  // 缺少分号
        printf("sum is ");
        return 0;
    }
    
  • 大模型修正后代码:
    #include <stdio.h>
    int main(void)
    {
        int a,b,sum;
        a=123;
        b=456;  // 补充分号
        sum=a+b;
        printf("sum is %d\n",sum);  // 补充格式符%d,输出sum值
        return 0;
    }
    

五、思考题

  1. 程序中的标识符有什么用?(提示:标识变量、函数、数组等的名称,需遵循命名规则,如首字符为字母或下划线)
  2. 整型与浮点型运算后的结果是什么数据类型?由什么决定?(提示:结果为浮点型,由C语言的“隐式类型转换”规则决定,低精度类型向高精度类型转换)