《C Primer Plus》第二章——C语言概述(程序示例与解释,提高程序可读性,函数的定义与使用,调试,关键字,复习题与编程练习)

第二章-C语言概述

本章内容

  • 运算符—— =;
  • 函数——main()、printf();
  • 编写一个简单的C程序;
  • 创建整型变量,为其赋值并在屏幕上显示其值;
  • 换行字符;
  • 如何在程序中写注释,创建包含多个函数的程序,发现程序的错误;
  • 什么是关键字。

简单的C程序示例

  • 通读程序试着解释,再认真阅读后面的解释
#include <stdio.h>
int main(void)                    /* 一个简单的C程序 */{int num;                     /* 定义一个名为num的变量 */
    num = 1;                     /* 为num赋一个值 */printf("I am a simple ");    /* 使用printf()函数 */printf("computer.\n");printf("My favorite number is %d because it is first.\n",num);return 0;}
  • 创建源代码文件,将代码拷贝到新建代码文件,编译运行。运行方法见上一章。

  • 输出结果:

    • I am a simple computer.
    • My favorite number is 1 because it is first.
  • 如果窗口一闪而过,在return语句前加入一行代码getchar();

示例解释

在这里插入图片描述

快速概要

  • 第一行:该行告诉编译器把stdio.h中的内容包含在当前程序中。stdio.h是C编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持。

  • 第二行:C程序包含一个或多个函数,它们是C程序的基本模块。程序清单2.1的程序中有一个名为main()的函数。圆括号表明main()是一个函数名。int表明main()函数返回一个整数,void表明main()不带任何参数。

  • 注释在/*和*/两个符号之间,这些注释能提高程序的可读性。注意,注释只是为了帮助读者理解程序,编译器会忽略它们。

  • 第三行:左花括号表示函数定义开始,右花括号表示函数定义结束。

  • 第四行:声明,将使用一个名为num的变量,且num是int类型(整数)

  • 第五行:把1赋给名为num的变量

  • 第六行:使用printf函数,在屏幕上显示I am a simple,光标停在同一行,printf是标准C库函数。程序中使用函数叫做调用函数

  • 第七行:再次调用printf函数,在上条语句后加上computer,\n表示另起一行

  • 第八行:表示把num的值内嵌在用双引号括起来的内容中并一起打印,%d表示以何种形式输出,以及打印在何处

  • 第九行:C函数可以给调用方返回一个数, 目前可以暂时看作结束main函数的要求

程序细节

  1. #include指令和头文件

    • #include <stdio.h>的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上,这是一种“拷贝-粘贴”的操作。include文件提供了一种方便的途径共享许多程序共有的信息。
    • 所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使用的输入和输出函数(如,printf())信息。该文件名的含义是标准输入/输出头文件。通常,在C程序顶部的信息集合被称为头文件(header)。
    • 头文件中可以定义一些常量,或者指明函数名以及如何使用它们。但是,函数的实际代码在一个预编译代码的库文件中。简而言之,头文件帮助编译器把你的程序正确地组合在一起。
    • #include中的#符号表明,C预处理器在编译器接手之前处理这条指令。
  2. main()函数

    • 第2行表明该函数名为main。的确,main是一个极其普通的名称,但是这是唯一的选择。C程序一定从main()函数开始执行(目前不必考虑例外的情况)。除了main()函数,你可以任意命名其他函数,而且main()函数必须是开始的函数。圆括号用于识别main()是一个函数。很快你将学到更多的函数。就目前而言,只需记住函数是C程序的基本模块。
    • int是main()函数的返回类型。这表明main()函数返回的值是整数。返回到哪里?返回给操作系统。我们将在第6章中再来探讨这个问题。
    • 通常,函数名后面的圆括号中包含一些传入函数的信息。该例中没有传递任何信息。因此,圆括号内是单词void.
    • 旧时C代码会用main ()开始,C90勉强接受,但是C99和C11不允许,所以不要这样写
    • void main()一些编译器允许这样写,但是所有标准都不认可这样的写法
  3. 注释

    • 在程序中,被/* */两个符号括起来的部分是程序的注释。写注释能让他人(包括自己)更容易明白你所写的程序。C语言注释的好处之一是,可将注释放在任意的地方,甚至是与要解释的内容在同一行。较长的注释可单独放一行或多行。在/*和*/之间的内容都会被编译器忽略。

    • C99新增了另一种风格的注释,普遍用于C++和Java。这种新风格使用//符号创建注释,仅限于单行。

    • /*单行注释*/
      /*
      多行注释
      多行注释
      */
      /*无效注释
      // 单行注释
      
      
  4. 花括号、函数体和块

    • 花括号把main()函数括起来。一般而言,所有的C函数都使用花括号标记函数体的开始和结束。这是规定,不能省略。
    • 花括号还可用于把函数中的多条语句合并为一个单元或块。
  5. 声明

    • C99和C11遵循C++的惯例,可以把声明放在块中的任何位置。首次使用变量之前一定要先声明它。

    • int main()  // 目前的C规则
      {// 一些语句
          int doors;
          doors = 5; // 第1次使用doors
      	// 其他语句
      	int dogs;
          dogs = 3; // 第1次使用dogs
      	// 其他语句
      }
      
    • 以前的C语言,还要求把变量声明在块的顶部,其他语句不能在任何声明的前面。

  6. 数据类型

    • C语言可以处理多种类型的数据,如整数、字符和浮点数。把变量声明为整型或字符类型,计算机才能正确地存储、读取和解释数据。
  7. 命名

    • 给变量命名时要使用有意义的变量名或标识符(如,程序中需要一个变量数羊,该变量名应该是sheep_count而不是x3)。如果变量名无法清楚地表达自身的用途,可在注释中进一步说明。这是一种良好的编程习惯和编程技巧。
    • C99和C11允许使用更长的标识符名,但是编译器只识别前63个字符。对于外部标识符,只允许使用31个字符。
    • 实际上,你可以使用更长的字符,但是编译器会忽略超出的字符。也就是说,如果有两个标识符名都有63个字符,只有一个字符不同,那么编译器会识别这是两个不同的名称。如果两个标识符都是64个字符,只有最后一个字符不同,那么编译器可能将其视为同一个名称,也可能不会。标准并未定义在这种情况下会发生什么。
    • 可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第1个字符必须是字母或下划线,不能是数字。
    • 操作系统和C库经常使用以一个或两个下划线字符开始的标识符(如,_kcab),因此最好避免在自己的程序中使用这种名称。
    • C语言的名称区分大小写,即把一个字母的大写和小写视为两个不同的字符。
  8. 赋值语句

    • num = 1
    • 程序清单中的这行代码是赋值表达式语句。赋值是C语言的基本操作之一。该行代码的意思是“把值1赋给变量num”。
    • 在执行int num;声明时,编译器在计算机内存中为变量num预留了空间,然后在执行这行赋值表达式语句时,把值存储在之前预留的位置。可以给num赋不同的值,这就是num之所以被称为变量的原因。
    • 注意,该赋值表达式语句从右侧把值赋到左侧。另外,该语句以分号结尾
  9. printf()函数

    • printf()。圆括号表明printf是一个函数名。圆括号中的内容是从main()函数传递给printf()函数的信息。例如,上面的第1行把I am a simple传递给printf()函数。该信息被称为参数,或者更确切地说,是函数的实际参数〔在C语言中,实际参数(简称实参)是传递给函数的特定值,形式参数(简称形参)是函数中用于存储值的变量。〕
    • printf()函数用参数来做什么?该函数会查看双引号中的内容,并将其打印在屏幕上。
    • 第1行printf()演示了在C语言中如何调用函数。只需输入函数名,把所需的参数填入圆括号即可。当程序运行到这一行时,控制权被转给已命名的函数(该例中是printf())。函数执行结束后,控制权被返回至主调函数(calling function),该例中是main()。
    • 第2行printf()函数的双引号中的\n字符并未输出。这是为什么?\n的意思是换行。\n组合(依次输入这两个字符)代表一个换行符(newline character)。对于printf()而言,它的意思是“在下一行的最左边开始新的一行”。也就是说,打印换行符的效果与在键盘按下Enter键相同。既然如此,为何不在键入printf()参数时直接使用Enter键?因为编辑器可能认为这是直接的命令,而不是存储在源代码中的指令。换句话说,如果直接按下Enter键,编辑器会退出当前行并开始新的一行。但是,换行符仅会影响程序输出的显示格式。
    • 换行符是一个转义序列(escape sequence)。转义序列用于代表难以表示或无法输入的字符。如,\t代表Tab键,\b代表Backspace键(退格键)。每个转义序列都以反斜杠字符(\)开始。我们在第3章中再来探讨相关内容。
    • 这样,就解释了为什么3行printf()语句只打印出两行:第1个printf()打印的内容中不含换行符,但是第2和第3个printf()中都有换行符。
    • %提醒程序,要在该处打印一个变量,d表明把变量作为十进制整数打印。printf()函数名中的f提醒用户,这是一种格式化打印函数。
  10. return语句

    • return语句是最后一条语句。int main(void)中的int表明main()函数应返回一个整数。C标准要求main()这样做。有返回值的C函数要有return语句。该语句以return关键字开始,后面是待返回的值,并以分号结尾。

简单程序的结构

  • 程序由一个或多个函数组成,必须有main()函数。函数由函数头和函数体组成。函数头包括函数名、传入该函数的信息类型和函数的返回类型。通过函数名后的圆括号可识别出函数,圆括号里可能为空,可能有参数。函数体被花括号括起来,由一系列语句、声明组成

  • 简而言之,一个简单的C程序的格式如下:

    #include <stdio.h>
    int main(void){
        // 语句   
        return 0;}
    // (大部分语句都以分号结尾。)
    

提高程序可读性的技巧

  • 选择有意义的函数名和写注释。
  • 注意,使用这两种技巧时应相得益彰,避免重复啰嗦。如果变量名是width,就不必写注释说明该变量表示宽度,但是如果变量名是video_routine_4,就要解释一下该变量名的含义。
  • 提高程序可读性的第3个技巧是:在函数中用空行分隔概念上的多个部分。
  • 提高程序可读性的第4个技巧是:每条语句各占一行。

进一步使用C

// fathm_ft.c -- 把2英寻转换成英尺
#include <stdio.h>
int main(void){
    int feet, fathoms;
    fathoms = 2;
    feet = 6 * fathoms;printf("There are %d feet in %d fathoms!\n", feet, fathoms);printf("Yes, I said %d feet!\n", 6 * fathoms);return 0;}

  • 程序说明:程序在开始处有一条注释(使用新的注释风格),给出了文件名和程序的目的。写这种程序说明很简单、不费时,而且在以后浏览或打印程序时很有帮助。
  • 程序在一条声明中声明了两个变量,而不是一个变量。为此,要在声明中用逗号隔开两个变量
  • feet = 6 * fathoms; 的意思是“查找变量fathoms的值,用6乘以该值,并把计算结果赋给变量feet。
  • 程序的第1个printf()中进行了两次替换。双引号后面的第1个变量(feet)替换了双引号中的第1个%d;双引号后面的第2个变量(fathoms)替换了双引号中的第2个%d。注意,待输出的变量列于双引号的后面。还要注意,变量之间要用逗号隔开。第2个printf()函数说明待打印的值不一定是变量,只要可求值得出合适类型值的项即可,如6 * fathoms。

多个函数

/* two_func.c -- 一个文件中包含两个函数 */#include <stdio.h>
void butler(void); /* ANSI/ISO C函数原型 */int main(void){printf("I will summon the butler function.\n");butler();printf("Yes. Bring me some tea and writeable DVDs.\n");return 0;}void butler(void) /* 函数定义开始 */{printf("You rang, sir?\n");}
// 该程序的输出如下:
// I will summon the butler function.
// You rang, sir?
// Yes. Bring me some tea and writeable DVDs.
  • 第1次是函数原型(prototype),告知编译器在程序中要使用该函数;第2次以函数调用(function call)的形式出现在main()中;最后一次出现在函数定义(function definition)中,函数定义即是函数本身的源代码。
  • 函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明
  • butler()函数原型中的第1个void表明,butler()函数没有返回值(通常,被调函数会向主调函数返回一个值,但是butler()函数没有)。第2个void(butler(void)中的void)的意思是butler()函数不带参数。
  • 在main()中调用butler()很简单,写出函数名和圆括号即可。当butler()执行完毕后,程序会继续执行main()中的下一条语句。
  • 程序的最后部分是butler()函数的定义,其形式和main()相同,都包含函数头和用花括号括起来的函数体。函数头重述了函数原型的信息:butler()不带任何参数,且没有返回值。如果使用老式编译器,请去掉圆括号中的void。
  • 何时执行butler()函数取决于它在main()中被调用的位置,而不是butler()的定义在文件中的位置。例如,把butler()函数的定义放在main()定义之前,不会改变程序的执行顺序,butler()函数仍然在两次printf()调用之间被调用。记住,无论main()在程序文件中处于什么位置,所有的C程序都从main()开始执行。但是,C的惯例是把main()放在开头,因为它提供了程序的基本框架。
  • C标准建议,要为程序中用到的所有函数提供函数原型。标准include文件(包含文件)为标准库函数提供了函数原型。例如,在C标准中,stdio.h文件包含了printf()的函数原型。

调试程序

现在,你可以编写一个简单的C程序,但是可能会犯一些简单的错误。程序的错误通常叫作bug,找出并修正错误的过程叫作调试

语法错误

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

  • /* nogood.c -- 有错误的程序 */#include <stdio.h>
    int main(void)(int n, int n2, int n3;/* 该程序有多处错误
         n = 5;
         n2 = n * n;
         n3 = n2 * n2;
         printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3)
         return 0;
    )
    
    
  • 其一,main()函数体使用圆括号来代替花括号。这就是把C符号用错了地方。

  • 其二,变量声明应该这样写:
    int n, n2, n3;
    或者,这样写:
    int n;
    int n2;
    int n3;

  • 其三,main()中的注释末尾漏掉了*/(另一种修改方案是,用//替换/*)。最后,printf()语句末尾漏掉了分号。

  • 如何发现程序的语法错误?首先,在编译之前,浏览源代码看是否能发现一些明显的错误。接下来,查看编译器是否发现错误,检查程序的语法错误是它的工作之一。在编译程序时,编译器发现错误会报告错误信息,指出每一处错误的性质和具体位置。

  • 编译器也有出错的时候。

  • 也许某处隐藏的语法错误会导致编译器误判。例如,由于nogood.c程序未正确声明n2和n3,会导致编译器在使用这些变量时发现更多问题。实际上,有时不用把编译器报告的所有错误逐一修正,仅修正第1条或前几处错误后,错误信息就会少很多。继续这样做,直到编译器不再报错。

  • 编译器另一个常见的毛病是,报错的位置比真正的错误位置滞后一行。例如,编译器在编译下一行时才会发现上一行缺少分号。因此,如果编译器报错某行缺少分号,请检查上一行

语义错误

  • 编译器无法检测语义错误,因为这类错误并未违反C语言的规则。编译器无法了解你的真正意图,所以你只能自己找出这些错误。

  • 假设你修正了程序的语法错误,程序应该如下所示:

/* stillbad.c -- 修复了语法错误的程序 */#include <stdio.h>
int main(void){int n, n2, n3;/* 该程序有一个语义错误 */
    n = 5;
    n2 = n * n;
    n3 = n2 * n2;printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3);return 0;}
// 该程序的输出如下:
// n = 5, n squared = 25, n cubed = 625
  • 如果对简单的立方比较熟悉,就会注意到625不对。下一步是跟踪程序的执行步骤,找出程序如何得出这个答案。对于本例,通过查看代码就会发现其中的错误,但是,还应该学习更系统的方法。方法之一是,把自己想象成计算机,跟着程序的步骤一步一步地执行。

在这里插入图片描述

  • main()函数体一开始就声明了3个变量:n、n2、n3。你可以画出3个盒子并把变量名写在盒子上来模拟这种情况。
  • 接下来,程序把5赋给变量n。你可以在标签为n的盒子里写上5。
  • 接着,程序把n和n相乘,并把乘积赋给n2。因此,查看标签为n的盒子,其值是5,5乘以5得25,于是把25放进标签为n2的盒子里。为了模拟下一条语句(n3 = n2 * n2),查看n2盒子,发现其值是25。25乘以25得625,把625放进标签为n3的盒子。
  • 原来如此!程序中计算的是n2的平方,不是用n2乘以n得到n的3次方。

程序状态

  • 定位语义错误的另一种方法是:在程序中的关键点插入额外的printf()语句,以监视指定变量值的变化。通过查看值的变化可以了解程序的执行情况。对程序的执行满意后,便可删除额外的printf()语句,然后重新编译。
  • 检测程序状态的第3种方法是使用调试器。调试器(debugger)是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。调试器有不同的使用难度和复杂度。较高级的调试器会显示正在执行的源代码行号。这在检查有多条执行路径的程序时很方便,因为很容易知道正在执行哪条路径。如果你的编译器自带调试器,现在可以花点时间学会怎么使用它。

关键字和保留标识符

  • 关键字是C语言的词汇。它们对C而言比较特殊,不能用它们作为标识符(如,变量名)。许多关键字用于指定不同的类型,如int。还有一些关键字(如,if)用于控制程序中语句的执行顺序。在表2.2中所列的C语言关键字中,粗体表示的是C90标准新增的关键字,斜体表示的C99标准新增的关键字,粗斜体表示的是C11标准新增的关键字。

  • 在这里插入图片描述

  • 还有一些保留标识符,C语言已经指定了它们的用途或保留它们的使用权,如果你使用这些标识符来表示其他意思会导致一些问题。因此,尽管它们也是有效的名称,不会引起语法错误,也不能随便使用。保留标识符包括那些以下划线字符开头的标识符和标准库函数名,如printf()。

关键概念

  • 编译器希望接收到特定格式的指令,我们在本章已经介绍过。作为程序员的任务是,在符合C标准的编译器框架中,表达你希望程序应该如何完成任务的想法。
  • 由于编译器不具有真正的智能,所以你必须用编译器能理解的术语表达你的意图,这些术语就是C语言标准规定的形式规则

本章小结

  • C程序由一个或多个C函数组成。每个C程序必须包含一个main()函数,这是C程序要调用的第1个函数。简单的函数由函数头和后面的一对花括号组成,花括号中是由声明、语句组成的函数体。
  • 在C语言中,大部分语句都以分号结尾。声明语句为变量指定变量名,并标识该变量中存储的数据类型。变量名是一种标识符。赋值表达式语句把值赋给变量,或者更一般地说,把值赋给存储空间。函数表达式语句用于调用指定的已命名函数。调用函数执行完毕后,程序会返回到函数调用后面的语句继续执行。
  • printf()函数用于输出想要表达的内容和变量的值。
  • 一门语言的语法是一套规则,用于管理语言中各有效语句组合在一起的方式。语句的语义是语句要表达的意思。编译器可以检测出语法错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。检查程序是否有语义错误要跟踪程序的状态,即检查程序每执行一步后所有变量的值。
  • 最后,关键字是C语言的词汇。

复习题

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

  2. 什么是语法错误?

  3. 什么是语义错误?

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

    include studio.h
    int main{void} /* 该程序打印一年有多少周 /*
        (
        int s
        s := 56;
        printf(There are s weeks in a year.);
        return 0;
        
    
  5. 假设下面的4个例子都是完整程序中的一部分,它们都输出什么结果?
    a. printf(“Baa Baa Black Sheep.”);
    printf(“Have you any wool?\n”);


    b. printf(“Begone!\nO creature of lard!\n”);

    c. printf(“What?\nNo/nfish?\n”);

    d. int num;
    num = 2;
    printf("%d + %d = %d", num, num, num + num);

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

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

  8. 考虑下面的程序:

    #include <stdio.h>
    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行后,程序的状态分别是什么?
    
  9. 考虑下面的程序:

    \#include <stdio.h>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行后,程序的状态分别是什么?
    

  1. 它们都叫作函数。

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

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

  4. 第1行:以一个#开始;studio.h应改成stdio.h;然后用一对尖括号把stdio.h括起来。
    第2行:把{}改成();注释末尾把/*改成*/。
    第3行:把(改成{
    第4行:int s末尾加上一个分号。
    第5行没问题。
    第6行:把:=改成=,赋值用=,而不是用:=。另外,用于赋值的值56也不对,一年有52周,不是56周。
    第7行应该是:printf(“There are %d weeks in a year.\n”, s);
    第9行:原程序中没有第9行,应该在该行加上一个右花括号}。
    修改后的程序如下:

    \#include <stdio.h>int main(void) /* this prints the number of weeks in a year */{
        int s;
        s = 52;printf("There are %d weeks in a year.\n", s);return 0;}
    
  5. a.Baa Baa Black Sheep.Have you any wool?(注意,Sheep.和Have之间没有空格)
    b.Begone!
    O creature of lard!
    c.What?
    No/nfish?
    (注意斜杠/和反斜杠\的效果不同,/只是一个普通的字符,原样打印)
    d.2+2 = 4
    (注意,每个%d与列表中的值相对应。还要注意,+的意思是加法,可以在printf()语句内部计算)

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

  7. printf(“There were %d words and %d lines.\n”, words, lines);

  8. 执行完第7行后,a是5,b是2。执行完第8行后,a和b都是5。执行完第9行后,a和b仍然是5(注意,a不会是2,因为在执行a = b;时,b的值已经被改为5)。

  9. 执行完第7行后,x是10,b是5。执行完第8行后,x是10,y是15。执行完第9行后,x是150,y是15。

编程练习

  1. 编写一个程序,调用一次printf()函数,把你的名和姓打印在一行。再调用一次printf()函数,把你的名和姓分别打印在两行。然后,再调用两次printf()函数,把你的名和姓打印在一行。

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

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

  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(),打印最后一条消息。

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

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

  3. 许多研究表明,微笑益处多多。编写一个程序,生成以下格式的输出:
    Smile!Smile!Smile!
    Smile!Smile!
    Smile!
    该程序要定义一个函数,该函数被调用一次打印一次“Smile!”,根据程序的需要使用该函数。

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


  1. /*
     * @Description: 编写一个程序,调用一次printf()函数,把你的名和姓打印在一行。
     * 再调用一次printf()函数,把你的名和姓分别打印在两行。
     * 然后,再调用两次printf()函数,把你的名和姓打印在一行。
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 08:34:25
     */
    
    #include <stdio.h>
    int main(void)
    {
        printf("Jian Shengnan\n");
        printf("Jian \nShengnan\n");
        printf("Jian ");
        printf("Shengnan\n");
        return 0;
    }
    
  2. /*
     * @Description: 编写一个程序,打印你的姓名和地址。
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 08:36:54
     */
    
    #include <stdio.h>
    int main(void)
    {
        printf("My name is Jian Shengnan\n");
        printf("My address is Nangong\n");
        return 0;
    }
    
  3. /*
     * @Description: 编写一个程序把你的年龄转换成天数,并显示这两个值。这里不用考虑闰年的问题。
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 08:54:54
     */
    
    // 按照提议不是计算出生的准确天数,而且不考虑闰年。则这是一个简单的计算问题。
    #include <stdio.h>
    int main(void)
    {
        int age, days;
        printf("请输入您的年龄:");
        // 这里用到了标准输入函数,还没有讲到,可以用直接给age变量赋值代替
        scanf("%d", &age);
        days = age * 365;
        printf("您的年龄是:%d,共%d天", age, days);
        return 0;
    }
    
  4. /*
     * @Description: 编写一个程序,生成以下输出: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(),打印最后一条消息。
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 09:02:47
     */
    
    #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");
        return;
    }
    void deny(void)
    {
        printf("Which nobody can deny!\n");
        return;
    }
    
  5. /*
     * @Description: 编写一个程序,生成以下输出:
     * Brazil, Russia, India, China
     * India, China
     * Brazil, Russia
     * 除了main()以外,该程序还要调用两个自定义函数:一个名为br(),调用一次打印一次“Brazil, Russia”;
     * 另一个名为ic(),调用一次打印一次“India, China”。其他内容在main()函数中完成。
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 09:06:57
     */
    
    #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");
        return;
    }
    void ic(void)
    {
        printf("India, China");
        return;
    }
    
  6. /*
     * @Description: 编写一个程序,创建一个整型变量toes,并将toes设置为10。
     * 程序中还要计算toes的两倍和toes的平方。该程序应打印3个值,并分别描述以示区分。
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 09:09:51
     */
    
    #include <stdio.h>
    int main(void)
    {
        int toes = 10;
        printf("%d的平方是:%d,%d的立方是:%d", toes, toes * toes, toes, toes * toes * toes);
        return 0;
    }
    
  7. /*
     * @Description: 许多研究表明,微笑益处多多。编写一个程序,生成以下格式的输出:
     * Smile!Smile!Smile!
     * Smile!Smile!
     * Smile!
     * 该程序要定义一个函数,该函数被调用一次打印一次“Smile!”,根据程序的需要使用该函数。
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 09:12:45
     */
    
    #include <stdio.h>
    void printSmile(void);
    int main(void)
    {
        printSmile();
        printSmile();
        printSmile();
    
        printf("\n");
    
        printSmile();
        printSmile();
    
        printf("\n");
    
        printSmile();
        return 0;
    }
    void printSmile(void)
    {
        printf("Smile!");
    }
    
  8. /*
     * @Description: 在C语言中,函数可以调用另一个函数。
     * 编写一个程序,调用一个名为one_three()的函数。该函数在一行打印单词“one”,再调用第2个函数two(),然后在另一行打印单词“three”。
     * two()函数在一行显示单词“two”。
     * main()函数在调用one_three()函数前要打印短语“starting now:”,并在调用完毕后显示短语“done!”。因此,该程序的输出应如下所示:
     * starting now:
     * one
     * two
     * three
     * done!
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 09:17:28
     */
    
    #include <stdio.h>
    void one_three(void);
    void two(void);
    int main(void)
    {
        printf("starting now:\n");
    
        one_three();
    
        printf("done!");
        return 0;
    }
    void one_three(void)
    {
        printf("one\n");
        two();
        printf("three\n");
    }
    void two(void)
    {
        printf("two\n");
    }
     * two()函数在一行显示单词“two”。
     * main()函数在调用one_three()函数前要打印短语“starting now:”,并在调用完毕后显示短语“done!”。因此,该程序的输出应如下所示:
     * starting now:
     * one
     * two
     * three
     * done!
     * @version: 1.0
     * @Author: JSN
     * @Date: 2021-02-16 08:31:32
     * @LastEditors: Please set LastEditors
     * @LastEditTime: 2021-02-16 09:17:28
     */
    
    #include <stdio.h>
    void one_three(void);
    void two(void);
    int main(void)
    {
        printf("starting now:\n");
    
        one_three();
    
        printf("done!");
        return 0;
    }
    void one_three(void)
    {
        printf("one\n");
        two();
        printf("three\n");
    }
    void two(void)
    {
        printf("two\n");
    }
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian圣楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值