【2025春季】计算机程序设计(混合式教学)

赵秀岩 王美航 房媛 康丽 邵利

目录

  • 1 程序设计概述
    • 1.1 开课前期准备工作(上课前看)
      • 1.1.1 教你VC++编程入门(上课前看)
    • 1.2 计算机语言
    • 1.3 算法
    • 1.4 C程序基本结构
  • 2 数据类型
    • 2.1 数据类型概述与标识符
    • 2.2 常量
    • 2.3 变量
    • 2.4 整型数据类型
    • 2.5 实型数据类型
    • 2.6 字符型数据类型
  • 3 运算符与表达式
    • 3.1 运算符概述与算术运算符
    • 3.2 自加自减运算符
    • 3.3 关系运算符
    • 3.4 逻辑运算符
    • 3.5 赋值运算符
    • 3.6 条件运算符
    • 3.7 逗号运算符
    • 3.8 sizeof运算符
    • 3.9 类型转换运算符
    • 3.10 位运算符
  • 4 顺序结构与输入输出
    • 4.1 基本输入输出函数
    • 4.2 字符输入输出函数
    • 4.3 顺序结构程序设计
  • 5 选择结构程序设计
    • 5.1 if语句
    • 5.2 switch语句
    • 5.3 选择结构的嵌套使用
  • 6 循环结构程序设计
    • 6.1 循环结构概述
    • 6.2 实现循环结构问题的语句
    • 6.3 循环语句的嵌套
    • 6.4 break和continue
    • 6.5 循环部分-高阶应用案例
      • 6.5.1 习题1-九九乘法表
      • 6.5.2 习题2-斐波那契数列
      • 6.5.3 习题3-大赛评分计算
      • 6.5.4 习题4-黑洞数验证
  • 7 数组
    • 7.1 一维数组
    • 7.2 二维数组
    • 7.3 字符数组与字符串
    • 7.4 数组与数据存储
  • 8 函数
    • 8.1 函数的基本概念定义与声明
    • 8.2 函数的参数
    • 8.3 函数的返回值
    • 8.4 函数的嵌套调用
    • 8.5 函数的递归调用
    • 8.6 变量的作用域与生存期
  • 9 指针
    • 9.1 指针与地址
    • 9.2 指针变量与指针运算
    • 9.3 指针与数组
    • 9.4 指针与字符串
    • 9.5 指针与函数
    • 9.6 指针数组
    • 9.7 数组指针
    • 9.8 指针的指针
  • 10 其他构造数据类型
    • 10.1 结构体
    • 10.2 共用体
    • 10.3 枚举
    • 10.4 结构体与链表
  • 11 编译预处理与宏定义
    • 11.1 编译预处理
    • 11.2 宏
  • 12 文件
    • 12.1 文件的定义与文件指针
    • 12.2 文件的打开和关闭
    • 12.3 文件的常用操作
  • 13 〔学生〕优秀案例分享
    • 13.1 小老鼠喝毒水
      • 13.1.1 智能212-邓钰林〔循环实现〕
      • 13.1.2 生工215-王景邦〔函数实现〕
      • 13.1.3 智能212-邓钰林〔函数实现〕
    • 13.2 歌手大赛评分系统
      • 13.2.1 生工215-王景邦
    • 13.3 中英对译查字典
      • 13.3.1 生工215-王景邦
      • 13.3.2 智能212-阎露云
    • 13.4 歌德巴赫猜想
    • 13.5 学生〔原创设计〕案例
      • 13.5.1 〔小马上楼〕智能212-王国旭
结构体



一、结构体的概念

在实际应用中,使用C程序处理的很多数据之间并不是相互孤立的,如我们前面所讲的学生成绩管理系统。其中学生的学号、姓名、分数等信息,从不同的角度描述着某位“学生”的属性。所有这些信息放在一起,描述了学生的成绩信息,如表1所示。

表1学生成绩表

学号姓名数学计算机英语
1刘荫888678
12周洲989089
20明华768996

由表1可见,每一个“成绩”都与一名学生和一门课程相关联。比如表1中的数学成绩“88”分,指的是学号为“1”号的学生“刘荫”的数学成绩。如果将学生的学号、姓名、数学成绩、计算机成绩和英语成绩,分别定义为互不相关的简单变量或数组,将不利于后期的实际应用。 
例如,下面的代码分别定义了5组不同的变量,分别用以描述表1中的学号、姓名、成绩等信息:

  1. char number1[4],number2[4],number3[4];

  2. char name1[8],name2[8],name3[8];

  3. int math1,math2,math3;

  4. int pc1,pc2,pc3;

  5. int english1, english2, english3;

//分别存储3名学生的学号 
//分别存储3名学生的姓名 
//分别存储3名学生的数学成绩 
//分别存储3名学生的计算机成绩 
//分别存储3名学生的英语成绩

那么在实际应用中就会存在如下问题:

  1. 当学生人数增加时,变量的数量就会增加。目前,描述3名学生的信息时定义了15个变量,当需要描述30名学生的信息时,变量的个数就增加到了150个。

  2. 当然,这个问题可以通过定义数组来解决。即:number[3][4]、name[3][8]、math[3]、pc[3]、english[3](三组成绩也可以用二维数组score[3][3]来表示)。这时,学生信息的描述格式如下所示:

  1. char number[3][4];

  2. char name[3][8];

  3. int score[3][3];

//存储3名学生的学号
//存储3名学生的姓名
//存储3名学生的三门课成绩

但是,学号、姓名、成绩这些数据之间是有着内在联系的,即:它们隶属于学生这个整体,而上面的定义方式又不能使它们构成一个有效的整体。如果要进行一些略微复杂的操作,将会很麻烦。例如,我们要对表1中的数据按数学进行降序排序,仅对数学成绩进行降序排列是远远不够的。因为我们必须知道这个数学成绩是谁的数学成绩,换句话说,在对数学成绩排序时,还要把这个成绩关联到一个具体的学生(包括学生的姓名、学号及其他两门课程的成绩),即:需要同时对学号、姓名、计算机成绩、英语成绩进行操作。

为了形象描述“学号-姓名-成绩”这种有内在联系的数据,需要将这种数据组合成一个整体来进行存储和处理,C语言使用一种称为结构体的数据类型来描述这种数据。结构体类型的数据,可以被理解成二维表格,如表1所示。

  1. 表格的结构设计可以理解成结构体类型设计;

  2. 表格中的每一行可以理解成是一个结构体变量,是一个整体;

  3. 表格中的每一列可以理解成是对象的某个属性,在结构体中称为成员变量;

  4. 表格中的每一行是一个对象的全部属性的集合,如一个学生的所有属性信息的结合;

  5. 表格中有多少行,就相当于是多少个结构体变量;

  6. 当表格行数很多时,分别来定义这些结构体变量不但很麻烦而且不容易控制,这时候可以用结构体数组来表示这些数据。

当实际的需要不同时,表格所要表示的信息类型也会不同,表9-1表示了“学生姓名-学号-课程成绩”的信息,有时可能需要表示“学生姓名-性别-年龄”或者“商品名称-价格-数量”等等其他信息。因此,要根据实际需要定义不同的结构体类型,即下一节要讨论的如何定义不同的结构体类型。

二、结构体类型的定义

前面我们讨论了结构体数据类型的必要性和特点,下面学习一下在C程序中如何定义一个结构体类型。编程者可以按照程序的实际需要定义不同的结构体类型,结构体类型定义格式为: 
struct 结构体名 
{
类型说明符 成员变量1; 
类型说明符 成员变量2; 

};

结构体定义时,必须注意以下几点:

1. struct为关键字且不能缺少,表示该数据类型是结构体。 
2. 结构体类型名、成员变量名需要遵循标识符的命名规则,即:只能有数字、字母和下划线组成且数字不能开头。
3. 成员变量类型相同时,可以合并定义, 例如:类型说明符 成员变量3,成员变量4; 这里成员变量3与成员变量4的数据类型必须相同的。
4. ”}”后的分号不可缺少。

三、结构体变量的定义

定义结构体类型后,必须为其定义变量,才能使用该结构体类型,称这种变量为结构体变量。声明结构体变量有三种方法: 
方法一:先定义结构体类型,后声明结构体变量。

  1. struct stu_info1

  2. {

  3. char number[4],name[8];

  4. int math,pc,english;

  5. };

  6. struct? stu_info1 stu1,stu2,stu3;

这里,代码行1-5定义了结构体类型sturct stu_info1,代码行6声明了3个结构体变量。 
方法二:定义结构体类型同时声明结构体变量。

  1. struct stu_info1

  2. {

  3. char number[4],name[8];

  4. int math,pc,english;

  5. }stu1,stu2,stu3;

这里请注意,代码行5,“}”外没有分号,在定义了结构体类型后紧跟着声明了3个结构体变量。 
方法三: 不定义结构体类型,直接定义结构体变量。

  1. struct

  2. {

  3. char number[4],name[8];

  4. int math,pc,english;

  5. }stu1,stu2,stu3;

这里请注意,代码行1:关键字“struct”后面省略了结构体名。这时,因为没有定义结构体类型,程序在代码行5后就无法再定义与结构体变量stu1,stu2,stu3相同的新的结构体变量。 
声明结构体变量后,系统为变量分配存储空间存储数据,通过结构体变量成员的引用来实现数据的处理。

四、结构体变量的引用

结构体变量的引用,通常是逐个引用其成员,尤其是输入或输出,不可以整体引用结构体变量,都要逐个处理其成员。

struct stu_info1 //结构体类型定义放在主函数内 

char number[N],name[M];
int math,pc,english;
}; //先定义结构体类型后声明结构体变量
struct ?stu_info1? stu1={"1","刘荫",88,86,78},stu2;
printf("输入学生学号 姓名 数学成绩 计算机成绩 英语成绩(空格间隔)\n");
scanf("%s%s%d%d%d",stu2.number,stu2.name,&stu2.math,&stu2.pc, &stu2. english); 
printf("学号\t姓名\t数学\t计算机 \t英语\n");
printf("%s\t%s\t%d\t%d\t%d\n",stu1.number,stu1.name,stu1.math,stu1.pc, stu1.english);
printf("%s\t%s\t%d\t%d\t%d\n",stu2.number,stu2.name,stu2.math,stu2.pc, stu2.english);