《大学课件组数》_第1页
《大学课件组数》_第2页
《大学课件组数》_第3页
《大学课件组数》_第4页
《大学课件组数》_第5页
已阅读5页,还剩135页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

例题:输入一个任意位数整数,求出每位上的数字,从高位向低位输出。/*若由低位向高位输出:*/#include"stdio.h"#include"conio.h"voidmain(){longx;textmode(C40);clrscr();printf("inputaninterger:");scanf("%ld",&x);do{printf("%d,",x%10);x=x/10;}while(x!=0);printf("\b");getch();}将求出的每一位数字输出

变量?多个数组保存?编辑课件例题:输入一个任意位数整数,求出每位上的数字,从高位向低位输1第六章数组本章重点:1、一维数组、二维数组的定义、初始化以及数组元素的引用。2、字符串以及字符串数组3、字符串处理函数本章难点:1、数组名是整个数组的首地址。2、直接引用和间接引用编辑课件第六章数组本章重点:1、一维数组、二维数组的定义、初始化2主要内容第一节一维数组的定义和引用第二节字符数组第三节二维数组的定义和引用编辑课件主要内容第一节一维数组的定义和引用第二节字符数组第三节3引言构造类型:由基本类型的数据按照一定的规则组合而成。C语言中的构造类型数组结构体共用体(本章内容)(第十章内容)数组:一组变量。★具有相同的数据类型★在内存中占有连续的内存单元★具有相同的名称(数组名),但有不同的下标每一个称为一个数组元素。用统一的数组名称和不同的下标来唯一的标识数组中的每一个元素。唯一确定数组元素在数组中的顺序的整数值编辑课件引言构造类型:由基本类型的数据按照一定的规则组合而成。C语言46.1一维数组的定义和引用一维数组:数组中的每个元素只带有一个下标,即仅由一个下标值就能确定数组元素位置和顺序的数组。因此,在逻辑上,可以把一维数组中的所有元素看作是排成一行的,所以也把一维数组称为“行数组”。编辑课件6.1一维数组的定义和引用一维数组:数组中的每个元素只带有5一、定义:形式:类型名数组名[常量表达式]注:1)类型名:数组中的元素的类型(如intchar等)2)数组名的命名规则同前面的变量的命名规则。3)常量表达式:表示数组中数组元素的个数,即数组的长度。

不允许为变量,既不允许对数组做动态定义。数组的大小一旦定义即已固定。例如:定义一个包含3个元素的整型数组a:int例如:定义一个包含20个元素的字符型数组c:charc[20];[3];a例:inta[3],b[5],c[10];一个定义中,可以同时说明多个相同类型的数组。例:charc,s[30];普通变量和数组可以出现在同一个定义中。编辑课件一、定义:形式:类型名数组名[常量表达式]注:1)类型名:数6注:★

4)数组名:是一个地址常量,代表整个数组的首地址。变量的地址:一个变量所占内存中第一个字节的地址。……2000H2001H2002H2003H2004Hintx;xprintf(“%x”,&x);输出结果为:2000一个变量名与一个地址值所标明的存储区域相对应。编辑课件注:变量的地址:一个变量所占内存中第一个字节的地址。……207注:★

4)数组名:是一个地址常量,代表整个数组的首地址。例如:inta[3];……3000H3001H3002H3003H3004H3005H3006H数组a所占的内存printf(“%x”,a);输出结果为:3000a的值

a+1的值是多少?3002注:对地址进行增减运算,移动的最小单位是一个存储单元而不一定是一个字节,具体由数组元素的类型决定。

?编辑课件注:例如:inta[3];……3000H3001H3008例如:main()

{inta[10];printf(“%x”,a);printf(“%x”,a+9);}如果第一个输出语句的结果为194,则第二个输出语句的结果为(

)194+18212(十六进制)(十进制)XX194+12206X1a6√1a6编辑课件例如:main()

{inta[10];如果第一个输出语句9二、引用补充内容:直接引用和间接引用直接引用:通过变量名来对内存单元进行存取操作的。此前我们对变量的操作都是直接引用。2000H2001H2002H2003H2004H……intx;xx=3;3printf(“%d”,x);输出3编辑课件二、引用补充内容:直接引用和间接引用直接引用:通过变量名来对10间接引用:将变量(假设为i)的地址存放在另一个变量(假设为p)中,要存取变量i的值,可以先找到存放i地址的变量p,从p中取出i的地址,然后根据这个地址进行存放。这种由一个变量得到另一个变量的地址,再通过得到的这个地址完成对存储单元访问的方法,成为对内存的“间接访问”,或者“间接引用”。inti=3;2000H2001H……3……变量p的空间2000H编辑课件间接引用:将变量(假设为i)的地址存放在另一个变量(假设为p11与间接引用相关的运算符:&:取某个变量的地址。例如取变量x的地址:&x*:间接引用运算符。单目运算符。出现在运算对象的左边,其运算对象是地址或者存放地址的指针变量。功能:引用相应的存储单元。inti=3;2000H2001H……32000H……变量p的空间对变量x的引用:直接引用:x间接引用:*p*(&x)第九章内容编辑课件与间接引用相关的运算符:&:取某个变量的地址。例如取变量x的12下标的范围:≤下标≤数组元素的引用:把数组中的每个元素当成普通的变量来使用,就是所谓的“数组元素的引用”。两种方法:1、直接引用:形式:数组名称[下标表达式]表达式的值必须为整数例如:inta[3];该数组中包含3个元素,分别为:★2)数组元素默认的下标值从0开始。a[0]、a[1]、a[2]注:1)下标表达式必须为整型常量或者整型的表达式。0长度-13)数组不能整体引用。如不能用a表示a[0]到a[2]3个元素。编辑课件下标的范围:≤下标≤数组元素的引用:把数组中的每个元素13(+0)2、间接引用:形式:*数组元素的地址例如:inta[3];表示数组中的第一个元素:直接引用:a[0]间接引用:*a表示数组中的第二个元素:直接引用:a[1]间接引用:*(a+1)表示数组中的第三个元素:直接引用:a[2]间接引用:*(a+2)编辑课件(+0)2、间接引用:形式:*数组元素的地址例如:int14课程回顾1、定义一个具有10个元素的浮点型的数组f,应使用的语句为:

。floatf[10];2、若已有定义inta[10];则该数组中首元素表示为:

。未元素表示为:

。a[0]a[9]3、若有一个数组a,则对其下标为i的元素地址表示为:或.数组元素的引用表示为:或.&a[i]a+ia[i]*(a+i)编辑课件课程回顾1、定义一个具有10个元素的浮点型的数组f,应使用的15main()

{inta[10];

}例题://给10个元素分别赋值为01234……9a[0]=0;a[1]=1;a[2]=2;……a[9]=9;iia[i]=i;for(i=0;i<10;i++)a[i]=i;//输出数组的10个元素printf(“%3d”,a[0]);129ifor(i=0;i<10;i++)printf(“%3d”,a[i]);//倒序输出数组的10个元素for(i=9;i>=0;i--)printf(“%3d”,a[i]);*(a+i)编辑课件main()

{inta[10];例题://给10个元素分16三、一维数组的初始化1、定义时赋初值1)例:inta[3]={1,2,3};注:初值列表用大括号{}括起来,各数值间用逗号隔开。从第一个元素开始依次赋值。2)例:inta[5]={1,2,3};注:只给部分元素赋值,且为从第1个元素开始的连续的数组元素,没有赋值的元素自动取值为0。上例中,赋值后元素a[0]、a[1]、a[2]的值分别为1、2、3;a[3]、a[4]的值均为0。3)例:inta[]={1,2,3};注:对全部数组元素赋初值时,长度可以省略。系统根据初值的个数自动决定数组的长度。编辑课件三、一维数组的初始化1、定义时赋初值1)例:inta[3]174)初值的个数与数组的长度不同时,长度不可以省略初值个数(n)<长度(L):没赋值的元素自动取值为0初值个数(n)=长度(L):长度可以省略初值个数(n)>长度(L):编译时出错inta[3]={1,2,3,4}X编辑课件4)初值的个数与数组的长度不同时,长度不可以省略初值个数(n182、运行时赋值(一般使用循环结构)1)用赋值符号=例如:inta[10];例如:inta[10];//给10个元素赋值0到100之间的随机数for(i=0;i<10;i++)a[i]=random(101);2)用输入函数//输入10个数分别给10个元素赋值for(i=0;i<10;i++)scanf(“%d”,);&a[i]或者:a+i编辑课件2、运行时赋值(一般使用循环结构)1)用赋值符号=例如:in19例题:输入一个任意位数整数,求出每位上的数字,从高位向低位输出。/*若由高位向底位输出:*/#include"stdio.h"voidmain(){longx;clrscr();printf("inputaninterger:");scanf("%ld",&x);do{printf("%d,",x%10);x=x/10;}while(x!=0);}/*用一个数组来保存每一位上的数字*/inta[20];,nx%10;=a[n]n=0;n++;/*输出a数组中的数据*/printf(“%d,”,a[i]);for()i=n-1;i>=0;i--chp6\interger.c编辑课件例题:输入一个任意位数整数,求出每位上的数字,从高位向低位输20如果分别用max,min,aver表示3个成绩,则该如果定义?如何存储?如何存储?如何存储?答:普通变量例题1:输入10名同学的成绩,统计其中的最高分、最低分和平均分。#include<stdio.h>voidmain()

{

}如何存储?答:数组如果成绩为浮点型数据,该数组如果定义?floatscore[10];floatmax,min,aver;编辑课件如果分别用max,min,aver表示3个成绩,则该如果定义21max=score[0];for(i=1;i<10;i++){if(score[i]>max)max=score[i];}voidmain()

{floatscore[10];floatmax,min,aver;}如何输入10个成绩?for(i=0;i<10;i++)scanf(“%f”,);&score[i]inti;如何求最高分,将其保存在max中?如何求最高分,将其保存在min中?min=score[0];for(i=1;i<10;i++){if(score[i]<min)min=score[i];}如何求平均分,并保存在aver中?,sum;sum=score[0];for(i=1;i<10;i++){sum=sum+score[i];}aver=sum/10;printf(最高分:%.1f,最低分:%.1f,平均分:%.1f\n”,max,min,aver);如何将结果输出?编辑课件max=score[0];voidmain()

{floa22score[0]65.5score[1]70.0score[2]60.3score[3]80.0score[4]95.3score[5]45.5score[6]69.5score[7]86.5score[8]78.0score[9]82.5如何求最高分,将其保存在max中?max=score[0];if(score[1]>max)max=score[1];if(score[2]>max)max=score[2];if(score[3]>max)max=score[3];……if(score[9]>max)max=score[9];if(score[i]>max)max=score[i];{}for(i=1;i<10;i++)minmin<minmin低编辑课件score[0]65.5score[1]70.0score[23score[0]65.5score[1]70.0score[2]60.3score[3]80.0score[4]95.3score[5]45.5score[6]69.5score[7]86.5score[8]78.0score[9]82.5如何求总分,将其保存在sum中?sum=score[0];sum=sum+score[1];……sum=sum+score[2];sum=sum+score[3];sum=sum+score[9];{}for(i=1;i<10;i++)sum=sum+score[i];编辑课件score[0]65.5score[1]70.0score[24练习:找出数组a[5]中的最大值并输出。#include“stdio.h”voidmain()

{}定义一个具有5个元素的整型数组a?inta[5];,max,i输入5个整数分别给数组的5个元素赋值?for(i=0;i<5;i++)scanf(“%d”,&a[i]);求5个元素中的最大值?max=a[0];if(max<a[i])max=a[i];for(i=1;i<5;i++){}输出最大元素的值?printf(“maxis%d\n”,max);求5个元素中的最大值?编辑课件练习:找出数组a[5]中的最大值并输出。#include“25#include“stdio.h”voidmain()

{inta[5],i,max;for(i=0;i<5;i++)scanf(“%d”,&a[i]);max=a[0];for(i=1;i<5;i++){if(max<a[i])max=a[i];}printf(“最大数的下标是%d\n”,max);}练习:找出数组a[5]中的最大元素的下标并输出。0a[max]i如何将最大的元素放在最后位置?将下标为max的元素和最后元素交换!,t;t=a[max];a[max]=a[4];a[4]=t;引申作业:用选择法对10个整数进行升序排序。编辑课件#include“stdio.h”练习:找出数组a[5]中26/*max1.c*/#include"stdio.h"voidmain(){inta[5],max,i;for(i=0;i<5;i++)scanf("%d",&a[i]);max=a[0];for(i=1;i<5;i++){if(max<a[i])max=a[i];}printf("maxis%d:\n",max);}输出最大元素的值!将最大的元素放在数组的最后?a[4]将数组中的元素按由小到大排序?下一页编辑课件/*max1.c*/输出最大元素的值!将最大的元素放在数组的27/*max1.c*/#include"stdio.h"voidmain(){inta[5],max,i;for(i=0;i<5;i++)scanf("%d",&a[i]);max=a[0];for(i=1;i<5;i++){if(max<a[i])max=a[i];}printf("maxis%d:\n",max);}输出最大元素的值!将最大的元素放在数组的最后?for(i=0;i<4;i++){if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}a[4]将数组中的元素按由小到大排序?下一页编辑课件/*max1.c*/输出最大元素的值!将最大的元素放在数组的2884950假设数组元素的值分别赋值为:a[5]={9,8,4,5,0,2};98450第一次89450第二次第三次84590第四次84509结果:把最大的数放到最后一个元素。if()a[i]a[i+1]>t=a[i];a[i]=a[i+1];a[i+1]=a[i];/*交换a[i]和a[i+1]的值*/for(i=0;i<4;i++)}{上一页编辑课件8假设数组元素的值分别赋值为:a[5]={9,8,4,5,029/*将5个元素中的最大值放在最后*/for(i=0;i<4;i++){if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}/*将4个元素中的最大值放在最后*/for(i=0;i<?;i++){if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}3/*将3个元素中的最大值放在最后*/for(i=0;i<2;i++){if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}/*将2个元素中的最大值放在最后*/for(i=0;i<1;i++){if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}/*将n个元素中的最大值放在最后*/for(i=0;i<n-1;i++){if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}/*将5个元素按降序排序*/{}for()j=1;j<5;j++?5-j起泡法排序编辑课件/*将5个元素中的最大值放在最后*//*将4个元素中的最大值30起泡法排序:与起泡从水中往上冒的情况有些类似。具体做法:先将第一个数a[0]与第2个数a[1]进行比较,如果a[0]>a[1],则将两个数进行交换,否则保持原顺序不变。然后比较a[1]和a[2],依此类推,直到第n-1个元素与第n个元素比较,这称为一趟起泡。这一趟最明显的效果是将最大的数据排到了最后。然后对前n-1个数据进行同样的操作,则具有次大值的数被排在第n-1的位置上,重复以上操作直到所有元素按顺序排列。编辑课件起泡法排序:与起泡从水中往上冒的情况有些类似。具体做法:先将31/*起泡法排序chp6\sort.c*/main(){inti,j,a[5]={9,8,4,5,0,2},t;clrscr();for(i=0;i<5;i++)printf("%d",a[i]);printf("\n");for(i=1;i<5;i++){for(j=0;j<5-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}for(i=0;i<5;i++)printf("%d",a[i]);}编辑课件/*起泡法排序chp6\sort.c*/编辑课件32练习:编程模拟23选5的抽奖系统。(select.c)编辑课件练习:编程模拟23选5的抽奖系统。(select.c)编辑课33849502假设已有定义:a[6]={9,8,4,5,0,2};第一趟:984502第一次894502第二次第三次845902第四次845092第五次845029for(j=0;j<5;j++)if(a[j])>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}结果:把最大的数放到最后一个元素。编辑课件8假设已有定义:a[6]={9,8,4,5,0,2};第一趟34第二趟:84502第一次48502第二次45802第三次45082第四次45028结果:把次大的数放到倒数第二个元素。for(j=0;j<4;j++)if(a[j])>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}编辑课件第二趟:8第一次4第二次4第三次4第四次4结果:把次大的数放35第三趟:4502第一次4502第二次4052第三次4025for(j=0;j<3;j++)if(a[j])>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}第四趟:402第一次042第二次024for(j=0;j<2;j++)if(a[j])>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}第五趟:02第一次02for(j=0;j<1;j++)if(a[j])>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}编辑课件第三趟:4第一次4第二次4第三次4for(j=0;j<3;j36main()

{inti,j,a[6]={9,8,4,5,0,2};}for(j=0;j<;j++)if(a[j])>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=a[j];}{}for(i=1;i<6;i++)6-ifor(i=0;i<6;i++)

printf(“%d“,a[i]);/*外层循环控制趟数*//*内层循环控制每趟的比较*/练习:编程模拟23选5的抽奖系统。(lx1.c)编辑课件main()

{inti,j,a[6]={9,8,4,5,37课程回顾1、一维数组的初始化2、一维数组中元素的引用方式和地址表示3、两种排序方法:冒泡法和选择法编辑课件课程回顾1、一维数组的初始化2、一维数组中元素的引用方式和地386.2字符数组C本身没有字符串变量,字符串的存储完全依赖于字符数组,但字符数组并不完全等价于字符串。字符数组:用来存放字符数据的数组。字符数组中的一个元素存放一个字符。一、定义:char数组名[长度]例如:charc[5]={‘c’,’h’,’i’,’n’,’a’};在内存中占5个字节a[0]a[1]a[2]a[3]a[4]china?这种定义方式正误?intc[5]={‘c’,’h’,’i’,’n’,’a’};√编辑课件6.2字符数组C本身没有字符串变量,字符串的存储完全依赖于字39二、初始化和引用方法同前面所讲的一维数组三、字符串和字符串结束标志字符串借助于字符型的一维数组来存放,并规定以‘\0’作为结束标志。‘\0’

:转义字符,称为“空值”。其ASCII码值为0.

占内存空间,但不计入字符串的长度。字符串长度:字符串结束标志之前的有效字符的个数。字符串常量:系统在末尾自动加’\0’.例如:“ABC”

的长度为3,在内存中占4个字节的空间。编辑课件二、初始化和引用方法同前面所讲的一维数组三、字符串和字符串结40每个字符串常量都分别占用内存中一串连续的存储空间。返回给系统的是字符串所占内存的首地址。编辑课件每个字符串常量都分别占用内存中一串连续的存储空间。返回给系统41字符数组与字符串的区别:字符数组的每个元素可存放一个字符,但并不限定最后一个字符是什么。在C中,有关字符串的很多操作都与字符串的结束标志有关,因此,在字符数组中的有效字符后加一个’\0’这一特定的情况下,可把这种一维数组称作“字符串”。可以说,字符串是字符数组的一种具体应用。例如:chars[]={‘A’,’B’,’C’};例如:chars[]={‘A’,’B’,’C’,’\0’};都是正确的1、一般赋值方式:在定义时逐个元素赋值例如1)chars[4]={‘A’,’B’,’C’,’\0’};2)chars[]={‘A’,’B’,’C’,’\0’};3)chars[10]={‘A’,’B’,’C’,’\0’};?这四种方式有何异同?4)chars[]={‘A’,’B’,’C’};编辑课件字符数组与字符串的区别:字符数组的每个元素可存放一个字符,但422、直接用字符串常量赋值例如:chars[]={“abc”};也可以省略大括号:chars[]=“abc”;最常使用的方式编辑课件2、直接用字符串常量赋值例如:chars[]={“abc”43四、字符串的输入输出1、输出:若有定义:charc[]=“string”;1)printf()函数①逐个字符输出:格式符%c②输出整个字符串:格式符%si=0;while(){printf(“%c”,c[i]);i++;}格式:printf(格式控制,输出的起始地址)例如1):printf(“%s”,c);结果为:stringprintf(“%s”,c+2);结果为:ringstring\0cc+2c[i]!=‘\0’编辑课件四、字符串的输入输出1、输出:若有定义:charc[]=“44例如4):charc1[]=“boy”,c2[]=“girl”;则:printf(“%s”,c1);printf(“%s”,c2);输出结果为:boygirl则:printf(“%s\n”,c1);boygirl例如2):printf(“%s”,”china”);结果为:chinaprintf(“%.2s”,”china”);结果为:chprintf(“%.2s”,”china”+2);结果为:inprintf(“%s”,”china”+2);结果为:ina例如3):charc[]={‘a’,’b’,’c’};printf(“%s”,c);结果为:不确定编辑课件例如4):charc1[]=“boy”,c2[]=“gir452)puts()函数格式:puts(输出的起始地址)若有定义:charc[]=“string”;puts(c);结果为:stringputs(c+2);结果为:ring例如:charc1[]=“boy”,c2[]=“girl”;puts(c2);输出结果为:则:puts(c1);boygirl注:puts函数自动将字符串结束标志’\0’转为’\n’输出,即该函数具有自动回车换行的功能。编辑课件2)puts()函数格式:puts(输出的起始地址)若有定义461、输入:若有定义:charc[20];1)scanf()函数①逐个字符输入:格式符%c②接收整个字符串:格式符%s格式:scanf(格式控制,接收字符的起始地址)i=0;do{scanf(“%c”,&c[i]);i++;}While();例如:scanf(“%s”,c);若在程序运行中输入:china,则从第一个元素开始存放字符。例如:scanf(“%s”,c+1);若在程序运行中输入:china,则从第二个元素开始存放字符。c[i]!=‘\n’如果数组中存储一个“字符串”,而且当遇回车符结束输入,应怎样表示条件?i<19&&编辑课件1、输入:若有定义:charc[20];1)scanf()47若在程序中输入:boyandgilr然后puts(c);该语句的输出结果为:boy注:空格、回车符都作为输入数据的分隔符而不能被读入。2)gets()函数格式:gets(接收字符的起始地址)例如:gets(c);注:输入字符串以回车作为结束。空格、制表符都作为有效数据接收。

自动将回车转为结束标记’\0’。注:使用以上函数需要在函数首加头文件:stdio.h编辑课件若在程序中输入:boyandgilr然后puts(c)48如有:chars[20];gets(s);puts(s);如果在程序执行时输入:boyandgirl,则输出结果为:boyandgirl编辑课件如有:chars[20];boyandgirl编辑49课程回顾1、以下语句把字符串”abcde”赋初值给字符数组,不正确的语句是()A.Chars[]=“abcde”;B.chars[]={“abcde”};C.chars[]={‘a’,’b’,’c’,’d’,’e’,’\0’};D.chars[5]=“abcde”;D2、以下对C语言字符数组的错误描述是()A.字符数组可以存放字符串B.字符数组中的字符串可以整体输入输出C.可以在赋值语句中通过赋值运算符=对字符数组整体赋值D.字符数组中字符串的结束标志是’\0’.C编辑课件课程回顾1、以下语句把字符串”abcde”赋初值给字符数组,503、有n各数分别存放在数组a[0]~a[n-1]中。下面程序段的功能是从a数组中查找值为y的元素;若找到,则输出该元素的下标值,找不到则输出-1.其中k为整型变量。k=n-1;while(k>=0&&

)k--;printf(”%d\n”,k);4、以下程序段在w数组中插入一元素x,w数组中的已经按由小到大顺序存放,插入前数组中有n个元素。要求插入x后数组中的数句仍然有序(由小到大存放)。intw[15]={1,2,3,6,9,15},n=6,x=8,i,p=0;while(x>w[p])p++;/*找出插入位置*/for(i=n;i>p;i--)w[i]=

;

=x;n++;/*插入后元素个数加1*/w[i-1]w[i]a[k]!=y编辑课件3、有n各数分别存放在数组a[0]~a[n-1]中。下面程序51五、字符串处理函数以下函数均使用头文件“string.h”1、求字符串长度strlen()格式:strlen(str)地址值或者字符串常量注:1)功能:求从地址str开始到结束标志’\0’之前的字符的个数。2)函数的返回值为一整数。例:1)strlen(“china”)的值为52)strlen(“ATS\n012\1”)的值为83)strlen(“s\n\016\0end”)的值为34)strlen(“\t\085\xff\n”)的值为2编辑课件五、字符串处理函数以下函数均使用头文件“string.h”1525)若有chars[10]=“china”;

则strlen(s)的值为5编辑课件5)若有chars[10]=“china53例题:以下程序功能是将s1字符串的内容复制到s2字符串中,请填空(copy.c)#include<stdio.h>#include<string.h>voidmain(){ chars1[]="goodluck!",s2[20]; inti; for(i=0;

;i++)

puts(s1); puts(s2);}i<=strlen(s1)s2[i]=s1[i];引申作业:编程完成字符串的链接功能。如chars1[20]=“good”,,s2[]=“luck!”;编程将s2链接到s1后面,使s1内容为“goodluck!”编辑课件例题:以下程序功能是将s1字符串的内容复制到s2字符串中,请542、字符串的复制strcpy()格式:strcpy(str1,str2)说明:1)功能:将str2代表的字符串复制到从str1地址开始的内存单元中。2)str1有足够的空间3)strncpy(str1,str2,n)只复制str2中的前n个字符。例:若有chars1[20],s2[]=“china”;1)strcpy(s1,s2);puts(s1);输出:china2)strcpy(s1,s2+2);puts(s1);输出:ina3)strncpy(s1,s2,3);puts(s1);输出:chi4)strncpy(s1,s2+2,2);s2[2]=‘\0’;puts(s1);输出:in编辑课件2、字符串的复制strcpy()格式:strcpy555)若有chars1[20]=“abc”,s2[]=“def”;strcpy(s1+3,s2);puts(s1);输出:abcdefstrcpy(s1+strlen(s1),s2);puts(s1);输出:abcdef注:字符串的复制不能使用赋值运算符“=”,只能使用复制函数3、字符串的连接strcat()格式:strcat(str1,str2)说明:1)功能:将str2代表的字符串连接到从str1代表的字符串从’\0’开始的位置后面。2)str1有足够的空间,以容纳合并后的内容。例如:若有chars1[20]=“abc”,s2[]=“def”;strcat(s1,s2);puts(s1);输出:abcdef编辑课件5)若有chars1[20]=“abc”,s2[]=“de564、字符串的比较strcmp()格式:strcmp(str1,str2)说明:1)功能:将str1、str2代表的两个字符串从指定位置开始逐个字符相比较(按ASCII码值),直到出现不同的字符或遇到’\0’为止。

例如:2)函数的返回值:s1:abc\0s2:aBcde\0abcde\0str1大于str2返回值:正数str1小于str2返回值:负数str1等于str2返回值:03)字符串的比较不能使用关系运算符,只能使用比较函数。编辑课件4、字符串的比较strcmp()格式:strcmp57strcmp(s1,s2);例题:输入两个字符串,输出相应的大小信息。main(){chars1[20],s2[20];intn;

}//输入字符串给s1gets(s1);//输入字符串给s2gets(s2);//比较str1和str2n=if(n>0)printf(“s1isbiggerthans2!\n”);elseif(n<0)printf(“s1issmallerthans2!\n”);elseprintf(“s1isequaltos2!\n”);#include“stdio.h”#include“string.h”编辑课件strcmp(s1,s2);例题:输入两个字符串,输出相应的58作业1:输入若干字符串,直到输入空串为止,从中选出最大的字符串输出。(lt3.c)5、大小写字母转换函数

将字符串中的大写字母转换成对应的小写字母:strlwr(str)

将字符串中的小写字母转换成对应的大写字母:strupr(str)例如:若有charc[]=“China”

则strlwr(c)结果为:chinastrupr(c)结果为:CHINA作业2:编写程序完成十六进制数到十进制数的转化。例如:输入1a2则输出十进制数:418分析:因为十六进制数包含0-9的数字,还包含a-f或者A-F的字母,所以可以把输入的十六进制数作为一个字符串来接收,将其保存到一个字符数组中。(lt4.c)编辑课件作业1:输入若干字符串,直到输入空串为止,从中选出最大的字符596.3二维数组的定义和引用二维数组:每个元素带有两个下标,在逻辑上可以把二维数组看成是一个具有若干行和列的表格或者矩阵。一、定义:类型名称数组名称[常量表达式1][常量表达式2]二维数组的行数。二维数组的列数。例如:定义一个具有2行3列的整型数组ainta[2][3];分析:1)数组名称:a2)共有2x3=6个元素3)逻辑结构如下:编辑课件6.3二维数组的定义和引用二维数组:每个元素带有两个下标,在60第1行第2行第1列第2列第3列a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]inta[2][3];注:每个元素有两个下标:第1个方括号中的下标代表行号,称为行下标第2个方括号中的下标代表列号,称为列下标编辑课件第1行第2行第1列第2列第3列a[0][0]a[0][1]a61二、存储方式:按行存放,即在内存中先存放第1行的元素,再存放第二行的元素。在c语言中,可以把一个二维数组先看成一个一维数组,数组中每个元素又是包含若个元素的一维数组。例如:inta[2][3];aa[0]a[1]a[0][3]a[0][0]a[0][1]a[0][2]a[1][3]a[1][0]a[1][1]a[0][2]所以,二维数组名称和第一维的下标代表一个不可变的地址常量,其值分别为每行的第一个元素的地址。二维数组名称也是一个地址常量,代表整个数组的首地址。编辑课件二、存储方式:按行存放,即在内存中先存放第1行的元素,再存放62所以,若有inta[2][3];则数组中6个元素的存储方式为:……a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]3000H3004H3008H300cH3010H3014Ha的值a[0]的值a[1]的值?思考:a[0]+1的值??思考:元素a[1][2]的地址怎么表示??如果表示任意元素的地址??如何表示i行j列元素的地址?思考:a+1的值为多少?!元素a[0][1]的地址!a[1]+2?*(a+1)+1的值??如果表示任意元素的地址?!a[i]+j或者*(a+i)+j编辑课件所以,若有inta[2][3];则数组中6个元素的存63由以上分析可以得出:a[i]:表示第i行的首地址,每加1相当于加1列,也称为列地址。a:表示整个数组的首地址,每加1相当于加1行,也称为行地址。将行地址前加引用运算符即可将行地址转化为列地址。*(行地址)——列地址编辑课件由以上分析可以得出:a[i]:表示第i行的首地址,每加64三、引用1、直接引用:数组名称[行下标][列下标]例如前例中的a[1][1]等注:1)下标为整型表达式,而且不能越界。2)两个下标分别放在方括号中。例如:a[1,2]是错误的2、间接引用:*(数组元素的地址)例如若有ints[3][4];则引用第2行第3列的元素方法为:直接引用:a[1][2]间接引用:*(a[1]+2)或者*(+2)*(a+1)编辑课件三、引用1、直接引用:数组名称[行下标][列下标]例如前例中65a[0][0]&a[0][0]例题:程序运行时给数组元素赋值,并输出各数组元素。(lt5.c)main(){inta[2][3],i,j;}//给各个元素赋值scanf(“%d”,);只给a[0][0]元素赋值:只给第1行元素赋值:for(j=0;j<3;j++)jfor(j=0;j<3;j++)scanf(“%d”,&a[0][j]);或者a[i]+j或者*(a+i)+j//按行输出各个元素赋值只输出a[0][0]元素:printf(“%d“,);只输出第0行元素:for(j=0;j<3;j++)jfor(i=0;i<2;i++)for(j=0;j<3;j++)printf(“%d”,a[i][j]);或者*(a[i]+j)或者*(*(a+i)+j)printf(“\n”);{}ifor(i=0;i<2;i++)编辑课件a[0][0]&a[0][0]例题:程序运行时给数组元素赋值66四、初始化:可以在定义的同时给数组元素赋值1、分行赋值,每行放在一个花括号{}中。也可省略行数,列数不可省例如:1)inta[2][3]={{1,2,3},{4,5,6}}结果:a=234562)inta[2][3]={{1,2},{4,5}}结果:a=20450注:没有被赋值的元素自动取值为03)inta[][3]={{1,2},{4,5}}结果:a=20450注:行数自动计算为2编辑课件四、初始化:可以在定义的同时给数组元素赋值1、分行赋值,每672、将所有初值放在一个花括号中,按次序依次赋值给数组元素。行数可以省略,但列数不能省。例如:1)inta[2][3]={1,2,3,4,5,6}结果:a=234562)inta[2][3]={1,2,4,5}结果:a=245003)inta[][3]={1,2,3,4,5,6}结果:a=234564)inta[][3]={1,2,4,5}结果:a=24500编辑课件2、将所有初值放在一个花括号中,按次序依次赋值给数组元素。例68ija[i][j]=b[j][i]ji例题:将一个二维数组行和列的元素互换,存到另一个二维数组中。例如

(lt6.c)a=23456b=456b[0][0]=a[0][0]b[1][0]=a[0][1]b[2][0]=a[0][2]b[0][1]=a[1][0]b[1][1]=a[1][1]b[2][1]=a[1][2]main(){inta[2][3]={1,2,3,4,5,6},b[3][2],i,j;}for(i=0;i<2;i++)for(j=0;j<3;j++)b[j][i]=a[i][j];//给b数组赋值//输出数组a//输出数组bprintf("thearrayais:\n");for(i=0;i<2;i++){for(j=0;j<3;j++)printf("%d",a[i][j]);printf("\n");}printf("thearraybis:\n");for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%d",b[i][j]);printf("\n");}编辑课件ija[i][j]=b[j][i]ji例题:将一个二维数组行69例题:输出52张扑克牌,每行一种花色。每种花色按由小到大顺序输出。引申练习:随机输出52张扑克牌。编辑课件例题:输出52张扑克牌,每行一种花色。每种花色按由小到大顺序70例:若有定义

charc[2][5]={{‘c’,’h’,’i’,’n’,’a’},{‘j’,’i’,’n’,’a’,’n’}}chinajinanc[0]c[1]若将上例中的定义改为:charc[2][6]={{‘c’,’h’,’i’,’n’,’a’},{‘j’,’i’,’n’,’a’,’n’}};则china\0jinan\0c[0]c[1]注:每一行不可以作为一个字符串注:每一行可以作为一个字符串编辑课件例:若有定义chinajinanc[0]c[1]若将上例中的716.4字符串数组字符串数组:数组中的每个元素又都是一个字符串。由前面的关于二维数组的分析得到:一个二维数组可以先看作一个一维数组,数组中的每个元素又是一个一维数组。从这一概念出发,若一个二维数组中的每一行都是一个字符串,则可以把这个二维字符数组称作为字符串数组。若有定义:chars[10][80]数组s中共有10行,若每一行都用来存放一个字符串,则可以存放10个字符串。而每个字符串中的有效字符个数最多为79个。因此,可以认为:二维字符数组中若每行都存放字符串,则二维数组的第1维的下标(行数)决定了字符串的个数,而第2维的下标(列数)则决定了字符串的最大长度。编辑课件6.4字符串数组字符串数组:数组中的每个元素又都是一个字符72

例如:charc[2][6]={{‘c’,’h’,’i’,’n’,’a’},{‘j’,’i’,’n’,’a’,’n’}};字符串数组的初始化:可以在定义的同时赋初值或者charc[2][6]={{“china”},{”jinan”}};或者charc[2][6]={“china”,”jinan”};最常采用方式输出上述字符串数组中的每个字符串:只输出第1个字符串:puts();C[0]puts(c[i]);for(i=0;i<2;i++)例题:以下程序的输出结果为(lt7.c)main(){charp[][10]={"book","opk","h","sp"};inti;for(i=3;i>=0;i--,i--)printf("%s",p[i]);}结果为:spopkprintf("%c",*p[i]);结果为:so编辑课件例如:charc[2][6]={{‘c’,’h’,’i73作业3:输入不多于10个的字符串,将其按照字符串的长短由短到长排列并输出。(lx16.c)例如:程序运行时输入:则输出:或者按照字符串的大小有小到大例如:程序运行时输入:则输出:编辑课件作业3:输入不多于10个的字符串,将其按照字符串的长短由短到74作业3:输入不多于10个的字符串,将其按照字符串的长短由短到长排列并输出。(lx16.c)作业1:输入若干字符串,直到输入空串为止,从中选出最大的字符串输出。(lt3.c)作业2:编写程序完成十六进制数到十进制数的转化。例如:输入1a2则输出十进制数:418作业编辑课件作业3:输入不多于10个的字符串,将其按照字符串的长短由短到75例题:输入一个任意位数整数,求出每位上的数字,从高位向低位输出。/*若由低位向高位输出:*/#include"stdio.h"#include"conio.h"voidmain(){longx;textmode(C40);clrscr();printf("inputaninterger:");scanf("%ld",&x);do{printf("%d,",x%10);x=x/10;}while(x!=0);printf("\b");getch();}将求出的每一位数字输出

变量?多个数组保存?编辑课件例题:输入一个任意位数整数,求出每位上的数字,从高位向低位输76第六章数组本章重点:1、一维数组、二维数组的定义、初始化以及数组元素的引用。2、字符串以及字符串数组3、字符串处理函数本章难点:1、数组名是整个数组的首地址。2、直接引用和间接引用编辑课件第六章数组本章重点:1、一维数组、二维数组的定义、初始化77主要内容第一节一维数组的定义和引用第二节字符数组第三节二维数组的定义和引用编辑课件主要内容第一节一维数组的定义和引用第二节字符数组第三节78引言构造类型:由基本类型的数据按照一定的规则组合而成。C语言中的构造类型数组结构体共用体(本章内容)(第十章内容)数组:一组变量。★具有相同的数据类型★在内存中占有连续的内存单元★具有相同的名称(数组名),但有不同的下标每一个称为一个数组元素。用统一的数组名称和不同的下标来唯一的标识数组中的每一个元素。唯一确定数组元素在数组中的顺序的整数值编辑课件引言构造类型:由基本类型的数据按照一定的规则组合而成。C语言796.1一维数组的定义和引用一维数组:数组中的每个元素只带有一个下标,即仅由一个下标值就能确定数组元素位置和顺序的数组。因此,在逻辑上,可以把一维数组中的所有元素看作是排成一行的,所以也把一维数组称为“行数组”。编辑课件6.1一维数组的定义和引用一维数组:数组中的每个元素只带有80一、定义:形式:类型名数组名[常量表达式]注:1)类型名:数组中的元素的类型(如intchar等)2)数组名的命名规则同前面的变量的命名规则。3)常量表达式:表示数组中数组元素的个数,即数组的长度。

不允许为变量,既不允许对数组做动态定义。数组的大小一旦定义即已固定。例如:定义一个包含3个元素的整型数组a:int例如:定义一个包含20个元素的字符型数组c:charc[20];[3];a例:inta[3],b[5],c[10];一个定义中,可以同时说明多个相同类型的数组。例:charc,s[30];普通变量和数组可以出现在同一个定义中。编辑课件一、定义:形式:类型名数组名[常量表达式]注:1)类型名:数81注:★

4)数组名:是一个地址常量,代表整个数组的首地址。变量的地址:一个变量所占内存中第一个字节的地址。……2000H2001H2002H2003H2004Hintx;xprintf(“%x”,&x);输出结果为:2000一个变量名与一个地址值所标明的存储区域相对应。编辑课件注:变量的地址:一个变量所占内存中第一个字节的地址。……2082注:★

4)数组名:是一个地址常量,代表整个数组的首地址。例如:inta[3];……3000H3001H3002H3003H3004H3005H3006H数组a所占的内存printf(“%x”,a);输出结果为:3000a的值

a+1的值是多少?3002注:对地址进行增减运算,移动的最小单位是一个存储单元而不一定是一个字节,具体由数组元素的类型决定。

?编辑课件注:例如:inta[3];……3000H3001H30083例如:main()

{inta[10];printf(“%x”,a);printf(“%x”,a+9);}如果第一个输出语句的结果为194,则第二个输出语句的结果为(

)194+18212(十六进制)(十进制)XX194+12206X1a6√1a6编辑课件例如:main()

{inta[10];如果第一个输出语句84二、引用补充内容:直接引用和间接引用直接引用:通过变量名来对内存单元进行存取操作的。此前我们对变量的操作都是直接引用。2000H2001H2002H2003H2004H……intx;xx=3;3printf(“%d”,x);输出3编辑课件二、引用补充内容:直接引用和间接引用直接引用:通过变量名来对85间接引用:将变量(假设为i)的地址存放在另一个变量(假设为p)中,要存取变量i的值,可以先找到存放i地址的变量p,从p中取出i的地址,然后根据这个地址进行存放。这种由一个变量得到另一个变量的地址,再通过得到的这个地址完成对存储单元访问的方法,成为对内存的“间接访问”,或者“间接引用”。inti=3;2000H2001H……3……变量p的空间2000H编辑课件间接引用:将变量(假设为i)的地址存放在另一个变量(假设为p86与间接引用相关的运算符:&:取某个变量的地址。例如取变量x的地址:&x*:间接引用运算符。单目运算符。出现在运算对象的左边,其运算对象是地址或者存放地址的指针变量。功能:引用相应的存储单元。inti=3;2000H2001H……32000H……变量p的空间对变量x的引用:直接引用:x间接引用:*p*(&x)第九章内容编辑课件与间接引用相关的运算符:&:取某个变量的地址。例如取变量x的87下标的范围:≤下标≤数组元素的引用:把数组中的每个元素当成普通的变量来使用,就是所谓的“数组元素的引用”。两种方法:1、直接引用:形式:数组名称[下标表达式]表达式的值必须为整数例如:inta[3];该数组中包含3个元素,分别为:★2)数组元素默认的下标值从0开始。a[0]、a[1]、a[2]注:1)下标表达式必须为整型常量或者整型的表达式。0长度-13)数组不能整体引用。如不能用a表示a[0]到a[2]3个元素。编辑课件下标的范围:≤下标≤数组元素的引用:把数组中的每个元素88(+0)2、间接引用:形式:*数组元素的地址例如:inta[3];表示数组中的第一个元素:直接引用:a[0]间接引用:*a表示数组中的第二个元素:直接引用:a[1]间接引用:*(a+1)表示数组中的第三个元素:直接引用:a[2]间接引用:*(a+2)编辑课件(+0)2、间接引用:形式:*数组元素的地址例如:int89课程回顾1、定义一个具有10个元素的浮点型的数组f,应使用的语句为:

。floatf[10];2、若已有定义inta[10];则该数组中首元素表示为:

。未元素表示为:

。a[0]a[9]3、若有一个数组a,则对其下标为i的元素地址表示为:或.数组元素的引用表示为:或.&a[i]a+ia[i]*(a+i)编辑课件课程回顾1、定义一个具有10个元素的浮点型的数组f,应使用的90main()

{inta[10];

}例题://给10个元素分别赋值为01234……9a[0]=0;a[1]=1;a[2]=2;……a[9]=9;iia[i]=i;for(i=0;i<10;i++)a[i]=i;//输出数组的10个元素printf(“%3d”,a[0]);129ifor(i=0;i<10;i++)printf(“%3d”,a[i]);//倒序输出数组的10个元素for(i=9;i>=0;i--)printf(“%3d”,a[i]);*(a+i)编辑课件main()

{inta[10];例题://给10个元素分91三、一维数组的初始化1、定义时赋初值1)例:inta[3]={1,2,3};注:初值列表用大括号{}括起来,各数值间用逗号隔开。从第一个元素开始依次赋值。2)例:inta[5]={1,2,3};注:只给部分元素赋值,且为从第1个元素开始的连续的数组元素,没有赋值的元素自动取值为0。上例中,赋值后元素a[0]、a[1]、a[2]的值分别为1、2、3;a[3]、a[4]的值均为0。3)例:inta[]={1,2,3};注:对全部数组元素赋初值时,长度可以省略。系统根据初值的个数自动决定数组的长度。编辑课件三、一维数组的初始化1、

温馨提示

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

评论

0/150

提交评论