printf(“\n”);
}
}
问printf语句共执行了几次这段代码执行完以后i,j,k值为多少
&
4-9分析程序输出结果(假设输入1234,然后回车)
#include<>
intmain(void)
{
intc;
while((c=getchar())!
=‘\n’)
switch(c-‘2’)
{
(
case0:
case1:
putchar(c+4);
case2:
putchar(c+5);break;
case3:
putchar(c+3);
default:
putchar(c+2);break;
}
return0;
}
?
4-10分析程序的输出结果
#include<>
intmain(void)
{
intx=2,y,z;
x*=3+2;
printf("%d\n",x);
¥
x*=y=z=4;
printf("%d\n",x);
x=y==z;
printf("%d\n",x);
x==(y=z);
printf("%d\n",x);
return0;
}
-
4-11写一个程序用getchar接收一行字符,然后把这行字符分成各个单词,假定单词之间用一个或多个空格或tab键分开,起始字符也可以是空格或tab键。
示例:
输入字符串是:
IamaCMPE150student
则输出是:
I
am
a
CMPE
150
student
4-12有两个整数数组inta[5],b[7];数组元素从键盘输入,写一个程序累计a、b数组中总共有多个不同元素并输出。
例如:
a数组元素是{1,1,2,3,4}b数组元素是{1,1,5,3,4},则结果是a、b数组中总共有5个不同元素,分别是1,2,3,4,5
¥
第五章函数
5-1写出程序运行结果
#include<>
intf(inta,intb);
intmain(void)
{
printf("%d\n",f(3,4));
-
return0;
}
intf(inta,intb)
{
if(a==1||b==1)
return1;
returnf(a-1,b)+f(a,b-1);
}
…
5-2自己写一个函数求
,n为可正可负的整数,递归或非递归均可,要求不能使用库函数pow。
5-3写函数求两个正整数的最大公约数(分别用普通函数和递归函数)
5-4已知Ackerman函数如下:
!
写递归函数求akm(1,3),尝试akm(3,3),akm(4,3)
5-5写一个函数,判断三个数能否构成三角形的三条边。
写另外一个函数,根据三角形的三条边长求三角形的面积。
写一个程序测试这两个函数。
第六章习题
6-1写出程序运行结果
#include<>
intmain(void)
{
voidf(int);
f(4);
return0;
}
voidf(intn)
~
{
staticinta=1;
intb=1;
if(n>0)
{
b++;
printf("%d%d\n",++a,b);
f(n-1);
)
}
}
6-2写程序输出第五章例题hanoi塔的分析过程
/*示例输出过程见下(以n=2为例)*/
1:
2'X''Y''Z'
2:
1'X''Z''Y'
3:
0'X''Y''Z'
function3isover
.
4:
0'Z''X''Y'
function4isover
function2isover
5:
1'Y''X''Z'
6:
0'Y''Z''X'
function6isover
7:
0'X''Y''Z'
function7isover
-
function5isover
function1isover
输出格式1:
2‘X’‘Y’‘Z’(“:
”前数字表示函数第几次被调用,“:
”后表示函数各参数)。
比如缩进对齐表示被调用关系,比如第2次第5次函数都是被第一次函数调用,所以它们是对齐的,而且相对第一次要缩进若干字符。
第七章指针习题
7-1分析下列程序的输出结果
#include<>
…
intf1(int*x,int*y,intz);
intmain(void)
{
inta=3,b=4,c=5,d;
d=f1(&a,&b,c);
printf("%d%d%d%d\n",a,b,c,d);
return0;
}
》
intf1(int*x,int*y,intz)
{
*x=(*y)++;
return(--z);
}
7-2分析下列程序的输出结果.一维数组的指针表示法
#include<>
…
intmain(void)
{
inta[10],b[10],*pa,*pb,i;
pa=a;
pb=b;
for(i=0;i<5;i++,pa++,pb++)
{
*pa=i;
—
*pb=2*i;
printf("%d\t%d\n",*pa,*pb);
}
pa=&a[1];
pb=&b[1];
for(i=0;i<5;i++)
{
*pa+=i;
:
*pb+=2*(i+1);
printf("%d\t%d\n",*pa++,*pb++);
}
return0;
}
7-3分析下列程序的输出结果,强制指针转换
#include<>
…
intmain(void)
{
charc[3],*pc1,*pc2=c;
inti[4],*pi1,*pi2=i;
doubled[4],*pd1,*pd2=d;
pc1=pc2+1;
pi1=pi2+2;
pd1=pd2+3;
(
printf("%d%d%d\n",pc1-pc2,pi1-pi2,pd1-pd2);
printf("%d%d%d\n",(int)pc1-(int)pc2,
(int)pi1-(int)pi2,(int)pd1-(int)pd2);
return0;
}
7-4标准库函数modf原型如下:
#include<>
doublemodf(doublevalue,double*iptr);
学习该函数的功能并回答为什么iptr要是double*类型而不是int*,写一个小程序调用该函数。
7-5写一个函数返回double类型数组中最大数的下标,写一个小程序测试该函数。
7-6将习题4-12的功能改写成函数。
intntersection(intset1[],intsize1,intset2[],intsize2,int*result);
该函数求set1(大小size1)、set2(大小size2)两个数组中总共有所有不同元素的数目作为函数的返回值,并将这些元素存入result指向的空间中,result指向的空间应该使用malloc动态分配,动态分配的空间不能浪费(即不多不少)。
~
第八章字符串处理习题
8-1分析下列程序的输出结果
#include<>
intmain(void)
{
inta[]={0,1,2};
int*p=a,b;
,
char*q="abcde";
b=*++p;
printf("%d%d%d%d%d\n",a,*a,*(a+2),*(p+1),p[1]);
printf("%d%d%c%s%s\n",q,*q,q[3],q+3,q);
return0;
}
8-2写一个函数,该函数的功能是将一个字符串中的小写字母转换成大写字母。
@
8-3分析下列程序的输出结果,测试指针与数组的关系
#include<>
intmain(void)
{
staticchargood[]=“goodmorning!
”;/*一个空格*/
char*ch=&good[13];
while(--ch>=&good[0])
\
putchar(*ch);
putchar('\n');
return0;
}
8-4写一个验证密码(假定密码为abcde)的程序,由用户输入密码,可以有三次输入机会,只要输入正确,则程序结束,否则继续下一次尝试;如果满了三次,则输出”youarefailure!
”,程序结束。
下面是一个演示步骤:
enterpassword:
12<回车>
enterpassword:
34<回车>
)
enterpassword:
ac<回车>
youarefailure!
第九章数组及应用
9-1假定数组为inta[3][5];请问如下两条条语句将产生什么后果
a[4][2]=8;
a[1][7]=9;
。
9-2实现冒泡排序,从第一个元素开始,降序排列。
9-3约瑟夫斯问题.
有n个人手牵手排成一圈,顺时针从1到n编号后,从1号开始按顺时针报数,每到m时相应的人就出局,剩下的人从那个人的下一个开始重新开始报数,依此下去,问最后剩下的人是第几号用一维数组解决这个问题
9-4利用二维数组按如下格式输出十行杨辉三角形
1
11
;
121
1 331
14641
9-5假定sizeof(float)为4,则数组floata[6][5][3]
(1)数组第77个元素是哪一个
(2)若&a[0][0][0]为0x451A,问&a[3][2][1]是多少
;
9-6编程对二维数组各元素求和,要求用函数实现
9-7用二维数组编程求两个矩阵相乘
9-8(选做)从键盘依次读入“VISUAL C++”,“VISUALBASIC”,“C”,“PASCAL”,“FORTRAN”,“LISP”,用二维数组接收然后将其按降序输出。
9-9“6174”问题,任给一各位不全相等的四位数,各位按递增和递减分别组成两个四位数,大的减去小的得到一个四位数,再进行如上处理,总能得到6174(如果是3,则看成0003)如:
5423
[
5432-2345=3087
8730-378=8352
8532-2358=6174
试分别用循环和递归函数来验证这个结论.
9-10(较难,选做)将hanoi问题推广,初始状态每个圆盘可能在任何一个柱子上,只要没有大圆盘放在小圆盘的上面即可.编写一个递归函数解决这个问题.
!
第十章结构习题
10-1学习中标准库函数div的用法,写一个测试程序测试它的功能。
然后实现一个函数mydiv,功能和div一样。
10-2改写示例程序getSides函数,使之参数为结构而不是结构指针,有必要的话修改与之有关的部分.体会其中的区别.
10-3(选做)写一个程序,处理有理数的输入、输出、加减乘除运算。
有理数都可以表示为a/b形式,a、b均为整数且互质,必须保证运算后仍满足以上条件
<
10-4处理一个班的同学信息。
每位同学信息包括如下几项:
姓名、学号、生日、高数成绩、外语成绩、计算机成绩。
生日最好声明为一个结构.要求完成总成绩降序输出对应的姓名、学号、总成绩。
10-5分析下列程序的输出结果.测试结构变量和指向结构变量的指针的赋值及成员的表示.
#include<>
structabc{
inta;
floatb;
(
char*c;
};
intmain(void)
{
staticstructabcx={23,,"Wang"};
structabc*px=&x;
printf("%d%.1f%s\n",,,;
printf("%d%.1f%s\n",px->a,(*px).b,px->c);
'
printf("%c%s\n",*px->c+2,&px->c[1]);
return0;
}
10-6分析下列程序的输出结果。
测试指向结构变量的指针和字符指针的赋值.动态分配空间
#include<>
#include<>
#include<>
》
structstu{
char*name;
floatgrad;
}*p;
intmain(void)
{
structstua;
p=&a;
;
p->grad=;
p->name=(char*)malloc(20);
strcpy(p->name,"LiPing");
printf("%s%.2f\n",p->name,p->grad);
return0;
}
10-7设计一个日期类型,包含年、月、日的信息。
写一个函数nextday返回某日的下一天信息,原型如下:
structdatenext_day(structdatethisday);
10-9(选做,有难度)写一个函数,判断一个点是否在三角形内部,可利用已有的代码
第11章文件习题
11-1将4-100内哥德巴赫猜想验证结果写入一个文件
11-2输出一个文本文件,所有小写字母转换为大写
第12章预处理习题
12-1分析下列程序的输出结果
#include<>
#defineAB(a,b)2*(a)+2*(b)
intmain(void)
{
inta=3;
floatb=;
printf("%.2f\n",1/AB(a,b));
return0;
}
12-2分析下列程序的输出结果*/
文件内容如下:
#defineT1
#defineABCmain()\
{printf("hello!
%s\n",s);return0;}
文件内容如下
#include<>
#include""
#ifT
char*s="goodmorning!
";
ABC
#endif
12-3下面value值为多少
#defineDIV(a,b)a/b
intarg1=7,arg2=5;
floatvalue;
value=(float)(DIV(arg1*arg2,arg1-arg2)/2);