循环结构程序设计
选择题
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 )
- 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); }
- A、2.4
- B、1.5
- C、1.6
- D、2
如果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); }
- A、32
- B、不输出任何内容
- C、3
- D、321
【单选题】若定义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; } }
- A、812
- B、81216
- C、1216
- D、8
以下关于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–);
- A、1
- B、2
- C、0
- D、无限次
语句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)字符串逆序连接
#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)求二维数组元素的和平均值及个数统计
#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 )。