第10讲一维数组与字符_第1页
第10讲一维数组与字符_第2页
第10讲一维数组与字符_第3页
第10讲一维数组与字符_第4页
第10讲一维数组与字符_第5页
已阅读5页,还剩22页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

第10讲一维数组与字符数组以后会越来越难,因此一定要对前面的知识及时理解和掌握。看懂、听懂并不等于会用。课堂上时间有限,大家一定要及时预习和复习。复习时注意只需要把我课上讲的几个例题理解透彻并掌握即可注意:思路!算法!2作业1:求60个学生的最高分算法:输入60个学生的成绩依次比较,找出最高分输出最高分。3方法一:#include

<stdio.h>#define

N

60void

main(){ int

a[N],max;printf("Input

%d

score:\n",N);for(i=0;i<=N-1;i++)scanf("%d",&a[i]);max=a[0];

/*假设第一个元素最大*/for(i=1;i<=N-1;i++)/*依次拿当前最大值与下一个元素比较*/if(a[i]>max){

max=a[i];

}printf("\n

The

maximum

score

is

%d

:\n

",max);}4方法二:#include

<stdio.h>#define

N

60void

main(){ int

a[N],max_i;printf("Input

%d

score:\n",N);for(i=0;i<=N-1;i++)scanf("%d",&a[i]);max_i=0;

/*假设最大值对应的下标为0*/for(i=1;i<=N-1;i++)if(a[i]>a[max_i]){max_i=i;}/*求最大元素对应的下标*/

printf("\n

The

maximum

score

is%d

:\n",a[max_i]);}作业2:求60个学生的平均分

算法:

输入60个学生的成绩

计算总分,平均分

输出平均分5#include

<stdio.h>#define

N

60void

main(){ int

a[N],sum;printf("Input

%d

score:\n",N);for(i=0;i<=N-1;i++)scanf("%d",&a[i]);sum=0;for(i=0;i<=N-1;i++)/*求和*/sum+=a[i];printf("\n

aversge=%.1f

:\n

",(float)sum/N);}6例6-1

对200个学生成绩从大到小排序算法输入200个成绩排序输入排序结果7冒泡法对N个数从大到小排序:第再直通a[0趟排序:比较a[0]和a[1],不满足顺序交换,比较a[1]和a[2],不满足顺序交换,依此类推,至a[N-2]和a[N-1]比较,不满足顺序交换,

过这一趟的两两比较找到第1个最小的数放在

N-1]的位置…直至a[N-j-2]和a[N-j-1]比较,不满足顺序交换,通过这一趟的两两比较找到第j+1个最小的数放在a[N-j-1]的位置共N-1趟for(j=0;j<=N-2;j++)/*第j趟排序*/…

}第J趟排序:比较a[0]和a[1],不满足顺序交换,再比较a[1]和a[2],不满足顺序交换,依此类推,{/*通过依次比较a[I]和a[I+1],不满足顺序交换*/for(i=0;i<=(N-1)-(j-1);i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}8#include

<stdio.h>#define

N

200void

main(){ int

a[N],i,j,t;printf("Input

%d

score:\n",N);for(i=0;i<=N-1;i++)scanf("%d",&a[i]);for(j=0;j<=N-2;j++)

/*冒泡法排序*/for(i=0;i<=N-j-2;i++)if(a[i]<a[i+1])

/*若从小到大排序,改成>*/{

t=a[i];

a[i]=a[i+1];

a[i+1]=t;

}printf("

\n

The

sorted

score:\n");for(i=0;i<=N-1;i++){

if(i%15==0)

printf("\n");printf("%4d

",a[i]);}}/*书中P167的源代码改为for(i=0;i<=N-j-2;i++)*/例6-1完整程序:冒泡法9选择法对N个数从大到小排序

第0趟排序:从a[0]至a[N-1],比较找出其中最大数所在的下标k,若k!=0,说明a[k]比a[0]大,则交换a[0]和a[k],通过这一趟的比较找到第1个最大的数放在a[0]的位置

……for(j=0;j<=N-2;j++)/*第j趟排序,通过这一趟排序,找到第j+1大的数存于a[j]*/{/*从a[j]至a[N]

,比较找出其中最大数所在的下标max_i

*/max_i=j;for(i=j+1;i<=N-1;i++)if(a[i]>a[max_i]){max_i=i;}/*若max_i!=j,说明a[max_i]比a[j]大,则交换*/if(max_i!==j){t=a[max_i];

a[max_i]=a[j];

a[j]=t;

}}第J趟排序:从a[j]至a[N-1]

,比较找出其中最大数所在的下标k,若k!=j,说明a[k]比a[j]大,则交换a[j]和a[k],通过这一趟的比较找到第j+1个最大的数放在a[j]的位置共N-1趟10#include

<stdio.h>#define

N

200void

main(){ int

a[N],i,j,max_i,t;printf("Input

%d

score:\n",N);for(i=0;i<=N-1;i++)scanf("%d",&a[i]);for(j=0;j<=N-2;j++)/*选择法排序*/{max_i=j;for(i=j+1;i<=N-1;i++)if(a[i]>a[max_i])

/*若从小到大排序,改成<*/{max_i=i;}if(max_i!==j){t=a[max_i];

a[max_i]=a[j];

a[j]=t;

}}printf("

\n

The

sortedscore:\n");for(i=0;i<=N-1;i++)printf("%4d

",a[i]);{

if(i%15==0)

printf("\n");}}例6-1完整程序:选择法11查找算法顺序查找:按数组下标顺序查找二分法查找(折半查找)我们查字典的时候怎样查找?在已经排好序的情况下可以进行二分查找。过程:先找到查找区域的中点,如果中间比要找的值小,说明要找的值在右半边,反之,在左半边,相等则表示找到。若没有找到,在新的查找区域,继续这样查找,直至所有的区域都找到。二分法程序12#include<stdio.h>#define

N

200void

main(){

int

a[N],left,

right,

mid,x,find_i=-1;left

=0;right

=

n

-

1;printf(“please

input

the

number

to

search:”);scanf(“%d”,&x);

/*输入要找的数x*/while

(left<right&&find==-1)/*还有区域没找,而且目前还未找到*/{ mid=(left

+right)

/2;/*求区域的中点*/if

(x

>

a[mid]) /*设定右边为新的查找区*/left

=

mid+

1;{}else if(x<a[mid])/*设定左边为新的查找区*/{ right

=

mid

-

1;}else{

find_i=mid;break;/*找到,结束*/}}if(find_i==-1) /*find_i的值没变,表示没找到*/printf(“not

found!”);elseprintf(“a[%d]=%d”,find_i,x);}13小结我们已经讲了数组的最常见的应用查找最大值、特定值计算总和、平均分排序当数组里存储的是字符串时该怎样修改前边例题的程序?14例:输入一个字符串,统计这个字符串中有多少个英文字母?算法:输入string统计英文字母的个数number输出number15程序#include<stdio.h>void

main(){int

i,number=0;char

a[30];for(i=0;a[i]!=‘\0’;i++)

/*{number++;}}printf(“the

string:%s

has

%d

letter!\n",a,number);}•gets()是C语言库函数,gets(a)的含义是:将从键盘上输入的一串字符存储在数组a中。也可用scanf(“%s”,a);实现输入,注意a是数组名,表示数组的起始地址,因此不用再写&二者的区别是前者可以接收空格,puts(“please

input

a

strin后g:者”)遇;到空格默认输入结束输出可以用puts(a),也可以用printf

(“%s”,a);{ if(a[i]>’a’&&

a[i]<’者在输出字符串后还多输出一个回gets(a);

/*一次性输入字符/串*

,存入a数组中*/一般字符数组中两存者储的的区字别符在串于前统长计度*/不定,所以循环条件不能用a车’I)|。<|3(a0[这i]>样’A的’&语&句a限[i]定>’Z,’)而应用

a[i]!=‘\0’作为循环结束条件*/16例6-5查找字符在字符串中出现的位置算法定义字符数组用来存储字符串查找输出查找结果17#include<stdio.h>void

main()

/*在一个固定的字符串中查找是否存在空格*/{int

i,counter=0;char a[30]="I

am

a

teacher.";/*一般用字符串常量对字符数组初始化,也可以用char a[30]={‘I’,’

’,’a’,’m’,’

’,’a’,’

’,’t’,’e’,’a’,’c’,’h’,’e’,’r’,’.’};系统会将未赋值的数组元素自动赋值为‘\0’.

*/for(i=0;a[i]!=‘\0’;i++)

/*查找*/{

if(a[i]==‘

‘){printf(“在字符串%s

中的位置为空格。\n",i+1);counter++;}}printf(“the

string:%s

has

%d

space!\n",a,counter);}若想实现“在任意字符串中查找是否存在任意要找的字符”。18#include<stdio.h>void main()/*在任意字符串中查找是否存在一个任意字符*/{ int

i,p=-1;char

a[30],ch;puts(“please

input

astring:”);gets(a);

/*输入*/puts(“please

inputa

character

to

search:”);ch=getchar();for(i=0;a[i]!='\0';i++){

if(a[i]==ch) /*找到即结束*/{

p=i;break;}}if(p!=-1) /*根据p的值判断是否找到。*/printf("字符%c

在字符串%s

中的位置为:%d

。\n",ch,a,p+1);elseprintf("字符%c

在字符串%s

中没有找到。\n",ch,a);}19字符数组与数值型数组的区别字符型数组定义时长度要尽量大一些,至少要为‘\0’留出位置。字符型数组的输入输出一般不用循环实现对字符型数组进行循环操作时,一般循环条件为:遇到‘\0’结束。或者也可用

i<strlen(a)作为循环条件。20与字符串相关的库函数在<string.h>中定义了若干专门的字符串处理函数strlen:strlen(字符串);返回字符串的实际长度,即不包括‘\0’的实际字符个数strcpy:strcpy(目的字符串,源字符串);strcat:strcat(目的字符串,源字符串);strcmp:strcmp(字符串1,字符串2);当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小返回其ASCII码比较的结果值作业1:P178还有两个函数,请自学。21求三个字符串中最大的一个算法:输入字符串str1,str2,str3比较str1和str2,将最大值赋给strmax再拿strmax和str3进行比较,若str3大,再将str3赋值给strmax。输出strmax22#include<stdio.h>#include

<string.h>#define

N

50main(){

char str1[N],

str2[N],

str3[N],

strmax[N];printf(“Please

enter

three

strings:\n”);gets(str1);

gets(str2);

gets(str3);/*输入三个字符串*/if(strcmp(str1,str2)>0)/*求前两个字符串的最大值strmax*/strcpy(strmax,

str1);elsestrcpy(strmax,

str2);if(strcmp(str3,strmax)>0)/*求strmax和str3的最大值*/strcpy(strmax,

str3);}printf("The

max

is:");puts(strmax);}程序23错误2:if

(str1>str2)最容易出现的错误错误1:str1=str2;字符串不能直接整体复制!strcpy(str1,str2);

/*正确*/也不能用关系运算符比较大小if(strcmp(str1,str2)>0)/*正确*/写错也不会提示语法错误,为什么?24例6-7

判断回文数123

温馨提示

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

评论

0/150

提交评论