编程练习
(C primer plus第二章2.12)
1.编写一个程序,调用一次printf()函数,把你的姓和名打印在一行。再调用一次printf()函数,把你的名和姓分别打印在两行。然后,再调用两次printf()函数,把你的名和姓打印在一行。
输出应如下所示
Gustav Mahler <-第一次打印的内容 Gustav <-第二次打印的内容 Mahler <-仍是第2次打印的内容 Gustav Mahler <-第3次和第4次打印的内容
讯享网
我的答案
讯享网#include<stdio.h> int main(void) {
printf("Pang hu\n"); printf("Pang\nhu\n"); printf("Pang"); printf("hu"); //这里忘记了写ruturn 0; }
书的答案
#include<stdio.h> #define NAME "Gustav" #define SURNAME "Mahler" /* 可以自定义自己的名和姓 */ int main(void) {
printf("%s %s\n",NAME,SURNAME); printf("%s\n%s\n",NAME,SURNAME); printf("%s",NAME); printf("%s\n",SURNAME); return 0; }
心得体会
书的答案运用了C预处理器,代码的可移植性大大提高,名和姓作为符号常量名简洁明了。
2.编写一个程序,打印你的姓名和地址。
我的答案
讯享网#include<stdio.h> int main(void) {
printf("Name:Panghu\nGPS:JAPAN\n"); return 0; }
书的答案
#include<stdio.h> #define NAME "Stephen Prata" #define ADDRESS "No.11 Chengshou Street, Fengtai District, Beijing" /* 姓名、地址分别用预编译指令定义 */ int main(void) {
printf("%s\n",NAME); //打印姓名 printf("%s\n",ADDRESS); //打印地址 return 0; }
心得体会
和第一题类似,同样使用了C预处理器,移植性和可读性大大加强。
3.编写一个程序把你的年龄转换成天数,并显示这两个值。这里不用考虑闰年的问题。
我的答案
讯享网#include<stdio.h> int main(void) {
int age; age = 20; printf("Your age is %d,It are %d days\n",age , age * 365); return 0; }
书的答案
#include<stdio.h> #define DAYS_PER_YEAR 365 /* 利用预编译指令指定一年的天数*/ int main() {
int age,days; age = 31; /* 假设有31岁,后面将31岁转换成天数*/ days = age * DAYS_PER_YEAR; printf("You are is %d, and It is %d days.\n",age,days); return 0; }
心得体会
和前两个一样,也是使用了C预处理器,并且把days也作为了变量,可读性加强。
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); void deny(void); int main(void) {
jolly(); jolly(); jolly(); deny(); return 0; } void jolly(void) {
printf("For he's a jolly good fellow!\n"); } void deny(void) {
printf("Which nobody can deny!\n"); }
书的答案
讯享网#include<stdio.h> int jolly(void); int deny(void); /*函数声明*/ int main(void) {
jolly(); jolly(); jolly(); deny(); /*函数调用*/ return 0; } int jolly(void){
/*函数定义*/ printf("For he's a jolly good fellow!\n"); return 0; } int deny(void){
/*函数定义*/ printf("Which nobody can deny!\n"); return 0; }
心得体会
书上使用整形定义,因此需要返回值。而我使用void 定义 因此不需要返回值。
注意,int jolly(void);中第一个void的含义是jolly()函数没有返回值,第二个void(即括号中的)void的含义是jolly()函数不带参数!
5.编写一个程序,生成以下输出:
Brazil, Russia, India, China India, China Brazil, Russia
除了main()以外,该程序还要调用两个自定义函数:一个名为br(),调用一次打印一次“Brzail, Russia”;另一个明为ic(),调用一次打印一次“India, China”。其他内容在main()函数中完成。
我的答案
讯享网#include<stdio.h> void br(void); void ic(void); int main(void) {
br(); printf(","); ic(); printf("\n"); ic(); printf("\n"); br(); printf("\n"); return 0; } void br(void) {
printf("Brazil,Russia"); } void ic(void) {
printf("India,China"); }
书的答案
#include<stdio.h> int br(void); int ic(void); /* 函数声明 */ int main(void){
br(); /* 函数调用 */ printf(", "); ic(); printf("\n"); ic(); printf(", \n"); br(); printf("\n"); return 0; } int br(void){
/* 函数定义 */ printf("Brazil, Russia"); return 0; } int ic(void){
/* 函数定义 */ printf("India, China"); return 0; }
心得体会
和第四题一样,在函数原型中我用的是void来声明。但是我的函数声明不严谨,忘记了Russia前面的空格!
6.编写一个程序,创建一个整形变量tose,并将tose设置为10。程序中还要计算tose的两倍和tose的平方。该程序应打印3个值,并分别描述以示区别。
我的答案
讯享网#include<stdio.h> int tose; int main(void) {
//int tose //这里也可以定义tose tose = 10; //tose = 10l; 赋值表达式语句要放在函数里面 printf("tose:%d,2tose:%d,tose2:%d",tose, 2 * tose,tose * tose); return 0; }
书的答案
#include<stdio.h> int main(void){
int toes; toes = 10; /* 定义整形变量toes,并初始化为10 */ printf("The Variable toes = %d.\n",toes); printf("double toes = %d.\n",2*toes); /*计算并打印toes的两倍,也可以先计算再打印,例如, * int d_toes = 2*toes; * printf("double toes = %d.\n",d_toes); * 但最好不要写成: * toes = 2*toes; * 这样会修改toes的值,并影响到toes的平方的计算 * */ printf("toes' square = %d.\n",toes*toes); /*计算并打印toes的平方 / return 0; }
心得体会
书上的输出显示工整且代码简洁明了。声明可以放在函数体里。
7.许多研究表明,微笑益处多多。编写一个程序,生成以下格式的输出。
讯享网Smile!Smile!Smile! Smile!Smile! Smile!
该程序要定义一个函数,调用该函数一次打印一次“Smile!”,根据程序的需要使用该函数。
我的答案
#include<stdio.h> void smile(void); //这里不要把分号丢了! int main(void) {
smile(); smile(); smile(); printf("\n"); smile(); smile(); printf("\n"); smile(); printf("\n"); return 0; } void smile(void) {
printf("Smile!"); }
书的答案
讯享网int smile(void); #include<stdio.h> int main(void){
smile();smile();smile(); printf("\n"); /* 打印第1行, 3个"Smile!"*/ smile();smile(); printf("\n"); /* 打印第2行, 2个"Smile!"*/ smile(); /* 打印第3行, 1个"Smile!"*/ return 0; } int smile(void){
printf("Smile!"); return 0; }
心得体会
通过书上的答案可以知道
函数声明可以放在C预处理器指令前面,也就是说头文件指令的顺序可以改变,不一定非要习惯性端一上来就写一个#include<stdio.h>
头文件的含义是:C程序顶部的信息集合
书上的答案中代码的格式 就是输出打印时显示的格式,一目了然,加大了程序的可读性。且注释也恰到好处。
8.在C语言中,一个函数可以调用另一个函数。编写一个程序,用于调用一个名为one_three()函数,该函数在一行打印“One”,再调用另一个函数two(),然后在另一行打印单词“three”。two()函数在一行显示单词“two”。main()函数在调用one_three()函数前要打印短语“Staring now:”,并在调用完毕后显示短语“Done!”。因此,该程序的输出应如下所示。
Starting now: one two three Done!
我的答案
讯享网#include<stdio.h> void one_three(void); void two(void); int main(void) {
printf("starting now:\n"); one_three(); printf("done!\n"); return 0; } void one_three(void) //关键是把two函数包含在了one_three函数里面 {
printf("one\n"); two(); printf("\n"); printf("three\n"); } void two(void) {
printf("two"); }
书的答案
#include<stdio.h> int one_three(void); int two(void); /*两个函数声明*/ int main(void){
printf("Starting now:\n"); one_three(); printf("Done!\n"); return 0; } int one_three(void){
printf("one\n"); two(); /* 调用two()函数*/ printf("three\n"); return 0; } int two(void){
printf("two\n"); return 0; }
心得体会
除main()函数之外,程序内还有两个函数——one_three()和two()。two()函数只打印单词“two”,one_three()函数内通过调用two()函数,打印one、two、three这3个单词。所以关键是把two函数包含在了one_three函数里面。用one_three()函数调用two()函数。
总结
纸上得来终觉浅,绝知此事要躬行。应该多敲多练习才能发现自身问题所在以及忽略了的地方,将学习的东西内化了。
答案中的程序体第一个花括号写在函数体后面,这样看起来更加舒服,当函数多了以后也可以一目了然,知道是函数体开始了。
应该添加必要的注释,既可以做分隔作用又可以方便他人和自己以后解读代码。
有很多地方不练之前都忽视了,敲得时候才发现问题所在,例如printf("%d",XXX) 不能忘记敲那个逗号“,”
以及预编译指令不需要用分号 “;” 作为结束
本来刚开始看了两三遍还感觉有的地方比较模糊,但是经过练习和答案对比以后,对于前两章的整体框架和流程都有了大大的提高和认识,仿佛像武侠小说中的内功一样,融入贯通到了血液肌肉中,有了新的理解。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/36944.html