您好,欢迎访问三七文档
Chap5数组5.1一维数组5.2二维数组5.3字符串本章要点什么是数组?为什么要使用数组?如何定义数组?如何引用数组元素?二维数组的元素在内存中按什么方式存放?什么是字符串?字符串结束符的作用是什么?如何实现字符串的存储和操作,包括字符串的输入和输出?怎样理解C语言将字符串作为一个特殊的一维字符数组?例5.1输入一个正整数n(1n≤10),再输入n个整数,用冒泡法将它们从小到大排序后输出。5.1.1程序解析5.1.2一维数组的定义和引用5.1.3一维数组的初始化5.1.4使用一维数组编程5.1一维数组热身:输入3个数,按从小到大的顺序输出#includestdio.hIntmain(){inta,b,c,t;scanf(“%d%d%d”,&a,&b,&c);if(ab)//a和b中较小数放a中{t=a;a=b;b=t;}if(ac)//a和c中较小数放a中{t=a;a=c;c=t;}if(bc)//b和c中较小数放b中{t=b;b=c;c=t;}printf(“%d,%d,%d”,a,b,c);}若要对4个数排序输出呢?5个数,100个数呢?例5.1排序——阅读程序#includestdio.hintmain(){inti,index,k,n,temp;inta[10];/*定义1个数组a,它有10个整型元素*/scanf(%d”,&n);for(i=0;in;i++)scanf(%d,&a[i]);for(i=1;in;i++)for(j=0;jn-i;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}printf(Aftersorted:);for(i=0;in;i++)/*输出n个数组元素的值*/printf(%d,a[i]);return0;}//读入n个数,存入数组a//对n个数排序,现在可以不会//输出排序后的n个数103528122890-17Aftersorted:-101235782289for(i=0;in;i++)printf(%d,a[i]);数组:相同类型数据的有序集合,在内存中连续存放。–由数组名和下标唯一地确定每个数组元素–每个元素都属于同一类型一批相同类型的变量使用同一个数组变量名,用下标来相互区分。优点:表述简洁,可读性高;便于使用循环结构数组0129a[0]a[1]a[9]a3528122890-17i从0变到9,输出a[0]~a[9]5.1.2一维数组的定义和引用1、定义类型名数组名[数组长度]类型名:数组元素的类型数组名:数组(变量)的名称,标识符数组长度:常量表达式,给定数组的大小inta[10];定义一个含有10个整型元素的数组acharc[200];定义一个含有200个字符元素的数组cdoublearr[5];定义一个含有5个实型元素的数组arr2、引用先定义,后使用只能引用单个的数组元素,不能一次引用整个数组数组名[下标]下标:整型表达式取值范围:[0,数组长度-1]inta[10];10个元素:a[0]、a[1]、……a[9]数组元素的使用方法与同类型的变量相同scanf(“%d”,&a[i]);//从键盘读入一个整数,存入a[i]//下标为index的元素与下标为k的元素互换内容temp=a[index];a[index]=a[k];a[k]=temp;printf(“%d”,a[i]);//输出a[i]的值下标不要越界不能使用a[10]定义数组类型名数组名[数组长度]引用数组元素数组名[下标]inta[10];a[0]=a[9]=0;a[k]=temp;区分数组的定义和数组元素的引用下标不要越界:[0,数组长度-1]数组长度为常量5.1.3一维数组的初始化定义数组时,对数组元素赋初值类型名数组名[数组长度]={初值表};inta[10]={1,2,3,4,5,6,7,8,9,10};a[0]=1,a[1]=2,...…a[9]=10静态数组、动态数组的初始化staticintb[5]={1,2,3,4,5};静态存储的数组如果没有初始化,所有元素自动赋0staticintb[5];动态存储的数组如果没有初始化,所有元素为随机值autointc[5];//intc[5];staticintb[5]={1,2,3};b[0]=1,b[1]=2,b[2]=3,b[3]=0,b[4]=0autointfib[20]={0,1};fib[0]=0,fib[1]=1,其余元素不确定如果对全部元素都赋初值,可以省略数组长度inta[10]={0,1,2,3,4,5,6,7,8,9}针对部分元素的初始化建议不要省略数组长度5.1.4使用一维数组编程数组和循环for(i=0;in;i++)printf(%d,a[i]);数组下标作为循环变量,通过循环,逐个处理数组元素一维数组示例例5-2用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。1,1,2,3,5,……例5-3输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“NotFound”。例5-4输入n(n10),再输入n个数(1)求最小值(2)求最小值和它所对应的下标(3)将最小值与第一个数交换,输出交换后的n个数例5-1输入n(n10),再输入n个数,用选择法将它们从小到大排序后输出。用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。1,1,2,3,5,8,13,……用数组计算并存放fibonacci数列的前20个数f[0]=f[1]=1f[n]=f[n-1]+f[n-2]2≤n≤19例5-2计算fibonacci数列#includestdio.hintmain(){inti;intfib[20]={1,1};/*数组初始化*/for(i=2;i20;i++)fib[i]=fib[i-1]+fib[i-2];for(i=0;i20;i++){printf(%6d,fib[i]);if((i+1)%5==0)/*5个数换行*/printf(\n);}return0;}例5-2源程序11235813213455891442333776109871597258441816765输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“NotFound”。输入:298969输出:1输入:298967输出:NotFound例5-3在数组中查找一个给定的数#includestdio.hintmain(){inti,flag,x,a[5];printf(“Enter5integers:);for(i=0;i5;i++)scanf(%d,&a[i]);printf(“Enterx:);scanf(%d,&x);flag=0;//找不到flag为0,找到flag置为1for(i=0;i5;i++){if(a[i]==x)//若找到,flag置为1,终止循环{printf(“Indexis%d\n,i);flag=1;break;}}if(flag==0)//若循环结束后flag的值仍为0,说明没找到xprintf(NotFound\n);return0;}例5-3源程序Enter5integers:29819Enterx:9Indexis1Enter5integers:29819Enterx:7NotFound#includestdio.hintmain(void){inti,flag,x;inta[5];printf(“Enter5integers:);for(i=0;i5;i++)scanf(%d,&a[i]);printf(“Enterx:);scanf(%d,&x);flag=0;for(i=0;i5;i++)if(a[i]==x){printf(Indexis%d\n,i);flag=1;break;}if(flag==0)printf(NotFound\n);return0;}例5-3思考(1)Enter5integers:29819Enterx:9Indexis1Indexis4#includestdio.hintmain(void){inti,sub,x;inta[5];printf(“Enter5integers:);for(i=0;i5;i++)scanf(%d,&a[i]);printf(“Enterx:);scanf(%d,&x);sub=-1;for(i=0;i5;i++)if(a[i]==x)sub=i;if(sub!=-1)printf(Indexis%d\n,i);elseprintf(NotFound\n);return0;}例5-3思考(2)Enter5integers:29819Enterx:9Indexis4{sub=i;break;}结果如何?#includestdio.hintmain(void){inti,min,n;inta[10];printf(“Entern:);scanf(%d,&n);printf(“Enter%dintegers:,n);for(i=0;in;i++)scanf(%d,&a[i]);min=a[0];//a[0]做临时最小值for(i=1;in;i++)if(a[i]min)min=a[i];printf(minis%d\n,min);return0;}例5-4(1)求最小值Entern:6Enter6integers:29-1816minis-1选最小值,采用擂台赛的思想:先用第一个元素初始化临时最小值min(擂主),然后逐个元素与min比较,如果比min小,则用其值更新min输入n(n10),再输入n个数,输出最小值和它所对应的下标。用min记录最小值用index记录对应的下标例5-4(2)求最小值及其下标#includestdio.hintmain(void){inti,index,n;inta[10];printf(“Entern:);scanf(%d,&n);printf(“Enter%dintegers:,n);for(i=0;in;i++)scanf(%d,&a[i]);min=a[0];index=0;//a[0]做临时最小值for(i=1;in;i++)if(a[i]min){min=a[i];index=i;}printf(minis%d\tsubis%d\n,a[index],index);return0;}求最小值及下标Entern:6Enter6integers:29-1816minis-1subis2用min记录最小值用index记录对应的下标输入n(n10),再输入n个数,输出最小值和它所对应的下标。用index记录最小值对应的下标a[index]就是最小值求最小值及其下标可以只用一个变量index#includestdio.hintmain(void){inti,index,n;inta[10];printf(“Entern:);scanf(%d,&n);printf(“Enter%dintegers:,n);for(i=0;in;i++)scanf(%d,&a[i]);index=0;//a[0]做临时最小值for(i=1;in;i++)if(a[i]a[index])index=i;printf(minis%d\tsubis%d\n,a[index],index);return0;}求最小值及下标只用一个变量indexEntern:6Enter6integers:29-1816minis-1subis2用index记录最小值对应的下标a[index]就是最小值输入n(n10),再输入n个数,将最小值与第一个数交换,输出交换后的n个数。用index记录最小值对应的下标a[index]就是最小值最小值与第一个
本文标题:c语言 数组
链接地址:https://www.777doc.com/doc-3080960 .html