高级语言程序设计基础一至三章
选择题
1.下述循环体语句的循环次数为(A)。
int x=-1;
do
{ x=x*x; } while(!x);
A.1次 B.2次 C.无限次 D.有语法错误
2.在下列选项中,没有构成死循环的程序段是(C)。
A.int i=100;
while(1)
{ i=i%100+1;
if(i>100) break;
}
B.for(;;);
C.int k=1000;
do {++k; } while(k>=10000);
D.int s=36;
while(s);–s;
3.下面程序输出结果是(B)。
#include<stdio.h>
int main(void)
{ int k=0; char c='A';
do
{ switch( c++ )
{ case 'A': k++; break;
case 'B': k--;
case 'C': k+=2; break;
case'D': k=k%2; continue;
case 'E': k=k*10; break;
default: k=k/3;
}
k++;
}while( c<'G' );
printf( "k=%d\n",k );
return 0;
}
A.k=3 B.k=4 C.k=2 D.k=0
4.程序段“int num=0; while(num<=2) printf(“%d,”,num++);”的运行结果是(C)。
A.0,1, B.1,2, C.0,1,2, D.1,2,3,
5.下面程序段的运行结果为(A)。
int a=1,b=2,c=2,t;
while(a<b<c){t=a;a=b;b=t;c--;}
printf("%d,%d,%d",a,b,c);
A.1,2,0 B.2,1,0 C.1,2,1 D.2,1,1
6.设有以下语句:
int x=3;
do
{
printf("%d\n",x-=2);
}
while(!(--x));
该程序段的执行结果为(B)。
A. 显示1 B. 显示1和-2
C. 显示0 D.是死循环
7.下面有关for循环的正确描述是(D)。
A.for循环只能用于循环次数已经确定的情况
B.for是先执行循环体语句,后判断表达式
C.在for循环中,不能用break语句跳出循环体
D.for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来
8.执行下面的程序后,a的值为(B)。
#include<stdio.h>
int main(void)
{ int a,b;
for(a=1,b=1;a<=100;a++)
{ if(b>=20) break;
if(b%3==1)
{ b+=3; continue; }
b-=5;
}
return 0;
}
A.7 B.8 C.9 D.10
9.以下叙述正确的是(D)。
A.不能使用do-while语句构成的循环
B.do-while语句构成的循环必须用break语句才能退出
C.do-while语句构成的循环,当while语句中的表达式值为非零时结束循环
D.do-while语句构成的循环,当while语句中的表达式值为零时结束循环
10.以下叙述正确的是(B)。
A.continue语句的作用是结束整个循环的执行
B.只能在循环体内和switch语句体内使用break语句
C.在循环体内使用break语句或continue语句的作用相同
D.从多层循环嵌套中退出,只能使用goto语句
填空题
1.break语句只能用于 循环 语句和 switch 语句中。
2.下列for循环语句执行的次数是 4 。
for(x=0,y=0;(y=123)&&(x<4);x++);
3.当运行以下程序时,从键盘键入right?,则下面程序运行结果是sjhiu 。
#include<stdio.h>
int main(void)
{
char c;
while((c=getchar())!='?')
putchar(++c);
return 0;
}
4.下列程序的运行结果是 x=1,y=20 。
#include<stdio.h>
int main(void)
{
int i,x,y;
i=x=y=0;
do{ ++i;
if(i%2!=0)
{ x=x+i;
i++;
}
y=y+i++;
}while(i<=7);
printf("x=%d,y=%d\n",x,y);
return 0;
}
5.执行下列程序段后的输出是 02 。
x=0;
while(x<3)
for(;x<4;x++)
{
printf("%d",x++);
if( x<3) continue;
else break;
printf("%d",x);
}
6.设定义“int k=1,n=163;”,执行下面程序段后,k的值是 18 。
do
{
k*=n%10;
n/=10;
}while(n);
7.以下程序的运行结果是 1 。
#include <stdio.h>
int main(void)
{ int y=10;
do { y--;} while (--y);
printf("%d\n",++y);
}
8.以下程序的运行结果是 s=7 。
#include <stdio.h>
int main(void)
{
int s=0,k;
for(k=7;k>=0;k--)
{ switch(k)
{ case 1: case 4:
case 7: s++; break;
case 2: case 3: case 6: break;
case 0: case 5: s+=2; break;
}
}
printf( “s=%d \n”,s );
return 0;
}
9.下列程序的功能为:将从键盘输入的一组字符统计出大写字母的个数m和小写字母的个数 n,并输出m、n中的较大数。
#include<stdio.h>
int main(void)
{ int m=0,n=0;
char c;
while(( c=getchar() )!='\n')
{ if(c>='A'&&c<='Z') m++;
if(c>='a'&&c<='z') n++;
}
printf("%d\n",m<n? n:m );
return 0;
}
10.下列程序的功能为:求1~100以内所有能被13整除的数的累加和,当累加和超出100时停止累加。请填空。
#include <stdio.h>
int main(void)
{ int i, sum = 0;
for ( i=1; i<100; i++ )
{ if ( i%13==0 )
sum += i;
if ( sum > 100 ) break ;
}
printf( “i=%d, sum=%d\n”, i,sum );
return 0;
}
编程题
(1)从键盘上输入若干字符,以按Enter键结束,统计其中字符’A’或’a’的个数。
源程序:
#include <stdio.h>
int main(void)
{
char ch;
int cnt=0;
while((ch=getchar())!='\n')
{
if(ch=='A' || ch=='a')
cnt=cnt+1;
}
printf("cnt=%d\n",cnt);
return 0;
}
运行结果:
wabcAAabc
cnt=4
-----------
(2)利用
的前100项之积计算pi的值。
#include <stdio.h>
int main(void)
{
double term, result = 1; /*累乘项初值应为1*/
int n;
for (n=2; n<=100; n = n + 2)
{
term=(double)( n * n)/((n-1)*(n+1)); /*计算累乘项*/
result = result * term;
}
printf("result = %f\n", 2*result);
return 0;
}
运行结果:
result = 3.126079
(3)用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚?
#include <stdio.h>
int main(void)
{
int five,two,one,count=0;
for(five=1;five<=29;five++)
for(two=1;two<=73;two++)
{
one=100-five-two;
if(5*five+2*two+one==150)
{
count++;
printf("five=%d,two=%d,one=%d\n",five,two,one);
}
}
printf("count=%d\n",count);
return 0;
}
运行结果:
five=1,two=46,one=53
five=2,two=42,one=56
five=3,two=38,one=59
five=4,two=34,one=62
five=5,two=30,one=65
five=6,two=26,one=68
five=7,two=22,one=71
five=8,two=18,one=74
five=9,two=14,one=77
five=10,two=10,one=80
five=11,two=6,one=83
five=12,two=2,one=86
count=12
----------------------
(4)鸡兔同笼,共有98个头,386只脚,编程求鸡、兔各多少只。
#include <stdio.h>
int main(void)
{
int x, y;
for (x=1;x<=97;x++)
{
y=98-x;
if(2*x+4*y==386)
printf("鸡=%d,兔=%d",x,y);
}
return 0;
}
运行结果:
鸡=3,兔=95
(5)将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
#include <stdio.h>
int main(void)
{
int n,i;
printf("please input a number:");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else break;
}
printf("%d",n);
return 0;
}
运行结果:
please input a number:80
80=2*2*2*2*5
------------------------
(6)从键盘任意输入一个4位数x,编程计算x的每一位数字相加之和。例如,输入x为1234,则由1234分离出其个位4、十位3、百位2、千位1,然后计算4+3+2+1=10并输出。
#include <stdio.h>
int main(void)
{
int sum=0,x,i,y;
printf("Input data:");
scanf("%d",&x);
if(x>=1000&&x<=9999)
{
for(i=1;i<4;i++)
{
y=x%10;
sum+=y;
if(y!=0)
printf("%d+",y);
x=x/10;
}
y=x%10;
printf("%d=%d\n",y,sum+y);
}
else printf("data error!");
return 0;
}
运行结果:
(1)
Input data:9876
6+7+8+9=30
(2)
Input data:1002
2+1=3
---------------
(7)打印出所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数
#include <stdio.h>
int main(void)
{
int i,j,k,n;
printf("narcissus numbers are:\n");
for (n=100;n<1000;n++)
{
i=n/100;
j=n/10%10;
k=n%10;
if (n==i*i*i+j*j*j+k*k*k)
printf("%d\n",n);
}
return 0;
}
narcissus numbers are:
153
370
371
407
----------------------
(8)利用泰勒级数 计算
的值,要求最后一项的绝对值小于10^-5,并统计出此时累加了多少项(x由键盘输入)。注意键盘输入值为弧度。
#include <stdio.h>
#include <math.h>
int main(void)
{
int n=1,count=1;
float x;
double sum,term;
printf("Input x: "); //输入值为弧度
scanf("%f", &x);
sum=x;
term=x;
do
{
term=-term*x*x/((n+1)*(n+2));
sum=sum+term;
n=n+2;
count++;
}while(fabs(term)>=1e-5);
printf("sin(x)=%.1f,count=%d\n",sum,count);
return 0;
}
运行结果:
Input x: 0.523598
sin(x)=0.5,count=4
-------------------
(9)编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。
#include <stdio.h>
int main(void)
{
int num=123,x,n;
printf("hint:0<number<1000\n");
for(n=1;n<=10;n++)
{
printf("guess:");
scanf("%d",&x);
if(x==num)
{
printf("Right!\n");
break;
}
if(x>num) printf("bigger!\n");
if(x<num) printf("smaller!\n");
}
if(n==11)
printf("END! The number is %d\n",num);
return 0;
}
运行结果:
hint:0<number<1000
guess:0
smaller!
guess:200
bigger!
guess:100
smaller!
guess:150
bigger!
guess:125
bigger!
guess:112
smaller!
guess:118
smaller!
guess:121
smaller!
guess:123
Right!
---------------------
(10)编程输出以下图案。

#include <stdio.h>
int main(void)
{
int i,j;
for(i=1;i<=4;i++)
{
for(j=10-i;j>=1;j--)
printf("%c",' ');
for(j=0;j<2*i-1;j++)
printf("*");
printf("\n");
}
for(i=3;i>=1;i--)
{
for(j=10-i;j>=1;j--)
printf("%c",' ');
for(j=0;j<2*i-1;j++)
printf("*");
printf("\n");
}
return 0;
}
章节测验
- A、用do-while语句构成的循环,在while后的表达式为0时结束循环
- B、do-while语句构成的循环不能用其他语句构成的循环来代替
- C、do-while语句构成的循环只能用break语句退出
- D、用do-while语句构成的循环,在while后的表达式为非0时结束循环
【单选题】以下程序运行时从键盘输入3.6,2.4,输出结果是(A )。
#include<math.h>
void main()
{
float x,y,z;
scanf("%f,%f",&x,&y);
z=x/y;
while(1)
{ if(fabs(z)>1.0)
{
x=y;
y=x;
z=x/y;
}
else break;
}
printf("%f",y);
}
如果c是大于1的正整数,与以下程序段功能相等的赋值语句是( D )。
s=a;
for(b=1;b<=c;b++)
s=s+1;
- A、s=b+c;
- B、s=s+c;
- C、s=a+b;
- D、s=a+c;
有一条长阶梯,若每步跨2阶,则最后剩余1阶,若每步跨3阶,则最后剩余2阶,若每步跨5阶,则最后剩余4阶,若每步跨6阶,则最后剩余5阶,若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯共有多少阶。
请补充while语句后的判断条件。(C)
#include<stdio.h>
void main()
{
int i=1;
while( )
++i;
printf("阶梯共有%d阶.\n",i);
}
- A、!((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==1))
- B、!((i%2==0)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0))
- C、!((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0))
- D、(i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0)
【单选题】以下程序段的输出结果是( C )。
#include<stdio.h>
void main()
{
int a=3;
do
{
printf("%d",a--);
}while(!a);
}
【单选题】若定义int i; 则以下for语句的执行结果是( B )。
for(i=1;i<10;i++)
{
if(i%3) i++;
++i;
printf("%d",i);
}
- A、35811
- B、369
- C、258
- D、2468
【单选题】以下程序段的输出结果是( )。
int n=10;
while(n>7)
{
printf("%d,",n);
n--;
}
- A、9,8,7,
- B、9,8,7,6,
- C、10,9,8,
- D、10,9,8,7,
【单选题】以下程序的输出结果是( A )。
#include<stdio.h>
void main()
{
int i=5;
for(;i<15;)
{
i++;
if(i%4==0) printf("%2d",i);
else continue;
}
}
【单选题】
以下关于for语句的说法不正确的是( B )
- A、for循环是先判断表达式,后执行循环体语句
- B、for循环只能用于循环次数已经确定的情况
- C、for循环中,可以用break语句跳出循环体
- D、for循环体语句中,可以包含多条语句,但要用花括号括起来。
【单选题】
C语言中,while语句和do-while语句的主要区别是( B )
- A、do-while的循环体不能是复合语句
- B、do-while的循环体至少无条件执行一次
- C、while的循环控制条件比do-while的循环控制条件严格
- D、do-while允许从外部转到循环体内
【单选题】若定义int i;则以下循环语句的循环执行次数是( C )。
for(i=2;i==0;)
printf(“%d”,i–);
语句while(!y)中的!y等价于y!=0。(X)
下面程序段循环一次也不执行。(√)
int x=10;
while(x=0)
x=x-1;
for语句中的表达式可以部分或全部省略,但是两个分号不能省略。(√)
用于直接中断最内层循环的语句是break。(√)
以下程序的输出结果是n=4(√)
#include<stdio.h>
void main()
{
int i,n=0;
for(i=2;i<5;i++)
{
do {
if(i%3) continue;
n++;
} while(!i);
n++;
} printf("n=%d",n);
}
【简答题】
图形打印。
题目描述
题目内容:编写程序,打印以下图形(行n的值由键盘输入)。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define JUN
int main()
{
volatile int i, j, n;
char a = ' ', b = '*';
scanf("%d", &n);
for (i = 0; i<n; i++)
{
for (int j = i; j; j--)
{
printf("%c", a);
}
for (j = n; j>i; j--) {
printf("%c", b);
}
printf("\n");
}
return 0;
}
【简答题】
特征四位数。
题目描述
题目内容:已知四位数3025具有一个特殊性质:它的前两位数字30与后两位数字25之和是55,而55的平方正好等于3025。编程找出所有具有这种性质的四位数。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define JUN
int main()
{
volatile int n, x, y;
for (n = 1000; n <= 9999; n++)
{
x = n % 100;
y = n / 100;
if (n == (x + y)*(x + y))
{
printf("%d\n", n);
}
}
return 0;
}
【简答题】
求和S。
题目描述
题目内容:求s=1+(1+2)+…+(1+2+3+…+n)的值,其中n由键盘输入。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define JUN
int main()
{
volatile int i, n, s = 0;
scanf("%d", &n);
if (n <= 0)
{
printf("Error!\n");
}
else {
int a = 0;
for (i = 1; i <= n; i++)
{
a = a + i;
s = s + a;
}
printf("%d\n", s);
}
return 0;
}
【简答题】
追查车号。
题目描述
题目内容:一辆卡车违反交通规则,撞人逃逸。现场三人目击事件,但都没有记住车号,只记下车的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号正好是一个整数的平方。请根据以上线索求出车号。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define JUN
int main()
{
volatile int a, b;
int x;
for (a = 1; a<10; a++)
for (b = 1; b<10; b++) {
x = sqrt(a * 1000 + a * 100 + b * 10 + b);
if (x*x == (a * 1000 + a * 100 + b * 10 + b))
{
printf("The number is %d%d%d%d\n", a, a, b, b);
}
}
return 0;
}
选择题
1.已定义“int i; char x[10];”,为了给x数组赋值,以下正确的语句是(D)。
A.x[10]= “Hello! “;
B.x=”Hello! “;
C.x[]=”Hello! “;
D.for(i=0; i<6; i++) x[i]=getchar();
2.若有以下的数组定义:“char a[ ]=”abcd”; char b[]={‘a’,’b’,’c’,’d’,’e’};”,则以下正确的描述是(A)。
A.a数组和b数组长度相同
B.a数组长度大于b数组长度
C.a数组长度小于b数组长度
D.两个数组中存放相同的内容
3.若有定义“int i; int x[3][3]={2,3,4,5,6,7,8,9,10};”,则执行语句
“for(i=0;i<3;i++) printf(“%4d”,x[i][2-i]);”的输出结果是(D)。
A.2 5 8 B.2 6 10
C.4 7 10 D.4 6 8
4.下列对二维数组a进行正确初始化的是(B)。
A.int a[2][3]={{1,2},{3,4},{5,6}};
B.int a[ ][3]={1,2,3,4,5,6};
C.int a[2][ ]={1,2,3,4,5,6};
D.int a[2][ ]={{1,2},{3,4}};
5.下列说法正确的是(D)。
A.数组的下标可以是float类型
B.数组的元素的类型可以不同
C.初始化列表中初始值的个数多于数组元素的个数也是可以的
D.区分数组的各个元素的方法是通过下标
6.若有定义“char str1[30],str2[30];”,则输出较大字符串的正确语句是(C)。
A.if(strcmp(strl,str2)) printf(“%s”,strl);
B.if(strl>str2) printf(“%s”,strl);
C.if(strcmp(strl,str2)>0) printf(“%s”,strl);
D.if( strcmp(strl)>strcmp(str2)) printf(“%s”,strl);
7.下列程序段的输出结果是(B)。
int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};
int i,s=0;
for(i=0;i<4;i++)
s+=aa[i][1];
printf("%d\n",s);
A. 11 B. 19 C. 13 D. 20
8.下列程序段的输出结果是(D)。
charstr[15]= "hello!";
printf("%d\n",strlen(str));
A.15 B.14 C.7 D.6
9.有以下程序段,当输入为happy!时,程序运行后输出结果是(B)。
charstr[14]={"I am "};
strcat(str,"sad!");
scanf("%s",str);
printf("%s",str);
A.I am sad! B.happy!
C.I am happy! D.happy!sad!
10.下列关于数组的描述中错误的是(D)。
A.一个数组只允许存储同种类型的数据
B.数组名是数组在内存中的首地址
C.数组必须先定义,后使用
D.如果在对数组进行初始化时,给定的数据元素个数比数组元素少,多余的数组元素自动初始化为最后一个给定元素的值
填空题
1.有定义语句“int i=3,x[4]={1,2,3};”,则数组元素x[i]的值是 0 。
2.有定义语句“char a[ ]={ “I am a student”};”,该字符串的长度是 14 ,a[3]= m 。
3.有二维数组定义“k[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};”,则其中元素k[2][1]的值是 10 ,k[1][2] 的值是 7 。
4.若有定义“int a[4][4];”,则a数组中行下标的下限为 0 ,列下标的上限为 3 。
5.若有定义“char a[]=”abcdef”;”,则执行语句
“printf(“%d,%d\n”,sizeof(a),strlen(a));”后的输出结果是 7,6 。
6.下列程序段的运行结果是 4 。
char str[20]="This is my book";
str[4]='\0'; str[9]= '\0';
printf(" %d",strlen (str));
7.下列程序的运行结果是 Tony 。
char name[3][20]={"Tony", "Join", "Mary"};
int m=0,k;
for(k=1;k<=2;k++)
if(strcmp (name[k],name[m])>0)
m=k;
puts(name[m]);
8.下列程序运行时输入:20 30 5 85 40,运行结果为:
max=85
min=5
sum=180
aver=30.00
#include<stdio.h>
#define N 5
int main(void)
{
int a[N],max,min,sum,i;
for (i=0;i<N;i++)
scanf("%d",&a[i]);
sum=max=min=a[0];
for (i=1;i<N;i++)
{
sum+=a[i];
if (a[i]>max) max=a[i];
if (a[i]<min) min=a[i];
}
printf("max=%d\nmin=%d\nsum=%d\naver=%4.2f\n",max,min,sum,(float)(sum-max-min)/(N-2));
return 0;
}
9. 下列程序运行时输入:This_is_a_C_Program! 运行结果为:
Ti_saCPorm
Tss_Pgm
#include<stdio.h>
#include<string.h>
int main(void)
{
char str[81], a[81], b[81];
int n, i, j=0, k=0;
gets( str );
n=strlen( str );
for ( i=0; i<n; i++ )
{
if ( i%2==0 ) a[j++] = str[i];
if ( i%3==0 ) b[k++] = str[i];
}
a[j] = b[k] = '\0';
puts( a );
puts( b );
return 0;
}
10.下列程序的运行结果为: 1 1 1 5 。
#include<stdio.h>
int main(void)
{
char s[]="12345678";
int c[4]={0},k,i;
for (k=0; s[k]; k++)
{
switch (s[k])
{
case'1': i=0; break;
case'2': i=1; break;
case'3': i=2; break;
case'4': i=3;
}
c[i]++;
}
for(k=0;k<4;k++)
printf("%d ",c[k]);
return 0;
}
编程题
(1)求最小数
从键盘输入15个整数,存放在数组中,找出其中最小数并指出其所在的位置。
#include<stdio.h>
#define N 15
int main(void)
{
int min,i,j=0,a[N];
printf("Enter %d integers:\n",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
min=a[0];
for(i=1;i<N;i++)
if(min>a[i])
{
min=a[i];
j=i;
}
printf("min=%d,loc=%d",min,j);
return 0;
}
运行结果:
Enter 15 integers:
6 5 4 3 0 5 4 33 23 -9 6 5 1 2 8
min=-9,loc=9
-----------------------------
(2)进制转换
将输入的十进制正整数化为十六进制数。
#include <stdio.h>
int main(void)
{
int i,x,j,a[20];
while(1)
{
scanf("%d",&x);
if(x<0)
printf("Data error,Reenter:\n");
else break;
}
i=0;
while(x)
{
a[i]=x%16;
x=x/16;
i++;
}
for(j=i-1;j>=0;j--)
if(a[j]<=9)
printf("%d",a[j]);
else if(a[j]<=15)
printf("%c",a[j]+'A'-10);
return 0;
}
运行结果:
123
7B
---------
(3)统计单词数
从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。
#include <stdio.h>
int main(void)
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for (i=0;(c=string[i])!='\0';i++)
if(c==',') word=0;
else if(word==0)
{ word=1;
num++;
}
printf("There are %d words in the line.\n",num);
return 0;
}
运行结果:
I,love,Shanghai!
There are 3 words in the line.
--------------------------
(4)字符排序
从键盘输入一字符串,放在字符数组a中,将字符数组a中下标值为偶数的元素按从小到大排序。例如:原始字符串为zabkam,则排序后字符串为aabkzm。
#include<stdio.h>
#include<string.h>
int main(void)
{
char a[80],t,m;
int i,j,k;
printf("Input String:\n");
gets(a);
k=strlen(a);
//采用选择排序算法
for(i=0;i<=k-2;i+=2)
{
m=i;
for(j=i+2;j<k; j+=2 )
if(a[m]>a[j])
m=j;
if(m!=i)
{
t=a[i];
a[i]=a[m];
a[m]=t;
}
}
puts(a);
printf("\n");
return 0;
}
运行结果:
Input String:
zabkam
aabkzm
----------
(5)扬灰三角形
编写程序输出以下杨辉三角形(要求输出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
… … … … … …
#include<stdio.h>
int main(void)
{
int i,j;
int a[10][10];
for(i=0;i<10;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(i=2;i<10;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++)
{ for( j=0;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
运行结果:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
------------------------------
(6)字符串逆序连接
编程将s数组中的字符串的正序和反序进行连接,形成一个新串放在t数组中。例如,当s数组中字符串为”ABCD” 时,则t数组中的内容应为:”ABCDDCBA”。
#include<stdio.h>
#include<string.h>
int main(void)
{
//ZZYMMM
char s[100], t[100];
int i,d;
printf("Enter string:");
scanf("%s",s);
d=strlen(s);
for(i=0;i<d;i++)
t[i]=s[i];
for(i=0;i<d;i++)
t[d+i]=s[d-1-i];
t[2*d]='\0';
printf("The result is: %s\n",t);
return 0;
}
运行结果:
Enter string:ABCD
The result is: ABCDDCBA
----------------------
(7)数据加密 歪比外币
某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012。
#include<stdio.h>
int main(void)
{
int x,i,aa[4],t;
printf("输入一个四位整数:");
scanf("%d",&x);
aa[0]=x%10;
aa[1]=x%100/10;
aa[2]=x%1000/100;
aa[3]=x/1000;
for(i=0;i<=3;i++)
{
aa[i]+=5;
aa[i]%=10;
}
for(i=0;i<=3/2;i++)
{
t=aa[i];
aa[i]=aa[3-i];
aa[3-i]=t;
}
printf("加密后的数字为:");
for(i=3;i>=0;i--)
printf("%d",aa[i]);
printf("\n");
return 0;
}
运行结果:
输入一个四位整数:7659
加密后的数字为:4012
----------------------
(8)查找数值位置
编写程序查找数值18在以下二维数组中第一次出现的位置。

#include <stdio.h>
int main(void)
{
int i,j,a[3][4]={{3,4,5,18}, {8,12,16,54}, {43,34,18,7}};
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
if(a[i][j]==18) break;
if(j<4)break;
}
printf("数值18第一次出现的位置在%d行,第%d列\n",i+1,j+1);
return 0;
}
运行结果:
数值18第一次出现的位置在1行,第4列
----------------------------------
(9)求二维数组元素的和平均值及个数统计
设有4行4列的数组a,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能:(1) 求第二行4元素的累加和;(2) 求第四列4元素的平均值;(3) 求主对角线4元素中负数的个数。
#include <stdio.h>
int main(void)
{
int a[4][4],i,j,s=0,m=0;
float n=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=3*i+2*j-6;
printf("原始数组为:\n");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%3d",a[i][j]);
printf("\n");
}
for(j=0;j<4;j++)
s+=a[1][j];
printf("第二行4元素累加和为:%d\n",s);
for(j=0;j<4;j++)
n+=a[j][3];
printf("第四列4元素平均值为:%.2f\n",n/4.0);
for(i=0;i<4;i++)
if(a[i][i]<0)
m++;
printf("主对角线4元素中负数的个数为:%d\n",m);
return 0;
}
运行结果:
原始数组为:
-6 -4 -2 0
-3 -1 1 3
0 2 4 6
3 5 7 9
第二行4元素累加和为:0
第四列4元素平均值为:4.50
主对角线4元素中负数的个数为:2
---------------------------
(10)约瑟夫环问题
编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。
#include <stdio.h>
int main(void)
{
int a[100]; /* 数组a中保存n个人的密码*/
int i,j,m,n,k=0;
printf("输入人数n和报数上限m:");
scanf("%d%d",&n,&m);
printf("输入%d个人的密码: ",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("\n出列顺序为: ");
for(i=0;i<n;i++)
{
j=1;
while(j<m)
{
while(a[k]==0) /*跳过已出列的人*/
k=(k+1)%n;
j++;
k=(k+1)%n;
}
while(a[k]==0) /*跳过已出列的人*/
k=(k+1)%n;
printf("%d ",k+1);
m=a[k];
a[k]=0;
}
return 0;
}
运行结果:
输入人数n和报数上限m:5 6
输入5个人的密码: 3 2 1 4 5
出列顺序为: 1 4 5 2 3
------------------------
章节测验
【单选题】若定义以下变量和数组: (A)
int i;
int a[3][3]={1,2,3,4,5,6,7,8,9};
则下列语句的输出结果是( )。
for(i=0;i<3;i++)
printf("%d ",a[i][2-i]);
- A、元素a[0]是由4个整型元素组成的一维数组
- B、a[0]代表一个地址常量
- C、a数组可以看成是由a[0]、a[1]两个元素组成的一维数组
- D、可以用a[0]=5;的形式给数组元素赋值
【单选题】
假设a、b均为字符数组,则以下正确的输入语句是( D )。