LOGO数组如果程序操纵着大量的数据,那它一定是用较少的方法得到的。LOGO数组的作用•人们借助计算机来记录每月开支、季度销售额;企业计算员工薪水,仓库存货等,程序员需要处理大量的相互关联的数据,采用数组通常能够有效便捷地处理这类数据。LOGO数组分类•数组由一系列类型相同的元素构成,有一个统一的名字:•一维数组:floatcandy[365];•二维数组:intm[5][8];•数组通过下标访问数组中的每个元素。所以它既可以处理一批元素,也可以处理个别元素。LOGO一、一维数组(P108)•inta[10];•a是一个具有10个元素的数组,每个元素都是整型的值。•这个数组里的元素为a[0],a[1]…a[9]•[]中的数字叫做下标或索引,用来标识数组元素,从0开始到n-1.•C语言不检查下标的范围,如果使用了错误的下标(a[10]=2;),可能导致程序崩溃。•数组中的每个元素相当于一个独立的变量。LOGO数组初始化•像其他变量一样,数组也可以在声明时初始化。•对数组的全部元素赋值:•intbig[10]={1,2,3,4,5,6,7,8,9,10};•对数组的前几个元素赋值,那么剩余元素为0:•intbig[10]={1,2,3};LOGO•要把数组全初始化为0:•intbig[10]={0};•如果给定了初始化式,可省略掉数组的长度:•intbig[]={1,2,3,4,5,6,7,8,9,10};•编译器利用初始化式的长度来确定数组大小。(例2)LOGO数组和for循环•许多程序所包含的for循环都是为了对数组中的每个元素进行操作:•for(i=0;iN;i++)•a[i]=0;//数组a清0•for(i=0;iN;i++)•scanf(“%d”,&a[i]);//为数组a输入数值•for(i=0;iN;i++)•sum+=a[i];//数组内元素相加•LOGOC语言不检查下标的范围•inta[10],i;•for(i=1;i=10;i++)•a[i]=0;•这个表面上正确的for语句却产生了一个无限循环!当i变为10,程序将0存储在a[10]中,但是这个元素不存在,所以在a[9]后立刻进入内存。如果内存中i放在a[9]的后边,(这是有可能的)i就会重置为0,循环重新开始。LOGO程序:数列反相•要求用户输入一串数,然后反向输出这些数:•方法是读入时将其存储在一个数组中,然后反相遍历数组,一个接一个地显示数组元素。•#includestdio.h•#defineN10•main()•{•inta[N],i;LOGO•printf(“Enter%dnumbers:”,N);•for(i=0;iN;i++)•scanf(“%d”,&a[i]);•printf(“Inreverseorder:”);•for(i=N-1;i=0;i--)•printf(“%d”,a[i]);•printf(“\n”);•}LOGO程序:计算利息•显示一个表格:在几年时间内100美元投资在不同利率下的价值,用户输入利率和要投资的年数。投资总价每年计算一次,表格将显示在输入利率和紧随其后的4个更高利率下投资的总价值。•Enterinterestrate:6•Enternumberofyears:5LOGO•Years6%7%8%9%10%•1106.00107.00108.00109.00110.00•2112.36114.49116.64118.81121.00•3119.10122.50125.97129.50133.10•4126.25131.08136.05141.16146.41•5133.82140.26146.93153.86161.05•方法:可以用for语句显示第一行,第二行则要依赖于第一行。在计算第一行数时把它们存储到数组中,然后使用这些值计算第二行的内容。再重复此过程计算第三行。需要用到2个for语句,一个嵌套在另一个里面。外层循环将从1计数到用户要求的年数,内层循环将从利率的最低值递增到最高值。LOGO•#includestdio.h•#defineMONEY100.00•main()•{•inti,rate,num_years,year;•doublea[5];•printf(“Enterinterestrate:”);•scanf(“%d”,&rate);•printf(“Enternumberofyears:”);•scanf(“%d”,%num_years);•printf(“\nYears”);•for(i=0;i5;i++){•printf(“%6d%”,rate+i);•a[i]=MONEY;}••LOGO•printf(“/n”);•for(year=1;year=num_years;year++){•printf(“%3d”,year);•for(i=0;i5;i++){•a[i]+=(rate+i)/100.00*a[i];•printf(“%7.2f”,a[i]);•}•printf(“\n”);•}•}LOGO二、二维数组•intm[5][9]:声明数组m有5行9列•其中有5*9=45个数组元素:•a[0][0],a[0][1],a[0][2]…a[0][4]•a[1][0],a[1][1],…•…•a[4][0],……a[4][4]•所有元素依次存放,数组名字a代表数组的首地址LOGO初始化•1.分行赋值(每行以大括号分开)•intm[2][3]={{1,2,3},{2,3}}•可以只给部分行或者每行的部分元素赋值•2.不分行赋值:•intm[2][2]={2,3,5,6}•只适用于全部元素赋值•3.若给所有元素赋值,则第1维长度可省略:•inta[][3]={1,2,3,4,5,6}LOGO输入和输出•声明和引用的区别:声明时的下标只能为常量,引用时则可以是常量或变量:•for(i=0;i10;i++)•for(j=0;j7;j++)•printf(“%d”,a[i][j]);(例8、9)LOGO字符数组和字符串•字符串(characterstring)是用一对双引号括起来的字符序列,常常作为格式串出现在printf函数和scanf函数中。•printf(“wearetheworld.”);LOGO如何存储字符串•c语言把字符串当做字符数组来处理,当遇到长度为n的字符串时,它会为字符串分配长度为n+1的内存空间。这块空间存储字符串中的字符,以及一个用来标志字符串末尾的额外字符(空字符)\0:•“abc”:abc\0LOGO初始化字符串变量1.元素赋值:chardate[8]={‘J’,’u’,’n’,’e’,’‘,’1’,’4’,’\0’};•2.字符串赋值:chardate[8]=“June14”;•3.如果初始化式太短,则其余元素自动赋结束标志:•chardate[9]=“June14”;•这与C语言处理数组初始化式的方法一致,即余下数组元素初始化为0June14\0June14\0\0LOGO•4.如果初始化式太长:•chardate[7]=“June14”;•编译器将忽略空字符,使得数组无法作为字符串使用,此时它只是一个字符数组。•5.字符串声明中可以省略长度,编译器会自动计算:•chardate[]=“June14”;•编译器为date分配8个字符的空间。但这并不意味着以后可以改变数组的长度,一旦编译了程序,date的长度就固定了,当初始化式很长时,省略字符串长度是特别有效的,因为手工计算长度很容易出错。June14LOGO字符数组的输入输出•1.用printf函数和puts函数写字符串:•charstr[]=“Arewehavingfunyet?”;•printf(“%s\n”,str);•printf函数会逐个写字符串中的字符,直到遇到空字符时停止。•如果只想显示字符串的一部分:•printf(“%.6s\n”,str);•会显示:Arewe•字符跟数一样,可以在指定字段内显示,也可以左对齐或右对齐。LOGO•puts函数也可以输出字符串,使用方式如下:•puts(str);•在写完字符串后,puts函数总会添加一个额外的换行符,从而前进到下一个输出行的开始处。LOGO2.用scanf函数和gets函数读字符串•scanf(“%s”,str);•此时不需要在str前添加运算符&,因为str是数组名,它代表该数组存放的首地址,所以不需取址符。•用scanf函数读入字符串永远不会包含空白字符,空格、换行都会使scanf停止读入。例如若输入“HelloChina!”,则实际输入到数组str的是“Hello”。•为了一次读入一整行输入,可以使用gets函数:gets(str);LOGO•3.逐个字符读写字符串:•for(i=0;i10;i++)•scanf(“%c”,&str[i]);•由于字符串结束标志’\0’能够标志字符串的结束,因此可用于字符串的输出操作中:•for(i=0;str[i]!=‘\0’;i++)•printf(“%c”,str[i]);•这种方法使用非常灵活,无论字符串中的字符个数是否已知,都是有效的。LOGO字符串处理函数string.h•求字符串长度:strlen(字符串)•它返回字符串s的实际长度:第一个空字符之前的字符个数。•intlen;•len=strlen(“abc”);//lenis3•len=strlen(“”);//lenis0LOGO•字符串复制:strcpy函数•它弥补了不能使用赋值运算符复制字符串的不足,例如,假设想把“abcd”存储到str2中,不能使用:•str2=“abcd”;//wrong•因为str2是数组名,不能出现在赋值运算的左侧,但是这时可以调用strcpy函数:•strcpy(str2,“abcd”);//将后面字符串复制到前面字符数组中。•类似地,不能直接把str2赋值给str1:•strcpy(str1,str2);//str1中存储了“abcd”LOGO•字符串比较strcmp•为了检查str1是否小于str2,可以写•if(strcmp(str1,str2)0)•通过选择适当的关系运算符或判等运算符,可以测试str1与str2之间任何可能的关系。•只要满足下列两个条件之一,那么该函数就认为s1小于s2:•1.前i个字符一致,但是s1的第i+1个字符小于s2的第i+1个字符:“abc”“abd”•2.所有字符一致,但是s1比s2短:“abc”“abcd”LOGO•字符串连接函数:strcat•strcpy(str1,”abc”);•strcat(str1,”def”);•strcpy(str1,”abc”);•strcpy(str2,”def”);•strcat(str1,str2);•还可以这样使用:•strcpy(str1,”abc”);•strcpy(str2,”def”);•strcat(str1,strcat(str2,”ghi”));LOGO著名的斐波那契数列LOGOLOGOLOGO上机题:编写程序颠倒句子中单词的顺序•Enterasentence:youcandeskaeatcan’tyou?•Reverseofsentence:youcan’teatadesk,canyou?•提示:用循环逐个读取字符,然后将它们存储在一个一维数组中。当遇到句号、问号或者感叹号(称为“终止字符”)时,终止循环并把终止字符存储在一个char类型变量中。然后再用一个循环反向搜索数组,找到最后一个单词的起始位置。显示最后一个单词,然后反向搜索到数第二个单词,重复这一过程直至到达数组的起始位置。最后显示出终止字符。LOGOLOGO长度声明•假设需要一个变量来存储最多有80个字符的字符串,由于字符串在末尾处需要有空字符,我们把变量声明为含有81个字符的数组:•【惯用法】#defineSTR_LEN80•…•charstr[STR_LEN+1];LOGO对数组使用sizeof运