第1章习题 一、选择题
1、A 2、D 3、C 4、D 5、B 6、C 7、C 8、B 9、B 10、A 二、填空题 1、一,函数体
2、main(主) ,main(主) 3、编译,目标 4、.c ,.obj ,.exe
5、缩进,无影响,/* */ 三、程序分析题 1、
***************** Very good!
***************** 2、
a=12,b=5 a=17,b=22 3、
r= 5.50,s=95.033098
四、编程题
1.用printf()函数在屏幕上输出自己的班级、学号、姓名。 #include"stdio.h" void main() {
printf("班级:BX1109\n");
printf("学号:[1**********]1\n"); printf("姓名:王孟荣\n"); }
2.从键盘输入两个整数,计算它们的和、差、积、商,并在屏幕上输出结果。
#include void main() {
int x,y,a,b,c; float d;
printf("Please Input Two Integers:\n"); scanf("%d%d",&x,&y); a=x+y; b=x-y; c=x*y; d=1.0*x/y;
printf("a=%d\nb=%d\nc=%d\nd=%f\n",a,b,c,d); }
第2章习题 一、选择题 1~5 BCDCD 6~10 DBBCA 二、填空题
1.单精度浮点型、双精度浮点型、字符型 2.0
3.x%10*10+x/10 4.5.5 5.5.7 20
6.sin(sqrt(x*x))/(a*b) 7. ,
8.1111011 173 7B 9.3 3 10.3
三、程序分析题 1. 7,8,10 2. 1,3 3. 5 F
4. (int)i=12, 12.50 5. 4 61 57 9 112
四、编程题
1.编写程序,求表达式c=21%9-(float)a+4/b*b的值,假设表达式中a 和b 的值分别由键盘输入。
#include void main( ) {
int a,b; float c;
printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=21%9-(float)a+4/b*b; printf("c=%5.2f\n", c); }
2. 编写程序,从键盘输入两个整数存入变量a 和b 中,求a2-b2的值并输出。 #include void main( ) {
int a,b,c;
printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=a*a-b*b;
printf("c=%d\n", c); }
第3章习题 一、选择题 1 D
2 C
3 A 、B
4 A
5 B
6 B
7 B 、C
8 B
9 D
10 D
二、填空题
1. 有穷性 确定性 可行性 2. #
3. 从终端(键盘)输入一个字符 4. m d 5. 97,g
6. 123.456000, 123.46, 123
7. 格式控制符不正确(输入数据时不能控制列宽和小数位数) 8. 63,63,77,3f 9. %f%f &x,&y
10. ch ch 三、程序分析题 1. c=11
2. a=123 f=457 3. x=345 y=3.460000 4. a=1,b=3 a=3,b=1
5. (题目需修改为:从键盘输入一个除a 和z 以外的小写字母)
程序的功能:从键盘输入一个除a 和z 以外的小写字母,求出该字母对应的大写字母的前趋和后继字母,然后顺序输出此三个大写字母,每个字母所占列宽为3。 运行结果: 假如输入:f ' 输出: E F G
四、编程题
1.编写程序,计算的值并输出(保留3位小数) ,其中a 、b 的值由键盘输入。 #include #include void main( ) { float a, b,x;
scanf("%f%f", &a, &b); x=(a*a+b*b)/sqrt(3*(a+b)); printf("x=%.3f\n",x); }
2.编写程序,从键盘输入一个梯形的上底a 、下底b 和高h ,输出梯形的面积s 。
#include
#include void main( ) { float a, b,h,s;
scanf("%f,%f,%f", &a,&b,&h); s=(a+b)*h/2;
printf("梯形面积s=%.2f\n",s); }
3.编写程序,在屏幕上输入你姓名的第一个字母,显示出该字母以及下面的信息: Hello!
This is a c program.
My name is [第一个字母]
#include void main( ) {
char name;
name=getchar(); putchar(name); printf("\nHello!\n");
printf("This is a c program.\n"); printf("My name is %c\n",name); }
第4章习题 一、选择题 1 B
2 B
3 C
4 B
5 C
6 A C
7 B
8 A
9 C
10 C
二、填空题 1. ! && || 2. 1 3. a b 4. 1 5. 0
6. x%4= =0 && x%100!=0 7. 5 6 8. A
9. x10 && x
三、程序分析题 1. No 2. -2 3. 5 3 2
4. #& 5. (1)2 (2)3 CC
a=2,b=2,c=4 四、编程题
1. 有一个函数如下: x2-2 (x
编写程序,输入x 的值,计算相应的y 值输出(保留3位小数) 。 #include #include void main() { float x,y;
scanf("%f", &x); if(x
else if(x
printf("x=%f, y=%.3f\n", x,y); }
2.编写一个程序,根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角、一般三角形)。 #include #include void main( )
{ float a, b, c, s, area;
scanf("%f,%f,%f", &a,&b,&c); if(a+b>c && b+c>a && a+c>b) { s=(a+b+c)/2;
area=sqrt(s*(s*(s-a)*(s-b)*(s-c))); printf("area=%f\n",area); if(a==b && b==c)
printf("等边三角形\n");
else if(a==b || a==c || b==c) printf("等腰三角形\n");
else if((a*a + b*b== c*c)||(a*a + c*c== b*b)||(b*b + c*c == a*a)) printf("直角三角形\n");
else printf("一般三角形\n"); }
else printf("不能组成三角形\n"); }
3.设奖金税率r 有如下的要求 (n代表奖金) : 0 n
用switch 多分支选择语句编写程序,输入奖金值,计算并输出相应的税率和实际应得奖金值。
#include void main( ) { float n, r, s; int m;
printf("请输入奖金值:"); scanf("%f", &n); if(n>=6000) m=6; else m=n/1000; switch(m)
{ case 0: r=0; break; case 1: r=0.05; break; case 2: r=0.08; break; case 3:
case 4:
case 5: r=0.1; break; case 6: r=0.15; break; }
s=n-r*n;
printf("税率r=%.0f%%, 奖金值n=%.2f, 实际应得奖金值s=%.2f\n",r*100, n, s); }
4. 从键盘输入任意4个数a 、b 、c 、d ,按照从大到小的顺序排列后重新输出。 #include void main( ) { int a, b, c, d,t;
scanf("%d,%d,%d,%d", &a,&b,&c,&d); if(a
printf("%d %d %d %d\n", a,b,c,d); }
5. 给出一个不超过4位数的正整数,判断它是几位数,并按逆向输出各位数字。例1234,输出为4321。 #include void main( )
{ int num,i,j,k,m;
printf("输入一个少于4位的正整数:"); scanf("%d",&num);
if(num>=0 && num
{ if(num>1000 && num
m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100%10; /*求百位上的数字*/ i=num/1000; /*求千位上的数字*/ printf("逆序数为:%d%d%d%d\n",m,k,j,i); }
else if(num>=100)
{ printf("是一个3位数\n");
m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100; /*求百位上的数字*/ printf("逆序数为:%d%d%d\n",m,k,j);
}
else if(num>=10)
{printf("是一个2位数\n");
m=num%10; /*求个位上的数字*/ k=num/10; /*求十位上的数字*/ printf("逆序数为:%d%d\n",m,k); }
else
{printf("是一个1位数\n"); printf("逆序数为:%d\n",num); } }
else printf("是一个无效的数\n"); }
第5章习题 一、选择题 1 B
2 C
3 B
4 C
5 A
6 B
7 D
8 B
9 A
10 B
二 填空题
1. 循环 switch 2. 4,7 3. 6 4. # # 5. 0 2 6. 18 7. 1
8. sum=80 9. c=getchar() n:m
10. i %13= =0 break
三 程序分析题 1. output1:21 6 output2: 5 6 output3: 5 7 7 2. n=7 3. Max=18 Min=3 4. 1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9 5. 0 1 2 3 1 2 3 0 2 3 0 1 3 0 1 2 四、编程题
1. 从键盘上输入若干字符,以按Enter 键结束,统计其中字符A 或a 的个数。 #include "stdio.h" main() { char ch; int k=0;
while((ch=getchar())!='\n') { if(ch=='A' || ch=='a') k=k+1; }
printf("%d\n",k); }
2. 利用=×…的前100项之积计算p 的值。 #include main() {
double term, result = 1; /*累乘项初值应为1*/ int n;
for (n=2; n
term=(double)( n * n)/((n-1)*(n+1)); /*计算累乘项*/ result = result * term; }
printf("result = %f\n", 2*result); }
3. 用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚? #include main() {
int x,y,z,count=0; for(x=1;x
z=100-x-y;
if(5*x+2*y+z==150) {
count++;
printf("%d,%d,%d\n",x,y,z); } }
printf("count=%d\n",count); }
4. 鸡兔同笼,共有98个头,386只脚,编程求鸡、兔各多少只。 #include main() { int x, y;
for (x=1;x
if(2*x+4*y==386)
printf("鸡=%d,兔=%d",x,y); } }
5. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 #include main()
{
int n,i;
printf("\nplease input a number:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i
if(n%i==0) { printf("%d*",i); n=n/i; }
else break; }
printf("%d",n);
6. 从键盘任意输入一个4位数x ,编程计算x 的每一位数字相加之和。例如,输入x 为1234,则由1234分离出其千位1、百位2、十位3、个位4,然后计算1+2+3+4=10,并输出10。 #include #include main() {
int i1,i2,i3,i4,k,n;
printf("Inputdatais:"); scanf("%d",&n);
k=fabs(n); /*取绝对值*/ i1=k/1000; /*分离出千位*/
i2=(k-i1*1000)/100; /*分离出百位*/
i3=(k-i1*1000-i2*100)/10; /*分离出十位*/ i4=k%10; /*分离出个位*/
printf("The sum of the total bit is %d\n",i1+i2+i3+i4); }
7. 打印出所有" 水仙花数" ,所谓" 水仙花数" 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=13+53+33。 #include void main() {
int i,j,k,n;
printf("parcissus numbers are:\n"); for (n=100;n
i=n/100; j=n/10-i*10; k=n%10;
if (n==i*i*i+j*j*j+k*k*k) printf("%d\n",n); } }
8. 利用泰勒级数sin(x)≈计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x 由键盘输入)。 #include #include main() {
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); } 9.编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。
#include void main()
{int num=123,x,n;
printf("hint:0
if(x==num) {printf("Win!\n");break;} if(x>num) printf("bigger!\n"); if(x
if(n==11) printf("Lost!the number is %d\n",x); }
10. 编程输出以下图案。 * *** ***** ******* ***** *** *
#include main() {
int i,j;
for(i=1;i
for (j=20-i;j>=1;j--) printf("%c",' ');
for (j=0;j
for (i=3;i>=1;i--) {
for (j=20-i;j>=1;j--) printf("%c",' ');
for (j=0;j
第6章习题 一、选择题 1 D
2 A
3 D
4 B
5 D
6 C
7 B
8 D
9 B
10 D
二 填空题 1. 0 2. 14 m
3.10 7 4. 数据类型
5. strcpy(S2,S1) #include 6. 0 3 7. 7,6 8. sum=0 i==j a[i][j] 9. 4 10. Tony
三 程序分析题 1. max=85 min=5 sum=180 aver=30.00 2. a=2 b=2 c=2 d=2 e=1 f=2 g=2 3. j=45
4. Ti_saCPorm Tss_Pgm 5. 1 1 1 5
四、编程题
1.从键盘输入15个整数,存放在数组中,找出其中最小数并指出其所在的位置。 #include #define N 15 main()
{int min,i,j,a[N];
printf("Enter N integers:\n"); for(i=0;i
min=a[0];
for(i=1;ia[i]) { min=a[i]; j=i; }
printf("%d,%d",min,j); }
2.将输入的十进制正整数化为十六进制数。 #include main() {
int i,x,j,a[20];
printf("请输入一个正整数:"); while(1) {
scanf("%d",&x); if(x
printf("数据输入错误,请重新输入一个正整数:"); else break; } i=0; while(x) {
a[i]=x%16; x=x/16; i++; }
for(j=i-1;j>=0;j--) if(a[j]
printf("%d",a[j]); else if(a[j]
printf("%c",a[j]+'A'-10); printf("\n"); }
3.从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。 #include void main() {
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); }
4.从键盘输入一字符串,放在字符数组a 中,将字符数组a 中下标值为偶数的元素按从小到大排序。
#include #include void main() {
char a[80],t,m; int i,j,k;
printf("请输入一字符串:"); gets(a); k=strlen(a);
for(i=0;i
for(j=i+2;ja[j]) m=j; if(m!=i)
{t=a[i];a[i]=a[m];a[m]=t;} }
puts(a); printf("\n"); }
5.编写程序输出以下杨辉三角形(要求输出10行)。 1 1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1 … … … … … …
#include #include
{ int i,j,a[10][10]; for(i=0;i
a[i][j]=a[i-1][j-1]+a[i-1][j]; }
for(i=0;i
6.编程将s 数组中的字符串的正序和反序进行连接,形成一个新串放在t 数组中。例如,当s 数组中字符串为"ABCD" 时,则t 数组中的内容应为:"ABCDDCBA" 。 #include #include main() {
char s[100], t[100]; int i,d;
printf("Please enter string S:"); scanf("%s",s); d=strlen(s);
for(i=0;i
for(i=0;i
printf("The result is: %s\n",t); }
7.某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 #include main()
{ int a,i,aa[4],t;
printf("输入一个需加密的四位数整数:"); scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i
aa[i]%=10; }
for(i=0;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"); }
8.编写程序查找数值18在以下二维数组中第一次出现的位置。 3 4 5 18 8 12 16 54 43 34 18 7
#include main()
{ int i,j,a[3][4]={{3,4,5,18}, {8,12,16,54}, {43,34,18,7}}; for(i=0;i
if(a[i][j]==18) break; if(j
printf("数值18第一次出现的位置在%d行, 第%d列\n",i+1,j+1); }
9.设有4行4列的数组a ,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能: (1) 求第二行4元素的累加和; (2) 求第四列4元素的平均值;
(3) 求主对角线4元素中负数的个数。 #include void main()
{ int a[4][4],i,j,s=0,m=0; float n=0;
for(i=0;i
printf("原始数组为:\n"); for(i=0;i
{ for(j=0;j
printf("%3d",a[i][j]);
printf("\n");
}
for(j=0;j
s+=a[1][j];
printf("第二行4元素累加和为:%d\n",s);
for(j=0;j
n+=a[j][3];
printf("第四列4元素平均值为:%.2f\n",n/4.0);
for(i=0;i
if(a[i][i]
m++;
printf("主对角线4元素中负数的个数为:%d\n",m);
}
10.约瑟夫环问题:编号为1,2,3,...,n 的n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m 作为报数上限值,从第一个人开始按顺时针报数,报到m 时停止,报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。
分析:设整型数组a 中保存n 个人的密码,对应的人出列后,数组元素置0作为标志。顺时针确定下一个人的方法,可将下标加1,再对n 求余。
#include
#define N 100
main()
{ int a[100];
int i,j,m,n,k=0;
printf("输入人数n 和任选的一个正整数m:");
scanf("%d%d",&n,&m);
printf("输入n 个人的密码: ");
for (i=0;i
scanf("%d",&a[i]);
printf("\n出列顺序为: ");
for(i=0;i
{ j=1;
while(j
{ 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;
}
}
第7章习题
一、选择题
1
A 2 D 3 D 4 B 5 A 6 D 7 C 8 D 9 B 10 A
二 填空题
1. main()
2. main()
3.函数首部
4. 解决函数必须“定义在前,使用在后”的原则问题
5. int
6. 定义 调用
7. 地址传递 值传递
8. return void
9. void f(float a,float b) float f(float a,float b)
10. static
三 程序分析题
1. a=48
2. 8,17
3. 2721
4. BASIC
C
COBOL
FORTRAN
PASCAL
Smalltalk
5. 6
1 2 3
6 5 4
四、编程题
1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。
#include
#include
void main()
{int prime(int);
int n;
printf("Input an integer:");
scanf("%d",&n);
if (prime(n))
printf("\n %d is a prime.\n",n);
else
printf("\n %d is not a prime.\n",n);
int prime(int n)
{int flag=1,i;
for (i=2; i
if (n%i==0)
flag=0;
return(flag);
}
2.写一个函数,用于实现函数strcmp()的功能,能将两个字符串进行比较,将两个字符串中第一个不相同字符的ASCII 码值之差作为函数的返回值。
#include
int MyStrcmp(char s[], char t[]);
main()
{
char str1[20],str2[20];
printf("Input string:");
gets(str1);
printf("Input another string:");
gets(str2);
if (MyStrcmp(str1,str2)>0)
printf("str1>str2\n");
else if (MyStrcmp(str1,str2)
printf("str1
else
printf("str1=str2\n");
}
int MyStrcmp(char s[], char t[])
{
int i;
for (i=0;s[i]==t[i]; i++)
if (s[i]=='\0') return 0 ;
return (s[i]-t[i]);
}
3. 写一个函数,用于实现函数strcat()的功能, 能将两个字符串连接。
#include
void main()
{void concatenate(char string1[],char string2[],char string[]);
char s1[100],s2[100],s[100];
printf("input string1:");
scanf("%s",s1);
printf("input string2:");
scanf("%s",s2);
concatenate(s1,s2,s);
printf("\nThe new string is %s\n",s);
}
void concatenate(char string1[],char string2[],char string[])
{int i,j;
for (i=0;string1[i]!='\0';i++)
string[i]=string1[i];
for(j=0;string2[j]!='\0';j++)
string[i+j]=string2[j];
string[i+j]='\0';
}
4. 从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。
#include
#define ARRSIZE 10
void MaxMinExchang(int a[], int n)
{
int maxValue=a[0], minValue=a[0], maxPos=0, minPos=0;
int i, temp;
for (i=1; i
{
if (a[i] > maxValue)
{
maxValue = a[i];
maxPos = i;
}
else if (a[i]
{
minValue = a[i];
minPos = i;
}
}
temp = a[maxPos];
a[maxPos] = a[minPos];
a[minPos] = temp;
}
main()
{
int a[ARRSIZE],i;
printf("Input %d Numbers:\n",ARRSIZE);
for (i=0; i
scanf("%d", &a[i]);
MaxMinExchang(a, ARRSIZE);
printf("After MaxMinExchange:\n");
for (i=0;i
printf("%4d", a[i]);
printf("\n") ;
}
5. 写一函数,能对给定的一个二维数组(3×3)进行转置(即行列互换)。
#include
#define N 3
int array[N][N];
void main()
{ void convert(int array[][3]);
int i,j;
printf("input array:\n");
for (i=0;i
for (j=0;j
scanf("%d",&array[i][j]);
printf("\noriginal array :\n");
for (i=0;i
{for (j=0;j
printf("%5d",array[i][j]);
printf("\n");
}
convert(array);
printf("convert array:\n");
for (i=0;i
{for (j=0;j
printf("%5d",array[i][j]);
printf("\n");
}
}
void convert(int array[][3])
{int i,j,t;
for (i=0;i
for (j=i+1;j
{t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
6. 写一函数,能用“起泡法”对输入的10个字符按由小到大顺序排序。
#include
#include
#define N 10
char str[N];
void main()
{void sort(char str[]);
int i,flag;
for (flag=1;flag==1;)
{printf("input string:\n");
scanf("%s",str);
if (strlen(str)>N)
printf("string too long,input again!");
else
flag=0;
}
sort(str);
printf("string sorted:\n");
for (i=0;i
printf("%c",str[i]);
printf("\n");
}
void sort(char str[])
{int i,j;
char t;
for(j=0;j
for (i=0;(i
if(str[i]>str[i+1])
{t=str[i];
str[i]=str[i+1];
str[i+1]=t;
}
}
7. 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数。
#include
int letter,digit,space,others;
void main()
{void count(char str[]);
char text[80];
printf("input string:\n");
gets(text);
printf("string:");
puts(text);
letter=0;
digit=0;
space=0;
others=0;
count(text);
printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n",letter,digit,space,others);
}
void count(char str[])
{int i;
for (i=0;str[i]!='\0';i++)
if ((str[i]>='a'&& str[i]='A' && str[i]
letter++;
else if (str[i]>='0' && str [i]
digit++;
else if (str[i]==32)
space++;
else
others++;
}
8. 编写程序输出3~10000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。
#include
#include
#include
int invert(int a)
{
int s=0;
while(a>0)
{
s=10*s+a%10;
a/=10;
}
return s;
}
int prime(int a)
{
int i;
for(i=2;i
if(a%i==0)
return 0;
return 1;
}
main()
{
int i;
for(i=3;i
if(prime(i))
if(prime(invert(i)))
printf("%5d",i);
printf("\n");
}
9. 编写一个函数,实现将一个十进制数转换成八进制数。
#include
#include
void main()
{
int i,n;
char a[33];
void trans10_8(char x[],int m);
printf("\nInput a positive integer:");
scanf("%d",&n);
trans10_8(a,n);
for (i=strlen(a)-1;i>=0;i--)
printf("%c",a[i]);
printf("\n");
}
void trans10_8 (char x[],int m)
{
int r,i=0;
while(m>0)
{
r=m%8;
x[i]=r+48;
m=m/8;
i++;
}
x[i]='\0';
}
10. 编写一个函数,实现对由实参传来的一个字符串,将其字符顺序颠倒后重新存放。 #include
#include
void main()
{void inverse(char str[]);
char str[100];
printf("input string:");
scanf("%s",str);
inverse(str);
printf("inverse string:%s\n",str);
}
void inverse(char str[])
{char t;
int i,j;
for (i=0,j=strlen(str);i
{t=str[i];
str[i]=str[j-1];
str[j-1]=t;
}
}
第八章编程题答案
1.输入2个字符串,每个字符串的长度均不超过80字符,用自己实现的cmpstr()函数完成这两个字符串的大小比较,cmpstr()函数的功能和字符串比较函数strcmp()的功能相同。 #include
#include
int cmpstr(char *s1, char *s2)
{
char *p, *q;
p=s1;
q=s2;
while(*p!='\0' && *q!='\0')
{
if(*p==*q)
{
p++;
q++;
}
else
}
return *p-*q;
}
void main()
{
char str1[81], str2[81];
int c;
printf("请输入第1个字符串:");
gets(str1);
printf("请输入第2个字符串:");
gets(str2);
c=cmpstr(str1,str2);
if(c>0)
printf("字符串%s 大于 字符串%s\n",str1,str2);
else if(c
printf("字符串%s 小于 字符串%s\n",str1,str2);
else
printf("字符串%s 等于 字符串%s\n", str1, str2);
}
3.定义一个函数delSubstr(),删除字符串中第k 个字符开始的m 个字符,例如删除字符串abcde 第2个字符开始的3个字符,则删除后结果为ae ;又如删除字符串abcde 第4个字符开始的5个字符,则删除后结果为abc 。
#include
#include
int delSubstr(char *str, int k, int m)
{
char *p, *q;
if(k
return -1;
else if(k>strlen(str))
return -2;
else if(k+m>strlen(str))
{
str[k-1]='\0';
return 1;
}
else
{
p=str+k-1;
q=str+k+m-1;
while(*q!='\0')
*p++=*q++;
return 1;
}
}
void main()
{
char str[81];
int k, m, state;
printf("请输入字符串:\n");
gets(str);
printf("请输入要删除的子串起始字符的序号和子串长度:\n");
scanf("%d%d", &k, &m);
state = delSubstr(str, k, m);
if(state
printf("要删除子串起始字符的序号或子串长度输入错误!\n");
else
printf("删除指定子串后的字符串为:%s\n", str);
}
4.定义一个函数delSpechar(),使用字符指针删除字符串中的所有指定字符(如把字符串“I love you!”中的o 字符删除,得到“I lve yu!”)。
#include
#include
void delSpechar(char *str, char ch)
{
char *p, *q;
p=str;
while(*p!='\0')
{
if(*p==ch)
{
q=p;
while(*q!='\0')
{
*q=*(q+1);
q++;
}
}
else
p++;
}
}
void main()
char str[81], ch;
printf("请输入一个字符串:");
gets(str);
printf("请输入要从字符串中删除的字符:");
ch = getchar();
delSpechar(str, ch);
printf("删除所有指定字符后的字符串为:%s\n", str);
}
5.求整型二维数组a[M][N]中的最大元素值及最大元素的位置(用指针法引用数组元素)。 #include
#define M 3
#define N 4
void max(int (*pa)[N], int *pRow, int *pCol)
{
int i, j;
for(i=0; i
for(j=0; j
if(pa[i][j]>pa[*pRow][*pCol])
{
*pRow = i;
*pCol = j;
}
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
int row=0, col=0;
max(a, &row, &col);
printf("二维数组中的最大元素值为a[%d][%d]=%d\n", row, col, a[row][col]);
}
6.已知字符串str[80],编写函数lstrchar(),实现在数组str 中查找字符ch 首次出现的位置,如果字符串中找不到该字符,则返回-1。
#include
#include
int lstrchar(char *str1, char ch1)
{
char *p,i=1;
p=str1;
while(*p!='\0')
{
if(*p==ch1)
break;
{
p++;
i++;
}
}
if(*p=='\0')
return -1;
else
return i;
}
void main()
{
char ch,str[80];
int poi;
printf("请输入字符串:");
gets(str);
printf("请输入待查找的字符:");
scanf("%c",&ch);
poi=lstrchar(str,ch);
if(poi==-1)
printf("字符串中不存在指定字符!\n");
else
printf("该字符在字符串中出现的第一个位置为%d\n", poi);
}
7.定义一个整型二维数组并初始化,编程求该数组所有元素的和。
要求:分别用数组下标法、一级指针法、二级指针法实现。
/*数组下标法*/
#include
#define M 3
#define N 4
int sum(int b[M][N])
{
int i, j, s=0;
for(i=0; i
for(j=0; j
s = s + b[i][j];
return s;
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
printf("二维数组中的所有元素之和为%d\n", sum(a));
}
/*一级指针法*/
#include
#define M 3
#define N 4
int sum(int *pa)
{
int i,s=0;
for(i=0;i
s=s+*pa++;
return s;
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
printf("二维数组中的所有元素之和为%d\n", sum(a[0]));
}
/*二级指针法*/
#include
#define M 3
#define N 4
int sum(int (*pa)[N])
{
int i,j,s=0;
for(i=0;i
{
for(j=0;j
s=s+(*pa)[j];
pa++;
}
return s;
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
printf("二维数组中的所有元素之和为%d\n", sum(a));
}
8.输入一行数字字符存入字符数组str[80]中,用num[10]中的数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,„„。输出每个奇数字符出现的次数。
#include
void count(char *str, int num[])
{
int i=0;
while(str[i]!='\0')
{
switch(str[i])
{
case '0': num[0]++; break;
case '1': num[1]++; break;
case '2': num[2]++; break;
case '3': num[3]++; break;
case '4': num[4]++; break;
case '5': num[5]++; break;
case '6': num[6]++; break;
case '7': num[7]++; break;
case '8': num[8]++; break;
case '9': num[9]++; break;
}
i++;
}
}
void main()
{
char str[80],*p=str;
int num[10]={0}, i;
printf("请输入一行数字字符:");
gets(p);
count(p,num);
for(i=1;i
printf("数字串中%d出现的次数为%d\n",i,num[i]);
}
9.在主函数中输入10个不等长字符串,用另一函数sort()对它们排序,然后在主函数中输出已排好序的字符串。要求:每个字符串长度均不超过30字符,用指针数组进行处理。 #include
#include
#define M 10
#define N 31
void sort(char *pstr[])
{
int i,j;
char *t;
for(i=0; i
{
for(j=0; j
if(strcmp(pstr[j],pstr[j+1])>0)
{
t = pstr[j];
pstr[j] = pstr[j+1];
pstr[j+1] = t;
}
}
}
void main()
{
char str[M][N], *pstr[M]={NULL};
int i;
printf("请输入10个字符串,每个字符串均不超过30个字符:\n");
for(i=0; i
{
gets(str[i]);
pstr[i]=str[i];
}
sort(pstr);
printf("排好序的字符串从小到大依次为:\n");
for(i=0; i
printf("%s\n", pstr[i]);
}
10.输入一个字符串,内有数字字符和非数字字符如123a345bcd567,将其中连续的数字作为一个整数,依次存放到整型数组a 中,例如,123放在a[0],345放在a[1]中,567放在a[2]中,„„,统计共有多少个整数,并输出这些整数。
#include
#include
void main()
{
char ch[1000],*p=ch;
int a[50],*q=a,num=0,i;
gets(ch);
for( ; *p!='\0'; p++)
if(*p>='0' && *p
{
*q=(*p)-'0';
p++;
while(*p>='0' && *p
*q=(*q)*10+(*(p++)-'0');
num+=1;
q+=1;
}
for(i=0,q=a; i
printf("%d ",*q);
printf("\n一共输入了%d个整数。\n",num); }
第1章习题 一、选择题
1、A 2、D 3、C 4、D 5、B 6、C 7、C 8、B 9、B 10、A 二、填空题 1、一,函数体
2、main(主) ,main(主) 3、编译,目标 4、.c ,.obj ,.exe
5、缩进,无影响,/* */ 三、程序分析题 1、
***************** Very good!
***************** 2、
a=12,b=5 a=17,b=22 3、
r= 5.50,s=95.033098
四、编程题
1.用printf()函数在屏幕上输出自己的班级、学号、姓名。 #include"stdio.h" void main() {
printf("班级:BX1109\n");
printf("学号:[1**********]1\n"); printf("姓名:王孟荣\n"); }
2.从键盘输入两个整数,计算它们的和、差、积、商,并在屏幕上输出结果。
#include void main() {
int x,y,a,b,c; float d;
printf("Please Input Two Integers:\n"); scanf("%d%d",&x,&y); a=x+y; b=x-y; c=x*y; d=1.0*x/y;
printf("a=%d\nb=%d\nc=%d\nd=%f\n",a,b,c,d); }
第2章习题 一、选择题 1~5 BCDCD 6~10 DBBCA 二、填空题
1.单精度浮点型、双精度浮点型、字符型 2.0
3.x%10*10+x/10 4.5.5 5.5.7 20
6.sin(sqrt(x*x))/(a*b) 7. ,
8.1111011 173 7B 9.3 3 10.3
三、程序分析题 1. 7,8,10 2. 1,3 3. 5 F
4. (int)i=12, 12.50 5. 4 61 57 9 112
四、编程题
1.编写程序,求表达式c=21%9-(float)a+4/b*b的值,假设表达式中a 和b 的值分别由键盘输入。
#include void main( ) {
int a,b; float c;
printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=21%9-(float)a+4/b*b; printf("c=%5.2f\n", c); }
2. 编写程序,从键盘输入两个整数存入变量a 和b 中,求a2-b2的值并输出。 #include void main( ) {
int a,b,c;
printf("Please input data a,b: "); scanf("%d%d",&a,&b); c=a*a-b*b;
printf("c=%d\n", c); }
第3章习题 一、选择题 1 D
2 C
3 A 、B
4 A
5 B
6 B
7 B 、C
8 B
9 D
10 D
二、填空题
1. 有穷性 确定性 可行性 2. #
3. 从终端(键盘)输入一个字符 4. m d 5. 97,g
6. 123.456000, 123.46, 123
7. 格式控制符不正确(输入数据时不能控制列宽和小数位数) 8. 63,63,77,3f 9. %f%f &x,&y
10. ch ch 三、程序分析题 1. c=11
2. a=123 f=457 3. x=345 y=3.460000 4. a=1,b=3 a=3,b=1
5. (题目需修改为:从键盘输入一个除a 和z 以外的小写字母)
程序的功能:从键盘输入一个除a 和z 以外的小写字母,求出该字母对应的大写字母的前趋和后继字母,然后顺序输出此三个大写字母,每个字母所占列宽为3。 运行结果: 假如输入:f ' 输出: E F G
四、编程题
1.编写程序,计算的值并输出(保留3位小数) ,其中a 、b 的值由键盘输入。 #include #include void main( ) { float a, b,x;
scanf("%f%f", &a, &b); x=(a*a+b*b)/sqrt(3*(a+b)); printf("x=%.3f\n",x); }
2.编写程序,从键盘输入一个梯形的上底a 、下底b 和高h ,输出梯形的面积s 。
#include
#include void main( ) { float a, b,h,s;
scanf("%f,%f,%f", &a,&b,&h); s=(a+b)*h/2;
printf("梯形面积s=%.2f\n",s); }
3.编写程序,在屏幕上输入你姓名的第一个字母,显示出该字母以及下面的信息: Hello!
This is a c program.
My name is [第一个字母]
#include void main( ) {
char name;
name=getchar(); putchar(name); printf("\nHello!\n");
printf("This is a c program.\n"); printf("My name is %c\n",name); }
第4章习题 一、选择题 1 B
2 B
3 C
4 B
5 C
6 A C
7 B
8 A
9 C
10 C
二、填空题 1. ! && || 2. 1 3. a b 4. 1 5. 0
6. x%4= =0 && x%100!=0 7. 5 6 8. A
9. x10 && x
三、程序分析题 1. No 2. -2 3. 5 3 2
4. #& 5. (1)2 (2)3 CC
a=2,b=2,c=4 四、编程题
1. 有一个函数如下: x2-2 (x
编写程序,输入x 的值,计算相应的y 值输出(保留3位小数) 。 #include #include void main() { float x,y;
scanf("%f", &x); if(x
else if(x
printf("x=%f, y=%.3f\n", x,y); }
2.编写一个程序,根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角、一般三角形)。 #include #include void main( )
{ float a, b, c, s, area;
scanf("%f,%f,%f", &a,&b,&c); if(a+b>c && b+c>a && a+c>b) { s=(a+b+c)/2;
area=sqrt(s*(s*(s-a)*(s-b)*(s-c))); printf("area=%f\n",area); if(a==b && b==c)
printf("等边三角形\n");
else if(a==b || a==c || b==c) printf("等腰三角形\n");
else if((a*a + b*b== c*c)||(a*a + c*c== b*b)||(b*b + c*c == a*a)) printf("直角三角形\n");
else printf("一般三角形\n"); }
else printf("不能组成三角形\n"); }
3.设奖金税率r 有如下的要求 (n代表奖金) : 0 n
用switch 多分支选择语句编写程序,输入奖金值,计算并输出相应的税率和实际应得奖金值。
#include void main( ) { float n, r, s; int m;
printf("请输入奖金值:"); scanf("%f", &n); if(n>=6000) m=6; else m=n/1000; switch(m)
{ case 0: r=0; break; case 1: r=0.05; break; case 2: r=0.08; break; case 3:
case 4:
case 5: r=0.1; break; case 6: r=0.15; break; }
s=n-r*n;
printf("税率r=%.0f%%, 奖金值n=%.2f, 实际应得奖金值s=%.2f\n",r*100, n, s); }
4. 从键盘输入任意4个数a 、b 、c 、d ,按照从大到小的顺序排列后重新输出。 #include void main( ) { int a, b, c, d,t;
scanf("%d,%d,%d,%d", &a,&b,&c,&d); if(a
printf("%d %d %d %d\n", a,b,c,d); }
5. 给出一个不超过4位数的正整数,判断它是几位数,并按逆向输出各位数字。例1234,输出为4321。 #include void main( )
{ int num,i,j,k,m;
printf("输入一个少于4位的正整数:"); scanf("%d",&num);
if(num>=0 && num
{ if(num>1000 && num
m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100%10; /*求百位上的数字*/ i=num/1000; /*求千位上的数字*/ printf("逆序数为:%d%d%d%d\n",m,k,j,i); }
else if(num>=100)
{ printf("是一个3位数\n");
m=num%10; /*求个位上的数字*/ k=num/10%10; /*求十位上的数字*/ j=num/100; /*求百位上的数字*/ printf("逆序数为:%d%d%d\n",m,k,j);
}
else if(num>=10)
{printf("是一个2位数\n");
m=num%10; /*求个位上的数字*/ k=num/10; /*求十位上的数字*/ printf("逆序数为:%d%d\n",m,k); }
else
{printf("是一个1位数\n"); printf("逆序数为:%d\n",num); } }
else printf("是一个无效的数\n"); }
第5章习题 一、选择题 1 B
2 C
3 B
4 C
5 A
6 B
7 D
8 B
9 A
10 B
二 填空题
1. 循环 switch 2. 4,7 3. 6 4. # # 5. 0 2 6. 18 7. 1
8. sum=80 9. c=getchar() n:m
10. i %13= =0 break
三 程序分析题 1. output1:21 6 output2: 5 6 output3: 5 7 7 2. n=7 3. Max=18 Min=3 4. 1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9 5. 0 1 2 3 1 2 3 0 2 3 0 1 3 0 1 2 四、编程题
1. 从键盘上输入若干字符,以按Enter 键结束,统计其中字符A 或a 的个数。 #include "stdio.h" main() { char ch; int k=0;
while((ch=getchar())!='\n') { if(ch=='A' || ch=='a') k=k+1; }
printf("%d\n",k); }
2. 利用=×…的前100项之积计算p 的值。 #include main() {
double term, result = 1; /*累乘项初值应为1*/ int n;
for (n=2; n
term=(double)( n * n)/((n-1)*(n+1)); /*计算累乘项*/ result = result * term; }
printf("result = %f\n", 2*result); }
3. 用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚? #include main() {
int x,y,z,count=0; for(x=1;x
z=100-x-y;
if(5*x+2*y+z==150) {
count++;
printf("%d,%d,%d\n",x,y,z); } }
printf("count=%d\n",count); }
4. 鸡兔同笼,共有98个头,386只脚,编程求鸡、兔各多少只。 #include main() { int x, y;
for (x=1;x
if(2*x+4*y==386)
printf("鸡=%d,兔=%d",x,y); } }
5. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 #include main()
{
int n,i;
printf("\nplease input a number:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i
if(n%i==0) { printf("%d*",i); n=n/i; }
else break; }
printf("%d",n);
6. 从键盘任意输入一个4位数x ,编程计算x 的每一位数字相加之和。例如,输入x 为1234,则由1234分离出其千位1、百位2、十位3、个位4,然后计算1+2+3+4=10,并输出10。 #include #include main() {
int i1,i2,i3,i4,k,n;
printf("Inputdatais:"); scanf("%d",&n);
k=fabs(n); /*取绝对值*/ i1=k/1000; /*分离出千位*/
i2=(k-i1*1000)/100; /*分离出百位*/
i3=(k-i1*1000-i2*100)/10; /*分离出十位*/ i4=k%10; /*分离出个位*/
printf("The sum of the total bit is %d\n",i1+i2+i3+i4); }
7. 打印出所有" 水仙花数" ,所谓" 水仙花数" 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=13+53+33。 #include void main() {
int i,j,k,n;
printf("parcissus numbers are:\n"); for (n=100;n
i=n/100; j=n/10-i*10; k=n%10;
if (n==i*i*i+j*j*j+k*k*k) printf("%d\n",n); } }
8. 利用泰勒级数sin(x)≈计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x 由键盘输入)。 #include #include main() {
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); } 9.编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。
#include void main()
{int num=123,x,n;
printf("hint:0
if(x==num) {printf("Win!\n");break;} if(x>num) printf("bigger!\n"); if(x
if(n==11) printf("Lost!the number is %d\n",x); }
10. 编程输出以下图案。 * *** ***** ******* ***** *** *
#include main() {
int i,j;
for(i=1;i
for (j=20-i;j>=1;j--) printf("%c",' ');
for (j=0;j
for (i=3;i>=1;i--) {
for (j=20-i;j>=1;j--) printf("%c",' ');
for (j=0;j
第6章习题 一、选择题 1 D
2 A
3 D
4 B
5 D
6 C
7 B
8 D
9 B
10 D
二 填空题 1. 0 2. 14 m
3.10 7 4. 数据类型
5. strcpy(S2,S1) #include 6. 0 3 7. 7,6 8. sum=0 i==j a[i][j] 9. 4 10. Tony
三 程序分析题 1. max=85 min=5 sum=180 aver=30.00 2. a=2 b=2 c=2 d=2 e=1 f=2 g=2 3. j=45
4. Ti_saCPorm Tss_Pgm 5. 1 1 1 5
四、编程题
1.从键盘输入15个整数,存放在数组中,找出其中最小数并指出其所在的位置。 #include #define N 15 main()
{int min,i,j,a[N];
printf("Enter N integers:\n"); for(i=0;i
min=a[0];
for(i=1;ia[i]) { min=a[i]; j=i; }
printf("%d,%d",min,j); }
2.将输入的十进制正整数化为十六进制数。 #include main() {
int i,x,j,a[20];
printf("请输入一个正整数:"); while(1) {
scanf("%d",&x); if(x
printf("数据输入错误,请重新输入一个正整数:"); else break; } i=0; while(x) {
a[i]=x%16; x=x/16; i++; }
for(j=i-1;j>=0;j--) if(a[j]
printf("%d",a[j]); else if(a[j]
printf("%c",a[j]+'A'-10); printf("\n"); }
3.从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。 #include void main() {
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); }
4.从键盘输入一字符串,放在字符数组a 中,将字符数组a 中下标值为偶数的元素按从小到大排序。
#include #include void main() {
char a[80],t,m; int i,j,k;
printf("请输入一字符串:"); gets(a); k=strlen(a);
for(i=0;i
for(j=i+2;ja[j]) m=j; if(m!=i)
{t=a[i];a[i]=a[m];a[m]=t;} }
puts(a); printf("\n"); }
5.编写程序输出以下杨辉三角形(要求输出10行)。 1 1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1 … … … … … …
#include #include
{ int i,j,a[10][10]; for(i=0;i
a[i][j]=a[i-1][j-1]+a[i-1][j]; }
for(i=0;i
6.编程将s 数组中的字符串的正序和反序进行连接,形成一个新串放在t 数组中。例如,当s 数组中字符串为"ABCD" 时,则t 数组中的内容应为:"ABCDDCBA" 。 #include #include main() {
char s[100], t[100]; int i,d;
printf("Please enter string S:"); scanf("%s",s); d=strlen(s);
for(i=0;i
for(i=0;i
printf("The result is: %s\n",t); }
7.某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 #include main()
{ int a,i,aa[4],t;
printf("输入一个需加密的四位数整数:"); scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i
aa[i]%=10; }
for(i=0;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"); }
8.编写程序查找数值18在以下二维数组中第一次出现的位置。 3 4 5 18 8 12 16 54 43 34 18 7
#include main()
{ int i,j,a[3][4]={{3,4,5,18}, {8,12,16,54}, {43,34,18,7}}; for(i=0;i
if(a[i][j]==18) break; if(j
printf("数值18第一次出现的位置在%d行, 第%d列\n",i+1,j+1); }
9.设有4行4列的数组a ,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能: (1) 求第二行4元素的累加和; (2) 求第四列4元素的平均值;
(3) 求主对角线4元素中负数的个数。 #include void main()
{ int a[4][4],i,j,s=0,m=0; float n=0;
for(i=0;i
printf("原始数组为:\n"); for(i=0;i
{ for(j=0;j
printf("%3d",a[i][j]);
printf("\n");
}
for(j=0;j
s+=a[1][j];
printf("第二行4元素累加和为:%d\n",s);
for(j=0;j
n+=a[j][3];
printf("第四列4元素平均值为:%.2f\n",n/4.0);
for(i=0;i
if(a[i][i]
m++;
printf("主对角线4元素中负数的个数为:%d\n",m);
}
10.约瑟夫环问题:编号为1,2,3,...,n 的n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m 作为报数上限值,从第一个人开始按顺时针报数,报到m 时停止,报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。
分析:设整型数组a 中保存n 个人的密码,对应的人出列后,数组元素置0作为标志。顺时针确定下一个人的方法,可将下标加1,再对n 求余。
#include
#define N 100
main()
{ int a[100];
int i,j,m,n,k=0;
printf("输入人数n 和任选的一个正整数m:");
scanf("%d%d",&n,&m);
printf("输入n 个人的密码: ");
for (i=0;i
scanf("%d",&a[i]);
printf("\n出列顺序为: ");
for(i=0;i
{ j=1;
while(j
{ 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;
}
}
第7章习题
一、选择题
1
A 2 D 3 D 4 B 5 A 6 D 7 C 8 D 9 B 10 A
二 填空题
1. main()
2. main()
3.函数首部
4. 解决函数必须“定义在前,使用在后”的原则问题
5. int
6. 定义 调用
7. 地址传递 值传递
8. return void
9. void f(float a,float b) float f(float a,float b)
10. static
三 程序分析题
1. a=48
2. 8,17
3. 2721
4. BASIC
C
COBOL
FORTRAN
PASCAL
Smalltalk
5. 6
1 2 3
6 5 4
四、编程题
1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。
#include
#include
void main()
{int prime(int);
int n;
printf("Input an integer:");
scanf("%d",&n);
if (prime(n))
printf("\n %d is a prime.\n",n);
else
printf("\n %d is not a prime.\n",n);
int prime(int n)
{int flag=1,i;
for (i=2; i
if (n%i==0)
flag=0;
return(flag);
}
2.写一个函数,用于实现函数strcmp()的功能,能将两个字符串进行比较,将两个字符串中第一个不相同字符的ASCII 码值之差作为函数的返回值。
#include
int MyStrcmp(char s[], char t[]);
main()
{
char str1[20],str2[20];
printf("Input string:");
gets(str1);
printf("Input another string:");
gets(str2);
if (MyStrcmp(str1,str2)>0)
printf("str1>str2\n");
else if (MyStrcmp(str1,str2)
printf("str1
else
printf("str1=str2\n");
}
int MyStrcmp(char s[], char t[])
{
int i;
for (i=0;s[i]==t[i]; i++)
if (s[i]=='\0') return 0 ;
return (s[i]-t[i]);
}
3. 写一个函数,用于实现函数strcat()的功能, 能将两个字符串连接。
#include
void main()
{void concatenate(char string1[],char string2[],char string[]);
char s1[100],s2[100],s[100];
printf("input string1:");
scanf("%s",s1);
printf("input string2:");
scanf("%s",s2);
concatenate(s1,s2,s);
printf("\nThe new string is %s\n",s);
}
void concatenate(char string1[],char string2[],char string[])
{int i,j;
for (i=0;string1[i]!='\0';i++)
string[i]=string1[i];
for(j=0;string2[j]!='\0';j++)
string[i+j]=string2[j];
string[i+j]='\0';
}
4. 从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。
#include
#define ARRSIZE 10
void MaxMinExchang(int a[], int n)
{
int maxValue=a[0], minValue=a[0], maxPos=0, minPos=0;
int i, temp;
for (i=1; i
{
if (a[i] > maxValue)
{
maxValue = a[i];
maxPos = i;
}
else if (a[i]
{
minValue = a[i];
minPos = i;
}
}
temp = a[maxPos];
a[maxPos] = a[minPos];
a[minPos] = temp;
}
main()
{
int a[ARRSIZE],i;
printf("Input %d Numbers:\n",ARRSIZE);
for (i=0; i
scanf("%d", &a[i]);
MaxMinExchang(a, ARRSIZE);
printf("After MaxMinExchange:\n");
for (i=0;i
printf("%4d", a[i]);
printf("\n") ;
}
5. 写一函数,能对给定的一个二维数组(3×3)进行转置(即行列互换)。
#include
#define N 3
int array[N][N];
void main()
{ void convert(int array[][3]);
int i,j;
printf("input array:\n");
for (i=0;i
for (j=0;j
scanf("%d",&array[i][j]);
printf("\noriginal array :\n");
for (i=0;i
{for (j=0;j
printf("%5d",array[i][j]);
printf("\n");
}
convert(array);
printf("convert array:\n");
for (i=0;i
{for (j=0;j
printf("%5d",array[i][j]);
printf("\n");
}
}
void convert(int array[][3])
{int i,j,t;
for (i=0;i
for (j=i+1;j
{t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
6. 写一函数,能用“起泡法”对输入的10个字符按由小到大顺序排序。
#include
#include
#define N 10
char str[N];
void main()
{void sort(char str[]);
int i,flag;
for (flag=1;flag==1;)
{printf("input string:\n");
scanf("%s",str);
if (strlen(str)>N)
printf("string too long,input again!");
else
flag=0;
}
sort(str);
printf("string sorted:\n");
for (i=0;i
printf("%c",str[i]);
printf("\n");
}
void sort(char str[])
{int i,j;
char t;
for(j=0;j
for (i=0;(i
if(str[i]>str[i+1])
{t=str[i];
str[i]=str[i+1];
str[i+1]=t;
}
}
7. 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数。
#include
int letter,digit,space,others;
void main()
{void count(char str[]);
char text[80];
printf("input string:\n");
gets(text);
printf("string:");
puts(text);
letter=0;
digit=0;
space=0;
others=0;
count(text);
printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n",letter,digit,space,others);
}
void count(char str[])
{int i;
for (i=0;str[i]!='\0';i++)
if ((str[i]>='a'&& str[i]='A' && str[i]
letter++;
else if (str[i]>='0' && str [i]
digit++;
else if (str[i]==32)
space++;
else
others++;
}
8. 编写程序输出3~10000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。
#include
#include
#include
int invert(int a)
{
int s=0;
while(a>0)
{
s=10*s+a%10;
a/=10;
}
return s;
}
int prime(int a)
{
int i;
for(i=2;i
if(a%i==0)
return 0;
return 1;
}
main()
{
int i;
for(i=3;i
if(prime(i))
if(prime(invert(i)))
printf("%5d",i);
printf("\n");
}
9. 编写一个函数,实现将一个十进制数转换成八进制数。
#include
#include
void main()
{
int i,n;
char a[33];
void trans10_8(char x[],int m);
printf("\nInput a positive integer:");
scanf("%d",&n);
trans10_8(a,n);
for (i=strlen(a)-1;i>=0;i--)
printf("%c",a[i]);
printf("\n");
}
void trans10_8 (char x[],int m)
{
int r,i=0;
while(m>0)
{
r=m%8;
x[i]=r+48;
m=m/8;
i++;
}
x[i]='\0';
}
10. 编写一个函数,实现对由实参传来的一个字符串,将其字符顺序颠倒后重新存放。 #include
#include
void main()
{void inverse(char str[]);
char str[100];
printf("input string:");
scanf("%s",str);
inverse(str);
printf("inverse string:%s\n",str);
}
void inverse(char str[])
{char t;
int i,j;
for (i=0,j=strlen(str);i
{t=str[i];
str[i]=str[j-1];
str[j-1]=t;
}
}
第八章编程题答案
1.输入2个字符串,每个字符串的长度均不超过80字符,用自己实现的cmpstr()函数完成这两个字符串的大小比较,cmpstr()函数的功能和字符串比较函数strcmp()的功能相同。 #include
#include
int cmpstr(char *s1, char *s2)
{
char *p, *q;
p=s1;
q=s2;
while(*p!='\0' && *q!='\0')
{
if(*p==*q)
{
p++;
q++;
}
else
}
return *p-*q;
}
void main()
{
char str1[81], str2[81];
int c;
printf("请输入第1个字符串:");
gets(str1);
printf("请输入第2个字符串:");
gets(str2);
c=cmpstr(str1,str2);
if(c>0)
printf("字符串%s 大于 字符串%s\n",str1,str2);
else if(c
printf("字符串%s 小于 字符串%s\n",str1,str2);
else
printf("字符串%s 等于 字符串%s\n", str1, str2);
}
3.定义一个函数delSubstr(),删除字符串中第k 个字符开始的m 个字符,例如删除字符串abcde 第2个字符开始的3个字符,则删除后结果为ae ;又如删除字符串abcde 第4个字符开始的5个字符,则删除后结果为abc 。
#include
#include
int delSubstr(char *str, int k, int m)
{
char *p, *q;
if(k
return -1;
else if(k>strlen(str))
return -2;
else if(k+m>strlen(str))
{
str[k-1]='\0';
return 1;
}
else
{
p=str+k-1;
q=str+k+m-1;
while(*q!='\0')
*p++=*q++;
return 1;
}
}
void main()
{
char str[81];
int k, m, state;
printf("请输入字符串:\n");
gets(str);
printf("请输入要删除的子串起始字符的序号和子串长度:\n");
scanf("%d%d", &k, &m);
state = delSubstr(str, k, m);
if(state
printf("要删除子串起始字符的序号或子串长度输入错误!\n");
else
printf("删除指定子串后的字符串为:%s\n", str);
}
4.定义一个函数delSpechar(),使用字符指针删除字符串中的所有指定字符(如把字符串“I love you!”中的o 字符删除,得到“I lve yu!”)。
#include
#include
void delSpechar(char *str, char ch)
{
char *p, *q;
p=str;
while(*p!='\0')
{
if(*p==ch)
{
q=p;
while(*q!='\0')
{
*q=*(q+1);
q++;
}
}
else
p++;
}
}
void main()
char str[81], ch;
printf("请输入一个字符串:");
gets(str);
printf("请输入要从字符串中删除的字符:");
ch = getchar();
delSpechar(str, ch);
printf("删除所有指定字符后的字符串为:%s\n", str);
}
5.求整型二维数组a[M][N]中的最大元素值及最大元素的位置(用指针法引用数组元素)。 #include
#define M 3
#define N 4
void max(int (*pa)[N], int *pRow, int *pCol)
{
int i, j;
for(i=0; i
for(j=0; j
if(pa[i][j]>pa[*pRow][*pCol])
{
*pRow = i;
*pCol = j;
}
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
int row=0, col=0;
max(a, &row, &col);
printf("二维数组中的最大元素值为a[%d][%d]=%d\n", row, col, a[row][col]);
}
6.已知字符串str[80],编写函数lstrchar(),实现在数组str 中查找字符ch 首次出现的位置,如果字符串中找不到该字符,则返回-1。
#include
#include
int lstrchar(char *str1, char ch1)
{
char *p,i=1;
p=str1;
while(*p!='\0')
{
if(*p==ch1)
break;
{
p++;
i++;
}
}
if(*p=='\0')
return -1;
else
return i;
}
void main()
{
char ch,str[80];
int poi;
printf("请输入字符串:");
gets(str);
printf("请输入待查找的字符:");
scanf("%c",&ch);
poi=lstrchar(str,ch);
if(poi==-1)
printf("字符串中不存在指定字符!\n");
else
printf("该字符在字符串中出现的第一个位置为%d\n", poi);
}
7.定义一个整型二维数组并初始化,编程求该数组所有元素的和。
要求:分别用数组下标法、一级指针法、二级指针法实现。
/*数组下标法*/
#include
#define M 3
#define N 4
int sum(int b[M][N])
{
int i, j, s=0;
for(i=0; i
for(j=0; j
s = s + b[i][j];
return s;
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
printf("二维数组中的所有元素之和为%d\n", sum(a));
}
/*一级指针法*/
#include
#define M 3
#define N 4
int sum(int *pa)
{
int i,s=0;
for(i=0;i
s=s+*pa++;
return s;
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
printf("二维数组中的所有元素之和为%d\n", sum(a[0]));
}
/*二级指针法*/
#include
#define M 3
#define N 4
int sum(int (*pa)[N])
{
int i,j,s=0;
for(i=0;i
{
for(j=0;j
s=s+(*pa)[j];
pa++;
}
return s;
}
void main()
{
int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};
printf("二维数组中的所有元素之和为%d\n", sum(a));
}
8.输入一行数字字符存入字符数组str[80]中,用num[10]中的数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,„„。输出每个奇数字符出现的次数。
#include
void count(char *str, int num[])
{
int i=0;
while(str[i]!='\0')
{
switch(str[i])
{
case '0': num[0]++; break;
case '1': num[1]++; break;
case '2': num[2]++; break;
case '3': num[3]++; break;
case '4': num[4]++; break;
case '5': num[5]++; break;
case '6': num[6]++; break;
case '7': num[7]++; break;
case '8': num[8]++; break;
case '9': num[9]++; break;
}
i++;
}
}
void main()
{
char str[80],*p=str;
int num[10]={0}, i;
printf("请输入一行数字字符:");
gets(p);
count(p,num);
for(i=1;i
printf("数字串中%d出现的次数为%d\n",i,num[i]);
}
9.在主函数中输入10个不等长字符串,用另一函数sort()对它们排序,然后在主函数中输出已排好序的字符串。要求:每个字符串长度均不超过30字符,用指针数组进行处理。 #include
#include
#define M 10
#define N 31
void sort(char *pstr[])
{
int i,j;
char *t;
for(i=0; i
{
for(j=0; j
if(strcmp(pstr[j],pstr[j+1])>0)
{
t = pstr[j];
pstr[j] = pstr[j+1];
pstr[j+1] = t;
}
}
}
void main()
{
char str[M][N], *pstr[M]={NULL};
int i;
printf("请输入10个字符串,每个字符串均不超过30个字符:\n");
for(i=0; i
{
gets(str[i]);
pstr[i]=str[i];
}
sort(pstr);
printf("排好序的字符串从小到大依次为:\n");
for(i=0; i
printf("%s\n", pstr[i]);
}
10.输入一个字符串,内有数字字符和非数字字符如123a345bcd567,将其中连续的数字作为一个整数,依次存放到整型数组a 中,例如,123放在a[0],345放在a[1]中,567放在a[2]中,„„,统计共有多少个整数,并输出这些整数。
#include
#include
void main()
{
char ch[1000],*p=ch;
int a[50],*q=a,num=0,i;
gets(ch);
for( ; *p!='\0'; p++)
if(*p>='0' && *p
{
*q=(*p)-'0';
p++;
while(*p>='0' && *p
*q=(*q)*10+(*(p++)-'0');
num+=1;
q+=1;
}
for(i=0,q=a; i
printf("%d ",*q);
printf("\n一共输入了%d个整数。\n",num); }