本课介绍了C语言程序的基本组成部分。一个完整的C程序包含main()函数、预处理指令、变量定义、函数原型、程序语句、函数定义和注释等元素。通过示例程序bigyear.c,展示了如何计算指定年数后的年份,并详细解析了程序各部分的用途。重点讲解了#include和#define指令的作用、变量定义方法、函数原型与定义的区别、printf()和scanf()等常用语句的使用,以及单行和多行注释的写法。课程还提供了程序运行步骤、常见问题解答和复习要点,帮助初学者掌握C程序的基本结构。
第2课:C语言的组成部分
2.1 简短C程序示例
程序清单2.1:bigyear.c - 计算某人在指定年数后的年份
// 该程序计算某人在经过指定年数后的年份#include<stdio.h>#defineTARGET_AGE20intyear1,year2;intcalcYear(intyear1);intmain(void){// 询问用户的出生年份printf("What year was the subject born? ");printf("Enter as a 4-digit year (YYYY): ");scanf(" %d",&year1);// 计算指定年数后的年份,并显示该年份year2=calcYear(year1);printf("Someone born in %d will be %d in %d.",year1,TARGET_AGE,year2);return0;}// 该函数计算将来年份intcalcYear(intyear1){return(year1+TARGET_AGE);}输出示例:
What year was the subject born? Enter as a 4-digit year (YYYY): 2000 Someone born in 2000 will be 20 in 2020.2.2 程序的组成部分
2.2.1 main()函数
- 位于程序的第9~23行
- 每个可执行的C程序必不可少的部分
- 基本结构:
int main(void) { ... } - 程序从main()的第一条语句开始执行,到最后一条语句结束
- 根据ANSI标准,main()中必须有
return语句
2.2.2 #include和#define指令
#include <stdio.h>:命令编译器在编译时添加stdio.h文件的内容#define TARGET_AGE 20:定义符号常量,编译器会将程序中所有的TARGET_AGE替换为20- 包含文件(头文件)扩展名为
.h,由编译器提供
2.2.3 变量定义
- 第5行:
int year1, year2; - 变量是赋给内存位置的名称,用于存储信息
- 在C语言中,必须先定义变量才能使用
2.2.4 函数原型
- 第7行:
int calcYear(int year1); - 告知编译器程序中使用的函数名称和参数
- 不同于函数定义,它不包含函数的实际语句
2.2.5 程序语句
printf()语句(第12、13、19、20行)
- 在屏幕上显示信息的库函数
scanf()语句(第14行)
- 读取键盘输入的数据并赋给变量
函数调用语句(第17行)
- 调用calcYear()函数并传递参数
return语句(第22、28行)
- 第28行:函数返回计算结果
- 第22行:程序结束前返回0给操作系统
2.2.6 函数定义
- 第26~29行定义了calcYear()函数
- 两种函数类型:
- 库函数:如printf()、scanf(),由编译器提供
- 用户自定义函数:如calcYear(),由程序员创建
2.2.7 程序注释
两种注释风格:
多行注释:
/* 注释内容 */- 可以跨越多行
- 不能嵌套使用
单行注释:
// 注释内容- 只能用于单行
- 从//开始到行尾的内容都被忽略
2.2.8 使用花括号
- 用花括号
{}将代码块括起来 - 如:main()函数体、calcYear()函数体
- 花括号内的一条或多条语句称为块(block)
2.3 运行程序步骤
- 确保工作目录正确
- 打开编辑器
- 正确输入源代码(不要输入行号)
- 保存程序文件
- 编译并链接程序
- 如有错误,返回编辑器修改
2.4 小结
- 每个C程序必须有
main()函数 - 程序的实际工作由语句完成
- 注释对程序执行没有影响,只用于提高代码可读性
- C程序使用库函数和用户自定义函数
2.5 常见问题解答
Q:注释对程序有何影响?
A:注释是给程序员看的,编译器完全忽略所有注释,因此注释不会影响可执行程序的性能。
Q:如何找到可用的库函数?
A:许多编译器提供在线文档,按字母顺序列出库函数。附录C也列出了常用函数。
2.6 复习要点
概念理解
- 块(block):用花括号括起来的一组语句
- 函数:执行特定任务的一段程序代码
- 函数类型:
- 库函数:编译器提供
- 用户自定义函数:程序员创建
- 包含文件:也称为头文件(.h文件)
编程实践
- 添加注释的方法:
- 使用
/* */进行多行注释 - 使用
//进行单行注释
- 使用
- 注释的重要性:提高代码可读性,方便后期维护
注意事项
- 注释不能嵌套
- 注释可以超过一行
- 养成良好的注释习惯很重要
- 计算机只会"照本宣科",要确保代码准确无误
通过本课的学习,你应该能够识别C程序的基本组成部分,并理解各部分的作用。在后续课程中,我们将深入探讨每个部分的详细用法。
抱歉,练习题被遗漏了。以下是完整的练习题部分:
2.6 课后研习
2.6.1 问答题
1. 在C语言中,用花括号括起来的一组语句叫作什么?
答:块(block)
2. 每个C程序都必不可少的部分是什么?
答:main()函数
3. 如何在程序中添加注释?为什么要添加注释?
答:有两种添加注释的方法:
- 多行注释:使用
/* 注释内容 */ - 单行注释:使用
// 注释内容
添加注释可以提高代码的可读性,方便自己和他人理解和维护代码。
4. 什么是函数?
答:函数是一段执行特定任务的程序代码,通过函数名可以调用执行其中的代码。
5. C语言提供了哪两种类型的函数?它们有什么区别?
答:
- 库函数:由C编译器软件包提供
- 用户自定义函数:由程序员创建
区别在于来源不同,但使用方法类似。
6. #include指令有什么用途?
答:命令C编译器在编译时将指定包含文件的内容添加到程序中。
7. 注释是否可以嵌套?
答:标准C语言不允许注释嵌套,某些编译器可能支持但不应使用以保证代码可移植性。
8. 注释是否能超过一行?
答:可以,多行注释/* */可以跨越多行。
9. 包含文件的另一个名称是?
答:头文件
10. 什么是包含文件?
答:包含文件(头文件)是独立的磁盘文件,内含程序或编译器要使用的信息,扩展名为.h。
2.6.2 练习题
1. 写一个最短小的C程序
intmain(void){return0;}2. 分析下面的程序,指出各行属于什么类型
分析以下程序:
#include<stdio.h>// 1. 预处理指令#definePI3.14159// 2. 宏定义intradius;// 3. 变量定义doublearea;// 4. 变量定义doublecalculateArea(intr);// 5. 函数原型intmain(void){// 6. main函数开始// 获取半径 // 7. 注释printf("Enter radius: ");// 8. 语句(函数调用)scanf("%d",&radius);// 9. 语句(函数调用)area=calculateArea(radius);// 10. 语句(函数调用+赋值)printf("Area: %.2f\n",area);// 11. 语句(函数调用)return0;// 12. 语句(返回语句)}// 13. main函数结束// 计算面积的函数 // 14. 注释doublecalculateArea(intr){// 15. 函数定义开始returnPI*r*r;// 16. 语句(返回语句)}// 17. 函数定义结束3. 写一个程序的注释示例
/* * 程序:学生成绩管理系统 * 作者:张三 * 日期:2024年1月15日 * 功能:管理学生成绩,包括录入、查询、统计等功能 */#include<stdio.h>// 定义最大学生数量#defineMAX_STUDENTS100// 学生结构体structStudent{intid;// 学号charname[50];// 姓名floatscore;// 成绩};// 函数声明voidinputStudent(structStudent*s);// 输入学生信息voiddisplayStudent(structStudents);// 显示学生信息intmain(void){structStudentstu;// 定义一个学生变量// 输入学生信息inputStudent(&stu);// 显示学生信息displayStudent(stu);return0;}// 函数定义:输入学生信息voidinputStudent(structStudent*s){printf("请输入学号: ");scanf("%d",&s->id);printf("请输入姓名: ");scanf("%s",s->name);// 注意:这里假设姓名不包含空格printf("请输入成绩: ");scanf("%f",&s->score);}// 函数定义:显示学生信息voiddisplayStudent(structStudents){printf("\n=== 学生信息 ===\n");printf("学号: %d\n",s.id);printf("姓名: %s\n",s.name);printf("成绩: %.2f\n",s.score);printf("================\n");}4. 训练输入、编译并运行程序
请尝试以下步骤:
- 使用编辑器输入上面的学生成绩管理程序
- 保存为
student.c - 编译程序:
gcc student.c -o student - 运行程序:
./student(Linux/Mac)或student.exe(Windows) - 按照提示输入学生信息,观察输出结果
附加练习:
- 修改程序,使其可以管理多个学生的信息
- 添加计算平均成绩的功能
- 添加查找最高分学生的功能
注意:
- 在输入代码时不要输入行号
- 确保所有标点符号都是英文的(特别是分号、引号、括号)
- 注意区分大小写
- 编译时要确保语法正确,注意错误提示信息