C程序设计与训练课件第06章

上传人:仙*** 文档编号:208621486 上传时间:2023-05-11 格式:PPT 页数:42 大小:252KB
收藏 版权申诉 举报 下载
C程序设计与训练课件第06章_第1页
第1页 / 共42页
C程序设计与训练课件第06章_第2页
第2页 / 共42页
C程序设计与训练课件第06章_第3页
第3页 / 共42页
资源描述:

《C程序设计与训练课件第06章》由会员分享,可在线阅读,更多相关《C程序设计与训练课件第06章(42页珍藏版)》请在装配图网上搜索。

1、为了解决比较复杂的问题,本章介绍C语言提供的一种最简单的构造类型数组。6.1 一维数组的定义和引用一维数组的定义和引用6.2 二维数组的定义和引用二维数组的定义和引用6.3 字符数组与字符串字符数组与字符串6.4 数组应用举例数组应用举例Return第第6章章 数数 组组6.1 一一维维数组的定义和引用数组的定义和引用6.1.1 一一维数组的定义数组的定义6.1.2 一维数组元素的引用一维数组元素的引用6.1.3 一维数组元素的初始化一维数组元素的初始化6.1.4 一维数组应用举例一维数组应用举例 Return6.1.1 一维数组的定义一维数组的定义案案例例6.1 从键盘上任意输入10个整数,

2、要求按从小到大的顺序在屏幕上显示出来。排序的方法有很多,本题采用冒泡法。冒冒泡泡法法的的基基本本思思想想:通过相邻两个数之间的比较和交换,使排序码(数值)较小的数逐渐从底部移向顶部,排序码较大的数逐渐从顶部移向底部。就像水底的气泡一样逐渐向上冒,故而得名。由AnA1组成的n个数据,进行冒泡排序的过程可以描述为:(1)首先将相邻的An与An-1进行比较,如果An的值小于An-1的值,则交换两者的位置,使较小的上浮,较大的下沉;接着比较An-1与An-2,同样使小的上浮,大的下沉。依此类推,直到比较完A2和A1后,A1为具有最小排序码(数值)的元素,称第一趟排序结束。(2)然后在AnA2区间内,进

3、行第二趟排序,使剩余元素中排序码最小的元素上浮到A2;重复进行n-1趟后,整个排序过程结束。/*案例代码文件名:AL6_1.C*/*功能:从键盘上任意输入n个整数,用冒泡法按从小到大地排序,并在屏幕上显示出来。*/#include stdio.h#define NUM 10/*定义符号常量(数据个数N)*/main()int dataNUM;/*定义1个一维整型数组data*/int i,j,temp;/*定义循环变量和临时变量*/clrscr();/*库函数clrscr():清屏*/printf(Please input 10 numbers:n);for(i=0;iNUM;i+)scanf

4、(%d,&datai);/*冒泡法排序*/for(i=0;ii;j-)/*内循环:进行每趟比较*/if(datajdataj-1)/*如果dataj大于dataj-1,交换两者的位置*/temp=dataj;dataj=dataj-1;dataj-1=temp;/*输出排序后的数据*/printf(nthe result of sort:n);for(i=0;iNUM;i+)printf(%d,datai);getch();/*等待键盘输入任一字符,目的使程序暂停*/程序演示程序演示数组同变量一样,也必须先定义、后使用。一维数组是只有1个下标的数组,定义形式如下:数据类型数据类型 数组名数组名

5、常量表达式常量表达式,数组名数组名2常量表达式常量表达式2;(1)“数据类型”是指数组元素的数据类型。(2)数组名,与变量名一样,必须遵循标识符命名规则。(3)“常量表达式”必须用方括号括起来,指的是数组的元素个数(又称数组长度),它是一个整型值,其中可以包含常数和符号常量,但不能包含变量。注意注意:C语言中不允许动态定义数组语言中不允许动态定义数组。特特别别说说明明:在数组定义时,“常量表达式”外的方括号;以及元素引用时,“下标表达式”外的方括号,都是C语言语法规则所要求的,不是本书所约定的可选项的描述符号!(4)数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号。(5)

6、数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。Return 6.1.2 数组元素的引用数组元素的引用 引用数组中的任意一个元素的形式:数组名数组名下标表达式下标表达式 1“下标表达式”可以是任何非负整型数据,取值范围是0(元素个数-1)。特特别别强强调调:在运行C语言程序过程中,系统并不自动检验数组元素的下标是否越界。因此在编写程序时,保证数组下标不越界是十分重要的。21个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。3在C语言中,数组作为1个整体,不能参加数据运算,只能对单

7、个的元素进行处理。Return 6.1.3 一维数组元素的初始化一维数组元素的初始化 初始化格式:数据类型数据类型 数组名数组名常量表达式常量表达式初值表初值表(1)如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。(2)“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值。(3)根 据 存 储 类 型 的 不 同,数 组 有 静 态 数 组(static)和动态数组(auto)之分;根据定义的位置不同,数组有内部数组(在函数内部定义的数组)和外部数组(在函数外部定义的数组)之分。Retu

8、rn6.1.4 一一维数组应用举例数组应用举例 案例案例6.2 已知某课程的平时、实习、测验和期末成绩,求该课程的总评成绩。其中平时、实习、测验和期末分别占10、20、20、50。/*案例代码文件名:AL6_2.C*/*功能:从键盘上循环输入某课程的平时、实习、测验和期末成绩,按10,20,20,50的比例计算总评成绩,并在屏幕上显示出来。按空格键继续循环,其他键终止循环。*/#include“stdio.h”main()int i=1,j;char con_key=x20;/*x20 空格键的ASCII码*/float score5,ratio4=0.1,0.2,0.2,0.5;/*定义成绩

9、、比例系数数组*/while(con_key=x20)while(con_key=x20)clrscr();printf(输入第%2d个学生的成绩n,i+);printf(平时 实习 测验 期末成绩n);score4=0;/*score4:存储总评成绩*/for(j=0;j4;j+)scanf(%f,&scorej);score4+=scorej*ratioj;printf(总评成绩为:%6.1fn,score4);printf(n按空格键继续,其它键退出);con_key=getch();/*getch()函数等待从键盘上输入一个字符*/程序演示程序演示Return6.2 二二维维数组的定义

10、和引用数组的定义和引用6.2.1 二二维数组的定义数组的定义与初始化与初始化6.2.2 二维数组元素的引用二维数组元素的引用6.2.3 二维二维数组应用举例数组应用举例 Return案例案例6.3 给一个23的二维数组各元素赋值,并输出全部元素的值。/*案例代码文件名:AL6_3.C*/*功能:从键盘上给23数组赋值,并在屏幕上显示出来。*/#define Row 2#define Col 3#include stdio.hmain()int i,j,arrayRowCol;/*定义1个2行3列的二维数组array*/for(i=0;iRow;i+)/*外循环:控制二维数组的行*/for(j=

11、0;jCol;j+)/*内循环:控制二维数组的列*/printf(please input array%2d%2d:,i,j);scanf(%d,&arrayij);/*从键盘输入aij的值*/printf(n);/*输出二维数组array*/for(i=0;iRow;i+)6.2.1 二维数组的定义二维数组的定义 for(j=0;jCol;j+)printf(%dt,arrayij);/*将aij的值显示在屏幕上*/printf(n);getch();程序演示程序演示二维数组的定义方式如下:数据类型数据类型 数组名数组名行常量表达式行常量表达式列常量表达式列常量表达式,数组名数组名2行常量表

12、达式行常量表达式2列常量表达式列常量表达式2;1数组元素在内存中的排列顺序为“按行存放”,即先顺序存放第一行的元素,再存放第二行,以此类推。2.设有一个m*n的数组x,则第i行第j列的元素xij在数组中的位置为:i*n+j(注意注意:行号、列号均从0开始计数)。3可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,对x32,可以把x看作是一个一维数组,它有3个元素:x0、x1、x2,每个元素又是一个包含2个元素的一维数组,如图6-4所示。即把x0、x1、x2看作是3个一维数组的名字。Return6.2.2 二二维数组元素的引用数组元素的引用引用二维数组元素的形式为:数组名数

13、组名行下标表达式行下标表达式列下标表达式列下标表达式1“行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量。2“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内。假设有数组x34,则可用的行下标范围为02,列下标范围为03。3对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的二维数组元素。Return6.2.3 二二维数组元素的初始化数组元素的初始化1按行赋初值数数据据类类型型 数数组组名名行行常常量量表表达达式式列列常常量量表表达达式式第第0行行初初值值表表,第第1行初值表行初值表,最后最后1行初值表行初值表;赋值规则:将“第0行初值表”中的数据,依次赋

14、给第0行中各元素;将“第1行初值表”中的数据,依次赋给第1行各元素;以此类推。2按二维数组在内存中的排列顺序给各元素赋初值数据类型数据类型 数组名数组名行常量表达式行常量表达式列常量表达式列常量表达式初值表初值表;赋值规则:按二维数组在内存中的排列顺序,将初值表中的数据,依次赋给各元素。如果对全部元素都赋初值,则“行数”可以省略。注意注意:只能省略“行数”。Return6.2.4 二维数组应用举例二维数组应用举例 案例案例6.4 有M个学生,学习N门课程,已知所有学生的各科成绩,编程:分别求每个学生的平均成绩和每门课程的平均成绩。/*案例代码文件名:AL6_4.C*/*功能:计算个人平均成绩与

15、各科平均成绩,并在屏幕上显示出来。*/#define NUM_std 5/*定义符号常量人数为5*/#define NUM_course 4/*定义符号常量课程为4*/#include stdio.hmain()int i,j;static float scoreNUM_std+1NUM_course+1=78,85,83,65,88,91,89,93,72,65,54,75,86,88,75,60,69,60,50,72;for(i=0;iNUM_std;i+)for(j=0;jNUM_course;j+)scoreiNUM_course+=scoreij;/*求第i个人的总成绩*/scor

16、eNUM_stdj+=scoreij;/*求第j门课的总成绩*/scoreiNUM_course/=NUM_course;/*求第i个人的平均成绩*/for(j=0;jNUM_course;j+)scoreNUM_stdj/=NUM_std;/*求第j门课的平均成绩*/clrscr();/*输出表头*/printf(学生编号 课程1 课程2 课程3 课程4 个人平均n);/*输出每个学生的各科成绩和平均成绩*/for(i=0;iNUM_std;i+)printf(学生%dt,i+1);for(j=0;jNUM_course+1;j+)printf(%6.1ft,scoreij);printf(

17、n);/*输出1条短划线*/for(j=0;j8*(NUM_course+2);j+)printf(-);printf(n课程平均);/*输出每门课程的平均成绩*/for(j=0;jNUM_course;j+)printf(%6.1ft,scoreNUM_stdj);printf(n);getch();程序演示程序演示Return6.3 字符数组与字符串字符数组与字符串6.3.1 字符数组的定义与初始化字符数组的定义与初始化 6.3.2 字符数组的元素引用字符数组的元素引用6.3.3 字符串与字符串与printf、scanf函数函数6.3.4 gets、puts函数函数6.3.5 常用字符串处

18、理函数常用字符串处理函数6.3.6 字符串应字符串应用举例用举例Return6.3.16.3.1字符数组定义字符数组定义 字符数组定义字符数组定义 数据类型是char的数组称之为字符数组,其定义方法与前面介绍的其他类型数组的定义方法完全相同。例如:char c10;定义了长度为10的字符数组c,每个元素都可存放一个字符。字符数组也可以是二维或多维数组。例如:char d55;定义了5行5列的二维字符数组d。字符数组的初始化字符数组的初始化字符数组也允许在定义时初始化。初始化的方法与前面介绍的其他类型数组初始化相同。可以通过为每个数组元素指定初值字符来实现。char c10=c,p,r,o,g,

19、r,a,m;char num5=,1,1,2,1,1,2,3,2,1,1,2,1,1,;6.3.2 字符数组的引用字符数组的引用(1)字符数组的输入 除了可以通过初始化使字符数组各元素得到初值外,也可以使用getchar()或scanf()函数输入字符。例如:char str10;for(i=0;i10;i+)scanf(%c,&stri);fflush(stdin);/*清除键盘输入缓冲区*/(2)字符数组的输出 字符数组的输出,可以用putchar()或printf()函数。例如:char str10=c language;for(i=0;i10;i+)printf(%c,stri);pr

20、intf(n);注意:逐个字符输入、输出时,要指出元素的下标,而且使用“%c”格式符。另外,从键盘上输入字符时,无需输入字符的定界符单引号;输出时,系统也不输出字符的定界符。Return案例案例6.6 字符数组的整体输入与输出。/*案例代码文件名:AL6_6.C*/*功能:将二维字符数组进行初始化,并在屏幕上输出*/main()int i;char name59=张三山,李四季,王五魁,刘六顺,赵七巧;for(i=0;i5;i+)printf(n%st,namei);/*namei代表该行数组元素的首地址*/getch();程序演示 6.3.3字符串与字符串与printfprintf、scan

21、fscanf函数函数 在语言中用char字符类型数组来存放字符串。因此字符数组既可以存放字符,也可以存放字符串。字符串总是以0作为串的结束标识。或者说以0结束的字符称为字符串。(a)0的机内存储 (b)0的机内存储printf函数输出字符串printf()函数,不仅可以逐个输出字符数组元素,还可以整体输出存放在字符数组中的字符串。#include int main()char c=C program;printf(%sn,c);return 0;Returnscanf函数输入字符串 除了可以通过初始化使字符数组各元素得到初值外,也可以使用scanf()函数输入字符串。#include int

22、main()char st15;printf(输入字符串:n);scanf(%s,st);printf(%sn,st);return 0;输入字符串:this is a book输出为:thisscanf函数不接收空格、换行、Tab等空白符2gets()函数函数gets函数用来从标准输入设备(键盘)接收字符串,直到接收到换行符结束,并把换行符改成结束标识0存入字符串。其调用格式为:gets(s);但gets 函数可以接收除换行符之外的所有字符。6.3.4 gets、puts函数函数#include int main()char s20;printf(输入字符串:n);gets(s);/输入th

23、is is a book printf(%sn,s);return 0;puts()函数函数把字符数组中所存放的字符串,输出到标准输出设备中去,并用n取代字符串的结束标志0 调用方式:puts(字符数组)#includeint main()char s20;printf(输入字符串:n);gets(s);/输入this is a book puts(s);/输出this is a bookreturn 0;1.字符串连接函数字符串连接函数strcat()(1)调用方式:strcat(字符数组,字符串)(2)函数功能:把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数

24、组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。(3)使用说明 1)由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则,会因长度不够而产生问题。2)连接前两个字符串都有结束标志0,连接后“字符数组”中存储的字符串的结束标志0被舍弃,只在目标串的最后保留一个0。6.3.5 常用字符串处理函数常用字符串处理函数2字符串拷贝函数字符串拷贝函数strcpy()(1)调用方式:strcpy(字符数组,字符串)其中“字符串”可以是串常量,也可以是字符数组。(2)函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被

25、覆盖。(3)使用说明1)字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志0一起复制。2)不能用赋值运算符“”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。3字符串比较函数字符串比较函数strcpy()/*案例代码文件名:AL6_7.C*/*功能:简单密码检测程序*/#include stdio.hmain()char pass_str80;/*定义字符数组passstr*/int i=0;/*检验密码*/while(1)clrscr();printf(请输入密码n);gets(pass_str);/*输入密码*/if(strcmp(pass_st

26、r,“password”)!=0)/*口令错*/printf(口令错误,按任意键继续);else break;/*输入正确的密码,中止循环*/getch();i+;if(i=3)exit(0);/*输入三次错误的密码,退出程序*/*输入正确密码所进入的程序段*/程序演示4求字符串长度函数求字符串长度函数strlen()(1)调用方式:strlen(字符串)(2)函数功能:求字符串(常量或字符数组)的实际长度(不包含结束标志)。5将字符串中大写字母转换成小写将字符串中大写字母转换成小写strlwr()函数函数(1)调用方式:strlwr(字符串)(2)函数功能:将字符串中的大写字母转换成小写,其

27、它字符(包括小写字母和非字母字符)不转换。6将字符串中小写字母转换成大写将字符串中小写字母转换成大写strupr()函数函数(1)调用方式:strupr(字符串)(2)函数功能:将字符串中小写字母转换成大写,其它字符(包括大写字母和非字母字符)不转换。Return6.3.6字符串应用举例字符串应用举例输入一字符串和一个字符,要求将字符串中出现的该字符删除。例如删除的字符是空格“”,结果如下。#include#include int main()char str100,c;int i,j;printf(输入字符串);gets(str);printf(要删除的字符);scanf(%c,&c);fo

28、r(i=j=0;stri!=0;i+)if(stri!=c)strj+=stri;strj=0;/Aprintf(输出字符串%sn,str);return 0;在二维数组Class中存放5个字符串 进行降序排序并输出#include#include#define N 5int main()char ClassN20=Chinese,Math,English,computer,electronics;char temp20;int i,j;for(i=0;iN-1;i+)for(j=0;jN-1-i;j+)if(strcmp(Classj,Classj+1)0)/以下是交换Classj和Clas

29、sj+1strcpy(temp,Classj);strcpy(Classj,Classj+1);strcpy(Classj+1,temp);for(i=0;iN;i+)printf(%st,Classi);printf(n);return 0;electronics computerMathEnglishChinese 6.4 数组应用举例数组应用举例从键盘输入10个整数赋给数组a10,判断该数组元素是否对称相等,即ai 是否等于a9-i(i=04)。#include#define N 10int main()int i,aN;for(i=0;iN;i+)printf(a%d=,i);scan

30、f(%d,&ai);for(i=0;i=N/2)printf(是对称数组n);elseprintf(不是对称数组n);return 0;统计字符串str中单词的数量、最长单词的字母数、最短单词字母数。单词之间至少有一个空格。假设字符串中最长单词不超过20个字母,并且str中最后一个符号不是字母。分析:程序中是这样判断一个单词的:如果第i个字符不是字母,第i-1个字符是字母,则表示一个单词刚结束,单词数+1。由于题设最长单词的字母数不超过20,所以最短单词的长度初始值为20。最长单词的长度初始值为0(因为最短单词长度大于0)。#include#include int main()int i,le

31、n=0;int numofword,maxlen,minlen;char str1000=Robots can feel happy,sad,angry,drowsy,hungry or fearful.They also have various personalities.;numofword=0;maxlen=0;minlen=20;for(i=0;stri!=0;i+)if(!isalpha(stri)&isalpha(stri-1)maxlen=lenmaxlen?len:maxlen;minlen=lenminlen?len:minlen;len=0;numofword+;else if(isalpha(stri)len+;printf(单词=%d个,最长=%d个字母,最短=%d个字母n,numofword,maxlen,minlen);return 0;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!