大学C程序设计教程.ppt

上传人:新** 文档编号:570795821 上传时间:2024-08-06 格式:PPT 页数:56 大小:506.81KB
返回 下载 相关 举报
大学C程序设计教程.ppt_第1页
第1页 / 共56页
大学C程序设计教程.ppt_第2页
第2页 / 共56页
大学C程序设计教程.ppt_第3页
第3页 / 共56页
大学C程序设计教程.ppt_第4页
第4页 / 共56页
大学C程序设计教程.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《大学C程序设计教程.ppt》由会员分享,可在线阅读,更多相关《大学C程序设计教程.ppt(56页珍藏版)》请在金锄头文库上搜索。

1、大学大学C+程序设计教程程序设计教程西安交通大学西安交通大学计算机教学实验中心计算机教学实验中心http:/第第4章章 数组和结构体数组和结构体u本章目标本章目标掌握数组定义的规则。掌握数组定义的规则。掌握数组的初始化方法及数组元素的引用。掌握数组的初始化方法及数组元素的引用。掌握有关数组的基本算法。掌握有关数组的基本算法。掌握字符串处理函数的应用。掌握字符串处理函数的应用。掌握结构体定义和使用的规则掌握结构体定义和使用的规则学会使用学会使用VC+6.0开发环境中的开发环境中的Debug调试功能:调试功能:单步执行、设置断点、观察变量值。单步执行、设置断点、观察变量值。1授授 课课 内内 容容

2、 u4.1 数组数组u4.2 字符型数组和字符串处理库函数字符型数组和字符串处理库函数u4.3 结构体类型结构体类型 u4.4 数组数组和结构体和结构体u4.5 构体嵌套构体嵌套 u程序设计举例程序设计举例u调试技术调试技术24.1、数组、数组u迄今为止,我们使用的都是属于基本迄今为止,我们使用的都是属于基本类型类型(整型、字符型、实型整型、字符型、实型)的数据,的数据,c语言还提供了构造类型的数据,它们语言还提供了构造类型的数据,它们有:数组类型、结构体类型、共用体有:数组类型、结构体类型、共用体类型。类型。u构造类型数据是由基本类型数据按一构造类型数据是由基本类型数据按一定规则组成的,因此

3、有的书称它们为定规则组成的,因此有的书称它们为“导出类型导出类型”。3问题的引出:问题的引出:u实际应用的程序设计中,只用几个变量的情况是极实际应用的程序设计中,只用几个变量的情况是极少的;更多的情况是处理大批量的相同类型或不同少的;更多的情况是处理大批量的相同类型或不同类型的数据。类型的数据。u相同类型数据举例:统计交大相同类型数据举例:统计交大15,000学生英语学生英语4级级统考成绩;统考成绩;u不同类型数据举例:管理交大不同类型数据举例:管理交大15,000学生学籍信学生学籍信息记录,包括:姓名、学号、出生日期、班级、各息记录,包括:姓名、学号、出生日期、班级、各科成绩等。科成绩等。u

4、用什么样的数据结构来描述这类应用更简洁?用什么样的数据结构来描述这类应用更简洁?4一维数组一维数组u常用于处理大批量数据;常用于处理大批量数据;u数据特点:存在内在联系;数据特点:存在内在联系;u数组数组具有相同数据类型的变量集合;具有相同数据类型的变量集合;u这些变量都有相同名字,但下标不同;这些变量都有相同名字,但下标不同;u称这些变量为数组元素;称这些变量为数组元素;u只有一个下标只有一个下标一维数组;一维数组;u有两个下标有两个下标二维数组二维数组例如:例如: int array10;5一维数组定义一维数组定义u数组是具有一定顺序关系的若干变量数组是具有一定顺序关系的若干变量的集合体,

5、组成数据的变量称为该数的集合体,组成数据的变量称为该数组的元素变量,简称元素。组的元素变量,简称元素。u一维数组的定义方式为一维数组的定义方式为:类型说明符类型说明符 数组名常量表达式数组名常量表达式u 例如:例如: int a10;u它表示数组名为它表示数组名为a,有,有10个元素。个元素。6说明说明(1) 数组名定名规则和变量名相同,遵循标识符数组名定名规则和变量名相同,遵循标识符定名规则。定名规则。(2) 数组名后是用方括弧括起来的常量表达式,数组名后是用方括弧括起来的常量表达式,不能用圆括弧,下面用法不对:不能用圆括弧,下面用法不对:int a(10);(3)方括弧中的下标表示元素在数

6、组中的位置。方括弧中的下标表示元素在数组中的位置。C语言的下标从语言的下标从0,必须是整型变量或常量。,必须是整型变量或常量。(4)编译系统处理数组说明语句时,为它在内存编译系统处理数组说明语句时,为它在内存中分配一定的存储空间,数组在内存中存储时,中分配一定的存储空间,数组在内存中存储时,按下标递增的顺序连续存储各元素的值。按下标递增的顺序连续存储各元素的值。7一维数组的初始化一维数组的初始化u(1) 在定义数组时对数组元素赋以初在定义数组时对数组元素赋以初值。值。例如例如:int a10=0,1,2,3,4,5,6,7,8,9;u(2) 可以只给一部分元素赋值。例如可以只给一部分元素赋值。

7、例如:int a10=0,1,2,3,4;u定义定义a数组有数组有10个元素,但花括弧内只个元素,但花括弧内只提供提供5个初值,这表示只给前面个初值,这表示只给前面5个元个元素赋初值,后素赋初值,后5个元素值为个元素值为0。8u(3) 如果想使一个数组中全部元素值如果想使一个数组中全部元素值为为0,可以写成,可以写成int a10=0,0,0,0,0,0,0,0,0,0;u不能写成不能写成 int a10=0*10;9u(4) 在对全部数组元素赋初值时,可在对全部数组元素赋初值时,可以不指定数组长度。例如以不指定数组长度。例如:int a5=1,2,3,4,5;u可以写成可以写成 int a=

8、1,2,3,4,5;u在第二种写法中,花括弧中有在第二种写法中,花括弧中有5个数,个数,系统就会据此自动定义系统就会据此自动定义a数组的长度为数组的长度为5。10一维一维数组初始化数组初始化u例:例:int A5; 在内存存储如图在内存存储如图u数组的首地址是数组名数组的首地址是数组名Au数组的首地址也是第一个元素的地址数组的首地址也是第一个元素的地址&A0uC+语言中,数组的整体不能参加数据处理,参加语言中,数组的整体不能参加数据处理,参加处理的只能是数组中的元素变量。所以要对数组进处理的只能是数组中的元素变量。所以要对数组进行行初始化初始化。u例如:例如:int data5=,4,8,;赋

9、值如图赋值如图A0A1A2A3 A411例例4-1u题目:给一维数组题目:给一维数组x输入输入10个整数,找出个整数,找出x数数组中的最大数和最小数。组中的最大数和最小数。u算法分析:算法分析:u1、假设数组中第、假设数组中第1个元素最大,个元素最大,令令xmax=a0u2、将、将ai(0= i n)与)与max进行比较,进行比较,若若ai xmax ,i=i+1,再执行再执行2否则,令否则,令xmax=ai,i=i+1,再执行再执行2u3、循环结束,求出最大元素并输出、循环结束,求出最大元素并输出max。输入输入2 1 7 3 12 4 9输出输出max=1212/ Example 4-1:

10、#include int main() int array7;coutPlease input an array with seven elements: endl;for(int i=0; iarrayi;int big = array0;for(int j=0; jbig) big = arrayj;coutmax=bigendl;return 0;13二维数组二维数组u定义格式:定义格式: ;u例如,三个学生四门课程成绩数据如下例如,三个学生四门课程成绩数据如下: 85 87 93 88 86 90 95 89 78 91 82 95u利用二维数组存放这些数据更能表现数据之利用二维数组存

11、放这些数据更能表现数据之间相互联系的特征。每一行数据表示该学生间相互联系的特征。每一行数据表示该学生的各门课程的成绩,而每一列数据表示该门的各门课程的成绩,而每一列数据表示该门课程各学生的成绩。该数组定义为:课程各学生的成绩。该数组定义为: int matrix34;14二维数组存储结构二维数组存储结构u逻辑结构:逻辑结构:u 二维数组恰似一张表格(或矩阵)。数组元素中的二维数组恰似一张表格(或矩阵)。数组元素中的第一个下标值表示该元素在表格中的行号,第二个第一个下标值表示该元素在表格中的行号,第二个下标为列号。下标为列号。 M33具有如下逻辑结构:具有如下逻辑结构: M00 M01 M02

12、M10 M11 M12 M20 M21 M22u存贮结构:存贮结构: 二维数组在内存中按一维数组存放、占据一片连续的存二维数组在内存中按一维数组存放、占据一片连续的存贮单元;是贮单元;是“按行顺序按行顺序”在内存中分配存贮单元。在内存中分配存贮单元。15二维数组初始化二维数组初始化 u1按照二维数组元素的物理存储次序按照二维数组元素的物理存储次序给所有或部分数组元素提供数据值给所有或部分数组元素提供数据值int score34= 85,87,93,88,86,90,95,89,78,91,82,95;u/给数组给数组stu_score每个元素都提供初每个元素都提供初值值ufloat matri

13、x23= 1.0,3.0;u/仅为数组仅为数组matrix的前个元素提供的前个元素提供初值初值 16u2以行结构方式提供各数据值以行结构方式提供各数据值 int score34= 85,87,93,88, 86,90,95,89, 78,91,82,95 ; 174.2 字符型数组和字符串处理库字符型数组和字符串处理库函数函数u字符串用双引号括起来,例如,字符串用双引号括起来,例如,”abc”;u用字符型数组存放字符串,存放时,用字符型数组存放字符串,存放时,在有效字符后自动加在有效字符后自动加0;u称称0为空值,是字符串结束标志;为空值,是字符串结束标志;u有效字符的个数称为字符串长度。有效

14、字符的个数称为字符串长度。u例如,例如,”abc”的长度为的长度为3,但占,但占4个字个字节节u (0占一位)占一位) 。18字符型数组的定义和初始化字符型数组的定义和初始化char weekday 7= MONDAY;char weekday 7= MONDAY;u字符串的输入与输出字符串的输入与输出char name20;cinname;cin.get(name, n);/第一个是字符数组变量,第二个指定向这个第一个是字符数组变量,第二个指定向这个变量变量/中读入几个字符中读入几个字符 coutname; 19例例4-2 字符串的输入与输出字符串的输入与输出u输入和输出输入和输出Pleas

15、e input a name with blank(within 19 characters):Cong ZhenPlease input the name againCong Zhen20例例4-2 源程序源程序 #include int main() char name120, name220;coutPlease input a name with blank(within 19 characters): endl;cin.get(name1, 20);coutPlease input the name againname2;coutUsing function get, the nam

16、e storing in the variable is: name1endl;coutUsing operater , the name storing in the variable is: name2endl;return 0;21字符串处理库函数字符串处理库函数u需要添加需要添加#include stpcpy(): 字符串拷贝字符串拷贝;strcat(): 字符串连接字符串连接;strchr(): 在字符串中查找字符在字符串中查找字符;strcmp(): 字符串比较字符串比较;strlen(): 求字符串长度求字符串长度;strlwr(): 将字符串中的大写字母转换为小写字母将字符串中

17、的大写字母转换为小写字母;strrev(): 反转字符串反转字符串;strstr(): 在字符串中查找另一个字符串在字符串中查找另一个字符串;strupr(): 将字符串中的小写字母转换为大写字母将字符串中的小写字母转换为大写字母;22例例4-3u编写一个用来计算字符串长度的函数编写一个用来计算字符串长度的函数mystrlen(),并用主函数验证,并用主函数验证 u算法分析:算法分析:u1)设一个计数器变量)设一个计数器变量len=0u2)从数组从数组slen第一个元素开始进行处理第一个元素开始进行处理u3)若当前的元素)若当前的元素值值slen非空(非空(0),),则则len+1,继续执行继

18、续执行3;否则,退出循环。;否则,退出循环。u4)打印结果)打印结果len23程序逻辑功能框图程序逻辑功能框图len = 0strnlen=len+1打印结果打印结果lenstrlen=0?是是否否24/ Example 4-3:求字符串的长度:求字符串的长度u#include u/计算字符串的长度的函数计算字符串的长度的函数uint mystrlen(char string)uu int len = 0;u while(stringlen!=0)u len = len+1;u return len;u25/测试计算字符串长度的主函测试计算字符串长度的主函数数int main()char st

19、ring100; int len = 0;coutPlease input a string (within 99 characters): string;coutThe length of the string is:mystrlen(string)endl;return 0;输入输入china输出输出The length of the string is:5264.3 结构体类型结构体类型u迄今为止,已介绍了基本类型迄今为止,已介绍了基本类型(或称简单类或称简单类型型)的变量的变量(如整型、实型、字符型变量等如整型、实型、字符型变量等),也介绍了一种构造类型数据,也介绍了一种构造类型数据数

20、组,数数组,数组中的各元素是属于同一个类型的。组中的各元素是属于同一个类型的。u但是只有这些数据类型是不够的。有时需要但是只有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据以便于引用。这些组合在一个整体中的数据是互相联系的。是互相联系的。27u例如,工人工资单:姓名、单位、编号例如,工人工资单:姓名、单位、编号.u例如,学生成绩单:学号、姓名、性别、各例如,学生成绩单:学号、姓名、性别、各科成绩等科成绩等u这些项都与某一学生相联系。这些项都与某一学生相联系。u可以看到性别可以看到性别(sex)、年

21、龄、年龄(age)、成绩、成绩(score)、地址、地址(addr)是属于学号为是属于学号为10010和和名为名为“Li Fun”的学生的。的学生的。u如果将如果将num、name、sex、age、score、addr分别定义为互相独立的简单变量,难以分别定义为互相独立的简单变量,难以反映它们之间的内在联系。反映它们之间的内在联系。284.3.1 结构体类型的定义结构体类型的定义u 结构体作为一种数据构造类型,在结构体作为一种数据构造类型,在C 语言程序中也许需要经历定义语言程序中也许需要经历定义声明声明调用的过程。调用的过程。u结构体是由不同的数据类型的数据组结构体是由不同的数据类型的数据组

22、成的。组成结构体的每个数据成为该成的。组成结构体的每个数据成为该结构体的成员项简称成员。结构体的成员项简称成员。u在程序使用结构体时,首先要对结构在程序使用结构体时,首先要对结构体进行描述,这称为结构体的定义。体进行描述,这称为结构体的定义。294.3.1 结构体类型的定义结构体类型的定义struct 结构名结构名 数据类型数据类型 成员名成员名1; 数据类型数据类型 成员名成员名2; 数据类型数据类型 成员名成员名n; ;struct student char name20; unsigned long number; float math; float english; float phy

23、sics;30三种结构体变量的声明三种结构体变量的声明u(1)先定义结构体类型,再定义结构体类)先定义结构体类型,再定义结构体类型变量。型变量。u例如,日期类型可以定义为例如,日期类型可以定义为u struct dateu int da_year;u char da_mon;u char da_day;u ;ustruct date yesterday,today,tomorrow; 31三种声明结构体变量的方式三种声明结构体变量的方式(2)u(2)定义类型的同时声明变量。例如,)定义类型的同时声明变量。例如,u struct dateu u int da_year;u char da_mon

24、;u char da_day;u yesterday, today, tomorrow;u声明了声明了3个日期类型的变量:个日期类型的变量: yesterday、today和和tomorrow。32三种声明结构体变量的方式三种声明结构体变量的方式(3)u(3)直接定义结构体类型变量。例如,)直接定义结构体类型变量。例如,u struct u u int da_year;u char da_mon;u char da_day;u yesterday, today, tomorrow;u不出现结构体类型名。不出现结构体类型名。33程序设计举例程序设计举例u例例4-5 编写一个程序,实现矩阵相乘运算

25、编写一个程序,实现矩阵相乘运算 u例例4-6 编写一个用于对整型数组进行排序的编写一个用于对整型数组进行排序的程序,排序方法使用简单的交换排序法程序,排序方法使用简单的交换排序法 u例例4-7 编写一个字符串处理程序,将一个字编写一个字符串处理程序,将一个字符串之中的所有小写字母转换为相应的大写符串之中的所有小写字母转换为相应的大写字母字母 u例例4-8 使用数组编写一个统计学生课程平均使用数组编写一个统计学生课程平均分的程序分的程序 u例例4-9 使用结构体重新编写上题的程序使用结构体重新编写上题的程序 34例例4-5 实现矩阵相乘运算实现矩阵相乘运算u算法说明:算法说明:u矩阵矩阵S(Lx

26、N)和矩阵和矩阵T(NxM)相乘。相乘。uS是是L行、行、N列;列;T是是N行、行、M列。列。u要求要求:S的列数和的列数和T的行数必须相同。的行数必须相同。 35算法说明(续)算法说明(续)S = 1 0 3 2 1 1 T = 3 1 2 2 0 1 1 2 1 SxT = 1*3+0*2+3*1 1*1+0*0+3*2 1*2+0*1+3*12*3+1*2+1*1 2*1+1*0+1*2 2*2+1*1+1*1 = Rr11 r12 r13r21 r22 r23 36矩阵乘法矩阵乘法算法算法u用两重循环实现对用两重循环实现对ij的求值的求值:u for(i=0; il; i=i+1)u

27、for(j=0; in; j=j+1)u 求求ij;u其中其中“求求ij”又可以细化为又可以细化为:u ij = 0;u for(k=0; km; k=k+1)u ij ij+ikkj37/ 4-5:计算两个矩阵的乘积:计算两个矩阵的乘积#include int main()const int L=4;const int M=5;const int N=3;double aL*M=1.0, 3.0, -2.0, 0.0, 4.0,-2.0, -1.0, 5.0, -7.0, 2.0,0.0, 8.0, 4.0, 1.0, -5.0,3.0, -3.0, 2.0, -4.0, 1.0;doubl

28、e bM*N=4.0, 5.0, -1.0,2.0, -2.0, 6.0,7.0, 8.0, 1.0,0.0, 3.0, -5.0,9.0, 8.0, -6.0;double cL*N; int i, j, k;38/ 4-5:计算两个矩阵的乘积:计算两个矩阵的乘积(续)(续)for(i=0; iL; i=i+1)for(j=0; jN; j=j+1) ci*N+j = 0; for(k=0; kM; k=k+1)ci*N+j = ci*N+j +ai*M+k*bk*N+j;cout The result is c= endl;for(i=0; iL; i=i+1)for(int j=0; j

29、N; j=j+1)cout ci*N+j ;cout A(I+1),则交则交换它们的位置换它们的位置 A(I) A(I+1); u(2)对剩下的对剩下的N-1个元素个元素,再两两进行比较再两两进行比较,按按同样规则交换它们的位置同样规则交换它们的位置,经过经过N-2次比较次比较,将次最大值交换到将次最大值交换到A(N-1)的位置的位置;u(3)如法炮制如法炮制,经过经过N-1趟的趟的“冒泡处理冒泡处理”,每每趟进行趟进行N-i次的比较次的比较,全部数列有序。全部数列有序。4041/ Example 4-6:冒泡冒泡排序排序#include int main() const int COUNT=

30、16;int listCOUNT=503, 87, 512, 61, 908, 170, 897, 275,653, 426, 154, 509, 612, 677, 765, 703;for(int i=0; ii; j=j-1)if(listj-1listj)int tmp = listj-1;listj-1 = listj;listj = tmp;cout The result is : endl;for(int k=0;k16;k+)cout listk ;coutendl;return 0;42例例4-7将小写字母转换为大写字母将小写字母转换为大写字母#include int mai

31、n() char str=This is a sample;coutThe original string is: str=a & stri=z)stri = stri-a+A;i = i+1;coutAfter transform: strendl;return 0;43例例4-8 统计学生课程平均分的程统计学生课程平均分的程序序 u定义二维数组定义二维数组student65,u其中,给数组其中,给数组student前前4列元素读值,列元素读值,第第1列为学号,第列为学号,第2列到第列到第4列为门课列为门课程的成绩。第程的成绩。第5列为平均分,通过计算列为平均分,通过计算求得。求得。44/4

32、-8: 统计学生课程的平均分统计学生课程的平均分#include #definePERSON6#defineCOURSE3int main() int studentPERSONCOURSE+2;inti, j;coutPlease input data of student :endl;45 for(i=0; istudenti0;studentiCOURSE+1=0;for(j=1; jstudentij;studentiCOURSE+1=studentiCOURSE+1+studentij;studentiCOURSE+1=studentiCOURSE+1/ COURSE; 46/4-8

33、: 统计学生课程的平均分统计学生课程的平均分cout学号学号 高数高数 英语英语 体育体育 平均分平均分endl;cout-endl;for(i=0; i PERSON; i=i+1)for(j=0; j= COURSE+1; j=j+1)coutstudentijt;coutendl;return 0;47例例4-9u使用结构体重新编写上题的程序。使用结构体重新编写上题的程序。u算法算法 定义一个结构体类型定义一个结构体类型StudentType,其中包含学号、各门课,其中包含学号、各门课程成绩和平均分等数据成员,其值分程成绩和平均分等数据成员,其值分别通过输入和计算求得。别通过输入和计算求

34、得。48/Example 4-9: 统计学生课程的平均分统计学生课程的平均分#include #definePERSON6#defineCOURSE3struct StudentTypechar id10;/学号学号int scoreCOURSE;/课程成绩课程成绩int GPA;/平均分平均分;49int main() StudentType xjtuStudentPERSON;int i, j;coutPlease input data of student :endl;for(i=0; i xjtuStudenti.id;xjtuStudenti.GPA=0;50for(j=0; j x

35、jtuStudenti. scorej;xjtuStudenti. GPA = xjtuStudenti. GPA + xjtuStudenti. scorej;xjtuStudenti. GPA = xjtuStudenti. GPA / COURSE; 51cout学号学号 高数高数 英语英语 体育体育 平均分平均分endl;cout-endl;for(i=0; i PERSON; i=i+1) coutxjtuStudenti.idt;for(j=0; j COURSE; j=j+1)cout xjtuStudenti.scorejt;cout xjtuStudenti.GPAendl;

36、return 0;52Developer Studio的跟踪调试功能的跟踪调试功能u(1)Restart(快捷键:(快捷键:Ctrl+Shift+F5)u(2)Stop Debugging(快捷键:(快捷键:Shift+F5)u(3)Break Execution:u(4)Apply Code Changes(快捷键:(快捷键:Alt+F10)u(5)Show Next Statement(快捷键:(快捷键:Alt+Num *)u(6)Step Into(快捷键:(快捷键:F11)u(7)Step Over(快捷键(快捷键F10)u(8)Step Out(快捷键:(快捷键:Shift+F11)

37、u(9)Run To Cursor(快捷键:(快捷键:Ctrl+F10)53第第4区有区有6个调试器个调试器窗口窗口u(1)观察窗口()观察窗口(Watch)u(2)变量窗口()变量窗口(Variables)u(3)寄存器窗口()寄存器窗口(Register)u(4)内存窗口()内存窗口(Memory)u(5)调用栈窗口()调用栈窗口(Call Stack)u(6)汇编代码窗口()汇编代码窗口(Disassmbly)54上机练习题上机练习题1使用数组求斐波那挈数列的第使用数组求斐波那挈数列的第n项和前项和前n之和。之和。 3 矩阵相加。矩阵相加。 4输入输入10个字符到一维字符数组个字符到一维字符数组s中,将字符串中,将字符串置逆。即置逆。即s0与与s9互换,互换,s1与与8互换,互换,.,s4与与s5互换,输出置逆后的数组互换,输出置逆后的数组s。5替换加密替换加密(恺撒加密法恺撒加密法) 。 7定义一个名为定义一个名为Circle的结构体(圆),其数的结构体(圆),其数据成员是圆的外接矩形的左上角和右下角两点据成员是圆的外接矩形的左上角和右下角两点的坐标,计算该圆的面积。的坐标,计算该圆的面积。55

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号