备战计算机二级 C 语言知识点(一)

目录

一、C 语言程序的结构

二、数据类型及其运算

三、基本语句

四、选择结构程序设计

五、循环结构程序设计


 

一、C 语言程序的结构

1.
程序的构成,main 函数和其他函数。

一个C语言程序的基本结构通常包含以下几个部分:

  1. 头文件引用:在程序的开头,一般会包含一些头文件(header files),用于引入函数原型和宏定义。例如,#include <stdio.h> 可以引入标准输入输出库的头文件。

  2. 全局变量定义:如果需要在整个程序中共享的变量,可以在程序的开头定义全局变量。这些变量可以在各个函数中被访问和修改。

  3. 函数原型声明:在使用函数之前,需要提前声明函数的原型(函数名、参数类型和返回值类型)。函数原型声明可以放在头文件或者函数实现之前。

  4. main函数定义:C语言程序的入口是main函数。它的形式如下:

    int main() {
        // 程序逻辑
        return 0;
    }
    

    main函数中,可以编写程序的具体逻辑,包括变量定义、控制语句(如条件语句和循环语句)以及函数调用等。main函数执行完毕后,通过return语句返回一个整数值表示程序的退出状态。

  5. 其他函数定义:除了main函数外,程序可能包含其他自定义函数。这些函数的定义可以放在main函数之前或之后,以便在需要时进行调用。

注意:上述顺序不是严格要求的,可以根据需要灵活调整。

以下是一个简单的C语言程序结构的示例:

#include <stdio.h>

// 函数原型声明
int add(int a, int b);

// 全局变量定义
int globalVariable = 10;

// main函数定义
int main() {
    // 变量定义和使用
    int x = 5;
    int y = add(x, globalVariable);
    
    // 输出结果
    printf("The result is: %d\n", y);
    
    return 0;
}

// 其他函数定义
int add(int a, int b) {
    return a + b;
}

在这个示例中,程序首先引入了头文件<stdio.h>,然后声明了函数add的原型,并在全局范围内定义了一个全局变量globalVariable。接下来,定义了main函数,其中定义了局部变量xy,通过调用函数add计算结果并使用printf函数输出。最后,定义了函数add的具体实现。

2. 头文件,数据说明,函数的开始和结束标志以及程序中的注释。

头文件(Header Files):在C语言程序中,头文件用于引入函数原型、宏定义、结构体和全局变量的声明。通过包含合适的头文件,可以扩展程序的功能和使用标准库提供的函数和常量。头文件通常使用#include预处理指令来引入,例如#include <stdio.h> 引入了标准输入输出库的头文件。

数据说明(Data Declarations):在C语言程序中,数据说明用于定义变量和常量。变量声明告诉编译器如何分配内存来存储数据,并指定其类型。常量定义是指给变量赋予一个固定的值,使其在程序执行过程中无法修改。数据说明可以出现在函数外部的全局范围内,也可以出现在函数内部的局部范围内。

函数的开始和结束标志:在C语言中,函数的定义通常由函数的开始和结束标志来包围。函数的开始标志是函数头,包括函数名、参数列表和返回值类型。函数的结束标志是右花括号},表示函数体的结束。函数内的语句位于开始和结束标志之间。

程序中的注释(Comments):注释是用于向程序中添加说明性文字的文本,对于理解代码和提供必要的文档非常有帮助。C语言支持两种注释方式:

  • 单行注释:以//开头,从双斜杠到行末的内容都被视为注释。
  • 多行注释:以/*开始,以*/结束,中间的内容都被视为注释。

注释可以用于解释代码的功能、提供参数说明、标记待办事项或记录作者信息等。

以下是一个示例程序,其中包含了头文件引用、数据说明、函数的开始和结束标志以及注释的使用:

#include <stdio.h>  // 引入标准输入输出库的头文件

// 函数原型声明
int add(int a, int b);  // 将函数add的原型声明提前

int globalVariable = 10;  // 全局变量定义

int main() {  // main函数的开始标志
    int x = 5;  // 局部变量定义
    
    /* 计算并输出结果 */
    int y = add(x, globalVariable);  // 调用函数add计算结果
    
    printf("The result is: %d\n", y);  // 输出结果
    
    return 0;  // main函数的结束标志
}  // main函数的结束标志

// 函数的开始标志
int add(int a, int b) {  // 定义函数add
    return a + b;
}  // 函数的结束标志

在这个示例程序中,头文件<stdio.h>被引入,全局变量globalVariable被定义。main函数中有注释解释代码的作用,而函数add也有相应的注释。

3. 源程序的书写格式。

在C语言中,源程序的书写格式没有强制规定,但良好的代码风格和格式能够增加代码的可读性和可维护性。以下是一些常见的源程序书写格式规范:

  1. 缩进:使用空格或制表符对代码进行缩进,以使代码块层次清晰。通常每个缩进级别使用4个空格进行缩进。

  2. 空格:在运算符、逗号、分号等字符周围使用空格,以提高可读性。例如:

    int x = 5;
    int result = add(a, b);
    

     

  3. 换行:合理使用换行符,将代码分成逻辑块,并使每行长度不超过80-120个字符,以避免水平滚动。可以使用多个换行符来分隔不同的代码片段,如函数之间、循环体和条件语句的代码块等。

  4. 注释:使用注释来解释代码的功能、提供必要的文档和说明。注释可以用于标记重要信息、问题或待办事项等。注释应该清晰准确、简洁明了。

  5. 函数和控制结构的布局:对于函数和控制结构(如循环和条件语句),应该采用统一的布局风格,使代码结构清晰。例如,在函数声明和定义中,可以将左花括号{放在新的一行,或与函数名同一行。

  6. 命名约定:使用有意义的变量名、函数名和常量名,以增加代码的可读性。一般建议采用驼峰命名法或下划线命名法。

  7. 大括号:在C语言中,对于控制结构和函数体,大括号应该独占一行,并且在同一缩进级别上对齐。例如:

    if (condition) {
        // 代码块
    }
    

     

  8. 文件结构:对于大型程序,可以将不同的功能模块放在不同的源文件中,并使用头文件进行模块之间的通信。一个源文件通常包含一个主函数main()和若干自定义函数。

这些规范仅是一些建议,具体的书写格式可以根据个人或团队的实际情况进行调整。重要的是保持风格一致,以提高代码的可读性和可维护性。

4. C 语言的风格。

C语言的代码风格是一种规范和约定,用于统一代码的外观和布局,以提高代码的可读性、可维护性和可移植性。以下是一些常见的C语言代码风格指南:

  1. 缩进:

    • 使用4个空格进行缩进,而不是使用制表符。
    • 在每个缩进级别之间使用一次缩进。
  2. 大括号:

    • 左花括号{通常放在同一行的末尾,右花括号}单独占据一行。
    • 对于函数、循环和条件语句等代码块,始终使用大括号包围,即使代码块中只有一条语句。
  3. 空格:

    • 运算符、逗号、分号等字符周围使用空格,但不要在括号内部使用空格。
    • 在控制结构(如ifforwhile等)的左括号之后和右括号之前使用空格。
    • 在函数调用和函数声明的参数列表中,多个参数之间使用逗号分隔,并在逗号后面加上一个空格。
  4. 注释:

    • 使用注释来解释代码的功能、提供必要的文档和说明。
    • 使用单行注释(//)或多行注释(/* ... */),根据需要进行选择。
    • 注释应该清晰、简洁明了,并与代码对齐。
  5. 命名约定:

    • 使用有意义的变量名、函数名和常量名,以增加代码的可读性。
    • 一般建议采用驼峰命名法或下划线命名法,根据个人或团队的喜好选择合适的命名风格。
  6. 文件结构:

    • 对于大型程序,可以将不同的功能模块放在不同的源文件中,并使用头文件进行模块之间的通信。
    • 源文件应该包含适当的注释和文档,以描述文件的功能和用法。
  7. 格式化:

    • 代码应该被适当地格式化,使结构清晰且易于阅读。
    • 合理使用空行来分隔逻辑块,使代码更具可读性。

二、数据类型及其运算

1. C 的数据类型(基本类型,构造类型,指针类型,无值类型)及其定义方法。

在C语言中,数据类型被分为四个主要类别:基本类型(Basic Types)、构造类型(Derived Types)、指针类型(Pointer Types)和无值类型(Void Type)。

  1. 基本类型(Basic Types):

    • char:字符类型,用于表示单个字符,占用1个字节。
    • int:整数类型,用于表示整数值,通常占用4个字节。
    • float:单精度浮点数类型,用于表示小数值,通常占用4个字节。
    • double:双精度浮点数类型,用于表示更大范围和更高精度的小数值,通常占用8个字节。
    • _Bool:布尔类型,用于表示真(非零)或假(零),通常占用1个字节。
  2. 构造类型(Derived Types):

    • 数组(Array):由相同类型的元素组成的有序集合。可以使用方括号 [] 定义数组的大小,并逐个下标访问元素。
    • 结构体(Structure):可以包含多个不同类型的成员变量,可以使用关键字 struct 定义。
    • 共用体(Union):一次只能存储一个成员变量的特殊结构体,可以使用关键字 union 定义。
  3. 指针类型(Pointer Types):

    • 指针(Pointer):存储内存地址的变量,可以指向其他变量或数据。通过使用星号符 * 来声明一个指针类型,如 int *ptr;
  4. 无值类型(Void Type):

    • void:表示没有值的类型,通常用于函数的返回类型,或指针的通用类型。

这些数据类型可以通过关键字进行定义和声明。例如,int num; 声明了一个整数类型的变量 num。而构造类型和指针类型需要更详细的定义来描述其结构和属性。

需要注意的是,C语言还提供了类型修饰符(如 signedunsignedlongshort)来调整基本类型的范围和属性,以满足特定的需求。

此外,C语言还支持使用 typedef 关键字为现有的类型创建新的类型别名,以增加代码的可读性和可移植性。

 
2. C 运算符的种类、运算优先级和结合性。

C语言中有多种运算符,它们按照功能和优先级可以分为以下几类:

  1. 算术运算符:

    • 加法:+
    • 减法:-
    • 乘法:*
    • 除法:/
    • 取余:%
  2. 关系运算符:

    • 等于:==
    • 不等于:!=
    • 大于:>
    • 小于:<
    • 大于等于:>=
    • 小于等于:<=
  3. 逻辑运算符:

    • 逻辑与:&&
    • 逻辑或:||
    • 逻辑非:!
  4. 位运算符:

    • 按位与:&
    • 按位或:|
    • 按位异或:^
    • 按位取反:~
    • 左移:<<
    • 右移:>>
  5. 赋值运算符:

    • 简单赋值:=
    • 加法赋值:+=
    • 减法赋值:-=
    • 乘法赋值:*=
    • 除法赋值:/=
    • 取余赋值:%=
    • 左移赋值:<<=
    • 右移赋值:>>=
    • 按位与赋值:&=
    • 按位或赋值:|=
    • 按位异或赋值:^=
  6. 自增自减运算符:

    • 自增:++
    • 自减:--
  7. 条件运算符:

    • 三元条件运算符:条件表达式 ? 表达式1 : 表达式2

C语言中的运算符还具有不同的优先级和结合性,它们在表达式中的计算顺序由此确定。以下是一些常见运算符的优先级和结合性(从高到低):

  1. 括号:()
  2. 自增自减:++ --
  3. 一元运算符:+ - ! ~
  4. 乘法和除法:* / %
  5. 加法和减法:+ -
  6. 移位运算符:<< >>
  7. 关系运算符:< <= > >=
  8. 相等运算符:== !=
  9. 按位与:&
  10. 按位异或:^
  11. 按位或:|
  12. 逻辑与:&&
  13. 逻辑或:||
  14. 条件运算符:?:
  15. 赋值运算符:= += -= *= /= %= <<= >>= &= ^= |=

需要注意的是,可以使用括号来改变运算符的优先级和结合性,以确保表达式按照预期的方式进行计算。

3. 不同类型数据间的转换与运算。
  1. 自动类型提升(Implicit Type Promotion):

    • 当不同类型的操作数进行运算时,较低精度的操作数会自动提升为较高精度的类型。例如,整型和浮点型的运算中,整型会自动提升为浮点型。
    • 自动类型提升也适用于混合使用不同长度和符号性质的整数类型。
  2. 截断和舍入(Truncation and Rounding):

    • 当将一个浮点数值赋给整数类型时,小数部分会被截断,只保留整数部分。
    • 当浮点数值进行四舍五入时,可以使用数学库函数(如 round()floor()ceil() 等)。
  3. 强制类型转换(Explicit Type Casting):

    • 可以使用强制类型转换操作符(括号中放置目标类型)来显式地将一个类型转换为另一个类型。例如:(float) num 将整数 num 转换为浮点数类型。
    • 强制类型转换可能导致数据丢失或精度损失,需要谨慎使用。
  4. 字符类型转换:

    • 可以将字符类型与整数类型进行互相转换。例如,字符的ASCII码可以通过强制类型转换转换为整数值,而整数值也可以通过强制类型转换转换为对应的字符。
      #include <stdio.h>
      
      int main() {
          int num1 = 10;
          float num2 = 3.5;
          char ch = 'A';
      
          // 自动类型提升
          float result = num1 + num2;
          printf("自动类型提升结果:%.2f\n", result);
      
          // 截断和舍入
          int truncation = (int)num2;
          printf("截断结果:%d\n", truncation);
      
          float rounding = round(num2);
          printf("四舍五入结果:%.2f\n", rounding);
      
          // 强制类型转换
          int num3 = (int)num2;
          printf("强制类型转换结果:%d\n", num3);
      
          // 字符类型转换
          int ascii = (int)ch;
          printf("字符 'A' 的ASCII码:%d\n", ascii);
      
          char character = (char)97;
          printf("ASCII码为97的字符:%c\n", character);
      
          return 0;
      }
      

       

 
4. C 表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表
达式)和求值规则。
  1. 赋值表达式(Assignment Expression):

    • 赋值表达式用于将一个值赋给变量。
    • 例如:a = 10;
  2. 算术表达式(Arithmetic Expression):

    • 算术表达式用于执行数值计算。
    • 常见的算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)、取余(%)等。
    • 例如:int sum = a + b;
  3. 关系表达式(Relational Expression):

    • 关系表达式用于比较两个值的大小关系,并返回一个布尔值(0或1)。
    • 常见的关系运算符包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。
    • 例如:if (a > b) { ... }
  4. 逻辑表达式(Logical Expression):

    • 逻辑表达式用于进行布尔逻辑运算,并返回一个布尔值(0或1)。
    • 常见的逻辑运算符包括逻辑与(&&)、逻辑或(||)、逻辑非(!)等。
    • 例如:if (a > 0 && b < 0) { ... }
  5. 条件表达式(Conditional Expression):

    • 条件表达式根据条件的真假选择执行不同的表达式。
    • 使用三元运算符(?:)实现条件表达式,形如:condition ? expression1 : expression2
    • 例如:int max = (a > b) ? a : b;
  6. 逗号表达式(Comma Expression):

    • 逗号表达式用于在一个表达式中依次执行多个语句,并返回最后一个语句的值。
    • 逗号运算符(,)用于连接多个表达式。
    • 例如:int i = 0, j = 5, k;

求值规则是指表达式计算时的顺序和优先级规则:

  • 求值顺序通常从左到右。
  • 有运算符优先级的情况下,高优先级的运算符优先计算。
  • 可以使用括号来明确指定优先级。

三、基本语句

1. 表达式语句,空语句,复合语句。
  1. 表达式语句(Expression Statement):

    • 表达式语句是最常见的一种语句,用于执行一个或多个表达式并产生副作用。
    • 通常以分号(;)结尾。
    • 例如:x = 5;
  2. 空语句(Empty Statement):

    • 空语句是一种没有实际操作的语句。
    • 它只包含一个分号(;),用于在某些情况下表示无需执行任何操作。
    • 例如:;
  3. 复合语句(Compound Statement):

    • 复合语句是由多条语句组成的块,用花括号({})括起来。
    • 可以包含任意数量的语句,甚至可以嵌套其他复合语句。
    • 通常用于控制结构(如if语句、循环语句)和函数定义中。例如:
    • {
          int x = 5;
          printf("x的值:%d\n", x);
      }
      

       

这些语句类型在C语言中用于组织程序的逻辑流程和执行操作。你可以根据需要选择合适的语句类型,并注意使用大括号来限定复合语句的范围。复合语句特别有用,因为它允许在一个块中定义局部变量和执行多条语句,能够提高代码的可读性和灵活性。

2. 输入输出函数的调用,正确输入数据并正确设计输出格式。
  1. 输入数据:

    • scanf函数用于从标准输入(键盘)接收输入数据。
    • 通过提供合适的格式字符串和对应的变量地址,将输入的数据存储到相应的变量中。
    • 例如:假设需要输入一个整数,可以使用以下代码:
      int num;
      printf("请输入一个整数:");
      scanf("%d", &num);
      

       

  2. 设计输出格式:

    • printf函数用于将数据输出到标准输出(控制台)。
    • 使用合适的格式字符串来指定输出的数据类型和格式。
    • 例如:假设需要输出一个浮点数和一个字符串,可以使用以下代码:
      float number = 3.14159;
      char str[] = "Hello, World!";
      printf("浮点数:%f\n", number);
      printf("字符串:%s\n", str);
      

       

注意事项:

  • 在使用scanf函数输入数据时,确保提供正确的格式字符串,与要输入的数据类型相匹配,以避免输入错误或导致程序崩溃。
  • 在使用printf函数输出数据时,根据所需的输出格式选择合适的格式控制符,并确保与要输出的数据类型相匹配,以避免输出错误的结果。

此外,还可以使用其他输入输出函数,如fgetsgetsputs等,根据具体需求选择合适的函数来实现输入和输出操作。

  1. fgets函数:

    • fgets函数用于从标准输入(键盘)读取一行文本。
    • 它可以读取包含空格的整行数据,并将其存储到指定的字符串缓冲区中。
    • 通过提供合适的缓冲区地址、最大读取字符数和输入流(一般为stdin),实现输入操作。
    • 例如:
      char buffer[100];
      printf("请输入一行文本:");
      fgets(buffer, sizeof(buffer), stdin);
      

       

  2. gets函数(不推荐使用):

    • gets函数用于从标准输入(键盘)读取一行文本。
    • 它会将读取到的内容存储到指定的字符串缓冲区中,直到遇到换行符(\n)或文件结束符(EOF)。
    • 请注意,gets函数存在安全性问题,容易导致缓冲区溢出,因此不推荐使用。
    • 例如:
      char buffer[100];
      printf("请输入一行文本:");
      gets(buffer);
      

       

  3. puts函数:

    • puts函数用于将一个字符串输出到标准输出(控制台)。
    • 它会自动在字符串末尾添加换行符(\n),并将其输出到控制台。
    • 例如:
      char str[] = "Hello, world!";
      puts(str);
      

       

注意事项:

  • 在使用fgetsgets函数读取字符串时,需要提供足够大的缓冲区来存储输入的数据,以防止缓冲区溢出。
  • 使用fgets函数时,可以通过适当处理字符串来删除末尾的换行符(\n)。
  • 避免使用gets函数,因为它存在安全隐患,推荐使用更安全的输入函数,如fgets
  • 使用puts函数时,只能输出字符串,不能输出其他类型的数据。

四、选择结构程序设计

1. 用 if 语句实现选择结构。

使用if语句可以实现选择结构,根据条件的判断结果来执行相应的代码块。以下是if语句的基本语法:

if (条件表达式) {
    // 如果条件表达式为真,执行这里的代码块
} else {
    // 如果条件表达式为假,执行这里的代码块
}

在上述语法中,条件表达式可以是任何返回布尔值(真或假)的表达式。如果条件表达式的结果为真,则执行if代码块中的代码;如果条件表达式的结果为假,则执行else代码块中的代码。

以下是一个示例,演示如何使用if语句实现选择结构:

int num = 10;

if (num > 0) {
    printf("数字是正数\n");
} else if (num < 0) {
    printf("数字是负数\n");
} else {
    printf("数字是零\n");
}

在上述示例中,根据变量num的值,if语句根据条件的判断结果选择性地执行不同的代码块。如果num大于0,则输出"数字是正数";如果num小于0,则输出"数字是负数";如果num等于0,则输出"数字是零"。

需要注意的是,if语句只会执行符合条件的第一个代码块,并跳过其他代码块。如果条件表达式都不满足,则执行else代码块(可选)中的代码。

2. 用 switch 语句实现多分支选择结构。

使用switch语句可以实现多分支选择结构,根据不同的情况执行相应的代码块。以下是switch语句的基本语法:

switch (表达式) {
    case 值1:
        // 当表达式的值等于值1时,执行这里的代码块
        break;
    case 值2:
        // 当表达式的值等于值2时,执行这里的代码块
        break;
    case 值3:
        // 当表达式的值等于值3时,执行这里的代码块
        break;
    default:
        // 如果表达式的值不等于上述任何一个值时,执行这里的代码块
        break;
}

在上述语法中,switch语句的表达式可以是整数或字符类型的常量、变量或表达式。根据表达式的值,执行与其匹配的case块中的代码。

注意每个case块后面的break语句,它用于跳出switch语句。如果没有break语句,程序将会继续执行下一个case块中的代码,直到遇到break语句或switch语句结束。

以下是一个示例,演示如何使用switch语句实现多分支选择结构:

int choice = 2;

switch (choice) {
    case 1:
        printf("选择了第一个选项\n");
        break;
    case 2:
        printf("选择了第二个选项\n");
        break;
    case 3:
        printf("选择了第三个选项\n");
        break;
    default:
        printf("选择了无效的选项\n");
        break;
}

在上述示例中,根据变量choice的值,switch语句根据不同的情况执行相应的代码块。如果choice的值等于1,则输出"选择了第一个选项";如果choice的值等于2,则输出"选择了第二个选项";如果choice的值等于3,则输出"选择了第三个选项";如果choice的值与任何一个case块中的值都不匹配,则执行default代码块中的代码。

需要注意的是,switch语句只能用来匹配整数或字符类型的值,不能用于浮点数、字符串等其他类型的值。如果需要进行范围判断或其他复杂条件判断,仍需要使用if-else语句来实现。

3. 选择结构的嵌套。

选择结构的嵌套指的是在一个选择结构内再嵌套另一个选择结构。通过嵌套多个if-else语句或switch语句,可以实现更复杂的条件判断和多级选择。

以下是一个使用if-else语句嵌套的示例:

int num = 10;

if (num > 0) {
    printf("数字是正数\n");
} else {
    if (num < 0) {
        printf("数字是负数\n");
    } else {
        printf("数字是零\n");
    }
}

在上述示例中,外层的if语句根据条件判断结果选择性地执行其中的代码块。当条件表达式num > 0为真时,输出"数字是正数"。当条件表达式num > 0为假时,执行内层的if-else语句。内层的if-else语句根据条件判断结果选择性地执行其中的代码块。当条件表达式num < 0为真时,输出"数字是负数"。当条件表达式num < 0为假时,输出"数字是零"。

同样的,可以使用switch语句进行多级选择结构的嵌套。以下是一个使用switch语句嵌套的示例:

int score = 85;
char grade;

switch (score / 10) {
    case 10:
    case 9:
        grade = 'A';
        break;
    case 8:
        grade = 'B';
        break;
    case 7:
        grade = 'C';
        break;
    case 6:
        grade = 'D';
        break;
    default:
        grade = 'F';
        break;
}

printf("分数等级为:%c\n", grade);

在上述示例中,首先计算score除以10的商,根据商的值进行多级选择。当商的值为10或9时,执行第一个case块中的代码,将grade赋值为'A'。当商的值为8时,执行第二个case块中的代码,将grade赋值为'B'。当商的值为7时,执行第三个case块中的代码,将grade赋值为'C'。当商的值为6时,执行第四个case块中的代码,将grade赋值为'D'。当商的值不满足上述任何一个case块中的值时,执行default代码块中的代码,将grade赋值为'F'。最后输出分数等级。

需要注意的是,选择结构的嵌套可以根据具体需求来灵活设计,可以根据条件的判断结果嵌套多层选择结构,实现更复杂的逻辑判断和多重选择。

五、循环结构程序设计

1. for 循环结构。

for循环结构是一种重复执行特定代码块的控制结构。通过设置循环变量的初始值、循环条件和每次迭代后的操作,可以控制循环的执行次数和行为。

以下是for循环的基本语法:

for (初始化语句; 循环条件; 迭代操作) {
    // 循环体,执行具体的代码块
}

在上述语法中,初始化语句用于初始化循环变量,只会在循环开始前执行一次。循环条件是一个布尔表达式,用于判断是否继续执行循环。如果循环条件为真,才会执行循环体中的代码块。迭代操作用于更新循环变量,在每次循环迭代后执行一次。循环体是需要重复执行的代码块。

以下是一个简单的示例,演示如何使用for循环打印数字 1 到 5:

for (int i = 1; i <= 5; i++) {
    printf("%d ", i);
}

在上述示例中,for循环的初始化语句是将循环变量i初始化为1。循环条件是i <= 5,即i的值小于等于5时继续循环。迭代操作是每次循环后将i的值增加1。循环体中的代码是打印变量i的值。通过这个for循环,会依次打印出数字 1 到 5。

2. while 和 do-while 循环结构。

whiledo-while是两种常见的循环结构,用于重复执行特定的代码块,直到满足指定的条件为止。

while循环的基本语法如下:

while (循环条件) {
    // 循环体,执行具体的代码块
}

在上述语法中,循环条件是一个布尔表达式,用于判断是否继续执行循环。只有当循环条件为真时,才会执行循环体中的代码块。如果循环条件一开始就为假,则循环体的代码将不会执行。

以下是一个使用while循环打印数字 1 到 5 的示例:

int i = 1;

while (i <= 5) {
    printf("%d ", i);
    i++;
}

在上述示例中,循环条件是i <= 5,即i的值小于等于5时继续循环。循环体中的代码是打印变量i的值,并将i增加1。通过这个while循环,会依次打印出数字 1 到 5。

while循环类似,do-while循环也用于重复执行代码块,但是它的判断条件是在循环体执行完之后进行判断。do-while循环的基本语法如下

do {
    // 循环体,执行具体的代码块
} while (循环条件);

do-while循环中,循环体的代码会被至少执行一次,然后才会对循环条件进行判断。如果循环条件为真,则继续执行循环体的代码块;否则循环结束。

以下是一个使用do-while循环打印数字 1 到 5 的示例:

int i = 1;

do {
    printf("%d ", i);
    i++;
} while (i <= 5);
上述示例中,循环体中的代码会先执行一次,然后再判断循环条件 i <= 5。只有当循环条件为真时,才会继续执行循环体中的代码块。通过这个 do-while循环,同样会依次打印出数字 1 到 5。

需要注意的是,while循环和do-while循环在判断循环条件的时机上存在差异:while循环在每次循环开始之前判断条件,而do-while循环在每次循环结束之后判断条件。因此,在一些特殊情况下,选择合适的循环结构可以更好地满足编程需求。

3. continue 语句和 break 语句。

continue语句和break语句是在循环结构中使用的控制语句,用于改变循环执行的流程。

  1. continue语句:
    • continue语句被执行时,程序会跳过当前迭代中剩余的代码,并开始下一次循环迭代。
    • continue语句通常与条件语句一起使用,用于跳过满足特定条件的某些循环迭代。

以下是一个使用continue语句的示例,在循环中跳过偶数值:

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue; // 跳过偶数值
    }
    printf("%d ", i);
}

在上述示例中,continue语句会在i为偶数时执行,跳过偶数值的打印操作。通过这个continue语句,只有奇数值会被打印出来。

  1. break语句:
    • break语句被执行时,整个循环立即终止,程序将跳出当前循环结构。
    • break语句通常与条件语句一起使用,用于在满足特定条件时提前结束循环,避免不必要的迭代。

以下是一个使用break语句的示例,在循环中找到第一个满足条件的数后结束循环:

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break; // 当 i 等于 5 时提前结束循环
    }
    printf("%d ", i);
}

在上述示例中,当i等于5时,break语句会被执行,整个循环立即终止。因此,只有数字 1 到 4 会被打印出来。

通过使用continue语句和break语句,可以在循环结构中根据条件控制循环的行为,实现更加灵活和高效的代码逻辑。

4. 循环的嵌套。

循环的嵌套是指在一个循环结构中再包含另一个循环结构。通过循环的嵌套,可以实现更加复杂的程序逻辑和任务处理。

常见的循环嵌套包括使用嵌套的for循环、while循环或do-while循环。以下是一个使用for循环嵌套的示例,用于打印九九乘法表:

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        printf("%d * %d = %d\t", j, i, j*i);
    }
    printf("\n");
}

在上述示例中,外层的for循环用于控制乘法表的行数,内层的for循环用于控制每行中的列数。通过循环嵌套,可以依次打印出九九乘法表中的每个乘法算式。

除了使用for循环进行嵌套,同样可以使用while循环或do-while循环来实现循环的嵌套。只需要将嵌套的循环结构放置在外层循环的循环体中即可。

需要注意的是,循环的嵌套可能会增加代码的复杂性,需要仔细设计循环条件和循环体,避免产生不必要的计算或逻辑错误。在使用循环嵌套时,建议根据具体需求和问题进行合理的设计和测试。

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据结构算法演示(Windows版) 使 用 手 册 一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行过程中栈的变化状况。整个系统使用菜单驱动方式, 每个菜单包括若干菜单项。每个菜单项对应一个动作或一个子菜单。系统一直处于选择菜单项或执行动作状态, 直到选择了退出动作为止。 二、 系统内容 本系统内含84个算法,分属13部分内容,由主菜单显示,与《数据结构》教科书中自第2章至第11章中相对应。各部分演示算法如下: 1. 顺序表 (1)在顺序表中插入一个数据元素(ins_sqlist) (2)删除顺序表中一个数据元素(del_sqlist) (3)合并两个有序顺序表(merge_sqlist) 2. 链表 (1)创建一个单链表(Crt_LinkList) (2)在单链表中插入一个结点(Ins_LinkList) (3)删除单链表中的一个结点(Del_LinkList) (4)两个有序链表求并(Union) (5)归并两个有序链表(MergeList_L) (6)两个有序链表求交(ListIntersection_L) (7)两个有序链表求差(SubList_L) 3. 栈和队列 (1)计算阿克曼函数(AckMan) (2)栈的输出序列(Gen、Perform) (3)递归算法的演示  汉诺塔的算法(Hanoi)  解皇后问题的算法(Queen)  解迷宫的算法(Maze)  解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值(Exp_reduced) 4. 串的模式匹配 (1)古典算法(Index_BF) (2)求Next 函数值(Get_next)和按Next 函数值进行匹配 (Index_KMP(next)) (3)求 Next 修正值(Get_nextval)和按 Next 修正值进行匹配(Index_KMP(nextval)) 5. 稀疏矩阵 (1)矩阵转置 (Trans_Sparmat) (2)快速矩阵转置 (Fast_Transpos) (3)矩阵乘法 (Multiply_Sparmat) 6. 广义表 (1)求广义表的深度(Ls_Depth) (2)复制广义表(Ls_Copy) (3)创建广义表的存储结构(Crt_Lists) 7. 二叉树 (1)遍历二叉树  二叉树的线索化  先序遍历(Pre_order)  中序遍历(In_order)  后序遍历(Post_order) (2) 按先序建二叉树(CrtBT_PreOdr) (3) 线索二叉树  二叉树的线索化  生成先序线索(前驱或后继) (Pre_thre)  中序线索(前驱或后继) (In_thre)  后序线索(前驱或后继) (Post_thre)  遍历中序线索二叉树(Inorder_thlinked)  中序线索树的插入(ins_lchild_inthr)和删除(del_lchild_inthr)结点 (4)建赫夫曼树和求赫夫曼编码(HuffmanCoding) (5)森林转化成二叉树(Forest2BT) (6)二叉树转化成森林(BT2Forest) (7)按表达式建树(ExpTree)并求值(CalExpTreeByPostOrderTrav) 8. 图 (1)图的遍历  深度优先搜索(Travel_DFS)  广度优先搜索(Travel_BFS) (2)求有向图的强连通分量(Strong_comp) (3)有向无环图的两个算法  拓扑排序(Toposort)  关键路径(Critical_path) (4)求最小生成树  普里姆算法(Prim)  克鲁斯卡尔算法(Kruscal) (5)求关节点和重连通分量(Get_artical) (6)求最短路径  弗洛伊德算法(shortpath_Floyd)  迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_compaction) 10. 静态查找 (1)顺序查找(Search_Seq) (2)折半查找 (Serch_Bin) (3)插值查找 (Search_Ins) (4)斐波那契查找 (Search_Fib) (5)次优查找树(BiTree_SOSTree) 11. 动态查找 (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_BTree) (4)在 B+树上插入结点(Ins_PBTree) 和 删除结点(Del_PBTree) 12. 内部排序 (1)简单排序法  直接插入排序(Insert_sort)  表插入排序(内含插入(Ins_Tsort) 重排(Arrange)两个算法)  起泡排序(BubbleSort)  简单选择排序(SelectSort) (2)复杂排序法  堆排序(HeapSort)  快速排序(QuickSort)  锦标赛排序(Tournament) (3)其他  快速地址排序(QkAddrst)  基数排序(RadixSort) 13. 外部排序 (1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection) 三、 运行环境 1. 硬件:Pentium100以上PC机。 2. 软件:Windows95及以上版本的操作系统。 四、 运行 本系统的执行文件为DSDEMOW.EXE。 五、 如何使用本课件 读者可以利用鼠标移动光标选择“演示算法”或“菜单命令”来控制课件的运行过程。 1. 课件的演示算法菜单为页式菜单。第一级菜单中的各项与上述“系统内容”中各大项相对应,读者运行“算法演示课件”后, 即进入“算法选择一级菜单”画面,此时可移动光标进行选择,当光标所在菜单项改为红色时,单击鼠标即进入“算法选择二级菜单”,进行相同操作之后,或进入算法选择三级菜单(如图1所示),或进入算法演示的执行状态(如图2所示)。 图1 图2 在算法选择菜单画面中,形如 的图标意为尚有下级菜单,形如 的图标则表示将直接进入算法演示状态。此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2. 算法演示执行状态下的屏幕分为三部分:第一行为“标题行”,第二行为“菜单命令”,以下为算法演示屏上各菜单的说明。 菜单命令中各项自左至右的功能分别为:  数据——设置算法演示的数据(数据结构)。  调用栈——察看当前函数(或过程)嵌套或递归的历程。  说明——察看算法说明。  暂停——中断演示过程。  执行——连续执行算法直至所设断点或至算法执行完毕。  单步——执行一行算法,遇到子程序调用时,连续执行完子程序。  跟踪——执行一行算法,遇到子程序调用时,进入子程序。  执行到——演示算法到当前所设最近的断点或算法窗口中的当前行。  恢复——重置屏幕为当前算法执行前的初始状态。  断点——在算法窗口的当前选择行设置断点或清除断点。  设置——设置连续演示时的速度或开/闭背景音乐(或动作音效)开关。  返回——返回算法选择菜单。 3. 断点的设置方法为:移动光标至“断点语句”所在行,点击鼠标后即出现绿色光条,之后单击“断点”菜单中的“设置断点”命令项即可,此时该断点语句所在行上将出现红色光条。 六、 算法演示屏的详细说明 本系统对屏幕设计的基本原则是集数据结构、算法和其他重要信息(如栈等)于同一屏幕。一般情况下演示屏由图示、算法和变量三个窗口组成,特殊情况下将根据演示内容适当增加。一般情况下, 左侧图示窗口显示演示数据的逻辑结构或存储结构,右侧上方窗口显示算法文本,右侧下方窗口显示当前算法中各变量的值或递归工作栈的状态。各窗口间的边界大小均可自由调节,且可按需扩大至全屏。 算法窗口显示当前演示的算法文本,并以深蓝色的光条覆盖将要执行的语句。若算法中含有函数或过程调用语句,则当光条覆盖到该过程调用语句时,随即自动隐去原算法文本而显示子过程的文本,而从此过程返回时再重新显示原算法文本。类似地,在演示递归算法执行过程时,每当执行递归调用本过程的语句时,随即隐去当前层次的算法文本而显示下一层的算法文本,并且以不同颜色的算法文本表示递归的不同层次。如第一层的算法文本为深绿色,第二层为紫色,第三层为深红色,第四层为深蓝色,第五层为浅蓝色,第六层为玫瑰红色等。 当演示递归算法执行过程中递归工作栈的变化状态时,递归工作栈显示在右侧下窗口,递归工作栈的状态和算法文本窗口中相应语句执行后的结果相对应,栈顶记录为当前递归层的参量值。每进入一层递归时,就产生一个新的工作记录(包括调用语句行号、变量参数或全程变量、数值参数和局部变量)压入栈顶;每退出一层递归时,先根据栈顶的调用语句行号返回至上层,然后在传递完变量参数的值后退栈。 各个算法演示屏的补充说明如下: 1. 顺序表和链表的插入、删除和链表的生成 算法演示屏由显示顺序表或链表的图示、算法文本及变量等三个窗口组成。在演示算法之前,需先在弹出的小窗口中输入线性表的数据元素及算法参数 i(插入或删除的位置)和 b(被插的数据元素)的值。顺序表的图示窗口在演示屏的上方,链表的图示窗口在左侧。 2. 有序表的操作 算法演示屏的状态和 1 中所述相同。 3. 汉诺塔问题 算法演示屏由4个窗口组成。右侧上方为算法文本,在算法中有4个形式参量,其中值参 n 为圆盘个数,x、y、和 z 分别表示3个塔座;右侧下方为递归工作栈,栈中每个记录包含调用语句行号 adr 及值参 n 和 x、y、z;左侧上方显示汉诺塔图形及移动操作结果;左侧下方显示移动操作的记录。 4. 迷宫问题 左侧窗口显示迷宫的逻辑结构,由 N×N 个方格组成,左上[1,1]为入口,右下[N,N]为出口,并且以红色钉子填充表示障碍,空白表示通路,红色交通灯表示已游历过的路,箭头表示继续游历的方向,演示结束时显示一条通路或迷宫不通的信息。右侧下窗口为递归工作栈,栈中每个记录含6个数据项,其中 adr 指示调用语句行号,k 指示步数,(x,y) 表示当前坐标,i 指示路径方向(起始方向为 1,顺时针方向旋转搜索)。 5. 皇后问题 左侧图示窗口包含棋盘和递归工作栈两部分,栈中记录含3个数据项,其中 adr 指示调用语句行号,k 指示列号,i 指示行号。此算法演示可求得所有可行结果,在求得每一种排布的结果之后,均会弹出一个窗口显示“找到第 j (j=1,2,…) 种排布”,单击“确定”按钮将继续进行,直至找到所有可能构成的排布。 6. 背包问题 右侧图示窗口的上方显示背包、物件及其体积。 若有解,则在求得每一组结果之后,均会弹出一个窗口提示求得一组解,单击提示窗口中的小人将继续进行。该窗口的下方为递归工作栈,栈中的记录含3个数据项,其中 adr 指示调用语句所在行号,n 指示物件个数,t 指示背包总体积。 7. 阿克曼函数 整个演示屏只有显示算法文本和显示算法执行过程中栈的状态两个窗口。在执行算法之前,首先应按照提示输入参数 m 和 n 的值。 8. 栈的输出序列 图示窗口的内容为:由算法 Gen 生成的栈的操作序列(列出在窗口的下方)、算法 Perform 执行时栈的操作过程(该窗口的上方)以及算法 Perform 执行的结果——栈的输出序列(列出在图示窗口的右侧)。 9. 表达式求值 图示窗口的内容主要为显示表达式求值过程中操作数栈和运算符栈的变化情况以及主要操作。上方的小窗口显示在算法演示之前设定的表达式。 10. 离散事件模拟 图示窗口分成3部分:中间部分或显示客户流动情况的动画,或显示程序执行过程中事件表和4个队列的数值,上方两个按钮用以切换动画或静态数据,下方则显示客户总人数、客户逗留的累计时间以及调节动画中小人移动速度的指针。 11. 串的模式匹配 上窗口显示算法文本,下窗口显示串的匹配过程或求 next 函数的过程。 12. 稀疏矩阵 图示窗口显示矩阵的状态或其三元组的表示。 13. 求广义表的深度 图示窗口显示广义表的存储结构,图中指针 ls 指向当前所求深度的广义表,值为空时不显示。演示结束时弹出窗口显示求得的深度。 14. 复制广义表 图示窗口的上方显示已知广义表的存储结构,图示窗口的下方显示复制求得的广义表的存储结构。递归工作栈中含调用语句行号 adr、变参 nls 和值参 ls。 15. 创建广义表的存储结构 图示窗口显示广义表存储结构的建立过程和算法执行过程中参数Sub的当前值。 16. 遍历二叉树 图示窗口显示二叉树的逻辑结构和遍历结果输出的结点序列,图中指针 bt 指向当前遍历的二叉树的根结点。 17. 线索二叉树 图示窗口显示二叉树的存储结构,但结点中只含标志域,而以结点间的黑色连线表示指针,红色连线表示前驱线索,蓝色连线表示后继线索。在二叉树线索化的过程中,图中指针 p 指向当前层二叉树的根结点,指针 pre 指向当前被访问的结点的前驱。在演示线索树的插入和删除过程时,图示窗口的下方还包括“输入行”和“提示行”。 18. 按先序序列建二叉链表 图示窗口显示输入的先序序列和生成二叉链表的过程。 19. 森林和二叉树的相互转换 图示窗口在显示屏的上方,其左侧为森林,右侧为二叉树。 20. 赫夫曼树和赫夫曼编码 图示窗口显示生成的赫夫曼树的逻辑结构和每个叶子结点的编码。 21. 图的深度优先搜索 图示窗口的上半部分显示图的逻辑结构,初始状态用青色圆圈表示顶点,结点间的黑色连线表示边或弧(连线上画有箭头)。演示过程中用红色覆盖已访问的顶点和边(或弧)。窗口下方显示图的邻接表,演示过程中以红色框边表示已访问过的弧。图示窗口的下方显示遍历后输出的顶点序列。 22. 图的广度优先搜索 与深度优先不同的是,在窗口的下方增加一个队列,其左端为队头,右端为队尾。 23. 求有向图的强连通分量 图示窗口自上而下分别显示有向图的逻辑结构、存储结构和 Finished 数组在算法执行过程中的变化情况。所求得的各个强连通分量,将以不同颜色的顶点组表示。 24. 求关节点和重连通分量 图示窗口的上半部分显示无向图,下半部分自上而下分别显示 Vexnum、Vexdata、Visited、Low、Squlow(求得 low 值的顺序)和 artpoint(关节点)的信息。 25. 有向图的拓扑排序 图示窗口由5部分组成。其中左上显示有向图的邻接表;左下显示有向图,其中顶点和弧的初始状态分别为绿色和黑色,从栈中退出的顶点(i)用红色表示,分别以蓝色和红色指示当前访问的邻接点(k)和它们之间的弧(ik),灰白色表示已经输出的顶点;右下显示顶点的入度;右上显示入度为零的栈。当拓扑排序不成功时,在演示屏的中央将会弹出一个窗口,显示提示信息“网中存在自环!”,此时用户可在左下显示的有向图中由绿色顶点和黑色弧构成的子图中找到这个环。 26. 有向图的关键路径 图示窗口包含5部分信息。左上显示带入度域的邻接表;左下显示有向网的逻辑结构和顶点的入度及各顶点事件的最早发生时间和最迟发生时间;右下显示拓扑排序过程中入度为零的顶点的栈S,右上显示的栈 T 存放拓扑序列,其入栈顺序和栈 S 的出栈顺序相同,从栈顶到栈底的顶点顺序即为顶点的逆拓扑序列。算法执行结束后将弹出窗口列出全部结果,其中红色字体的弧表示关键活动。 27. 普里姆算法 图示窗口包含3部分内容。右上是邻接矩阵;左上是无向网的逻辑结构,图中顶点的初始状态为黄色,算法执行过程中,红色覆盖的顶点和边则表示已加入生成树的顶点和生成树上的边;窗口的下方则显示 closedge 数组中的值。 28. 克鲁斯卡尔算法 图示窗口的左侧为无向网,以红色标定已落在生成树上的边;右侧自上而下列出各条边的信息以及选择生成树的边的执行过程。 29. 边界标识法 图示窗口的初始状态为 64KB 的模拟存储器,演示过程中,以绿色覆盖占用块。各个存储块的头部左侧所示为该块的起始地址,头部结构或其他信息参见教科书。用户可根据弹出窗口的操作提示信息进行操作,输入请求分配的空间大小或释放块的首地址。 30. 伙伴系统 在图示窗口中,左侧为可利用空间链表的逻辑结构,右侧为存储结构,其中红色覆盖部分为占用块。弹出窗口为输入窗口,由用户输入请求分配的空间大小或释放块的首地址。 31. 紧缩无用单元 右侧显示存储空间,空白表示空闲块,其他颜色覆盖表示占用块,在存储空间不足分配时将进行空闲块压缩。左侧显示存储映像。弹出窗口为输入窗口,由用户输入请求分配的空间大小和分配或释放块的块名。 32. 静态查找 上窗口为图示窗口,演示查找过程;左下和右下分别为算法文本和变量窗口。 33. B-树和B+树 整个屏幕分为上、下两个窗口,上窗口演示插入或删除结点过程中B-树或B+ 树结构的变化状况;下窗口内显示如查找关键字、插入位置、结点分裂等操作信息。下窗口上面左侧的小窗口为编辑窗口,由用户输入待插或待删的关键字,输入之后其右侧的操作命令将由隐式状态改为显式状态。 34. 内部排序 图示窗口演示排序过程以及排序过程中关键字之间进行的比较次数和记录移动的次数。 七、 用户自行输入数据指南 算法操作的对象——数据结构,或由用户自行输入,或由系统随机产生,并在获得用户的确认之前,可反复随机产生,直至用户满意,用鼠标点击“OK”按钮确认为止。 多数情况下的输入界面上有足够的提示信息,以指示用户需要进行何种操作。补充说明如下: 1. 表的数据元素为任意的单个字符。 2. 迷宫的输入界面如图3所示。图中砖墙图案表示障碍,连续点击鼠标可将光标所在位置设置成通道或者障碍,建议用户先点击“随机生成”按钮随机生成一个迷宫,然后移动鼠标调整成所需。所设迷宫可以利用“保存数据”按钮生成dat类型文件,并在需要时可以利用“取出数据”按钮读入。 图3 3. 演示背包问题的算法之前,首先需要输入物品个数,之后将出现如图4所示的输入界面,可以利用“随机生成”的按钮或各个相应的小窗口输入物品体积 wi 和背包体积 T 。背包的总体积不得超过 30 ,单个物品的体积不得超过 10 。 图4 4. “表达式求值”和“建表达式树”时的输入界面如图5所示。用户可在窗口内自行输入,并以“Enter”键为结束符;也可以连续点击左侧蓝色的表达式由系统自动生成,直至用户点击右侧的计算器表示确认为止。“求值”可实现带括弧的四则运算和幂次运算,并支持sin、cos、tan、arcsin 和 arccos 等函数计算,其操作数为实数。“建树”的表达式仅限于带括弧的四则运算,其操作数为单个字母的字符。 图5 5. 稀疏矩阵的输入界面如图6所示。用户可随意进行矩阵中任意位置元素的输入,只要将光标移动至待输入的元素位置,单击鼠标后将弹出计算器,单击数字按钮,可进行随意输入,之后点击“OK”按钮表示确认。 图6 6. 广义表的数据输入方式为自左向右顺序输入广义表的字符串。输入过程中,图7所示输入界面中的“确定”为灰色字体,只有当用户正确输入完毕时,“确定”两字才改为黑色字体,此时用户可单击此按钮表示确认。 图7 7. 图的输入界面如图8所示。之前尚需确认是否为有向图和带权图。在用户自行输入图时,首先按下“创建节点”按钮,之后可移动光标至窗口的任意位置单击鼠标创建顶点;然后单击“创建弧”按钮,可在任意两个顶点之间构建弧或边。构建弧(或边)的操作为:先将光标移动至弧尾的顶点,单击一次鼠标,然后移动光标至弧头位置,再单击一次鼠标。对于带权的图,则在构建弧(或边)的同时,在当时弹出的窗口中输入权值,权值的默认值为 1。 图8 8. 内部排序的关键字均为单个字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

善程序员文

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

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

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

打赏作者

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

抵扣说明:

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

余额充值