第七章数组 (8学时)
学习目的与要求:
1 、重点掌握一维数组的定义和引用;
2 、基本掌握二维数组的定义和引用;
3 、重点掌握字符型数组的定义与引用;
4 、能正确使用字符串处理函数;
5 、学会使用数组解决实际问题。
重点:
1 、一维数组的定义与引用;
2 、二维数组的定义与引用;
3 、字符数组的定义与引用;
第1讲
知识归纳:
1、一维数组的定义:类型说明符数组名[ 常量表达式 ] ;
(1)(1)数组名后必须用方括弧 [ ] ,用其他括弧均错误;
(2) 方括弧中的常量表达式表示数组的元素个数;
(3) 方括弧中的常量表达式,必须是能计算出具体数值,且不改变的常量,不能是变量;
2、一维数组的引用:
数组名[ 下标 ]
for ( i =0 ; i<7 ; i ++ ) printf( “%c” , c1[ i ] );
(2)将整个字符串一次输入输出,用格式符%s ;
如:char c1[10] ;
scanf ( “ %s”, c1) ; 100]; D) int N=100;
int num[N];
(2003年9月)
25、有以下程序
main()
{ char a[ ]={‘a’,‘b’,‘c’,‘d’, ‘e’, ‘f’,‘g’,‘h’,‘\0’}; int i,j;
i=sizeof(a); j=strlen(a);
printf(“%d,%d\b”i,j);
}
程序运行后的输出结果是( )。
A)9,9 B)8,9 C)1,8 D)9,8
(2002年9月)
21、C 22、C 23、D 24、B 25、D
二、填空题
1、下面fun函数的功能是将形参x的值转换成二进制数,所得二进制数的每一位数放在一
维数组中返回,二进制数的最低位放在下标为0的元素中,其它依此类推。请填空。
fun(int x,int b[])
{ int k=0,r;
do
{ r=x%2;
b[k++]=r;
x/=2 ; } while(x); } (1996年4月)
2 2
2、以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相
同字符的ASCII码之差。例如:输入的两个字符串分别为abcdef和abceef,则输出为-1。
请填空。
#include< >
main()
{ char str[100],str2[100],c;
int i,s;
printf("\n input string 1:\n"); gest(str1);
printf("\n input string 2:\n"); gest(str2);
i=0;
while((strl[i]==str2[i]&&(str1[i]!= ))
i++;
s= ;
printf("%d\n",s);
} (1998年9月)
'\0'或0 strl[i]-str2[i]
3、若想通过以下输入语句使a中存放字符串1234,b中存放字符5,则输入数据的形式应该是a=1234 b=5 A或a=1234b=5。
char a[10],b;
scanf("a=%s b=%c",a,&b); (1999年4月)
4、以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低
于平均分的学生成绩,用输入负数结束输入。请填空。
main( )
{ float x[1000], sum=,ave, a;
int n=0,i;
printf("Enter mark:\n");scanf("%f",&a);
while(a>=&& n<1000)
{ sum+; x[n]=;
n++; scanf("%f",&a);
}
ave=;
printf("Output:\n");
printf("ave=%f\n",ave);
for (i=0;i if printf (“%f\n”,x[i]); } (1999年9月) =a a sum/n x[i] 5、下面程序的功能是:将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。 请填空。 #include< > #include< > main() { char a[]="clanguage",t; int i, j, k; k=strlen(a); for(i=0; i<=k-2; i+=2) for(j=i+2; j<=k;j+=2) if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } puts(a); printf("\n"); } (2000年4月) 6、下列程序段的输出结果是Hello。 main() { char b[]=”Hello,you”; b[5]=0; printf(“%s \n”, b ); } (2001年4月) 7、若变量n中的值为24,则prnt函数共输出5行,最后一行有4个数。 void prnt(int n, int aa[ ]) { int i; for(i=1; i<=n;i++) { printf(“%6d”, aa[i]); if( !(i%5) ) printf(“\n”); } printf(“\n”); } (2001年4月) 8、若已定义:int a[10], i;,以下fun函数的功能是:在第一个循环中给前10个数组元素依次赋1、2、3、4、5、6、7、8、9、10;在第二个循环中使a数组前10个元素 中的值对称折叠,变成1、2、3、4、5、5、4、3、2、1。请填空。 fun( int a[ ]) { int i; for(i=1; i<=10; i++) =i; for(i=0; i<5; i++) =a[i]; } (2001年9月) a[i-1] a[9-i] 9、若有定义语句: char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以 实现字符串拷贝。(注:不得使用逗号表达式) while(s[i]){ d[j]=s[i++];j++;} d[j]=0; (2001年9月) 10、以下程序的输出结果是abc。 main() { char s[]="abcdef"; s[3]=‘\0'; printf("%s\n",s); } (2002年4月) 11、若有以下程序 main() { int a[4][4]={{1,2,-3,-4},{0,-12,-13,14},{-21,23,0,-24},{-31,32,-33,0}}; int i,j,s=0; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(a[i][j]<0)continue; if(a[i][j]==0)break; s+=a[i][j]; } } printf("%d\n",s); } 执行后输出的结果是58。(2003年4月) 12、函数YangHui的功能是把杨辉三角形的数据赋给二维数组的下半三角,形式如下 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 其构成规律是: 第0列元素和主对角线无素均为1 其余元素为其左上方和正上方元素之和 数据的个数每行递增1 请将程序补充完整。 #defint N 6 void YangHui(int *[N][N]) { int i,j; x[0][0]=1 for(i=1;i { x[i][0]= =1; for(j=1;j x[i][j]= ; } } (2003年4月) x[i][i] x[i-1][j-1]+x[i-1][j]或 [i-1][j]+x[i-1][j-1] 13、以下程序运行后的输出结果是1 3 7 15。 main() { int i, n[]={0,0,0,0,0}; for(i=1;i<=4;i++) { n[i]=n[i-1]*2+1; printf(“%d”,n[i]); } } (2003年9月) 14、以下程序运行后的输出结果是1 2 3 0 5 6 0 0 9。 main() { int i,j,a[][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) for(j=i+1;j<3;j++) a[j][i]=0; for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("&d ", a[i][j]); printf("\n"); } } (2003年9月) 15、以下程序的功能是将字符串s中的数字字符放入d数组中,最后输出d中的字符串。 如,输入字符串:abc123edf456gh,执行程序后输出:123456。请填空。 #include <> #include <> main() { char s[80], d[80]; int i, j; gets(s); for(i=j=0; s[i]!=‘\0’; i++) if( s[i]>='0' && s[i]< ='9') { d[j]=s[i]; j++;} d[j]=‘\0’; puts(d); } (2003年9月) 第七章数组 (8学时) 学习目的与要求: 1 、重点掌握一维数组的定义和引用; 2 、基本掌握二维数组的定义和引用; 3 、重点掌握字符型数组的定义与引用; 4 、能正确使用字符串处理函数; 5 、学会使用数组解决实际问题。 重点: 1 、一维数组的定义与引用; 2 、二维数组的定义与引用; 3 、字符数组的定义与引用; 第1讲 知识归纳: 1、一维数组的定义:类型说明符数组名[ 常量表达式] ; (1) (1)数组名后必须用方括弧[ ] ,用其他括弧均错误; (2) 方括弧中的常量表达式表示数组的元素个数; (3) 方括弧中的常量表达式,必须是能计算出具体数值,且不改变的常量,不能是变量; 2、一维数组的引用: 数组名[ 下标] //下标从0开始,可以是整型常量或整型表达式; (1) 注意:数组元素引用时,不要超出数组范围; 如int a[10] ; //可以引用的数组元素为a[0]……a[9] , a[10] 不是本数组元素; 3、一维数组的初始化: (1) (1)可以在定义数组后,立刻赋值;如int a [3] = { 1,3, 5} ; 但下面这样是错误的: int a[3] ; a = { 1,3, 5} ; (2) (2)可以给数组的部分元素赋值,不赋值的元素,默认值为int 0, char, …?, float 0.0 ; 如int a [3]= {1,3 } ; //a[0] =1 ; a[1]= 3 ; a[2]= 0 ; (3) 在对数组全部元素赋初值时,可以不指定元素个数; (4) 可以在循环控制下,给数组各元素赋值; 如:int a[10] ; for ( i=0 ; i <10 ;i ++ ) a [ i ] = i ; 基础训练(A) 一、选择题 1、在c语言中,引用数组元素时,其数组下标的数据类型允许是()。 A)整型常量B)整型表达式 C)整型常量或整型表达式D)任何类型的表达式 2、要说明一个有10个int元素的数组,应当选择语句()。 A) int a[10]; B) int a(10); C) int a[9] D) int a[11] 3、以下对数组的正确定义是:()。 A) float b[5.0] B) float b[5] C) float b(5) D) float b[] 4、对以下说明语句的正确理解是()。 int a[10]={6,7,8,9,10}; A)将5个初值依次赋给a[1]至a[5] C语言复习题及答案第七章数组 第七章数组 (8学时) 学习目的与要求: 1 、重点掌握一维数组的定义和引用; 2 、基本掌握二维数组的定义和引用; 3 、重点掌握字符型数组的定义与引用; 4 、能正确使用字符串处理函数; 5 、学会使用数组解决实际问题。 重点: 1 、一维数组的定义与引用; 2 、二维数组的定义与引用; 3 、字符数组的定义与引用; 第1讲 知识归纳: 1、一维数组的定义:类型说明符数组名[ 常量表达式 ] ; (1) (1)数组名后必须用方括弧 [ ] ,用其他括弧均错误; (2) 方括弧中的常量表达式表示数组的元素个数; (3) 方括弧中的常量表达式,必须是能计算出具体数值,且不改变的常量,不能是变量; 2、一维数组的引用: 数组名[ 下标 ] //下标从0开始,可以是整型常量或整型表达式; (1) 注意:数组元素引用时,不要超出数组范围; 如 int a[10] ; //可以引用的数组元素为a[0]……a[9] , a[10] 不是本数组元素; 3、一维数组的初始化: (1) (1)可以在定义数组后,立刻赋值;如 int a [3] = { 1,3, 5} ; 但下面这样是错误的: int a[3] ; a = { 1,3, 5} ; (2) (2)可以给数组的部分元素赋值,不赋值的元素,默认值为int 0, char, ‘’, float 0.0 ; 如 int a [3]= {1,3 } ; //a[0] =1 ; a[1]= 3 ; a[2]= 0 ; (3) 在对数组全部元素赋初值时,可以不指定元素个数; (4) 可以在循环控制下,给数组各元素赋值; 如:int a[10] ; for ( i=0 ; i <10 ;i ++ ) a [ i ] = i ; 基础训练(A) 一、选择题 1、在c语言中,引用数组元素时,其数组下标的数据类型允许是()。 第7章数组 第1次课:2学时 一、教学内容 1、一维数组的定义和引用 2、二维数组的定义和引用 二、教学目标 1.了解一维数组、二维数组的基本概念; 2.掌握数组的定义与引用; 3.掌握数组元素的引用 三、教学重点及难点 重点:数组的定义和引用 难点:数组的定义和引用 四、教学方法 多媒体教学,案例驱动,实例演示,提问。 五、教学过程设计 在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。 7.1 一维数组的定义和引用 7.1.1 一维数组的定义方式 在C语言中使用数组必须先进行定义。 一维数组的定义方式为:类型说明符数组名[常量表达式]; 其中:类型说明符是任一种基本数据类型或构造数据类型;数组名是用户定义的数组标识符;方括号中的常量表达式表示数据元素的个数,也称为数组的长度。 对于数组类型说明应注意以下几点: (1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。 (2) 数组名的书写规则应符合标识符的书写规定。 (3) 数组名不能与其它变量名相同。 (4) 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a 有5 个元素。但是其下标从0 开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。 (5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。 数组练习解答 1 定义一个名为a的单精度实型一维数组,长度为4,所有元素的初值均为0的数定义语句是________________ 【分析】按照一般数据定义语句的格式,可以直接写出方法一(参看答案);考虑到所有元素均赋初值时可以省略数组长度,可以写出方法二(参看答案);考虑到不省略数组长度,给部分元素赋初值时,所有未赋初值的元素均有空值(对数值型数组来说,初值为0),可以写出方法三(参看答案);考虑到选用静态型,不赋初值所有元素也自动赋予。空值(对数值型数组来说,初值为0),可以写出方法四(参看答案)。 【答案】方法一:float a[4]={0.0,0.0,0.0,0.0}; 方法二:float a[]={ 0.0,0.0,0.0,0.0}; 方法三:float a[4]= {0.0}; 方法四: static float [4]; 2 下列数组定义语句中,错误的是() ① char x[1]='a';②auto char x[1]={0}; ③ static char x[l];④ char x[l]; 【分析】显然答案①中给字符型数组赋初值的格式不对(不能直接赋予字符常量,必须用花括号括住),所以备选答案①是符合题意的答案。 【答案】① 3 用"冒泡排序法"对n个数据排序,需要进行n一1 步。其中第k步的任务是:自下而上,相邻两数比较,小者调上;该操作反复执行n-k次。现在假设有4个数据:4、l、3、2要排序,假定4为上、2为下,则利用"冒泡排序法"执行第2步后的结果是_________________。【分析】开始排序前的排列执行第1步后的排列执行第2步后的排列 4 1 1 1 4 2 3 2 4 2 3 3 【答案】 l、2、4、3 4 用"选择排序法"对n个数据排序,需要进行n-1步。其中第k步的任务是:在第k个数据到第n个数据中寻找最小数,和第k个数据交换。现在假设有4个数据:4、1、3、2要排序,则利用"冒泡排序法"执行第2步后的结果是______________________。 【分析】开始排序前的排列为: 4 1 3 2 执行第1步后的排列为: 1 4 3 2 执行第2步后的排列为: 1 2 3 4 【答案】1、2、3、4 5 下列数组定义语句中,正确的是() ① int a[][]={1,2,3,4,5,6};② char a[2]「3]='a','b'; ③ int a[][3]= {1,2,3,4,5,6};④ static int a[][]={{1,2,3},{4,5,6}};【分析】C语言规定,二维数组定义时不允许省略第二维的长度,所以备选答案①④是错误的。C语言还规定,定义字符型数组时不允许直接使用"字符常量"的方式赋初值,所以备选答案②也是错误的。显然备选答案③符合题意。【答案】③ 6 定义一个名为"s"的字符型数组,并且赋初值为字符串"123"的错误语句是() ①char s[]={‘1','2','3','\0 '};②char s「」={"123"}; ③char s[]={"123\n"}; ④ char s[4]={'1','2','3'}; 【2008春上机编程题_C07】 【解题思路】:在理解上述要求基础上,只用一个主函数完成:找出Fibonacci 数列的前40个数,存放在一维数组m[40](声明长整型变量long)中,然后找出其中所有素数,存放在一维数组n[40]中(提示:n数组要求对素数总数以k计数),再选用一种排序法对一维数b进行降序排列,最后按长整型量以“%9ld” 形式、一行五个数据将满足条件的数据输出到屏幕: 【提示】:排序方法有“简单起泡法”;“双向起泡法”;“选择法”;所以要求学生在调试上述程序基础上按班组选取排序方法,编写本次作业。(约定:起始Fibonacci数列存放在一维数组m[40]中,挑选出的素数存放在一维数组n[40]中,最后以升序排列的数组n输出,满足素数的个数设定为k)。 参考程序: 简单起泡排序法:(参考教科书P134) { 双向起泡排序法:(参考上机指导书P54例、2010春完善程序题第15题或软件第七章填空第15题)原理为“下列程序的功能是对n数组n[0]~a[k-1]中存储的k 个整数从大到小排序。排序算法是:第一趟通过比较将k个整数中的最小值放在a[k-1]中,最大值放在a[0]中;第二趟通过比较将k个整数中的次小值放在a[k-2]中,次大值放在a[1]中,………,依次类推,直到待排序序列为递减序列。” 选择排序法:(参考上机指导书P50例) 课堂练习空余时间或课后业余时间练习知识题 【软件第七章】 选择: 1,下列一维数组的声明中,正确的是____(22)_____。 , A. int a[]; B. int n=10,a[n]; C. int a[10+1]={0}; D. int a[3]={1,2,3,4}; 5.以下程序运行后的输出结果是_____(25)___。 main() { char a[7]="a0\0a0\0";int i,j; i=sizeof(a);j=strlen(a); printf("%d %d",i,j); } 2 B.7 2 C.7 5 2 8.以下声明中错误的是_____(27)_____。 A. int a[2]; B. int a[]={0,1}; C. int a[3]=0; D. nt a[3][4]={0}; ¥ 11. 已知有声明"int m[]={5,4,3,2,1}, i=0;",下列对数组元素的引用中,错误的是_____(27)_____。 A. m[++i] B. m[5] C. m[2*2] D. m[m[4]] 参考资料:数制变换 输入一个十进制数,输出为二进制数形式的一维整型数组 第7章数组 【练习7-1】将例7-3 程序中的break 语句去掉,输出结果有变化吗?假设输入数据不变,输出什么?解答: 当去掉break 语句后,一旦找到数据将不跳出循环,而是继续往下找值为x 的元素,因 此程序输出会有变化。当输入数据仍为2 9 8 1 9 时,输出将是index is 1 index is 4。 【练习7-2】将数组中的数逆序存放。输入一个正整数n(1 printf("Input %d integer:",n); for(i=0;i int main(void) { int i,index,n; int a[10]; printf("Enter n:"); scanf("%d",&n); printf("Enter %d integrs:",n); for(i=0;i 数组复习题 一.选择题 1.若有以下定义语句:int a[]={1,2,3,4,5,6,7,8,9,10}; 则值为5 的表达式是:() a) a[5] b) a[a[4]] c) a[a[3]] d) a[a[5]] 2.要求定义具有80个、char类型元素的一维数组,错误的定义语句是:() a) #define N 80 b) int N=80; char s[N]; char s[N]; c) #define N 40 d) char s[40+40]; char s[2*N]; 3. 若有以下定义语句:int a[10]={1,2,3,4,5,6,7,8,9,10}; 则对a 数组元素正确的引用是:() a) a[10] b) a[a[3]-5] c) a[a[9]] d) a[a[4]+4] 4. 若有以下定义语句:float a[11]={0,1,2,3,4,5,6,7,8,9,10}; 则以下叙述中错误的是:() a) a数组在内存中占44个字节 b) a数组的最后一个元素为a[10] c) a数组的第一个元素为a[0] d) 以上定义语句给a数组所赋初值是整数,不能正确赋值 5. 若有以下定义语句:double a[5]; int i=0; 能正确给a数组元素输入数据的语句是:() a) scanf(“%lf%lf%lf%lf%lf”,a); b) for(i=0 ;i<=5 ;i++) scanf(“%lf”,a+i); c) while(i<5) scanf(“%lf”,&a[i++]); d) while(i<5) scanf(“%lf”,a+i); 6. 以下关于数组的描述正确的是:() a) 数组的大小是固定的,但可以有不同数据类型的数组元素 b)数组的大小是可变的,但所有数组元素的数据类型须相同 c) 数组的大小是固定的,且所有数组元素的数据类型须相同 d) 数组的大小是可变的,且可以有不同数据类型的数组元素 7. 若有说明:int a[10];,则对a数组元素引用不正确的是:() a) a[5+5] b) a[5.5] c) a[10-10] d) a[5] 8. 执行int a[ ][3]={1,2,3,4,5,6,7};语句后,a[1][0]的值是:() a) 1 b) 3 c) 5 d) 4 9. 若有说明:int k[ ][4]={1,2,3,4,5,6,7,8,9,10,11};,则k数组的第一维长度是:() a) 3 b) 2 c) 1 d) 无确定值 10. 若有以下程序: void main() { int k[9]={19,16,17,15,13,11,10,9}, i=1,s=0; while(i<9 && k[i]%3) s=s+k[i++];C语言复习题及答案 第七章 数组
C语言复习题及答案 第七章 数组教程文件
《C语言程序设计》第7章 数组
C语言数组典型例题分析报告与解答
☆C语言实验五(第七章一维数组:排序综合题)
C语言程序设计(第3版)何钦铭 颜 晖 第7章 数组
C语言第七章数组部分复习题