C语言题库数组和结构题库第四章 数组和结构
一、选择题
1. 有结构型定义如下:
struct person
{
char name[20];
int age;
int sex;
}w[5],*p=w;
那么下面scanf语句中对结构变量成员不正确的引用是( )。
A.scanf(“%s”,w[0].name); B.scanf(“%d”,&w[0].age);
C.scanf(“%d”, &(p->sex)); D.scanf(“%d”, p->age);
答:D
2. 处理字符串必须调用 (1...
第四章 数组和结构
一、选择题
1. 有结构型定义如下:
struct person
{
char name[20];
int age;
int sex;
}w[5],*p=w;
那么下面scanf语句中对结构变量成员不正确的引用是( )。
A.scanf(“%s”,w[0].name); B.scanf(“%d”,&w[0].age);
C.scanf(“%d”, &(p->sex)); D.scanf(“%d”, p->age);
答:D
2. 处理字符串必须调用 (1) ,且首先要声明预编译命令 (2) 。不能用赋值运算符“=”对字符串赋值,应调用 (3) 函数;也不能用关系运算符“= =”、“>”、“<”对字符串进行比较,应调用 (4) 函数。
答案:(1)字符串库函数 (2)# include
(3)strcpy (4)strcmp
3. 有如下程序段:
char str[14]={"I am "};
strcat(str, "sad !");
scanf("%s", str);
printf("%s", str);
当输入为happy!时,输出的结果是( )。
(A)I am sad! (B)happy!
(C)I am happy! (D)happy!ad!
答案:(B)
4. 以下对二维数组a进行不正确初始化的是 。
A.int a[ ] [3]={3,2,1,1,2,3};
B.int a[ ] [3]={{3,2,1},{1,2,3};
C.int a[2] [3]={{3,2,1},{1,2,3}};
D.int a[ ] [ ]={{3,2,1},{1,2,3}};
答案:D
5. 以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。
#define N 10
void arrin(int x[N])
{
int i=0;
while (i
#include
void main( )
{
char b[30];
strcpy (&b[0],"CH");
strcpy (&b[1],"DEF");
strcpy (&b[2],"ABC");
printf ("%s\n",b);
}
A)CHDEF B)DEFABC C)CDABC D)CHABC
答案:C
8. 下面能正确定义一维数组的选项是 。
A)int num[ ] B)#define N 100 C)int num[0..100] D)int N=100
int num[N] int num[N]
答案:B
9. 下面正确的数组定义语句是 。
A)int y[1][4]={1,2,3,4,5};
B)float x[3][ ]={{1},{2},{3}};
C)long s[2][3]={{1},{1,2},{1,2,3}};
D)double t[ ][3]={0};
答案:D
10. 执行下列程序时,输入123<空格>456<空格>789<回车>,输出结果是 。
#include
void main( )
{
char s[100];
int c,i;
scanf ("%c",&c);scanf("%d",&i);scanf("%s",s);
printf("%c,%d,%s\n",c,i,s);
}
A)123,456,789 B)1,456,789 C)1,23,456,789 D)1,23,456
答案:D
11. 下面程序的输出结果为( )。
#include
void main( )
{
int a[3],i,j,k=2;
for(i=0;i<3;i++)
a[i]=0;
for(i=0;i
void main( )
{
int i,j,k;
char str[5];
for(i=0;i<5;i++)str[i]='A';
k=4;
for(i=0;i
void main( )
{
char s[4][20];
int i;
scanf ("%s%s",s[0],s[1]);
gets(s[2]);gets(s[3]);
for(i=0;i<4;i++)
puts(s[i]);
}
输入数据如下:(此处代回车符)
aa bb
cc dd
A)aa B)aa C)aa D)aa bb
bb bb bb cc
cc cc dd dd
cc dd dd
答案:A
14. 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是 。
(A)3 (B)6 (C)10 (D)20
答案:D
15. 以下程序的输出结果是 。
#include
#include
void main( )
{
char st[20]="hello\0\t\\";
printf("%d %d \n",strlen(st),sizeof(st));
}
(A)9 9 (B)5 20 (C)13 20 (D)20 20
答案:B
16. 以下对结构体类型变量td的定义中,错误的是 。
(A)typedef struct aa (B)struct aa
{ int n; { int n;
float m; float m;
}AA; }td;
AA td; struct aa td;
(C)struct (D)struct
{ int n; { int n;
float m; float m;
}aa; }td;
struct aa td;
答案:C
17. 下列程序的输出结果为 。
#include
void main()
{
int k=0,i,s[ ]={1,-9,7,2,-10,3};
for (i=0;i<6;i++)
if (s[i]>s[k])
k=i;
printf("\n%d\n",k);
}
(A)4 (B)2 (C)3 (D)1
答案:B
18. 有如下定义:
struct date {int year,month,day;};
struct worklist{char name[20];char sex;struct date birthday;}personone;
对结构体变量personone的出生年份进行赋值时,下面正确的赋值语句是 。
(A)year=1968 (B)birthday.year=1968
(C)personone.birthday.year=1968 (D)personone.year=1968
答案:C
19. 若程序中有如下的说明和定义:
struct exep
{ int x,y;}
struct exep x,y;
…
则会发生的情况是 。
(A)编译时出错
(B)能通过编译、连接、执行
(C)能通过编译但连接出错
(D)能通过编译、连接,但不能执行
答案:A
20. 设有以下语句
typedef struct S
{ int g; char h;} T;
则下面叙述中正确的是 。
A)可用S定义结构体变量 B)可以用T定义结构体变量
C)S是struct类型的变量 D)T是struct S类型的变量
答案:B
21. 有结构定义如下:
struct
{
int k:2;
int:0;
unsigned int m:5;
}st;
那么变量st所占用的字节数是( )。
A.3 B.2 C.1 D.4
答:B
22. 以下对结构类型变量的定义中,不正确的是 。
A)typedef struct aa B)# define AA struct aa
{
int n;AA AA{ int n;
float m; float m;
}AA; }tdl;
AA tdl;
C)struct D)struct
{ int n; { int n;
float m; float m;
}aa; }tdl;
struct aa td1;
答案:C
23. 当执行下面的程序时,如果输入ABC,则输出结果是 。(2001年4月)
#include
#include
void main()
{
char ss[10]= "12345";
gets(ss);
strcat(ss, "6789");
printf("%s\n",ss);
}
A)ABC6789 B)ABC67 C)12345ABC6 D)ABC456789
答案:A
24. 给出以下定义
char x[ ]="abcdefg";
char y[ ]={'a','b','c','d','e','f','g'};
则正确的叙述为 。
A)数组x和数组y等价
B)数组x和数组y的长度相同
C)数组x的长度大于数组y的长度
D)数组x的长度小于数组y的长度
答案:C
25. 下面程序的输出是
A) 0
B) 1
C) 3
D) 6
#include
void main ( )
{
struct cmplx{
int x; int y;
}cnum[2]={1,3,2,7};
printf("%d\n",cnum[0].y /cnum[0].x * cnum[1].x);
}
答案:D
26. 下列程序的输出结果是
A) 5
B) 6
C) 7
D) 8
#include
struct abc
{
int a, b, c;
};
void main()
{
struct abc s[2]={{1,2,3},{4,5,6}};
int t;
t=s[0].a+s[1].b;
printf("%d \n",t);
}
答案:B
27. 设有以下说明语句
struct ex
{
int x ; float y; char z ;
}example;
则下面的叙述中不正确的是
A) struct是结构体类型的关键字
B) example是结构体类型名
C) x,y,z都是结构体成员名
D) struct ex是结构体类型名
答案:B
28. 设有如下说明
typedef struct
{
int n; char c; double x;
}STD;
则以下选项中,能正确定义结构体数组并赋初值的语句是
A) STD tt[2]={{1,'A',62},{2, 'B',75}};
B) STD tt[2]={1,"A",62},2, "B",75};
C) struct tt[2]={{1,'A'},{2, 'B'}};
D) struct tt[2]={{1,"A",62.5},{2, "B",75.0}};
答案:A
29. 有以下程序
#include
void main()
{
int i,test ,p[17],head;
for(i=0;i<16;i++)
p[i]=i+1;
p[16]=0;
test=0;
while(test!=p[test])
{
for(i=1;i<3;i++)
{
head=test;
test=p[test];
}
p[head]=p[test];
test=p[head];
}
printf("\n%5d",test);
}
程序执行后的输出结果是_______。
A)1,2,3
B)2,3,4
C)10
D)4
答案:C
30. 有以下程序
#include
void main()
{
int num[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},i,j;
for(i=0;i<4;i++)
{
for(j=0;j<=i;j++) printf("%4c",' ');
for(j=_____;j<4;j++) printf("%4d",num[i][j]);
printf("\n");
}
}
若要按以下形式输出数组右上半三角
1 2 3 4
6 7 8
11 12
16
则在程序下划线处应填入的是______。
A)i-1
B)i
C)i+1
D)4-i
答案:B
31. 有以下程序
#include
void main()
{
int p[8]={11,12,13,14,15,16,17,18},i=0,j=0;
while(i++<7)
if(p[i]%2)
j+=p[i];
printf("%d\n",j);
}
程序运行后的输出结果是______。
A)42
B)45
C)56
D)60
答案:B
32.有以下程序
#include
void main()
{
char p[]={'a', 'b', 'c'}, q[]="abc";
printf("%d %d\n", sizeof(p),sizeof(q));
}
程序运行后的输出结果是______。
A)4 4
B)3 3
C)3 4
D)4 3
答案:C
33. 有以下程序
#include
#include
void main()
{
char p[ ]={'a', 'b', 'c'}, q[10]={'a', 'b', 'c'};
printf("%d %d\n", strlen(p), strlen(q));
}
以下叙述中正确的是______。
A)在给p和q数组置初值时,系统会自动添加字符串结束符,故长度都为3
B)由于p数组中没有字符串结束符,长度不能确定;但q数组中字符串长度为3
C)由于q数组中没有字符串结束符,长度不能确定;但p数组中字符串长度为3
D)由于p和q数组中都没有字符串结束符,故长度都不能确定
答案:B
34. 有以下程序
#include
#include
void main()
{
char a[7]="a0\0a0\0"; int i,j;
i=sizeof(a); j=strlen(a);
printf("%d %d\n",i,j);
}
程序运行后的输出结果是______。
A)2 2
B)7 6
C)7 2
D)6 2
答案:C
35.设有如下说明
typedef struct ST
{long a;int b;char c[2];}NEW;
则下面叙述中正确的是______。
A)以上的说明形式非法
B)ST是一个结构体类型
C)NEW是一个结构体类型
D)NEW是一个结构体变量
答案:C
36.以下对结构体类型变量td的定义中,错误的是______。
A)typedef struct aa
B)struct aa
{ int n;
{ int n;
float m;
float m;
}AA;
}td;
AA td;
struct aa td;
C)struct
D)struct
{ int n;
{ int n;
float m;
float m;
}aa;
}td;
struct aa td;
答案:C
37. 表达式strcmp ("box", "bottle") 的值是 。
A) 正整数 B) 负整数 C) 0 D) 不确定的数
答案:A
二、填空题
1. 有如下程序段:
#include
void main( )
{
char s[ ]= "SSSWiL TECH1\1\11W\1WALLMP1";
int j;
char ch;
for (j=2;(ch=s[j])!='\0';j++)
{
switch (ch)
{
case'A':
putchar('a');continue;
case'1':
break;
case 1:
while ((ch=s[++j])!='\n'&&ch!='\0');
case 9:
putchar('#');
case'E':
case'L':
continue;
default :
putchar(ch);continue;
}
putchar('*');
}
printf ("\n");
}
此程序段的输出结果是 。
答案:Swi TCH * #
2. 定义结构类型如下:
struct a
{
char c;
char s[20];
int m;
};
请使用此类型定义一个结构变量b1,并在定义时给各成员变量赋初值,使c的值为‘n’,s中存放字符串“person”,m的值为3: 。
答案:struct a b1={'n',"person",3};
3. 以下sum函数的功能是计算下列级数之和。(2004年4月)
s=1+x+x2/2!+x3/3!+……+xn/n!
请给函数中的各变量正确赋初值。
double sum (double x,int n)
{
int i; double a,b,s;
for (i=1;i<=n;i++)
{
a=a*x;b=b*i;s=s+a/b;
}
return s;
}
答案:a=b=s=1.0
4. 以下程序用来输出结构体变量ex所占存储单元的字节数:
#include
struct st
{
char name[20];double score;
};
void main ( )
{
struct st ex;
printf (“ex size:%d\n”,sizeof ( ));
}
答案:ex或struct st
5. 由25人围坐成圆圈,先从任意一人出发,用1到25顺时针依次编号,然后从1号开始顺时针报数(1、2、3、…),凡报5的倍数者出圈,剩下者继续报数,求出最后出圈者的编号。
# include
void main ( )
{
int a[26],j,n,count;
for (=1;j<=25;j++) a[j]=j;
j=1;count=0;n= 【1】 ;
do
{
if (a[j]!=0)
{
n++;
if (n%5= =0)
{
【2】 ;
if (count= =24)printf ("%d\n, ",j);
count++;
}
}
j++;
if (j>25)j=1;
}while ( 【3】 );
}
答案:【1】0 【2】a[ j ]=0 【3】count<25
6. 有一个已排好序的数组,现输入一个数,要求按原来的顺序规律,将它插入到数组中。采用的算法是:假设排序为从小到大,对输入的数,检查它在数组中哪一个数之后,然后将比这个数大的数顺序后移一个位置,在空出的位置上将该数插入。请填空。
# include
# define N 100
void main ( )
{
float a[N+1],x;
int i,p;
printf (“输入已排好序的数列:”);
for (i=0;i=p 3 i<=N
7. 以下程序运行后的输出结果是 。
#include
void 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");
}
}
答案:
1 2 3
0 5 6
0 0 9
8. 下面程序对输入的字符串中每一个数字出现的次数进行计数。请补全程序。
#include
void main( )
{ int j,ch, 【1】 ;
for(j=0;j<10;++j) digit[j]=0;
while((ch=getchar( ))!='\n')
if(ch>= '0'&&ch<= '9') 【2】 ;
for (j=0;j<10;++j)
printf("%d: %d\n",j,digit[j]);
}
答案:【1】digit[10] 【2】digit[ch- '0 ']++
9. 以下程序运行后的输出结果是 。
#include
void main( )
{
int a[4][4]={{1,2,3,4},{5,6,7,8,},
{11,12,13,14},{15,16,17,18}};
int i=0,j=0,s=0;
while (i++<4)
{
if(i==2||i==4)continue;
j=0;
do{
s+=a[i][j];j++;
}while(j<4);
}
printf("%d\n",s);
}
答案:92
10. 下述程序的功能是:从键盘中输入n个整数,使用冒泡法对这n个整数从小到大进行排序并输出。请在横线上填上相应的内容。
#include
void main( )
{
int i,j,temp,a[100],n;
scanf("%d",&n);
for(i=0;ia[j+1]
11. 以下程序统计从终端输入的字符中每个大写字母的个数,num[0]中统计字母A的个数,其他依次类推。用#号结束输入,请填空。
#include
#include
void main()
{
int num[26]={0}, i; char c;
while( 【1】 !='#')
if(isupper(c)) num[ 【2】 )+=1;
for(i=0;i<26;i++)
if(num[i])printf("%c:%d\n",i+'A',num[i]);
}
答案:【1】(c=getchar()) 【2】c-'A'
12. 以下程序的功能是将字符串s中的数字字符放入d数组中,最后输出d中的字符串。例如,输入字符串abc123edf456gh,执行程序后输出123456。请填空。(2003年9月)
#include
#include
void main( )
{
char s[80],d[80];
int i,j;
gets(s);
for(i=j=0;s[i]!= '\0';i++)
if( ) {d[j]=s[i];j++;}
d[j]= '\0';
puts(d);
}
答案:s[i]>= '0'&&s[i]<= '9'或s[i]>=48&&s[i]<=57
三、编程题
1. 编写一个程序,使用下面的结构,以结构数组的形式存储颜色编码,要求程序输出数组的各颜色值,把每种颜色的编码和颜色名按行显示在屏幕上。
struct color_table
{
int color; /* color code number*/
char col_name[10]; /* color name*/
}
答:
程序如下:
#include
struct color_table
{
int code;
char col_name[11];
};
void main ( )
{
struct color_table col_array[]={
0,"BLACK",
1,"BLUE",
2,"GREEN",
3,"CYAN",
4,"RED",
5,"MAGENTA",
6,"BROWN",
7,"LIGHTGRA",
8,"DARKGRAY",
9,"LIGHTBLUE",
10,"LIGHTGREEN",
11,"LIGHTCYAN",
12,"LTGHTRED"
};
int i;
for (i=0;i<=12;i++)
printf ("%d %s\n",col_array[i].code,col_array[i].col_name);
}
2. 编写一个程序,在一维数组里输入一句英文,统计该句里出现的单词个数(单词之间是用空格分隔的)。
答:程序编写如下:
#include
void main( )
{
char str[80];
int j,n=0,w=0;
printf("Please input a sentence:\n");
gets(str);/*ÊäÈëÒ»¾äÓ¢ÎÄ*/
for(j=0;str[j]!='\0';j++)
if(str[j]==' ')
w=0;
else if(w==0)
{
w=1;
n++;
}
printf("There are %d words in this line.\n",n);
}
这里,开辟一个长为80个字符的一维数组str,由它存放输入的英文句子。输入后,从前往后扫视数组中的每一个元素,直到遇见字符串结束符‘\0’时停止。扫视时,对字符的性质加以判别。如果是空格就跳过去;如果是字符,则表示进入了一个单词,需要记数。但有两个问题需要考虑:一是不能光用空格数来反映单词数,因为有时可能会出现连续几个空格。比如下图第2次运行时,单词banner与on之间出现了3个空格;二是不能遇到字符就记数,对于每一个单词,只能记数一次。因此,在程序里设置了一个标志w, 遇到空格时,就把w置为0,表示在单词之外。一旦遇到字符且w等于0,则表示是进入一个新的单词,于是让变量n记数,同时把w改置为1,表示现在位于单词之内。
3. 定义一个结构,有3个成员:姓名、基本工资、岗位工资。说明一个该结构的结构数组。对其元素按下表初始化。然后打印每个人的姓名和工资总额。
姓名
基本工资
岗位工资
Li hua qiu
845
1800
Liu ming shang
920
2400
答:程序编写如下:
#include
struct person
{
char name[20];
int wages;
int subsidy;
};
void main( )
{
struct person s[4]={{"Li hua qiu",845,1800},{"liu ming shang",920,2400}};
int k;
for(k=0;k<2;k++)
printf("%s:%d\n",s[k].name,s[k].wages+s[k].subsidy);
}
4.在上题结构定义的基础上,于主函数main里输入10个人员信息,然后输出应发放的工资总额、工资数最大者和最小者信息。
答:程序编写如下:
#include
struct person
{
char name[20];
int wages;
int subsidy;
};
void main( )
{
int k,pmax,pmin;
int sum;
struct person s[10];
printf("Please enter information:\n");
for(k=0;k<10;k++)
scanf("%s%d",s[k].name,&s[k].wages,&s[k].subsidy);
sum=s[0].wages+s[0].subsidy;
pmax=s[0].wages+s[0].subsidy;
pmin=s[0].wages+s[0].subsidy;
for(k=1;k<10;k++)
{
sum+=s[k].wages+s[k].subsidy; /*求总工资*/
if(pmaxs[k].wages+s[k].subsidy) /*求最低工资*/
pmin=s[k].wages+s[k].subsidy;
}
printf("sum=%1d,max=%d,min=d\n",sum,pmax,pmin);
}
5. 让用户输入一系列的整数,先将其按从小到大的顺序排列并去掉重复的数据,再请用户输入一个任意的整数,在整数序列中查找该数,若找到,反馈给用户关于已经找到的提示和此数在数组中的位置,否则,将此数插入到这一整数序列中保证不破坏有序性的位置上,反馈给用户有关未找到此数和已经将此数插入到序列中的位置信息。
解析:排序是程序中的重要内容之一,据不完全统计,在一般的数据处理程序中,排序占去了处理机时间的四分之一,而在典型的应用程序中,一半以上的时间用在对表的排序上。内排序大都使用数组作为存储结构,是对数组的直接应用方式之一。
#include "stdio.h"
void main ( )
{
int data[200],sdata;
//data[200]用于存放输入的数据序列
int i,j,k,n;
//用于存放将输入的数据的个数
printf ("amount of datas(1-100):\n");
scanf ("%d",&n);
printf ("input datas one by one:\n");
for (i=0;i=0;j--)
if (data[j]<=temp)
break;
if (data[j]j;k--)
data [k+1]=data[k];
data[j+1]=temp;
i++;
}
else n--;
}
printf ("data to search or insert:\n");
scanf ("%1d",&sdata);
//输入将要插入或者查找的数据
if (sdata=0;i--)
data[i+1]=data[i];
data[0]=sdata;
}
else if(sdata>data[n-1])//输入的数据比原序列中最大的还要大,插到原序列的末尾
{
printf ("No find and insert at %dth.\n",n+1);
data[n]=sdata;
}
else if(data[0]==sdata) //等于原序列的最小数,返回找到消息和此数的位置
printf ("find,location at 1th\n");
else if(data[n-1]==sdata)//等于原序列的最大数,返回找到消息和此数的位置
printf ("find ,location at %dth\n",n);
else
//不是上述的各种情况,则用折半法在序列中查找
{
int front=0,hind=n-1,middle;
while (hind-front>1)
{
middle=(hind+front)/2;
if (data[middle]==sdata)
break; //找到,退出循环
else if(data[middle]>sdata)
hind=middle;
else front=middle;
}
if(data[middle]==sdata)//找到,则打印找到的位置
printf ("find,location at %dth\n",middle+1);
else //没找到,执行插入
{
for(i=n-1;i>front;i--)
data[i+1]=data[i];
data[front+1]=sdata;
printf ("No find and insert at %dth\n",front+2);
}
}
}
6. 编写一个程序,采用二分查找法从有序数列{0,2,5,8,12,15,23,35,60,65}中查找指定元素的位置。
解:用i、j分别存放查找区间的低端序号和高端序号,m=(i+j)/2,如果a[m]= =x,则找到了元素;若x>a[m],则i=m+1;若x=j为止。程序如下:
#include
void main( )
{
int a[ ]={0,2,5,8,12,15,23,35,60,65};
int x,i=0,j=9,m;
printf ("输入元素:");
scanf ("%d",&x);
while (ia[m])
i=m+1;
else break;
}
if (a[m]==x)
printf ("序号:%d\n",m);
else
printf ("不存在%d元素\n",x);
}
7. 编写一个程序,它读进一行字符,把它们存放在有80个元素的字符数组中。如果在读完80个字符前遇到行结束符‘\n’,也应停止输入。然后把所有空格和数字移出后,显示所有字符。
【解】程序编写如下:
#include
#include
void main( )
{
int k;
char line[80];
printf("Please enter a string:\n");
for(k=0;k<80&&(line[k]=getchar( ))!='\n';k++);
for(k=0;k<80&&(line[k]!= '\n');k++)
if(line[k]!=' '&& line[k]< '0'|| line[k]> '9')
putchar(line[k]);
putchar('\n');
}
题目中的要求:“如果在读完80个字符前遇到行结束符‘\n’,也应停止输入”,是由程序中的条件:
k<80&&(line[k]=getchar( ))!='\n'
来控制的。打印输出时,由条件:
line[k]!=' '&& line[k]< '0'|| line[k]> '9'
来跳过空格和数字。
下图所示的是一次运行的结果。
本文档为【C语言题库数组和结构题库】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。