C Primer Plus 第02章 C语言概述 学习笔记及复习题、编程题解答

网友投稿 819 2022-05-29

第二章 C语言概述

1. 解析第一个C程序

一个基本的程序结构包含如下部分:

#include // 包含另一个文件,C编译器软件包的标准部分,提供键盘输入和屏幕输出的支持。 /**#include 指令和头文件 * 是一条C预处理器指令(preprocessor directive),C编译器在编译前会对源代码做一些准备,即预处理(preprocessing)。 * * stdio.h 文件的含义是标准输入/输出头文件。通常,在C程序顶部的信息集合被称为头文件(header)。 */ int main(void) /*一个简单的C程序*/ /** main()函数 * C程序一定要从main()函数开始执行,除了main()函数,可以任意命名其他函数。圆括号是用于识别main()是一个函数。 */ { /** 花括号、函数体和块 * { * ... * } * * 所有的C函数都使用花括号标记函数体的开始和结束。 * 不能省略 */ int num; /**声明一个名为num的变量,int是C语言的一个关键字(keyword),表示一种基本的C语言数据类型, * num是一个标识符(identifier),也就是一个变量、函数或其他实体的名称。 * */ num = 7; /*为num赋一个值*/ printf("I'm a simple "); /*使用printf()函数*/ printf("Computer .\n"); printf("My favorite number is %d . \n",num); /*换行符是一个转义序列,转义序列用于代码难以表示或无法输入的字符,如 \t 代表 Tab键*/ return 0; } //结束

程序由一个或多个函数组成,必须有main() 函数。

函数由 函数头 和 函数体 组成。

函数头包含函数名、传入函数的信息类型和函数的返回类型。

函数体被花括号括起来,由一系列语句、声明组成。

2. 提高程序可读性的技巧

使用有意义的变量名和函数名

使用注释(模块太大时备注说明)

在函数中用空行分隔概念上的多个部分。

每条语句各占一行

分行易读,配合分号,可以更好确定语句开始和结束。

3. 调试程序

Bug:程序的错误

调试(Debug):找出并修正程序错误的过程。

不遵循C语言的规则,把有效的C符号放在正确的位置。

一般使用 编译器(gcc) 时会报错,一般情况下,报错的位置比实际错误位置要滞后一行。

编译器检测不到语义错误,因为这类错误未违反C语言的规则。

C Primer Plus 第02章 C语言概述 学习笔记及复习题、编程题解答

遵循C规则,但结果不正确的错误属于语义错误。

程序状态:在程序的执行过程中,某给定点上所有变量值的集合。

跟踪程序状态的3个方法

自己模拟计算机逐步执行程序。

小部分程序实用,大型程序不适合。

在程序中的关键点插入额外的printf() 语句,以监视制定变量值的变化。

使用调试器

Linux环境中,C和C++一般使用GDB调试器。

4. 关键字和保留标识符

关键字由于特殊的含义,故不能用作标识符。

如果使用关键字不当(如,关键字用作变量名),编译器会将其视为语法错误。

保留标识符包括以下划线字符开头的标识符和标准库函数名,如printf() 。

5. 复习题

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

基本模块和用户自定义模块的都称为函数。

2.什么是语法错误和语义错误?

语法错误:违反组成语句或程序的语法规则。例:printf "hello world";

语义错误:含义错误。例:n3 = n2*n

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

#include stdio.h int main(void) ( int s s:=56; printf(There are s weeks in a year.); return 0;

程序错误是无法正常运行的。正确的修改如下:

#include int main(void) { int s; s = 56; // 变量赋值方式不正确 printf("There are %d weeks int a year.",s); return 0; }

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

a. printf("Baa Baa Black Sheep."); /*输出结果为:Baa Baa Black Sheep.Have you any wool?*/ printf("Have you any wool?\n"); b. printf("Begone!\nO creature of lard!\n"); /*输出结果为:Begone!此处换行 O creature of lard!*/ c. printf("What?\nNo/nfish?\n"); /*输出结果为:What? 此处换行 No/nfish?*/ d. int num; num = 2; printf("%d + %d = %d",num,num,num+num); /*输出结果为:2 + 2 = 4*/

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

关键字为:main、int char。

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

There were 3020 words and 350 lines

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

考虑下面的程序

#include int main(void) { int a,b; a = 5; b = 2; /*第 7 行*/ b = a; /*第 8 行*/ a = b; /*第 9 行*/ printf("%d %d \n",b,a); return 0; }

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

执行完第7行,a = 5,b = 2;

执行完第8行,a = 5,b = 5

执行完第9行,a = 5,b = 5

考虑下面的程序

#include int main(void) { int x,y; x = 10; y = 5; /*第 7 行*/ y = x + y; /*第 8 行*/ x = x * y; /*第 9 行*/ printf("%d %d \n",x,y); return 0; }

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

执行第7行后,x = 10,y = 5

执行第8行后,x = 10,y = 15

执行第9行后,x = 150,y = 15

6. 编程练习题

编写一个程序,调用一次printf()函数,把你的姓名打印在一行,再调用一次printf()函数,把你的姓名打印在两行。然后,再调用两次printf()函数,把你的姓名打印在一行。打印形式如下:

Soler HO 第一次的内容

Soler 第二次打印

HO 第三次打印

Soler HO 第三次 和第四次 打印

#include int main(void) { printf("my name is : Soler HO\n");/*第一次打印内容*/ printf("my first name is : Soler \n");/*第二次打印 ---- 名字*/ printf("my last name is : HO \n"); /*第三次打印 ---- 姓*/ printf("total name is : Soler HO \n"); /*第三次和第四次打印*/ return 0; }

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

#include int main(void) { char name[] = "Soler HO"; char address[] = "Shanghai"; printf("my name is %s , Address is %s .\n",name,address); return 0; }

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

/*编写一个程序,把你的年龄转换成天数,并显示这两个值,不用考虑闰年的问题*/ #include int main(void) { int age,days; int oneYear = 365; /*此处默认一年为365天*/ printf("please input your age : \n"); scanf("%d",&age); days = age * oneYear; printf("you live %d days\n",days); return 0; }

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

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 void jolly(void); void deny(void); int main(void) { for(int i=1;i<=3;i++) jolly(); deny(); } void jolly(void) { printf("For He's a jolly good fellow!\n"); } void deny(void) { printf("which nobody can deny!\n"); }

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

Brazil, Russia, India, China India, China, Brazil, Russia

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

/*编程练习题05*/ #include 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"); }

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

#include int main(void) { int toes = 10; int twotimes = 2 * toes; int square = toes * toes; printf("origin toes is %d \n",toes); printf("double toes is %d \n",twotimes); printf("square toes is %d \n",square); return 0; }

编写一个程序,生成以下格式的输出:

Smile!Smile!Smile! Smile!Smile! Smile!

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

#include void smile(void); int main(void) { /*具体优化后续重新优化*/ for(int i = 3;i>=1;i--) smile(); printf("\n"); for(int i = 1;i<3;i++) smile(); printf("\n"); smile(); printf("\n"); return 0; } void smile(void) { printf("Smile!"); }

在C语言中,函数可以调用另一个函数。编写一个程序,调用一个名为one_three()的函数。

该函数在一行打印单词"one",再调用第2个函数two(),然后在另一行打印单词“three”。

two()函数在一行显示单词“two”。main()函数在调用one_three()函数前要打印短语“starting now:”,

并在调用完毕后显示短语“done!”。因此,该程序的输出应如下所示:

starting now: one two three done!

#include 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) { printf("one \n"); two(); } void two(void) { printf("two\n"); printf("three\n"); }

C 语言 数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MongoDB快速入门之常用命令
下一篇:你真的会给变量命名吗
相关文章