C语言课件第6章 数组

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章数组许建龙xujianlong126@126.com2020/1/212内容提要数组类型;向函数传递一维数组和二维数组;常用算法:排序、查找、求最大最小值等;用字符数组存取字符串;使用字符串处理函数处理字符串2020/1/213数组的用处保存大量同类型的相关数据–如矩阵运算,表格数据等2020/1/214数组(Array)inta[10];–定义一个有10个元素的数组,每个元素的类型均为int–使用a[0]、a[1]、a[2]、……、a[9]这样的形式访问每个元素。它们与普通变量没有任何区别–系统会在内存分配连续的10个int空间给此数组–数组下标可以是整型表达式–直接对a的访问,就是访问此数组的首地址a数组首地址a[9]a[8]a[7]a[1]a[0]…2020/1/215数组的定义与初始化数组定义后的初值仍然是随机数,一般需要我们来初始化inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};数组大小最好用宏来定义,以适应未来可能的变化–#defineSIZE10inta[SIZE];数组大小定义好后,将永远不变2020/1/216数组的使用数组的下标都是从0开始对数组每个元素的使用与普通变量无异可以用任意表达式作为下标,动态决定访问哪个元素for(i=0;iSIZE;i++)a[i]=2*i;下标越界是大忌!–使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果sizeof可以用来获得数组大小2020/1/217数组的特点快速地随机访问一旦定义,不能改变大小2020/1/218只能逐个对数组元素进行操作(字符数组例外)输入方法:inta[10],i;输入第i个数组元素:scanf(%d,&a[i]);输入整个数组元素:for(i=0;i10;i++)scanf(%d,&a[i]);输出方法:输出第i个数组元素:printf(%d,a[i]);输出整个数组元素:for(i=0;i10;i++)printf(%d,a[i]);一维数组的输入和输出2020/1/219例6.1兔子生崽问题Fibonacci数列–1,2,3,5,8,13,21,34,55,89,144,233,…)3()2(1)1(12121nnnnnnfffff2020/1/2110例6.1#includestdio.h#defineYEAR_MONTH12main(){intf[YEAR_MONTH+1]={0,1,2};intmonth;for(month=3;month=YEAR_MONTH;month++){f[month]=f[month-1]+f[month-2];}for(month=1;month=YEAR_MONTH;month++){printf(%d\t,f[month]);}printf(\nsum=%d\n,f[YEAR_MONTH]);}2020/1/2111例6.2—打印出最高分及其学生序号从键盘输入学生人数n;从键盘输入所有学生的学号和成绩分别存入数组num和score假设其中的一个学生成绩为最高,同时记录其学号,即令maxScore=score[0]maxNum=num[0];对所有学生成绩进行比较,即for(i=0;in;i++){若score[i]maxScore,则修改maxScore值为score[i],并记录其学号maxNum=num[i];}打印最高分maxScore及其学号maxNum;2020/1/2112#includestdio.h#defineARR_SIZE40main(){floatscore[ARR_SIZE],maxScore;intn,i;longmaxNum,num[ARR_SIZE];printf(Pleaseentertotalnumber:);scanf(%d,&n);printf(Pleaseenterthenumberandscore:\n);for(i=0;in;i++){scanf(%ld%f,&num[i],&score[i]);}maxScore=score[0];maxNum=num[0];for(i=1;in;i++){if(score[i]maxScore){maxScore=score[i];maxNum=num[i];}}printf(maxScore=%.0f,maxNum=%ld\n,maxScore,maxNum);}2020/1/2113#includestdio.h#defineARR_SIZE40floatFindMax(floatarr,intn);main(){floatscore[ARR_SIZE],maxScore;intn,i;printf(Pleaseentertotalnumber:);scanf(%d,&n);printf(Pleaseenterthescore:\n);for(i=0;in;i++){scanf(%f,&score[i]);}maxScore=FindMax(score,n);printf(maxScore=%.0f\n,maxScore);}floatFindMax(floatarr[],intn){floatmax;inti;max=arr[0];for(i=1;in;i++){if(arr[i]max){max=arr[i];}}returnmax;}2020/1/2114数组名作函数参数用数组名作参数,就是将数组的首地址传递给函数实参数组与形参数组占用同一段内存在函数中可对形参数组元素修改,结果会影响主调函数中的实参数组2020/1/2115简单变量作函数参数实参实参实参主调函数被调函数形参形参形参调用时执行被调函数从被调函数返回变量值变量值变量值变量值变量值变量值修改未变化2020/1/2116数组作函数参数实参实参实参主调函数被调函数形参形参形参调用时执行被调函数从被调函数返回地址值地址值地址值地址值……地址值地址值…修改已改变数组2020/1/2117现场演示排序算法交换法排序选择法排序2020/1/2118交换法排序交换法排序for(i=0;in-1;i++){for(j=i+1;jn;j++){if(score[j]score[i])交换成绩score[j]和score[i],交换学号num[j]和num[i];}}2020/1/2119交换法排序2020/1/2120选择法排序选择法排序for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++){if(score[j]score[k])记录此轮比较中最高分的元素下标k=j;}若k中记录的最大数不在位置i,则交换成绩score[j]和score[i],交换学号num[j]和num[i];}2020/1/2121选择法排序2020/1/2122现场演示查找算法顺序查找–特例:求最大值,求最小值折半查找2020/1/2123顺序查找intSearch(longa[],intn,longx){inti;for(i=0;in;i++){if(a[i]==x){return(i);}}return(-1);}2020/1/2124折半查找数组下标01234第一次循环:9901199013990159901799019①查找值x=99017lowmidhighxa[mid],low=mid+1第二次循环:9901199013990159901799019low=midhighx=a[mid],找到2020/1/2125折半查找数组下标01234第一次循环:9901199013990159901799019②查找值x=99016lowmidhighxa[mid],low=mid+1第二次循环:9901199013990159901799019low=midhighxa[mid],high=mid-1第三次循环:9901199013990159901799019highlow不满足low=high,循环结束,未找到2020/1/2126intBinSearch(longa[],intn,longx){intlow,high,mid;low=0;high=n-1;while(low=high){mid=(high+low)/2;if(xa[mid]){low=mid+1;}elseif(xa[mid]){high=mid-1;}else{return(mid);}}return(-1);}2020/1/2127字符串(String)与字符数组字符串–一串以'\0'结尾的字符在C语言中被看作字符串–用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'终结符–C语言并没有为字符串提供任何专门的表示法,使用字符数组和字符指针来处理字符数组–每个元素都是字符类型的数组charstring[80];2020/1/2128字符数组的初始化用字符型数据对数组进行初始化–charstr[6]={'C','h','i','n','a','\0'};用字符串常量直接对数组初始化–charstr[6]={China};–charstr[6]=China;2020/1/2129逐个输入输出for(i=0;s[i]!='\0';i++){putchar(s[i]);}putchar('\n');一次性输入输出scanf(%s,s);printf(%s,s);chars[10];字符数组的输入输出gets(s);puts(s);2020/1/2130scanf()inti;scanf(%d,&i);/*假如不用&i,就用i,能达到效果吗?*/charstr[10];scanf(%s,str);–不能读入带空格的字符串,gets()可以–这种用法很不安全。当用户的输入多于10个(含10个),str数组将越界–scanf被公认为最易遭到黑客攻击的函数之一2020/1/2131gets()字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机对输入字符串长度有限制的函数调用–fgets(buf,sizeof(buf),stdin);2020/1/2132字符串处理函数在string.h中定义了若干专门的字符串处理函数strcpy:stringcopy–char*strcpy(char*dest,constchar*src);strlen:stringlength–size_tstrlen(constchar*s);–返回字符串的实际长度,不包括'\0'strcat:stringcombination–char*strcat(char*dest,constchar*src);strcmp:stringcomparison–intstrcmp(constchar*s1,constchar*s2);–当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小字符串不能直接整体复制!str1=str2/*错误*/2020/1/2133‘\0’作为字符串结束符的天生缺陷假若交给这些字符串处理函数的字符串没有'\0'会如何?–'\0'很关键,如果没有,那么这些处理函数会一直进行处理直到遇到一个'\0'为止。此时可能已经把内存弄得乱七八糟ANSIC定义了一些“n族”字符处理函数,包括strncpy、strncat、strncmp等,通过增加一个参数来限制处理的最大长度–char*strcpy(char*dest,constchar*src,unsignedintcount);2020/1/2134例6.9从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名等价于求最小字符串2020/1/2135#include

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功