1以下为一维整型数组a的正确说明是.docx
《1以下为一维整型数组a的正确说明是.docx》由会员分享,可在线阅读,更多相关《1以下为一维整型数组a的正确说明是.docx(16页珍藏版)》请在冰豆网上搜索。
![1以下为一维整型数组a的正确说明是.docx](https://file1.bdocx.com/fileroot1/2022-11/30/2baacfbe-eacf-4e53-9a9a-1151dcfb4dbc/2baacfbe-eacf-4e53-9a9a-1151dcfb4dbc1.gif)
1以下为一维整型数组a的正确说明是
一、选择题
1.以下为一维整型数组a的正确说明是()。
A.inta(10);B.intn=10,a[n];
C.intn;D.#defineSIZE10;
scanf("%d",&n);inta[SIZE];
inta[n];
【答案】D
【说明】D选项符合语法格式,数组定义的长度不能为变量。
2.以下对二维数组a的正确说明是()。
A.inta[3][];B.floata(3,4);C.doublea[1][4];D.floata(3)(4);
【答案】C
【说明】C选项符合语法格。
3.若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为()(假设a[0][0]位于数组的第一个位置上)。
A.i*m+jB.j*m+iC.i*m+j-1D.i*m+j+1
【答案】D
【说明】D是公式。
4.若二维数组a有m列,则在a[i][j]前的元素个数为()。
A.j*m+iB.i*m+jC.i*m+j-1D.i*m+j+1
【答案】B
【说明】根据上题可知。
5.若有以下程序段:
inta[]={4,0,2,3,1},i,j,t;
for(i=1;i<5;i++)
{t=a[i];j=i-1;
while(j>=0&&t>a[j])
{a[j+1]=a[j];j--;}
A[j+1]=t;
}
则该程序段的功能是()。
A.对数组a进行插入排序(升序)B.对数组a进行插入排序(降序)
C.对数组a进行选择排序(升序)D.对数组a进行选择排序(降序)
【答案】B
【说明】插入法排序的基本思路是将一个数插入到前面已排好序的有序表中,从而得到一个新的、个数增1的有序排列。
6.有两个字符数组a、b,则以下正确的输入语句是()。
A.gets(a,b);B.scanf("%s%s",a,b);
C.scanf("%s%s",&a,&b);D.gets("a"),gets("b");
【答案】B
【说明】B选项中数组名a、b前不能加地址运算符。
gets函数的参数要求是一个字符数组名或一个字符型指针变量。
7.下面程序段的运行结果是()。
chara[7]="abcdef";
charb[4]="ABC";
strcpy(a,b);
printf("%c",a[5]);
A.空格B.\0C.eD.f
【答案】D
【说明】strcpy函数在复制中只将b数组的字符串"ABC"覆盖a数组中前4个字符,后面的字符不变,因此a[5]元素中的字符还是f。
其他选项均不对。
8.判断字符串s1是否大于字符串s2,应当使用()。
A.if(s1>s2)B.if(strcmp(s1,s2))
C.if(strcmp(s2,s1)>0)D.if(strcmp(s1,s2)>0)
【答案】D。
【说明】两个字符串的大小比较应使用strcmp函数,且比较是自左至右逐个字符比较的,因此只有选项D正确。
其他选项均不对。
9.下面程序的功能是从键盘输入一行字符,统计其中有多少个单词,单词之间用空格分隔,请选择填空()。
#include
main()
{chars[80],c1,c2='';
inti=0,num=0;
gets(s);
while(s[i]!
='\0')
{c1=s[i];
if(i==0)c2='';
elsec2=s[i-1];
if()num++;i++;
}
printf("Thereare%dwords.\n",num);
}
A.c1==''&&c2==''B.c1!
=''&&c2==''
C.c1==''&&c2!
=''D.c1!
=''&&c2!
=''
【答案】B
【说明】统计单词个数的基本思路是:
如果前一个是空格,后一个符号为非空格字符时,说明出现了一个新单词,因此B是正确的。
其他选项均不对。
10.下面程序的运行结果是()。
#include
main()
{charstr[]="SSSWLIA",c;
intk;
for(k=2;(c=str[k])!
='\0';k++)
{switch(C.
{case'I':
++k;break;
case'L':
continue;
default:
putchar(c);continue;
}
putchar('*');
}
}
A.SSW*B.SW*C.SW*AD.SW
【答案】B
【说明】注意continue与break两语句直到的作用,for循环在第四次时被强行退出,只有答案B正确。
其他选项均不对。
11.下面程序段执行后,s的值是()。
staticcharch[]="600";
inta,s=0;
for(a=0;ch[a]>='0'&&ch[a]<='9';a++)
s=10*s+ch[a]-'0';
A.600B.6C.0D.出错
【答案】A。
【说明】注意“ch[a]-'0'”将数字符号转换成了数字,因此只有A对。
其他选项均不对。
12.有如下程序,其运行结果是()。
main()
{intn[3],i,j,k;
for(i=0;i<3;i++)
n[i]=0;
k=2;
for(i=0;ifor(j=0;jn[j]=n[i]+1;
printf("%d\n",n[k]);
}
A.2B.1C.0D.3
【答案】C
【说明】因为在程序中j的值始终是小于k的,所以n[k]没有改变,还是0,答案为C。
其他选项均不对。
二、填空题
1.若有定义:
doublex[3][5];则x数组中行下标的下限为,列下标的上限为。
【答案】24
【说明】数组元素的下标是从0开始的。
2.数组在内存中占一片连续的存储区,由代表它的首地址。
【答案】数组名
【说明】数组名代表的是该数组在内存中的起始地址。
3.若有以下程序段:
charstr[]="xy\n\012\\\n";printf("%d",strlen(str));
执行后的输出结果是。
【答案】6
【说明】注意转义字符。
4.下面程序以每行4个数据的形式输出a数组,请填空。
#defineN20
main()
{inta[N],i;
for(i=0;ifor(i=0;i{if()printf("\n");
printf("%3d",a[i]);
}
printf("\n");
}
【答案】i%4==0
【说明】由题意可知,每输出4个数,程序自动换行。
5.下面程序可求出矩阵a的主对角线上的元素之和,请填空。
main()
{inta[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if()sum=sum+;
printf("sum=%d\n",sum);
}
【答案】i==ja[i][j]
【说明】显然对于矩阵a,主对角线上的元素必定是行号列标相等,将满足这些条件的元素求和。
6.当从键盘输入18,并按【Enter】键后,下面程序的运行结果是。
main()
{intx,y,i,a[8],j,u,v;
scanf("%d",&x);
y=x;i=0;
do
{u=y/2;a[i]=y%2;i++;y=u;
}while(y>=1);
for(j=i-1;j>=0;j--)
printf("%d",a[j]);
}
【答案】10010
【说明】注意运算符“/”的两个运算数如果是整数,那么商取整数;运算符“%”是取余。
7.下面程序用插入法对数组a进行降序排序,请填空。
main()
{inta[5]={4,7,2,5,1},i,j,m;
for(i=1;i<5;i++)
{
m=a[i];j=;
while(j>=0&&m>a[j])
{;j--;}
=m;
}
for(i=0;i<5;i++)
printf("%d",a[i]);
printf("\n");
}
【答案】i-1a[j+1]=a[j]a[j+1]
【说明】插入法排序的基本思路是将一个数插入到前面已排好序的有序表中,从而得到一个新的、个数增1的有序排列。
8.下面程序的功能是在3个字符串中找出最小的,请填空。
#include
#include
main()
{chars[20],str[3][20];
inti;
for(i=0;i<3;i++)gets(str[i]);
strcpy(s,);
if(strcmp(str[1],s)<0)strcpy(s,str[1]);
if(strcmp(str[2],s)<0)strcpy(s,str[2]);
printf("%s\n",);
}
【答案】str[0]s
【说明】变量s用来存放最小的字符串,开始时假设第一个字符串最小。
9.下面程序的运行结果是(注意continue与break的作用)。
#include
main()
{chars[]="ABCCDA";
intk;charc;
for(k=1;(c=s[k])!
='\0';k++)
{switch(c)
{case'A':
putchar('%');continue;
case'B':
++k;break;
default:
putchar('*');
case'C':
putchar('&');continue;
}
putchar('#');
}
}
【答案】#&*&%
【说明】
(1)要注意continue与break语句的作用;
(2)C语言中的多分支switch语句,“case常量表达式”只起语句标号的作用,不作判断,当找到入口标号后,就一直往下执行,除非遇上break语句。
10.下面函数的功能是将一个字符串str的内容颠倒过来。
#include
main()
{charstr[80],i,j,
gets(str);
for(i=0,j=strlen(str);i{k=str[j];str[j]=str[i];str[i]=k;}
puts(str);
}
【答案】k-1
【说明】变量k要先说明,j在循环开始时要指向最后一个字符,因此是字符串的长度减1。
11.统计数字出现的次数,请填空。
#include
main()
{
inti,ch,;
for(i=0;iwhile((ch=getchar())!
='\n')
if(ch>='0'&&ch<='9')
;
for(i=0;i<10;i++)
printf("数字%d的出现次数是:
%d\n",i,ndigit[i]);
}
【答案】ndigit[10]ndigit[ch-'0']++
【说明】
(1)数组ndigit要先说明;
(2)ndigit[ch-'0']++中的“ch-'0'”是为了将被记数的数字与记数元素的下标对应起来。
三、编程题
1.将字符数组str2中的全部字符复制到字符数组strl中。
不采用strcpy函数,复制时,'\0'也要复制进去,'\0'后面的字符不复制进去。
【分析】该题只能将字符数组str2中的全部字符一个一个赋值到字符数组strl中。
【源程序】
voidmain()
{inti;
charstr1[80],str2[80];
gets(str2);
for(i=0;str2[i]!
='\0';i++)
str1[i]=str2[i];
str1[i]='\0';
}
2.将输入的n个整数从小到大排序输出,再求出此n个整数中所有奇数以及所有素数的个数。
【分析】该题采用了选择法排序;所谓奇数是指不能被2整除的数;所谓素数m,是指m除1以外,不能被任何数整除,数学证明也可表述为不能被2~sqrt(m)中的任一个数整除。
【源程序】(含运行结果)
#include
main()
{inta[20],n,i,j,sum,t,prime;
sum=prime=0;
printf("n=");
scanf("%d",&n);
for(i=0;iscanf("%d",&a[i]);
for(i=0;ifor(j=i+1;jif(a[i]>a[j])
{t=a[i];a[i]=a[j];a[j]=t;}
for(i=0;i{if(a[i]%2==0)continue;
sum+=a[i];
for(j=2;j<=sqrt(a[i]);j++)
if(a[i]%j==0)break;
if(j>sqrt(a[i]))prime++;
}
for(i=0;iprintf("%6d",a[i]);
printf("\nsum=%-6dprime=%-6d\n",sum,prime);
}
运行结果如下:
n=10<回车>
1123821954523<回车>
2345589112123
sum=77prime=5
3.统计从键盘输入的20个字符中数字、字母、空格及换行符的个数。
【分析】数字字符,大、小写字母字符在ASCII码表中的排列是按顺序连续递增的,因此判断它们是什么字符只要控制好两端作比较即可。
【源程序】(含运行结果)
main()
{charc[20];
inti,s,ch,b,n;
s=ch=b=n=0;
for(i=0;i<20;i++)
{scanf("%c",&c[i]);
if(c[i]>='0'&&c[i]<='9')s++;
if((c[i]>='a'&&c[i]<='z')||(c[i]>='A'&&c[i]<='Z'))ch++;
if(c[i]=='')b++;
if(c[i]=='\n')n++;
}
printf("s=%d,ch=%d,b=%d,n=%d\n",s,ch,b,n);
}
运行结果如下:
at3bvcwe<回车>
fgiloww23<回车>
s=3,ch=14,b=1,n=2
4.编写一个程序,判断一个字符串是否为回文(回文是指正读与倒读都相同的字符串)。
【分析】先找到字符串的前后两个字符(如果该字符串前后有空格字符,要注意将其排除),作前后对称比较,如有不等,即不是回文,否则即为回文。
【源程序】(含运行结果)
#include
#include
main()
{chars[81];
inti,j,n;
gets(s);
n=strlen(s);
i=0;
j=n-1;
while(s[i]=='')i++;
while(s[j]=='')j--;
while(i{i++;j--;
}
if(ielseprintf("Yes\n");
}
运行结果如下:
abcdefedcba<回车>
Yes
5.设有10个学生的成绩分别为89,90,84,78,84,67,88,92,79,73,存放在数组stu中,输出它们的平均成绩aver(保留两位小数)和低于平均成绩的人数。
输出样式(各占一行,无多余字符):
aver=80.34n=7
【分析】此题先求出平均成绩,注意题中s的说明,如果将s说明为整型,该如何得到平均成绩?
要注意输出格式与题意相符,这往往容易使读者忽略,造成考试丢分。
【源程序】(含运行结果)
main()
{inti,n=0,stu[10]={89,90,84,78,84,67,88,92,79,73};
floats=0,aver;
for(i=0;i<10;i++)
s=s+stu[i];
aver=s/10;
for(i=0;i<10;i++)
if(aver>stu[i])n++;
printf("aver=%5.2f\nn=%d\n",aver,n);
}
运行结果如下:
aver=82.40
n=4
6.设有字符串:
charsrc[]="S>h?
e*-$i#$s@Ag!
ir?
1,s/hei%s(f)ro[]m{E}n23g%&land";
设计程序,统计字母或符号连续的次数n。
【说明】字母或符号连续如23,32,ab,hi,>?
等,在ASCII表上连续。
【分析】该题中所指连续是指在ASCII表上相邻。
【源程序】(含运行结果)
main()
{charstr[]="S>h?
e*-$i#$s@Ag!
ir?
1,s/hei%s(f)ro[]m{E}n23g%&land";
intlen,i,n=0;
len=strlen(str);
for(i=0;iif((str[i]==(str[i+1]+1))||(str[i]==(str[i+1]-1)))
n++;
printf("n=%d\n",n);
}
运行结果如下:
n=4
7.找出一个二维数组中的鞍点,即该位置上的元素在该行上值最大,在该列上值最少,也可能没有鞍点。
【分析】先找出一行上的最大值元素,再看此元素在该列上是否值最小。
【源程序】(含运行结果)
main()
{inti,j,k,row,col,flag1,flag2,a[10][10],max,maxj;
printf("row=");scanf("%d",&row);
printf("col=");scanf("%d",&col);
for(i=0;ifor(j=0;j
scanf("%d",&a[i][j]);
flag2=0;
for(i=0;i{max=a[i][0];
for(j=0;j
if(a[i][j]>max){max=a[i][j];maxj=j;}
for(k=0,flag1=1;kif(max>a[k][maxj])flag1=0;
if(flag1){printf("row=%d\ncol=%d\nnumber=%d\n",i,maxj,max);
flag2=1;}
}
if(!
flag2)printf("HAVENOT\n");
}
运行结果如下:
row=4<回车>
col=3<回车>
11123456789121310<回车>
HAVENOT
8.任意输入10个整数,统计其正数、零及负数的个数,井计算正数及负数各自之和,然后把统计与计算结果打印输出。
【分析】该题比较简单,题中用到了两个for循环,也可合并为一个for循环。
【源程序】(含运行结果)
main()
{inta[10],plus,minus,zero,sump,summ,i;
plus=minus=zero=sump=summ=0;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
if(a[i]>0){sump+=a[i];plus++;}
elseif(a[i]<0){summ+=a[i];minus++;}
elsezero++;
printf("sump=%dsumm=%d\n",sump,summ);
printf("plus=%dminus=%dzero=%d\n",plus,minus,zero);
}
运行结果如下:
2-34-867-12-42213<回车>
sump=54summ=-27
plus=6minus=4zero=0
9.编写一个程序,对标准输入文件(终端键盘)中所包含的每个字母(不分大小写)出现的次数进行统计。
函数中设计一个一维数组(长度为27),前26个下标变量顺序存放A~Z(a~x)的出现次数,最后一个下标变量存放非字母的字符个数。
【分析】该题中因为不区分大小写字母,题中用“ch-=32;”将小写字母转换为大写字母;c[0]中统计字母A的个数,c[1]中统计计字母B的个数,依此类推。
【源程序】(含运行结果)
#include
main()
{intc[27],ch,i=0;
for(i=0;i<27;i++)c[i]=0;
while((ch=getchar())!
='\n')
{if(ch>='a'&&ch<='z')ch-=32;
if(ch>='A'&&ch<='Z')c[ch-65]++;
elsec[26]++;
}
for(i=0;i<27;)
{printf("%3d",c[i]);
i++;
if(i%9==0)printf("\n");
}
}
运行结果如下:
abceAEFGHIJK112893IWE35ITOW90<回车>
211031113
110001000
0100200012
10.求4×5矩阵中最大和最小元素,并输出其所在的行号和列号。
【分析】该题可以先假设第一个元素既是最大元素也是最小元素,然后依次与其后元素比较,如果比最大元素大,记下其值与位置;如果比最小元素小,记下其值与位置。
【源程序】(含运行结果)
#include"stdio.h"
main()
{inta[4][5];
inti,j,max,min,h1,l1,h2,l2;
printf("Input20Number:
\n");
for(i=0;i<4;i++)
for(j=0;j<5;j++)
scanf
|
|
|