课程-15级语言第5章数组_第1页
课程-15级语言第5章数组_第2页
课程-15级语言第5章数组_第3页
课程-15级语言第5章数组_第4页
课程-15级语言第5章数组_第5页
免费预览已结束,剩余89页可下载查看

下载本文档

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

文档简介

1第5章数组今年双十一节,某公司要庆祝一下。经理对公司的100个员工说:做一个游戏,让每个人把出生年+月+日得到一个数。例如:1995年10月9日=1995+10+9=2014。然后把这个数报上来。公司里有一笔钱要作为游戏的奖金,数额为M元。如果有人报上来的数字与2014相同,就把这笔钱发给这些人。如果只有一个人得奖,奖金都归这个人。如果有多于一个人得奖,则他们平分这笔钱。现在让我们来写一段程序算算都有哪些人得到了奖金?得到多少?2问题求解定义一个数组存放所有员工上报的数据定义一个数组存放获奖者的编号(幸运者数组)定义一个整数存放获奖者人数员工顺序报上数字,其相应的编号就是存放其数据的数组元素下标:0,1,2,…报上数字与2014相等,则记录编号到幸运者数组中获奖者人数加1输出获奖者编号和获得的奖金数额34#include<stdio.h>#defineLUCK_NUM2014#defineN100intmain(){ intpeople[M],lucky[M],count=0,i;

scanf(("%d",&M); for(i=0;i<N;i++) scanf("%d",&people[i]); for(i=0;i<N;i++) { if(people[i]==LUCK_NUM) { lucky[count]=i; count++; } } for(i=0;i<count;i++) printf("%d%d\n",lucky[i],N/count); return0;}5教学目标掌握数组数据结构掌握数组的声明和存放,初始化和数组元素的引用方法掌握数组下标的使用方法了解声明和操作多维数组掌握字符串定义及使用方法初步理解排序和查找等基本算法基本概念定义:一组类型相同的数据对象构成的集合特点:存储在一个区域内,引用时用同一名字(序号不同)数组名:数据集合的名称数组元素:该集合的各数据元素。具有相同的数据类型,用集合的名称(数组名)和(元素的位置)索引(也叫下标)确定65.1一维数组7{16.02.018.022.012.0}xx[0]x[1]x[2]x[3]x[4]数组元素数组名数组的特征数组元素的类型

存储在数组元素中的值的数据类型(数组类型)数组的大小

数组中能够存放多少个数组元素(数组长度)85.1.1一维数组的定义9定义方式:数据类型数组名[常量表达式];合法标识符表示元素个数,下标从0开始不能为变量[]:数组运算符优先级(1),左结合,不能用()例inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a编译时分配连续内存数组名表示内存首地址(address.c);它是地址常量例intdata[5];data[5]=10;

//C语言对数组不作越界检查,使用时要注意例inti=15;intdata[i];(

不能用变量定义数组维数)例#defineI4intdata[I];(常量表达式包括常量、符号常量)5.1.1一维数组的定义一维数组的总字节数可按下式计算:

总字节数=sizeof(数组元素的数据类型)*数组长度

其中sizeof是计算数据类型在存储空间中占用字节数的运算符。

数组x所占用的存储字节数为:sizeof(double)*5105.1.1一维数组的定义语句说明inta[10];长度为10的int数组adoublescore[50];长度为50的double数组scorecharstudentname[20];长度为20的char数组studentnameintb[100],x[27];int数组b长度为100,长度为27的int数组x11

例5.1数组的声明语句及含义5.1.1一维数组的定义[例5.2]将数据存入数组相应的数组元素中。12/*

程序功能:声明数组,从键盘输入数据存储数组元素中并输出*/#include<stdio.h>intmain(){

doublex[5];inti;for(i=0;i<5;i++)scanf(“%lf”,&x[i]);for(i=0;i<5;i++)printf(“%8.2lf”,x[i]);return0;}一维数组的注意事项(1)数组的长度是一个整型常量,例如:inta[10];

使用符号常量的形式定义数组的大小:#defineN10inta[N];

(2)数组的命名方式与其他变量一样,符合标识符的定义规范(3)数组元素的起始下标为013一维数组的存储结构若有数组:inta[10];14索引号(下标)存储地址元素值数组元素020001a[0]120042a[1]220083a[2]320124a[3]420165a[4]520206a[5]620247a[6]720288a[7]820329a[8]9203610a[9]char型数组str的存储结构示意图

charstr[5]={‘H’,’e’,’l’,’l’,’o’};一维数组的存储结构15索引号存储地址元素值数组元素02000‘H’str[0]12001‘e’str[1]22002‘l’str[2]32003‘l’str[3]42004‘o’str[4]5.1.2一维数组元素的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名[下标]

其中:下标可以是常量或整型表达式16例inta[10];printf(“%d”,a);

()必须for(j=0;j<10;j++)

printf(“%d\n”,a[j]);

()数组元素的引用5.1.2一维数组元素的引用17语句说明printf(“%.2lf”,x[3]);显示x[3]的值,其值为22.00x[0]=25.0;将浮点数25.0存入x[0]中sum=c[1]+c[2];将c[1]和c[2]的和存储在变量sum中sum+=c[2];将sum和c[2]的和存储在变量sum中c[7]=100;将100的值存入c[7]元素中x[2]+1=x[3];非法的赋值语句,赋值运算符的左边不能被赋值在C语言中,使用下标,从数组的第一个元素开始,顺序处理数组的元素,使用循环语句实现对数组元素的遍历。5.1.2一维数组元素的引用[例5.3]保存一个10以内的整数的所有约数。

18#include<stdio.h>intmain(){inta[10],n;inti,j=0;printf("输入一个整数(<10):");scanf("%d",&n);for(i=1;i<=n;i++)if(n%i==0)a[j++]=i;printf("约数为:\n");for(i=0;i<j;i++) printf("%6d",a[i]);return0;}程序运行结果:输入:输入一个整数(<10):8输出:约数为:12485.1.3数组的初始化在声明简单变量时,初始化形式:inti=0;定义数组时直接初始化:各元素的值用逗号分隔,填充到数组元素所在的存储空间中。例如:intb[4]={1,2,3,4};19b[0]1b[1]2b[2]3b[3]45.1.3数组的初始化错误的初始化:intd[10];d={0,1,2,3,4,5,6,7,8,9};/*错误的赋值*/正确的初始化方法为:intd[]={0,1,2,3,4,5,6,7,8,9};根据初值计算长度205.1.3数组的初始化部分初始化charletters[26]={‘A’,‘B’};21letter[0]‘A’charletter[1]‘B’letter[2]‘\0’……‘\0’Letter[25]‘\0’5.1.3数组的初始化问题:若初始化了很多数组元素,如何确定数组的大小?

22一一计数,可能比较麻烦!sizeof(d)/sizeof(d[0])含义是数组d的存储空间的大小除以数组中第一个元素的占用存储空间的字节数5.1.3数组的初始化[例5.4]输出数组元素。/*程序功能:输出数组元素*/#include<stdio.h>intmain(){charv[]={'A','E','I','O','U'};inti=0;for(i=0;i<sizeof(v)/sizeof(v[0]);i++)printf("%6c",v[i]);return0;}23

程序运行结果:

输出:AEIOU利用数组解决问题例用冒泡法对10个数排序(由小到大)24排序过程:(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束2538

49

65

76132730

97第二趟排序384965132730

76第三趟排序3849132730

65第四趟排序3813273049第五趟排序132730

38第六趟排序1327

30第七趟排序4938659776132730第一趟排序n=83849769713972797309713767676273013652765306513134949304927382738303813

27结束输入n个数给a[0]到a[n-1]forj=0ton-2fori=0ton-1-ja[i]>a[i+1]真假a[i]a[i+1]输出a[0]到a[n-1]#include<stdio.h>#defineN10intmain(){inta[N],i,j,t;

for(i=0;i<N;i++)scanf("%d",&a[i]);

printf("\n");

for(j=0;j<N-1;j++)for(i=0;i<N-j-1;i++)

if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}

printf("Thesortednumbers:\n");

for(i=0;i<N;i++) printf("%d",a[i]);}例:已知数组a中有n个互不相等的元素,数组b中有m(m<n)个互不相等的元素,而数组c中包含那些在a中但不在b中的元素,编程产生数组c(产生新数组)

12-13

27731

-62-1477

-176

a12331-6

c

b

0

0#include<stdio.h>#defineN8#defineM5intmain(){inti,j,k=0,a[N],b[M],c[N];for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<M;i++)scanf("%d",&b[i]);for(i=0;i<N;i++){for(j=0;j<M;j++)if(a[i]==b[j])break;

if(j>=M){c[k]=a[i];k++;}}

for(i=0;i<k;i++)printf("%5d",c[i]);printf("\n");}利用数组解决问题例:将一串整数,依次左移一个数,且原来的第1个数移到最后去29例:输入m和k,将大于整数m且紧靠m的k个素数存入数组中并输出。

例如,若输入17,5,则应输出19,23,29,31,37。

3031#include<stdio.h>#defineN1000intmain(){ intm,k,i,j,n,x[N]; scanf("%d%d",&m,&k); n=0; for(i=m+1;n<k;i++) { for(j=2;j<i;j++) if(i%j==0)break; if(j>=i) x[n++]=i; } for(i=0;i<n;i++) printf("%d",x[i]); return0;}5.1.4向函数传递一维数组分类:数组元素作为函数的参数printf("%6c",v[i]);scanf(“%lf”,&x[i]);数组名作为函数的参数321数组元素作为函数的参数[例5.5]写程序建立一个包含Fibonacci数列前20项的数组,然后从大到小输出这个数组中所有的数。33f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]014523192351数组元素作为函数的参数#include<stdio.h>#defineMAX20intmain(){longfib[MAX];intn;fib[0]=1;fib[1]=1;for(n=2;n<MAX;++n)fib[n]=fib[n-1]+fib[n-2];for(n=MAX-1;n>=0;--n){34printf("%ld",fib[n]);putchar((MAX-n-1)%6==5?‘\n’:‘’);}return0;}程序运行结果:6765418125841597987610

377233138532

11

数组元素作为函数的参数2数组参数数组元素作为参数传递,函数会接收到数组元素的一个副本,参数传递方法为值传递。数组整体作为函数的参数,函数操作与实参数组一致的数组元素。传地址:将数组在内存中的存储地址作为参数来传递352数组参数例5.6voidinit(inta[],intn,intvalue){ inti; for(i=0;i<n;i++) a[i]=value;}36函数的参数是一个数组,而不是数组元素函数的调用形式为:init(b,8,-1);

其中数组b的定义形式为:intb[8];37#include<stdio.h>voidinit(inta[],int,int);intmain(){ intb[10],i;

init(b,8,-1); for(i=0;i<8;i++) printf("%d",b[i]); return0;}2数组参数b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]38

8-1

-实参81函数init形参数组anvalue形参数组名b实参将数据传递给形参数组a2数组参数[例5.7]定义了一个函数sum,返回数组中所有元素值的和,函数不能改变数组元素。intsum(inta[],intn){ inti,s=0; for(i=0;i<n;i++) s+=a[i]; returns;}392数组参数[例5.8]用数组表示A和B两个向量,定义函数实现两个向量的和(对应项相加)存入数组C中。voidsum(inta[],

intb[],intn,intc[]){inti; for(i=0;i<n;i++) c[i]=a[i]+b[i];}405.1.4向函数传递一维数组说明:(1)数组作为函数参数的语法为:元素类型数组名[](2)数组名后的[]不能省略(3)数组作为参数时,实参中只须写实参数组名,不能再取其地址了。如:41charname[10];scanf("%s",name);scanf(“%s”,&name);/*错误!name已经是数组名*/5.1.5一维数组应用读10个整数存入数组,找出其中最大值和最小值42分析步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x[0](b)依次用x[i]和max,min比较(循环)

若max<x[i],令max=x[i]

若min>x[i],令min=x[i]3.输出:max和min#include<stdio.h>#defineSIZE10intmain(){intx[SIZE],i,max,min;printf(“Input10integers:\n");for(i=0;i<SIZE;i++){scanf("%d",&x[i]);}max=min=x[0];for(i=1;i<SIZE;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumvalueis%d\n",max);printf("Minimumvalueis%d\n",min);return0;}5.1.5一维数组应用例5.11将一个数组中的元素首尾依次逆转并输出43#include<stdio.h>voidinv(intx[],intn);intmain(){ inti,a[10]={8,6,7,1,0,9,3,5,4,2}; printf("数组元素的原先顺序:\n"); for(i=0;i<10;i++) printf("%d",a[i]); printf("\n"); inv(a,10); printf("逆序操作后的顺序:\n");for(i=0;i<10;i++) printf("%d",a[i]); printf("\n"); return0;}voidinv(intx[],intn){ intt,i,j,m=(n-1)/2; for(i=0;i<=m;i++){ j=n-1-i;t=x[i];x[i]=x[j];x[j]=t; }}44例5.13有两个一维数组,需要将其合并为一个一维的数组,要求合并后数组的每一项是递减顺序排列的。

首先先将两个数组分别排序,然后将排序后的数组合并。5.1.5一维数组应用voidsort(intarr[],intk){ inttemp; inti,j; for(i=0;i<k-1;i++){ for(j=0;j<k-i-1;j++){ if(arr[j]<arr[j+1]) { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }}voidmerge(inta[],intb[],intc[],intm,intn){ inti=0,j=0,k=0; while(i<m&&j<n) { if(a[i]<b[j]) c[k++]=b[j++]; else c[k++]=a[i++]; } while(i<m) c[k++]=a[i++]; while(j<n) c[k++]=b[j++];}#include<stdio.h>#defineM5#defineN4voidsort(intx[],int);voidmerge(inta[],intb[],intc[],int,int);intmain(){intj; inta[M]={2,8,7,9,3}; intb[N]={7,5,1,4}; intc[M+N]; printf("a数组排序前:\n"); for(j=0;j<M;j++) printf("%5d",a[j]); printf("\n");printf("b数组排序前:\n"); for(j=0;j<N;j++) printf("%5d",b[j]); printf("\n");

sort(a,M); printf("a数组排序后:\n"); for(j=0;j<N;j++) printf("%5d",a[j]); printf("\n");

sort(b,N); printf("b数组排序后:\n"); for(j=0;j<N;j++) printf("%5d",b[j]); printf("\n");

merge(a,b,c,M,N); printf("合并a和b后:\n"); for(j=0;j<10;j++) printf("%5d",c[j]); printf("\n"); return0;}5.1.5一维数组应用程序运行结果:a数组排序前:28793b数组排序前:7514a数组排序后:98732b数组排序后:7541合并a和b后:987754321

47校门外的树题目描述:某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。(L<=100000)输入要求:输入两个整数L(1

<=

L

<=

10000)和

M(1

<=

M

<=

100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。输出要求:占一行,马路上剩余的树的数目输入样例:

500

3

150

300

100

200

470

471输出样例:

298495.2二维数组在实际计算中,有时需要更复杂的结构来存储数据完成相应的计算任务,例如经常需要表示和处理矩阵。矩阵是由行和列组成的数阵,它是一个二维的结构,是由若干行元素构成的数组,每一个行元素表示一个长度一致的一维数组。505.2.1二维数组的声明定义方式:

数据类型数组名[常量表达式][常量表达式];数组元素的存放顺序原因:内存是一维的二维数组:按行序优先多维数组:最右下标变化最快例inta[3][2];floatb[2][5];inta[3,4];()inta[3][2]014523a[0][0]

a[0][1]a[1][0]

a[1][1]a[2][0]

a[2][1]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]若有:doublea[3][2];

逻辑结构

物理结构

51[0][1]a[0]a[0][0]a[0][1]a[1]a[1][0]a[1][1]a[2]a[2][0]a[2][1]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[1]a[2]a[0]5.2.1二维数组的声明二维数组的初始化

分行赋值

floata[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

顺序赋值

floata[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

部分赋值:其他为0floata[3][4]={{1},{},{9}};

全部赋值:一维长度可以省略

floata[][3]={1,0,3,4,0,0,0,8,0};5.2.2二维数组的初始化53doubleE[3][3]={{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}};1.00.00.00.01.00.00.00.01.0inta[3][3]={{1,2},{3,4},{5,6}};120340560intb[3][3]={1,2,3,4,5,6};1234560005.2.2二维数组的初始化[例5.14]二维数组的初始化54printf(“\nb:\n”);for(i=0;i<2;i++){for(j=0;j<3;j++)printf("%5d",b[i][j]);

printf("\n");}return0;}#include<stdio.h>intmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[2][3]={1,2,3,4,5,6};inti,j;printf("a:\n");for(i=0;i<2;i++){for(j=0;j<3;j++)printf("%5d",a[i][j]);printf("\n");}5.2.3二维数组应用[例5.15]实现矩阵的输入与输出55#include<stdio.h>#defineM3#defineN4intmain(){inta[M][N];inti,j;for(i=0;i<M;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);for(i=0;i<M;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}return0;}程序运行结果输入:123434564567输出:

1234345645675.2.3二维数组应用[例5.16]设计程序实现:一个班级有30名同学,每位同学有三门课程的成绩,求每位同学的总分,并求每门课的平均分。56

1000001310001433101443331444331214431222141222221例:找规律自动填充n×n方阵。n=7时如下图所示。主对角线副对角线i==ji+j==6N-1#include<stdio.h>#defineN7

intmain(){inta[N][N],i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)if(i==j||i+j==N-1)a[i][j]=1; elseif(i<j&&i+j<N-1)a[i][j]=0;elseif(i<j&&i+j>N-1)a[i][j]=4;elseif(i>j&&i+j>N-1)a[i][j]=2;elsea[i][j]=3;for(i=0;i<N;i++){for(j=0;j<N;j++) printf("%3d",a[i][j]);printf("\n");}}i<ji>ji+j<N-1i+j>N-15.3字符数组字符数组就是存储字符数据的数组,比如单词,电话号码等等文本数据。C语言提供非常强大的处理字符序列或文本的功能。当然这些功能都是从存储字符型数据开始的。585.3.1字符数组的定义一维字符数组声明的形式:

char数组名称[长度];

二维字符数组声明的形式:char数组名称[行长度][列宽度];例如,charline[80];chartext[1000];

charname[5][20];59常量表达式指定了长度,即可以存放字符数据的个数理解为:定义了五名同学的姓名,每个姓名不超过20个字符。5.3.2字符数组元素的引用数组元素的赋值操作for(i=0;i<80&&(line[i]=getchar())!=‘\n‘;i++);/*用循环将一行(最多80列)字符读入到数组line*/数组元素的取值操作

字符数组元素的引用方式也是通过数组名和下标运算符表示式实现的for(i=0;i<80;i++)printf(“%c”,line[i]);/*输出数组元素的值*/605.3.3字符数组元素的初始化逐个字符赋值61用字符串常量例

charch[5]={'H','e','l','l','o'};ch[0]Helloch[1]ch[2]ch[3]ch[4]逐个字符赋值例charch[6]={“Hello”};或charch[6]=“Hello”;或charch[]=“Hello”;ch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]用字符串常量5.3.3字符数组元素的初始化charstr[20]={"Nanjing"};或charstr[20]=“Nanjing”;/*可将花括号省略*/62[0][6][7][12]Nanjing\0\0\0\0\0\0str[7]包含的字符‘\0’,表示“空字符”,表示一组字符的结束符。在C语言中,空字符常量用‘\0’转义字符表示。空字符在C语言中有特殊作用,表示字符串的结束符。注意:5.3.3字符数组元素的初始化63例chardiamond[][5]={{‘',‘','*'},{‘','*',‘','*'},{'*',‘',‘',‘','*'},{‘','*',‘','*'},{‘',‘','*'}};diamond[0]*\0\0diamond[1]**\0diamond[2]**diamond[3]**\0diamond[4]*\0\05.3.4字符串的表示字符串:双引号对("“)引起的部分。

字符型数据指的是一个字符数据,其常量的表示用单引号对(‘’)表示。字符串指的是一组有意义字符构成的数据。

在C语言中,二者间的差别很大。scanf("%f",&a,&b);printf("Average=%5.2f\n",(a+b)/2);64用字符串常量用字符串常量字符串的存储在C语言中,字符串的存储是利用字符数组来实现的。编译系统将字符串以字符数组的形式存储,即从内存空间中分配连续的若干存储单元,依次保存字符串中的字符,且每个字符占用一个字节。C语言规定:在字符串常量中所有字符之后,增加一个空字符'\0'作为字符串的结束标志。65字符串的存储[0][6][7]Nanjing\066例如:charstr[]="Nanjing";虽然它只有7个字符,其内部表示却需要占8个字节存储,尤其是元素str[7],存储了一个空字符’\0’。以表示字符串的结束。当字符串初始化缺省长度时,数组的长度必为字符串字符个数再加一个存放空字符的字节数。注意:字符串数组字符串数组是一个二维字符数组,该数组中的每一行都是一个字符串。#defineWEEK_DAY7#defineNAME_LEN10charweekday[WEEK_DAY][NAME_LEN]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday“};675.3.5字符数组的输入与输出字符数组的输入与输出与值型数组类似,字符数组也是从索引号为0的元素开始访问的。通常使用循环计数器作为数组的下标可以依次地遍历数组中的所有元素。68例输入一行字符,统计其中有多少个单词输入一字符串给stringi=0num=0word=0当((c=string[i])!=‘\0’)c=空格真真假假word=0word=1num=num+1i=i+1输出:numword==0#include<stdio.h>intmain(){charstring[81];inti=0,num=0,word=0;charc;gets(string);

for(i=0;(c=string[i])!='\0';i++)

if(c=='')word=0;

elseif(word==0){word=1;num++;}cout<<num;return0}70分析:一行文字中单词间的分隔符,我们一般认为是非字母字符数据。在给定问题中,我们首先需要找到单词,即寻找单词的开始和结束位置,并设计一个计数器记录单词的长度,通过比较找到最大值,并记录单词的起始位置,以便输出该单词。[例5.17]从标准输入设备(键盘)中输入一行文字,查找该行文字中最长的单词。#include<stdio.h>#include<ctype.h>intmain(){charline[100];intmaxlen=0,i=0,max=0,end=0;intwordflag=0;while((

line[i++]=getchar())!='\n'&&i<100);

line[i]='\0';for(i=0;line[i]!='\0';i++){if(isalpha(line[i])){if(!wordflag)wordflag=1;maxlen++;}

else{wordflag=0;if(max<maxlen){max=maxlen;end=i; }maxlen=0;}}for(i=end-max;i<end;i++)printf("%c",line[i]);printf("\n");return0;}字符串的输入与输出(printf和scanf函数)

在格式控制字符串中,使用%s格式实现对字符串的输出与输入[例5.17]要求用户输入一个代表课程名称的字符串、表示星期几的整数以及表示该课程上课节次串,输出该节次对应的课程表。735.3.5字符数组的输入与输出#include<stdio.h>#defineWEEK_DAY7#defineNAME_LEN10charweekday[WEEK_DAY][NAME_LEN]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};intmain(){charcourse_name[20];intdays;chartime[6];inti;scanf("%s",course_name);scanf("%d",&days);scanf("%s",time);74for(i=0;i<WEEK_DAY;i++)printf("%10s",weekday[i]);printf("\n%s",time);for(i=0;i<10*days;i++)printf("");printf("%s\n",course_name);return0;}5.3.5字符数组的输入与输出输入:

Math35~6输出:SundayMondayTuesdayWednesdayThursdayFridaySaturday5~6Math注意:scanf函数扫描字符串时,分隔符也是空格、换行和制表符字符。从第一个非分隔字符开始,将字符复制到它的字符数组参数的连续内存单元。即:5.3.5字符数组的输入与输出[0][4][9]Math\0?????76输入数据:Math↵(回车确认输入)

scanf函数会在字符串的结尾处自动添加一个空字符’\0’5.3.5字符数组的输入与输出charstr[50];scanf("%s",str);当输入:CProgrammingLanguagestr中的值是?77CProgrammingLanguageCWhy?5.3.6字符串处理函数字符串不是标准数据类型,大多数操作不能直接对字符串进行操作,一般都通过循环对每个字符进行操作,这样就使字符串的操作并不简便。但C语言提供专门处理字符串的函数,这些函数的原型都包含在string.h中,下面介绍常用的几个字符串处理函数。781字符串的赋值函数strcpy()一般形式:

strcpy(字符数组,字符串);函数功能:将字符串复制到字符数组中。如果字符串的长度小于数组的长度,其余部分用'\0'填补。返回处理完成的字符串。说明:不能用赋值符号“=”对字符串进行复制。字符数组的长度足够大,未使用的部分是空字符(‘\0’)。

charstr[20];strcpy(str,"CProgrammingLanguage");792字符串的长度一般形式:strlen(字符串);函数功能:返回字符串的有效字符数(除空字符以外的的字符个数)。例如:strlen("Hello");/*结果是5*/说明:strlen()和sizeof()是有区别的,sizeof("Hello")的值是6。803字符串的连接一般形式:strcat(字符数组1,字符串);函数功能:把字符串连接到字符数组1所表示的字符串的后面,结果放在字符数组1中。说明:字符数组1的长度要足够大,以便容纳新的字符串。如:charC[40]="CProgramming",str[12];strcpy(str,"Language");strcat(C,str);81"CProgrammingLanguage"3字符串的比较一般形式:

strcmp(字符串1,字符串2);函数功能:比较两个字符串的大小,返回一个整数值。说明:若函数返回值为0,则字符串1与字符串2相等若函数返回值大于0,则字符串1大于字符串2若函数返回值小于0,则字符串1小于字符串2823字符串的比较如:charstr1[]=“CProgrammingLanguage”;charstr2[]="BasicProgrammingLanguage";if(strcmp(str1,str2)>0)printf("str1字典序中排在str2的后面\n");elseprintf(“str1字典序中排在str2的前面\n”);83str1字典序中排在str2的后面字符串和数值型数组的区别交换排序数值字符数据定义intlist[M];charlist[M][N]比较操作if(list[i]<list[first])first=i;if(strcmp(list[i],list[first])<0)first=i;元素交换temp=list[min];List[min]=list[fill];list[fill]=temp;strcpy(temp,list[min]);strcpy(list[min],list[fill]);strcpy(list[fill],temp);845.3.7字符数组应用例5.19完成字符串的复制操作voidstr_copy(chartarget[],charsource[]){inti=0;while(source[i]

温馨提示

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

评论

0/150

提交评论