《C Primer Plus》中文版第二章习题

2.11 复习题

1. C语言的基本模块是什么?

它们都叫作函数。C语言包含一个或多个函数,它们是C语言的基本模块。

2. 什么是语法错误?写出一个英语例子和C语言例子。

语法错误违反了组成语句或程序的规则。这是一个有语法错误的英文例子:Me speak English good.。这是一个有语法错误的C语言例子:printf”Where are the parentheses?”);

如果不遵循C语言的规则就会犯语法错误。

这类似于英文中的语法错误。例如,看看这个例子:Bugs frustrate be can。该句子中的英文单词都是有效的单词(即,拼写正确)。但是并未按照正确的顺序组织句子,而且用词也不妥。

C语言的语法错误指的是,把有效的C符号放在错误的地方。其一,main()函数体使用圆括号来替换花括号。

3.  什么是语义错误?写出一个英语例子和C语言例子。

语义错误是指含义错误。这是一个有语义错误的英文例子:This sentence is excellent Czech。这是一个有语义错误的C语言例子:thrice_n = 3 + n * n;

语义错误是指意思上的错误。

例如,考虑这个句子:Scornful derivatives sing greenly(轻蔑的衍生物不熟练地唱歌)。句中的形容词、名词、动词和副词都在正确的位置上,所以语法正确。但是,却让人不知所云。

在C语言中,如果遵循了C规则,但是结果不正确,那就是犯了语义错误。程序示例中有这样的错误:n3 = n2 * n2;此处,n3原意表示n的3次方,但是代码中的n3被设置成n的4次方(n2 = n* n)。

4. Indiana Sloth编写了下面的程序,并征求你的意见,请帮助他评定。

第1行:以一个#开始:studio.h应改成stdio.h;然后用一对尖括号把stdio.h括起来。

第2行:把{}改成();注释末尾把/*改成*/

第3行:把(改成{

第4行:int s末尾加上一个分号

第5行没问题。

第6行:把:=改成=,赋值用=,而不是用:=(这说明Indiana Sloth了解Pascal)。另外,用于赋值的值56也不对,一年有52周,而不是56周。

第7行应该是:printf(“There are %d weeks in a year”,s);

第9行:原程序中没有第9行,应该在该行加上一个右花括号。

#include <stdio.h>

int main(void)
{
	int s;
	s = 52;
	printf("There are %d weeks in a year.",s);
	return 0;
}

5. 假设下面的4个例子都是完整程序中的一部分,它们都输出什么结果?

#include<stdio.h>
void printfA();
void printfB();
void printfC();
void printfD();
int main(void)
{
	printf("a: ");
	printfA();
	printf("b: ");
	printfB();
	printf("c: ");
	printfC();
	printf("d: ");
	printfD();
	return 0;
}
void printfA()
{
	printf("Baa Baa Black Sleep.");
	printf("Have you any wool?\n");
}
void printfB()
{
	printf("Begone!\nO creature of lard!\n");
}
void printfC()
{
	printf("What?\nNo/nfish?\n");
}
void printfD()
{
	int num;
	num = 2;
	printf("%d + %d = %d",num, num, num + num);
}

输出结果:

6. 在main、int 、function、char、=中,哪些是C语言的关键字?

关键字是int和char(main是一个函数名;function是函数的意思;=是一个运算符)。

7. 如何以下面的格式输出变量words和lines的值(这里,3020和350代表两个变量的值)?

#include <stdio.h>
int main(void)
{
	int words = 3020;
	int lines = 350;
	printf("There were %d words and %d lines.\n", words, lines);
	return 0;
}

8. 考虑下面的程序:

请问在执行完第7、第8、第9行后,程序的状态分别是什么?

#include <stdio.h>
void printfStatus(int a, int b);
int main(void)
{
	int a, b;
	a = 5;
	b = 2;	/*第7行*/
	printfStatus(a,b);
	b = a;	/*第8行*/
	printfStatus(a,b);
	a = b;	/*第9行*/
	printfStatus(a,b);
	printf("%d %d\n",a,b);
	return 0;
} 
void printfStatus(int a, int b)
{
	printf("After operation : a = %d , b = %d\n", a,  b);
}

输出结果:

9. 考虑下面的程序:

请问,在执行完第7、第8、第9行后,程序的状态分别是什么?

#include <stdio.h>
void printfStatus(int x, int y);
int main(void)
{
	int x, y;
	x = 10;
	y = 5;		/*第7行*/
	printfStatus(x,y);
	y = x + y;	/*第8行*/
	printfStatus(x,y);
	x = x * y;	/*第9行*/
	printfStatus(x,y);
	printf("%d %d\n", x, y);
	return 0;
}
void printfStatus(int x, int y)
{
	printf("After operation : x = %d , y = %d\n", x, y);
}

输出结果:

2.12 编程练习

1. 编写一个程序,调用一次printf()函数,把你的名和姓打印在一行。再次调用一次printf()函数,把你的名和姓分别打印在两行。然后,再调用两次printf()函数,把你的名和姓打印再一行。输出应如下所示(当然要把示例的内容换成你的名字):

Gustav Mahler        //第1次打印的内容

Gustav                    //第2次打印的内容

Mahler                    //第2次打印的内容

Gustav Mahler        //第3次和第4次打印的内容

#include <stdio.h>
#define NAME "Mahler"
#define SUBNAME "Gustav"
int main(void)
{
	printf("%s %s\n",NAME, SUBNAME);
	printf("%s\n%s\n", NAME, SUBNAME);
	printf("%s ",NAME);
	printf("%s\n",SUBNAME);
	return 0;
}

2. 编写一个程序,打印你的姓名和地址。

#include <stdio.h>
#define NAME "Gustav Mahler"
#define ADDRESS "China"
int main(void)
{
	printf("%s\n",NAME);
	printf("%s\n",ADDRESS);
	return 0;
}

3. 编写一个程序把你的年龄换成天数,并显示这两个值。这里不用考虑闰年的问题。

#include <stdio.h>
#define DAYS_PER_YEAR 365
int main(void)
{
	int age, days;
	age = 31;
	days = age * DAYS_PER_YEAR;
	printf("your age is %d, borned days is %d\n",age, days);
	return 0;
}

4. 编写一个程序,生成以下输出:

For he's a jolly good fellow!

For he's a jolly good fellow!

For he's a jolly good fellow!

Which nobody can deny!

除了main()函数以外,该程序还要调用两个自定义函数:一个名为jolly(),用于打印前3条消息,调用一次打印一条;另一个函数名为deny(),打印最后一条消息。

#include <stdio.h>
void jolly();
void deny();
int main(void)
{
	jolly();
	jolly();
	jolly();
	deny();
	return 0;
}
void jolly()
{
	printf("For he's a jolly good fellow!\n");
}
void deny()
{
	printf("Which nobody can deny!\n");
}

5. 编写一个程序,生成以下输出:

Brazil, Russia, India, China

India, China,

Brazil, Russia

除了main()以外,该程序还要调用两个自定义函数:一个名为br(),调用一次打印一次“Brazil, Russia";另一个名为ic(),调用一次打印一次"India, China"。其他内容在main()函数中完成。

#include <stdio.h>
void br();
void ic();
int main(void)
{
	br();
	printf(", ");
	ic();
	printf("\n");
	ic();
	printf(", \n");
	br();
	printf("\n");
	return 0;
}
void br()
{
	printf("Brazil, Russia");
}
void ic()
{
	printf("India, China");
}

6. 编写一个程序,创建一个整形变量toes,并将toes设置为10。程序中还要计算toes的两倍和toes的平方。该程序应打印3个值,并分别描述以示区分。

#include <stdio.h>
int main(void)
{
	int toes = 10;
	printf("Variable toes = %d\n",toes);
	printf("Double toes = %d\n",toes * 2);
	printf("Square toes = %d\n",toes * toes);
	return 0;
}

7. 许多研究表明,微笑益处多多。编写一个程序,生成以下格式的输出:

Smile!Smile!Smile!

Smile!Smile!

Smile!

该程序要定义一个函数,该函数被调用一次打印一次"Smile!",根据程序的要求使用该函数。

#include <stdio.h>
void smile();
int main(void)
{
	smile(); smile(); smile();
	printf("\n");
	smile(); smile();
	printf("\n");
	smile();
	printf("\n");
	return 0;
}
void smile()
{
	printf("Smile!");
}

8. 在C语言中,函数可以调用另一个函数。编写一个程序,调用一个名为one_three()的函数。该函数在一行打印单词”one",再调用第2个函数two(),然后在另一行打印单词"three"。two()函数在一行显示单词“two"。main()函数在调用one_three()函数前要打印短语"starting now:",并在调用完毕后显示短语”done!“。因此,该程序的输出应如下所示:

starting now:

one

two

three

done!

#include <stdio.h>
void one_three();
void two();
int main(void)
{
	printf("starting now:\n");
	one_three();
	printf("done!\n");
	return 0;
}
void one_three()
{
	printf("one\n");
	two();
	printf("three\n");
}
void two()
{
	printf("two\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值