您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > 中国科技大学 C语言讲义7
数组是一组有序数据的集合,数组中每一个元素的类型相同。用数组名和下标来唯一确定数组中的元素。6.11维数组的定义和引用6.22维数组的定义和引用6.3字符数组与字符串第6章数组1、一维数组的定义定义方式:存储类型符数据类型符数组变量名[整型常量表达式];数组中各元素的存储类别数组元素的数据类型合法的标识符表示元素个数下标从0开始用分号结尾例如:inta[10];//定义了有10个数据元素的int型数组afloatf[20];//定义了有20个数据元素的float型数组fcharstr1[10],str2[20];//定义了有10个和20个数据元素的char型数组str1和str26.11维数组的定义和引用定义说明:(1)数组定义时,必须指定数组的大小(或长度),数组大小必须是整型常量表达式,不能是变量或变量表达式。(2)数组定义后,系统将给其分配一定大小的内存单元,其所占内存单元的大小与数组元素的类型和数组的长度有关。数组所占内存单元的字节数=数组大小×sizeof(数组元素类型)例如,下面对数组的定义是错误的:intn=10;inta[n];//数组的大小不能是变量intb[10.3];//数组的大小不能是浮点常量intc[n+10];//数组的大小不能是变量表达式例如:shortinta[20];则数组a所占内存单元的大小为:20*sizeof(short)=20*2=40(字节)占用的字节数为:10*sizeof(short)=10*2=20a[0]a[1]a[2]a[9]……内存地址2000200220042018a……第1个元素……第2个元素第3个元素第10个元素2、一维数组的引用引用格式:数组变量名[下标]引用说明:(1)下标可以是整型常量、整型变量或整型表达式。C语言规定,下标的最小值是0,最大值则是数组大小减1。注意越界问题。(2)只能逐个引用数组元素,不能一次引用整个数组(3)数组定义以后,数组中的每一个元素其实就相当与一个变量,所以我们有时也把数组元素称为下标变量。对变量的一切操作同样也适合于数组元素。(4)数组必须先定义,后使用存储单元有效地址=数组的起始地址+下标×sizeof(数组元素类型)shortinta[10];shortx=a[10];//引用越界,a[10]的地址为:2000+10*2=2020,只能引用a[0]~a[9]例inta[10];printf(“%d”,a);()必须for(j=0;j10;j++)printf(“%d\t”,a[j]);()例:inta[3];a[0]=2;//将数组a的第1个元素赋值为2a[1]=4;//将数组a的第2个元素赋值为4a[2]=a[0]+a[1];//将数组a的第1个元素的值与第2个元素的值相加赋给第3个元素(值为6)例intx=a[1];//错误,应先定义数组a,再引用inta[10];[例]使数组元素a[0]~a[9]的值为0~9,然后逆序输出。#include“stdio.h”voidmain(){inti,a[10];for(i=0;i=9;i++)a[i]=i;for(i=9;i=0;i--)printf(%d,a[i]);}运行输出:98765432103、一维数组的初始化1、一般初始化,例、staticinta[10]={0,1,2,3,4,5,6,7,8,9};intarray[10]={1,2,3,4,5,6,7,8,9,10};2、部分元素初始化,例、staticinta[10]={0,1,2,3,4};3、全部元素均初始化为0,不允许简写。例、staticinta[10]={0,0,0,0,0,0,0,0,0,0};不能简写为:staticinta[10]={0*10};4、如果全部元素均指定初值,定义中可以省略元素的个数,例、staticinta[]={1,2,3,4,5};一维数组在程序中赋值C语言除了在定义数组变量时用初值列表对数组整体赋值以外,无法再对数组变量进行整体赋值。例inta[5];a={1,2,3,4,5};a[]={1,2,3,4,5};a[5]={1,2,3,4,5};错误!数组定义后,如何对数组进行赋值呢?只能通过C语句对数组中的数组元素逐一赋值。使用赋值语句来逐一赋值例inta[4];a[0]=1;a[1]=2;a[2]=3;a[3]=4;charstr[80];str[0]='b';str[1]='y';str[2]='e';str[3]='\0';//将数组str赋值为一字符串bye这种方法是一种简单而且行之有效的方法,它适用于长度较小的数组或对长度较大的数组部分元素赋值,而且可对每个数组元素赋不同的值。一维数组在程序中赋值使用循环语句来逐一赋值例如,将数组a的各元素赋值成奇数序列。inta[10],i;for(i=0;i10;i++)a[i]=2*i+1;例如,接受用户键盘输入赋值给数组各元素。inta[10],i;for(i=0;i10;i++)scanf(%d,&a[i]);判断下列赋值是否正确?inta[3];scanf(%d%d%d,a);×这种方法是在编程中普遍使用的一种方法,它适用于对某数组元素进行有规律的赋值或接受用户通过键盘输入对数组元素的赋值。4、一维数组应用举例【例1】输入一行字符,统计其中各个大写字母出现的次数。#includestdio.hvoidmain(void){charch;intnum[26]={0},i;while((ch=getchar())!='\n')//输入字符串,判断统计if(ch='A'&&ch='Z')//是否为大写字母num[ch-'A']++;for(i=0;i26;i++)//输出结果{if(i%9==0)printf(\n);printf(%c(%d),'A'+i,num[i]);}printf(\n);}运行结果:AABBCCxyYzEEE↙A(2)B(2)C(2)D(0)E(3)F(0)G(0)H(0)I(0)J(0)K(0)L(0)M(0)N(0)O(0)P(0)Q(0)R(0)S(0)T(0)U(0)V(0)W(0)X(0)Y(1)Z(0)4、一维数组应用举例【例2】用冒泡排序法将10个整数按照从小到大的顺序排序排序过程:(1)比较第一个数与第二个数,若为逆序a[0]a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上;(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置;(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟1327第七趟4938659776132730初始关键字n=838497697979797132730137676762730136565652730134949492730133838382730冒泡排序图示效果forj=0toNUM–i–1输入NUM个数给a[0]到a[NUM-1]fori=1toNUM–1a[j]a[j+1]真假a[j]a[j+1]输出a[0]到a[NUM–1]#includestdio.h#defineNUM10voidmain(){inta[NUM],i,j,t;printf(input%dnumbers:\n,NUM);for(i=0;iNUM;i++)//输入NUM个整数scanf(%d,&a[i]);for(i=1;iNUM;i++)//趟数,共NUM-1趟for(j=0;jNUM-i;j++)//实现一次冒泡操作if(a[j]a[j+1])//交换a[j]和a[j+1]{t=a[j];a[j]=a[j+1];a[j+1]=t;}//输出排好序的数据printf(thesortednumbers:\n);for(i=0;iNUM;i++)printf(%d,a[i]);}运行结果:input10numbers:10127689345↙thesortednumbers:12345678910不足之处:对已排好序的序列仍然要进行9轮冒泡操作,尽管不会有任何数据交换操作。如何修改呢?对冒泡排序的改进:当一次冒泡过程中发现没有交换操作时,表明序列已经排好序了,便终止冒泡操作。为了标记在比较过程中是否发生了数据交换,在程序中设立一个标志变量flag,在每趟比较前,把flag变量置为0,如果在这趟比较过程中发生了交换,把变量flag的值置为1。在这一趟比较结束后判断如果flag变量取值等于0表示可以结束排序过程,否则进行下一趟比较。#includestdio.h#defineNUM10voidmain(){inta[NUM],i,j,t,flag;printf(input%dnumbers:\n,NUM);for(i=0;iNUM;i++)//输入NUM个整数scanf(%d,&a[i]);for(i=1;iNUM;i++)//轮次,共NUM-1次{flag=0;for(j=0;jNUM-i;j++)//实现一次冒泡操作if(a[j]a[j+1])//交换a[j]和a[j+1]{t=a[j];a[j]=a[j+1];a[j+1]=t;flag=1;}if(flag==0)break;}printf(thesortednumbers:\n);//输出排好序的数据for(i=0;iNUM;i++)printf(%d,a[i]);}4、一维数组应用举例【例3】用选择排序法将10个整数按照从小到大的顺序排序排序过程:(1)首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上;(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序;(3)重复上述过程,共经过n-1趟排序后,排序结束。初始:[49386597761327]ji=11349一趟:13[386597764927]i=22738二趟:1327[6597764938]三趟:132738[97764965]四趟:13273849[769765]五趟:1327384965[9776]六趟:132738496576[97]kkkkjjjjjjjjjjk选择排序图示效果输入n个数给a[1]到a[n]fori=1ton-1forj=i+1tona[j]a[k]真假k=j输出a[1]到a[n]k=ia[i]a[k]i!=k真假#includestdio.hvoidmain(){inta[11],i,j,k,x;printf(Input10numbers:\n);for(i=1;i11;i++)scanf(%d,&a[i]);printf(\n);for(i=1;i10;i++){k=i;for(j=i+1;j=10;j++)if(a[j]a[k])k=j;if(i!=k){x=a[i];a[i]=a[k];a[k]=x;}}printf(Thesortednumbers:\n);for(i=1;i11;i++)printf(%d,a[i]);}f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...1f[19]145231901【例4】用数组求Fibonacci数列前20个数235#includestdio.hvoidmain(){inti;intf[20]={1,1};for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){if(i%5==0)printf(\n);printf(%12d,f[i]);}}4、一维数组应用举例F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn
本文标题:中国科技大学 C语言讲义7
链接地址:https://www.777doc.com/doc-7028783 .html